Update from Alberica. Addition of VZERO equalized signals and ZNC.
[u/mrichter/AliRoot.git] / MUON / AliMUONClusterSplitterMLEM.h
1 #ifndef ALIMUONCLUSTERSPLITTERMLEM_H
2 #define ALIMUONCLUSTERSPLITTERMLEM_H
3
4 /* Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
5 * See cxx source for full Copyright notice                               */
6
7 // $Id$
8
9 /// \ingroup rec
10 /// \class AliMUONClusterSplitterMLEM
11 /// \brief Splitter class for the MLEM algorithm
12 /// 
13 //  Author Alexander Zinchenko, JINR Dubna; Laurent Aphecetche, SUBATECH
14 //
15
16 #ifndef ROOT_TObject
17 #  include "TObject.h"
18 #endif
19
20 #include "TMatrixDfwd.h"
21
22 class AliMUONCluster;
23 class TH2;
24 class TObjArray;
25 class AliMUONPad;
26 class AliMUONMathieson;
27
28 class AliMUONClusterSplitterMLEM : public TObject
29 {
30 public:
31   AliMUONClusterSplitterMLEM(Int_t detElemId, TObjArray* pixArray, 
32                              Double_t lowestPixelCharge,
33                              Double_t lowestPadCharge,
34                              Double_t lowestClusterCharge);
35   
36   virtual ~AliMUONClusterSplitterMLEM();
37
38   void AddBin(TH2 *mlem, 
39               Int_t ic, Int_t jc, Int_t mode, 
40               Bool_t *used, TObjArray *pix);
41   
42   void AddCluster(Int_t ic, Int_t nclust, 
43                   TMatrixD& aijcluclu, 
44                   Bool_t *used, Int_t *clustNumb, Int_t &nCoupled);
45   
46   TObject* BinToPix(TH2 *mlem, Int_t jc, Int_t ic);
47   
48   Float_t ChargeIntegration(Double_t x, Double_t y, const AliMUONPad& pad);
49   
50   void Fcn1(const AliMUONCluster& cluster, 
51             Int_t & npar, Double_t * gin, 
52             Double_t &f, Double_t *par, Int_t iflag);
53   
54   Int_t Fit(const AliMUONCluster& cluster,
55             Int_t iSimple, Int_t nfit,
56             const Int_t *clustFit, TObjArray **clusters, 
57             Double_t *parOk, TObjArray& clusterList, TH2 *mlem);
58     
59   void Merge(const AliMUONCluster& cluster,
60              Int_t nForFit, Int_t nCoupled, 
61              const Int_t *clustNumb, const Int_t *clustFit, 
62              TObjArray **clusters, 
63              TMatrixD& aijcluclu, TMatrixD& aijclupad);
64     
65   Double_t MinGroupCoupl(Int_t nCoupled, const Int_t *clustNumb, 
66                          const TMatrixD& aijcluclu, Int_t *minGroup);
67       
68   Int_t SelectPad(const AliMUONCluster& cluster,
69                   Int_t nCoupled, Int_t nForFit, 
70                   const Int_t *clustNumb, const Int_t *clustFit, 
71                   const TMatrixD& aijclupad);
72   
73   void Split(const AliMUONCluster& cluster,
74                TH2* mlem,
75                Double_t* coef, TObjArray& clusterList);
76   
77   
78   void UpdatePads(const AliMUONCluster& cluster, Int_t nfit, Double_t *par);
79   /// Set debug level
80   void SetDebug (Int_t debug) { fDebug = debug; }
81
82 private:
83   /// will not be implemented
84   AliMUONClusterSplitterMLEM(const AliMUONClusterSplitterMLEM&);
85   /// will not be implemented
86   AliMUONClusterSplitterMLEM& operator=(const AliMUONClusterSplitterMLEM&);
87   Double_t Param2Coef(Int_t icand, Double_t coef, Double_t *par) const;
88
89 private:
90   
91     static const Double_t fgkCouplMin; ///< threshold on coupling 
92
93   TObjArray* fPixArray; //!< \todo add comment
94   AliMUONMathieson* fMathieson; //!< Mathieson
95   Int_t fDetElemId; //!< detection element we are working on
96   Int_t fNpar; //!< number of fit parameters
97   Double_t fQtot; //!< total charge
98   Int_t fnCoupled; //!< number of coupled pixels ?
99   Int_t fDebug; //!< debug level
100   
101   Double_t fLowestPixelCharge; //!< minimum allowed pixel charge
102   Double_t fLowestPadCharge; //!< minimum allowed pad charge
103   Double_t fLowestClusterCharge; //!< minimum allowed cluster charge
104
105   ClassDef(AliMUONClusterSplitterMLEM,2) // Splitter of clusters
106 };
107
108 #endif