9 /***********************************************************
11 Fast Simulation tool for Inner Tracker Systems
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
17 Changes by S. Rossegger
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.
23 April 2011 - Now uses the Kalman method (aliroot implementation) instead of the Billoir
24 technique ... (changes by Ruben Shahoyan)
26 March 2011 - Changes to comply with the Alice Offline coding conventions
28 Feb. 2011 - Improvement in "lowest pt allowed" -> now uses helix param. for calc. of a,b
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 ...
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)
38 Jan. 2011 - Inclusion of ImpactParameter Plots (with vtx estimates)
39 to allow comparison with ITS performances in pp data
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
46 ***********************************************************/
48 class AliExternalTrackParam;
51 class DetectorK : public TNamed {
56 DetectorK(char *name,char *title);
59 enum {kNptBins = 100}; // less then 400 !!
61 void AddLayer(char *name, Float_t radius, Float_t radL, Float_t phiRes=999999, Float_t zRes=999999, Float_t eff=0.95);
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);
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);
76 void PlotLayout(Int_t plotDead = kTRUE);
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);
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; }
102 void SetMaxSeedRadius(Double_t maxSeedRadius ) {fMaxSeedRadius = maxSeedRadius; }
103 Int_t GetMaxSeedRadius() const { return fMaxSeedRadius; }
105 void SetptScale(Double_t ptScale ) {fptScale = ptScale; }
106 Int_t GetptScale() const { return fptScale; }
110 void SetdNdEtaCent(Int_t dNdEtaCent ) {fdNdEtaCent = dNdEtaCent; }
111 Float_t GetdNdEtaCent() const { return fdNdEtaCent; }
115 Float_t GetNumberOfActiveLayers() const {return fNumberOfActiveLayers; }
116 Float_t GetNumberOfActiveITSLayers() const {return fNumberOfActiveITSLayers; }
118 void SolveViaBilloir(Int_t flagD0=1,Int_t print=1, Bool_t allPt=1, Double_t meanPt =0.250, char* detLayer=((char*)""));
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 ) ;
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 ;
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);
140 TGraph* GetGraphImpactParam(Int_t mode, Int_t axis, Int_t color, Int_t linewidth=1);
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);
146 TGraph* GetGraph(Int_t number, Int_t color, Int_t linewidth=1);
148 void MakeStandardPlots(Bool_t add =0, Int_t color=1, Int_t linewidth=1,Bool_t onlyPionEff=0);
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);
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"
172 Double_t fMaxSeedRadius; // max seeding radius, e.g. to exclude TRD
173 Double_t fptScale; // used for maxPt
175 Int_t fdNdEtaCent; // Multiplicity
177 enum {kMaxNumberOfDetectors = 200};
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
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
193 ClassDef(DetectorK,1);