LCOV - code coverage report
Current view: top level - MUON/MUONrec - AliMUONClusterFinderMLEM.h (source / functions) Hit Total Coverage
Test: coverage.info Lines: 6 8 75.0 %
Date: 2016-06-14 17:26:59 Functions: 7 12 58.3 %

          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

Generated by: LCOV version 1.11