Fixing ITS circular dependecies
[u/mrichter/AliRoot.git] / ITS / ITSbase / AliITSMultReconstructor.h
CommitLineData
ac903f1b 1#ifndef ALIITSMULTRECONSTRUCTOR_H
2#define ALIITSMULTRECONSTRUCTOR_H
3/* Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
4 * See cxx source for full Copyright notice */
5
fa9ed8e9 6//_________________________________________________________________________
ac903f1b 7//
fa9ed8e9 8// Implementation of the ITS-SPD trackleter class
ac903f1b 9//
fa9ed8e9 10// It retrieves clusters in the pixels (theta and phi) and finds tracklets.
11// These can be used to extract charged particle multiplicity from the ITS.
ac903f1b 12//
fa9ed8e9 13// A tracklet consists of two ITS clusters, one in the first pixel layer and
14// one in the second. The clusters are associated if the differences in
15// Phi (azimuth) and Theta (polar angle) are within fiducial windows.
16// In case of multiple candidates the candidate with minimum
17// distance is selected.
18//_________________________________________________________________________
1f9831ab 19#include "AliTrackleter.h"
f9f90134 20#include "AliITSsegmentationSPD.h"
21#include "TMath.h"
ac903f1b 22
1f9831ab 23class TBits;
ac903f1b 24class TTree;
25class TH1F;
3ef75756 26class TH2F;
1f9831ab 27class AliITSDetTypeRec;
ac903f1b 28class AliITSgeom;
1f9831ab 29class AliESDEvent;
30class AliESDtrack;
31class AliVertex;
6de485aa 32class AliESDVertex;
1f9831ab 33class AliMultiplicity;
f9f90134 34class AliRefArray;
9cb64105 35class AliITSRecPoint;
ac903f1b 36
1f9831ab 37class AliITSMultReconstructor : public AliTrackleter
ac903f1b 38{
39public:
1f9831ab 40 //
41 enum {kClTh,kClPh,kClZ,kClMC0,kClMC1,kClMC2,kClNPar};
42 enum {kTrTheta,kTrPhi,kTrDPhi,kTrDTheta,kTrLab1,kTrLab2,kClID1,kClID2,kTrNPar};
d7c5c1e4 43 enum {kSCTh,kSCPh,kSCLab,kSCID,kSCNPar};
1f9831ab 44 enum {kITSTPC,kITSSAP,kITSTPCBit=BIT(kITSTPC),kITSSAPBit=BIT(kITSSAP)}; // RS
ac903f1b 45 AliITSMultReconstructor();
ddced3c8 46 virtual ~AliITSMultReconstructor();
ac903f1b 47
1f9831ab 48 void Reconstruct(AliESDEvent* esd, TTree* treeRP);
f9f90134 49 void Reconstruct(TTree* tree, Float_t* vtx, Float_t* vtxRes=0); // old reconstructor invocation
b80c197e 50 void ReconstructMix(TTree* clusterTree, TTree* clusterTreeMix, const Float_t* vtx, Float_t* vtrRes=0);
1f9831ab 51 void FindTracklets(const Float_t* vtx);
9b373e9a 52 void LoadClusterFiredChips(TTree* tree);
7b116aa1 53 void FlagClustersInOverlapRegions(Int_t ic1,Int_t ic2);
34581d1e 54 void FlagTrackClusters(Int_t id);
6de485aa 55 void FlagIfSecondary(AliESDtrack* track, const AliVertex* vtx);
56 void FlagV0s(const AliESDVertex *vtx);
1f9831ab 57 void ProcessESDTracks();
6de485aa 58 Bool_t CanBeElectron(const AliESDtrack* trc) const;
1f9831ab 59
f9f90134 60 virtual void CreateMultiplicityObject();
1f9831ab 61 //
7b116aa1 62 // Following members are set via AliITSRecoParam
f9f90134 63 void SetPhiWindow(Float_t w=0.08) {fDPhiWindow=w; fDPhiWindow2 = w*w;}
64 void SetThetaWindow(Float_t w=0.025) {fDThetaWindow=w; fDThetaWindow2=w*w;}
fa9ed8e9 65 void SetPhiShift(Float_t w=0.0045) {fPhiShift=w;}
7b116aa1 66 void SetRemoveClustersFromOverlaps(Bool_t b = kFALSE) {fRemoveClustersFromOverlaps = b;}
67 void SetPhiOverlapCut(Float_t w=0.005) {fPhiOverlapCut=w;}
68 void SetZetaOverlapCut(Float_t w=0.05) {fZetaOverlapCut=w;}
7c6da836 69 void SetPhiRotationAngle(Float_t w=0.0) {fPhiRotationAngle=w;}
7b116aa1 70
f9f90134 71 Int_t GetNClustersLayer1() const {return fNClustersLay[0];}
72 Int_t GetNClustersLayer2() const {return fNClustersLay[1];}
73 Int_t GetNClustersLayer(Int_t i) const {return fNClustersLay[i];}
ac903f1b 74 Int_t GetNTracklets() const {return fNTracklets;}
968e8539 75 Int_t GetNSingleClusters() const {return fNSingleCluster;}
b9be2602 76 Int_t GetNSingleClustersLr(int lr) const {return lr==0 ? fNSingleCluster-fNSingleClusterSPD2:(GetStoreSPD2SingleCl() ? fNSingleClusterSPD2 : -1) ;}
9b373e9a 77 Short_t GetNFiredChips(Int_t layer) const {return fNFiredChips[layer];}
ac903f1b 78
9cb64105 79 Float_t* GetClusterLayer1(Int_t n) const {return &fClustersLay[0][n*kClNPar];}
80 Float_t* GetClusterLayer2(Int_t n) const {return &fClustersLay[1][n*kClNPar];}
81 Float_t* GetClusterOfLayer(Int_t lr,Int_t n) const {return &fClustersLay[lr][n*kClNPar];}
82 Int_t GetClusterCopyIndex(Int_t lr,Int_t n) const {return fClusterCopyIndex[lr] ? fClusterCopyIndex[lr][n] : -1;}
83 AliITSRecPoint* GetRecPoint(Int_t lr, Int_t n) const;
f9f90134 84
9cb64105 85 Float_t* GetTracklet(Int_t n) const {return fTracklets[n];}
86 Float_t* GetCluster(Int_t n) const {return fSClusters[n];}
ac903f1b 87
f9f90134 88 void SetScaleDThetaBySin2T(Bool_t v=kTRUE) {fScaleDTBySin2T = v;}
89 Bool_t GetScaleDThetaBySin2T() const {return fScaleDTBySin2T;}
90 //
91 void SetNStdDev(Float_t f=1.) {fNStdDev = f<0.01 ? 0.01 : f; fNStdDevSq=TMath::Sqrt(fNStdDev);}
92 Float_t GetNStdDev() const {return fNStdDev;}
93 //
ac903f1b 94 void SetHistOn(Bool_t b=kFALSE) {fHistOn=b;}
95 void SaveHists();
e73fcfbb 96 //
97 void SetBuildRefs(Bool_t v=kTRUE) {fBuildRefs = v;}
98 Bool_t GetBuildRefs() const {return fBuildRefs;}
b9be2602 99 //
100 void SetStoreSPD2SingleCl(Bool_t v) {fStoreSPD2SingleCl = v;}
101 Bool_t GetStoreSPD2SingleCl() const {return fStoreSPD2SingleCl;}
102 //
1f9831ab 103 AliITSDetTypeRec *GetDetTypeRec() const {return fDetTypeRec;}
104 void SetDetTypeRec(AliITSDetTypeRec *ptr){fDetTypeRec = ptr;}
6de485aa 105 //
106 void SetCutPxDrSPDin(Float_t v=0.1) { fCutPxDrSPDin = v;}
107 void SetCutPxDrSPDout(Float_t v=0.15) { fCutPxDrSPDout = v;}
108 void SetCutPxDz(Float_t v=0.2) { fCutPxDz = v;}
109 void SetCutDCArz(Float_t v=0.5) { fCutDCArz = v;}
110 void SetCutMinElectronProbTPC(Float_t v=0.5) { fCutMinElectronProbTPC = v;}
111 void SetCutMinElectronProbESD(Float_t v=0.1) { fCutMinElectronProbESD = v;}
112 void SetCutMinP(Float_t v=0.05) { fCutMinP = v;}
113 void SetCutMinRGamma(Float_t v=2.) { fCutMinRGamma = v;}
114 void SetCutMinRK0(Float_t v=1.) { fCutMinRK0 = v;}
115 void SetCutMinPointAngle(Float_t v=0.98) { fCutMinPointAngle = v;}
116 void SetCutMaxDCADauther(Float_t v=0.5) { fCutMaxDCADauther = v;}
117 void SetCutMassGamma(Float_t v=0.03) { fCutMassGamma = v;}
118 void SetCutMassGammaNSigma(Float_t v=5.) { fCutMassGammaNSigma = v;}
119 void SetCutMassK0(Float_t v=0.03) { fCutMassK0 = v;}
120 void SetCutMassK0NSigma(Float_t v=5.) { fCutMassK0NSigma = v;}
121 void SetCutChi2cGamma(Float_t v=2.) { fCutChi2cGamma = v;}
122 void SetCutChi2cK0(Float_t v=2.) { fCutChi2cK0 = v;}
123 void SetCutGammaSFromDecay(Float_t v=-10.) { fCutGammaSFromDecay = v;}
124 void SetCutK0SFromDecay(Float_t v=-10.) { fCutK0SFromDecay = v;}
125 void SetCutMaxDCA(Float_t v=1.) { fCutMaxDCA = v;}
126 //
127 Float_t GetCutPxDrSPDin() const {return fCutPxDrSPDin;}
128 Float_t GetCutPxDrSPDout() const {return fCutPxDrSPDout;}
129 Float_t GetCutPxDz() const {return fCutPxDz;}
130 Float_t GetCutDCArz() const {return fCutDCArz;}
131 Float_t GetCutMinElectronProbTPC() const {return fCutMinElectronProbTPC;}
132 Float_t GetCutMinElectronProbESD() const {return fCutMinElectronProbESD;}
133 Float_t GetCutMinP() const {return fCutMinP;}
134 Float_t GetCutMinRGamma() const {return fCutMinRGamma;}
135 Float_t GetCutMinRK0() const {return fCutMinRK0;}
136 Float_t GetCutMinPointAngle() const {return fCutMinPointAngle;}
137 Float_t GetCutMaxDCADauther() const {return fCutMaxDCADauther;}
138 Float_t GetCutMassGamma() const {return fCutMassGamma;}
139 Float_t GetCutMassGammaNSigma() const {return fCutMassGammaNSigma;}
140 Float_t GetCutMassK0() const {return fCutMassK0;}
141 Float_t GetCutMassK0NSigma() const {return fCutMassK0NSigma;}
142 Float_t GetCutChi2cGamma() const {return fCutChi2cGamma;}
143 Float_t GetCutChi2cK0() const {return fCutChi2cK0;}
144 Float_t GetCutGammaSFromDecay() const {return fCutGammaSFromDecay;}
145 Float_t GetCutK0SFromDecay() const {return fCutK0SFromDecay;}
146 Float_t GetCutMaxDCA() const {return fCutMaxDCA;}
147 //
f9f90134 148 void InitAux();
149 void ClusterPos2Angles(const Float_t *vtx);
b80c197e 150 void ClusterPos2Angles(Float_t *clPar, const Float_t *vtx) const;
f9f90134 151 Int_t AssociateClusterOfL1(Int_t iC1);
152 Int_t StoreTrackletForL2Cluster(Int_t iC2);
153 void StoreL1Singles();
154 TClonesArray* GetClustersOfLayer(Int_t il) const {return fClArr[il];}
155 void LoadClusters() {LoadClusterArrays(fTreeRP);}
156 void SetTreeRP(TTree* rp) {fTreeRP = rp;}
157 void SetTreeRPMix(TTree* rp=0) {fTreeRPMix = rp;}
158 Bool_t AreClustersLoaded() const {return fClustersLoaded;}
159 Bool_t GetCreateClustersCopy() const {return fCreateClustersCopy;}
160 Bool_t IsRecoDone() const {return fRecoDone;}
161 void SetCreateClustersCopy(Bool_t v=kTRUE) {fCreateClustersCopy=v;}
162 //
ce189d7c 163 // Float_t* GetClustersArray(Int_t lr) const {return (Float_t*) (lr==0) ? fClustersLay[0]:fClustersLay[1];}
164 Float_t* GetClustersArray(Int_t lr) const {if(lr==0){return fClustersLay[0];}
165 else {return fClustersLay[1];}}
f9f90134 166 Int_t* GetPartnersOfL2() const {return (Int_t*)fPartners;}
167 Float_t* GetMinDistsOfL2() const {return (Float_t*)fMinDists;}
168 Double_t GetDPhiShift() const {return fDPhiShift;}
169 Double_t GetDPhiWindow2() const {return fDPhiWindow2;}
170 Double_t GetDThetaWindow2() const {return fDThetaWindow2;}
171 Double_t CalcDist(Double_t dphi, Double_t dtheta, Double_t theta) const;
172 //
173 protected:
174 void SetClustersLoaded(Bool_t v=kTRUE) {fClustersLoaded = v;}
3ef75756 175 AliITSMultReconstructor(const AliITSMultReconstructor& mr);
7537d03c 176 AliITSMultReconstructor& operator=(const AliITSMultReconstructor& mr);
f9f90134 177 void CalcThetaPhi(float dx,float dy,float dz,float &theta,float &phi) const;
1f9831ab 178 AliITSDetTypeRec* fDetTypeRec; //! pointer to DetTypeRec
179 AliESDEvent* fESDEvent; //! pointer to ESD event
180 TTree* fTreeRP; //! ITS recpoints
f9f90134 181 TTree* fTreeRPMix; //! ITS recpoints for mixing
182 AliRefArray* fUsedClusLay[2][2]; //! RS: clusters usage in ESD tracks
183 //
184 Float_t* fClustersLay[2]; //! clusters in the SPD layers of ITS
185 Int_t* fDetectorIndexClustersLay[2]; //! module index for clusters in ITS layers
9cb64105 186 Int_t* fClusterCopyIndex[2]; //! when clusters copy is requested, store here the reference on the index
f9f90134 187 Bool_t* fOverlapFlagClustersLay[2]; //! flag for clusters in the overlap regions in ITS layers
ac903f1b 188
f9f90134 189 Float_t** fTracklets; //! tracklets
190 Float_t** fSClusters; //! single clusters (unassociated)
ac903f1b 191
f9f90134 192 Int_t fNClustersLay[2]; // Number of clusters on each layer
9b373e9a 193 Int_t fNTracklets; // Number of tracklets
194 Int_t fNSingleCluster; // Number of unassociated clusters
b9be2602 195 Int_t fNSingleClusterSPD2; // Number of unassociated clusters on 2nd lr
9b373e9a 196 Short_t fNFiredChips[2]; // Number of fired chips in the two SPD layers
6de485aa 197 //
7b116aa1 198 // Following members are set via AliITSRecoParam
6de485aa 199 //
f9f90134 200 Float_t fDPhiWindow; // Search window in phi
201 Float_t fDThetaWindow; // Search window in theta
fa9ed8e9 202 Float_t fPhiShift; // Phi shift reference value (at 0.5 T)
7b116aa1 203 Bool_t fRemoveClustersFromOverlaps; // Option to skip clusters in the overlaps
204 Float_t fPhiOverlapCut; // Fiducial window in phi for overlap cut
205 Float_t fZetaOverlapCut; // Fiducial window in eta for overlap cut
7c6da836 206 Float_t fPhiRotationAngle; // Angle to rotate the inner layer cluster for combinatorial reco only
f9f90134 207 //
208 Bool_t fScaleDTBySin2T; // use in distance definition
209 Float_t fNStdDev; // number of standard deviations to keep
210 Float_t fNStdDevSq; // sqrt of number of standard deviations to keep
211 //
6de485aa 212 // cuts for secondaries identification
213 Float_t fCutPxDrSPDin; // max P*DR for primaries involving at least 1 SPD
214 Float_t fCutPxDrSPDout; // max P*DR for primaries not involving any SPD
215 Float_t fCutPxDz; // max P*DZ for primaries
216 Float_t fCutDCArz; // max DR or DZ for primares
217 //
218 // cuts for flagging tracks in V0s
219 Float_t fCutMinElectronProbTPC; // min probability for e+/e- PID involving TPC
220 Float_t fCutMinElectronProbESD; // min probability for e+/e- PID not involving TPC
221 //
222 Float_t fCutMinP; // min P of V0
223 Float_t fCutMinRGamma; // min transv. distance from ESDVertex to V0 for gammas
224 Float_t fCutMinRK0; // min transv. distance from ESDVertex to V0 for K0s
225 Float_t fCutMinPointAngle; // min pointing angle cosine
226 Float_t fCutMaxDCADauther; // max DCA of daughters at V0
227 Float_t fCutMassGamma; // max gamma mass
228 Float_t fCutMassGammaNSigma; // max standard deviations from 0 for gamma
229 Float_t fCutMassK0; // max K0 mass difference from PGD value
230 Float_t fCutMassK0NSigma; // max standard deviations for K0 mass from PDG value
231 Float_t fCutChi2cGamma; // max constrained chi2 cut for gammas
232 Float_t fCutChi2cK0; // max constrained chi2 cut for K0s
233 Float_t fCutGammaSFromDecay; // min path*P for gammas
234 Float_t fCutK0SFromDecay; // min path*P for K0s
235 Float_t fCutMaxDCA; // max DCA for V0 at ESD vertex
236
9b373e9a 237 Bool_t fHistOn; // Option to define and fill the histograms
ddced3c8 238
9b373e9a 239 TH1F* fhClustersDPhiAcc; // Phi2 - Phi1 for tracklets
240 TH1F* fhClustersDThetaAcc; // Theta2 - Theta1 for tracklets
9b373e9a 241 TH1F* fhClustersDPhiAll; // Phi2 - Phi1 all the combinations
242 TH1F* fhClustersDThetaAll; // Theta2 - Theta1 all the combinations
3ef75756 243
9b373e9a 244 TH2F* fhDPhiVsDThetaAll; // 2D plot for all the combinations
245 TH2F* fhDPhiVsDThetaAcc; // same plot for tracklets
9b373e9a 246
247 TH1F* fhetaTracklets; // Pseudorapidity distr. for tracklets
248 TH1F* fhphiTracklets; // Azimuthal (Phi) distr. for tracklets
249 TH1F* fhetaClustersLay1; // Pseudorapidity distr. for Clusters L. 1
250 TH1F* fhphiClustersLay1; // Azimuthal (Phi) distr. for Clusters L. 1
251
f9f90134 252 // temporary stuff for single event trackleting
253 Double_t fDPhiShift; // shift in dphi due to the curvature
254 Double_t fDPhiWindow2; // phi window^2
255 Double_t fDThetaWindow2; // theta window^2
256 Int_t* fPartners; //! L2 partners of L1
257 Int_t* fAssociatedLay1; //! association flag
258 Float_t* fMinDists; //! smallest distances for L2->L1
259 AliRefArray* fBlackList; //! blacklisted cluster references
260 Bool_t fStoreRefs[2][2]; //! which cluster to track refs to store
261 //
262 // this is for the analysis mode only
263 TClonesArray *fClArr[2]; //! original clusters
264 Bool_t fCreateClustersCopy; // read and clone clusters directly from the tree
265 Bool_t fClustersLoaded; // flag of clusters loaded
266 Bool_t fRecoDone; // flag that reconstruction is done
e73fcfbb 267 Bool_t fBuildRefs; // build cluster to tracks references
b9be2602 268 Bool_t fStoreSPD2SingleCl; // do we store SPD2 singles
f9f90134 269 //
270 AliITSsegmentationSPD fSPDSeg; // SPD segmentation model
271 //
272 void LoadClusterArrays(TTree* tree, TTree* treeMix=0);
273 void LoadClusterArrays(TTree* tree,int il);
ac903f1b 274
e73fcfbb 275 ClassDef(AliITSMultReconstructor,11)
ac903f1b 276};
277
f9f90134 278//____________________________________________________________________
b80c197e 279inline void AliITSMultReconstructor::ClusterPos2Angles(Float_t *clPar, const Float_t *vtx) const
f9f90134 280{
281 // convert cluster coordinates to angles wrt vertex
282 Float_t x = clPar[kClTh] - vtx[0];
283 Float_t y = clPar[kClPh] - vtx[1];
284 Float_t z = clPar[kClZ] - vtx[2];
285 Float_t r = TMath::Sqrt(x*x + y*y + z*z);
286 clPar[kClTh] = TMath::ACos(z/r); // Store Theta
287 clPar[kClPh] = TMath::Pi() + TMath::ATan2(-y,-x); // Store Phi
288 //
289}
290
291//____________________________________________________________________
292inline Double_t AliITSMultReconstructor::CalcDist(Double_t dphi, Double_t dtheta, Double_t theta) const
293{
294 // calculate eliptical distance. theta is the angle of cl1, dtheta = tht(cl1)-tht(cl2)
295 dphi = TMath::Abs(dphi) - fDPhiShift;
296 if (fScaleDTBySin2T) {
297 double sinTI = TMath::Sin(theta-dtheta/2);
298 sinTI *= sinTI;
299 dtheta /= sinTI>1.e-6 ? sinTI : 1.e-6;
300 }
301 return dphi*dphi/fDPhiWindow2 + dtheta*dtheta/fDThetaWindow2;
302}
303
304//____________________________________________________________________
305inline void AliITSMultReconstructor::CalcThetaPhi(float x, float y,float z,float &theta,float &phi) const
306{
307 // get theta and phi in tracklet convention
308 theta = TMath::ACos(z/TMath::Sqrt(x*x + y*y + z*z));
309 phi = TMath::Pi() + TMath::ATan2(-y,-x);
310}
311
312
ac903f1b 313#endif