ROOT logo

#ifndef HRICH700RINGFINDERHOUGH
#define HRICH700RINGFINDERHOUGH

#include "hrich700ringfittercop.h"
#include "hlocation.h"
#include "hreconstructor.h"
#include "hcategory.h"
#include "hiterator.h"
#include "hgeantrich.h"
#include "hrichcalsim.h"

#include <vector>
#include <map>
#include <functional>


using std::vector;

class HRich700HoughHit {
public:

   HRich700HoughHit():
      fX(0.),
	  fY(0.),
      fX2plusY2(0.f),
      fId(0),
      fIsUsed(kTRUE)
   { }

   virtual ~HRich700HoughHit(){}

   Float_t fX;
   Float_t fY;
   Float_t fX2plusY2;
   UShort_t fId;
   Bool_t fIsUsed;
};


class HRich700HoughHitCmpUp:
public std::binary_function<
             const HRich700HoughHit,
             const HRich700HoughHit,
             bool>
{
public:

   virtual ~HRich700HoughHitCmpUp(){}

   bool operator()(
         const HRich700HoughHit &m1,
         const HRich700HoughHit &m2) const
   {
      return m1.fX < m2.fX;
   }
};

// comparator based on the selection ANN criterion.
class HRich700RingComparatorMore: public std::binary_function< const HRich700Ring, const HRich700Ring, bool>
{
public:

    virtual ~HRich700RingComparatorMore(){}

    bool operator()(
		    const HRich700Ring& ring1,
		    const HRich700Ring& ring2) const
    {
	return ring1.fHits.size() > ring2.fHits.size();
    }
};

class HRich700DigiPar;
class HRich700RingFinderPar;

class HRich700RingFinderHough : public HReconstructor
{

protected:
    static const UShort_t MAX_NOF_HITS = 65000; // maximum number of hits in RICH detector

    // parameters of the Hough Transform algorithm
    UShort_t fNofParts; // number of groups of hits for HT

    Float_t fMaxDistance;        // maximum distance between two hits
    Float_t fMinDistance;        // minimum distance between two hits
    Float_t fMinDistanceSq;      // = fMinDistance*fMinDistance
    Float_t fMaxDistanceSq;      // = fMaxDistance*fMaxDistance

    Float_t fMinRadius;          // minimum radius of the ring
    Float_t fMaxRadius;          // maximum radius of the ring

    Float_t fDx;                 // x bin width of the ring center histogram
    Float_t fDy;                 // y bin width of the ring center histogram
    Float_t fDr;                 // width of the ring radius histogram
    UShort_t fNofBinsX;          // number of bins in X direction
    UShort_t fNofBinsY;          // number of bins in Y direction
    UShort_t fNofBinsXY;         // fNofBinsX*fNofBinsY

    UShort_t fHTCut;             // cut number of entries in maximum bin of XY histogram

    UShort_t fNofBinsR;          // number of bins in radius histogram
    UShort_t fHTCutR;            // cut number of entries in maximum bin of Radius histogram

    UShort_t fMinNofHitsInArea;  // minimum number of hits in the local area

    Float_t fUsedHitsAllCut;     // percent of used hits

    Float_t fRmsCoeffCOP;
    Float_t fMaxCutCOP;

    Float_t fCurMinX;            // current minimum X position of the local area
    Float_t fCurMinY;            // current minimum Y position of the local area

    vector<HRich700HoughHit> fData; // Rich Hough hits
    vector<UShort_t> fHist;         // XY histogram
    vector<UShort_t> fHistR;        // Radius histogram
    vector< vector<UShort_t> > fHitInd; // store hit indexes for different group of hits
    vector<HRich700Ring> fFoundRings;   // store found rings

    HCategory* fCatRichCal;       //!
    HCategory* fCatRichHit;       //!
    HRich700DigiPar* fDigiPar; //!
    HRich700RingFinderPar* fRingPar; //!

    Int_t fEventNum;
    Bool_t fIsSimulation ;      // runnig sim or exp ?
    void processEvent();


public:

    Bool_t init();
    Bool_t reinit();
    Int_t  execute();
    Bool_t finalize();

    HRich700RingFinderHough (const Text_t* name ="Rich700RingFinderHough",  const Text_t* title= "Rich700RingFinderHough");

    virtual ~HRich700RingFinderHough();

    void setParameters();

    virtual void HoughTransformReconstruction();

    virtual void DefineLocalAreaAndHits( Float_t x0, Float_t y0, Int_t *indmin, Int_t *indmax);

    virtual void HoughTransform( UShort_t indmin, UShort_t indmax);

    virtual void HoughTransformGroup(UShort_t indmin,UShort_t indmax,Int_t iPart);

    void FindPeak( Int_t indmin,Int_t indmax);

    void RemoveHitsOfFoundRing(Int_t indmin, Int_t indmax, HRich700Ring* ring);

    void RingSelection();

    void AddRing(HRich700Ring* ring);

    void RecoToMc(const HRich700Ring* ring, Int_t * trackIds, Int_t * weights);

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