TOF + macros to each detector folder
[u/mrichter/AliRoot.git] / ITS / UPGRADE / DetectorK.h
1 #ifndef DETECTORK_H
2 #define DETECTORK_H
3
4 #include <TNamed.h>
5 #include <TList.h>
6 #include <TGraph.h>
7 #include <Riostream.h>
8
9 /***********************************************************
10
11 Fast Simulation tool for Inner Tracker Systems
12
13 original code of using the billoir technique was developed
14 for the HFT (STAR), James H. Thomas, jhthomas@lbl.gov
15 http://rnc.lbl.gov/~jhthomas
16
17 Changes by S. Rossegger
18
19 July 2011  - Adding the possibility of "fake calculation" and "efficiency calculation" 
20              with a number of "at least correct clusters on the track"
21              Done using the complete combinatorics table with 3^nLayer track outcomes.
22
23 April 2011 - Now uses the Kalman method (aliroot implementation) instead of the Billoir
24              technique ... (changes by Ruben Shahoyan)
25
26 March 2011 - Changes to comply with the Alice Offline coding conventions
27
28 Feb. 2011 - Improvement in "lowest pt allowed" -> now uses helix param. for calc. of a,b
29
30           - Adding a more sophisticaed efficiency calculation which includes
31             the possibility to make chi2 cuts via Confidence Levels (method of Ruben Shahoyan)
32             plus adding 'basic' detection efficiencies per layer ...
33
34           - Adding "ITS Stand alone" tracking capabilities via 
35             forward+backward tracking -> Kalman smoothing is then 
36             used for the parameter estimates (important for efficiencies)
37
38 Jan. 2011 - Inclusion of ImpactParameter Plots (with vtx estimates)
39             to allow comparison with ITS performances in pp data
40
41 Dec. 2010 - Translation into C++ class format 
42           - Adding various Setters and Getters to build the geometry 
43             (based on cylinders) plus handling of the layer properties 
44
45
46 ***********************************************************/
47
48 class AliExternalTrackParam; 
49 #include <TMatrixD.h>
50
51 class DetectorK : public TNamed {
52
53  public:
54   
55   DetectorK();
56   DetectorK(char *name,char *title);
57   virtual ~DetectorK();
58
59   enum {kNptBins = 100}; // less then 400 !!
60  
61   void AddLayer(char *name, Float_t radius, Float_t radL, Float_t phiRes=999999, Float_t zRes=999999, Float_t eff=0.95);
62
63   void KillLayer(char *name);
64   void SetRadius(char *name, Float_t radius);
65   void SetRadiationLength(char *name, Float_t radL);
66   void SetResolution(char *name, Float_t phiRes=999999, Float_t zRes=999999);
67   void SetLayerEfficiency(char *name, Float_t eff=0.95);
68   void RemoveLayer(char *name);
69
70   Float_t GetRadius(char *name);
71   Float_t GetRadiationLength(char *name);
72   Float_t GetResolution(char *name, Int_t axis=0);
73   Float_t GetLayerEfficiency(char *name);
74
75   void PrintLayout(); 
76   void PlotLayout(Int_t plotDead = kTRUE);
77   
78   void MakeAliceAllNew(Bool_t flagTPC =1,Bool_t flagMon=1);
79   void MakeAliceCurrent(Int_t AlignResiduals = 0, Bool_t flagTPC =1);
80   void AddTPC(Float_t phiResMean, Float_t zResMean, Int_t skip=1);
81   void RemoveTPC();
82
83   void SetBField(Float_t bfield) {fBField = bfield; }
84   Float_t GetBField() const {return fBField; }
85   void SetLhcUPCscale(Float_t lhcUPCscale) {fLhcUPCscale = lhcUPCscale; }
86   Float_t GetLhcUPCscale() const { return fLhcUPCscale; }
87   void SetParticleMass(Float_t particleMass) {fParticleMass = particleMass; }
88   Float_t GetParticleMass() const { return fParticleMass; }
89   void SetIntegrationTime(Float_t integrationTime) {fIntegrationTime = integrationTime; }
90   Float_t GetIntegrationTime() const { return fIntegrationTime; }
91   void SetMaxRadiusOfSlowDetectors(Float_t maxRadiusSlowDet) {fMaxRadiusSlowDet =  maxRadiusSlowDet; }
92   Float_t GetMaxRadiusOfSlowDetectors() const { return fMaxRadiusSlowDet; }
93   void SetAvgRapidity(Float_t avgRapidity) {fAvgRapidity = avgRapidity; }
94   Float_t GetAvgRapidity() const { return fAvgRapidity; }
95   void SetConfidenceLevel(Float_t confLevel) {fConfLevel = confLevel; }
96   Float_t GetConfidenceLevel() const { return fConfLevel; }
97   void SetAtLeastCorr(Int_t atLeastCorr ) {fAtLeastCorr = atLeastCorr; }
98   Int_t GetAtLeastCorr() const { return fAtLeastCorr; }
99   void SetAtLeastFake(Int_t atLeastFake ) {fAtLeastFake = atLeastFake; }
100   Int_t GetAtLeastFake() const { return fAtLeastFake; }
101
102   void SetMaxSeedRadius(Double_t maxSeedRadius ) {fMaxSeedRadius = maxSeedRadius; }
103   Int_t GetMaxSeedRadius() const { return fMaxSeedRadius; }
104
105   void SetptScale(Double_t ptScale ) {fptScale = ptScale; }
106   Int_t GetptScale() const { return fptScale; }
107
108
109
110   void SetdNdEtaCent(Int_t dNdEtaCent ) {fdNdEtaCent = dNdEtaCent; }
111   Float_t GetdNdEtaCent() const { return fdNdEtaCent; }
112   
113   
114   
115   Float_t GetNumberOfActiveLayers() const {return fNumberOfActiveLayers; }
116   Float_t GetNumberOfActiveITSLayers() const {return fNumberOfActiveITSLayers; }
117
118   void SolveViaBilloir(Int_t flagD0=1,Int_t print=1, Bool_t allPt=1, Double_t meanPt =0.250, char* detLayer=((char*)""));
119
120   // Helper functions
121   Double_t ThetaMCS                 ( Double_t mass, Double_t RadLength, Double_t momentum ) const;
122   Double_t ProbGoodHit              ( Double_t radius, Double_t searchRadiusRPhi, Double_t searchRadiusZ )   ; 
123   Double_t ProbGoodChiSqHit         ( Double_t radius, Double_t searchRadiusRPhi, Double_t searchRadiusZ )   ; 
124   Double_t ProbGoodChiSqPlusConfHit ( Double_t radius, Double_t leff, Double_t searchRadiusRPhi, Double_t searchRadiusZ )   ; 
125   Double_t ProbNullChiSqPlusConfHit ( Double_t radius, Double_t leff, Double_t searchRadiusRPhi, Double_t searchRadiusZ )   ; 
126  
127   // Howard W. hit distribution and convolution integral
128   Double_t Dist              ( Double_t Z, Double_t radius ) ;  
129   Double_t HitDensity        ( Double_t radius )   ;
130   Double_t UpcHitDensity     ( Double_t radius )   ;
131   Double_t IntegratedHitDensity  ( Double_t multiplicity, Double_t radius )   ;
132   Double_t OneEventHitDensity    ( Double_t multiplicity, Double_t radius ) const   ;
133   Double_t D0IntegratedEfficiency( Double_t pt, Double_t corrEfficiency[][400] ) const ;
134   
135   TGraph* GetGraphMomentumResolution(Int_t color, Int_t linewidth=1);
136   TGraph* GetGraphPointingResolution(Int_t axis,Int_t color, Int_t linewidth=1);
137   TGraph* GetGraphPointingResolutionTeleEqu(Int_t axis,Int_t color, Int_t linewidth=1);
138   TGraph* GetGraphLayerInfo(Int_t plot, Int_t color, Int_t linewidth=1);
139
140   TGraph* GetGraphImpactParam(Int_t mode, Int_t axis, Int_t color, Int_t linewidth=1);
141
142   TGraph* GetGraphRecoEfficiency(Int_t particle, Int_t color, Int_t linewidth=1); 
143   TGraph* GetGraphRecoFakes(Int_t particle,Int_t color, Int_t linewidth);
144   TGraph* GetGraphRecoPurity(Int_t particle,Int_t color, Int_t linewidth);
145
146   TGraph* GetGraph(Int_t number, Int_t color, Int_t linewidth=1);
147
148   void MakeStandardPlots(Bool_t add =0, Int_t color=1, Int_t linewidth=1,Bool_t onlyPionEff=0);
149
150   // method to extend AliExternalTrackParam functionality
151   static Bool_t GetXatLabR(AliExternalTrackParam* tr,Double_t r,Double_t &x, Double_t bz, Int_t dir=0);
152   static Bool_t PropagateToR(AliExternalTrackParam* trc, double r, double b, int dir=0);
153   Double_t* PrepareEffFakeKombinations(TMatrixD *probKomb, TMatrixD *probLay);
154
155  protected:
156  
157   Int_t fNumberOfLayers;        // total number of layers in the model
158   Int_t fNumberOfActiveLayers;  // number of active layers in the model
159   Int_t fNumberOfActiveITSLayers;  // number of active ITS layers in the model
160   TList fLayers;                // List of layer pointers
161   Float_t fBField;              // Magnetic Field in Tesla
162   Float_t fLhcUPCscale;         // UltraPeripheralElectrons: scale from RHIC to LHC
163   Float_t fIntegrationTime;     // electronics integration time
164   Float_t fConfLevel;           // Confidence Level for the tracking
165   Float_t fAvgRapidity;         // rapidity of the track (= mean)
166   Float_t fParticleMass;        // Particle used for tracking. Standard: mass of pion
167   Double_t fMaxRadiusSlowDet;   // Maximum radius for slow detectors.  Fast detectors 
168                                 // and only fast detectors reside outside this radius.
169   Int_t fAtLeastCorr;     // min. number of correct hits for the track to be "good"
170   Int_t fAtLeastFake;     // min. number of fake hits for the track to be "fake"
171
172   Double_t fMaxSeedRadius; // max seeding radius, e.g. to exclude TRD
173   Double_t fptScale;      // used for maxPt
174
175   Int_t fdNdEtaCent;       // Multiplicity
176
177   enum {kMaxNumberOfDetectors = 200};
178  
179   Double_t fTransMomenta[kNptBins];                          // array of transverse momenta
180   Double_t fMomentumRes[kNptBins];                           // array of momentum resolution
181   Double_t fResolutionRPhi[kNptBins];                        // array of rphi resolution
182   Double_t fResolutionZ[kNptBins];                           // array of z resolution
183   Double_t fDetPointRes[kMaxNumberOfDetectors][kNptBins];    // array of rphi resolution per layer
184   Double_t fDetPointZRes[kMaxNumberOfDetectors][kNptBins];   // array of z resolution per layer
185   Double_t fEfficiency[3][kNptBins];                         // efficiency for different particles
186   Double_t fFake[3][kNptBins];                               // fake prob for different particles
187
188   Int_t kDetLayer;                              // layer for which a few more details are extracted
189   Double_t fResolutionRPhiLay[kNptBins];                        // array of rphi resolution
190   Double_t fResolutionZLay[kNptBins];                           // array of z resolution
191   Double_t fEfficProlongLay[kNptBins];                           // array of z resolution
192
193   ClassDef(DetectorK,1);
194 };
195
196 #endif
197