]> git.uio.no Git - u/mrichter/AliRoot.git/blob - ITS/AliITSTrackleterSPDEff.h
Updated DA from Brigitte. Steerable clock range for pedestal evaluation - default...
[u/mrichter/AliRoot.git] / ITS / AliITSTrackleterSPDEff.h
1 #ifndef ALIITSTRACKLETERSPDEFF_H
2 #define ALIITSTRACKLETERSPDEFF_H
3 /* Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
4  * See cxx source for full Copyright notice                               */
5
6 /* $Id$ */
7
8 //____________________________________________________________________
9 // 
10 // AliITSTrackleterSPDEff - find SPD chips efficiencies by using tracklets.
11 // 
12 // This class was originally derived from AliITSMultReconstructor (see
13 // it for more details). Later on, the inheritance was changed to AliTracker
14 // It is the class for the Trackleter used to estimate
15 // SPD plane efficiency.
16 // The trackleter prediction is built using the vertex and 1 cluster.
17
18 //
19 // 
20 //  Author :  Giuseppe Eugenio Bruno, based on the skeleton of Reconstruct method  provided by Tiziano Virgili
21 //  email:    giuseppe.bruno@ba.infn.it
22 //  
23 //____________________________________________________________________
24
25 class AliStack;
26 class TTree;
27 class TH1F;
28 class TH2F;
29 #include "AliTracker.h"
30 #include "AliITSPlaneEffSPD.h"
31 #include "AliPlaneEff.h"
32
33 class AliITSTrackleterSPDEff : public  AliTracker
34 {
35 public:
36   AliITSTrackleterSPDEff();
37   virtual ~AliITSTrackleterSPDEff();
38   Int_t Clusters2Tracks(AliESDEvent *);
39   Int_t PostProcess(AliESDEvent *);
40
41   virtual Int_t PropagateBack(AliESDEvent*) {return 0;}
42   virtual Int_t RefitInward(AliESDEvent*) {return 0;}
43   Int_t LoadClusters(TTree* cl) {LoadClusterArrays(cl); return 0;} // see implementation in AliITSMultReconstructor
44   virtual void UnloadClusters() {return;}
45   virtual AliCluster *GetCluster(Int_t) const {return NULL;}
46
47   // Main method to perform the trackleter and the SPD efficiency evaluation
48   void Reconstruct(AliStack* pStack=0x0, TTree* tRef=0x0, Bool_t lbkg=kFALSE);
49
50   void SetReflectClusterAroundZAxisForLayer(Int_t ilayer,Bool_t b=kTRUE){  // method to study residual background:
51     if(b) {AliInfo(Form("All clusters on layer %d will be rotated by 180 deg around z",ilayer)); 
52            SetLightBkgStudyInParallel(kFALSE);}
53     if(ilayer==0) fReflectClusterAroundZAxisForLayer0=b;                   // a rotation by 180degree around the Z axis  
54     else if(ilayer==1) fReflectClusterAroundZAxisForLayer1=b;              // (x->-x; y->-y) to all RecPoints on a 
55     else AliInfo("Nothing done: input argument (ilayer) either 0 or 1");   // given layer is applied. In such a way 
56   }                                                                        // you remove all the true tracklets.
57   void SetLightBkgStudyInParallel(Bool_t b = kTRUE); // if you set this on, then the estimation of the 
58                                                      // SPD efficiency is done as usual for data, but in 
59                                                      // parallel a light (i.e. without control histograms, etc.) 
60                                                      // evaluation of combinatorial background is performed
61                                                      // with the usual ReflectClusterAroundZAxisForLayer method.
62   Bool_t GetLightBkgStudyInParallel() const {return fLightBkgStudyInParallel;}
63   void SetOnlyOneTrackletPerC2(Bool_t b = kTRUE) {fOnlyOneTrackletPerC2 = b;}
64   void SetPhiWindowL2(Float_t w=0.08) {fPhiWindowL2=w;}
65   void SetZetaWindowL2(Float_t w=1.) {fZetaWindowL2=w;}
66
67   void SetPhiWindowL1(Float_t w=0.08) {fPhiWindowL1=w;}  // method to set the cuts in the interpolation
68   void SetZetaWindowL1(Float_t w=1.) {fZetaWindowL1=w;}  // phase; use method of the base class for extrap.
69   void SetOnlyOneTrackletPerC1(Bool_t b = kTRUE) {fOnlyOneTrackletPerC1 = b;} // as in the base class but 
70
71   Int_t GetNClustersLayer1() const {return fNClustersLay1;}
72   Int_t GetNClustersLayer2() const {return fNClustersLay2;}
73   Int_t GetNTracklets() const {return fNTracklets;}
74
75   Float_t* GetClusterLayer1(Int_t n) {return fClustersLay1[n];}
76   Float_t* GetClusterLayer2(Int_t n) {return fClustersLay2[n];}
77   Float_t* GetTracklet(Int_t n) {return fTracklets[n];}
78                                                                               // for the inner layer
79   void SetUpdateOncePerEventPlaneEff(Bool_t b = kTRUE) {fUpdateOncePerEventPlaneEff = b;}
80   
81   AliITSPlaneEffSPD* GetPlaneEffSPD() const {return fPlaneEffSPD;}  // return a pointer to the AliITSPlaneEffSPD
82   AliPlaneEff *GetPlaneEff() {return (AliPlaneEff*)fPlaneEffSPD;}   // return the pointer to AliPlaneEff
83   
84   void SetMC(Bool_t mc=kTRUE) {fMC=mc; fMC? InitPredictionMC() : DeletePredictionMC(); return;}  // switch on access to MC true 
85   Bool_t GetMC() const {return fMC;}  // check the access to MC true
86   // Only for MC: use only "primary" particles (according to PrimaryTrackChecker) for the tracklet prediction
87   void SetUseOnlyPrimaryForPred(Bool_t flag=kTRUE) {CallWarningMC(); fUseOnlyPrimaryForPred = flag; } 
88   // Only for MC: use only "secondary" particles (according to PrimaryTrackChecker) for the tracklet prediction
89   void SetUseOnlySecondaryForPred(Bool_t flag=kTRUE) {CallWarningMC(); fUseOnlySecondaryForPred = flag;}
90   // Only for MC: associate a cluster to the tracklet prediction if  from the same particle
91   void SetUseOnlySameParticle(Bool_t flag=kTRUE) {CallWarningMC(); fUseOnlySameParticle = flag;}
92   // Only for MC: associate a cluster to the tracklet prediction if  from different particles
93   void SetUseOnlyDifferentParticle(Bool_t flag=kTRUE) {CallWarningMC(); fUseOnlyDifferentParticle = flag;}
94   //  Only for MC: re-define "primary" a particle if it is also "stable" (according to definition in method DecayingTrackChecker)
95   void SetUseOnlyStableParticle(Bool_t flag=kTRUE) {CallWarningMC(); fUseOnlyStableParticle = flag;}
96   // only for MC: Getters relative to the above setters
97   Bool_t GetUseOnlyPrimaryForPred() const {CallWarningMC(); return fUseOnlyPrimaryForPred; }
98   Bool_t GetUseOnlySecondaryForPred() const {CallWarningMC(); return fUseOnlySecondaryForPred;}
99   Bool_t GetUseOnlySameParticle() const {CallWarningMC(); return fUseOnlySameParticle;}
100   Bool_t GetUseOnlyDifferentParticle() const {CallWarningMC(); return fUseOnlyDifferentParticle;}
101   Bool_t GetUseOnlyStableParticle() const {CallWarningMC(); return fUseOnlyStableParticle;}
102   // Getters for the data members related to MC true statisitcs (see below)
103   Int_t GetPredictionPrimary(const UInt_t key) const;
104   Int_t GetPredictionSecondary(const UInt_t key) const;
105   Int_t GetClusterPrimary(const UInt_t key) const;
106   Int_t GetClusterSecondary(const UInt_t key) const;
107   Int_t GetSuccessPP(const UInt_t key) const;
108   Int_t GetSuccessTT(const UInt_t key) const;
109   Int_t GetSuccessS(const UInt_t key) const;
110   Int_t GetSuccessP(const UInt_t key) const;
111   Int_t GetFailureS(const UInt_t key) const;
112   Int_t GetFailureP(const UInt_t key) const;
113   Int_t GetRecons(const UInt_t key) const;
114   Int_t GetNonRecons(const UInt_t key) const;
115   Int_t GetPredictionPrimary(const UInt_t mod, const UInt_t chip) const
116         {return GetPredictionPrimary(fPlaneEffSPD->GetKey(mod,chip));};
117   Int_t GetPredictionSecondary(const UInt_t mod, const UInt_t chip) const
118         {return GetPredictionSecondary(fPlaneEffSPD->GetKey(mod,chip));};
119   Int_t GetClusterPrimary(const UInt_t mod, const UInt_t chip) const
120         {return GetClusterPrimary(fPlaneEffSPD->GetKey(mod,chip));};
121   Int_t GetClusterSecondary(const UInt_t mod, const UInt_t chip) const
122         {return GetClusterSecondary(fPlaneEffSPD->GetKey(mod,chip));};
123   Int_t GetSuccessPP(const UInt_t mod, const UInt_t chip) const
124         {return GetSuccessPP(fPlaneEffSPD->GetKey(mod,chip));};
125   Int_t GetSuccessTT(const UInt_t mod, const UInt_t chip) const
126        {return GetSuccessTT(fPlaneEffSPD->GetKey(mod,chip));};
127   Int_t GetSuccessS(const UInt_t mod, const UInt_t chip) const
128        {return GetSuccessS(fPlaneEffSPD->GetKey(mod,chip));};
129   Int_t GetSuccessP(const UInt_t mod, const UInt_t chip) const
130        {return GetSuccessP(fPlaneEffSPD->GetKey(mod,chip));};
131   Int_t GetFailureS(const UInt_t mod, const UInt_t chip) const
132        {return GetFailureS(fPlaneEffSPD->GetKey(mod,chip));};
133   Int_t GetFailureP(const UInt_t mod, const UInt_t chip) const
134        {return GetFailureP(fPlaneEffSPD->GetKey(mod,chip));};
135   Int_t GetRecons(const UInt_t mod, const UInt_t chip) const
136        {return GetRecons(fPlaneEffSPD->GetKey(mod,chip));};
137   Int_t GetNonRecons(const UInt_t mod, const UInt_t chip) const
138        {return GetNonRecons(fPlaneEffSPD->GetKey(mod,chip));};
139   // methods to write/reas cuts and MC statistics into/from file 
140   // if filename contains  ".root", then data are stored into histograms (->root file). 
141   void SavePredictionMC(TString filename="TrackletsMCpred.root") const;
142   void ReadPredictionMC(TString filename="TrackletsMCpred.root");
143   // Print some class info in ascii form to stream (cut values and MC statistics)
144   virtual void PrintAscii(ostream *os)const;
145   // Read some class info in ascii form from stream (cut values and MC statistics)
146   virtual void ReadAscii(istream *is);
147   Bool_t GetHistOn() const {return fHistOn;}; // return status of histograms
148   // write histograms into a root file on disk
149   Bool_t WriteHistosToFile(TString filename="TrackleterSPDHistos.root",Option_t* option = "RECREATE");
150   // switch on/off the extra histograms
151   void SetHistOn(Bool_t his=kTRUE) {fHistOn=his; 
152          if(GetHistOn()) {DeleteHistos(); BookHistos();} else DeleteHistos(); return;}
153
154 protected:
155   AliITSTrackleterSPDEff(const AliITSTrackleterSPDEff& mr); // protected method: no copy allowed from outside
156   AliITSTrackleterSPDEff& operator=(const AliITSTrackleterSPDEff& mr);
157 //
158 //// From AliITSMultReconstructor
159 //
160   Float_t**     fClustersLay1;               //! clusters in the 1st layer of ITS
161   Float_t**     fClustersLay2;               //! clusters in the 2nd layer of ITS
162
163   Float_t**     fTracklets;            //! tracklets
164   Bool_t*       fAssociationFlag;      //! flag for the associations
165
166   Int_t         fNClustersLay1;        // Number of clusters (Layer1)
167   Int_t         fNClustersLay2;        // Number of clusters (Layer2)
168   Int_t         fNTracklets;           // Number of tracklets
169
170   // Following members are set via AliITSRecoParam
171   Bool_t        fOnlyOneTrackletPerC2;         // Allow only one tracklet per cluster in the outer layer
172   Float_t       fPhiWindowL2;                    // Search window in phi
173   Float_t       fZetaWindowL2;                   // Search window in eta
174   Float_t       fPhiOverlapCut;                // Fiducial window in phi for overlap cut
175   Float_t       fZetaOverlapCut;               // Fiducial window in eta for overlap cut
176
177   Bool_t        fHistOn;               // Option to define and fill the histograms
178
179   TH1F*         fhClustersDPhiAcc;     //! Phi2 - Phi1 for tracklets
180   TH1F*         fhClustersDThetaAcc;   //! Theta2 - Theta1 for tracklets
181   TH1F*         fhClustersDZetaAcc;    //! z2 - z1projected for tracklets
182   TH1F*         fhClustersDPhiAll;     //! Phi2 - Phi1 all the combinations
183   TH1F*         fhClustersDThetaAll;   //! Theta2 - Theta1 all the combinations
184   TH1F*         fhClustersDZetaAll;    //! z2 - z1projected all the combinations
185
186   TH2F*         fhDPhiVsDThetaAll;     //! 2D plot for all the combinations
187   TH2F*         fhDPhiVsDThetaAcc;     //! same plot for tracklets
188   TH2F*         fhDPhiVsDZetaAll;      //! 2d plot for all the combination
189   TH2F*         fhDPhiVsDZetaAcc;      //! same plot for tracklets
190
191   TH1F*         fhetaTracklets;        //! Pseudorapidity distr. for tracklets
192   TH1F*         fhphiTracklets;        //! Azimuthal (Phi) distr. for tracklets
193   TH1F*         fhetaClustersLay1;     //! Pseudorapidity distr. for Clusters L. 1
194   TH1F*         fhphiClustersLay1;     //! Azimuthal (Phi) distr. for Clusters L. 1
195 //
196 // 
197   Bool_t*       fAssociationFlag1;    //! flag for the associations (Layer 1)
198   UInt_t*       fChipPredOnLay2;      //! prediction for the chip traversed by the tracklet 
199                                       //  based on vtx and ClusterLay1 (to be used in extrapolation)
200   UInt_t*       fChipPredOnLay1;      //! prediction for the chip traversed by the tracklet 
201                                       // based on vtx and ClusterLay2 (to be used in interpolation)
202   Int_t         fNTracklets1;   // Number of tracklets layer 1
203   // possible cuts :
204   Float_t       fPhiWindowL1;     // Search window in phi (Layer 1)
205   Float_t       fZetaWindowL1;    // SEarch window in zeta (Layer 1)
206   Bool_t        fOnlyOneTrackletPerC1; // only one tracklet per cluster in L. 1
207   Bool_t        fUpdateOncePerEventPlaneEff;  //  If this is kTRUE, then you can update the chip efficiency only once
208                                               //  per event in that chip. This to avoid double counting from the
209                                               //  same tracklets which has two rec-points on one layer.
210   Bool_t*       fChipUpdatedInEvent;          //!  boolean (chip by chip) to flag which chip has been updated its efficiency
211                                               //  in that event
212   AliITSPlaneEffSPD* fPlaneEffSPD; //! pointer to SPD plane efficiency class
213   AliITSPlaneEffSPD* fPlaneEffBkg; //! pointer to SPD plane efficiency class for background evaluation
214   Bool_t   fReflectClusterAroundZAxisForLayer0;  // if kTRUE, then a 180degree rotation around Z is applied to all 
215   Bool_t   fReflectClusterAroundZAxisForLayer1;  // clusters on that layer (x->-x; y->-y)
216   Bool_t   fLightBkgStudyInParallel; // if this is kTRUE, the basic and correct evaluation of background is performed
217                                      // in paralell to standard SPD efficiency evaluation
218   Bool_t   fMC; // Boolean to access Kinematics (only for MC events )
219   Bool_t   fUseOnlyPrimaryForPred; // Only for MC: if this is true, build tracklet prediction using only primary particles
220   Bool_t   fUseOnlySecondaryForPred; // Only for MC: if this is true build tracklet prediction using only secondary particles
221   Bool_t   fUseOnlySameParticle; // Only for MC: if this is true, assign a success only if clusters from same particles 
222                                  // (i.e. PP or SS) otherwise ignore the combination
223   Bool_t   fUseOnlyDifferentParticle; // Only for MC: if this is true, assign a success only if clusters from different particles 
224                                       // (i.e. PP' or PS or SS') otherwise ignore the combination
225   Bool_t   fUseOnlyStableParticle; // Only for MC: if this is kTRUE then method PrimaryTrackChecker return kTRUE only 
226                                 //              for particles decaying (eventually) after pixel layers
227   Int_t *fPredictionPrimary;  //! those for correction of bias from secondaries
228   Int_t *fPredictionSecondary; //! chip_by_chip: number of Prediction built with primaries/secondaries
229   Int_t *fClusterPrimary;  //!   number of clusters on a given chip fired by (at least) a primary
230   Int_t *fClusterSecondary; //!  number of clusters on a given chip fired by (only) secondaries
231   Int_t *fSuccessPP;     //! number of successes by using the same primary track (vs. chip of the success)
232   Int_t *fSuccessTT;     //! number of successes by using the same track (either a primary or a secondary) (vs. chip of the success)
233   Int_t *fSuccessS;      //! number of successes by using a secondary for the prediction (vs. chip of the success)
234   Int_t *fSuccessP;      //! number of successes by using a primary for the prediction (vs. chip of the success)
235   Int_t *fFailureS;      //! number of failures by using a secondary for the prediction (vs. chip of the failure)
236   Int_t *fFailureP;      //! number of failures by using a primary for the prediction (vs. chip of the failure)
237   Int_t *fRecons;        //! number of particle which can be reconstructed (only for MC from TrackRef)
238   Int_t *fNonRecons;     //! unmber of particle which cannot be reconstructed (only for MC from TrackRef)
239  // extra histograms with respect to the base class AliITSMultReconstructor
240   TH1F*         fhClustersDPhiInterpAcc;   //! Phi2 - Phi1 for tracklets (interpolation phase)
241   TH1F*         fhClustersDThetaInterpAcc; //! Theta2 - Theta1 for tracklets (interpolation phase)
242   TH1F*         fhClustersDZetaInterpAcc;  //! z2 - z1projected for tracklets (interpolation phase)
243   TH1F*         fhClustersDPhiInterpAll;   //! Phi2 - Phi1 all the combinations (interpolation phase)
244   TH1F*         fhClustersDThetaInterpAll; //! Theta2 - Theta1 all the combinations (interpolation phase)
245   TH1F*         fhClustersDZetaInterpAll;  //! z2 - z1projected all the combinations (interpolation phase)
246   TH2F*         fhDPhiVsDThetaInterpAll; //! 2D plot for all the combinations
247   TH2F*         fhDPhiVsDThetaInterpAcc; //! same plot for tracklets
248   TH2F*         fhDPhiVsDZetaInterpAll;  //! 2d plot for all the combination
249   TH2F*         fhDPhiVsDZetaInterpAcc;  //! same plot for tracklets
250   TH1F*         fhetaClustersLay2; //! Pseudorapidity distr. for Clusters L. 2
251   TH1F*         fhphiClustersLay2; //! Azimuthal (Phi) distr. for Clusters L. 2
252   TH1F*         fhClustersInChip; //! number of fired clusters versus chip number [0,1199]
253   TH2F**        fhClustersInModuleLay1; //! distribution of cluster in the module Lay 1 (sub-chip scale)
254   TH2F**        fhClustersInModuleLay2; //! distribution of cluster in the module Lay 2 (sub-chip scale)
255 //
256   Double_t GetRLayer(Int_t layer); // return average radius of layer (0,1) from Geometry
257   Bool_t PrimaryTrackChecker(Int_t ipart,AliStack* stack=0x0);  // check if a MC particle is primary (need AliStack)
258   Int_t DecayingTrackChecker(Int_t ipart,AliStack* stack=0x0);  // For a primary particle, check if it is stable (see cxx)
259 // check if a MC particle is reconstructable
260   Bool_t IsReconstructableAt(Int_t layer,Int_t iC,Int_t ipart,Float_t* vtx,AliStack* stack=0x0,TTree* ref=0x0);
261   void InitPredictionMC(); // allocate memory for cuts and MC data memebers
262   void DeletePredictionMC(); // deallocate memory
263   // method to locate a chip using current vtx and polar coordinate od tracklet w.r.t. to vtx (zVtx may not be given)
264   Bool_t FindChip(UInt_t &key, Int_t layer,  Float_t* vtx, Float_t thetaVtx, Float_t phiVtx, Float_t zVtx=999.); 
265   // method to transform from Global Cilindrical coordinate to local (module) Cartesian coordinate
266   Bool_t FromGloCilToLocCart(Int_t ilayer,Int_t idet, Double_t r, Double_t phi, Double_t z,
267                            Float_t &xloc, Float_t &zloc);
268   // method to obtain the module (detector) index using global coordinates
269   Int_t FindDetectorIndex(Int_t layer, Double_t phi, Double_t z);
270   // this method gives you the intersections between a line and a circle (centred in the origin) 
271   // using polar coordinates
272   Bool_t FindIntersectionPolar(Double_t vtx[2],Double_t phiVtx, Double_t R,Double_t &phi);
273   Bool_t SetAngleRange02Pi(Double_t &angle); // set the range of angle in [0,2pi[ 
274   Bool_t SetAngleRange02Pi(Float_t  &angle) 
275   {Double_t tmp=(Double_t)angle; Bool_t ret=SetAngleRange02Pi(tmp);angle=(Float_t)tmp;return ret;};  
276   void CallWarningMC() const {if(!fMC) AliWarning("You can use this method only for MC! Call SetMC() first");}
277   Bool_t SaveHists();
278   void BookHistos(); // booking of extra histograms w.r.t. base class
279   void DeleteHistos(); //delete histos from memory
280   // Method to apply a rotation by 180degree to all RecPoints (x->-x; y->-y) on a given layer
281   void ReflectClusterAroundZAxisForLayer(Int_t ilayer); // to be used for backgnd estimation on real data 
282
283   void LoadClusterArrays(TTree* tree);
284
285   ClassDef(AliITSTrackleterSPDEff,6)
286 };
287 // Input and output function for standard C++ input/output (for the cut values and MC statistics).
288 ostream &operator<<(ostream &os,const AliITSTrackleterSPDEff &s);
289 istream &operator>>(istream &is, AliITSTrackleterSPDEff &s);
290 #endif