#ifndef ALIITSCLUSTERERV2_H
#define ALIITSCLUSTERERV2_H
#include <TObject.h>
class TFile;
class TTree;
class TClonesArray;
class AliITSclusterV2;
class AliRawReader;
class AliITSRawStream;
class AliITSclustererV2 : public TObject {
public:
AliITSclustererV2();
AliITSclustererV2(const Char_t *geom);
void SetEvent(Int_t event) { fEvent=event; }
Int_t Digits2Clusters(TTree *in, TTree *out);
void Digits2Clusters(AliRawReader* rawReader);
void FindClustersSPD(const TClonesArray *dig, TClonesArray *cls);
void FindClustersSPD(AliITSRawStream* input, TClonesArray** clusters);
void FindClustersSDD(const TClonesArray *dig, TClonesArray *cls);
void FindClustersSDD(AliITSRawStream* input, TClonesArray** clusters);
void FindClustersSSD(const TClonesArray *dig, TClonesArray *cls);
void FindClustersSSD(AliITSRawStream* input, TClonesArray** clusters);
void RecPoints2Clusters(const TClonesArray *p, Int_t idx, TClonesArray *c);
class Ali1Dcluster {
public:
void SetY(Float_t y) {fY=y;}
void SetQ(Float_t q) {fQ=q;}
void SetNd(Int_t n) {fNd=n;}
void SetLabels(Int_t *lab) {fLab[0]=lab[0];fLab[1]=lab[1];fLab[2]=lab[2];}
Float_t GetY() const {return fY;}
Float_t GetQ() const {return fQ;}
Int_t GetNd()const {return fNd;}
Int_t GetLabel(Int_t lab) const { return fLab[lab]; }
private:
Float_t fY;
Float_t fQ;
Int_t fNd;
Int_t fLab[3];
};
class AliBin {
public:
AliBin():fIndex(0),fMask(0xFFFFFFFE),fQ(0) {}
void SetIndex(UInt_t idx) {fIndex=idx;}
void SetQ(UShort_t q) {fQ=q;}
void SetMask(UInt_t m) {fMask=m;}
void Reset() {fIndex=0; fMask=0xFFFFFFFE; fQ=0;}
void Use() {fMask&=0xFFFFFFFE;}
Bool_t IsNotUsed() const {return (fMask&1);}
Bool_t IsUsed() const {return !(IsNotUsed());}
UInt_t GetIndex() const {return fIndex;}
UShort_t GetQ() const {return fQ;}
UInt_t GetMask() const {return fMask;}
private:
UInt_t fIndex;
UInt_t fMask;
UShort_t fQ;
};
static Bool_t IsMaximum(Int_t k, Int_t max, const AliBin *bins);
static void FindPeaks(Int_t k,Int_t m,AliBin*b,Int_t*idx,UInt_t*msk,Int_t&n);
static void MarkPeak(Int_t k, Int_t max, AliBin *bins, UInt_t m);
static void MakeCluster(Int_t k,Int_t max,AliBin *bins,UInt_t m,
AliITSclusterV2 &c);
void FindClustersSDD(AliBin* bins[2], Int_t nMaxBin, Int_t nMaxZ,
const TClonesArray *dig, TClonesArray *cls);
void FindClustersSSD(Ali1Dcluster* neg, Int_t nn,
Ali1Dcluster* pos, Int_t np,
TClonesArray *clusters);
static void FindCluster(Int_t k,Int_t maxz,AliBin *bins,Int_t &n,Int_t *idx);
protected:
Int_t fNModules;
private:
Int_t fEvent;
Int_t fI;
Float_t fYshift[2200];
Float_t fZshift[2200];
Int_t fNdet[2200];
Int_t fNlayer[2200];
Int_t fLastSPD1;
Int_t fNySPD;
Int_t fNzSPD;
Float_t fYpitchSPD;
Float_t fZ1pitchSPD,fZ2pitchSPD;
Float_t fHwSPD;
Float_t fHlSPD;
Float_t fYSPD[260];
Float_t fZSPD[170];
Int_t fNySDD;
Int_t fNzSDD;
Float_t fYpitchSDD;
Float_t fZpitchSDD;
Float_t fHwSDD;
Float_t fHlSDD;
Float_t fYoffSDD;
Int_t fLastSSD1;
Float_t fYpitchSSD;
Float_t fHwSSD;
Float_t fHlSSD;
Float_t fTanP;
Float_t fTanN;
ClassDef(AliITSclustererV2,1)
};
#endif