ROOT logo
#ifndef ALIMUONCLUSTERFINDERPEAKFIT_H
#define ALIMUONCLUSTERFINDERPEAKFIT_H
/* Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
 * See cxx source for full Copyright notice                               */

/* $Id$ */

/// \ingroup rec
/// \class AliMUONClusterFinderPeakFit
/// \brief Cluster finder in MUON arm of ALICE
///
//  Author Alexander Zinchenko, JINR Dubna; Laurent Aphecetche, SUBATECH
//

#include "AliMUONVClusterFinder.h"

#ifndef ROOT_TObjArray
#  include "TObjArray.h"
#endif
#ifndef ROOT_TVector2
#  include "TVector2.h"
#endif

class AliMUONMathieson;
//class AliMUONPad;

class TH2D;

class AliMUONClusterFinderPeakFit : public AliMUONVClusterFinder
{
public:
  AliMUONClusterFinderPeakFit(Bool_t plot, AliMUONVClusterFinder* clusterFinder); // Constructor
  virtual ~AliMUONClusterFinderPeakFit(); // Destructor

  /// It needs segmentation
  virtual Bool_t NeedSegmentation() const { return kTRUE; }

  using AliMUONVClusterFinder::Prepare;

  virtual Bool_t Prepare(Int_t detElemId, TObjArray* pads[2],
                         const AliMpArea& area, const AliMpVSegmentation* seg[2]);

  virtual AliMUONCluster* NextCluster();
  
  /// Return the number of local maxima
  Int_t GetNMax() const { return fNMax; }
  
  virtual void Print(Option_t* opt="") const;

private:
  /// Not implemented
  AliMUONClusterFinderPeakFit(const AliMUONClusterFinderPeakFit& rhs);
  /// Not implemented
  AliMUONClusterFinderPeakFit& operator=(const AliMUONClusterFinderPeakFit& rhs);

  Bool_t WorkOnPreCluster();

  /// Check precluster to simplify it (if possible), and return the simplified cluster
  AliMUONCluster* CheckPrecluster(const AliMUONCluster& cluster); 
  AliMUONCluster* CheckPreclusterTwoCathodes(AliMUONCluster* cluster); 
  
  /// Checks whether a pad and a pixel have an overlapping area.
  Bool_t Overlap(const AliMUONPad& pad, const AliMUONPad& pixel); 
  
  /// build array of pixels
  void BuildPixArray(AliMUONCluster& cluster); 
  void BuildPixArrayOneCathode(AliMUONCluster& cluster); 
  void PadOverHist(Int_t idir, Int_t ix0, Int_t iy0, AliMUONPad *pad, TH2D *h1, TH2D *h2);

  void RemovePixel(Int_t i);
  
  AliMUONPad* Pixel(Int_t i) const;
  
  Int_t FindLocalMaxima(TObjArray *pixArray, Int_t *localMax, Double_t *maxVal); // find local maxima 
  void  FlagLocalMax(TH2D *hist, Int_t i, Int_t j, Int_t *isLocalMax); // flag local max
  void  FindClusterCOG(AliMUONCluster& cluster, const Int_t *localMax, Int_t iMax); // find cluster around local max with COG
  void  FindClusterFit(AliMUONCluster& cluster, const Int_t *localMax, const Int_t *maxPos, Int_t nMax); // find cluster around local max with fitting
  void  PadsInXandY(AliMUONCluster& cluster, Int_t &nInX, Int_t &nInY) const; // get number of pads in X and Y

  void CheckOverlaps();

private:
  // Status flags for pads
  static const Int_t fgkZero; ///< pad "basic" state
  static const Int_t fgkMustKeep; ///< do not kill (for pixels)
  static const Int_t fgkUseForFit; ///< should be used for fit
  static const Int_t fgkOver; ///< processing is over
  static const Int_t fgkModified; ///< modified pad charge 
  static const Int_t fgkCoupled; ///< coupled pad    
    
