ROOT logo
#ifndef ALIMUONCLUSTERSPLITTERMLEM_H
#define ALIMUONCLUSTERSPLITTERMLEM_H

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

// $Id$

/// \ingroup rec
/// \class AliMUONClusterSplitterMLEM
/// \brief Splitter class for the MLEM algorithm
/// 
//  Author Alexander Zinchenko, JINR Dubna; Laurent Aphecetche, SUBATECH
//

#ifndef ROOT_TObject
#  include "TObject.h"
#endif

#include "TMatrixDfwd.h"

class AliMUONCluster;
class TH2;
class TObjArray;
class AliMUONPad;
class AliMUONMathieson;

class AliMUONClusterSplitterMLEM : public TObject
{
public:
  AliMUONClusterSplitterMLEM(Int_t detElemId, TObjArray* pixArray, 
                             Double_t lowestPixelCharge,
                             Double_t lowestPadCharge,
                             Double_t lowestClusterCharge);
  
  virtual ~AliMUONClusterSplitterMLEM();

  void AddBin(TH2 *mlem, 
              Int_t ic, Int_t jc, Int_t mode, 
              Bool_t *used, TObjArray *pix);
  
  void AddCluster(Int_t ic, Int_t nclust, 
                  TMatrixD& aijcluclu, 
                  Bool_t *used, Int_t *clustNumb, Int_t &nCoupled);
  
  TObject* BinToPix(TH2 *mlem, Int_t jc, Int_t ic);
  
  Float_t ChargeIntegration(Double_t x, Double_t y, const AliMUONPad& pad);
  
  void Fcn1(const AliMUONCluster& cluster, 
            Int_t & npar, Double_t * gin, 
            Double_t &f, Double_t *par, Int_t iflag);
  
  Int_t Fit(const AliMUONCluster& cluster,
            Int_t iSimple, Int_t nfit,
            const Int_t *clustFit, TObjArray **clusters, 
            Double_t *parOk, TObjArray& clusterList, TH2 *mlem);
    
  void Merge(const AliMUONCluster& cluster,
             Int_t nForFit, Int_t nCoupled, 
             const Int_t *clustNumb, const Int_t *clustFit, 
             TObjArray **clusters, 
             TMatrixD& aijcluclu, TMatrixD& aijclupad);
    
  Double_t MinGroupCoupl(Int_t nCoupled, const Int_t *clustNumb, 
                         const TMatrixD& aijcluclu, Int_t *minGroup);
      
  Int_t SelectPad(const AliMUONCluster& cluster,
                  Int_t nCoupled, Int_t nForFit, 
                  const Int_t *clustNumb, const Int_t *clustFit, 
                  const TMatrixD& aijclupad);
  
  void Split(const AliMUONCluster& cluster,
               TH2* mlem,
               Double_t* coef, TObjArray& clusterList);
  
  
  void UpdatePads(const AliMUONCluster& cluster, Int_t nfit, Double_t *par);
  /// Set debug level
  void SetDebug (Int_t debug) { fDebug = debug; }

private:
  /// will not be implemented
  AliMUONClusterSplitterMLEM(const AliMUONClusterSplitterMLEM&);
  /// will not be implemented
  AliMUONClusterSplitterMLEM& operator=(const AliMUONClusterSplitterMLEM&);
  Double_t Param2Coef(Int_t icand, Double_t coef, Double_t *par) const;

private:
  
    static const Double_t fgkCouplMin; ///< threshold on coupling 

  TObjArray* fPixArray; //!< \todo add comment
  AliMUONMathieson* fMathieson; //!< Mathieson
  Int_t fDetElemId; //!< detection element we are working on
  Int_t fNpar; //!< number of fit parameters
  Double_t fQtot; //!< total charge
  Int_t fnCoupled; //!< number of coupled pixels ?
  Int_t fDebug; //!< debug level
  
  Double_t fLowestPixelCharge; //!< minimum allowed pixel charge
  Double_t fLowestPadCharge; //!< minimum allowed pad charge
  Double_t fLowestClusterCharge; //!< minimum allowed cluster charge

  ClassDef(AliMUONClusterSplitterMLEM,2) // Splitter of clusters
};

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