]>
Commit | Line | Data |
---|---|---|
84164254 | 1 | #include "TChain.h" |
2 | #include "TTree.h" | |
3 | #include "TH1F.h" | |
4 | #include "TH2F.h" | |
40b41983 | 5 | #include "TH3D.h" |
84164254 | 6 | #include "TCanvas.h" |
7 | #include "TParticle.h" | |
8 | #include "TObjArray.h" | |
9 | ||
10 | #include "AliAnalysisTask.h" | |
11 | #include "AliAnalysisManager.h" | |
12 | ||
13 | #include "AliStack.h" | |
14 | #include "AliMCEvent.h" | |
15 | #include "AliESDEvent.h" | |
16 | #include "AliESDInputHandler.h" | |
17 | #include "AliESDtrackCuts.h" | |
18 | #include "AliCentrality.h" | |
19 | ||
20 | #include "AliAnalysisTaskEfficiencyBF.h" | |
21 | ||
22 | // --------------------------------------------------------------------- | |
23 | // | |
24 | // Task for calculating the efficiency of the Balance Function | |
25 | // for single particles and pairs | |
26 | // | |
27 | // Authors: Panos Christakoglou, Michael Weber | |
28 | // | |
29 | // --------------------------------------------------------------------- | |
30 | ||
31 | ClassImp(AliAnalysisTaskEfficiencyBF) | |
32 | ||
33 | //________________________________________________________________________ | |
34 | AliAnalysisTaskEfficiencyBF::AliAnalysisTaskEfficiencyBF(const char *name) | |
35 | : AliAnalysisTaskSE(name), fESD(0), fQAList(0), fOutputList(0), | |
36 | fHistEventStats(0), fHistCentrality(0), fHistNMult(0), | |
40b41983 | 37 | fHistGeneratedEtaPtPhiPlus(0), fHistFindableEtaPtPhiPlus(0), |
38 | fHistReconstructedEtaPtPhiPlus(0), fHistSurvivedEtaPtPhiPlus(0), | |
39 | fHistGeneratedEtaPtPhiMinus(0), fHistFindableEtaPtPhiMinus(0), | |
40 | fHistReconstructedEtaPtPhiMinus(0), fHistSurvivedEtaPtPhiMinus(0), | |
84164254 | 41 | fHistGeneratedEtaPtPlusControl(0), fHistFindableEtaPtPlusControl(0), |
42 | fHistReconstructedEtaPtPlusControl(0), fHistSurvivedEtaPtPlusControl(0), | |
43 | fHistGeneratedEtaPtMinusControl(0), fHistFindableEtaPtMinusControl(0), | |
44 | fHistReconstructedEtaPtMinusControl(0), fHistSurvivedEtaPtMinusControl(0), | |
45 | fHistGeneratedEtaPtPlusPlus(0), fHistFindableEtaPtPlusPlus(0), | |
46 | fHistReconstructedEtaPtPlusPlus(0), fHistSurvivedEtaPtPlusPlus(0), | |
47 | fHistGeneratedEtaPtMinusMinus(0), fHistFindableEtaPtMinusMinus(0), | |
48 | fHistReconstructedEtaPtMinusMinus(0), fHistSurvivedEtaPtMinusMinus(0), | |
49 | fHistGeneratedEtaPtPlusMinus(0), fHistFindableEtaPtPlusMinus(0), | |
50 | fHistReconstructedEtaPtPlusMinus(0), fHistSurvivedEtaPtPlusMinus(0), | |
40b41983 | 51 | fHistGeneratedPhiEtaPlusPlus(0), fHistFindablePhiEtaPlusPlus(0), |
52 | fHistReconstructedPhiEtaPlusPlus(0), fHistSurvivedPhiEtaPlusPlus(0), | |
53 | fHistGeneratedPhiEtaMinusMinus(0), fHistFindablePhiEtaMinusMinus(0), | |
54 | fHistReconstructedPhiEtaMinusMinus(0), fHistSurvivedPhiEtaMinusMinus(0), | |
55 | fHistGeneratedPhiEtaPlusMinus(0), fHistFindablePhiEtaPlusMinus(0), | |
56 | fHistReconstructedPhiEtaPlusMinus(0), fHistSurvivedPhiEtaPlusMinus(0), | |
84164254 | 57 | fESDtrackCuts(0), fAnalysisMode(0), |
58 | fCentralityEstimator("V0M"), fCentralityPercentileMin(0.0), fCentralityPercentileMax(5.0), | |
59 | fVxMax(3.0), fVyMax(3.0), fVzMax(10.), | |
60 | fMinNumberOfTPCClusters(80), fMaxChi2PerTPCCluster(4.0), fMaxDCAxy(3.0), fMaxDCAz(3.0), | |
d9906391 | 61 | fMinPt(0.3), fMaxPt(1.5), fMinEta(-0.8), fMaxEta(0.8),fEtaRangeMin(0.0), fEtaRangeMax(1.6), fPtRangeMin(0.3), fPtRangeMax(1.5), fPhiRangeMin(0.0),fPhiRangeMax(360.),fdPhiRangeMax(180.), fEtaBin(100),fdEtaBin(64),fPtBin(49),fPhiBin(100),fdPhiBin(90) { |
84164254 | 62 | // Define input and output slots here |
63 | // Input slot #0 works with a TChain | |
64 | DefineInput(0, TChain::Class()); | |
65 | // Output slot #0 id reserved by the base class for AOD | |
66 | // Output slot #1 writes into a TH1 container | |
67 | DefineOutput(1, TList::Class()); | |
68 | DefineOutput(2, TList::Class()); | |
69 | } | |
70 | ||
71 | //________________________________________________________________________ | |
72 | void AliAnalysisTaskEfficiencyBF::UserCreateOutputObjects() { | |
73 | // Create histograms | |
74 | // Called once | |
75 | ||
211b716d | 76 | // global switch disabling the reference |
77 | // (to avoid "Replacing existing TH1" if several wagons are created in train) | |
78 | Bool_t oldStatus = TH1::AddDirectoryStatus(); | |
79 | TH1::AddDirectory(kFALSE); | |
80 | ||
84164254 | 81 | fQAList = new TList(); |
82 | fQAList->SetName("QAList"); | |
83 | fQAList->SetOwner(); | |
84 | ||
85 | fOutputList = new TList(); | |
86 | fOutputList->SetName("OutputList"); | |
87 | fOutputList->SetOwner(); | |
88 | ||
89 | //Event stats. | |
90 | TString gCutName[4] = {"Total","Offline trigger", | |
91 | "Vertex","Analyzed"}; | |
92 | fHistEventStats = new TH1F("fHistEventStats", | |
93 | "Event statistics;;N_{events}", | |
94 | 4,0.5,4.5); | |
95 | for(Int_t i = 1; i <= 4; i++) | |
96 | fHistEventStats->GetXaxis()->SetBinLabel(i,gCutName[i-1].Data()); | |
97 | fQAList->Add(fHistEventStats); | |
98 | ||
99 | //ESD analysis | |
100 | fHistCentrality = new TH1F("fHistCentrality",";Centrality bin;Events", | |
101 | 20,0.5,20.5); | |
102 | fQAList->Add(fHistCentrality); | |
103 | ||
104 | //multiplicity (good MC tracks) | |
105 | TString histName; | |
106 | histName = "fHistNMult"; | |
107 | fHistNMult = new TH1F(histName.Data(), | |
108 | ";N_{mult.}", | |
109 | 200,0,20000); | |
110 | fQAList->Add(fHistNMult); | |
111 | ||
112 | //eta vs pt for MC positives | |
40b41983 | 113 | fHistGeneratedEtaPtPhiPlus = new TH3D("fHistGeneratedEtaPtPhiPlus", |
114 | "Generated positive primaries;#eta;p_{T} (GeV/c);#phi", | |
622c9e7f | 115 | fEtaBin,fMinEta,fMaxEta,fPtBin,fPtRangeMin,fPtRangeMax,fPhiBin,fPhiRangeMin,fPhiRangeMax); |
40b41983 | 116 | fOutputList->Add(fHistGeneratedEtaPtPhiPlus); |
117 | fHistFindableEtaPtPhiPlus = new TH3D("fHistFindableEtaPtPhiPlus", | |
118 | "Findable positive primaries;#eta;p_{T} (GeV/c);#phi", | |
622c9e7f | 119 | fEtaBin,fMinEta,fMaxEta,fPtBin,fPtRangeMin,fPtRangeMax,fPhiBin,fPhiRangeMin,fPhiRangeMax); |
40b41983 | 120 | fOutputList->Add(fHistFindableEtaPtPhiPlus); |
121 | fHistReconstructedEtaPtPhiPlus = new TH3D("fHistReconstructedEtaPtPhiPlus", | |
122 | "Reconstructed positive primaries;#eta;p_{T} (GeV/c);#phi", | |
622c9e7f | 123 | fEtaBin,fMinEta,fMaxEta,fPtBin,fPtRangeMin,fPtRangeMax,fPhiBin,fPhiRangeMin,fPhiRangeMax); |
40b41983 | 124 | fOutputList->Add(fHistReconstructedEtaPtPhiPlus); |
125 | fHistSurvivedEtaPtPhiPlus = new TH3D("fHistSurvivedEtaPtPhiPlus", | |
126 | "Survived positive primaries;#eta;p_{T} (GeV/c);#phi", | |
622c9e7f | 127 | fEtaBin,fMinEta,fMaxEta,fPtBin,fPtRangeMin,fPtRangeMax,fPhiBin,fPhiRangeMin,fPhiRangeMax); |
40b41983 | 128 | fOutputList->Add(fHistSurvivedEtaPtPhiPlus); |
84164254 | 129 | |
130 | //eta vs pt for MC negatives | |
40b41983 | 131 | fHistGeneratedEtaPtPhiMinus = new TH3D("fHistGeneratedEtaPtPhiMinus", |
132 | "Generated positive primaries;#eta;p_{T} (GeV/c);#phi", | |
622c9e7f | 133 | fEtaBin,fMinEta,fMaxEta,fPtBin,fPtRangeMin,fPtRangeMax,fPhiBin,fPhiRangeMin,fPhiRangeMax); |
40b41983 | 134 | fOutputList->Add(fHistGeneratedEtaPtPhiMinus); |
135 | fHistFindableEtaPtPhiMinus = new TH3D("fHistFindableEtaPtPhiMinus", | |
136 | "Findable positive primaries;#eta;p_{T} (GeV/c);#phi", | |
622c9e7f | 137 | fEtaBin,fMinEta,fMaxEta,fPtBin,fPtRangeMin,fPtRangeMax,fPhiBin,fPhiRangeMin,fPhiRangeMax); |
40b41983 | 138 | fOutputList->Add(fHistFindableEtaPtPhiMinus); |
139 | fHistReconstructedEtaPtPhiMinus = new TH3D("fHistReconstructedEtaPtPhiMinus", | |
140 | "Reconstructed positive primaries;#eta;p_{T} (GeV/c);#phi", | |
622c9e7f | 141 | fEtaBin,fMinEta,fMaxEta,fPtBin,fPtRangeMin,fPtRangeMax,fPhiBin,fPhiRangeMin,fPhiRangeMax); |
40b41983 | 142 | fOutputList->Add(fHistReconstructedEtaPtPhiMinus); |
143 | fHistSurvivedEtaPtPhiMinus = new TH3D("fHistSurvivedEtaPtPhiMinus", | |
144 | "Survived positive primaries;#eta;p_{T} (GeV/c);#phi", | |
622c9e7f | 145 | fEtaBin,fMinEta,fMaxEta,fPtBin,fPtRangeMin,fPtRangeMax,fPhiBin,fPhiRangeMin,fPhiRangeMax); |
40b41983 | 146 | fOutputList->Add(fHistSurvivedEtaPtPhiMinus); |
84164254 | 147 | |
148 | //eta vs pt for MC positives (control) | |
149 | fHistGeneratedEtaPtPlusControl = new TH2F("fHistGeneratedEtaPtPlusControl", | |
150 | "Generated positive primaries;#eta;p_{T} (GeV/c)", | |
622c9e7f | 151 | fEtaBin,fMinEta,fMaxEta,fPtBin,fPtRangeMin,fPtRangeMax); |
84164254 | 152 | fOutputList->Add(fHistGeneratedEtaPtPlusControl); |
153 | fHistFindableEtaPtPlusControl = new TH2F("fHistFindableEtaPtPlusControl", | |
154 | "Findable positive primaries;#eta;p_{T} (GeV/c)", | |
622c9e7f | 155 | fEtaBin,fMinEta,fMaxEta,fPtBin,fPtRangeMin,fPtRangeMax); |
84164254 | 156 | fOutputList->Add(fHistFindableEtaPtPlusControl); |
157 | fHistReconstructedEtaPtPlusControl = new TH2F("fHistReconstructedEtaPtPlusControl", | |
158 | "Reconstructed positive primaries;#eta;p_{T} (GeV/c)", | |
622c9e7f | 159 | fEtaBin,fMinEta,fMaxEta,fPtBin,fPtRangeMin,fPtRangeMax); |
84164254 | 160 | fOutputList->Add(fHistReconstructedEtaPtPlusControl); |
161 | fHistSurvivedEtaPtPlusControl = new TH2F("fHistSurvivedEtaPtPlusControl", | |
162 | "Survived positive primaries;#eta;p_{T} (GeV/c)", | |
622c9e7f | 163 | fEtaBin,fMinEta,fMaxEta,fPtBin,fPtRangeMin,fPtRangeMax); |
84164254 | 164 | fOutputList->Add(fHistSurvivedEtaPtPlusControl); |
165 | ||
166 | //eta vs pt for MC negatives (control) | |
167 | fHistGeneratedEtaPtMinusControl = new TH2F("fHistGeneratedEtaPtMinusControl", | |
168 | "Generated positive primaries;#eta;p_{T} (GeV/c)", | |
622c9e7f | 169 | fEtaBin,fMinEta,fMaxEta,fPtBin,fPtRangeMin,fPtRangeMax); |
84164254 | 170 | fOutputList->Add(fHistGeneratedEtaPtMinusControl); |
171 | fHistFindableEtaPtMinusControl = new TH2F("fHistFindableEtaPtMinusControl", | |
172 | "Findable positive primaries;#eta;p_{T} (GeV/c)", | |
622c9e7f | 173 | fEtaBin,fMinEta,fMaxEta,fPtBin,fPtRangeMin,fPtRangeMax); |
84164254 | 174 | fOutputList->Add(fHistFindableEtaPtMinusControl); |
175 | fHistReconstructedEtaPtMinusControl = new TH2F("fHistReconstructedEtaPtMinusControl", | |
176 | "Reconstructed positive primaries;#eta;p_{T} (GeV/c)", | |
622c9e7f | 177 | fEtaBin,fMinEta,fMaxEta,fPtBin,fPtRangeMin,fPtRangeMax); |
84164254 | 178 | fOutputList->Add(fHistReconstructedEtaPtMinusControl); |
179 | fHistSurvivedEtaPtMinusControl = new TH2F("fHistSurvivedEtaPtMinusControl", | |
180 | "Survived positive primaries;#eta;p_{T} (GeV/c)", | |
622c9e7f | 181 | fEtaBin,fMinEta,fMaxEta,fPtBin,fPtRangeMin,fPtRangeMax); |
84164254 | 182 | fOutputList->Add(fHistSurvivedEtaPtMinusControl); |
183 | ||
184 | //eta vs pt for MC ++ | |
185 | fHistGeneratedEtaPtPlusPlus = new TH2F("fHistGeneratedEtaPtPlusPlus", | |
186 | "Generated ++ primaries;#Delta#eta;p_{T} (GeV/c)", | |
d9906391 | 187 | fdEtaBin,fEtaRangeMin,fEtaRangeMax,fPtBin,fPtRangeMin,fPtRangeMax); |
84164254 | 188 | fOutputList->Add(fHistGeneratedEtaPtPlusPlus); |
189 | fHistFindableEtaPtPlusPlus = new TH2F("fHistFindableEtaPtPlusPlus", | |
190 | "Findable ++ primaries;#Delta#eta;p_{T} (GeV/c)", | |
d9906391 | 191 | fdEtaBin,fEtaRangeMin,fEtaRangeMax,fPtBin,fPtRangeMin,fPtRangeMax); |
84164254 | 192 | fOutputList->Add(fHistFindableEtaPtPlusPlus); |
193 | fHistReconstructedEtaPtPlusPlus = new TH2F("fHistReconstructedEtaPtPlusPlus", | |
194 | "Reconstructed ++ primaries;#Delta#eta;p_{T} (GeV/c)", | |
d9906391 | 195 | fdEtaBin,fEtaRangeMin,fEtaRangeMax,fPtBin,fPtRangeMin,fPtRangeMax); |
84164254 | 196 | fOutputList->Add(fHistReconstructedEtaPtPlusPlus); |
197 | fHistSurvivedEtaPtPlusPlus = new TH2F("fHistSurvivedEtaPtPlusPlus", | |
198 | "Survived ++ primaries;#Delta#eta;p_{T} (GeV/c)", | |
d9906391 | 199 | fdEtaBin,fEtaRangeMin,fEtaRangeMax,fPtBin,fPtRangeMin,fPtRangeMax); |
84164254 | 200 | fOutputList->Add(fHistSurvivedEtaPtPlusPlus); |
201 | ||
202 | //eta vs pt for MC -- | |
203 | fHistGeneratedEtaPtMinusMinus = new TH2F("fHistGeneratedEtaPtMinusMinus", | |
204 | "Generated -- primaries;#Delta#eta;p_{T} (GeV/c)", | |
d9906391 | 205 | fdEtaBin,fEtaRangeMin,fEtaRangeMax,fPtBin,fPtRangeMin,fPtRangeMax); |
84164254 | 206 | fOutputList->Add(fHistGeneratedEtaPtMinusMinus); |
207 | fHistFindableEtaPtMinusMinus = new TH2F("fHistFindableEtaPtMinusMinus", | |
208 | "Findable -- primaries;#Delta#eta;p_{T} (GeV/c)", | |
d9906391 | 209 | fdEtaBin,fEtaRangeMin,fEtaRangeMax,fPtBin,fPtRangeMin,fPtRangeMax); |
84164254 | 210 | fOutputList->Add(fHistFindableEtaPtMinusMinus); |
211 | fHistReconstructedEtaPtMinusMinus = new TH2F("fHistReconstructedEtaPtMinusMinus", | |
212 | "Reconstructed -- primaries;#Delta#eta;p_{T} (GeV/c)", | |
d9906391 | 213 | fdEtaBin,fEtaRangeMin,fEtaRangeMax,fPtBin,fPtRangeMin,fPtRangeMax); |
84164254 | 214 | fOutputList->Add(fHistReconstructedEtaPtMinusMinus); |
215 | fHistSurvivedEtaPtMinusMinus = new TH2F("fHistSurvivedEtaPtMinusMinus", | |
216 | "Survived -- primaries;#Delta#eta;p_{T} (GeV/c)", | |
d9906391 | 217 | fdEtaBin,fEtaRangeMin,fEtaRangeMax,fPtBin,fPtRangeMin,fPtRangeMax); |
84164254 | 218 | fOutputList->Add(fHistSurvivedEtaPtMinusMinus); |
219 | ||
220 | //eta vs pt for MC +- | |
221 | fHistGeneratedEtaPtPlusMinus = new TH2F("fHistGeneratedEtaPtPlusMinus", | |
222 | "Generated +- primaries;#Delta#eta;p_{T} (GeV/c)", | |
d9906391 | 223 | fdEtaBin,fEtaRangeMin,fEtaRangeMax,fPtBin,fPtRangeMin,fPtRangeMax); |
84164254 | 224 | fOutputList->Add(fHistGeneratedEtaPtPlusMinus); |
225 | fHistFindableEtaPtPlusMinus = new TH2F("fHistFindableEtaPtPlusMinus", | |
226 | "Findable +- primaries;#Delta#eta;p_{T} (GeV/c)", | |
d9906391 | 227 | fdEtaBin,fEtaRangeMin,fEtaRangeMax,fPtBin,fPtRangeMin,fPtRangeMax); |
84164254 | 228 | fOutputList->Add(fHistFindableEtaPtPlusMinus); |
229 | fHistReconstructedEtaPtPlusMinus = new TH2F("fHistReconstructedEtaPtPlusMinus", | |
230 | "Reconstructed +- primaries;#Delta#eta;p_{T} (GeV/c)", | |
d9906391 | 231 | fdEtaBin,fEtaRangeMin,fEtaRangeMax,fPtBin,fPtRangeMin,fPtRangeMax); |
84164254 | 232 | fOutputList->Add(fHistReconstructedEtaPtPlusMinus); |
233 | fHistSurvivedEtaPtPlusMinus = new TH2F("fHistSurvivedEtaPtPlusMinus", | |
234 | "Survived +- primaries;#Delta#eta;p_{T} (GeV/c)", | |
d9906391 | 235 | fdEtaBin,fEtaRangeMin,fEtaRangeMax,fPtBin,fPtRangeMin,fPtRangeMax); |
84164254 | 236 | fOutputList->Add(fHistSurvivedEtaPtPlusMinus); |
237 | ||
40b41983 | 238 | //=============================// |
239 | //phi vs eta for MC ++ | |
240 | fHistGeneratedPhiEtaPlusPlus = new TH2F("fHistGeneratedPhiEtaPlusPlus", | |
241 | "Generated ++ primaries;#Delta#phi", | |
d9906391 | 242 | fdPhiBin,fPhiRangeMin,fdPhiRangeMax,fdEtaBin,fEtaRangeMin,fEtaRangeMax); |
40b41983 | 243 | fOutputList->Add(fHistGeneratedPhiEtaPlusPlus); |
244 | fHistFindablePhiEtaPlusPlus = new TH2F("fHistFindablePhiEtaPlusPlus", | |
245 | "Findable ++ primaries;#Delta#phi;#Delta#eta", | |
d9906391 | 246 | fdPhiBin,fPhiRangeMin,fdPhiRangeMax,fdEtaBin,fEtaRangeMin,fEtaRangeMax); |
40b41983 | 247 | fOutputList->Add(fHistFindablePhiEtaPlusPlus); |
248 | fHistReconstructedPhiEtaPlusPlus = new TH2F("fHistReconstructedPhiEtaPlusPlus", | |
249 | "Reconstructed ++ primaries;#Delta#phi;#Delta#eta", | |
d9906391 | 250 | fdPhiBin,fPhiRangeMin,fdPhiRangeMax,fdEtaBin,fEtaRangeMin,fEtaRangeMax); |
40b41983 | 251 | fOutputList->Add(fHistReconstructedPhiEtaPlusPlus); |
252 | fHistSurvivedPhiEtaPlusPlus = new TH2F("fHistSurvivedPhiEtaPlusPlus", | |
253 | "Survived ++ primaries;#Delta#phi;#Delta#eta", | |
d9906391 | 254 | fdPhiBin,fPhiRangeMin,fdPhiRangeMax,fdEtaBin,fEtaRangeMin,fEtaRangeMax); |
40b41983 | 255 | fOutputList->Add(fHistSurvivedPhiEtaPlusPlus); |
256 | ||
257 | //phi vs eta for MC -- | |
258 | fHistGeneratedPhiEtaMinusMinus = new TH2F("fHistGeneratedPhiEtaMinusMinus", | |
259 | "Generated -- primaries;#Delta#phi;#Delta#eta", | |
d9906391 | 260 | fdPhiBin,fPhiRangeMin,fdPhiRangeMax,fdEtaBin,fEtaRangeMin,fEtaRangeMax); |
40b41983 | 261 | fOutputList->Add(fHistGeneratedPhiEtaMinusMinus); |
262 | fHistFindablePhiEtaMinusMinus = new TH2F("fHistFindablePhiEtaMinusMinus", | |
263 | "Findable -- primaries;#Delta#phi;#Delta#eta", | |
d9906391 | 264 | fdPhiBin,fPhiRangeMin,fdPhiRangeMax,fdEtaBin,fEtaRangeMin,fEtaRangeMax); |
40b41983 | 265 | fOutputList->Add(fHistFindablePhiEtaMinusMinus); |
266 | fHistReconstructedPhiEtaMinusMinus = new TH2F("fHistReconstructedPhiEtaMinusMinus", | |
267 | "Reconstructed -- primaries;#Delta#phi;#Delta#eta", | |
d9906391 | 268 | fdPhiBin,fPhiRangeMin,fdPhiRangeMax,fdEtaBin,fEtaRangeMin,fEtaRangeMax); |
40b41983 | 269 | fOutputList->Add(fHistReconstructedPhiEtaMinusMinus); |
270 | fHistSurvivedPhiEtaMinusMinus = new TH2F("fHistSurvivedPhiEtaMinusMinus", | |
271 | "Survived -- primaries;#Delta#phi;#Delta#eta", | |
d9906391 | 272 | fdPhiBin,fPhiRangeMin,fdPhiRangeMax,fdEtaBin,fEtaRangeMin,fEtaRangeMax); |
40b41983 | 273 | fOutputList->Add(fHistSurvivedPhiEtaMinusMinus); |
274 | ||
275 | //phi vs eta for MC +- | |
276 | fHistGeneratedPhiEtaPlusMinus = new TH2F("fHistGeneratedPhiEtaPlusMinus", | |
277 | "Generated +- primaries;#Delta#phi;#Delta#eta", | |
d9906391 | 278 | fdPhiBin,fPhiRangeMin,fdPhiRangeMax,fdEtaBin,fEtaRangeMin,fEtaRangeMax); |
40b41983 | 279 | fOutputList->Add(fHistGeneratedPhiEtaPlusMinus); |
280 | fHistFindablePhiEtaPlusMinus = new TH2F("fHistFindablePhiEtaPlusMinus", | |
281 | "Findable +- primaries;#Delta#phi;#Delta#eta", | |
d9906391 | 282 | fdPhiBin,fPhiRangeMin,fdPhiRangeMax,fdEtaBin,fEtaRangeMin,fEtaRangeMax); |
40b41983 | 283 | fOutputList->Add(fHistFindablePhiEtaPlusMinus); |
284 | fHistReconstructedPhiEtaPlusMinus = new TH2F("fHistReconstructedPhiEtaPlusMinus", | |
285 | "Reconstructed +- primaries;#Delta#phi;#Delta#eta", | |
d9906391 | 286 | fdPhiBin,fPhiRangeMin,fdPhiRangeMax,fdEtaBin,fEtaRangeMin,fEtaRangeMax); |
40b41983 | 287 | fOutputList->Add(fHistReconstructedPhiEtaPlusMinus); |
288 | fHistSurvivedPhiEtaPlusMinus = new TH2F("fHistSurvivedPhiEtaPlusMinus", | |
289 | "Survived +- primaries;#Delta#phi;#Delta#eta", | |
d9906391 | 290 | fdPhiBin,fPhiRangeMin,fdPhiRangeMax,fdEtaBin,fEtaRangeMin,fEtaRangeMax); |
40b41983 | 291 | fOutputList->Add(fHistSurvivedPhiEtaPlusMinus); |
292 | //=============================// | |
293 | ||
84164254 | 294 | fQAList->Print(); |
295 | fOutputList->Print(); | |
296 | ||
297 | PostData(1, fQAList); | |
298 | PostData(2, fOutputList); | |
211b716d | 299 | |
300 | TH1::AddDirectory(oldStatus); | |
301 | ||
84164254 | 302 | } |
303 | ||
304 | //________________________________________________________________________ | |
305 | void AliAnalysisTaskEfficiencyBF::UserExec(Option_t *) { | |
306 | // Main loop | |
307 | // Called for each event | |
308 | ||
309 | // Post output data. | |
310 | //ESD analysis | |
311 | fESD = dynamic_cast<AliESDEvent*>(InputEvent()); | |
312 | if (!fESD) { | |
313 | printf("ERROR: fESD not available\n"); | |
314 | return; | |
315 | } | |
316 | ||
317 | AliMCEvent* mcEvent = MCEvent(); | |
318 | if (!mcEvent) { | |
319 | Printf("ERROR: Could not retrieve MC event"); | |
320 | return; | |
321 | } | |
322 | AliStack* stack = mcEvent->Stack(); | |
323 | if (!stack) { | |
324 | Printf("ERROR: Could not retrieve MC stack"); | |
325 | return; | |
326 | } | |
327 | ||
328 | // arrays for 2 particle histograms | |
329 | Int_t nMCLabelCounter = 0; | |
330 | const Int_t maxMCLabelCounter = 20000; | |
331 | ||
84164254 | 332 | Double_t eta[maxMCLabelCounter]; |
40b41983 | 333 | Double_t pt[maxMCLabelCounter]; |
334 | Double_t phi[maxMCLabelCounter]; | |
84164254 | 335 | Int_t level[maxMCLabelCounter]; |
336 | Int_t charge[maxMCLabelCounter]; | |
337 | ||
84164254 | 338 | //AliInfo(Form("%d %d",mcEvent->GetNumberOfTracks(),fESD->GetNumberOfTracks())); |
339 | fHistEventStats->Fill(1); //all events | |
340 | ||
341 | //Centrality stuff | |
342 | AliCentrality *centrality = fESD->GetCentrality(); | |
343 | Int_t nCentrality = 0; | |
344 | nCentrality = (Int_t)(centrality->GetCentralityPercentile(fCentralityEstimator.Data())/10.); | |
345 | ||
346 | //Printf("Centrality: %lf",centrality->GetCentralityPercentile(fCentralityEstimator.Data())); | |
347 | ||
348 | if(centrality->IsEventInCentralityClass(fCentralityPercentileMin, | |
349 | fCentralityPercentileMax, | |
350 | fCentralityEstimator.Data())) { | |
351 | fHistEventStats->Fill(2); //triggered + centrality | |
352 | fHistCentrality->Fill(nCentrality+1); | |
353 | ||
354 | //Printf("Centrality selection: %lf - %lf",fCentralityPercentileMin,fCentralityPercentileMax); | |
355 | ||
356 | if(fAnalysisMode.CompareTo("TPC") == 0 ) { | |
357 | const AliESDVertex *vertex = fESD->GetPrimaryVertexTPC(); | |
358 | if(vertex) { | |
359 | if(vertex->GetNContributors() > 0) { | |
360 | if(vertex->GetZRes() != 0) { | |
361 | fHistEventStats->Fill(3); //events with a proper vertex | |
362 | if(TMath::Abs(vertex->GetXv()) < fVxMax) { | |
363 | if(TMath::Abs(vertex->GetYv()) < fVyMax) { | |
364 | if(TMath::Abs(vertex->GetZv()) < fVzMax) { | |
365 | fHistEventStats->Fill(4); //analyzed events | |
366 | ||
367 | Int_t nMCParticles = mcEvent->GetNumberOfTracks(); | |
368 | TArrayI labelMCArray(nMCParticles); | |
369 | ||
370 | for (Int_t iTracks = 0; iTracks < mcEvent->GetNumberOfTracks(); iTracks++) { | |
371 | AliMCParticle *mcTrack = (AliMCParticle*) mcEvent->GetTrack(iTracks); | |
372 | if (!mcTrack) { | |
373 | Printf("ERROR: Could not receive track %d (mc loop)", iTracks); | |
374 | continue; | |
375 | } | |
376 | ||
377 | //exclude particles generated out of the acceptance | |
378 | Double_t vz = mcTrack->Zv(); | |
379 | if (TMath::Abs(vz) > 50.) continue; | |
40b41983 | 380 | |
84164254 | 381 | //acceptance |
622c9e7f | 382 | if(TMath::Abs(mcTrack->Eta()) > fMaxEta) |
40b41983 | 383 | continue; |
622c9e7f | 384 | if((mcTrack->Pt() > fMaxPt)||(mcTrack->Pt() < fMinPt)) |
84164254 | 385 | continue; |
40b41983 | 386 | if((mcTrack->Phi() > fPhiRangeMax)||(mcTrack->Phi() < fPhiRangeMin)) |
84164254 | 387 | continue; |
388 | ||
389 | TParticle* particle = mcTrack->Particle(); | |
390 | if(!particle) continue; | |
391 | if(!stack->IsPhysicalPrimary(iTracks)) continue; | |
392 | ||
393 | if(iTracks <= stack->GetNprimary()) { | |
394 | Short_t gMCCharge = mcTrack->Charge(); | |
77e61e9e | 395 | Double_t phiRad = particle->Phi(); |
396 | Double_t phiDeg = phiRad*TMath::RadToDeg(); | |
397 | ||
84164254 | 398 | if(gMCCharge > 0) |
40b41983 | 399 | fHistGeneratedEtaPtPhiPlus->Fill(particle->Eta(), |
400 | particle->Pt(), | |
77e61e9e | 401 | phiDeg); |
84164254 | 402 | else if(gMCCharge < 0) |
40b41983 | 403 | fHistGeneratedEtaPtPhiMinus->Fill(particle->Eta(), |
404 | particle->Pt(), | |
77e61e9e | 405 | phiDeg); |
84164254 | 406 | |
407 | ||
408 | // findable tracks --> DOES NOT WORK???? | |
409 | // Loop over Track References | |
410 | Bool_t labelTPC = kTRUE; | |
411 | AliTrackReference* trackRef = 0; | |
412 | ||
413 | for (Int_t iTrackRef = 0; iTrackRef < mcTrack->GetNumberOfTrackReferences(); iTrackRef++) { | |
414 | trackRef = mcTrack->GetTrackReference(iTrackRef); | |
415 | if(trackRef) { | |
416 | Int_t detectorId = trackRef->DetectorId(); | |
417 | if (detectorId == AliTrackReference::kTPC) { | |
418 | labelTPC = kTRUE; | |
419 | break; | |
420 | } | |
421 | } | |
422 | }//loop over track references | |
423 | ||
424 | if(labelTPC) { | |
425 | labelMCArray.AddAt(iTracks,nMCLabelCounter); | |
426 | ||
427 | if(nMCLabelCounter >= maxMCLabelCounter){ | |
428 | AliWarning(Form("MC Label Counter > Limit (%d) --> stop loop here",maxMCLabelCounter)); | |
429 | break; | |
430 | } | |
431 | ||
40b41983 | 432 | //fill the arrays for 2 particle analysis |
84164254 | 433 | eta[nMCLabelCounter] = particle->Eta(); |
434 | pt[nMCLabelCounter] = particle->Pt(); | |
77e61e9e | 435 | phi[nMCLabelCounter] = particle->Phi()*TMath::RadToDeg(); |
84164254 | 436 | charge[nMCLabelCounter] = gMCCharge; |
77e61e9e | 437 | |
84164254 | 438 | // findable = generated in this case! |
40b41983 | 439 | |
84164254 | 440 | level[nMCLabelCounter] = 1; |
84164254 | 441 | nMCLabelCounter += 1; |
40b41983 | 442 | |
443 | ||
84164254 | 444 | if(gMCCharge > 0) |
40b41983 | 445 | fHistFindableEtaPtPhiPlus->Fill(particle->Eta(), |
446 | particle->Pt(), | |
77e61e9e | 447 | phiDeg); |
84164254 | 448 | else if(gMCCharge < 0) |
40b41983 | 449 | fHistFindableEtaPtPhiMinus->Fill(particle->Eta(), |
450 | particle->Pt(), | |
77e61e9e | 451 | phiDeg); |
84164254 | 452 | } |
453 | }//primaries | |
454 | }//loop over MC particles | |
455 | ||
456 | fHistNMult->Fill(nMCLabelCounter); | |
457 | ||
458 | // not used so far | |
459 | //Float_t dcaXY = 0.0, dcaZ = 0.0; | |
460 | ||
461 | //ESD track loop | |
462 | Int_t nGoodTracks = fESD->GetNumberOfTracks(); | |
463 | ||
464 | TArrayI labelArray(nGoodTracks); | |
465 | Int_t labelCounter = 0; | |
466 | for(Int_t iTracks = 0; iTracks < nGoodTracks; iTracks++) { | |
467 | AliESDtrack* track = fESD->GetTrack(iTracks); | |
468 | //AliESDtrack* track = fESDtrackCuts->GetTPCOnlyTrack(fESD,iTracks); | |
469 | if(!track) continue; | |
470 | ||
471 | AliESDtrack *tpcOnlyTrack = new AliESDtrack(); | |
472 | ||
473 | if (!track->FillTPCOnlyTrack(*tpcOnlyTrack)) { | |
474 | delete tpcOnlyTrack; | |
475 | continue; | |
476 | } | |
477 | ||
478 | Int_t label = TMath::Abs(track->GetTPCLabel()); | |
479 | if(IsLabelUsed(labelArray,label)) continue; | |
480 | labelArray.AddAt(label,labelCounter); | |
481 | labelCounter += 1; | |
482 | ||
483 | Bool_t iFound = kFALSE; | |
484 | Int_t mcGoods = nMCLabelCounter; | |
485 | for (Int_t k = 0; k < mcGoods; k++) { | |
486 | Int_t mcLabel = labelMCArray.At(k); | |
487 | iFound = kFALSE; | |
488 | ||
489 | if (mcLabel != TMath::Abs(label)) continue; | |
490 | if(mcLabel != label) continue; | |
491 | if(label > stack->GetNtrack()) continue; | |
492 | ||
493 | TParticle *particle = stack->Particle(label); | |
494 | if(!particle) continue; | |
495 | ||
496 | //acceptance | |
622c9e7f | 497 | if(TMath::Abs(particle->Eta()) > fMaxEta) |
40b41983 | 498 | continue; |
622c9e7f | 499 | if((particle->Pt() > fMaxPt)||(particle->Pt() < fMinPt)) |
84164254 | 500 | continue; |
40b41983 | 501 | if((particle->Phi() > fPhiRangeMax)||(particle->Phi() < fPhiRangeMin)) |
84164254 | 502 | continue; |
40b41983 | 503 | |
84164254 | 504 | if(!stack->IsPhysicalPrimary(label)) continue; |
505 | ||
506 | if(label <= stack->GetNprimary()) { | |
507 | ||
508 | // reconstructed | |
509 | level[k] = 2; | |
510 | ||
511 | Short_t gCharge = track->Charge(); | |
77e61e9e | 512 | Double_t phiRad = particle->Phi(); |
513 | Double_t phiDeg = phiRad*TMath::RadToDeg(); | |
514 | ||
84164254 | 515 | if(gCharge > 0) |
40b41983 | 516 | fHistReconstructedEtaPtPhiPlus->Fill(particle->Eta(), |
517 | particle->Pt(), | |
77e61e9e | 518 | phiDeg); |
84164254 | 519 | else if(gCharge < 0) |
40b41983 | 520 | fHistReconstructedEtaPtPhiMinus->Fill(particle->Eta(), |
521 | particle->Pt(), | |
77e61e9e | 522 | phiDeg); |
84164254 | 523 | |
524 | // track cuts + analysis kinematic cuts | |
525 | if(fESDtrackCuts->AcceptTrack(track) && TMath::Abs(track->Eta()) < fMaxEta && track->Pt() > fMinPt && track->Pt() < fMaxPt ){ | |
526 | ||
527 | // survived | |
528 | level[k] = 3; | |
529 | ||
530 | if(gCharge > 0) | |
40b41983 | 531 | fHistSurvivedEtaPtPhiPlus->Fill(particle->Eta(), |
532 | particle->Pt(), | |
77e61e9e | 533 | phiDeg); |
84164254 | 534 | else if(gCharge < 0) |
40b41983 | 535 | fHistSurvivedEtaPtPhiMinus->Fill(particle->Eta(), |
536 | particle->Pt(), | |
77e61e9e | 537 | phiDeg); |
40b41983 | 538 | |
84164254 | 539 | }//track cuts |
540 | }//primary particles | |
541 | }//findable track loop | |
542 | }//ESD track loop | |
40b41983 | 543 | |
84164254 | 544 | labelMCArray.Reset(); |
545 | labelArray.Reset(); | |
40b41983 | 546 | |
547 | ||
84164254 | 548 | }//Vz cut |
549 | }//Vy cut | |
550 | }//Vx cut | |
551 | }//Vz resolution | |
552 | }//number of contributors | |
553 | }//valid vertex | |
554 | }//TPC analysis mode | |
555 | }//centrality | |
556 | ||
557 | ||
558 | ||
559 | // Here comes the 2 particle analysis | |
560 | // loop over all good MC particles | |
561 | for (Int_t i = 0; i < nMCLabelCounter ; i++) { | |
40b41983 | 562 | |
84164254 | 563 | // control 1D histograms (charge might be different?) |
564 | if(charge[i] > 0){ | |
565 | if(level[i] > 0) fHistGeneratedEtaPtPlusControl->Fill(eta[i],pt[i]); | |
566 | if(level[i] > 1) fHistReconstructedEtaPtPlusControl->Fill(eta[i],pt[i]); | |
567 | if(level[i] > 2) fHistSurvivedEtaPtPlusControl->Fill(eta[i],pt[i]); | |
568 | } | |
569 | else if(charge[i] < 0){ | |
570 | if(level[i] > 0) fHistGeneratedEtaPtMinusControl->Fill(eta[i],pt[i]); | |
571 | if(level[i] > 1) fHistReconstructedEtaPtMinusControl->Fill(eta[i],pt[i]); | |
572 | if(level[i] > 2) fHistSurvivedEtaPtMinusControl->Fill(eta[i],pt[i]); | |
573 | } | |
40b41983 | 574 | |
575 | ||
84164254 | 576 | for (Int_t j = i+1; j < nMCLabelCounter ; j++) { |
577 | ||
578 | if(charge[i] > 0 && charge[j] > 0 ){ | |
40b41983 | 579 | if(level[i] > 0 && level[j] > 0) { |
580 | fHistGeneratedEtaPtPlusPlus->Fill(TMath::Abs(eta[i]-eta[j]),pt[i]); | |
77e61e9e | 581 | if (TMath::Abs(phi[i]-phi[j]) < 180) |
40b41983 | 582 | fHistGeneratedPhiEtaPlusPlus->Fill(TMath::Abs(phi[i]-phi[j]),TMath::Abs(eta[i]-eta[j])); |
583 | } | |
584 | if(level[i] > 1 && level[j] > 1) { | |
585 | fHistReconstructedEtaPtPlusPlus->Fill(TMath::Abs(eta[i]-eta[j]),pt[i]); | |
77e61e9e | 586 | if (TMath::Abs(phi[i]-phi[j]) < 180) |
40b41983 | 587 | fHistReconstructedPhiEtaPlusPlus->Fill(TMath::Abs(phi[i]-phi[j]),TMath::Abs(eta[i]-eta[j])); |
588 | } | |
589 | if(level[i] > 2 && level[j] > 2) { | |
590 | fHistSurvivedEtaPtPlusPlus->Fill(TMath::Abs(eta[i]-eta[j]),pt[i]); | |
77e61e9e | 591 | if (TMath::Abs(phi[i]-phi[j]) < 180) |
40b41983 | 592 | fHistSurvivedPhiEtaPlusPlus->Fill(TMath::Abs(phi[i]-phi[j]),TMath::Abs(eta[i]-eta[j])); |
593 | } | |
84164254 | 594 | } |
595 | ||
596 | else if(charge[i] < 0 && charge[j] < 0 ){ | |
40b41983 | 597 | if(level[i] > 0 && level[j] > 0) { |
598 | fHistGeneratedEtaPtMinusMinus->Fill(TMath::Abs(eta[i]-eta[j]),pt[i]); | |
77e61e9e | 599 | if (TMath::Abs(phi[i]-phi[j]) < 180) |
40b41983 | 600 | fHistGeneratedPhiEtaMinusMinus->Fill(TMath::Abs(phi[i]-phi[j]),TMath::Abs(eta[i]-eta[j])); |
601 | } | |
602 | if(level[i] > 1 && level[j] > 1) { | |
603 | fHistReconstructedEtaPtMinusMinus->Fill(TMath::Abs(eta[i]-eta[j]),pt[i]); | |
604 | fHistReconstructedPhiEtaMinusMinus->Fill(TMath::Abs(phi[i]-phi[j]),TMath::Abs(eta[i]-eta[j])); | |
605 | } | |
606 | if(level[i] > 2 && level[j] > 2) { | |
77e61e9e | 607 | fHistSurvivedEtaPtMinusMinus->Fill(TMath::Abs(eta[i]-eta[j]),pt[i]); |
608 | if (TMath::Abs(phi[i]-phi[j]) < 180) | |
40b41983 | 609 | fHistSurvivedPhiEtaMinusMinus->Fill(TMath::Abs(phi[i]-phi[j]),TMath::Abs(eta[i]-eta[j])); |
610 | } | |
84164254 | 611 | } |
40b41983 | 612 | |
84164254 | 613 | else if((charge[i] > 0 && charge[j] < 0)||(charge[i] < 0 && charge[j] > 0)){ |
40b41983 | 614 | if(level[i] > 0 && level[j] > 0) { |
615 | fHistGeneratedEtaPtPlusMinus->Fill(TMath::Abs(eta[i]-eta[j]),pt[i]); | |
77e61e9e | 616 | if (TMath::Abs(phi[i]-phi[j]) < 180) |
40b41983 | 617 | fHistGeneratedPhiEtaPlusMinus->Fill(TMath::Abs(phi[i]-phi[j]),TMath::Abs(eta[i]-eta[j])); |
618 | } | |
619 | if(level[i] > 1 && level[j] > 1) { | |
620 | fHistReconstructedEtaPtPlusMinus->Fill(TMath::Abs(eta[i]-eta[j]),pt[i]); | |
621 | fHistReconstructedPhiEtaPlusMinus->Fill(TMath::Abs(phi[i]-phi[j]),TMath::Abs(eta[i]-eta[j])); | |
622 | } | |
623 | if(level[i] > 2 && level[j] > 2) { | |
624 | fHistSurvivedEtaPtPlusMinus->Fill(TMath::Abs(eta[i]-eta[j]),pt[i]); | |
77e61e9e | 625 | if (TMath::Abs(phi[i]-phi[j]) < 180) |
40b41983 | 626 | fHistSurvivedPhiEtaPlusMinus->Fill(TMath::Abs(phi[i]-phi[j]),TMath::Abs(eta[i]-eta[j])); |
627 | } | |
84164254 | 628 | } |
629 | } | |
40b41983 | 630 | } |
631 | ||
632 | //Checking Entries for generated and survived | |
633 | /*TH1F* GeneratedEtaPt = (TH1F*)fHistGeneratedEtaPtPlusMinus->ProjectionX("GeneratedEtaPt",5,15); | |
634 | Int_t xGeneratedPt = fHistGeneratedEtaPtPlusMinus->GetNbinsX(); | |
635 | for (Int_t h=1; h < xGeneratedPt+1; h++){ | |
636 | Double_t binEntriesGenerated = GeneratedEtaPt->GetBinContent(h); | |
637 | Printf("binEntriesGenerated: %lf - xGeneratedPt: %d",binEntriesGenerated,h); | |
638 | } | |
639 | TH1F* GeneratedPhiEta = (TH1F*)fHistGeneratedPhiEtaPlusMinus->ProjectionY("GeneratedPhiEta",5,15); | |
640 | Int_t yGeneratedPhi = fHistGeneratedPhiEtaPlusMinus->GetNbinsY(); | |
641 | for (Int_t h=1; h < yGeneratedPhi+1; h++){ | |
642 | Double_t binEntriesGenerated = GeneratedPhiEta->GetBinContent(h); | |
643 | Printf("binEntriesGenerated: %lf - yGeneratedPhi: %d",binEntriesGenerated,h); | |
644 | }*/ | |
645 | ||
646 | /*TH1F* SurvivedEtaPt = (TH1F*)fHistSurvivedEtaPtPlusMinus->ProjectionX("SurvivedEtaPt",5,15); | |
647 | Int_t xSurvivedPt = fHistSurvivedEtaPtPlusMinus->GetNbinsX(); | |
648 | for (Int_t h=1; h < xSurvivedPt+1; h++){ | |
649 | Double_t binEntriesSurvived = SurvivedEtaPt->GetBinContent(h); | |
650 | Printf("binEntriesSurvived: %lf - xSurvivedPt: %d",binEntriesSurvived,h); | |
651 | } | |
652 | TH1F* SurvivedPhiEta = (TH1F*)fHistSurvivedPhiEtaPlusMinus->ProjectionY("SurvivedPhiEta",5,15); | |
653 | Int_t ySurvivedPhi = fHistSurvivedPhiEtaPlusMinus->GetNbinsY(); | |
654 | for (Int_t h=1; h < ySurvivedPhi+1; h++){ | |
655 | Double_t binEntriesSurvived = SurvivedPhiEta->GetBinContent(h); | |
656 | Printf("binEntriesSurvived: %lf - ySurvivedPhi: %d",binEntriesSurvived,h); | |
657 | }*/ | |
84164254 | 658 | } |
40b41983 | 659 | //________________________________________________________________________ |
84164254 | 660 | void AliAnalysisTaskEfficiencyBF::Terminate(Option_t *) { |
661 | // Draw result to the screen | |
662 | // Called once at the end of the query | |
663 | ||
664 | fOutputList = dynamic_cast<TList*> (GetOutputData(1)); | |
665 | if (!fOutputList) { | |
666 | printf("ERROR: Output list not available\n"); | |
667 | return; | |
668 | } | |
669 | } | |
670 | ||
671 | //____________________________________________________________________// | |
672 | Bool_t AliAnalysisTaskEfficiencyBF::IsLabelUsed(TArrayI labelArray, Int_t label) { | |
673 | //Checks if the label is used already | |
674 | Bool_t status = kFALSE; | |
675 | for(Int_t i = 0; i < labelArray.GetSize(); i++) { | |
676 | if(labelArray.At(i) == label) | |
677 | status = kTRUE; | |
678 | } | |
679 | ||
680 | return status; | |
681 | } |