  // Some constants
  static const Double_t fgkZeroSuppression; ///< average zero suppression value
  static const Double_t fgkDistancePrecision; ///< used to check overlaps and so on
  static const TVector2 fgkIncreaseSize; ///< idem
  static const TVector2 fgkDecreaseSize; ///< idem
  
  AliMUONVClusterFinder* fPreClusterFinder; //!< the pre-clustering worker
  AliMUONCluster* fPreCluster; //!< current pre-cluster
  TObjArray fClusterList; //!< clusters corresponding to the current pre-cluster
  AliMUONMathieson* fMathieson; //!< Mathieson to compute the charge repartition
  
  Int_t fEventNumber; //!< current event being processed
  Int_t fDetElemId; //!< current DE being processed
  Int_t fClusterNumber; //!< current cluster number
  Int_t fNMax; //!< number of local maxima
  TH2D *fHistAnode; //!< histo for local maxima search
  
  const AliMpVSegmentation *fkSegmentation[2]; //!< new segmentation
  
  TObjArray* fPixArray; //!< collection of pixels
  Int_t fDebug; //!< debug level
  Bool_t fPlot; //!< whether we should plot thing (for debug only, quite slow!)
  
  Int_t fNClusters; //!< total number of clusters
  Int_t fNAddVirtualPads; //!< number of clusters for which we added virtual pads
  
  ClassDef(AliMUONClusterFinderPeakFit,0) // cluster finder in MUON arm of ALICE
};

