ROOT logo
#ifndef HMDCCLUSTER_H
#define HMDCCLUSTER_H

#include "TObject.h"
#include "hmdclistgroupcells.h"

class HMdcClus;
class HMdcSecListCells;

class HMdcCluster : public TObject {
  protected:
    HMdcList12GroupCells lCells1;
    HMdcList12GroupCells lCells2;
    Char_t       sector;
    Char_t       segment;     // =0-lCells1 is used; =1-lCells2; -1 - lCells1&2
    Int_t        numCells1;   // number of cells in lCells1
    Int_t        numCells2;   // number of cells in lCells2
    Int_t        nLayers1;    // number of layers in lCells1
    Int_t        nLayers2;    // number of layers in lCells2
    Bool_t       status;      // =kFALSE - removed by merging
    Char_t       flag;        // for combined clusters, >0 - cluster saved
    HMdcCluster* clusMerg;    // clusMerg=0 if status=kTRUE else -merged cluster
    Short_t      nMergedClus; // Number of merged clusters

    Int_t        nBins;       // num. of bins in cluster
    Int_t        sumWt;       // sum weights of bins
    Int_t        meanX;       // var. for calculation of cluster shape
    Int_t        meanY;       // -/-
    Int_t        meanXX;      // -/-
    Int_t        meanYY;      // -/-
    Int_t        meanYX;      // -/-
    Int_t        meanXWt;     // position of cluster (calc. with weights)
    Int_t        meanYWt;     // -/-
    Int_t        meanXXWt;    // X dispersion
    Int_t        meanYYWt;    // Y dispersion
    Int_t        minWt;       // minimal value of Wt
    Int_t        iXFirst;
    Int_t        iYFirst;
    Float_t      x0;          // x of the first bin
    Float_t      y0;          // y of the first bin
    Float_t      xSt;         // bin size
    Float_t      ySt;         // bin size
    UChar_t      fakeFlag;    // flag of fake suppression code
    UChar_t      realFlag;    // flag of fake suppression code
    
    Float_t      x;           // cluster position
    Float_t      y;           //
    Float_t      errX;        // position errors
    Float_t      errY;        //
    Float_t      sigma1;      // cluster shape
    Float_t      sigma2;      //
    Float_t      alpha;       //
    
    // Variables for matching:
    HMdcCluster* clusMod1;    // mod.1 cluster address
    HMdcCluster* clusMod2;    // mod.2 cluster address
  public:
    HMdcCluster(void) {}
    ~HMdcCluster(void) {}
    void init(Char_t sec,Char_t seg,Float_t x,Float_t y,Float_t sx,Float_t sy);
    void clearBinStat(void);
    inline void addBin(Int_t nx,Int_t ny,UChar_t wt);
    void calcXY(void);
    void addClus(HMdcCluster& clst2);
    void sumClus(HMdcCluster& clst1, HMdcCluster& clst2);
    void calcClusParam(void);
    void fillClus(HMdcClus* clus, Int_t nLst, Bool_t fillTrList);
    void print(void);
    void setModCluster(Int_t im, HMdcCluster* cl); 
    Char_t        getSegment(void) const            {return segment;}
    HMdcCluster*  getModCluster(Int_t im)           {return im==0 ? clusMod1 :
                                                                    clusMod2;}
    HMdcCluster  *getMod1Clus(void)                 {return clusMod1;}
    HMdcCluster  *getMod2Clus(void)                 {return clusMod2;}
    Char_t        getIOSeg(void) const              {return segment;}
    Int_t         getNBins(void) const              {return nBins;}
    void          setMod1Clus(HMdcCluster* cl)      {clusMod1=cl;}
    void          setMod2Clus(HMdcCluster* cl)      {clusMod2=cl;}
    HMdcCluster  *getClusMerg(void) const           {return clusMerg;}
    void          setClusMerg(HMdcCluster* cl)      {clusMerg=cl;}
    void          incFlag(void)                     {flag++;}
    HMdcList12GroupCells& getLCells1(void)          {return lCells1;}
    HMdcList12GroupCells& getLCells2(void)          {return lCells2;}
    Bool_t        getStatus(void) const             {return status;}
    void          setStatus(Bool_t st)              {status = st;}
    Char_t        getFlag(void) const               {return flag;}
    void          setFlag(Char_t fl)                {flag=fl;}
    Float_t       getX(void) const                  {return x;}
    Float_t       getY(void) const                  {return y;}
    Int_t         getMinWt(void) const              {return minWt;}
    Int_t         getRealLevel(void) const          {return minWt;}
    Int_t         testForInclude(HMdcCluster& cl2);
    Int_t         testForInc34CFnd(HMdcCluster& cl2);
    Bool_t        testNLayersSeg1(void);
    Bool_t        testNLayersSeg2(void);
    void          setFakeFlag(UChar_t fl)           {fakeFlag = fl;}
    void          setFakeFlagAndStatus(UChar_t fl)  {fakeFlag = fl; status = kFALSE;}
    UChar_t       getFakeFlag(void) const           {return fakeFlag;}
    UChar_t      &fakeFlagS(void)                   {return fakeFlag;}
    UChar_t       getRealFlag(void) const           {return realFlag;}
    UChar_t      &realFlagS(void)                   {return realFlag;}
    void          setMod1ClusSkipMerg(HMdcCluster* clusM1);
    void          setMod2ClusSkipMerg(HMdcCluster* clusM2);
    Bool_t        isModClusNotTheSame(HMdcCluster& cls2);
    Int_t         getNUniqueWiresSeg1(HMdcSecListCells* pListCells);
    Int_t         getNUniqueAndRWiresSeg1(HMdcSecListCells* pListCells,Int_t& nRWires);
    inline Bool_t isClusterAmpEq(Int_t amp) const;
    void          resetFakeFlagSeg1(Bool_t fake,HMdcSecListCells* pListCells);
    void          resetRealFlagSeg1(Bool_t real,HMdcSecListCells* pListCells);
    
