Line data Source code
1 : #ifndef ALIMUONCLUSTERFINDERMLEM_H
2 : #define ALIMUONCLUSTERFINDERMLEM_H
3 : /* Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
4 : * See cxx source for full Copyright notice */
5 :
6 : /* $Id$ */
7 :
8 : /// \ingroup rec
9 : /// \class AliMUONClusterFinderMLEM
10 : /// \brief Cluster finder in MUON arm of ALICE
11 : ///
12 : // Author Alexander Zinchenko, JINR Dubna; Laurent Aphecetche, SUBATECH
13 : //
14 :
15 : class TH2D;
16 : class TMinuit;
17 :
18 : #ifndef ROOT_TObjArray
19 : # include "TObjArray.h"
20 : #endif
21 : #ifndef ROOT_TVector2
22 : # include "TVector2.h"
23 : #endif
24 :
25 : class AliMUONPad;
26 :
27 : #include "AliMUONVClusterFinder.h"
28 :
29 : class AliMUONClusterSplitterMLEM;
30 :
31 : class AliMUONClusterFinderMLEM : public AliMUONVClusterFinder
32 : {
33 : public:
34 : AliMUONClusterFinderMLEM(Bool_t plot, AliMUONVClusterFinder* clusterFinder); // Constructor
35 : virtual ~AliMUONClusterFinderMLEM(); // Destructor
36 :
37 288 : virtual Bool_t NeedSegmentation() const { return kTRUE; }
38 :
39 : using AliMUONVClusterFinder::Prepare;
40 :
41 : virtual Bool_t Prepare(Int_t detElemId,
42 : TObjArray* pads[2],
43 : const AliMpArea& area,
44 : const AliMpVSegmentation* segmentations[2]);
45 :
46 : virtual AliMUONCluster* NextCluster();
47 :
48 : virtual void SetChargeHints(Double_t lowestPadCharge, Double_t lowestClusterCharge);
49 :
50 : virtual void Print(Option_t* opt="") const;
51 :
52 : virtual void Paint(Option_t* opt="");
53 :
54 : // Status flags for pads
55 :
56 : /// Return pad "basic" state flag
57 1236 : static Int_t GetZeroFlag() { return fgkZero; }
58 : /// Return do not kill flag
59 0 : static Int_t GetMustKeepFlag() { return fgkMustKeep; }
60 : /// Return should be used for fit flag
61 44678 : static Int_t GetUseForFitFlag() { return fgkUseForFit; }
62 : /// Return processing is over flag
63 0 : static Int_t GetOverFlag() { return fgkOver; }
64 : /// Return modified pad charge flag
65 888 : static Int_t GetModifiedFlag() { return fgkModified; }
66 : /// Return coupled pad flag
67 996 : static Int_t GetCoupledFlag() { return fgkCoupled; }
68 :
69 : private:
70 : /// Not implemented
71 : AliMUONClusterFinderMLEM(const AliMUONClusterFinderMLEM& rhs);
72 : /// Not implemented
73 : AliMUONClusterFinderMLEM& operator=(const AliMUONClusterFinderMLEM& rhs);
74 :
75 : Bool_t WorkOnPreCluster();
76 :
77 : /// Check precluster to simplify it (if possible), and return the simplified cluster
78 : AliMUONCluster* CheckPrecluster(const AliMUONCluster& cluster);
79 : AliMUONCluster* CheckPreclusterTwoCathodes(AliMUONCluster* cluster);
80 :
81 : /// Checks whether a pad and a pixel have an overlapping area.
82 : Bool_t Overlap(const AliMUONPad& pad, const AliMUONPad& pixel);
83 :
84 : /// build array of pixels
85 : void BuildPixArray(AliMUONCluster& cluster);
86 : void BuildPixArrayOneCathode(AliMUONCluster& cluster);
87 : void PadOverHist(Int_t idir, Int_t ix0, Int_t iy0, AliMUONPad *pad,
88 : TH2D *hist1, TH2D *hist2);
89 :
90 : void RemovePixel(Int_t i);
91 :
92 : AliMUONPad* Pixel(Int_t i) const;
93 :
94 : Bool_t MainLoop(AliMUONCluster& cluster, Int_t iSimple); // repeat MLEM algorithm until pixels become sufficiently small
95 :
96 : void Mlem(AliMUONCluster& cluster, const Double_t *coef, Double_t *probi, Int_t nIter); // use MLEM for cluster finding
97 :
98 : void FindCOG(Double_t *xyc); // find COG position around maximum bin
99 : Int_t FindNearest(const AliMUONPad *pixPtr0); // find nearest neighbouring pixel to the given one
100 :
101 : Int_t FindLocalMaxima(TObjArray *pixArray, Int_t *localMax, Double_t *maxVal); // find local maxima
102 : void FlagLocalMax(TH2D *hist, Int_t i, Int_t j, Int_t *isLocalMax); // flag local max
103 : void FindCluster(AliMUONCluster& cluster, const Int_t *localMax, Int_t iMax); // find cluster around local max
104 : void AddVirtualPad(AliMUONCluster& cluster); // add virtual pads for some clusters (if necessary)
105 :
106 : void PadsInXandY(AliMUONCluster& cluster, Int_t &nInX, Int_t &nInY) const; // get number of pads in X and Y
107 :
108 : /// Process simple cluster
109 : void Simple(AliMUONCluster& cluster);
110 :
111 : void Plot(const char* outputfile);
112 :
113 : void ComputeCoefficients(AliMUONCluster& cluster,
114 : Double_t* coef, Double_t* probi);
115 :
116 : void CheckOverlaps();
117 : void AddBinSimple(TH2D *mlem, Int_t ic, Int_t jc);
118 : void MaskPeaks(Int_t mask);
119 :
120 : private:
121 : // Status flags for pads
122 : static const Int_t fgkZero; ///< pad "basic" state
123 : static const Int_t fgkMustKeep; ///< do not kill (for pixels)
124 : static const Int_t fgkUseForFit; ///< should be used for fit
125 : static const Int_t fgkOver; ///< processing is over
126 : static const Int_t fgkModified; ///< modified pad charge
127 : static const Int_t fgkCoupled; ///< coupled pad
128 :
129 : // Some constants
130 : static const Double_t fgkDistancePrecision; ///< used to check overlaps and so on
131 : static const TVector2 fgkIncreaseSize; ///< idem
132 : static const TVector2 fgkDecreaseSize; ///< idem
133 :
134 : AliMUONVClusterFinder* fPreClusterFinder; //!<! the pre-clustering worker
135 : AliMUONCluster* fPreCluster; //!<! current pre-cluster
136 : TObjArray fClusterList; //!<! clusters corresponding to the current pre-cluster
137 :
138 : Int_t fEventNumber; //!<! current event being processed
139 : Int_t fDetElemId; //!<! current DE being processed
140 : Int_t fClusterNumber; //!<! current cluster number
141 :
142 : const AliMpVSegmentation *fkSegmentation[2]; //!<! new segmentation
143 :
144 : //Int_t fCathBeg; //!<! starting cathode (for combined cluster / track reco)
145 : //Int_t fPadBeg[2]; //!<! starting pads (for combined cluster / track reco)
146 :
147 : //static TMinuit* fgMinuit; //!<! Fitter
148 : TH2D *fHistMlem; //!<! histogram for MLEM procedure
149 : TH2D *fHistAnode; //!<! histogram for local maxima search
150 :
151 : TObjArray* fPixArray; //!<! collection of pixels
152 : Int_t fDebug; //!<! debug level
153 : Bool_t fPlot; //!<! whether we should plot thing (for debug only, quite slow!)
154 :
155 : AliMUONClusterSplitterMLEM* fSplitter; //!<! helper class to go from pixel arrays to clusters
156 : Int_t fNClusters; //!<! total number of clusters
157 : Int_t fNAddVirtualPads; //!<! number of clusters for which we added virtual pads
158 :
159 : Double_t fLowestPixelCharge; //!<! see AliMUONRecoParam
160 : Double_t fLowestPadCharge; //!<! see AliMUONRecoParam
161 : Double_t fLowestClusterCharge; //!<! see AliMUONRecoParam
162 :
163 5974 : ClassDef(AliMUONClusterFinderMLEM,0) // cluster finder in MUON arm of ALICE
164 : };
165 :
166 : #endif
|