#endif
 AliMUONClusterFinderPeakFit.h:1
 AliMUONClusterFinderPeakFit.h:2
 AliMUONClusterFinderPeakFit.h:3
 AliMUONClusterFinderPeakFit.h:4
 AliMUONClusterFinderPeakFit.h:5
 AliMUONClusterFinderPeakFit.h:6
 AliMUONClusterFinderPeakFit.h:7
 AliMUONClusterFinderPeakFit.h:8
 AliMUONClusterFinderPeakFit.h:9
 AliMUONClusterFinderPeakFit.h:10
 AliMUONClusterFinderPeakFit.h:11
 AliMUONClusterFinderPeakFit.h:12
 AliMUONClusterFinderPeakFit.h:13
 AliMUONClusterFinderPeakFit.h:14
 AliMUONClusterFinderPeakFit.h:15
 AliMUONClusterFinderPeakFit.h:16
 AliMUONClusterFinderPeakFit.h:17
 AliMUONClusterFinderPeakFit.h:18
 AliMUONClusterFinderPeakFit.h:19
 AliMUONClusterFinderPeakFit.h:20
 AliMUONClusterFinderPeakFit.h:21
 AliMUONClusterFinderPeakFit.h:22
 AliMUONClusterFinderPeakFit.h:23
 AliMUONClusterFinderPeakFit.h:24
 AliMUONClusterFinderPeakFit.h:25
 AliMUONClusterFinderPeakFit.h:26
 AliMUONClusterFinderPeakFit.h:27
 AliMUONClusterFinderPeakFit.h:28
 AliMUONClusterFinderPeakFit.h:29
 AliMUONClusterFinderPeakFit.h:30
 AliMUONClusterFinderPeakFit.h:31
 AliMUONClusterFinderPeakFit.h:32
 AliMUONClusterFinderPeakFit.h:33
 AliMUONClusterFinderPeakFit.h:34
 AliMUONClusterFinderPeakFit.h:35
 AliMUONClusterFinderPeakFit.h:36
 AliMUONClusterFinderPeakFit.h:37
 AliMUONClusterFinderPeakFit.h:38
 AliMUONClusterFinderPeakFit.h:39
 AliMUONClusterFinderPeakFit.h:40
 AliMUONClusterFinderPeakFit.h:41
 AliMUONClusterFinderPeakFit.h:42
 AliMUONClusterFinderPeakFit.h:43
 AliMUONClusterFinderPeakFit.h:44
 AliMUONClusterFinderPeakFit.h:45
 AliMUONClusterFinderPeakFit.h:46
 AliMUONClusterFinderPeakFit.h:47
 AliMUONClusterFinderPeakFit.h:48
 AliMUONClusterFinderPeakFit.h:49
 AliMUONClusterFinderPeakFit.h:50
 AliMUONClusterFinderPeakFit.h:51
 AliMUONClusterFinderPeakFit.h:52
 AliMUONClusterFinderPeakFit.h:53
 AliMUONClusterFinderPeakFit.h:54
 AliMUONClusterFinderPeakFit.h:55
 AliMUONClusterFinderPeakFit.h:56
 AliMUONClusterFinderPeakFit.h:57
 AliMUONClusterFinderPeakFit.h:58
 AliMUONClusterFinderPeakFit.h:59
 AliMUONClusterFinderPeakFit.h:60
 AliMUONClusterFinderPeakFit.h:61
 AliMUONClusterFinderPeakFit.h:62
 AliMUONClusterFinderPeakFit.h:63
 AliMUONClusterFinderPeakFit.h:64
 AliMUONClusterFinderPeakFit.h:65
 AliMUONClusterFinderPeakFit.h:66
 AliMUONClusterFinderPeakFit.h:67
 AliMUONClusterFinderPeakFit.h:68
 AliMUONClusterFinderPeakFit.h:69
 AliMUONClusterFinderPeakFit.h:70
 AliMUONClusterFinderPeakFit.h:71
 AliMUONClusterFinderPeakFit.h:72
 AliMUONClusterFinderPeakFit.h:73
 AliMUONClusterFinderPeakFit.h:74
 AliMUONClusterFinderPeakFit.h:75
 AliMUONClusterFinderPeakFit.h:76
 AliMUONClusterFinderPeakFit.h:77
 AliMUONClusterFinderPeakFit.h:78
 AliMUONClusterFinderPeakFit.h:79
 AliMUONClusterFinderPeakFit.h:80
 AliMUONClusterFinderPeakFit.h:81
 AliMUONClusterFinderPeakFit.h:82
 AliMUONClusterFinderPeakFit.h:83
 AliMUONClusterFinderPeakFit.h:84
 AliMUONClusterFinderPeakFit.h:85
 AliMUONClusterFinderPeakFit.h:86
 AliMUONClusterFinderPeakFit.h:87
 AliMUONClusterFinderPeakFit.h:88
 AliMUONClusterFinderPeakFit.h:89
 AliMUONClusterFinderPeakFit.h:90
 AliMUONClusterFinderPeakFit.h:91
 AliMUONClusterFinderPeakFit.h:92
 AliMUONClusterFinderPeakFit.h:93
 AliMUONClusterFinderPeakFit.h:94
 AliMUONClusterFinderPeakFit.h:95
 AliMUONClusterFinderPeakFit.h:96
 AliMUONClusterFinderPeakFit.h:97
 AliMUONClusterFinderPeakFit.h:98
 AliMUONClusterFinderPeakFit.h:99
 AliMUONClusterFinderPeakFit.h:100
 AliMUONClusterFinderPeakFit.h:101
 AliMUONClusterFinderPeakFit.h:102
 AliMUONClusterFinderPeakFit.h:103
 AliMUONClusterFinderPeakFit.h:104
 AliMUONClusterFinderPeakFit.h:105
 AliMUONClusterFinderPeakFit.h:106
 AliMUONClusterFinderPeakFit.h:107
 AliMUONClusterFinderPeakFit.h:108
 AliMUONClusterFinderPeakFit.h:109
 AliMUONClusterFinderPeakFit.h:110
 AliMUONClusterFinderPeakFit.h:111
 AliMUONClusterFinderPeakFit.h:112
 AliMUONClusterFinderPeakFit.h:113
 AliMUONClusterFinderPeakFit.h:114
 AliMUONClusterFinderPeakFit.h:115
 AliMUONClusterFinderPeakFit.h:116
 AliMUONClusterFinderPeakFit.h:117
 AliMUONClusterFinderPeakFit.h:118
 AliMUONClusterFinderPeakFit.h:119
 AliMUONClusterFinderPeakFit.h:120