  protected:
    void         correctContent(Int_t iXf,Int_t iYf);
  ClassDef(HMdcCluster,0)
};

inline void HMdcCluster::addBin(Int_t nx,Int_t ny,UChar_t wt) {
  if(nBins == 0) {
    iXFirst = nx;
    iYFirst = ny;
    minWt   = wt;
  } else {
    nx       -= iXFirst;
    meanX    += nx;
    meanXWt  += nx*wt;
    meanXX   += nx*nx;
    meanXXWt += nx*nx*wt;
    ny       -= iYFirst;
    meanY    += ny;
    meanYWt  += ny*wt;
    meanYY   += ny*ny;
    meanYYWt += ny*ny*wt;
    meanYX   += ny*nx;    // For cluster shape calc. only
    if(wt<minWt) minWt = wt;
  }
  sumWt += wt;
  nBins++;
}

inline Bool_t HMdcCluster::isClusterAmpEq(Int_t amp) const {
  // For ghosts removing in inner segment
  return minWt==amp && (fakeFlag==0 || fakeFlag > 9);
  //                    fakeFlag>0 && < 10 suppreset in testForInclude
}

//==================================================================
class HMdcClustersArrs : public TObject {
  protected:
    static HMdcClustersArrs* pMdcClustersArrs;
    HMdcCluster* clusArr[3];
    Int_t        arrSize[3];
    
    //
    Float_t      dXWind1;      // window for clusters comparison in seg.1
    Float_t      dYWind1;      // window for clusters comparison in seg.1
    Float_t      dXWind2;      // window for clusters comparison in seg.1\2
    Float_t      dYWind2;      // window for clusters comparison in seg.2
    
  public:
    static HMdcClustersArrs* getExObject(void)   {return pMdcClustersArrs;}
    static HMdcClustersArrs* getObject(void);
    static void deleteCont(void);
    HMdcClustersArrs(void);
    ~HMdcClustersArrs(void);
    Int_t        createAllArrays(Int_t size=500);
    HMdcCluster* createArray1(Int_t size=500)    {return createArray(0,size);}
    HMdcCluster* createArray2(Int_t size=500)    {return createArray(1,size);}
    HMdcCluster* createArray3(Int_t size=500)    {return createArray(2,size);}
    HMdcCluster* getArray1(void)                 {return clusArr[0];}
    HMdcCluster* getArray2(void)                 {return clusArr[1];}
    HMdcCluster* getArray3(void)                 {return clusArr[2];}
    Int_t        getArray1Size(void)             {return arrSize[0];}
    Int_t        getArray2Size(void)             {return arrSize[1];}
    Int_t        getArray3Size(void)             {return arrSize[2];}
    HMdcCluster* getArr1Cluster(Int_t ind)       {return getCluster(0,ind);}
    HMdcCluster* getArr2Cluster(Int_t ind)       {return getCluster(1,ind);}
    HMdcCluster* getArr3Cluster(Int_t ind)       {return getCluster(2,ind);}
    void         setDXDYWindow(Float_t dx,
                               Float_t dy)       {dXWind1 = dx; dYWind1 = dy;}
    void         setM34DXDYWindow(Float_t dx,
                                  Float_t dy)    {dXWind2 = dx; dYWind2 = dy;}
    void         testCluster(Int_t indArr,Int_t indClus);
    Bool_t       testMdc34Cluster(Int_t indArr,Int_t indClus,Int_t firstClst=0);
  protected:
    HMdcCluster* createArray(Int_t ind,Int_t size);
    HMdcCluster* getCluster(Int_t indarr,Int_t  indClus);
  ClassDef(HMdcClustersArrs,0)
};

