]>
Commit | Line | Data |
---|---|---|
ce487a7f | 1 | /************************************************************************** |
2 | * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. * | |
3 | * * | |
4 | * Author: The ALICE Off-line Project. * | |
5 | * Contributors are mentioned in the code where appropriate. * | |
6 | * * | |
7 | * Permission to use, copy, modify and distribute this software and its * | |
8 | * documentation strictly for non-commercial purposes is hereby granted * | |
9 | * without fee, provided that the above copyright notice appears in all * | |
10 | * copies and that both the copyright notice and this permission notice * | |
11 | * appear in the supporting documentation. The authors make no claims * | |
12 | * about the suitability of this software for any purpose. It is * | |
13 | * provided "as is" without express or implied warranty. * | |
14 | **************************************************************************/ | |
15 | // | |
16 | // Container for TRD Threshold parameters stored in the OADB | |
17 | // | |
18 | // Author: Markus Fasel <M.Fasel@gsi.de> | |
19 | // | |
bd58d4b9 | 20 | #include <TList.h> |
ce487a7f | 21 | #include <TMath.h> |
22 | #include <TSortedList.h> | |
23 | ||
24 | #include "AliLog.h" | |
25 | ||
26 | #include "AliTRDPIDParams.h" | |
27 | ||
28 | ClassImp(AliTRDPIDParams) | |
bd58d4b9 | 29 | //ClassImp(AliTRDPIDParams::AliTRDPIDThresholds) |
30 | //ClassImp(AliTRDPIDParams::AliTRDPIDCentrality) | |
ce487a7f | 31 | |
32 | const Double_t AliTRDPIDParams::kVerySmall = 1e-5; | |
33 | ||
34 | //____________________________________________________________ | |
35 | AliTRDPIDParams::AliTRDPIDParams(): | |
36 | TNamed(), | |
37 | fEntries(NULL) | |
38 | { | |
39 | // | |
40 | // Dummy constructor | |
41 | // | |
42 | } | |
43 | ||
44 | //____________________________________________________________ | |
45 | AliTRDPIDParams::AliTRDPIDParams(const char *name) : | |
46 | TNamed(name, ""), | |
47 | fEntries(NULL) | |
48 | { | |
49 | // | |
50 | // Default constructor | |
51 | // | |
bd58d4b9 | 52 | fEntries = new TList; |
ce487a7f | 53 | } |
54 | ||
db0e2c5f | 55 | //____________________________________________________________ |
56 | AliTRDPIDParams::AliTRDPIDParams(const AliTRDPIDParams &ref): | |
57 | TNamed(ref), | |
58 | fEntries(NULL) | |
59 | { | |
60 | // | |
61 | // Copy constructor | |
62 | // | |
63 | ||
bd58d4b9 | 64 | fEntries=(TList*)ref.fEntries->Clone(); |
db0e2c5f | 65 | } |
66 | ||
ce487a7f | 67 | //____________________________________________________________ |
68 | AliTRDPIDParams::~AliTRDPIDParams(){ | |
69 | // | |
70 | // Destructor | |
71 | // | |
72 | delete fEntries; | |
73 | } | |
74 | ||
75 | //____________________________________________________________ | |
bd58d4b9 | 76 | void AliTRDPIDParams::AddCentralityClass(Double_t minCentrality, Double_t maxCentrality){ |
77 | // | |
78 | // Add new centrality class | |
79 | // | |
80 | ||
81 | // check whether centrality class already exists | |
82 | AliTRDPIDCentrality *checklow = FindCentrality(minCentrality + 0.01), | |
83 | *checkhigh = FindCentrality(maxCentrality - 0.01); | |
84 | ||
85 | if(!checklow && ! checkhigh) | |
86 | fEntries->Add(new AliTRDPIDCentrality(minCentrality, maxCentrality)); | |
87 | } | |
88 | ||
89 | //____________________________________________________________ | |
90 | AliTRDPIDParams::AliTRDPIDCentrality *AliTRDPIDParams::FindCentrality(Double_t val) const { | |
91 | // | |
92 | // Find centrality bin | |
93 | // | |
94 | TIter centralities(fEntries); | |
95 | AliTRDPIDCentrality *obj(NULL), *tmp(NULL); | |
96 | while((obj = dynamic_cast<AliTRDPIDCentrality *>(centralities()))){ | |
97 | if(val >= obj->GetMinCentrality() && val <= obj->GetMaxCentrality()){ | |
98 | tmp = obj; | |
99 | break; | |
100 | } | |
101 | } | |
102 | return tmp; | |
103 | } | |
104 | ||
105 | //____________________________________________________________ | |
106 | Bool_t AliTRDPIDParams::GetThresholdParameters(Int_t ntracklets, Double_t efficiency, Double_t *params, Double_t centrality) const{ | |
ce487a7f | 107 | // |
108 | // Retrieve params | |
109 | // Use IsEqual definition | |
110 | // | |
bd58d4b9 | 111 | AliTRDPIDCentrality *cent = FindCentrality(centrality); |
e2c85972 | 112 | if(!cent)cent = FindCentrality(-1);// try default class |
bd58d4b9 | 113 | if(!cent){ |
e2c85972 | 114 | AliDebug(1, "Centrality class not available"); |
115 | return kFALSE; | |
ce487a7f | 116 | } |
e2c85972 | 117 | |
bd58d4b9 | 118 | cent->GetThresholdParameters(ntracklets, efficiency, params); |
ce487a7f | 119 | return kTRUE; |
120 | } | |
121 | ||
122 | //____________________________________________________________ | |
bd58d4b9 | 123 | void AliTRDPIDParams::SetThresholdParameters(Int_t ntracklets, Double_t effMin, Double_t effMax, Double_t *params, Double_t centrality){ |
ce487a7f | 124 | // |
bd58d4b9 | 125 | // Set new threshold parameters |
126 | // | |
127 | AliTRDPIDCentrality *cent = FindCentrality(centrality); | |
128 | if(cent) cent->SetThresholdParameters(ntracklets, effMin, effMax, params); | |
129 | else AliDebug(1, "Centrality class not available"); | |
ce487a7f | 130 | } |
131 | ||
132 | //____________________________________________________________ | |
133 | void AliTRDPIDParams::Print(Option_t *) const { | |
bd58d4b9 | 134 | TIter centIter(fEntries); |
135 | AliTRDPIDCentrality *cent; | |
136 | while((cent = dynamic_cast<AliTRDPIDCentrality *>(centIter()))) cent->Print(NULL); | |
ce487a7f | 137 | } |
138 | ||
139 | //____________________________________________________________ | |
140 | AliTRDPIDParams::AliTRDPIDThresholds::AliTRDPIDThresholds(): | |
141 | TObject(), | |
142 | fNTracklets(0) | |
143 | { | |
144 | // | |
145 | // Default constructor | |
146 | // | |
147 | memset(fParams, 0, sizeof(Double_t) * 4); | |
148 | memset(fEfficiency, 0, sizeof(Double_t) * 2); | |
149 | } | |
150 | ||
151 | //____________________________________________________________ | |
152 | AliTRDPIDParams::AliTRDPIDThresholds::AliTRDPIDThresholds(Int_t nTracklets, Double_t effMin, Double_t effMax, Double_t *params) : | |
153 | TObject(), | |
154 | fNTracklets(nTracklets) | |
155 | { | |
156 | // | |
157 | // Default Constructor | |
158 | // | |
159 | fEfficiency[0] = effMin; | |
160 | fEfficiency[1] = effMax; | |
161 | if(params) memcpy(fParams, params, sizeof(Double_t) * 4); | |
162 | else memset(fParams, 0, sizeof(Double_t) * 4); | |
163 | } | |
164 | ||
165 | //____________________________________________________________ | |
166 | AliTRDPIDParams::AliTRDPIDThresholds::AliTRDPIDThresholds(Int_t nTracklets, Double_t eff, Double_t *params) : | |
167 | TObject(), | |
168 | fNTracklets(nTracklets) | |
169 | { | |
170 | // | |
171 | // Constructor used to find object in sorted list | |
172 | // | |
173 | fEfficiency[0] = fEfficiency[1] = eff; | |
174 | if(params) memcpy(fParams, params, sizeof(Double_t) * 4); | |
175 | else memset(fParams, 0, sizeof(Double_t) * 4); | |
176 | } | |
177 | ||
178 | //____________________________________________________________ | |
179 | AliTRDPIDParams::AliTRDPIDThresholds::AliTRDPIDThresholds(const AliTRDPIDThresholds &ref) : | |
180 | TObject(ref), | |
181 | fNTracklets(ref.fNTracklets) | |
182 | { | |
183 | // | |
184 | // Copy constructor | |
185 | // | |
186 | memcpy(fParams, ref.fParams, sizeof(Double_t) * 4); | |
187 | memcpy(fEfficiency, ref.fEfficiency, sizeof(Double_t) * 2); | |
188 | } | |
189 | ||
190 | //____________________________________________________________ | |
191 | AliTRDPIDParams::AliTRDPIDThresholds &AliTRDPIDParams::AliTRDPIDThresholds::operator=(const AliTRDPIDThresholds &ref){ | |
192 | // | |
193 | // Assignment operator | |
194 | // | |
e99fb5c9 | 195 | if(&ref == this) return *this; |
196 | ||
ce487a7f | 197 | TObject::operator=(ref); |
198 | ||
199 | fNTracklets = ref.fNTracklets; | |
200 | memcpy(fEfficiency, ref.fEfficiency, sizeof(Double_t) * 2); | |
201 | memcpy(fParams, ref.fParams, sizeof(Double_t) * 4); | |
202 | return *this; | |
203 | } | |
204 | ||
205 | //____________________________________________________________ | |
206 | Int_t AliTRDPIDParams::AliTRDPIDThresholds::Compare(const TObject *ref) const{ | |
207 | // | |
208 | // Compares two objects | |
209 | // Order: | |
210 | // First compare number of tracklets, if they are equal compare electron efficiency | |
211 | // | |
212 | const AliTRDPIDThresholds *refObj = static_cast<const AliTRDPIDThresholds *>(ref); | |
213 | if(fNTracklets < refObj->GetNTracklets()) return -1; | |
214 | else if(fNTracklets > refObj->GetNTracklets()) return 1; | |
215 | else{ | |
216 | if(fEfficiency[1] < refObj->GetElectronEfficiency(0)) return -1; | |
217 | else if(fEfficiency[0] > refObj->GetElectronEfficiency(1)) return 1; | |
218 | else return 0; | |
219 | } | |
220 | } | |
221 | ||
222 | //____________________________________________________________ | |
223 | Bool_t AliTRDPIDParams::AliTRDPIDThresholds::IsEqual(const TObject *ref) const { | |
224 | // | |
225 | // Check for equality | |
226 | // Tracklets and Efficiency are used | |
227 | // | |
228 | const AliTRDPIDThresholds *refObj = dynamic_cast<const AliTRDPIDThresholds *>(ref); | |
229 | if(!refObj) return kFALSE; | |
230 | Bool_t eqNTracklets = fNTracklets == refObj->GetNTracklets(); | |
231 | Bool_t eqEff = kFALSE; | |
232 | Bool_t hasRange = TMath::Abs(fEfficiency[1] - fEfficiency[0]) > kVerySmall; | |
233 | Bool_t hasRangeRef = TMath::Abs(refObj->GetElectronEfficiency(1) - refObj->GetElectronEfficiency(0)) > kVerySmall; | |
234 | if(hasRange && hasRangeRef){ | |
235 | // Both have ranges, check if they match | |
236 | eqEff = TMath::Abs(fEfficiency[0] - refObj->GetElectronEfficiency(0)) < kVerySmall && TMath::Abs(fEfficiency[1] - refObj->GetElectronEfficiency(1)) < kVerySmall; | |
237 | } else if(hasRange){ | |
238 | // this object has ranges, check if the efficiency of ref is inside the range | |
239 | eqEff = refObj->GetElectronEfficiency(0) >= fEfficiency[0] && refObj->GetElectronEfficiency(0) < fEfficiency[1]; | |
240 | } else { | |
241 | // ref has ranges, check if this is in range | |
242 | eqEff = fEfficiency[0] >= refObj->GetElectronEfficiency(0) && fEfficiency[0] < refObj->GetElectronEfficiency(1); | |
243 | } | |
244 | ||
245 | return eqNTracklets && eqEff; | |
246 | } | |
bd58d4b9 | 247 | |
248 | //____________________________________________________________ | |
249 | AliTRDPIDParams::AliTRDPIDCentrality::AliTRDPIDCentrality(): | |
250 | fEntries(NULL), | |
251 | fMinCentrality(-1.), | |
252 | fMaxCentrality(-1.) | |
253 | { | |
254 | // | |
255 | // Dummy constructor | |
256 | // | |
257 | } | |
258 | ||
259 | //____________________________________________________________ | |
260 | AliTRDPIDParams::AliTRDPIDCentrality::AliTRDPIDCentrality(Double_t minCentrality, Double_t maxCentrality): | |
261 | fEntries(NULL), | |
262 | fMinCentrality(minCentrality), | |
263 | fMaxCentrality(maxCentrality) | |
264 | { | |
265 | // | |
266 | // Default constructor | |
267 | // | |
268 | fEntries = new TSortedList; | |
269 | fEntries->SetOwner(); | |
270 | } | |
271 | ||
272 | //____________________________________________________________ | |
273 | AliTRDPIDParams::AliTRDPIDCentrality::AliTRDPIDCentrality(const AliTRDPIDParams::AliTRDPIDCentrality &ref): | |
274 | TObject(), | |
275 | fEntries(NULL), | |
276 | fMinCentrality(ref.fMinCentrality), | |
277 | fMaxCentrality(ref.fMaxCentrality) | |
278 | { | |
279 | // | |
280 | // Copy constructor | |
281 | // | |
282 | fEntries = new TSortedList; | |
283 | // Coply entries to the new list | |
284 | TIter entries(ref.fEntries); | |
285 | TObject *o; | |
286 | while((o = entries())) fEntries->Add(o); | |
287 | } | |
288 | ||
289 | //____________________________________________________________ | |
290 | AliTRDPIDParams::AliTRDPIDCentrality &AliTRDPIDParams::AliTRDPIDCentrality::operator=(const AliTRDPIDCentrality &ref){ | |
291 | // | |
292 | // Assignment operator | |
293 | // | |
294 | if(&ref != this){ | |
295 | if(fEntries) delete fEntries; | |
296 | fEntries = new TSortedList; | |
297 | TIter entries(ref.fEntries); | |
298 | TObject *o; | |
299 | while((o = entries())) fEntries->Add(o); | |
300 | fMinCentrality = ref.fMinCentrality; | |
301 | fMaxCentrality = ref.fMaxCentrality; | |
302 | } | |
303 | return *this; | |
304 | } | |
305 | ||
306 | //____________________________________________________________ | |
307 | AliTRDPIDParams::AliTRDPIDCentrality::~AliTRDPIDCentrality(){ | |
308 | // | |
309 | // Destructor | |
310 | // | |
311 | if(fEntries) delete fEntries; | |
312 | } | |
313 | ||
314 | //____________________________________________________________ | |
315 | Bool_t AliTRDPIDParams::AliTRDPIDCentrality::GetThresholdParameters(Int_t ntracklets, Double_t efficiency, Double_t *params) const{ | |
316 | // | |
317 | // Get the threshold parameters | |
318 | // | |
319 | AliTRDPIDThresholds test(ntracklets, efficiency); | |
320 | TObject *result = fEntries->FindObject(&test); | |
321 | if(!result){ | |
322 | AliDebug(1, Form("No threshold params found for %d tracklets and an electron efficiency of %f", ntracklets, efficiency)); | |
323 | return kFALSE; | |
324 | } | |
325 | AliTRDPIDThresholds *parResult = static_cast<AliTRDPIDThresholds *>(result); | |
326 | AliDebug(1, Form("Threshold params found: NTracklets %d, Electron Efficiency %f", parResult->GetNTracklets(), parResult->GetElectronEfficiency())); | |
327 | memcpy(params, parResult->GetThresholdParams(), sizeof(Double_t) * 4); | |
328 | return kTRUE; | |
329 | } | |
330 | ||
331 | //____________________________________________________________ | |
332 | void AliTRDPIDParams::AliTRDPIDCentrality::SetThresholdParameters(Int_t ntracklets, Double_t effMin, Double_t effMax, Double_t *params){ | |
333 | // | |
334 | // Store new Params in the Object | |
335 | // | |
336 | if(effMin > effMax){ | |
337 | AliError("Min. efficiency has to be >= max. efficiency"); | |
338 | return; | |
339 | } | |
340 | AliDebug(1, Form("Save Parameters for %d tracklets at and electron efficiency of [%f|%f]", ntracklets, effMin, effMax)); | |
341 | fEntries->Add(new AliTRDPIDThresholds(ntracklets, effMin, effMax, params)); | |
342 | } | |
343 | ||
344 | //____________________________________________________________ | |
345 | void AliTRDPIDParams::AliTRDPIDCentrality::Print(Option_t *) const { | |
346 | printf("Min. Centrality: %f, Max. Centrality: %f\n", fMinCentrality, fMaxCentrality); | |
347 | printf("Available thresholds:\n"); | |
348 | printf("_________________________________________\n"); | |
349 | TIter objects(fEntries); | |
350 | AliTRDPIDThresholds *par; | |
351 | while((par = dynamic_cast<AliTRDPIDThresholds *>(objects()))){ | |
352 | printf("Number of tracklets %d, Electron efficiency %f\n", par->GetNTracklets(), 0.5*(par->GetElectronEfficiency(0)+par->GetElectronEfficiency(1))); | |
353 | } | |
354 | } | |
355 |