#endif  /*!HMDCCLUSTER_H*/
 hmdccluster.h:1
 hmdccluster.h:2
 hmdccluster.h:3
 hmdccluster.h:4
 hmdccluster.h:5
 hmdccluster.h:6
 hmdccluster.h:7
 hmdccluster.h:8
 hmdccluster.h:9
 hmdccluster.h:10
 hmdccluster.h:11
 hmdccluster.h:12
 hmdccluster.h:13
 hmdccluster.h:14
 hmdccluster.h:15
 hmdccluster.h:16
 hmdccluster.h:17
 hmdccluster.h:18
 hmdccluster.h:19
 hmdccluster.h:20
 hmdccluster.h:21
 hmdccluster.h:22
 hmdccluster.h:23
 hmdccluster.h:24
 hmdccluster.h:25
 hmdccluster.h:26
 hmdccluster.h:27
 hmdccluster.h:28
 hmdccluster.h:29
 hmdccluster.h:30
 hmdccluster.h:31
 hmdccluster.h:32
 hmdccluster.h:33
 hmdccluster.h:34
 hmdccluster.h:35
 hmdccluster.h:36
 hmdccluster.h:37
 hmdccluster.h:38
 hmdccluster.h:39
 hmdccluster.h:40
 hmdccluster.h:41
 hmdccluster.h:42
 hmdccluster.h:43
 hmdccluster.h:44
 hmdccluster.h:45
 hmdccluster.h:46
 hmdccluster.h:47
 hmdccluster.h:48
 hmdccluster.h:49
 hmdccluster.h:50
 hmdccluster.h:51
 hmdccluster.h:52
 hmdccluster.h:53
 hmdccluster.h:54
 hmdccluster.h:55
 hmdccluster.h:56
 hmdccluster.h:57
 hmdccluster.h:58
 hmdccluster.h:59
 hmdccluster.h:60
 hmdccluster.h:61
 hmdccluster.h:62
 hmdccluster.h:63
 hmdccluster.h:64
 hmdccluster.h:65
 hmdccluster.h:66
 hmdccluster.h:67
 hmdccluster.h:68
 hmdccluster.h:69
 hmdccluster.h:70
 hmdccluster.h:71
 hmdccluster.h:72
 hmdccluster.h:73
 hmdccluster.h:74
 hmdccluster.h:75
 hmdccluster.h:76
 hmdccluster.h:77
 hmdccluster.h:78
 hmdccluster.h:79
 hmdccluster.h:80
 hmdccluster.h:81
 hmdccluster.h:82
 hmdccluster.h:83
 hmdccluster.h:84
 hmdccluster.h:85
 hmdccluster.h:86
 hmdccluster.h:87
 hmdccluster.h:88
 hmdccluster.h:89
 hmdccluster.h:90
 hmdccluster.h:91
 hmdccluster.h:92
 hmdccluster.h:93
 hmdccluster.h:94
 hmdccluster.h:95
 hmdccluster.h:96
 hmdccluster.h:97
 hmdccluster.h:98
 hmdccluster.h:99
 hmdccluster.h:100
 hmdccluster.h:101
 hmdccluster.h:102
 hmdccluster.h:103
 hmdccluster.h:104
 hmdccluster.h:105
 hmdccluster.h:106
 hmdccluster.h:107
 hmdccluster.h:108
 hmdccluster.h:109
 hmdccluster.h:110
 hmdccluster.h:111
 hmdccluster.h:112
 hmdccluster.h:113
 hmdccluster.h:114
 hmdccluster.h:115
 hmdccluster.h:116
 hmdccluster.h:117
 hmdccluster.h:118
 hmdccluster.h:119
 hmdccluster.h:120
 hmdccluster.h:121
 hmdccluster.h:122
 hmdccluster.h:123
 hmdccluster.h:124
 hmdccluster.h:125
 hmdccluster.h:126
 hmdccluster.h:127
 hmdccluster.h:128
 hmdccluster.h:129
 hmdccluster.h:130
 hmdccluster.h:131
 hmdccluster.h:132
 hmdccluster.h:133
 hmdccluster.h:134
 hmdccluster.h:135
 hmdccluster.h:136
 hmdccluster.h:137
 hmdccluster.h:138
 hmdccluster.h:139
 hmdccluster.h:140
 hmdccluster.h:141
 hmdccluster.h:142
 hmdccluster.h:143
 hmdccluster.h:144
 hmdccluster.h:145
 hmdccluster.h:146
 hmdccluster.h:147
 hmdccluster.h:148
 hmdccluster.h:149
 hmdccluster.h:150
 hmdccluster.h:151
 hmdccluster.h:152
 hmdccluster.h:153
 hmdccluster.h:154
 hmdccluster.h:155
 hmdccluster.h:156
 hmdccluster.h:157
 hmdccluster.h:158
 hmdccluster.h:159
 hmdccluster.h:160
 hmdccluster.h:161
 hmdccluster.h:162
 hmdccluster.h:163
 hmdccluster.h:164
 hmdccluster.h:165
 hmdccluster.h:166
 hmdccluster.h:167
 hmdccluster.h:168
 hmdccluster.h:169
 hmdccluster.h:170
 hmdccluster.h:171
 hmdccluster.h:172
 hmdccluster.h:173
 hmdccluster.h:174
 hmdccluster.h:175
 hmdccluster.h:176
 hmdccluster.h:177
 hmdccluster.h:178
 hmdccluster.h:179
 hmdccluster.h:180
 hmdccluster.h:181
 hmdccluster.h:182
 hmdccluster.h:183
 hmdccluster.h:184
 hmdccluster.h:185
 hmdccluster.h:186
 hmdccluster.h:187
 hmdccluster.h:188
 hmdccluster.h:189