]>
Commit | Line | Data |
---|---|---|
8ec526a4 | 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 | /* $Id$ */ | |
77566f2a | 17 | |
18 | ///////////////////////////////////////////////////////////////////////////////// | |
19 | // | |
20 | // AliTRDCalibra | |
21 | // | |
22 | // This class is for the TRD calibration of the relative gain factor, the drift velocity, | |
23 | // the time 0 and the pad response function. | |
24 | // It can be used for the calibration per chamber but also per group of pads and eventually per pad. | |
25 | // The user has to choose with the functions SetNz and SetNrphi the precision of the calibration. | |
26 | //Begin_Html | |
8ec526a4 | 27 | /* |
28 | <br> | |
29 | <CENTER> | |
30 | <TABLE border=1> | |
31 | <TR><TD><center>Nz</center></TD><TD><center> 0 </center></TD><TD><center> 1 </center></TD><TD><center> 2 </center></TD><TD><center> 3 </center></TD><TD><center> 4 </center></TD></TR> | |
32 | <TR><TD><CENTER>group of row pads per detector</CENTER></TD><TD><CENTER>1</CENTER></TD><TD><CENTER>2</CENTER></TD><TD><CENTER>4</CENTER></TD><TD><CENTER>6(chamb2)<br> 8(others chambers)</CENTER></TD><TD><CENTER>12 (chamb2)<br> 16 (chamb0)</CENTER></TD></TR> | |
33 | <TR><TD><CENTER>row pads per group</CENTER></TD><TD><CENTER>12 (chamb2)<br> 16 (chamb0)</CENTER></TD><TD><CENTER>6 (chamb2)<br> 8 (chamb0)</CENTER></TD><TD><CENTER>3 (chamb2)<br> 4 (chamb0)</CENTER></TD><TD><CENTER>2</CENTER></TD><TD><CENTER>1</CENTER></TD></TR> | |
34 | <TR><TD><CENTER>~distance [cm]</CENTER></TD><TD><CENTER>106 (chamb2)<br> 130 (chamb0)</CENTER></TD><TD><CENTER>53 (chamb2)<br> 65 (chamb0)</CENTER></TD><TD><CENTER>26.5 (chamb2)<br> 32.5 (chamb0)</CENTER></TD><TD><CENTER>17 (chamb2)<br> 17 (chamb0)</CENTER></TD><TD><CENTER>9 (chamb2)<br> 9 (chamb0)</CENTER></TD></TR> | |
35 | <CAPTION>In the z direction</CAPTION> | |
36 | </TABLE> | |
37 | </CENTER> | |
38 | <CENTER> | |
39 | <br> | |
40 | <TABLE border=1> | |
41 | <TR><TD><center>Nrphi</center></TD><TD><center> 0 </center></TD><TD><center> 1 </center></TD><TD><center> 2 </center></TD><TD><center> 3 </center></TD><TD><center> 4 </center></TD><TD><center> 5 </center></TD><TD><center> 6 </center></TD></TR> | |
42 | <TR><TD><CENTER>group of col pads per detector</CENTER></TD><TD><CENTER>1</CENTER></TD><TD><CENTER>2</CENTER></TD><TD><CENTER>4</CENTER></TD><TD><CENTER>8</CENTER></TD><TD><CENTER>16</CENTER></TD><TD><center>36</center></TD><TD><center>144</center></TD></TR> | |
43 | <TR><TD><CENTER>col pads per group</CENTER></TD><TD><CENTER>144</CENTER></TD><TD><CENTER>72</CENTER></TD><TD><CENTER>36</CENTER></TD><TD><CENTER>18</CENTER></TD><TD><CENTER>9</CENTER></TD><TD><center>4</center></TD><TD><center>1</center></TD></TR> | |
44 | <TR><TD><CENTER>~distance [cm]</CENTER></TD><TD><CENTER>113.4</CENTER></TD><TD><CENTER>56.7</CENTER></TD><TD><CENTER>25.3</CENTER></TD><TD><CENTER>14.3</CENTER></TD><TD><CENTER>7.25</CENTER></TD><TD><center>3.2</center></TD><TD><center>0.8</center></TD></TR> | |
45 | <CAPTION>In the rphi direction</CAPTION> | |
46 | </TABLE> | |
47 | </CENTER> | |
48 | <br> | |
49 | */ | |
77566f2a | 50 | //End_Html |
51 | // | |
52 | // Fill histograms or vectors | |
53 | //---------------------------- | |
54 | // | |
55 | // 2D Histograms (Histo2d) or vectors (Vector2d), then converted in Trees, will be filled | |
56 | // from RAW DATA in a run or from reconstructed TRD tracks during the offline tracking | |
57 | // in the function "FollowBackProlongation" (AliTRDtracker) | |
58 | // Per default the functions to fill are off. | |
59 | // | |
60 | //Begin_Html | |
8ec526a4 | 61 | /* |
62 | Example of 2D histos for the relative gain (left) and the drift velocity (right) calibration of the sector 13 <br> | |
63 | <center> | |
64 | <img src="./gif/2dhisto.gif" width="600" height="350"><br> | |
65 | </center> | |
66 | */ | |
77566f2a | 67 | //End_Html |
68 | // | |
69 | // Fit the histograms to find the coefficients | |
70 | //--------------------------------------------- | |
71 | // | |
72 | // These 2D histograms or vectors (first converted in 1D histos) will be fitted | |
73 | // if they have enough entries, otherwise the (default) value of the choosen database | |
74 | // will be put. For the relative gain calibration the resulted factors will be globally | |
75 | // normalized to the gain factors of the choosen database. It unables to precise | |
76 | // previous calibration procedure. | |
77 | // The function SetDebug enables the user to see: | |
78 | // _fDebug = 0: nothing, only the values are written in the tree if wanted | |
79 | // _fDebug = 1: a comparaison of the coefficients found and the default values | |
80 | // in the choosen database. | |
81 | // fCoef , histogram of the coefs as function of the calibration group number | |
82 | // fDelta , histogram of the relative difference of the coef with the default | |
83 | // value in the database as function of the calibration group number | |
84 | // fError , dirstribution of this relative difference | |
85 | // _fDebug = 2: only the fit of the choosen calibration group fFitVoir (SetFitVoir) | |
86 | // _fDebug = 3: The coefficients in the choosen detector fDet (SetDet) as function of the | |
87 | // pad row and col number | |
88 | // _fDebug = 4; The coeffcicients in the choosen detector fDet (SetDet) like in the 3 but with | |
89 | // also the comparaison histograms of the 1 for this detector | |
90 | // | |
91 | //Begin_Html | |
8ec526a4 | 92 | /* |
93 | Example of fCoef for the relative gain calibration of the sector 13 <br> | |
94 | <center> | |
95 | <img src="./gif/coef.gif" width="400" height="460"> | |
96 | </center><br> | |
97 | Example of fDelta (right) and fError (left) for the relative gain calibration of the sector 13 <br> | |
98 | <center> | |
99 | <img src="./gif/detlaerror.gif" width="550" height="380"><br> | |
100 | </center> | |
101 | */ | |
77566f2a | 102 | //End_Html |
8ec526a4 | 103 | // |
77566f2a | 104 | // Author: |
105 | // R. Bailhache (R.Bailhache@gsi.de) | |
106 | // | |
107 | ////////////////////////////////////////////////////////////////////////////////////// | |
108 | ||
8ec526a4 | 109 | #include <TTree.h> |
110 | #include <TLine.h> | |
111 | #include <TH1I.h> | |
112 | #include <TStyle.h> | |
113 | #include <TProfile2D.h> | |
114 | #include <TFile.h> | |
115 | #include <TCanvas.h> | |
116 | #include <TGraphErrors.h> | |
9f4780aa | 117 | #include <TGraph.h> |
8ec526a4 | 118 | #include <TObjArray.h> |
119 | #include <TChain.h> | |
120 | #include <TH1.h> | |
121 | #include <TH1I.h> | |
122 | #include <TH1F.h> | |
123 | #include <TF1.h> | |
124 | #include <TH2F.h> | |
125 | #include <TAxis.h> | |
126 | #include <TStopwatch.h> | |
127 | #include <TMath.h> | |
128 | #include <TLegend.h> | |
129 | #include <TDirectory.h> | |
130 | #include <TROOT.h> | |
131 | ||
132 | #include "AliLog.h" | |
133 | #include "AliCDBManager.h" | |
134 | #include "AliRun.h" | |
135 | #include "AliRunLoader.h" | |
136 | #include "AliLoader.h" | |
137 | #include "AliRawReaderFile.h" | |
138 | #include "AliRawReader.h" | |
77566f2a | 139 | |
140 | #include "AliTRDCalibra.h" | |
8ec526a4 | 141 | #include "AliTRDcalibDB.h" |
142 | #include "AliTRDCommonParam.h" | |
143 | #include "AliTRDmcmTracklet.h" | |
144 | #include "AliTRDpadPlane.h" | |
145 | #include "AliTRDcluster.h" | |
146 | #include "AliTRDtrack.h" | |
147 | #include "AliTRDdigit.h" | |
148 | #include "AliTRDdigitsManager.h" | |
149 | #include "AliTRD.h" | |
150 | #include "AliTRDgeometry.h" | |
151 | #include "./Cal/AliTRDCalROC.h" | |
152 | #include "./Cal/AliTRDCalPad.h" | |
153 | #include "./Cal/AliTRDCalDet.h" | |
154 | #include "AliTRDrawData.h" | |
77566f2a | 155 | |
156 | ClassImp(AliTRDCalibra) | |
157 | ||
158 | AliTRDCalibra* AliTRDCalibra::fgInstance = 0; | |
159 | Bool_t AliTRDCalibra::fgTerminated = kFALSE; | |
160 | ||
161 | //_____________singleton implementation_________________________________________________ | |
8ec526a4 | 162 | AliTRDCalibra *AliTRDCalibra::Instance() |
77566f2a | 163 | { |
164 | // | |
165 | // Singleton implementation | |
166 | // | |
167 | ||
8ec526a4 | 168 | if (fgTerminated != kFALSE) { |
77566f2a | 169 | return 0; |
8ec526a4 | 170 | } |
77566f2a | 171 | |
8ec526a4 | 172 | if (fgInstance == 0) { |
77566f2a | 173 | fgInstance = new AliTRDCalibra(); |
8ec526a4 | 174 | } |
77566f2a | 175 | |
176 | return fgInstance; | |
177 | ||
178 | } | |
179 | ||
180 | //______________________________________________________________________________________ | |
181 | void AliTRDCalibra::Terminate() | |
182 | { | |
183 | // | |
184 | // Singleton implementation | |
185 | // Deletes the instance of this class | |
186 | // | |
187 | ||
188 | fgTerminated = kTRUE; | |
189 | ||
190 | if (fgInstance != 0) { | |
191 | delete fgInstance; | |
192 | fgInstance = 0; | |
193 | } | |
194 | ||
195 | } | |
196 | ||
197 | //______________________________________________________________________________________ | |
198 | AliTRDCalibra::AliTRDCalibra() | |
199 | :TObject() | |
8ec526a4 | 200 | ,fMITracking(kFALSE) |
201 | ,fMcmTracking(kFALSE) | |
202 | ,fMcmCorrectAngle(kFALSE) | |
77566f2a | 203 | ,fCH2dOn(kFALSE) |
204 | ,fPH2dOn(kFALSE) | |
205 | ,fPRF2dOn(kFALSE) | |
206 | ,fHisto2d(kFALSE) | |
207 | ,fVector2d(kFALSE) | |
208 | ,fRelativeScale(0) | |
209 | ,fCountRelativeScale(0) | |
210 | ,fRelativeScaleAuto(kFALSE) | |
8ec526a4 | 211 | ,fThresholdDigit(0) |
77566f2a | 212 | ,fThresholdClusterPRF1(0.0) |
213 | ,fThresholdClusterPRF2(0.0) | |
214 | ,fCenterOfflineCluster(kFALSE) | |
215 | ,fTraMaxPad(kFALSE) | |
216 | ,fWriteNameCoef(0) | |
217 | ,fWriteName(0) | |
218 | ,fFitPHOn(kFALSE) | |
219 | ,fFitPHPeriode(0) | |
220 | ,fBeginFitCharge(0.0) | |
221 | ,fRangeFitPRF(0.0) | |
222 | ,fMeanChargeOn(kFALSE) | |
223 | ,fFitChargeBisOn(kFALSE) | |
224 | ,fT0Shift(0.0) | |
8ec526a4 | 225 | ,fAccCDB(kFALSE) |
226 | ,fNumberFit(0) | |
e5c60cc7 | 227 | ,fNumberEnt(0) |
8ec526a4 | 228 | ,fStatisticMean(0.0) |
77566f2a | 229 | ,fDebug(0) |
230 | ,fFitVoir(0) | |
231 | ,fPRF(0) | |
232 | ,fGain(0) | |
233 | ,fT0(0) | |
234 | ,fVdrift(0) | |
235 | ,fVdriftDetector(0) | |
236 | ,fVdriftPad(0x0) | |
237 | ,fT0Detector(0) | |
238 | ,fT0Pad(0x0) | |
239 | ,fPRFDetector(0) | |
240 | ,fPRFPad(0x0) | |
8ec526a4 | 241 | ,fCoefCH(0x0) |
77566f2a | 242 | ,fDetectorAliTRDtrack(kFALSE) |
243 | ,fChamberAliTRDtrack(-1) | |
8ec526a4 | 244 | ,fDetectorPreviousTrack(-1) |
77566f2a | 245 | ,fGoodTrack(kTRUE) |
8ec526a4 | 246 | ,fAmpTotal(0x0) |
247 | ,fPHPlace(0x0) | |
248 | ,fPHValue(0x0) | |
77566f2a | 249 | ,fNumberClusters(0) |
8ec526a4 | 250 | ,fProcent(0.0) |
251 | ,fDifference(0) | |
252 | ,fNumberTrack(0) | |
9f4780aa | 253 | ,fCoefPRFE(0) |
77566f2a | 254 | ,fCoefPRFDB(0) |
255 | ,fTimeMax(0) | |
256 | ,fSf(0.0) | |
8ec526a4 | 257 | ,fScaleFitFactor(0.0) |
77566f2a | 258 | ,fMinEntries(0) |
259 | ,fEntriesCurrent(0) | |
8ec526a4 | 260 | ,fL3P0(0.0) |
261 | ,fL3P2(0.0) | |
262 | ,fG3P2(0.0) | |
77566f2a | 263 | ,fVectorPH(0) |
264 | ,fPlaPH(0) | |
265 | ,fNumberBinCharge(0) | |
266 | ,fVectorCH(0) | |
267 | ,fPlaCH(0) | |
268 | ,fVectorFitCH(0) | |
269 | ,fNumberBinPRF(0) | |
270 | ,fVectorPRF(0) | |
271 | ,fPlaPRF(0) | |
272 | ,fPH2d(0x0) | |
273 | ,fPRF2d(0x0) | |
274 | ,fCH2d(0x0) | |
275 | ,fRebin(0) | |
276 | { | |
277 | // | |
278 | // Default constructor | |
279 | // | |
280 | ||
281 | for (Int_t i = 0; i < 3; i++) { | |
282 | fNz[i] = 0; | |
283 | fNrphi[i] = 0; | |
284 | } | |
285 | ||
286 | for (Int_t k = 0; k < 3; k++) { | |
287 | fNtotal[k] = 0; | |
8ec526a4 | 288 | fDetChamb2[k] = 0; |
289 | fDetChamb0[k] = 0; | |
77566f2a | 290 | } |
291 | ||
292 | // Write | |
293 | for (Int_t i = 0; i < 3; i++) { | |
294 | fWriteCoef[i] = kFALSE; | |
295 | fWrite[i] = kFALSE; | |
296 | } | |
297 | ||
298 | // Debug Mode | |
299 | for (Int_t k = 0; k < 3; k++) { | |
300 | fDet[k] = 0; | |
301 | } | |
302 | ||
e5c60cc7 | 303 | for (Int_t i = 0; i < 3; i++) { |
77566f2a | 304 | fPhd[i] = 0.0; |
305 | } | |
77566f2a | 306 | |
307 | // Init | |
308 | Init(); | |
309 | ||
310 | } | |
311 | ||
312 | //______________________________________________________________________________________ | |
313 | AliTRDCalibra::AliTRDCalibra(const AliTRDCalibra &c) | |
314 | :TObject(c) | |
8ec526a4 | 315 | ,fMITracking(kFALSE) |
316 | ,fMcmTracking(kFALSE) | |
317 | ,fMcmCorrectAngle(kFALSE) | |
77566f2a | 318 | ,fCH2dOn(kFALSE) |
319 | ,fPH2dOn(kFALSE) | |
320 | ,fPRF2dOn(kFALSE) | |
321 | ,fHisto2d(kFALSE) | |
322 | ,fVector2d(kFALSE) | |
323 | ,fRelativeScale(0) | |
324 | ,fCountRelativeScale(0) | |
325 | ,fRelativeScaleAuto(kFALSE) | |
8ec526a4 | 326 | ,fThresholdDigit(0) |
77566f2a | 327 | ,fThresholdClusterPRF1(0.0) |
328 | ,fThresholdClusterPRF2(0.0) | |
329 | ,fCenterOfflineCluster(kFALSE) | |
330 | ,fTraMaxPad(kFALSE) | |
331 | ,fWriteNameCoef(0) | |
332 | ,fWriteName(0) | |
333 | ,fFitPHOn(kFALSE) | |
334 | ,fFitPHPeriode(0) | |
335 | ,fBeginFitCharge(0.0) | |
336 | ,fRangeFitPRF(0.0) | |
337 | ,fMeanChargeOn(kFALSE) | |
338 | ,fFitChargeBisOn(kFALSE) | |
339 | ,fT0Shift(0.0) | |
8ec526a4 | 340 | ,fAccCDB(kFALSE) |
341 | ,fNumberFit(0) | |
e5c60cc7 | 342 | ,fNumberEnt(0) |
8ec526a4 | 343 | ,fStatisticMean(0.0) |
77566f2a | 344 | ,fDebug(0) |
345 | ,fFitVoir(0) | |
346 | ,fPRF(0) | |
347 | ,fGain(0) | |
348 | ,fT0(0) | |
349 | ,fVdrift(0) | |
350 | ,fVdriftDetector(0) | |
351 | ,fVdriftPad(0x0) | |
352 | ,fT0Detector(0) | |
353 | ,fT0Pad(0x0) | |
354 | ,fPRFDetector(0) | |
355 | ,fPRFPad(0x0) | |
8ec526a4 | 356 | ,fCoefCH(0x0) |
77566f2a | 357 | ,fDetectorAliTRDtrack(kFALSE) |
358 | ,fChamberAliTRDtrack(-1) | |
8ec526a4 | 359 | ,fDetectorPreviousTrack(-1) |
77566f2a | 360 | ,fGoodTrack(kTRUE) |
8ec526a4 | 361 | ,fAmpTotal(0x0) |
362 | ,fPHPlace(0x0) | |
363 | ,fPHValue(0x0) | |
77566f2a | 364 | ,fNumberClusters(0) |
8ec526a4 | 365 | ,fProcent(0.0) |
366 | ,fDifference(0) | |
367 | ,fNumberTrack(0) | |
9f4780aa | 368 | ,fCoefPRFE(0) |
77566f2a | 369 | ,fCoefPRFDB(0) |
370 | ,fTimeMax(0) | |
371 | ,fSf(0.0) | |
8ec526a4 | 372 | ,fScaleFitFactor(0.0) |
77566f2a | 373 | ,fMinEntries(0) |
374 | ,fEntriesCurrent(0) | |
8ec526a4 | 375 | ,fL3P0(0.0) |
376 | ,fL3P2(0.0) | |
377 | ,fG3P2(0.0) | |
77566f2a | 378 | ,fVectorPH(0) |
379 | ,fPlaPH(0) | |
380 | ,fNumberBinCharge(0) | |
381 | ,fVectorCH(0) | |
382 | ,fPlaCH(0) | |
383 | ,fVectorFitCH(0) | |
384 | ,fNumberBinPRF(0) | |
385 | ,fVectorPRF(0) | |
386 | ,fPlaPRF(0) | |
387 | ,fPH2d(0x0) | |
388 | ,fPRF2d(0x0) | |
389 | ,fCH2d(0x0) | |
390 | ,fRebin(0) | |
391 | { | |
392 | // | |
393 | // Copy constructor | |
394 | // | |
395 | ||
396 | } | |
397 | ||
398 | //____________________________________________________________________________________ | |
399 | AliTRDCalibra::~AliTRDCalibra() | |
400 | { | |
401 | // | |
402 | // AliTRDCalibra destructor | |
403 | // | |
404 | ||
405 | ClearHistos(); | |
406 | ClearTree(); | |
77566f2a | 407 | |
408 | } | |
409 | ||
410 | //_____________________________________________________________________________ | |
411 | void AliTRDCalibra::Destroy() | |
412 | { | |
413 | // | |
8ec526a4 | 414 | // Delete instance |
77566f2a | 415 | // |
416 | ||
417 | if (fgInstance) { | |
77566f2a | 418 | delete fgInstance; |
419 | fgInstance = 0x0; | |
420 | } | |
8ec526a4 | 421 | |
77566f2a | 422 | } |
423 | ||
424 | //_____________________________________________________________________________ | |
425 | void AliTRDCalibra::ClearHistos() | |
426 | { | |
427 | // | |
8ec526a4 | 428 | // Delete the histos |
77566f2a | 429 | // |
430 | ||
8ec526a4 | 431 | if (fPH2d) { |
77566f2a | 432 | delete fPH2d; |
8ec526a4 | 433 | fPH2d = 0x0; |
77566f2a | 434 | } |
8ec526a4 | 435 | if (fCH2d) { |
77566f2a | 436 | delete fCH2d; |
8ec526a4 | 437 | fCH2d = 0x0; |
77566f2a | 438 | } |
8ec526a4 | 439 | if (fPRF2d) { |
77566f2a | 440 | delete fPRF2d; |
441 | fPRF2d = 0x0; | |
442 | } | |
443 | ||
444 | } | |
445 | ||
446 | //_____________________________________________________________________________ | |
447 | void AliTRDCalibra::ClearTree() | |
448 | { | |
449 | // | |
8ec526a4 | 450 | // Delete the trees |
77566f2a | 451 | // |
452 | ||
8ec526a4 | 453 | if (fPRF) { |
77566f2a | 454 | delete fPRF; |
8ec526a4 | 455 | fPRF = 0x0; |
77566f2a | 456 | } |
8ec526a4 | 457 | if (fGain) { |
77566f2a | 458 | delete fGain; |
8ec526a4 | 459 | fGain = 0x0; |
77566f2a | 460 | } |
8ec526a4 | 461 | if (fT0) { |
77566f2a | 462 | delete fT0; |
8ec526a4 | 463 | fT0 = 0x0; |
77566f2a | 464 | } |
8ec526a4 | 465 | if (fVdrift) { |
77566f2a | 466 | delete fVdrift; |
467 | fVdrift = 0x0; | |
468 | } | |
469 | ||
470 | } | |
471 | ||
472 | //_____________________________________________________________________________ | |
473 | void AliTRDCalibra::Init() | |
474 | { | |
475 | // | |
476 | // Init some default values | |
477 | // | |
478 | ||
8ec526a4 | 479 | // How to fill the 2D |
480 | fThresholdDigit = 5; | |
77566f2a | 481 | fThresholdClusterPRF1 = 2.0; |
5aba4f09 | 482 | fThresholdClusterPRF2 = 3.0; |
77566f2a | 483 | |
8ec526a4 | 484 | // Store the Info |
485 | fNumberBinCharge = 100; | |
486 | fNumberBinPRF = 20; | |
77566f2a | 487 | |
8ec526a4 | 488 | // Write |
489 | fWriteName = "TRD.calibration.root"; | |
490 | fWriteNameCoef = "TRD.coefficient.root"; | |
491 | ||
492 | // Fit | |
493 | fFitPHPeriode = 1; | |
494 | fBeginFitCharge = 3.5; | |
495 | fRangeFitPRF = 0.5; | |
496 | fMinEntries = 800; | |
497 | fT0Shift = 0.143397; | |
498 | ||
499 | // Internal variables | |
500 | ||
501 | // Fill the 2D histos in the offline tracking | |
502 | fDetectorPreviousTrack = -1; | |
503 | fChamberAliTRDtrack = -1; | |
504 | fGoodTrack = kTRUE; | |
505 | ||
506 | fProcent = 6.0; | |
507 | fDifference = 17; | |
508 | fNumberClusters = 18; | |
509 | fNumberTrack = 0; | |
510 | fNumberUsedCh[0] = 0; | |
511 | fNumberUsedCh[1] = 0; | |
512 | fNumberUsedPh[0] = 0; | |
513 | fNumberUsedPh[1] = 0; | |
514 | ||
515 | // Variables in the loop | |
516 | for (Int_t k = 0; k < 4; k++) { | |
77566f2a | 517 | fChargeCoef[k] = 1.0; |
518 | fVdriftCoef[k] = 1.5; | |
8ec526a4 | 519 | fT0Coef[k] = -1.0; |
77566f2a | 520 | } |
8ec526a4 | 521 | for (Int_t i = 0; i < 2; i++) { |
522 | fPRFCoef[i] = -1.0; | |
77566f2a | 523 | } |
524 | ||
8ec526a4 | 525 | // Pad calibration |
526 | for (Int_t i = 0; i < 3; i++) { | |
527 | fRowMin[i] = -1; | |
528 | fRowMax[i] = -1; | |
529 | fColMax[i] = -1; | |
530 | fColMin[i] = -1; | |
531 | fNnZ[i] = -1; | |
532 | fNnRphi[i] = -1; | |
533 | fNfragZ[i] = -1; | |
534 | fNfragRphi[i] = -1; | |
535 | fXbins[i] = -1; | |
536 | } | |
537 | ||
538 | // Local database to be changed | |
77566f2a | 539 | fRebin = 1; |
540 | ||
541 | } | |
542 | ||
8ec526a4 | 543 | //____________Functions fit Online CH2d________________________________________ |
544 | Bool_t AliTRDCalibra::FitCHOnline(TH2I *ch) | |
77566f2a | 545 | { |
546 | // | |
8ec526a4 | 547 | // Fit the 1D histos, projections of the 2D ch on the Xaxis, for each |
548 | // calibration group normalized the resulted coefficients (to 1 normally) | |
549 | // and write the results in a tree | |
77566f2a | 550 | // |
77566f2a | 551 | |
8ec526a4 | 552 | // Number of Xbins (detectors or groups of pads) |
553 | TAxis *xch = ch->GetXaxis(); | |
554 | Int_t nbins = xch->GetNbins(); | |
555 | TAxis *yph = ch->GetYaxis(); | |
556 | Int_t nybins = yph->GetNbins(); | |
9f4780aa | 557 | if (!InitFit(nbins,0)) { |
77566f2a | 558 | return kFALSE; |
559 | } | |
8ec526a4 | 560 | fStatisticMean = 0.0; |
561 | fNumberFit = 0; | |
e5c60cc7 | 562 | fNumberEnt = 0; |
77566f2a | 563 | |
8ec526a4 | 564 | // For memory |
565 | if (fVectorCH) { | |
566 | fVectorCH->Clear(); | |
567 | } | |
568 | if (fPlaCH) { | |
569 | fPlaCH->Clear(); | |
77566f2a | 570 | } |
77566f2a | 571 | |
8ec526a4 | 572 | // Init fCountDet and fCount |
573 | InitfCountDetAndfCount(0); | |
574 | ||
575 | // Beginning of the loop betwwen dect1 and dect2 | |
576 | for (Int_t idect = fDect1[0]; idect < fDect2[0]; idect++) { | |
77566f2a | 577 | |
8ec526a4 | 578 | TH1I *projch = (TH1I *) ch->ProjectionY("projch",idect+1,idect+1,(Option_t *)"e"); |
77566f2a | 579 | projch->SetDirectory(0); |
580 | ||
8ec526a4 | 581 | // Determination of fNnZ, fNnRphi, fNfragZ and fNfragRphi |
582 | UpdatefCountDetAndfCount(idect,0); | |
77566f2a | 583 | |
8ec526a4 | 584 | // Reconstruction of the row and pad group: rowmin, row max ... |
585 | ReconstructFitRowMinRowMax(idect, 0); | |
77566f2a | 586 | |
8ec526a4 | 587 | // Number of entries for this calibration group |
77566f2a | 588 | Double_t nentries = 0.0; |
8ec526a4 | 589 | for (Int_t k = 0; k < nybins; k++) { |
77566f2a | 590 | nentries += ch->GetBinContent(ch->GetBin(idect+1,k+1)); |
591 | } | |
e5c60cc7 | 592 | if (nentries > 0) { |
593 | fNumberEnt++; | |
594 | } | |
595 | ||
8ec526a4 | 596 | // Rebin and statistic stuff |
597 | // Rebin | |
598 | if (fRebin > 1) { | |
599 | projch = ReBin((TH1I *) projch); | |
600 | } | |
601 | // This detector has not enough statistics or was off | |
602 | if (nentries < fMinEntries) { | |
603 | // Fill with the default infos | |
77566f2a | 604 | NotEnoughStatistic(idect,0); |
8ec526a4 | 605 | // Memory!!! |
606 | if (fDebug != 2) { | |
77566f2a | 607 | delete projch; |
608 | } | |
609 | continue; | |
610 | } | |
611 | ||
8ec526a4 | 612 | // Statistics of the group fitted |
613 | AliInfo(Form("For the group number %d there are %f stats",idect,nentries)); | |
614 | fStatisticMean += nentries; | |
615 | fNumberFit++; | |
77566f2a | 616 | |
8ec526a4 | 617 | // Method Mean and fit |
618 | // idect is egal for fDebug = 0 and 2, only to fill the hist | |
619 | FitCH((TH1 *) projch,(Int_t) (idect-fDect1[0])); | |
620 | // Method fit bis | |
621 | // idect is egal for fDebug = 0 and 2, only to fill the hist | |
622 | if (fFitChargeBisOn) { | |
623 | FitBisCH((TH1 *) projch,(Int_t) (idect-fDect1[0])); | |
77566f2a | 624 | } |
625 | ||
8ec526a4 | 626 | // Visualise the detector for fDebug 3 or 4 |
627 | // Here is the reconstruction of the pad and row group is used! | |
628 | if (fDebug >= 3) { | |
629 | FillCoefChargeDB(); | |
630 | } | |
631 | // Fill Infos Fit | |
77566f2a | 632 | FillInfosFit(idect,0); |
633 | ||
8ec526a4 | 634 | // Memory!!! |
635 | if (fDebug != 2) { | |
77566f2a | 636 | delete projch; |
637 | } | |
638 | ||
8ec526a4 | 639 | } // Boucle object |
77566f2a | 640 | |
8ec526a4 | 641 | // Normierungcharge |
642 | if (fDebug != 2) { | |
643 | NormierungCharge(); | |
644 | } | |
77566f2a | 645 | |
8ec526a4 | 646 | // Plot |
647 | // 0 no plot, 1 and 4 error plot, 3 and 4 DB plot | |
648 | if ((fDebug == 1) || | |
649 | (fDebug == 4)) { | |
9f4780aa | 650 | PlotWriteCH(); |
8ec526a4 | 651 | } |
652 | if ((fDebug == 4) || | |
653 | (fDebug == 3)) { | |
77566f2a | 654 | PlotCHDB(); |
8ec526a4 | 655 | } |
77566f2a | 656 | |
8ec526a4 | 657 | // Mean Statistic |
658 | if (fNumberFit > 0) { | |
659 | AliInfo(Form("There is a mean statistic of: %d",(Int_t) fStatisticMean/fNumberFit)); | |
660 | fStatisticMean = fStatisticMean / fNumberFit; | |
77566f2a | 661 | } |
662 | else { | |
663 | AliInfo("There is no fit!"); | |
664 | } | |
665 | ||
8ec526a4 | 666 | // Write the things! |
77566f2a | 667 | ConvertVectorFitCHTree(); |
8ec526a4 | 668 | if (fWriteCoef[0]) { |
77566f2a | 669 | WriteFitInfos(0); |
670 | } | |
8ec526a4 | 671 | |
77566f2a | 672 | return kTRUE; |
673 | ||
674 | } | |
77566f2a | 675 | |
8ec526a4 | 676 | //____________Functions fit Online CH2d________________________________________ |
77566f2a | 677 | Bool_t AliTRDCalibra::FitCHOnline() |
678 | { | |
679 | // | |
8ec526a4 | 680 | // Reconstruct a 1D histo from the vectorCH for each calibration group, |
681 | // fit the histo, normalized the resulted coefficients (to 1 normally) | |
682 | // and write the results in a tree | |
77566f2a | 683 | // |
684 | ||
8ec526a4 | 685 | // Number of Xbins (detectors or groups of pads) |
9f4780aa | 686 | if (!InitFit(0,0)) { |
77566f2a | 687 | return kFALSE; |
688 | } | |
8ec526a4 | 689 | fStatisticMean = 0.0; |
690 | fNumberFit = 0; | |
e5c60cc7 | 691 | fNumberEnt = 0; |
77566f2a | 692 | |
8ec526a4 | 693 | // Init fCountDet and fCount |
694 | InitfCountDetAndfCount(0); | |
77566f2a | 695 | |
8ec526a4 | 696 | // Beginning of the loop between dect1 and dect2 |
697 | for (Int_t idect = fDect1[0]; idect < fDect2[0]; idect++) { | |
77566f2a | 698 | |
8ec526a4 | 699 | // Search if the group is in the VectorCH |
77566f2a | 700 | Int_t place = SearchInVector(idect,0); |
701 | ||
8ec526a4 | 702 | // Is in |
703 | TH1F *projch = 0x0; | |
77566f2a | 704 | TString name("CH"); |
705 | name += idect; | |
8ec526a4 | 706 | if (place != -1) { |
707 | // Variable | |
708 | AliTRDCTInfo *fCHInfo = new AliTRDCTInfo(); | |
709 | // Retrieve | |
710 | fCHInfo = ((AliTRDCTInfo *) fVectorCH->At(place)); | |
711 | projch = ConvertVectorCTHisto(fCHInfo,(const char *) name); | |
77566f2a | 712 | projch->SetDirectory(0); |
713 | delete fCHInfo; | |
714 | } | |
715 | ||
8ec526a4 | 716 | // Determination of fNnZ, fNnRphi, fNfragZ and fNfragRphi |
717 | UpdatefCountDetAndfCount(idect,0); | |
77566f2a | 718 | |
8ec526a4 | 719 | // Reconstruction of the row and pad group: rowmin, row max ... |
720 | ReconstructFitRowMinRowMax(idect,0); | |
77566f2a | 721 | |
8ec526a4 | 722 | // Number of entries |
77566f2a | 723 | Double_t nentries = 0.0; |
9244c78b | 724 | if (projch) { |
725 | for (Int_t k = 0; k < fNumberBinCharge; k++) { | |
726 | nentries += projch->GetBinContent(k+1); | |
727 | } | |
77566f2a | 728 | } |
e5c60cc7 | 729 | if (nentries > 0) { |
730 | fNumberEnt++; | |
731 | } | |
77566f2a | 732 | |
8ec526a4 | 733 | // Rebin and statistic stuff |
734 | // Rebin | |
735 | if ((fRebin > 1) && | |
736 | (place != -1)) { | |
737 | projch = ReBin((TH1F *) projch); | |
738 | } | |
77566f2a | 739 | |
8ec526a4 | 740 | // This detector has not enough statistics or was not found in VectorCH |
741 | if ((place == -1) || | |
742 | ((place != -1) && | |
743 | (nentries < fMinEntries))) { | |
77566f2a | 744 | |
8ec526a4 | 745 | // Fill with the default infos |
77566f2a | 746 | NotEnoughStatistic(idect,0); |
747 | ||
8ec526a4 | 748 | // Memory!!! |
749 | if (fDebug != 2) { | |
77566f2a | 750 | delete projch; |
751 | } | |
752 | ||
753 | continue; | |
8ec526a4 | 754 | |
77566f2a | 755 | } |
756 | ||
8ec526a4 | 757 | // Statistic of the histos fitted |
758 | AliInfo(Form("For the group number %d there are %f stats",idect,nentries)); | |
759 | fNumberFit++; | |
760 | fStatisticMean += nentries; | |
77566f2a | 761 | |
8ec526a4 | 762 | // Method Mean and fit |
763 | // idect is egal for fDebug = 0 and 2, only to fill the hist | |
764 | FitCH((TH1 *) projch,(Int_t) (idect-fDect1[0])); | |
77566f2a | 765 | |
8ec526a4 | 766 | // Method fit bis |
767 | // idect is egal for fDebug = 0 and 2, only to fill the hist | |
768 | if (fFitChargeBisOn) { | |
769 | FitBisCH((TH1 *) projch,(Int_t) (idect-fDect1[0])); | |
77566f2a | 770 | } |
771 | ||
8ec526a4 | 772 | // Visualise the detector for fDebug 3 or 4 |
773 | // Here is the reconstruction of the pad and row group is used! | |
774 | if (fDebug >= 3) { | |
775 | FillCoefChargeDB(); | |
776 | } | |
77566f2a | 777 | |
8ec526a4 | 778 | // Fill Infos Fit |
77566f2a | 779 | FillInfosFit(idect,0); |
780 | ||
8ec526a4 | 781 | // Memory!!! |
782 | if (fDebug != 2) { | |
77566f2a | 783 | delete projch; |
784 | } | |
77566f2a | 785 | |
8ec526a4 | 786 | } // Boucle object |
77566f2a | 787 | |
8ec526a4 | 788 | // Normierungcharge |
789 | if (fDebug != 2) { | |
790 | NormierungCharge(); | |
791 | } | |
9f4780aa | 792 | |
77566f2a | 793 | |
8ec526a4 | 794 | // Plot |
795 | // 0 no plot, 1 and 4 error plot, 3 and 4 DB plot | |
796 | if ((fDebug == 1) || | |
797 | (fDebug == 4)){ | |
9f4780aa | 798 | PlotWriteCH(); |
77566f2a | 799 | } |
8ec526a4 | 800 | if((fDebug == 4) || |
801 | (fDebug == 3)){ | |
77566f2a | 802 | PlotCHDB(); |
803 | } | |
804 | ||
8ec526a4 | 805 | // Mean Statistics |
806 | if (fNumberFit > 0) { | |
807 | AliInfo(Form("There is a mean statistic of: %d",(Int_t) fStatisticMean / fNumberFit)); | |
808 | fStatisticMean = fStatisticMean / fNumberFit; | |
77566f2a | 809 | } |
810 | else { | |
811 | AliInfo("There is no fit!"); | |
812 | } | |
813 | ||
8ec526a4 | 814 | // Write the things! |
77566f2a | 815 | ConvertVectorFitCHTree(); |
8ec526a4 | 816 | if (fWriteCoef[0]) { |
77566f2a | 817 | WriteFitInfos(0); |
818 | } | |
8ec526a4 | 819 | |
77566f2a | 820 | return kTRUE; |
821 | ||
822 | } | |
77566f2a | 823 | |
8ec526a4 | 824 | //____________Functions fit Online CH2d________________________________________ |
77566f2a | 825 | Bool_t AliTRDCalibra::FitCHOnline(TTree *tree) |
826 | { | |
827 | // | |
8ec526a4 | 828 | // Look if the calibration group can be found in the tree, if yes take the |
829 | // histo, fit it, normalized the resulted coefficients (to 1 normally) and | |
830 | // write the results in a tree | |
77566f2a | 831 | // |
832 | ||
8ec526a4 | 833 | // Number of Xbins (detectors or groups of pads) |
9f4780aa | 834 | if (!InitFit(0,0)) { |
77566f2a | 835 | return kFALSE; |
836 | } | |
8ec526a4 | 837 | fStatisticMean = 0.0; |
838 | fNumberFit = 0; | |
e5c60cc7 | 839 | fNumberEnt = 0; |
77566f2a | 840 | |
8ec526a4 | 841 | // For memory |
842 | if (fVectorCH) { | |
843 | fVectorCH->Clear(); | |
77566f2a | 844 | } |
8ec526a4 | 845 | if (fPlaCH) { |
846 | fPlaCH->Clear(); | |
77566f2a | 847 | } |
8ec526a4 | 848 | |
849 | // Init fCountDet and fCount | |
850 | InitfCountDetAndfCount(0); | |
851 | TH1F *projch = 0x0; | |
77566f2a | 852 | tree->SetBranchAddress("histo",&projch); |
8ec526a4 | 853 | TObjArray *vectorplace = ConvertTreeVector(tree); |
77566f2a | 854 | |
8ec526a4 | 855 | // Beginning of the loop between dect1 and dect2 |
856 | for (Int_t idect = fDect1[0]; idect < fDect2[0]; idect++) { | |
77566f2a | 857 | |
858 | //Search if the group is in the VectorCH | |
859 | Int_t place = SearchInTreeVector(vectorplace,idect); | |
860 | ||
8ec526a4 | 861 | // Is in |
862 | if (place != -1) { | |
863 | // Variable | |
77566f2a | 864 | tree->GetEntry(place); |
865 | } | |
866 | ||
8ec526a4 | 867 | // Determination of fNnZ, fNnRphi, fNfragZ and fNfragRphi |
868 | UpdatefCountDetAndfCount(idect,0); | |
77566f2a | 869 | |
8ec526a4 | 870 | // Reconstruction of the row and pad group: rowmin, row max ... |
871 | ReconstructFitRowMinRowMax(idect,0); | |
77566f2a | 872 | |
8ec526a4 | 873 | // Number of entries |
77566f2a | 874 | Double_t nentries = 0.0; |
9244c78b | 875 | if (projch) { |
876 | for (Int_t k = 0; k < projch->GetXaxis()->GetNbins(); k++) { | |
877 | nentries += projch->GetBinContent(k+1); | |
878 | } | |
e5c60cc7 | 879 | } |
880 | if (nentries > 0) { | |
881 | fNumberEnt++; | |
882 | } | |
9244c78b | 883 | |
8ec526a4 | 884 | // Rebin and statistic stuff |
885 | // Rebin | |
886 | if ((fRebin > 1) && | |
887 | (place != -1)) { | |
888 | projch = ReBin((TH1F *) projch); | |
889 | } | |
890 | ||
891 | // This detector has not enough statistics or was not found in VectorCH | |
892 | if((place == -1) || | |
893 | ((place != -1) && | |
894 | (nentries < fMinEntries))) { | |
77566f2a | 895 | |
8ec526a4 | 896 | // Fill with the default infos |
77566f2a | 897 | NotEnoughStatistic(idect,0); |
898 | ||
899 | continue; | |
8ec526a4 | 900 | |
77566f2a | 901 | } |
902 | ||
8ec526a4 | 903 | // Statistics of the group fitted |
904 | AliInfo(Form("For the group number %d there are %f stats",idect,nentries)); | |
905 | fNumberFit++; | |
906 | fStatisticMean += nentries; | |
77566f2a | 907 | |
8ec526a4 | 908 | // Method Mean and fit |
909 | // idect is egal for fDebug = 0 and 2, only to fill the hist | |
910 | FitCH((TH1 *) projch,(Int_t) (idect-fDect1[0])); | |
77566f2a | 911 | |
8ec526a4 | 912 | // Method fit bis |
913 | // idect is egal for fDebug = 0 and 2, only to fill the hist | |
914 | if (fFitChargeBisOn) { | |
915 | FitBisCH((TH1 *) projch,(Int_t) (idect-fDect1[0])); | |
77566f2a | 916 | } |
77566f2a | 917 | |
8ec526a4 | 918 | // Visualise the detector for fDebug 3 or 4 |
919 | // Here is the reconstruction of the pad and row group is used! | |
920 | if (fDebug >= 3) { | |
921 | FillCoefChargeDB(); | |
922 | } | |
923 | ||
924 | // Fill Infos Fit | |
77566f2a | 925 | FillInfosFit(idect,0); |
77566f2a | 926 | |
8ec526a4 | 927 | } // Boucle object |
77566f2a | 928 | |
8ec526a4 | 929 | // Normierungcharge |
930 | if (fDebug != 2) { | |
931 | NormierungCharge(); | |
932 | } | |
77566f2a | 933 | |
77566f2a | 934 | |
8ec526a4 | 935 | // Plot |
936 | // 0 no plot, 1 and 4 error plot, 3 and 4 DB plot | |
937 | if ((fDebug == 1) || | |
938 | (fDebug == 4)){ | |
9f4780aa | 939 | PlotWriteCH(); |
8ec526a4 | 940 | } |
941 | if ((fDebug == 4) || | |
942 | (fDebug == 3)){ | |
77566f2a | 943 | PlotCHDB(); |
8ec526a4 | 944 | } |
77566f2a | 945 | |
8ec526a4 | 946 | // Mean Statistic |
947 | if (fNumberFit > 0) { | |
948 | AliInfo(Form("There is a mean statistic of: %d",(Int_t) fStatisticMean / fNumberFit)); | |
949 | fStatisticMean = fStatisticMean / fNumberFit; | |
77566f2a | 950 | } |
951 | else { | |
952 | AliInfo("There is no fit!"); | |
953 | } | |
954 | ||
8ec526a4 | 955 | // Write the things! |
77566f2a | 956 | ConvertVectorFitCHTree(); |
8ec526a4 | 957 | if (fWriteCoef[0]) { |
77566f2a | 958 | WriteFitInfos(0); |
959 | } | |
8ec526a4 | 960 | |
77566f2a | 961 | return kTRUE; |
962 | ||
963 | } | |
77566f2a | 964 | |
8ec526a4 | 965 | //________________functions fit Online PH2d____________________________________ |
966 | Bool_t AliTRDCalibra::FitPHOnline(TProfile2D *ph) | |
77566f2a | 967 | { |
968 | // | |
8ec526a4 | 969 | // Take the 1D profiles (average pulse height), projections of the 2D PH |
970 | // on the Xaxis, for each calibration group | |
971 | // Fit or use the slope of the average pulse height to reconstruct the | |
972 | // drift velocity write the results in a tree | |
77566f2a | 973 | // A first calibration of T0 is also made using the same method (slope method) |
974 | // | |
975 | ||
8ec526a4 | 976 | // Number of Xbins (detectors or groups of pads) |
977 | TAxis *xph = ph->GetXaxis(); | |
978 | TAxis *yph = ph->GetYaxis(); | |
979 | Int_t nbins = xph->GetNbins(); | |
980 | Int_t nybins = yph->GetNbins(); | |
9f4780aa | 981 | if (!InitFit(nbins,1)) { |
77566f2a | 982 | return kFALSE; |
983 | } | |
8ec526a4 | 984 | fStatisticMean = 0.0; |
985 | fNumberFit = 0; | |
e5c60cc7 | 986 | fNumberEnt = 0; |
77566f2a | 987 | |
8ec526a4 | 988 | // For memory |
989 | if (fVectorPH) { | |
990 | fVectorPH->Clear(); | |
991 | } | |
992 | if (fPlaPH) { | |
993 | fPlaPH->Clear(); | |
77566f2a | 994 | } |
77566f2a | 995 | |
8ec526a4 | 996 | // Init fCountDet and fCount |
997 | InitfCountDetAndfCount(1); | |
998 | ||
999 | // Beginning of the loop | |
1000 | for (Int_t idect = fDect1[1]; idect < fDect2[1]; idect++) { | |
77566f2a | 1001 | |
8ec526a4 | 1002 | TH1D *projph = (TH1D *) ph->ProjectionY("projph",idect+1,idect+1,(Option_t *) "e"); |
77566f2a | 1003 | projph->SetDirectory(0); |
1004 | ||
8ec526a4 | 1005 | // Number of entries for this calibration group |
77566f2a | 1006 | Double_t nentries = 0; |
8ec526a4 | 1007 | for (Int_t k = 0; k < nybins; k++) { |
1008 | nentries += ph->GetBinEntries(ph->GetBin(idect+1,k+1)); | |
77566f2a | 1009 | } |
e5c60cc7 | 1010 | if (nentries > 0) { |
1011 | fNumberEnt++; | |
1012 | } | |
1013 | ||
8ec526a4 | 1014 | // Determination of fNnZ, fNnRphi, fNfragZ and fNfragRphi |
1015 | UpdatefCountDetAndfCount(idect,1); | |
77566f2a | 1016 | |
8ec526a4 | 1017 | // Reconstruction of the row and pad group: rowmin, row max ... |
1018 | ReconstructFitRowMinRowMax(idect,1); | |
77566f2a | 1019 | |
8ec526a4 | 1020 | // Rebin and statistic stuff |
1021 | // This detector has not enough statistics or was off | |
1022 | if (nentries < fMinEntries) { | |
77566f2a | 1023 | |
8ec526a4 | 1024 | // Fill with the default values |
77566f2a | 1025 | NotEnoughStatistic(idect,1); |
1026 | ||
8ec526a4 | 1027 | // Memory!!! |
1028 | if (fDebug != 2) { | |
77566f2a | 1029 | delete projph; |
1030 | } | |
1031 | ||
1032 | continue; | |
8ec526a4 | 1033 | |
77566f2a | 1034 | } |
1035 | ||
8ec526a4 | 1036 | // Statistics of the histos fitted |
1037 | AliInfo(Form("For the group number %d there are %f stats",idect,nentries)); | |
1038 | fNumberFit++; | |
1039 | fStatisticMean += nentries; | |
77566f2a | 1040 | |
8ec526a4 | 1041 | // Calcul of "real" coef |
1042 | CalculVdriftCoefMean(fCountDet[1],(Int_t) (idect - fDect1[1])); | |
1043 | CalculT0CoefMean(fCountDet[1],(Int_t) (idect - fDect1[1])); | |
77566f2a | 1044 | |
8ec526a4 | 1045 | // Method Mean and fit |
1046 | // idect is egal for fDebug = 0 and 2, only to fill the hist | |
1047 | FitPente((TH1 *) projph,(Int_t) (idect - fDect1[1])); | |
77566f2a | 1048 | |
8ec526a4 | 1049 | // Method fit bis |
1050 | // idect is egal for fDebug = 0 and 2, only to fill the hist | |
1051 | if (fFitPHOn) { | |
1052 | FitPH((TH1 *) projph,(Int_t) (idect - fDect1[1])); | |
77566f2a | 1053 | } |
1054 | ||
8ec526a4 | 1055 | // Visualise the detector for fDebug 3 or 4 |
1056 | // Here is the reconstruction of the pad and row group is used! | |
1057 | if (fDebug >= 3) { | |
77566f2a | 1058 | FillCoefVdriftDB(); |
1059 | FillCoefT0DB(); | |
1060 | } | |
1061 | ||
8ec526a4 | 1062 | // Fill the tree if end of a detector or only the pointer to the branch!!! |
1063 | FillInfosFit(idect,1); | |
77566f2a | 1064 | |
8ec526a4 | 1065 | // Memory!!! |
1066 | if (fDebug != 2) { | |
77566f2a | 1067 | delete projph; |
1068 | } | |
1069 | ||
8ec526a4 | 1070 | } // Boucle object |
77566f2a | 1071 | |
9f4780aa | 1072 | |
8ec526a4 | 1073 | // Plot |
1074 | // 0 no plot, 1 and 4 error plot, 3 and 4 DB plot | |
1075 | if ((fDebug == 1) || | |
1076 | (fDebug == 4)) { | |
9f4780aa | 1077 | PlotWritePH(); |
1078 | PlotWriteT0(); | |
8ec526a4 | 1079 | } |
1080 | if ((fDebug == 4) || | |
1081 | (fDebug == 3)) { | |
77566f2a | 1082 | PlotPHDB(); |
1083 | PlotT0DB(); | |
8ec526a4 | 1084 | } |
77566f2a | 1085 | |
8ec526a4 | 1086 | // Mean Statistic |
1087 | if (fNumberFit > 0) { | |
1088 | AliInfo(Form("There is a mean statistic of: %d",(Int_t) fStatisticMean / fNumberFit)); | |
1089 | fStatisticMean = fStatisticMean / fNumberFit; | |
77566f2a | 1090 | } |
1091 | else { | |
1092 | AliInfo("There is no fit!"); | |
1093 | } | |
1094 | ||
8ec526a4 | 1095 | // Write the things! |
1096 | if(fWriteCoef[1]) { | |
77566f2a | 1097 | WriteFitInfos(1); |
1098 | } | |
8ec526a4 | 1099 | |
77566f2a | 1100 | return kTRUE; |
1101 | ||
1102 | } | |
77566f2a | 1103 | |
8ec526a4 | 1104 | //____________Functions fit Online PH2d________________________________________ |
77566f2a | 1105 | Bool_t AliTRDCalibra::FitPHOnline() |
1106 | { | |
1107 | // | |
8ec526a4 | 1108 | // Reconstruct the average pulse height from the vectorPH for each |
1109 | // calibration group | |
1110 | // Fit or use the slope of the average pulse height to reconstruct the | |
1111 | // drift velocity write the results in a tree | |
77566f2a | 1112 | // A first calibration of T0 is also made using the same method (slope method) |
1113 | // | |
77566f2a | 1114 | |
8ec526a4 | 1115 | // Number of Xbins (detectors or groups of pads) |
9f4780aa | 1116 | if (!InitFit(0,1)) { |
77566f2a | 1117 | return kFALSE; |
1118 | } | |
8ec526a4 | 1119 | fStatisticMean = 0.0; |
1120 | fNumberFit = 0; | |
e5c60cc7 | 1121 | fNumberEnt = 0; |
77566f2a | 1122 | |
8ec526a4 | 1123 | // Init fCountDet and fCount |
1124 | InitfCountDetAndfCount(1); | |
77566f2a | 1125 | |
8ec526a4 | 1126 | // Beginning of the loop |
1127 | for (Int_t idect = fDect1[1]; idect < fDect2[1]; idect++) { | |
77566f2a | 1128 | |
8ec526a4 | 1129 | // Search if the group is in the VectorCH |
77566f2a | 1130 | Int_t place = SearchInVector(idect,1); |
1131 | ||
8ec526a4 | 1132 | // Is in |
1133 | TH1F *projph = 0x0; | |
77566f2a | 1134 | TString name("PH"); |
1135 | name += idect; | |
8ec526a4 | 1136 | if (place != -1) { |
e5c60cc7 | 1137 | //Entries |
1138 | fNumberEnt++; | |
8ec526a4 | 1139 | // Variable |
1140 | AliTRDPInfo *fPHInfo = new AliTRDPInfo(); | |
1141 | // Retrieve | |
1142 | fPHInfo = (AliTRDPInfo *) fVectorPH->At(place); | |
1143 | projph = CorrectTheError((TGraphErrors *) ConvertVectorPHisto(fPHInfo,(const char *) name)); | |
77566f2a | 1144 | projph->SetDirectory(0); |
1145 | delete fPHInfo; | |
1146 | } | |
1147 | ||
8ec526a4 | 1148 | // Determination of fNnZ, fNnRphi, fNfragZ and fNfragRphi |
1149 | UpdatefCountDetAndfCount(idect,1); | |
77566f2a | 1150 | |
8ec526a4 | 1151 | // Reconstruction of the row and pad group: rowmin, row max ... |
1152 | ReconstructFitRowMinRowMax(idect,1); | |
77566f2a | 1153 | |
8ec526a4 | 1154 | // Rebin and statistic stuff |
1155 | // This detector has not enough statistics or was off | |
1156 | if ((place == -1) || | |
1157 | ((place != -1) && | |
1158 | (fEntriesCurrent < fMinEntries))) { | |
77566f2a | 1159 | |
8ec526a4 | 1160 | // Fill with the default values |
77566f2a | 1161 | NotEnoughStatistic(idect,1); |
1162 | ||
8ec526a4 | 1163 | // Memory!!! |
1164 | if (fDebug != 2) { | |
77566f2a | 1165 | delete projph; |
1166 | } | |
8ec526a4 | 1167 | |
77566f2a | 1168 | continue; |
8ec526a4 | 1169 | |
77566f2a | 1170 | } |
1171 | ||
8ec526a4 | 1172 | // Statistic of the histos fitted |
1173 | AliInfo(Form("For the group number %d there are %d stats",idect,fEntriesCurrent)); | |
1174 | fNumberFit++; | |
1175 | fStatisticMean += fEntriesCurrent; | |
77566f2a | 1176 | |
8ec526a4 | 1177 | // Calcul of "real" coef |
1178 | CalculVdriftCoefMean(fCountDet[1],(Int_t) (idect - fDect1[1])); | |
1179 | CalculT0CoefMean(fCountDet[1],(Int_t) (idect - fDect1[1])); | |
77566f2a | 1180 | |
8ec526a4 | 1181 | // Method Mean and fit |
1182 | // idect is egal for fDebug = 0 and 2, only to fill the hist | |
1183 | FitPente((TH1 *) projph,(Int_t) (idect - fDect1[1])); | |
77566f2a | 1184 | |
8ec526a4 | 1185 | // Method fit bis |
1186 | // idect is egal for fDebug = 0 and 2, only to fill the hist | |
1187 | if (fFitPHOn) { | |
1188 | FitPH((TH1 *) projph,(Int_t) (idect - fDect1[1])); | |
77566f2a | 1189 | } |
1190 | ||
8ec526a4 | 1191 | // Visualise the detector for fDebug 3 or 4 |
1192 | // Here is the reconstruction of the pad and row group is used! | |
1193 | if (fDebug >= 3) { | |
77566f2a | 1194 | FillCoefVdriftDB(); |
1195 | FillCoefT0DB(); | |
1196 | } | |
1197 | ||
8ec526a4 | 1198 | // Fill the tree if end of a detector or only the pointer to the branch!!! |
77566f2a | 1199 | FillInfosFit(idect,1); |
1200 | ||
8ec526a4 | 1201 | // Memory!!! |
1202 | if (fDebug != 2) { | |
77566f2a | 1203 | delete projph; |
1204 | } | |
1205 | ||
8ec526a4 | 1206 | } // Boucle object |
77566f2a | 1207 | |
9f4780aa | 1208 | |
8ec526a4 | 1209 | // Plot |
1210 | // 0 no plot, 1 and 4 error plot, 3 and 4 DB plot | |
1211 | if ((fDebug == 1) || | |
1212 | (fDebug == 4)) { | |
9f4780aa | 1213 | PlotWritePH(); |
1214 | PlotWriteT0(); | |
77566f2a | 1215 | } |
8ec526a4 | 1216 | if ((fDebug == 4) || |
1217 | (fDebug == 3)) { | |
77566f2a | 1218 | PlotPHDB(); |
1219 | PlotT0DB(); | |
1220 | } | |
1221 | ||
8ec526a4 | 1222 | // Mean Statistic |
1223 | if (fNumberFit > 0) { | |
1224 | AliInfo(Form("There is a mean statistic of: %d",(Int_t) fStatisticMean / fNumberFit)); | |
1225 | fStatisticMean = fStatisticMean / fNumberFit; | |
77566f2a | 1226 | } |
1227 | else { | |
1228 | AliInfo("There is no fit!"); | |
1229 | } | |
1230 | ||
8ec526a4 | 1231 | // Write the things! |
1232 | if (fWriteCoef[1]) { | |
77566f2a | 1233 | WriteFitInfos(1); |
1234 | } | |
8ec526a4 | 1235 | |
77566f2a | 1236 | return kTRUE; |
1237 | ||
1238 | } | |
1239 | ||
8ec526a4 | 1240 | //____________Functions fit Online PH2d________________________________________ |
77566f2a | 1241 | Bool_t AliTRDCalibra::FitPHOnline(TTree *tree) |
1242 | { | |
1243 | // | |
8ec526a4 | 1244 | // Look if the calibration group can be found in the tree, if yes take the |
1245 | // histo, fit it, and write the results in a tree | |
77566f2a | 1246 | // A first calibration of T0 is also made using the same method (slope method) |
1247 | // | |
77566f2a | 1248 | |
8ec526a4 | 1249 | // Number of Xbins (detectors or groups of pads) |
9f4780aa | 1250 | if (!InitFit(0,1)) { |
77566f2a | 1251 | return kFALSE; |
1252 | } | |
8ec526a4 | 1253 | fStatisticMean = 0.0; |
1254 | fNumberFit = 0; | |
e5c60cc7 | 1255 | fNumberEnt = 0; |
8ec526a4 | 1256 | |
1257 | // For memory | |
1258 | if (fVectorPH) { | |
1259 | fVectorPH->Clear(); | |
77566f2a | 1260 | } |
8ec526a4 | 1261 | if (fPlaPH) { |
1262 | fPlaPH->Clear(); | |
77566f2a | 1263 | } |
1264 | ||
8ec526a4 | 1265 | // Init fCountDet and fCount |
1266 | InitfCountDetAndfCount(1); | |
1267 | TGraphErrors *projphtree = 0x0; | |
77566f2a | 1268 | tree->SetBranchAddress("histo",&projphtree); |
8ec526a4 | 1269 | TObjArray *vectorplace = ConvertTreeVector(tree); |
77566f2a | 1270 | |
8ec526a4 | 1271 | // Beginning of the loop |
1272 | for (Int_t idect = fDect1[1]; idect < fDect2[1]; idect++) { | |
77566f2a | 1273 | |
8ec526a4 | 1274 | // Search if the group is in the VectorCH |
77566f2a | 1275 | Int_t place = SearchInTreeVector(vectorplace,idect); |
1276 | ||
1277 | TH1F *projph = 0x0; | |
8ec526a4 | 1278 | // Is in |
1279 | if (place != -1) { | |
e5c60cc7 | 1280 | //Entries |
1281 | fNumberEnt++; | |
8ec526a4 | 1282 | // Variable |
77566f2a | 1283 | tree->GetEntry(place); |
1284 | projph = CorrectTheError(projphtree); | |
1285 | } | |
1286 | ||
8ec526a4 | 1287 | // Determination of fNnZ, fNnRphi, fNfragZ and fNfragRphi |
1288 | UpdatefCountDetAndfCount(idect,1); | |
77566f2a | 1289 | |
8ec526a4 | 1290 | // Reconstruction of the row and pad group: rowmin, row max ... |
1291 | ReconstructFitRowMinRowMax(idect,1); | |
77566f2a | 1292 | |
8ec526a4 | 1293 | // Rebin and statistic stuff |
1294 | // This detector has not enough statistics or was off | |
1295 | if((place == -1) || | |
1296 | ((place != -1) && | |
1297 | (fEntriesCurrent < fMinEntries))) { | |
77566f2a | 1298 | |
8ec526a4 | 1299 | // Fill with the default values |
77566f2a | 1300 | NotEnoughStatistic(idect,1); |
1301 | ||
8ec526a4 | 1302 | // Memory!!! |
1303 | if (fDebug != 2) { | |
77566f2a | 1304 | delete projph; |
1305 | } | |
1306 | ||
1307 | continue; | |
8ec526a4 | 1308 | |
77566f2a | 1309 | } |
1310 | ||
8ec526a4 | 1311 | // Statistics of the histos fitted |
1312 | AliInfo(Form("For the group number %d there are %d stats",idect,fEntriesCurrent)); | |
1313 | fNumberFit++; | |
1314 | fStatisticMean += fEntriesCurrent; | |
77566f2a | 1315 | |
8ec526a4 | 1316 | // Calcul of "real" coef |
1317 | CalculVdriftCoefMean(fCountDet[1],(Int_t) (idect - fDect1[1])); | |
1318 | CalculT0CoefMean(fCountDet[1],(Int_t) (idect - fDect1[1])); | |
77566f2a | 1319 | |
8ec526a4 | 1320 | // Method Mean and fit |
1321 | // idect is egal for fDebug = 0 and 2, only to fill the hist | |
1322 | FitPente((TH1 *) projph,(Int_t) (idect - fDect1[1])); | |
1323 | // Method fit bis | |
1324 | // idect is egal for fDebug = 0 and 2, only to fill the hist | |
1325 | if (fFitPHOn) { | |
1326 | FitPH((TH1 *) projph,(Int_t) (idect - fDect1[1])); | |
77566f2a | 1327 | } |
1328 | ||
8ec526a4 | 1329 | // Visualise the detector for fDebug 3 or 4 |
1330 | // Here is the reconstruction of the pad and row group is used! | |
1331 | if (fDebug >= 3) { | |
77566f2a | 1332 | FillCoefVdriftDB(); |
1333 | FillCoefT0DB(); | |
1334 | } | |
1335 | ||
8ec526a4 | 1336 | // Fill the tree if end of a detector or only the pointer to the branch!!! |
77566f2a | 1337 | FillInfosFit(idect,1); |
77566f2a | 1338 | |
8ec526a4 | 1339 | // Memory!!! |
1340 | if (fDebug != 2) { | |
77566f2a | 1341 | delete projph; |
1342 | } | |
77566f2a | 1343 | |
8ec526a4 | 1344 | } // Boucle object |
77566f2a | 1345 | |
8ec526a4 | 1346 | // Plot |
1347 | // 0 no plot, 1 and 4 error plot, 3 and 4 DB plot | |
1348 | if ((fDebug == 1) || | |
1349 | (fDebug == 4)){ | |
9f4780aa | 1350 | PlotWritePH(); |
1351 | PlotWriteT0(); | |
77566f2a | 1352 | } |
8ec526a4 | 1353 | if ((fDebug == 4) || |
1354 | (fDebug == 3)){ | |
77566f2a | 1355 | PlotPHDB(); |
1356 | PlotT0DB(); | |
1357 | } | |
1358 | ||
8ec526a4 | 1359 | // Mean Statistics |
1360 | if (fNumberFit > 0) { | |
1361 | AliInfo(Form("There is a mean statistic of: %d",(Int_t) fStatisticMean / fNumberFit)); | |
1362 | fStatisticMean = fStatisticMean / fNumberFit; | |
77566f2a | 1363 | } |
1364 | else { | |
1365 | AliInfo("There is no fit!"); | |
1366 | } | |
1367 | ||
8ec526a4 | 1368 | // Write the things! |
1369 | if (fWriteCoef[1]) { | |
77566f2a | 1370 | WriteFitInfos(1); |
1371 | } | |
8ec526a4 | 1372 | |
77566f2a | 1373 | return kTRUE; |
1374 | ||
1375 | } | |
77566f2a | 1376 | |
8ec526a4 | 1377 | //____________Functions fit Online PRF2d_______________________________________ |
1378 | Bool_t AliTRDCalibra::FitPRFOnline(TProfile2D *prf) | |
77566f2a | 1379 | { |
1380 | // | |
8ec526a4 | 1381 | // Take the 1D profiles (pad response function), projections of the 2D PRF |
1382 | // on the Xaxis, for each calibration group | |
1383 | // Fit with a gaussian to reconstruct the sigma of the pad response function | |
1384 | // write the results in a tree | |
77566f2a | 1385 | // |
1386 | ||
8ec526a4 | 1387 | // Number of Xbins (detectors or groups of pads) |
1388 | TAxis *xprf = prf->GetXaxis(); | |
1389 | TAxis *yprf = prf->GetYaxis(); | |
1390 | Int_t nybins = yprf->GetNbins(); | |
1391 | Int_t nbins = xprf->GetNbins(); | |
9f4780aa | 1392 | if (!InitFit(nbins,2)) { |
77566f2a | 1393 | return kFALSE; |
1394 | } | |
8ec526a4 | 1395 | fStatisticMean = 0.0; |
1396 | fNumberFit = 0; | |
e5c60cc7 | 1397 | fNumberEnt = 0; |
77566f2a | 1398 | |
8ec526a4 | 1399 | // For memory |
1400 | if (fVectorPRF) { | |
1401 | fVectorPRF->Clear(); | |
1402 | } | |
1403 | if (fPlaPRF) { | |
1404 | fPlaPRF->Clear(); | |
77566f2a | 1405 | } |
77566f2a | 1406 | |
8ec526a4 | 1407 | // Init fCountDet and fCount |
1408 | InitfCountDetAndfCount(2); | |
77566f2a | 1409 | |
8ec526a4 | 1410 | // Beginning of the loop |
1411 | for (Int_t idect = fDect1[2]; idect < fDect2[2]; idect++) { | |
77566f2a | 1412 | |
8ec526a4 | 1413 | TH1D *projprf = (TH1D *) prf->ProjectionY("projprf",idect+1,idect+1,(Option_t *) "e"); |
77566f2a | 1414 | projprf->SetDirectory(0); |
1415 | ||
8ec526a4 | 1416 | // Number of entries for this calibration group |
77566f2a | 1417 | Double_t nentries = 0; |
8ec526a4 | 1418 | for (Int_t k = 0; k < nybins; k++) { |
1419 | nentries += prf->GetBinEntries(prf->GetBin(idect+1,k+1)); | |
77566f2a | 1420 | } |
e5c60cc7 | 1421 | if(nentries > 0) fNumberEnt++; |
77566f2a | 1422 | |
8ec526a4 | 1423 | // Determination of fNnZ, fNnRphi, fNfragZ and fNfragRphi |
1424 | UpdatefCountDetAndfCount(idect,2); | |
77566f2a | 1425 | |
8ec526a4 | 1426 | // Reconstruction of the row and pad group: rowmin, row max ... |
1427 | ReconstructFitRowMinRowMax(idect,2); | |
77566f2a | 1428 | |
8ec526a4 | 1429 | // Rebin and statistic stuff |
1430 | // This detector has not enough statistics or was off | |
1431 | if (nentries < fMinEntries) { | |
77566f2a | 1432 | |
8ec526a4 | 1433 | // Fill with the default values |
77566f2a | 1434 | NotEnoughStatistic(idect,2); |
1435 | ||
8ec526a4 | 1436 | // Memory! |
1437 | if (fDebug != 2) { | |
77566f2a | 1438 | delete projprf; |
1439 | } | |
1440 | ||
1441 | continue; | |
8ec526a4 | 1442 | |
77566f2a | 1443 | } |
1444 | ||
8ec526a4 | 1445 | // Statistics of the histos fitted |
1446 | AliInfo(Form("For the group number %d there are %f stats",idect,nentries)); | |
1447 | fNumberFit++; | |
1448 | fStatisticMean += nentries; | |
77566f2a | 1449 | |
8ec526a4 | 1450 | // Calcul of "real" coef |
1451 | if ((fDebug == 1) || | |
1452 | (fDebug == 4)) { | |
1453 | CalculPRFCoefMean(fCountDet[2],(Int_t) (idect - fDect1[2])); | |
77566f2a | 1454 | } |
1455 | ||
8ec526a4 | 1456 | // Method Mean and fit |
1457 | // idect is egal for fDebug = 0 and 2, only to fill the hist | |
1458 | FitPRF((TH1 *) projprf,(Int_t) (idect - fDect1[2])); | |
77566f2a | 1459 | |
8ec526a4 | 1460 | // Visualise the detector for fDebug 3 or 4 |
1461 | // Here is the reconstruction of the pad and row group is used! | |
1462 | if (fDebug >= 3) { | |
1463 | FillCoefPRFDB(); | |
1464 | } | |
77566f2a | 1465 | |
8ec526a4 | 1466 | // Fill the tree if end of a detector or only the pointer to the branch!!! |
77566f2a | 1467 | FillInfosFit(idect,2); |
1468 | ||
8ec526a4 | 1469 | // Memory!!! |
1470 | if (fDebug != 2) { | |
77566f2a | 1471 | delete projprf; |
1472 | } | |
1473 | ||
8ec526a4 | 1474 | } // Boucle object |
77566f2a | 1475 | |
8ec526a4 | 1476 | // Plot |
1477 | // No plot, 1 and 4 error plot, 3 and 4 DB plot | |
1478 | if ((fDebug == 1) || | |
1479 | (fDebug == 4)) { | |
9f4780aa | 1480 | PlotWritePRF(); |
8ec526a4 | 1481 | } |
1482 | if ((fDebug == 4) || | |
1483 | (fDebug == 3)){ | |
77566f2a | 1484 | PlotPRFDB(); |
8ec526a4 | 1485 | } |
77566f2a | 1486 | |
8ec526a4 | 1487 | // Mean Statistic |
1488 | if (fNumberFit > 0) { | |
1489 | AliInfo(Form("There is a mean statistic of: %d",(Int_t) fStatisticMean / fNumberFit)); | |
1490 | fStatisticMean = fStatisticMean / fNumberFit; | |
77566f2a | 1491 | } |
1492 | else { | |
1493 | AliInfo("There is no fit!"); | |
1494 | } | |
1495 | ||
8ec526a4 | 1496 | // Write the things! |
1497 | if (fWriteCoef[2]) { | |
77566f2a | 1498 | WriteFitInfos(2); |
1499 | } | |
8ec526a4 | 1500 | |
77566f2a | 1501 | return kTRUE; |
1502 | ||
1503 | } | |
77566f2a | 1504 | |
8ec526a4 | 1505 | //____________Functions fit Online PRF2d_______________________________________ |
77566f2a | 1506 | Bool_t AliTRDCalibra::FitPRFOnline(TTree *tree) |
1507 | { | |
1508 | // | |
8ec526a4 | 1509 | // Look if the calibration group can be found in the tree, if yes take |
1510 | // the histo, fit it, and write the results in a tree | |
77566f2a | 1511 | // |
1512 | ||
8ec526a4 | 1513 | // Number of Xbins (detectors or groups of pads) |
9f4780aa | 1514 | if (!InitFit(0,2)) { |
77566f2a | 1515 | return kFALSE; |
1516 | } | |
8ec526a4 | 1517 | fStatisticMean = 0.0; |
1518 | fNumberFit = 0; | |
e5c60cc7 | 1519 | fNumberEnt = 0; |
77566f2a | 1520 | |
8ec526a4 | 1521 | // For memory |
1522 | if (fVectorPRF) { | |
1523 | fVectorPRF->Clear(); | |
1524 | } | |
1525 | if (fPlaPRF) { | |
1526 | fPlaPRF->Clear(); | |
77566f2a | 1527 | } |
1528 | ||
8ec526a4 | 1529 | // Init fCountDet and fCount |
1530 | InitfCountDetAndfCount(2); | |
1531 | TGraphErrors *projprftree = 0x0; | |
77566f2a | 1532 | tree->SetBranchAddress("histo",&projprftree); |
8ec526a4 | 1533 | TObjArray *vectorplace = ConvertTreeVector(tree); |
77566f2a | 1534 | |
8ec526a4 | 1535 | // Beginning of the loop |
1536 | for (Int_t idect = fDect1[2]; idect < fDect2[2]; idect++) { | |
77566f2a | 1537 | |
8ec526a4 | 1538 | // Search if the group is in the VectorCH |
77566f2a | 1539 | Int_t place = SearchInTreeVector(vectorplace,idect); |
1540 | ||
8ec526a4 | 1541 | // Is in |
77566f2a | 1542 | TH1F *projprf = 0x0; |
8ec526a4 | 1543 | if (place != -1) { |
e5c60cc7 | 1544 | //Entries |
1545 | fNumberEnt++; | |
8ec526a4 | 1546 | // Variable |
77566f2a | 1547 | tree->GetEntry(place); |
1548 | projprf = CorrectTheError(projprftree); | |
1549 | } | |
1550 | ||
8ec526a4 | 1551 | // Determination of fNnZ, fNnRphi, fNfragZ and fNfragRphi |
1552 | UpdatefCountDetAndfCount(idect,2); | |
77566f2a | 1553 | |
8ec526a4 | 1554 | // Reconstruction of the row and pad group: rowmin, row max ... |
1555 | ReconstructFitRowMinRowMax(idect,2); | |
77566f2a | 1556 | |
8ec526a4 | 1557 | // Rebin and statistic stuff |
1558 | // This detector has not enough statistics or was off | |
1559 | if ((place == -1) || | |
1560 | ((place != -1) && | |
1561 | (fEntriesCurrent < fMinEntries))) { | |
77566f2a | 1562 | |
8ec526a4 | 1563 | // Fill with the default values |
77566f2a | 1564 | NotEnoughStatistic(idect,2); |
1565 | ||
8ec526a4 | 1566 | // Memory!!! |
1567 | if (fDebug != 2) { | |
77566f2a | 1568 | delete projprf; |
1569 | } | |
1570 | ||
1571 | continue; | |
8ec526a4 | 1572 | |
77566f2a | 1573 | } |
1574 | ||
8ec526a4 | 1575 | // Statistics of the histos fitted |
1576 | AliInfo(Form("For the group number %d there are %d stats",idect,fEntriesCurrent)); | |
1577 | fNumberFit++; | |
1578 | fStatisticMean += fEntriesCurrent; | |
77566f2a | 1579 | |
8ec526a4 | 1580 | // Calcul of "real" coef |
1581 | if ((fDebug == 1) || | |
1582 | (fDebug == 4)){ | |
1583 | CalculPRFCoefMean(fCountDet[2],(Int_t) (idect - fDect1[2])); | |
1584 | } | |
1585 | ||
1586 | // Method Mean and fit | |
1587 | // idect is egal for fDebug = 0 and 2, only to fill the hist | |
1588 | FitPRF((TH1 *) projprf,(Int_t) (idect - fDect1[2])); | |
1589 | // Visualise the detector for fDebug 3 or 4 | |
1590 | // Here is the reconstruction of the pad and row group is used! | |
1591 | if (fDebug >= 3) { | |
1592 | FillCoefPRFDB(); | |
77566f2a | 1593 | } |
8ec526a4 | 1594 | // Fill the tree if end of a detector or only the pointer to the branch!!! |
77566f2a | 1595 | FillInfosFit(idect,2); |
77566f2a | 1596 | |
8ec526a4 | 1597 | // Memory!!! |
1598 | if (fDebug != 2) { | |
77566f2a | 1599 | delete projprf; |
1600 | } | |
1601 | ||
8ec526a4 | 1602 | } // Boucle object |
77566f2a | 1603 | |
8ec526a4 | 1604 | // Plot |
1605 | // No plot, 1 and 4 error plot, 3 and 4 DB plot | |
1606 | if ((fDebug == 1) || | |
1607 | (fDebug == 4)){ | |
9f4780aa | 1608 | PlotWritePRF(); |
77566f2a | 1609 | } |
8ec526a4 | 1610 | if ((fDebug == 4) || |
1611 | (fDebug == 3)){ | |
77566f2a | 1612 | PlotPRFDB(); |
1613 | } | |
1614 | ||
8ec526a4 | 1615 | // Mean Statistics |
1616 | if (fNumberFit > 0) { | |
1617 | AliInfo(Form("There is a mean statistic of: %d",(Int_t) fStatisticMean / fNumberFit)); | |
1618 | fStatisticMean = fStatisticMean / fNumberFit; | |
77566f2a | 1619 | } |
1620 | else { | |
1621 | AliInfo("There is no fit!"); | |
1622 | } | |
1623 | ||
8ec526a4 | 1624 | // Write the things! |
1625 | if (fWriteCoef[2]) { | |
77566f2a | 1626 | WriteFitInfos(2); |
1627 | } | |
8ec526a4 | 1628 | |
77566f2a | 1629 | return kTRUE; |
1630 | ||
1631 | } | |
77566f2a | 1632 | |
8ec526a4 | 1633 | //____________Functions fit Online PRF2d_______________________________________ |
77566f2a | 1634 | Bool_t AliTRDCalibra::FitPRFOnline() |
1635 | { | |
1636 | // | |
8ec526a4 | 1637 | // Reconstruct the 1D histo (pad response function) from the vectorPRD for |
1638 | // each calibration group | |
1639 | // Fit with a gaussian to reconstruct the sigma of the pad response function | |
1640 | // write the results in a tree | |
77566f2a | 1641 | // |
1642 | ||
8ec526a4 | 1643 | // Number of Xbins (detectors or groups of pads) |
9f4780aa | 1644 | if (!InitFit(0,2)) { |
77566f2a | 1645 | return kFALSE; |
1646 | } | |
8ec526a4 | 1647 | fStatisticMean = 0.0; |
1648 | fNumberFit = 0; | |
e5c60cc7 | 1649 | fNumberEnt = 0; |
77566f2a | 1650 | |
8ec526a4 | 1651 | // Init fCountDet and fCount |
1652 | InitfCountDetAndfCount(2); | |
77566f2a | 1653 | |
8ec526a4 | 1654 | // Beginning of the loop |
1655 | for (Int_t idect = fDect1[2]; idect < fDect2[2]; idect++) { | |
77566f2a | 1656 | |
8ec526a4 | 1657 | // Search if the group is in the VectorCH |
77566f2a | 1658 | Int_t place = SearchInVector(idect,2); |
1659 | ||
8ec526a4 | 1660 | // Is in |
1661 | TH1F *projprf = 0x0; | |
77566f2a | 1662 | TString name("PRF"); |
1663 | name += idect; | |
8ec526a4 | 1664 | if (place != -1) { |
e5c60cc7 | 1665 | //Entries |
1666 | fNumberEnt++; | |
8ec526a4 | 1667 | // Variable |
1668 | AliTRDPInfo *fPRFInfo = new AliTRDPInfo(); | |
1669 | // Retrieve | |
1670 | fPRFInfo = (AliTRDPInfo *) fVectorPRF->At(place); | |
1671 | projprf = CorrectTheError((TGraphErrors *) ConvertVectorPHisto(fPRFInfo,(const char *)name)); | |
77566f2a | 1672 | projprf->SetDirectory(0); |
1673 | delete fPRFInfo; | |
1674 | } | |
1675 | ||
8ec526a4 | 1676 | // Determination of fNnZ, fNnRphi, fNfragZ and fNfragRphi |
1677 | UpdatefCountDetAndfCount(idect,2); | |
77566f2a | 1678 | |
8ec526a4 | 1679 | // Reconstruction of the row and pad group: rowmin, row max ... |
1680 | ReconstructFitRowMinRowMax(idect,2); | |
77566f2a | 1681 | |
8ec526a4 | 1682 | // Rebin and statistic stuff |
1683 | // This detector has not enough statistics or was off | |
1684 | if ((place == -1) || | |
1685 | ((place != -1) && | |
1686 | (fEntriesCurrent < fMinEntries))) { | |
77566f2a | 1687 | |
8ec526a4 | 1688 | // Fill with the default values |
77566f2a | 1689 | NotEnoughStatistic(idect,2); |
1690 | ||
8ec526a4 | 1691 | // Memory |
1692 | if (fDebug != 2) { | |
77566f2a | 1693 | delete projprf; |
1694 | } | |
77566f2a | 1695 | |
1696 | continue; | |
77566f2a | 1697 | |
8ec526a4 | 1698 | } |
77566f2a | 1699 | |
8ec526a4 | 1700 | // Statistic of the histos fitted |
1701 | AliInfo(Form("For the group number %d there are %d stats", idect,fEntriesCurrent)); | |
1702 | fNumberFit++; | |
1703 | fStatisticMean += fEntriesCurrent; | |
77566f2a | 1704 | |
8ec526a4 | 1705 | // Calcul of "real" coef |
1706 | if ((fDebug == 1) || | |
1707 | (fDebug == 4)) { | |
1708 | CalculPRFCoefMean(fCountDet[2],(Int_t) (idect-fDect1[2])); | |
1709 | } | |
77566f2a | 1710 | |
8ec526a4 | 1711 | // Method Mean and fit |
1712 | // idect is egal for fDebug = 0 and 2, only to fill the hist | |
1713 | FitPRF((TH1 *) projprf,(Int_t) (idect-fDect1[2])); | |
1714 | // Visualise the detector for fDebug 3 or 4 | |
1715 | // Here is the reconstruction of the pad and row group is used! | |
1716 | if (fDebug >= 3) { | |
1717 | FillCoefPRFDB(); | |
77566f2a | 1718 | } |
8ec526a4 | 1719 | // Fill the tree if end of a detector or only the pointer to the branch!!! |
77566f2a | 1720 | FillInfosFit(idect,2); |
1721 | ||
8ec526a4 | 1722 | // Memory!!! |
1723 | if (fDebug != 2) { | |
77566f2a | 1724 | delete projprf; |
1725 | } | |
1726 | ||
8ec526a4 | 1727 | } // Boucle object |
77566f2a | 1728 | |
8ec526a4 | 1729 | // Plot |
1730 | // No plot, 1 and 4 error plot, 3 and 4 DB plot | |
1731 | if ((fDebug == 1) || | |
1732 | (fDebug == 4)) { | |
9f4780aa | 1733 | PlotWritePRF(); |
8ec526a4 | 1734 | } |
1735 | if ((fDebug == 4) || | |
1736 | (fDebug == 3)) { | |
77566f2a | 1737 | PlotPRFDB(); |
8ec526a4 | 1738 | } |
77566f2a | 1739 | |
8ec526a4 | 1740 | // Mean Statistics |
1741 | if (fNumberFit > 0) { | |
1742 | AliInfo(Form("There is a mean statistic of: %d",(Int_t) fStatisticMean / fNumberFit)); | |
77566f2a | 1743 | } |
1744 | else { | |
1745 | AliInfo("There is no fit!"); | |
1746 | } | |
1747 | ||
8ec526a4 | 1748 | // Write the things! |
1749 | if (fWriteCoef[2]) { | |
77566f2a | 1750 | WriteFitInfos(2); |
1751 | } | |
8ec526a4 | 1752 | |
77566f2a | 1753 | return kTRUE; |
1754 | ||
1755 | } | |
1756 | ||
8ec526a4 | 1757 | //____________Functions for initialising the AliTRDCalibra in the code_________ |
77566f2a | 1758 | Bool_t AliTRDCalibra::Init2Dhistos() |
1759 | { | |
8ec526a4 | 1760 | // |
1761 | // For the offline tracking | |
1762 | // This function will be called in the function AliReconstruction::Run() | |
1763 | // Init the calibration mode (Nz, Nrphi), the 2D histograms if fHisto2d = kTRUE, | |
1764 | // | |
77566f2a | 1765 | |
8ec526a4 | 1766 | // DB Setting |
1767 | // Get cal | |
9f4780aa | 1768 | AliTRDcalibDB *cal = AliTRDcalibDB::Instance(); |
77566f2a | 1769 | if (!cal) { |
1770 | AliInfo("Could not get calibDB"); | |
1771 | return kFALSE; | |
1772 | } | |
b43a3e17 | 1773 | AliTRDCommonParam *parCom = AliTRDCommonParam::Instance(); |
1774 | if (!parCom) { | |
1775 | AliInfo("Could not get CommonParam"); | |
1776 | return kFALSE; | |
1777 | } | |
77566f2a | 1778 | |
77566f2a | 1779 | // Some parameters |
8ec526a4 | 1780 | fTimeMax = cal->GetNumberOfTimeBins(); |
b43a3e17 | 1781 | fSf = parCom->GetSamplingFrequency(); |
8ec526a4 | 1782 | if (fRelativeScaleAuto) { |
1783 | fRelativeScale = 0; | |
1784 | } | |
1785 | else { | |
1786 | fRelativeScale = 20; | |
1787 | } | |
77566f2a | 1788 | |
8ec526a4 | 1789 | // Create the 2D histos corresponding to the pad groupCalibration mode |
1790 | if (fCH2dOn) { | |
77566f2a | 1791 | |
8ec526a4 | 1792 | AliInfo(Form("The pad calibration mode for the relative gain calibration: Nz %d, and Nrphi %d" |
1793 | ,fNz[0] | |
1794 | ,fNrphi[0])); | |
77566f2a | 1795 | |
8ec526a4 | 1796 | // Calcul the number of Xbins |
77566f2a | 1797 | fNtotal[0] = 0; |
1798 | ModePadCalibration(2,0); | |
1799 | ModePadFragmentation(0,2,0,0); | |
8ec526a4 | 1800 | fDetChamb2[0] = fNfragZ[0] * fNfragRphi[0]; |
1801 | if (fDebug == 4) { | |
1802 | AliInfo(Form("For the chamber 2: %d",fDetChamb2[0])); | |
77566f2a | 1803 | } |
8ec526a4 | 1804 | fNtotal[0] += 6 * 18 * fDetChamb2[0]; |
77566f2a | 1805 | ModePadCalibration(0,0); |
1806 | ModePadFragmentation(0,0,0,0); | |
8ec526a4 | 1807 | fDetChamb0[0] = fNfragZ[0] * fNfragRphi[0]; |
1808 | if (fDebug == 4) { | |
1809 | AliInfo(Form("For the other chamber 0: %d",fDetChamb0[0])); | |
77566f2a | 1810 | } |
8ec526a4 | 1811 | fNtotal[0] += 6 * 4 * 18 * fDetChamb0[0]; |
1812 | AliInfo(Form("Total number of Xbins: %d",fNtotal[0])); | |
77566f2a | 1813 | |
8ec526a4 | 1814 | // Create the 2D histo |
1815 | if (fHisto2d) { | |
1816 | CreateCH2d(fNtotal[0]); | |
1817 | } | |
1818 | if (fVector2d) { | |
1819 | fVectorCH = new TObjArray(); | |
1820 | fPlaCH = new TObjArray(); | |
1821 | } | |
77566f2a | 1822 | |
8ec526a4 | 1823 | // Variable |
1824 | fAmpTotal = new Float_t[TMath::Max(fDetChamb2[0],fDetChamb0[0])]; | |
1825 | for (Int_t k = 0; k < TMath::Max(fDetChamb2[0],fDetChamb0[0]); k++) { | |
1826 | fAmpTotal[k] = 0.0; | |
77566f2a | 1827 | } |
1828 | ||
77566f2a | 1829 | } |
1830 | ||
8ec526a4 | 1831 | if (fPH2dOn) { |
1832 | ||
1833 | AliInfo(Form("The pad calibration mode for the drift velocity calibration: Nz %d, and Nrphi %d" | |
1834 | ,fNz[1] | |
1835 | ,fNrphi[1])); | |
77566f2a | 1836 | |
8ec526a4 | 1837 | // Calcul the number of Xbins |
77566f2a | 1838 | fNtotal[1] = 0; |
1839 | ModePadCalibration(2,1); | |
1840 | ModePadFragmentation(0,2,0,1); | |
8ec526a4 | 1841 | fDetChamb2[1] = fNfragZ[1]*fNfragRphi[1]; |
1842 | if (fDebug == 4) { | |
1843 | AliInfo(Form("For the chamber 2: %d",fDetChamb2[1])); | |
77566f2a | 1844 | } |
8ec526a4 | 1845 | fNtotal[1] += 6 * 18 * fDetChamb2[1]; |
77566f2a | 1846 | ModePadCalibration(0,1); |
1847 | ModePadFragmentation(0,0,0,1); | |
8ec526a4 | 1848 | fDetChamb0[1] = fNfragZ[1] * fNfragRphi[1]; |
1849 | if (fDebug == 4) { | |
1850 | AliInfo(Form("For the chamber 0: %d",fDetChamb0[1])); | |
77566f2a | 1851 | } |
8ec526a4 | 1852 | fNtotal[1] += 6 * 4 * 18 * fDetChamb0[1]; |
1853 | AliInfo(Form("Total number of Xbins: %d",fNtotal[1])); | |
77566f2a | 1854 | |
8ec526a4 | 1855 | // Create the 2D histo |
1856 | if (fHisto2d) { | |
1857 | CreatePH2d(fNtotal[1]); | |
1858 | } | |
1859 | if (fVector2d) { | |
1860 | fVectorPH = new TObjArray(); | |
1861 | fPlaPH = new TObjArray(); | |
1862 | } | |
77566f2a | 1863 | |
8ec526a4 | 1864 | // Variable |
1865 | fPHPlace = new Short_t[fTimeMax]; | |
1866 | for (Int_t k = 0; k < fTimeMax; k++) { | |
1867 | fPHPlace[k] = -1; | |
77566f2a | 1868 | } |
8ec526a4 | 1869 | fPHValue = new Float_t[fTimeMax]; |
1870 | for (Int_t k = 0; k < fTimeMax; k++) { | |
1871 | fPHValue[k] = -1.0; | |
1872 | } | |
77566f2a | 1873 | |
1874 | } | |
1875 | ||
8ec526a4 | 1876 | if (fPRF2dOn) { |
1877 | ||
1878 | AliInfo(Form("The pad calibration mode for the PRF calibration: Nz %d, and Nrphi %d" | |
1879 | ,fNz[2] | |
1880 | ,fNrphi[2])); | |
77566f2a | 1881 | |
8ec526a4 | 1882 | // Calcul the number of Xbins |
77566f2a | 1883 | fNtotal[2] = 0; |
1884 | ModePadCalibration(2,2); | |
1885 | ModePadFragmentation(0,2,0,2); | |
8ec526a4 | 1886 | fDetChamb2[2] = fNfragZ[2] * fNfragRphi[2]; |
1887 | if (fDebug == 4) { | |
1888 | AliInfo(Form("For the chamber 2: %d",fDetChamb2[2])); | |
77566f2a | 1889 | } |
8ec526a4 | 1890 | fNtotal[2] += 6 * 18 * fDetChamb2[2]; |
77566f2a | 1891 | ModePadCalibration(0,2); |
1892 | ModePadFragmentation(0,0,0,2); | |
8ec526a4 | 1893 | fDetChamb0[2] = fNfragZ[2] * fNfragRphi[2]; |
1894 | if (fDebug == 4) { | |
1895 | AliInfo(Form("For the chamber 0: %d",fDetChamb0[2])); | |
77566f2a | 1896 | } |
8ec526a4 | 1897 | fNtotal[2] += 6 * 4 * 18 * fDetChamb0[2]; |
1898 | AliInfo(Form("Total number of Xbins: %d",fNtotal[2])); | |
77566f2a | 1899 | |
8ec526a4 | 1900 | // Create the 2D histo |
1901 | if (fHisto2d) { | |
1902 | CreatePRF2d(fNtotal[2]); | |
1903 | } | |
1904 | if (fVector2d) { | |
1905 | fVectorPRF = new TObjArray(); | |
1906 | fPlaPRF = new TObjArray(); | |
1907 | } | |
77566f2a | 1908 | |
1909 | } | |
1910 | ||
1911 | return kTRUE; | |
1912 | ||
1913 | } | |
1914 | ||
8ec526a4 | 1915 | //____________Functions for filling the histos in the code_____________________ |
77566f2a | 1916 | |
8ec526a4 | 1917 | //____________Offine tracking in the AliTRDtracker_____________________________ |
1918 | Bool_t AliTRDCalibra::ResetTrack() | |
77566f2a | 1919 | { |
1920 | // | |
8ec526a4 | 1921 | // For the offline tracking |
1922 | // This function will be called in the function | |
1923 | // AliTRDtracker::FollowBackPropagation() at the beginning | |
1924 | // Reset the parameter to know we have a new TRD track | |
77566f2a | 1925 | // |
1926 | ||
1927 | fDetectorAliTRDtrack = kFALSE; | |
1928 | return kTRUE; | |
77566f2a | 1929 | |
8ec526a4 | 1930 | } |
77566f2a | 1931 | |
8ec526a4 | 1932 | //____________Offline tracking in the AliTRDtracker____________________________ |
77566f2a | 1933 | Bool_t AliTRDCalibra::UpdateHistograms(AliTRDcluster *cl, AliTRDtrack *t) |
1934 | { | |
1935 | // | |
8ec526a4 | 1936 | // For the offline tracking |
1937 | // This function will be called in the function | |
1938 | // AliTRDtracker::FollowBackPropagation() in the loop over the clusters | |
1939 | // of TRD tracks | |
1940 | // Fill the 2D histos or the vectors with the info of the clusters at | |
1941 | // the end of a detectors if the track is "good" | |
77566f2a | 1942 | // |
1943 | ||
8ec526a4 | 1944 | // Get the parameter object |
77566f2a | 1945 | AliTRDCommonParam *parCom = AliTRDCommonParam::Instance(); |
1946 | if (!parCom) { | |
1947 | AliInfo("Could not get CommonParam"); | |
1948 | return kFALSE; | |
1949 | } | |
1950 | ||
1951 | // Get the parameter object | |
1952 | AliTRDcalibDB *cal = AliTRDcalibDB::Instance(); | |
1953 | if (!cal) { | |
1954 | AliInfo("Could not get calibDB"); | |
1955 | return kFALSE; | |
1956 | } | |
1957 | ||
8ec526a4 | 1958 | // Localisation of the detector |
77566f2a | 1959 | Int_t detector = cl->GetDetector(); |
8ec526a4 | 1960 | Int_t chamber = GetChamber(detector); |
1961 | Int_t plane = GetPlane(detector); | |
77566f2a | 1962 | |
8ec526a4 | 1963 | // Fill the infos for the previous clusters if not the same |
1964 | // detector anymore or if not the same track | |
1965 | if (((detector != fDetectorPreviousTrack) || (!fDetectorAliTRDtrack)) && | |
1966 | (fDetectorPreviousTrack != -1)) { | |
1967 | ||
1968 | fNumberTrack++; | |
77566f2a | 1969 | |
8ec526a4 | 1970 | // If the same track, then look if the previous detector is in |
1971 | // the same plane, if yes: not a good track | |
1972 | if (fDetectorAliTRDtrack && | |
1973 | (GetPlane(detector) <= GetPlane(fDetectorPreviousTrack))) { | |
77566f2a | 1974 | fGoodTrack = kFALSE; |
1975 | } | |
1976 | ||
8ec526a4 | 1977 | // Fill only if the track doesn't touch a masked pad or doesn't |
1978 | // appear in the middle (fGoodTrack) | |
1979 | if (fGoodTrack) { | |
77566f2a | 1980 | |
8ec526a4 | 1981 | // Gain calibration |
1982 | if (fCH2dOn) { | |
77566f2a | 1983 | FillTheInfoOfTheTrackCH(); |
8ec526a4 | 1984 | } |
77566f2a | 1985 | |
8ec526a4 | 1986 | // PH calibration |
1987 | if (fPH2dOn) { | |
77566f2a | 1988 | FillTheInfoOfTheTrackPH(); |
8ec526a4 | 1989 | } |
77566f2a | 1990 | |
8ec526a4 | 1991 | } // if a good track |
77566f2a | 1992 | |
8ec526a4 | 1993 | ResetfVariables(); |
77566f2a | 1994 | |
8ec526a4 | 1995 | } // Fill at the end the charge |
77566f2a | 1996 | |
8ec526a4 | 1997 | // Calcul the position of the detector |
1998 | if (detector != fDetectorPreviousTrack) { | |
1999 | LocalisationDetectorXbins(detector); | |
77566f2a | 2000 | } |
2001 | ||
8ec526a4 | 2002 | // Reset the good track for the PRF |
77566f2a | 2003 | Bool_t good = kTRUE; |
2004 | ||
8ec526a4 | 2005 | // Localisation of the cluster |
2006 | Double_t pos[3] = { 0.0, 0.0, 0.0 }; | |
77566f2a | 2007 | pos[0] = cl->GetX(); |
2008 | pos[1] = cl->GetY(); | |
2009 | pos[2] = cl->GetZ(); | |
8ec526a4 | 2010 | Int_t time = cl->GetLocalTimeBin(); |
2011 | ||
2012 | // Reset the detector | |
2013 | fDetectorPreviousTrack = detector; | |
2014 | fDetectorAliTRDtrack = kTRUE; | |
2015 | ||
2016 | // Position of the cluster | |
2017 | AliTRDpadPlane *padplane = parCom->GetPadPlane(plane,chamber); | |
2018 | Int_t row = padplane->GetPadRowNumber(pos[2]); | |
2019 | Double_t offsetz = padplane->GetPadRowOffset(row,pos[2]); | |
2020 | Double_t offsettilt = padplane->GetTiltOffset(offsetz); | |
2021 | Int_t col = padplane->GetPadColNumber(pos[1] + offsettilt,offsetz); | |
2022 | ||
2023 | // See if we are not near a masked pad | |
2024 | if (!IsPadOn(detector,col,row)) { | |
2025 | good = kFALSE; | |
77566f2a | 2026 | fGoodTrack = kFALSE; |
2027 | } | |
2028 | ||
8ec526a4 | 2029 | if (col > 0) { |
2030 | if (!IsPadOn(detector,col-1,row)) { | |
77566f2a | 2031 | fGoodTrack = kFALSE; |
8ec526a4 | 2032 | good = kFALSE; |
77566f2a | 2033 | } |
2034 | } | |
2035 | ||
8ec526a4 | 2036 | if (col < 143) { |
2037 | if (!IsPadOn(detector,col+1,row)) { | |
77566f2a | 2038 | fGoodTrack = kFALSE; |
8ec526a4 | 2039 | good = kFALSE; |
77566f2a | 2040 | } |
2041 | } | |
2042 | ||
8ec526a4 | 2043 | // Row of the cluster and position in the pad groups |
2044 | Int_t posr[3] = { 0, 0, 0 }; | |
2045 | if ((fCH2dOn) && (fNnZ[0] != 0)) { | |
2046 | posr[0] = (Int_t) row / fNnZ[0]; | |
2047 | } | |
2048 | if ((fPH2dOn) && (fNnZ[1] != 0)) { | |
2049 | posr[1] = (Int_t) row / fNnZ[1]; | |
2050 | } | |
2051 | if ((fPRF2dOn) && (fNnZ[2] != 0)) { | |
2052 | posr[2] = (Int_t) row / fNnZ[2]; | |
2053 | } | |
77566f2a | 2054 | |
8ec526a4 | 2055 | // Col of the cluster and position in the pad groups |
2056 | Int_t posc[3] = { 0, 0, 0 }; | |
2057 | if ((fCH2dOn) && (fNnRphi[0] != 0)) { | |
2058 | posc[0] = (Int_t) col / fNnRphi[0]; | |
2059 | } | |
2060 | if ((fPH2dOn) && (fNnRphi[1] != 0)) { | |
2061 | posc[1] = (Int_t) col / fNnRphi[1]; | |
2062 | } | |
2063 | if ((fPRF2dOn) && (fNnRphi[2] != 0)) { | |
2064 | posc[2] = (Int_t) col / fNnRphi[2]; | |
2065 | } | |
77566f2a | 2066 | |
8ec526a4 | 2067 | // Charge in the cluster |
2068 | // For the moment take the abs | |
2069 | Float_t q = TMath::Abs(cl->GetQ()); | |
2070 | Short_t *signals = cl->GetSignals(); | |
77566f2a | 2071 | |
8ec526a4 | 2072 | // Correction due to the track angle |
2073 | Float_t correction = 1.0; | |
77566f2a | 2074 | Float_t normalisation = 6.67; |
8ec526a4 | 2075 | if ((q >0) && (t->GetNdedx() > 0)) { |
2076 | correction = t->GetClusterdQdl((t->GetNdedx() - 1)) / (q * normalisation); | |
77566f2a | 2077 | } |
77566f2a | 2078 | |
8ec526a4 | 2079 | // Fill the fAmpTotal with the charge |
2080 | if (fCH2dOn) { | |
2081 | if (!fTraMaxPad){ | |
2082 | fAmpTotal[(Int_t) (posc[0]*fNfragZ[0]+posr[0])] += q * correction; | |
2083 | } | |
2084 | else { | |
2085 | fAmpTotal[(Int_t) (posc[0]*fNfragZ[0]+posr[0])] += ((Float_t) signals[3]) * correction; | |
2086 | } | |
2087 | } | |
2088 | ||
2089 | // Fill the fPHPlace and value | |
2090 | if (fPH2dOn) { | |
2091 | fPHPlace[time] = posc[1]*fNfragZ[1]+posr[1]; | |
2092 | if (!fTraMaxPad) { | |
2093 | fPHValue[time] = q * correction; | |
2094 | } | |
2095 | else { | |
2096 | fPHValue[time] = ((Float_t) signals[3]) * correction; | |
2097 | } | |
2098 | } | |
77566f2a | 2099 | |
8ec526a4 | 2100 | // Fill direct the PRF |
2101 | if ((fPRF2dOn) && (good)) { | |
77566f2a | 2102 | |
8ec526a4 | 2103 | Float_t yminus = 0.0; |
77566f2a | 2104 | Float_t xcenter = 0.0; |
2105 | Float_t ycenter = 0.0; | |
8ec526a4 | 2106 | Float_t ymax = 0.0; |
2107 | Bool_t echec = kFALSE; | |
77566f2a | 2108 | |
8ec526a4 | 2109 | if ((cl->From3pad()) && (!cl->IsUsed())) { |
77566f2a | 2110 | |
8ec526a4 | 2111 | // Center 3 balanced |
2112 | if ((((Float_t) signals[3]) > fThresholdClusterPRF2) && | |
2113 | (((Float_t) signals[2]) > fThresholdClusterPRF2) && | |
2114 | (((Float_t) signals[4]) > fThresholdClusterPRF2) && | |
2115 | (((Float_t) signals[1]) < fThresholdClusterPRF1) && | |
2116 | (((Float_t) signals[5]) < fThresholdClusterPRF1) && | |
5aba4f09 | 2117 | ((((Float_t) signals[2])*((Float_t) signals[4])/(((Float_t) signals[3])*((Float_t) signals[3]))) < 0.06)) { |
8ec526a4 | 2118 | // Col correspond to signals[3] |
2119 | if (fCenterOfflineCluster) { | |
2120 | xcenter = cl->GetCenter(); | |
2121 | } | |
2122 | else { | |
2123 | // Security of the denomiateur is 0 | |
2124 | if ((((Float_t) (((Float_t) signals[3]) * ((Float_t) signals[3]))) / | |
2125 | ((Float_t) (((Float_t) signals[2]) * ((Float_t) signals[4])))) != 1.0) { | |
2126 | xcenter = 0.5 * (TMath::Log((Float_t) (((Float_t) signals[4]) / ((Float_t) signals[2])))) | |
2127 | / (TMath::Log(((Float_t) (((Float_t) signals[3]) * ((Float_t) signals[3]))) | |
2128 | / ((Float_t) (((Float_t) signals[2]) * ((Float_t) signals[4]))))); | |
2129 | } | |
2130 | else { | |
2131 | xcenter = -100.0; | |
77566f2a | 2132 | } |
77566f2a | 2133 | } |
8ec526a4 | 2134 | if ((xcenter > -0.5) && (xcenter < 0.5)) { |
2135 | ycenter = (Float_t) (((Float_t) signals[3]) | |
2136 | / (((Float_t) signals[2]) + ((Float_t) signals[3]) + (((Float_t) signals[4])))); | |
2137 | yminus = (Float_t) (((Float_t) signals[2]) | |
2138 | / (((Float_t) signals[2]) + ((Float_t) signals[3]) + (((Float_t) signals[4])))); | |
2139 | ymax = (Float_t) (((Float_t) signals[4]) | |
2140 | / (((Float_t) signals[2]) + ((Float_t) signals[3]) + (((Float_t) signals[4])))); | |
5aba4f09 | 2141 | if ((TMath::Abs(((Float_t) signals[2]) + ((Float_t) signals[3]) + (((Float_t) signals[4])) - q) < 10.0)) { |
8ec526a4 | 2142 | echec = kTRUE; |
2143 | } | |
77566f2a | 2144 | } |
2145 | } | |
2146 | ||
8ec526a4 | 2147 | // Fill only if it is in the drift region! |
2148 | if ((((Float_t) (((Float_t) time) / fSf)) > 0.3) && (echec)) { | |
2149 | if (fHisto2d) { | |
2150 | fPRF2d->Fill((fXbins[2]+posc[2]*fNfragZ[2]+posr[2]+0.5),xcenter,ycenter); | |
2151 | if (xcenter < 0.0) { | |
2152 | fPRF2d->Fill((fXbins[2]+posc[2]*fNfragZ[2]+posr[2]+0.5),-(xcenter+1.0),yminus); | |
2153 | } | |
2154 | if (xcenter > 0.0) { | |
2155 | fPRF2d->Fill((fXbins[2]+posc[2]*fNfragZ[2]+posr[2]+0.5),1.0-xcenter,ymax); | |
2156 | } | |
77566f2a | 2157 | } |
8ec526a4 | 2158 | if (fVector2d) { |
2159 | UpdateVectorPRF(fXbins[2]+posc[2]*fNfragZ[2]+posr[2],xcenter,ycenter); | |
2160 | if (xcenter < 0.0) { | |
2161 | UpdateVectorPRF(fXbins[2]+posc[2]*fNfragZ[2]+posr[2],-(xcenter+1.0),yminus); | |
2162 | } | |
2163 | if (xcenter > 0.0) { | |
2164 | UpdateVectorPRF(fXbins[2]+posc[2]*fNfragZ[2]+posr[2],1.0-xcenter,ymax); | |
2165 | } | |
77566f2a | 2166 | } |
8ec526a4 | 2167 | } // If in the drift region |
2168 | ||
2169 | } // Cluster isole | |
2170 | ||
2171 | } // PRF2dOn | |
77566f2a | 2172 | |
2173 | return kTRUE; | |
2174 | ||
2175 | } | |
2176 | ||
8ec526a4 | 2177 | //____________Online trackling in AliTRDtrigger________________________________ |
2178 | Bool_t AliTRDCalibra::UpdateHistogramcm(AliTRDmcmTracklet *trk) | |
77566f2a | 2179 | { |
2180 | // | |
8ec526a4 | 2181 | // For the tracking |
2182 | // This function will be called in the function AliTRDtrigger::TestTracklet | |
2183 | // before applying the pt cut on the tracklets | |
2184 | // Fill the infos for the tracklets fTrkTest if the tracklets is "good" | |
77566f2a | 2185 | // |
2186 | ||
8ec526a4 | 2187 | // Localisation of the Xbins involved |
2188 | Int_t idect = trk->GetDetector(); | |
2189 | LocalisationDetectorXbins(idect); | |
77566f2a | 2190 | |
2191 | // Get the parameter object | |
8ec526a4 | 2192 | AliTRDcalibDB *cal = AliTRDcalibDB::Instance(); |
77566f2a | 2193 | if (!cal) { |
2194 | AliInfo("Could not get calibDB"); | |
2195 | return kFALSE; | |
2196 | } | |
2197 | ||
8ec526a4 | 2198 | // Reset |
2199 | ResetfVariables(); | |
2200 | ||
2201 | // Row of the tracklet and position in the pad groups | |
2202 | Int_t row = trk->GetRow(); | |
2203 | Int_t posr[3] = { 0, 0, 0 }; | |
2204 | if ((fCH2dOn) && (fNnZ[0] != 0)) { | |
2205 | posr[0] = (Int_t) row / fNnZ[0]; | |
2206 | } | |
2207 | if ((fPH2dOn) && (fNnZ[1] != 0)) { | |
2208 | posr[1] = (Int_t) row / fNnZ[1]; | |
2209 | } | |
2210 | if ((fPRF2dOn) && (fNnZ[2] != 0)) { | |
2211 | posr[2] = (Int_t) row / fNnZ[2]; | |
2212 | } | |
2213 | ||
2214 | // Eventuelle correction due to track angle in z direction | |
77566f2a | 2215 | Float_t correction = 1.0; |
8ec526a4 | 2216 | if (fMcmCorrectAngle) { |
2217 | Float_t z = trk->GetRowz(); | |
2218 | Float_t r = trk->GetTime0(); | |
2219 | correction = r / TMath::Sqrt((r*r+z*z)); | |
77566f2a | 2220 | } |
8ec526a4 | 2221 | |
2222 | // Boucle sur les clusters | |
2223 | // Condition on number of cluster: don't come from the middle of the detector | |
2224 | if (trk->GetNclusters() >= fNumberClusters) { | |
2225 | ||
2226 | for (Int_t icl = 0; icl < trk->GetNclusters(); icl++) { | |
2227 | ||
2228 | Float_t amp[3] = { 0.0, 0.0, 0.0 }; | |
2229 | Int_t time = trk->GetClusterTime(icl); | |
2230 | Int_t col = trk->GetClusterCol(icl); | |
77566f2a | 2231 | |
8ec526a4 | 2232 | amp[0] = trk->GetClusterADC(icl)[0] * correction; |
2233 | amp[1] = trk->GetClusterADC(icl)[1] * correction; | |
2234 | amp[2] = trk->GetClusterADC(icl)[2] * correction; | |
77566f2a | 2235 | |
8ec526a4 | 2236 | if ((amp[0] < 0.0) || |
2237 | (amp[1] < 0.0) || | |
2238 | (amp[2] < 0.0)) { | |
2239 | continue; | |
2240 | } | |
2241 | ||
2242 | // Col of cluster and position in the pad groups | |
2243 | Int_t posc[3] = { 0, 0, 0 }; | |
2244 | if ((fCH2dOn) && (fNnRphi[0] != 0)) { | |
2245 | posc[0] = (Int_t) col / fNnRphi[0]; | |
2246 | } | |
2247 | if ((fPH2dOn) && (fNnRphi[1] != 0)) { | |
2248 | posc[1] = (Int_t) col / fNnRphi[1]; | |
2249 | } | |
2250 | if ((fPRF2dOn) && (fNnRphi[2] != 0)) { | |
2251 | posc[2] = (Int_t) col / fNnRphi[2]; | |
2252 | } | |
2253 | ||
2254 | // See if we are not near a masked pad | |
77566f2a | 2255 | Bool_t good = kTRUE; |
8ec526a4 | 2256 | if (!IsPadOn(idect,col,row)) { |
77566f2a | 2257 | fGoodTrack = kFALSE; |
8ec526a4 | 2258 | good = kFALSE; |
77566f2a | 2259 | } |
8ec526a4 | 2260 | |
2261 | if (col > 0) { | |
2262 | if (!IsPadOn(idect,col-1,row)) { | |
77566f2a | 2263 | fGoodTrack = kFALSE; |
8ec526a4 | 2264 | good = kFALSE; |
77566f2a | 2265 | } |
2266 | } | |
2267 | ||
8ec526a4 | 2268 | if (col < 143) { |
2269 | if (!IsPadOn(idect,col+1,row)) { | |
77566f2a | 2270 | fGoodTrack = kFALSE; |
8ec526a4 | 2271 | good = kFALSE; |
77566f2a | 2272 | } |
2273 | } | |
77566f2a | 2274 | |
8ec526a4 | 2275 | // Total spectrum |
2276 | if (fPH2dOn) { | |
2277 | fPHPlace[time] = posc[1] * fNfragZ[1] + posr[1]; | |
77566f2a | 2278 | } |
77566f2a | 2279 | |
8ec526a4 | 2280 | if (!fTraMaxPad) { |
2281 | if (fCH2dOn) { | |
2282 | fAmpTotal[(Int_t) (posc[0]*fNfragZ[0]+posr[0])] += (Float_t) (amp[0]+amp[1]+amp[2]); | |
2283 | } | |
2284 | if (fPH2dOn) { | |
2285 | fPHValue[time] = (Float_t) (amp[0]+amp[1]+amp[2]); | |
2286 | } | |
2287 | } | |
2288 | else { | |
2289 | if (fCH2dOn) { | |
2290 | fAmpTotal[(Int_t) (posc[0]*fNfragZ[0]+posr[0])] += (Float_t) amp[1]; | |
2291 | } | |
2292 | if (fPH2dOn) { | |
2293 | fPHValue[time] = amp[1]; | |
2294 | } | |
77566f2a | 2295 | } |
2296 | ||
8ec526a4 | 2297 | // Fill PRF direct |
2298 | if (fPRF2dOn && good) { | |
2299 | if ((amp[0] > fThresholdClusterPRF2) && | |
2300 | (amp[1] > fThresholdClusterPRF2) && | |
2301 | (amp[2] > fThresholdClusterPRF2) && | |
5aba4f09 | 2302 | ((amp[0]*amp[2]/(amp[1]*amp[1])) < 0.06)) { |
8ec526a4 | 2303 | // Security of the denomiateur is 0 |
2304 | if ((((Float_t) (((Float_t) amp[1]) * ((Float_t) amp[1]))) | |
2305 | / ((Float_t) (((Float_t) amp[0]) * ((Float_t) amp[2])))) != 1.0) { | |
2306 | Float_t xcenter = 0.5 * (TMath::Log(amp[2] / amp[0])) | |
2307 | / (TMath::Log((amp[1]*amp[1]) / (amp[0]*amp[2]))); | |
2308 | Float_t ycenter = amp[1] / (amp[0] + amp[1] + amp[2]); | |
2309 | if ((xcenter > -0.5) && | |
5aba4f09 | 2310 | (xcenter < 0.5)) { |
8ec526a4 | 2311 | Float_t yminus = amp[0] / (amp[0]+amp[1]+amp[2]); |
2312 | Float_t ymax = amp[2] / (amp[0]+amp[1]+amp[2]); | |
2313 | // Fill only if it is in the drift region! | |
2314 | if (((Float_t) time / fSf) > 0.3) { | |
2315 | if (fHisto2d) { | |
2316 | fPRF2d->Fill((fXbins[2]+posc[2]*fNfragZ[2]+posr[2]+0.5),xcenter,ycenter); | |
2317 | if (xcenter < 0.0) { | |
2318 | fPRF2d->Fill((fXbins[2]+posc[2]*fNfragZ[2]+posr[2]+0.5),-(xcenter+1.0),yminus); | |
2319 | } | |
2320 | if (xcenter > 0.0) { | |
2321 | fPRF2d->Fill((fXbins[2]+posc[2]*fNfragZ[2]+posr[2]+0.5),(1.0-xcenter),ymax); | |
2322 | } | |
2323 | } | |
2324 | if (fVector2d) { | |
2325 | UpdateVectorPRF((fXbins[2]+posc[2]*fNfragZ[2]+posr[2]),xcenter,ycenter); | |
2326 | if (xcenter < 0.0) { | |
2327 | UpdateVectorPRF(fXbins[2]+posc[2]*fNfragZ[2]+posr[2],-(xcenter+1.0),yminus); | |
2328 | } | |
2329 | if (xcenter > 0.0) { | |
2330 | UpdateVectorPRF(fXbins[2]+posc[2]*fNfragZ[2]+posr[2],(1.0-xcenter),ymax); | |
77566f2a | 2331 | } |
77566f2a | 2332 | } |
2333 | } | |
2334 | } | |
2335 | } | |
2336 | } | |
2337 | } | |
2338 | ||
8ec526a4 | 2339 | } // Boucle clusters |
77566f2a | 2340 | |
8ec526a4 | 2341 | // Fill the charge |
2342 | if (fCH2dOn && fGoodTrack) { | |
77566f2a | 2343 | FillTheInfoOfTheTrackCH(); |
8ec526a4 | 2344 | } |
77566f2a | 2345 | |
8ec526a4 | 2346 | // PH calibration |
2347 | if (fPH2dOn && fGoodTrack) { | |
2348 | FillTheInfoOfTheTrackPH(); | |
2349 | } | |
77566f2a | 2350 | |
8ec526a4 | 2351 | } // Condition on number of clusters |
2352 | ||
77566f2a | 2353 | return kTRUE; |
2354 | ||
2355 | } | |
2356 | ||
8ec526a4 | 2357 | //____________Functions for seeing if the pad is really okey___________________ |
77566f2a | 2358 | |
8ec526a4 | 2359 | //_____________________________________________________________________________ |
2360 | Bool_t AliTRDCalibra::SetModeCalibrationFromTObject(TObject *object, Int_t i) | |
77566f2a | 2361 | { |
2362 | // | |
8ec526a4 | 2363 | // Set fNz[i] and fNrphi[i] of the AliTRDCalibra::Instance() |
2364 | // corresponding to the given TObject | |
77566f2a | 2365 | // |
8ec526a4 | 2366 | |
2367 | const char *nametitle = object->GetTitle(); | |
2368 | ||
2369 | // Some patterns | |
2370 | const Char_t *patternz0 = "Nz0"; | |
2371 | const Char_t *patternz1 = "Nz1"; | |
2372 | const Char_t *patternz2 = "Nz2"; | |
2373 | const Char_t *patternz3 = "Nz3"; | |
2374 | const Char_t *patternz4 = "Nz4"; | |
2375 | const Char_t *patternrphi0 = "Nrphi0"; | |
2376 | const Char_t *patternrphi1 = "Nrphi1"; | |
2377 | const Char_t *patternrphi2 = "Nrphi2"; | |
2378 | const Char_t *patternrphi3 = "Nrphi3"; | |
2379 | const Char_t *patternrphi4 = "Nrphi4"; | |
2380 | const Char_t *patternrphi5 = "Nrphi5"; | |
2381 | const Char_t *patternrphi6 = "Nrphi6"; | |
2382 | ||
2383 | UShort_t testz = 0; | |
2384 | UShort_t testrphi = 0; | |
2385 | ||
2386 | // Nz mode | |
2387 | if (strstr(nametitle,patternz0)) { | |
2388 | testz++; | |
2389 | fNz[i] = 0; | |
2390 | } | |
2391 | if (strstr(nametitle,patternz1)) { | |
2392 | testz++; | |
2393 | fNz[i] = 1; | |
2394 | } | |
2395 | if (strstr(nametitle,patternz2)) { | |
2396 | testz++; | |
2397 | fNz[i] = 2; | |
2398 | } | |
2399 | if (strstr(nametitle,patternz3)) { | |
2400 | testz++; | |
2401 | fNz[i] = 3; | |
2402 | } | |
2403 | if (strstr(nametitle,patternz4)) { | |
2404 | testz++; | |
2405 | fNz[i] = 4; | |
2406 | } | |
2407 | ||
2408 | // Nrphi mode | |
2409 | if (strstr(nametitle,patternrphi0)) { | |
2410 | testrphi++; | |
2411 | fNrphi[i] = 0; | |
2412 | } | |
2413 | if (strstr(nametitle,patternrphi1)) { | |
2414 | testrphi++; | |
2415 | fNrphi[i] = 1; | |
2416 | } | |
2417 | if (strstr(nametitle,patternrphi2)) { | |
2418 | testrphi++; | |
2419 | fNrphi[i] = 2; | |
2420 | } | |
2421 | if (strstr(nametitle,patternrphi3)) { | |
2422 | testrphi++; | |
2423 | fNrphi[i] = 3; | |
2424 | } | |
2425 | if (strstr(nametitle,patternrphi4)) { | |
2426 | testrphi++; | |
2427 | fNrphi[i] = 4; | |
2428 | } | |
2429 | if (strstr(nametitle,patternrphi5)) { | |
2430 | testrphi++; | |
2431 | fNrphi[i] = 5; | |
2432 | } | |
2433 | if (strstr(nametitle,patternrphi6)) { | |
2434 | testrphi++; | |
2435 | fNrphi[i] = 6; | |
2436 | } | |
2437 | ||
2438 | // Look if all is okey | |
2439 | if ((testz == 1) && | |
2440 | (testrphi == 1)) { | |
2441 | return kTRUE; | |
2442 | } | |
2443 | else { | |
2444 | fNrphi[i] = 0; | |
2445 | fNz[i] = 0; | |
2446 | return kFALSE; | |
2447 | } | |
77566f2a | 2448 | |
8ec526a4 | 2449 | } |
2450 | ||
2451 | //_____________________________________________________________________________ | |
2452 | Bool_t AliTRDCalibra::IsPadOn(Int_t detector, Int_t col, Int_t row) const | |
2453 | { | |
2454 | // | |
2455 | // Look in the choosen database if the pad is On. | |
2456 | // If no the track will be "not good" | |
2457 | // | |
77566f2a | 2458 | |
2459 | // Get the parameter object | |
8ec526a4 | 2460 | AliTRDcalibDB *cal = AliTRDcalibDB::Instance(); |
77566f2a | 2461 | if (!cal) { |
2462 | AliInfo("Could not get calibDB"); | |
2463 | return kFALSE; | |
2464 | } | |
2465 | ||
8ec526a4 | 2466 | if (!cal->IsChamberInstalled(detector) || |
9f4780aa | 2467 | cal->IsChamberMasked(detector) || |
8ec526a4 | 2468 | cal->IsPadMasked(detector,col,row)) { |
77566f2a | 2469 | return kFALSE; |
2470 | } | |
8ec526a4 | 2471 | else { |
2472 | return kTRUE; | |
2473 | } | |
77566f2a | 2474 | |
2475 | } | |
2476 | ||
8ec526a4 | 2477 | //____________Functions for plotting the 2D____________________________________ |
77566f2a | 2478 | |
8ec526a4 | 2479 | //_____________________________________________________________________________ |
77566f2a | 2480 | void AliTRDCalibra::Plot2d() |
2481 | { | |
2482 | // | |
2483 | // Plot the 2D histos | |
2484 | // | |
2485 | ||
8ec526a4 | 2486 | if (fCH2dOn) { |
2487 | PlotCH2d(); | |
2488 | } | |
2489 | if (fPH2dOn) { | |
2490 | PlotPH2d(); | |
2491 | } | |
2492 | if (fPRF2dOn) { | |
2493 | PlotPRF2d(); | |
2494 | } | |
77566f2a | 2495 | |
2496 | } | |
77566f2a | 2497 | |
8ec526a4 | 2498 | //____________Writing the 2D___________________________________________________ |
2499 | ||
2500 | //_____________________________________________________________________________ | |
77566f2a | 2501 | Bool_t AliTRDCalibra::Write2d() |
2502 | { | |
2503 | // | |
8ec526a4 | 2504 | // Write the 2D histograms or the vectors converted in trees in the file |
2505 | // "TRD.calibration.root" | |
77566f2a | 2506 | // |
2507 | ||
2508 | TFile *fout = TFile::Open(fWriteName,"RECREATE"); | |
8ec526a4 | 2509 | // Check if the file could be opened |
77566f2a | 2510 | if (!fout || !fout->IsOpen()) { |
2511 | AliInfo("No File found!"); | |
2512 | return kFALSE; | |
2513 | } | |
8ec526a4 | 2514 | AliInfo(Form("Numbertrack: %d Numberusedch[0]: %d, Numberusedch[1]: %d Numberusedph[0]: %d, Numberusedph[1]: %d" |
2515 | ,fNumberTrack | |
2516 | ,fNumberUsedCh[0] | |
2517 | ,fNumberUsedCh[1] | |
2518 | ,fNumberUsedPh[0] | |
2519 | ,fNumberUsedPh[1])); | |
77566f2a | 2520 | |
2521 | TStopwatch stopwatch; | |
2522 | stopwatch.Start(); | |
2523 | AliInfo("Write2d"); | |
8ec526a4 | 2524 | |
2525 | if ((fCH2dOn ) && (fWrite[0])) { | |
2526 | if (fHisto2d) { | |
2527 | fout->WriteTObject(fCH2d); | |
2528 | } | |
2529 | if (fVector2d) { | |
2530 | TString name("Nz"); | |
2531 | name += fNz[0]; | |
2532 | name += "Nrphi"; | |
2533 | name += fNrphi[0]; | |
2534 | TTree *treeCH2d = ConvertVectorCTTreeHisto(fVectorCH,fPlaCH,"treeCH2d",(const char *) name); | |
77566f2a | 2535 | fout->WriteTObject(treeCH2d); |
2536 | } | |
2537 | } | |
8ec526a4 | 2538 | if ((fPH2dOn ) && (fWrite[1])) { |
2539 | if (fHisto2d) { | |
2540 | fout->WriteTObject(fPH2d); | |
2541 | } | |
2542 | if (fVector2d) { | |
2543 | TString name("Nz"); | |
2544 | name += fNz[1]; | |
2545 | name += "Nrphi"; | |
2546 | name += fNrphi[1]; | |
2547 | TTree *treePH2d = ConvertVectorPTreeHisto(fVectorPH,fPlaPH,"treePH2d",(const char *) name); | |
77566f2a | 2548 | fout->WriteTObject(treePH2d); |
2549 | } | |
2550 | } | |
8ec526a4 | 2551 | if ((fPRF2dOn ) && (fWrite[2])) { |
2552 | if (fHisto2d) { | |
2553 | fout->WriteTObject(fPRF2d); | |
2554 | } | |
2555 | if (fVector2d) { | |
2556 | TString name("Nz"); | |
2557 | name += fNz[2]; | |
2558 | name += "Nrphi"; | |
2559 | name += fNrphi[2]; | |
2560 | TTree *treePRF2d = ConvertVectorPTreeHisto(fVectorPRF,fPlaPRF,"treePRF2d",(const char *) name); | |
77566f2a | 2561 | fout->WriteTObject(treePRF2d); |
2562 | } | |
2563 | } | |
2564 | ||
2565 | fout->Close(); | |
2566 | ||
8ec526a4 | 2567 | AliInfo(Form("Execution time Write2d: R:%.2fs C:%.2fs" |
2568 | ,stopwatch.RealTime(),stopwatch.CpuTime())); | |
2569 | ||
77566f2a | 2570 | return kTRUE; |
2571 | ||
2572 | } | |
8ec526a4 | 2573 | |
2574 | //_____________________________________________________________________________ | |
2575 | AliTRDCalDet *AliTRDCalibra::CreateDetObjectTree(TTree *tree, Int_t i) | |
77566f2a | 2576 | { |
2577 | // | |
8ec526a4 | 2578 | // It creates the AliTRDCalDet object from the tree of the coefficient |
2579 | // for the calibration i (i != 2) | |
77566f2a | 2580 | // It takes the mean value of the coefficients per detector |
2581 | // This object has to be written in the database | |
2582 | // | |
2583 | ||
8ec526a4 | 2584 | // Create the DetObject |
77566f2a | 2585 | AliTRDCalDet *object = 0x0; |
8ec526a4 | 2586 | if (i == 0) { |
2587 | object = new AliTRDCalDet("ChamberGainFactor","GainFactor (detector value)"); | |
2588 | } | |
2589 | if (i == 1) { | |
2590 | object = new AliTRDCalDet("ChamberVdrift","TRD drift velocities (detector value)"); | |
2591 | } | |
2592 | else { | |
2593 | object = new AliTRDCalDet("ChamberT0","T0 (detector value)"); | |
2594 | } | |
77566f2a | 2595 | |
8ec526a4 | 2596 | // Read the Tree |
2597 | Int_t detector = -1; | |
77566f2a | 2598 | Float_t values[2304]; |
2599 | tree->SetBranchAddress("detector",&detector); | |
8ec526a4 | 2600 | if (i == 0) { |
2601 | tree->SetBranchAddress("gainPad",values); | |
2602 | } | |
2603 | if (i == 1) { | |
2604 | tree->SetBranchAddress("vdrift" ,values); | |
2605 | } | |
2606 | if (i == 3) { | |
2607 | tree->SetBranchAddress("t0" ,values); | |
2608 | } | |
77566f2a | 2609 | |
8ec526a4 | 2610 | // For calculating the mean |
2611 | Float_t mean = 0.0; | |
2612 | Int_t nto = 0; | |
2613 | Int_t numberofentries = tree->GetEntries(); | |
77566f2a | 2614 | |
8ec526a4 | 2615 | if (numberofentries != 540) { |
2616 | AliInfo("The tree is not complete"); | |
2617 | } | |
77566f2a | 2618 | |
8ec526a4 | 2619 | for (Int_t det = 0; det < numberofentries; ++det) { |
77566f2a | 2620 | tree->GetEntry(det); |
8ec526a4 | 2621 | if (GetChamber(detector) == 2) { |
2622 | nto = 1728; | |
2623 | } | |
2624 | else { | |
2625 | nto = 2304; | |
2626 | } | |
77566f2a | 2627 | mean = 0.0; |
9f4780aa | 2628 | if(i != 3){ |
2629 | for (Int_t k = 0; k < nto; k++) { | |
2630 | mean += TMath::Abs(values[k]) / nto; | |
2631 | } | |
2632 | } | |
2633 | else { | |
2634 | for (Int_t k = 0; k < nto; k++) { | |
5aba4f09 | 2635 | if(k == 0) mean = values[k]; |
2636 | if(mean > values[k]) mean = values[k]; | |
9f4780aa | 2637 | } |
8ec526a4 | 2638 | } |
77566f2a | 2639 | object->SetValue(detector,mean); |
2640 | } | |
8ec526a4 | 2641 | |
77566f2a | 2642 | return object; |
8ec526a4 | 2643 | |
77566f2a | 2644 | } |
8ec526a4 | 2645 | |
2646 | //_____________________________________________________________________________ | |
2647 | TObject *AliTRDCalibra::CreatePadObjectTree(TTree *tree, Int_t i | |
2648 | , AliTRDCalDet *detobject) | |
77566f2a | 2649 | { |
2650 | // | |
8ec526a4 | 2651 | // It Creates the AliTRDCalPad object from the tree of the |
2652 | // coefficient for the calibration i (i != 2) | |
2653 | // You need first to create the object for the detectors, | |
2654 | // where the mean value is put. | |
77566f2a | 2655 | // This object has to be written in the database |
2656 | // | |
2657 | ||
8ec526a4 | 2658 | // Create the DetObject |
77566f2a | 2659 | AliTRDCalPad *object = 0x0; |
8ec526a4 | 2660 | if (i == 0) { |
2661 | object = new AliTRDCalPad("GainFactor","GainFactor (local variations)"); | |
2662 | } | |
2663 | if (i == 1) { | |
2664 | object = new AliTRDCalPad("LocalVdrift","TRD drift velocities (local variations)"); | |
2665 | } | |
2666 | else { | |
2667 | object = new AliTRDCalPad("LocalT0","T0 (local variations)"); | |
2668 | } | |
77566f2a | 2669 | |
8ec526a4 | 2670 | // Read the Tree |
2671 | Int_t detector = -1; | |
77566f2a | 2672 | Float_t values[2304]; |
2673 | tree->SetBranchAddress("detector",&detector); | |
8ec526a4 | 2674 | if (i == 0) { |
2675 | tree->SetBranchAddress("gainPad",values); | |
2676 | } | |
2677 | if (i == 1) { | |
2678 | tree->SetBranchAddress("vdrift" ,values); | |
2679 | } | |
2680 | if (i == 3) { | |
2681 | tree->SetBranchAddress("t0" ,values); | |
2682 | } | |
77566f2a | 2683 | |
8ec526a4 | 2684 | // Variables |
2685 | Float_t mean = 0.0; | |
2686 | Int_t numberofentries = tree->GetEntries(); | |
77566f2a | 2687 | |
8ec526a4 | 2688 | if (numberofentries != 540) { |
2689 | AliInfo("The tree is not complete"); | |
2690 | } | |
77566f2a | 2691 | |
8ec526a4 | 2692 | for (Int_t det = 0; det < numberofentries; ++det) { |
77566f2a | 2693 | tree->GetEntry(det); |
2694 | AliTRDCalROC *calROC = object->GetCalROC(detector); | |
2695 | mean = detobject->GetValue(detector); | |
5aba4f09 | 2696 | if ((mean == 0) && (i != 3)) { |
8ec526a4 | 2697 | continue; |
2698 | } | |
77566f2a | 2699 | Int_t rowMax = calROC->GetNrows(); |
2700 | Int_t colMax = calROC->GetNcols(); | |
8ec526a4 | 2701 | for (Int_t row = 0; row < rowMax; ++row) { |
2702 | for (Int_t col = 0; col < colMax; ++col) { | |
9f4780aa | 2703 | if(i != 3) calROC->SetValue(col,row,TMath::Abs(values[(Int_t) (col*rowMax+row)])/mean); |
5aba4f09 | 2704 | else calROC->SetValue(col,row,values[(Int_t) (col*rowMax+row)]-mean); |
e5c60cc7 | 2705 | |
8ec526a4 | 2706 | } // Col |
2707 | } // Row | |
77566f2a | 2708 | } |
8ec526a4 | 2709 | |
77566f2a | 2710 | return object; |
8ec526a4 | 2711 | |
77566f2a | 2712 | } |
8ec526a4 | 2713 | |
2714 | //_____________________________________________________________________________ | |
2715 | TObject *AliTRDCalibra::CreatePadObjectTree(TTree *tree) | |
77566f2a | 2716 | { |
2717 | // | |
8ec526a4 | 2718 | // It Creates the AliTRDCalPad object from the tree of the |
2719 | // coefficient for the calibration PRF (i = 2) | |
77566f2a | 2720 | // This object has to be written in the database |
2721 | // | |
2722 | ||
8ec526a4 | 2723 | // Create the DetObject |
77566f2a | 2724 | AliTRDCalPad *object = new AliTRDCalPad("PRFWidth","PRFWidth"); |
2725 | ||
8ec526a4 | 2726 | // Read the Tree |
2727 | Int_t detector = -1; | |
77566f2a | 2728 | Float_t values[2304]; |
2729 | tree->SetBranchAddress("detector",&detector); | |
8ec526a4 | 2730 | tree->SetBranchAddress("width" ,values); |
77566f2a | 2731 | |
8ec526a4 | 2732 | // Variables |
77566f2a | 2733 | Int_t numberofentries = tree->GetEntries(); |
2734 | ||
8ec526a4 | 2735 | if (numberofentries != 540) { |
2736 | AliInfo("The tree is not complete"); | |
2737 | } | |
77566f2a | 2738 | |
8ec526a4 | 2739 | for (Int_t det = 0; det < numberofentries; ++det) { |
77566f2a | 2740 | tree->GetEntry(det); |
2741 | AliTRDCalROC *calROC = object->GetCalROC(detector); | |
2742 | Int_t rowMax = calROC->GetNrows(); | |
2743 | Int_t colMax = calROC->GetNcols(); | |
8ec526a4 | 2744 | for (Int_t row = 0; row < rowMax; ++row) { |
2745 | for (Int_t col = 0; col < colMax; ++col) { | |
77566f2a | 2746 | calROC->SetValue(col,row,TMath::Abs(values[(Int_t) (col*rowMax+row)])); |
8ec526a4 | 2747 | } // Col |
2748 | } // Row | |
77566f2a | 2749 | } |
8ec526a4 | 2750 | |
77566f2a | 2751 | return object; |
8ec526a4 | 2752 | |
77566f2a | 2753 | } |
8ec526a4 | 2754 | |
2755 | //_____________________________________________________________________________ | |
2756 | void AliTRDCalibra::SetRelativeScale(Float_t RelativeScale) | |
77566f2a | 2757 | { |
2758 | // | |
8ec526a4 | 2759 | // Set the factor that will divide the deposited charge |
2760 | // to fit in the histo range [0,300] | |
77566f2a | 2761 | // |
77566f2a | 2762 | |
8ec526a4 | 2763 | if (RelativeScale > 0.0) { |
2764 | fRelativeScale = RelativeScale; | |
2765 | } | |
2766 | else { | |
2767 | AliInfo("RelativeScale must be strict positif!"); | |
2768 | } | |
2769 | ||
2770 | } | |
2771 | ||
2772 | //_____________________________________________________________________________ | |
2773 | void AliTRDCalibra::SetNz(Int_t i, Short_t Nz) | |
2774 | { | |
2775 | // | |
2776 | // Set the mode of calibration group in the z direction for the parameter i | |
2777 | // | |
2778 | ||
2779 | if ((Nz >= 0) && | |
2780 | (Nz < 5)) { | |
2781 | fNz[i] = Nz; | |
2782 | } | |
2783 | else { | |
2784 | AliInfo("You have to choose between 0 and 4"); | |
2785 | } | |
2786 | ||
2787 | } | |
2788 | ||
2789 | //_____________________________________________________________________________ | |
2790 | void AliTRDCalibra::SetNrphi(Int_t i, Short_t Nrphi) | |
2791 | { | |
2792 | // | |
2793 | // Set the mode of calibration group in the rphi direction for the parameter i | |
2794 | // | |
77566f2a | 2795 | |
8ec526a4 | 2796 | if ((Nrphi >= 0) && |
2797 | (Nrphi < 7)) { | |
2798 | fNrphi[i] = Nrphi; | |
2799 | } | |
2800 | else { | |
2801 | AliInfo("You have to choose between 0 and 6"); | |
2802 | } | |
2803 | ||
2804 | } | |
2805 | ||
2806 | //_____________________________________________________________________________ | |
2807 | void AliTRDCalibra::SetPeriodeFitPH(Int_t periodeFitPH) | |
2808 | { | |
2809 | // | |
2810 | // Set FitPH if 1 then each detector will be fitted | |
2811 | // | |
2812 | ||
2813 | if (periodeFitPH > 0) { | |
2814 | fFitPHPeriode = periodeFitPH; | |
2815 | } | |
2816 | else { | |
2817 | AliInfo("periodeFitPH must be higher than 0!"); | |
2818 | } | |
2819 | ||
2820 | } | |
2821 | ||
2822 | //_____________________________________________________________________________ | |
2823 | void AliTRDCalibra::SetBeginFitCharge(Float_t beginFitCharge) | |
2824 | { | |
2825 | // | |
2826 | // The fit of the deposited charge distribution begins at | |
2827 | // histo->Mean()/beginFitCharge | |
2828 | // You can here set beginFitCharge | |
2829 | // | |
2830 | ||
2831 | if (beginFitCharge > 0) { | |
2832 | fBeginFitCharge = beginFitCharge; | |
2833 | } | |
2834 | else { | |
2835 | AliInfo("beginFitCharge must be strict positif!"); | |
2836 | } | |
2837 | ||
2838 | } | |
2839 | ||
2840 | //_____________________________________________________________________________ | |
2841 | void AliTRDCalibra::SetT0Shift(Float_t t0Shift) | |
2842 | { | |
2843 | // | |
2844 | // The t0 calculated with the maximum positif slope is shift from t0Shift | |
2845 | // You can here set t0Shift | |
2846 | // | |
2847 | ||
2848 | if (t0Shift > 0) { | |
2849 | fT0Shift = t0Shift; | |
2850 | } | |
2851 | else { | |
2852 | AliInfo("t0Shift must be strict positif!"); | |
2853 | } | |
2854 | ||
2855 | } | |
2856 | ||
2857 | //_____________________________________________________________________________ | |
2858 | void AliTRDCalibra::SetRangeFitPRF(Float_t rangeFitPRF) | |
2859 | { | |
2860 | // | |
2861 | // The fit of the PRF is from -rangeFitPRF to rangeFitPRF | |
2862 | // You can here set rangeFitPRF | |
2863 | // | |
2864 | ||
2865 | if ((rangeFitPRF > 0) && | |
2866 | (rangeFitPRF <= 1.0)) { | |
2867 | fRangeFitPRF = rangeFitPRF; | |
2868 | } | |
2869 | else { | |
2870 | AliInfo("rangeFitPRF must be between 0 and 1.0"); | |
2871 | } | |
2872 | ||
2873 | } | |
2874 | ||
2875 | //_____________________________________________________________________________ | |
2876 | void AliTRDCalibra::SetRebin(Short_t rebin) | |
2877 | { | |
2878 | // | |
2879 | // Rebin with rebin time less bins the Ch histo | |
2880 | // You can set here rebin that should divide the number of bins of CH histo | |
2881 | // | |
2882 | ||
2883 | if (rebin > 0) { | |
2884 | fRebin = rebin; | |
2885 | AliInfo("You have to be sure that fRebin divides fNumberBinCharge used!"); | |
2886 | } | |
2887 | else { | |
2888 | AliInfo("You have to choose a positiv value!"); | |
2889 | } | |
2890 | ||
2891 | } | |
2892 | ||
2893 | //_____________________________________________________________________________ | |
2894 | TTree *AliTRDCalibra::Sum2Trees(const Char_t *filename1 | |
2895 | , const Char_t *filename2 | |
2896 | , const Char_t *variablecali) | |
2897 | { | |
2898 | // | |
2899 | // It returns the sum of two trees with the name variablecali | |
2900 | // in the files filenam1 and filename2 equivalent of merging two 2D histos | |
2901 | // The name of the resulting tree is the same as the two input trees | |
2902 | // variablecali can be treeCH2d, treePH2d or treePRF2d | |
2903 | // | |
2904 | ||
2905 | // Variables | |
2906 | TChain *treeChain = new TChain(variablecali); | |
2907 | TObjArray *vectorplace = new TObjArray(); | |
2908 | TObjArray *where = new TObjArray(); | |
77566f2a | 2909 | |
8ec526a4 | 2910 | // First tree |
2911 | // Take the tree | |
2912 | TFile *file1 = new TFile(filename1,"READ"); | |
77566f2a | 2913 | TTree *tree1 = (TTree *) file1->Get(variablecali); |
8ec526a4 | 2914 | |
2915 | gDirectory = gROOT; | |
2916 | ||
2917 | // Take the places | |
77566f2a | 2918 | vectorplace = ConvertTreeVector(tree1); |
8ec526a4 | 2919 | |
2920 | // Say where it is in tree 1 | |
2921 | for (Int_t jui = 0; jui < (Int_t) vectorplace->GetEntriesFast(); jui++) { | |
2922 | AliTRDPlace *placejui = new AliTRDPlace(); | |
2923 | placejui->SetPlace(jui); | |
2924 | TObjArray *chainplace = new TObjArray(); | |
2925 | chainplace->Add((TObject *) placejui); | |
2926 | where->Add((TObject *) chainplace); | |
77566f2a | 2927 | } |
8ec526a4 | 2928 | |
2929 | // Add to the chain | |
77566f2a | 2930 | treeChain->Add(filename1); |
2931 | delete file1; | |
77566f2a | 2932 | |
8ec526a4 | 2933 | // Second tree |
2934 | // Take the tree | |
2935 | TFile *file2 = new TFile(filename2,"READ"); | |
2936 | TTree *tree2 = (TTree *) file2->Get(variablecali); | |
77566f2a | 2937 | |
8ec526a4 | 2938 | gDirectory = gROOT; |
77566f2a | 2939 | |
8ec526a4 | 2940 | // Take the places |
2941 | TObjArray *vector2 = ConvertTreeVector(tree2); | |
77566f2a | 2942 | Int_t j = treeChain->GetEntries(); |
8ec526a4 | 2943 | |
2944 | for (Int_t jui = 0; jui < (Int_t) vector2->GetEntriesFast(); jui++) { | |
2945 | // Search if already found | |
2946 | Int_t place = SearchInTreeVector(vectorplace,((AliTRDPlace *) vector2->At(jui))->GetPlace()); | |
2947 | // Create a new element in the two std vectors | |
2948 | if (place == -1) { | |
2949 | AliTRDPlace *placejjui = new AliTRDPlace(); | |
2950 | placejjui->SetPlace((j+jui)); | |
2951 | TObjArray *chainplace = new TObjArray(); | |
2952 | chainplace->Add((TObject *) placejjui); | |
2953 | vectorplace->Add((TObject *) (vector2->At(jui))); | |
2954 | where->Add((TObject *) chainplace); | |
2955 | } | |
2956 | // Update the element at the place "place" in the std vector whereinthechain | |
77566f2a | 2957 | else { |
8ec526a4 | 2958 | AliTRDPlace *placejjui = new AliTRDPlace(); |
2959 | placejjui->SetPlace((j+jui)); | |
2960 | TObjArray *chainplace = ((TObjArray *) where->At(place)); | |
2961 | chainplace->Add((TObject *) placejjui); | |
2962 | where->AddAt((TObject *) chainplace,place); | |
77566f2a | 2963 | } |
2964 | } | |
8ec526a4 | 2965 | |
2966 | // Add to the Chain | |
77566f2a | 2967 | treeChain->Add(filename2); |
2968 | delete file2; | |
77566f2a | 2969 | |
8ec526a4 | 2970 | // Take care of the profile |
2971 | const Char_t *pattern = "P"; | |
77566f2a | 2972 | TTree *tree = 0x0; |
2973 | ||
8ec526a4 | 2974 | if (!strstr(variablecali,pattern)) { |
2975 | ||
2976 | // Ready to read the chain | |
77566f2a | 2977 | TH1F *his = 0x0; |
2978 | treeChain->SetBranchAddress("histo",&his); | |
8ec526a4 | 2979 | |
2980 | // Initialise the final tree | |
2981 | Int_t group = -1; | |
77566f2a | 2982 | TH1F *histsum = 0x0; |
2983 | ||
2984 | tree = new TTree(variablecali,variablecali); | |
2985 | tree->Branch("groupnumber",&group,"groupnumber/I"); | |
2986 | tree->Branch("histo","TH1F",&histsum,32000,0); | |
8ec526a4 | 2987 | |
2988 | // Init histsum | |
2989 | if (treeChain->GetEntries() < 1) { | |
2990 | return tree1; | |
2991 | } | |
77566f2a | 2992 | |
8ec526a4 | 2993 | for (Int_t h = 0; h < (Int_t) vectorplace->GetEntriesFast(); h++) { |
2994 | group = ((AliTRDPlace *) vectorplace->At(h))->GetPlace(); | |
2995 | TObjArray *chainplace = ((TObjArray *) where->At(h)); | |
2996 | treeChain->GetEntry(((AliTRDPlace *) chainplace->At(0))->GetPlace()); | |
77566f2a | 2997 | //Init for the first time |
8ec526a4 | 2998 | if (h == 0) { |
2999 | histsum = new TH1F("","",his->GetXaxis()->GetNbins() | |
3000 | ,his->GetXaxis()->GetBinLowEdge(1) | |
3001 | ,his->GetXaxis()->GetBinUpEdge(his->GetXaxis()->GetNbins())); | |
3002 | histsum->Sumw2(); | |
77566f2a | 3003 | } |
8ec526a4 | 3004 | // Reset for each new group |
77566f2a | 3005 | histsum->SetEntries(0.0); |
8ec526a4 | 3006 | for (Int_t l = 0; l <= histsum->GetXaxis()->GetNbins(); l++) { |
77566f2a | 3007 | histsum->SetBinContent(l,0.0); |
3008 | histsum->SetBinError(l,0.0); | |
3009 | } | |
3010 | histsum->Add(his,1); | |
8ec526a4 | 3011 | if ((Int_t) chainplace->GetEntriesFast() > 1) { |
3012 | for (Int_t s = 1; s < (Int_t) chainplace->GetEntriesFast(); s++) { | |
3013 | treeChain->GetEntry(((AliTRDPlace *) chainplace->At(s))->GetPlace()); | |
77566f2a | 3014 | histsum->Add(his,1); |
3015 | } | |
3016 | } | |
3017 | tree->Fill(); | |
3018 | } | |
8ec526a4 | 3019 | |
77566f2a | 3020 | } |
8ec526a4 | 3021 | else { |
3022 | ||
3023 | // Ready to read the chain | |
77566f2a | 3024 | TGraphErrors *his = 0x0; |
3025 | treeChain->SetBranchAddress("histo",&his); | |
3026 | ||
8ec526a4 | 3027 | // Initialise the final tree |
3028 | Int_t group = -1; | |
77566f2a | 3029 | TGraphErrors *histsum = 0x0; |
8ec526a4 | 3030 | Double_t *xref = 0x0; |
77566f2a | 3031 | |
3032 | tree = new TTree(variablecali,variablecali); | |
3033 | tree->Branch("groupnumber",&group,"groupnumber/I"); | |
3034 | tree->Branch("histo","TGraphErrors",&histsum,32000,0); | |
8ec526a4 | 3035 | |
3036 | // Init histsum | |
3037 | if (treeChain->GetEntries() < 1) { | |
3038 | return tree1; | |
3039 | } | |
3040 | ||
3041 | for (Int_t h = 0; h < (Int_t) vectorplace->GetEntriesFast(); h++) { | |
3042 | ||
3043 | group = ((AliTRDPlace *) vectorplace->At(h))->GetPlace(); | |
3044 | TObjArray *chainplace = ((TObjArray *) where->At(h)); | |
3045 | treeChain->GetEntry(((AliTRDPlace *) chainplace->At(0))->GetPlace()); | |
77566f2a | 3046 | //Init or reset for a new group |
3047 | Int_t nbins = his->GetN(); | |
3048 | Double_t *x; | |
8ec526a4 | 3049 | x = new Double_t[nbins]; |
77566f2a | 3050 | xref = his->GetX(); |
3051 | Double_t *ex; | |
8ec526a4 | 3052 | ex = new Double_t[nbins]; |
77566f2a | 3053 | Double_t *y; |
8ec526a4 | 3054 | y = new Double_t[nbins]; |
77566f2a | 3055 | Double_t *ey; |
8ec526a4 | 3056 | ey = new Double_t[nbins]; |
3057 | ||
3058 | for (Int_t lo = 0; lo < nbins; lo++) { | |
3059 | x[lo] = xref[lo]; | |
77566f2a | 3060 | ex[lo] = 0.0; |
3061 | y[lo] = 0.0; | |
3062 | ey[lo] = 0.0; | |
3063 | } | |
3064 | delete histsum; | |
3065 | histsum = new TGraphErrors(nbins,x,y,ex,ey); | |
8ec526a4 | 3066 | |
3067 | // Add the first | |
77566f2a | 3068 | histsum = AddProfiles(his,histsum); |
8ec526a4 | 3069 | if ((Int_t) chainplace->GetEntriesFast() > 1) { |
3070 | for (Int_t s = 1; s < (Int_t) chainplace->GetEntriesFast(); s++) { | |
3071 | treeChain->GetEntry(((AliTRDPlace *) chainplace->At(s))->GetPlace()); | |
77566f2a | 3072 | histsum = AddProfiles(his,histsum); |
3073 | } | |
3074 | } | |
8ec526a4 | 3075 | |
77566f2a | 3076 | tree->Fill(); |
8ec526a4 | 3077 | |
77566f2a | 3078 | } |
8ec526a4 | 3079 | |
77566f2a | 3080 | } |
8ec526a4 | 3081 | |
77566f2a | 3082 | return tree; |
8ec526a4 | 3083 | |
77566f2a | 3084 | } |
77566f2a | 3085 | |
8ec526a4 | 3086 | //____________Function fill 2D for the moment out of the code__________________ |
77566f2a | 3087 | |
8ec526a4 | 3088 | //____________Function fill 2D all objects from digits_________________________ |
3089 | Bool_t AliTRDCalibra::Create2DDiSimOnline(Int_t iev1, Int_t iev2) | |
77566f2a | 3090 | { |
3091 | // | |
8ec526a4 | 3092 | // Only for simulations, after the simulation, create the 2D histos |
3093 | // from the digits stored in the file "TRD.Digits.root" | |
77566f2a | 3094 | // Only for CH and PH |
3095 | // | |
77566f2a | 3096 | |
8ec526a4 | 3097 | const Int_t kNplan = 6; |
3098 | const Int_t kNcham = 5; | |
77566f2a | 3099 | |
8ec526a4 | 3100 | // RunLoader and so on |
77566f2a | 3101 | if (gAlice) { |
3102 | delete gAlice->GetRunLoader(); | |
3103 | delete gAlice; | |
8ec526a4 | 3104 | gAlice = 0; |
77566f2a | 3105 | } |
77566f2a | 3106 | |
8ec526a4 | 3107 | AliRunLoader *rl = AliRunLoader::Open("galice.root"); |
77566f2a | 3108 | if (!rl) { |
3109 | return kFALSE; | |
3110 | } | |
8ec526a4 | 3111 | |
77566f2a | 3112 | rl->LoadgAlice(); |
3113 | gAlice = rl->GetAliRun(); | |
3114 | if (!gAlice) { | |
3115 | return kFALSE; | |
3116 | } | |
3117 | ||
3118 | // Import the Trees for the event nEvent in the file | |
3119 | rl->LoadKinematics(); | |
3120 | rl->GetEvent(0); | |
3121 | rl->LoadHeader(); | |
3122 | ||
8ec526a4 | 3123 | AliLoader *loader = rl->GetLoader("TRDLoader"); |
77566f2a | 3124 | if (!loader) { |
3125 | AliInfo("No TRDLLoader found!"); | |
3126 | return kFALSE; | |
3127 | } | |
3128 | ||
3129 | // Get the pointer to the TRD detector | |
3130 | AliTRD *trd = (AliTRD *) gAlice->GetDetector("TRD"); | |
3131 | if (!trd) { | |
3132 | AliInfo("No TRD detector found"); | |
3133 | return kFALSE; | |
3134 | } | |
8ec526a4 | 3135 | |
77566f2a | 3136 | // Get the pointer to the geometry object |
3137 | AliTRDgeometry *geo; | |
3138 | if (trd) { | |
3139 | geo = trd->GetGeometry(); | |
3140 | } | |
3141 | else { | |
3142 | AliInfo("No TRD geometry found"); | |
3143 | return kFALSE; | |
3144 | } | |
3145 | ||
8ec526a4 | 3146 | // DB Setting |
77566f2a | 3147 | AliCDBManager *man = AliCDBManager::Instance(); |
3148 | if (!man) { | |
3149 | AliInfo("Could not get CDB Manager"); | |
3150 | return kFALSE; | |
3151 | } | |
3152 | ||
77566f2a | 3153 | // Get the parameter object |
3154 | AliTRDCommonParam *parCom = AliTRDCommonParam::Instance(); | |
3155 | if (!parCom) { | |
3156 | AliInfo("Could not get CommonParam"); | |
3157 | return kFALSE; | |
3158 | } | |
3159 | AliTRDcalibDB *cal = AliTRDcalibDB::Instance(); | |
3160 | if (!cal) { | |
3161 | AliInfo("Could not get calibDB"); | |
3162 | return kFALSE; | |
3163 | } | |
3164 | ||
8ec526a4 | 3165 | // Some parameters |
3166 | fTimeMax = cal->GetNumberOfTimeBins(); | |
b43a3e17 | 3167 | fSf = (Float_t) parCom->GetSamplingFrequency(); |
8ec526a4 | 3168 | if (fRelativeScaleAuto) { |
3169 | fRelativeScale = 0; | |
3170 | } | |
3171 | else { | |
3172 | if (fRelativeScale <= 0.0) { | |
3173 | AliInfo("You have to set the relativescale factor per hand!"); | |
3174 | return kFALSE; | |
3175 | } | |
3176 | } | |
77566f2a | 3177 | |
8ec526a4 | 3178 | // Create the 2D histos corresponding to the pad group calibration mode |
3179 | if (fCH2dOn) { | |
77566f2a | 3180 | |
8ec526a4 | 3181 | AliInfo(Form("We will fill the CH2d histo with the pad calibration mode: Nz %d, and Nrphi %d" |
3182 | ,fNz[0] | |
3183 | ,fNrphi[0])); | |
77566f2a | 3184 | |
8ec526a4 | 3185 | // Calcul the number of Xbins |
3186 | fNtotal[0] = 0; | |
77566f2a | 3187 | ModePadCalibration(2,0); |
3188 | ModePadFragmentation(0,2,0,0); | |
8ec526a4 | 3189 | fDetChamb2[0] = fNfragZ[0] * fNfragRphi[0]; |
3190 | fNtotal[0] += 6 * 18 * fDetChamb2[0]; | |
77566f2a | 3191 | ModePadCalibration(0,0); |
3192 | ModePadFragmentation(0,0,0,0); | |
8ec526a4 | 3193 | fDetChamb0[0] = fNfragZ[0] * fNfragRphi[0]; |
3194 | fNtotal[0] += 6 * 4 * 18 * fDetChamb0[0]; | |
3195 | AliInfo(Form("Total number of Xbins: %d",fNtotal[0])); | |
3196 | ||
3197 | // Create the 2D histo | |
3198 | if (fHisto2d) { | |
3199 | CreateCH2d(fNtotal[0]); | |
3200 | } | |
3201 | if (fVector2d) { | |
3202 | fVectorCH = new TObjArray(); | |
3203 | fPlaCH = new TObjArray(); | |
3204 | } | |
77566f2a | 3205 | |
3206 | } | |
3207 | ||
8ec526a4 | 3208 | if (fPH2dOn) { |
3209 | ||
3210 | AliInfo(Form("We will fill the PH2d histo with the pad calibration mode: Nz %d, and Nrphi %d" | |
3211 | ,fNz[1] | |
3212 | ,fNrphi[1])); | |
77566f2a | 3213 | |
8ec526a4 | 3214 | // Calcul the number of Xbins |
3215 | fNtotal[1] = 0; | |
77566f2a | 3216 | ModePadCalibration(2,1); |
3217 | ModePadFragmentation(0,2,0,1); | |
8ec526a4 | 3218 | fDetChamb2[1] = fNfragZ[1] * fNfragRphi[1]; |
3219 | fNtotal[1] += 6 * 18 * fDetChamb2[1]; | |
77566f2a | 3220 | ModePadCalibration(0,1); |
3221 | ModePadFragmentation(0,0,0,1); | |
8ec526a4 | 3222 | fDetChamb0[1] = fNfragZ[1] * fNfragRphi[1]; |
3223 | fNtotal[1] += 6 * 4 * 18 * fDetChamb0[1]; | |
3224 | AliInfo(Form("Total number of Xbins: %d",fNtotal[1])); | |
77566f2a | 3225 | |
8ec526a4 | 3226 | // Create the 2D histo |
3227 | if (fHisto2d) { | |
3228 | CreatePH2d(fNtotal[1]); | |
3229 | } | |
3230 | if (fVector2d) { | |
3231 | fVectorPH = new TObjArray(); | |
3232 | fPlaPH = new TObjArray(); | |
3233 | } | |
77566f2a | 3234 | |
3235 | } | |
3236 | ||
3237 | loader->LoadDigits(); | |
3238 | AliInfo("LoadDigits "); | |
3239 | AliTRDdigitsManager *digitsManager = new AliTRDdigitsManager(); | |
77566f2a | 3240 | |
8ec526a4 | 3241 | //iev2 egal to the max if 0 |
3242 | if (iev2 == 0) { | |
3243 | iev2 = rl->GetNumberOfEvents(); | |
3244 | AliInfo(Form("Total number of events: %d",iev2)); | |
3245 | } | |
3246 | ||
3247 | // Loop on event | |
77566f2a | 3248 | for (Int_t ievent = iev1; ievent < iev2; ievent++) { |
3249 | AliInfo(Form("Process event %d",ievent)); | |
3250 | rl->GetEvent(ievent); | |
8ec526a4 | 3251 | if (!loader->TreeD()) { |
77566f2a | 3252 | AliInfo("loader Loading Digits ... "); |
3253 | loader->LoadDigits(); | |
3254 | } | |
3255 | digitsManager->ReadDigits(loader->TreeD()); | |
3256 | AliInfo("digitsManager Read Digits Done"); | |
3257 | // Read the digits from the file | |
3258 | if (!(digitsManager->ReadDigits(loader->TreeD()))) { | |
3259 | return kFALSE; | |
3260 | } | |
3261 | ||
8ec526a4 | 3262 | // Loop on detector |
3263 | for (Int_t iSect = 0; iSect < 18; iSect++) { | |
3264 | for (Int_t iChamb = 0; iChamb < kNcham; iChamb++) { | |
3265 | for (Int_t iPlane = 0; iPlane < kNplan; iPlane++) { | |
77566f2a | 3266 | |
8ec526a4 | 3267 | // A little geometry: |
77566f2a | 3268 | Int_t iDet = geo->GetDetector(iPlane,iChamb,iSect); |
3269 | Int_t rowMax = parCom->GetRowMax(iPlane,iChamb,iSect); | |
3270 | Int_t colMax = parCom->GetColMax(iPlane); | |
3271 | ||
8ec526a4 | 3272 | // Variables for the group |
3273 | LocalisationDetectorXbins(iDet); | |
3274 | ||
3275 | // In the cas of charge | |
77566f2a | 3276 | Float_t *amptotal; |
8ec526a4 | 3277 | amptotal = new Float_t[fNfragRphi[0]*fNfragZ[0]]; |
3278 | if (fCH2dOn) { | |
3279 | for (Int_t k = 0; k < fNfragRphi[0]*fNfragZ[0]; k++) { | |
77566f2a | 3280 | amptotal[k] = 0.0; |
3281 | } | |
3282 | } | |
3283 | ||
8ec526a4 | 3284 | // Loop through the detector pixel |
77566f2a | 3285 | for (Int_t time = 0; time < fTimeMax; time++) { |
3286 | for (Int_t col = 0; col < colMax; col++) { | |
3287 | for (Int_t row = 0; row < rowMax; row++) { | |
77566f2a | 3288 | |
8ec526a4 | 3289 | // Amplitude and position in pad group |
3290 | AliTRDdigit *digit = digitsManager->GetDigit(row,col,time,iDet); | |
3291 | Int_t amp = digit->GetAmp(); | |
3292 | Int_t posr[2] = {0,0}; | |
3293 | Int_t posc[2] = {0,0}; | |
3294 | if ((fCH2dOn) && | |
3295 | (fNnZ[0] != 0)) { | |
3296 | posr[0] = (Int_t) row / fNnZ[0]; | |
3297 | } | |
3298 | if ((fCH2dOn) && | |
3299 | (fNnRphi[0] != 0)) { | |
3300 | posc[0] = (Int_t) col / fNnRphi[0]; | |
3301 | } | |
3302 | if ((fPH2dOn) && | |
3303 | (fNnZ[1] != 0)) { | |
3304 | posr[1] = (Int_t) row / fNnZ[1]; | |
3305 | } | |
3306 | if ((fPH2dOn) && | |
3307 | (fNnRphi[1] != 0)) { | |
3308 | posc[1] = (Int_t) col / fNnRphi[1]; | |
3309 | } | |
77566f2a | 3310 | |
77566f2a | 3311 | // Total spectrum |
8ec526a4 | 3312 | if (fCH2dOn) { |
3313 | if (amp < fThresholdDigit) { | |
3314 | amp = 0; | |
3315 | } | |
3316 | amptotal[(Int_t) (posc[0]*fNfragZ[0]+posr[0])] += amp; | |
77566f2a | 3317 | } |
8ec526a4 | 3318 | if (fPH2dOn) { |
3319 | if (fHisto2d) { | |
3320 | fPH2d->Fill((fXbins[1]+posc[1]*fNfragZ[1]+posr[1])+0.5,(Float_t) time/fSf,(Double_t) amp); | |
3321 | } | |
3322 | if (fVector2d) { | |
3323 | UpdateVectorPH((fXbins[1]+posc[1]*fNfragZ[1]+posr[1]),time,(Double_t) amp); | |
3324 | } | |
77566f2a | 3325 | } |
8ec526a4 | 3326 | |
3327 | // Memory stuff | |
77566f2a | 3328 | delete digit; |
77566f2a | 3329 | |
8ec526a4 | 3330 | } // Boucle row |
3331 | } // Boucle col | |
3332 | } // Boucle time | |
3333 | ||
3334 | if (fCH2dOn) { | |
77566f2a | 3335 | |
8ec526a4 | 3336 | // If automatic scale |
3337 | if ((fCountRelativeScale < 100) && (fRelativeScaleAuto)) { | |
3338 | // Take only the one zone track | |
3339 | for (Int_t k = 0; k < fNfragZ[0]*fNfragRphi[0]; k++) { | |
3340 | if ((fCountRelativeScale < 100) && (amptotal[k] > 2.0)) { | |
3341 | fRelativeScale += amptotal[k]*0.014*0.01; | |
3342 | fCountRelativeScale++; | |
3343 | } | |
3344 | } | |
3345 | } | |
3346 | ||
3347 | // We fill the CH2d after having scale with the first 100 | |
3348 | if ((fCountRelativeScale >= 100) && (fRelativeScaleAuto)) { | |
3349 | // Case of | |
3350 | for (Int_t k = 0; k < fNfragZ[0]*fNfragRphi[0]; k++) { | |
3351 | if (fHisto2d && | |
3352 | (amptotal[k] > 0.0)) { | |
3353 | fCH2d->Fill(fXbins[0]+k+0.5,amptotal[k]/fRelativeScale); | |
3354 | } | |
3355 | if (fVector2d && | |
3356 | (amptotal[k] > 0.0)) { | |
3357 | UpdateVectorCH(fXbins[0]+k ,amptotal[k]/fRelativeScale); | |
3358 | } | |
3359 | } | |
77566f2a | 3360 | } |
77566f2a | 3361 | |
8ec526a4 | 3362 | // No relative salce |
3363 | if (!fRelativeScaleAuto) { | |
3364 | for (Int_t k = 0; k < fNfragZ[0]*fNfragRphi[0]; k++) { | |
3365 | if (fHisto2d && | |
3366 | (amptotal[k] > 0.0)) { | |
3367 | fCH2d->Fill(fXbins[0]+k+0.5, amptotal[k]/fRelativeScale); | |
3368 | } | |
3369 | if (fVector2d && | |
3370 | (amptotal[k] > 0.0)) { | |
3371 | UpdateVectorCH(fXbins[0]+k, amptotal[k]/fRelativeScale); | |
3372 | } | |
3373 | } | |
3374 | } | |
77566f2a | 3375 | |
8ec526a4 | 3376 | } |
3377 | ||
3378 | delete amptotal; | |
77566f2a | 3379 | |
8ec526a4 | 3380 | } // Boucle chamber |
3381 | } // Boucle plane | |
3382 | } // Boucle sect | |
77566f2a | 3383 | |
3384 | loader->UnloadDigits(); | |
3385 | ||
8ec526a4 | 3386 | } // Boucle event |
77566f2a | 3387 | |
8ec526a4 | 3388 | if (fDebug == 1) { |
3389 | if (fPH2dOn && fHisto2d) { | |
3390 | PlotPH2d(); | |
3391 | } | |
3392 | if (fCH2dOn && fHisto2d) { | |
3393 | PlotCH2d(); | |
3394 | } | |
77566f2a | 3395 | } |
3396 | ||
8ec526a4 | 3397 | if (fWrite[0] || fWrite[1]) { |
77566f2a | 3398 | |
8ec526a4 | 3399 | TFile *fout = TFile::Open(fWriteName,"RECREATE"); |
3400 | // Check if the file could be opened | |
77566f2a | 3401 | if (!fout || !fout->IsOpen()) { |
3402 | AliInfo("<No File found!"); | |
3403 | return kFALSE; | |
3404 | } | |
77566f2a | 3405 | |
8ec526a4 | 3406 | if (fCH2dOn && fHisto2d && fWrite[0]) { |
3407 | fout->WriteTObject(fCH2d); | |
3408 | } | |
3409 | if (fPH2dOn && fHisto2d && fWrite[1]) { | |
3410 | fout->WriteTObject(fPH2d); | |
3411 | } | |
77566f2a | 3412 | |
8ec526a4 | 3413 | if (fVector2d && fCH2dOn && fWrite[0]) { |
3414 | TString name("Nz"); | |
3415 | name += fNz[0]; | |
3416 | name += "Nrphi"; | |
3417 | name += fNrphi[0]; | |
3418 | TTree *treeCH2d = ConvertVectorCTTreeHisto(fVectorCH,fPlaCH,"treeCH2d",(const char *) name); | |
77566f2a | 3419 | fout->WriteTObject(treeCH2d); |
3420 | } | |
3421 | ||
8ec526a4 | 3422 | if (fVector2d && fPH2dOn && fWrite[1]) { |
3423 | TString name("Nz"); | |
3424 | name += fNz[1]; | |
3425 | name += "Nrphi"; | |
3426 | name += fNrphi[1]; | |
3427 | TTree *treePH2d = ConvertVectorPTreeHisto(fVectorPH,fPlaPH,"treePH2d",(const char *) name); | |
77566f2a | 3428 | fout->WriteTObject(treePH2d); |
3429 | } | |
8ec526a4 | 3430 | |
3431 | fout->Close(); | |
3432 | ||
77566f2a | 3433 | } |
3434 | ||
3435 | return kTRUE; | |
3436 | ||
3437 | } | |
77566f2a | 3438 | |
8ec526a4 | 3439 | //____________Function fill 2D all objects from Raw Data_______________________ |
77566f2a | 3440 | Bool_t AliTRDCalibra::Create2DRaDaOnline(Int_t iev1, Int_t iev2) |
3441 | { | |
3442 | // | |
8ec526a4 | 3443 | // After having written the RAW DATA in the current directory, create the |
3444 | // 2D histos from these RAW DATA | |
77566f2a | 3445 | // Only for CH and PH |
3446 | // | |
3447 | ||
8ec526a4 | 3448 | const Int_t kNplan = 6; |
3449 | const Int_t kNcham = 5; | |
77566f2a | 3450 | TString dirname("."); |
3451 | ||
8ec526a4 | 3452 | // DB Setting |
77566f2a | 3453 | AliCDBManager *man = AliCDBManager::Instance(); |
3454 | if (!man) { | |
3455 | AliInfo("Could not get CDB Manager"); | |
3456 | return kFALSE; | |
3457 | } | |
8ec526a4 | 3458 | |
77566f2a | 3459 | // Get the parameter object |
3460 | AliTRDCommonParam *parCom = AliTRDCommonParam::Instance(); | |
3461 | if (!parCom) { | |
3462 | AliInfo("Could not get CommonParam"); | |
3463 | return kFALSE; | |
3464 | } | |
8ec526a4 | 3465 | |
77566f2a | 3466 | AliTRDcalibDB *cal = AliTRDcalibDB::Instance(); |
3467 | if (!cal) { | |
3468 | AliInfo("Could not get calibDB"); | |
3469 | return kFALSE; | |
3470 | } | |
3471 | ||
77566f2a | 3472 | // Some parameters |
8ec526a4 | 3473 | fTimeMax = cal->GetNumberOfTimeBins(); |
b43a3e17 | 3474 | fSf = (Float_t) parCom->GetSamplingFrequency(); |
8ec526a4 | 3475 | if (fRelativeScaleAuto) { |
3476 | fRelativeScale = 0; | |
3477 | } | |
3478 | else { | |
3479 | if (fRelativeScale <= 0.0) { | |
3480 | AliInfo("You have to set the relativescale factor per hand!"); | |
3481 | return kFALSE; | |
3482 | } | |
3483 | } | |
77566f2a | 3484 | |
8ec526a4 | 3485 | // Create the 2D histo corresponding to the pad group calibration mode |
3486 | if (fCH2dOn) { | |
77566f2a | 3487 | |
8ec526a4 | 3488 | AliInfo(Form("We will fill the CH2d histo with the pad calibration mode: Nz %d, and Nrphi %d" |
3489 | ,fNz[0] | |
3490 | ,fNrphi[0])); | |
77566f2a | 3491 | |
8ec526a4 | 3492 | // Calcul the number of Xbins |
3493 | fNtotal[0] = 0; | |
77566f2a | 3494 | ModePadCalibration(2,0); |
3495 | ModePadFragmentation(0,2,0,0); | |
8ec526a4 | 3496 | fDetChamb2[0] = fNfragZ[0] * fNfragRphi[0]; |
3497 | fNtotal[0] += 6 * 18 * fDetChamb2[0]; | |
77566f2a | 3498 | ModePadCalibration(0,0); |
3499 | ModePadFragmentation(0,0,0,0); | |
8ec526a4 | 3500 | fDetChamb0[0] = fNfragZ[0] * fNfragRphi[0]; |
3501 | fNtotal[0] += 6 * 4 * 18 * fDetChamb0[0]; | |
3502 | AliInfo(Form("Total number of Xbins: %d",fNtotal[0])); | |
77566f2a | 3503 | |
8ec526a4 | 3504 | // Create the 2D histo |
3505 | if (fHisto2d) { | |
3506 | CreateCH2d(fNtotal[0]); | |
3507 | } | |
3508 | if (fVector2d) { | |
3509 | fVectorCH = new TObjArray(); | |
3510 | fPlaCH = new TObjArray(); | |
3511 | } | |
3512 | ||
77566f2a | 3513 | } |
3514 | ||
3515 | if(fPH2dOn) { | |
8ec526a4 | 3516 | |
3517 | AliInfo(Form("We will fill the PH2d histo with the pad calibration mode: Nz %d, and Nrphi %d" | |
3518 | ,fNz[1] | |
3519 | ,fNrphi[1])); | |
77566f2a | 3520 | |
8ec526a4 | 3521 | // Calcul the number of Xbins |
3522 | fNtotal[1] = 0; | |
77566f2a | 3523 | ModePadCalibration(2,1); |
3524 | ModePadFragmentation(0,2,0,1); | |
8ec526a4 | 3525 | fDetChamb2[1] = fNfragZ[1] * fNfragRphi[1]; |
3526 | fNtotal[1] += 6 * 18 * fDetChamb2[1]; | |
77566f2a | 3527 | ModePadCalibration(0,1); |
3528 | ModePadFragmentation(0,0,0,1); | |
8ec526a4 | 3529 | fDetChamb0[1] = fNfragZ[1] * fNfragRphi[1]; |
3530 | fNtotal[1] += 6 * 4 * 18 * fDetChamb0[1]; | |
3531 | AliInfo(Form("Total number of Xbins: %d",fNtotal[1])); | |
77566f2a | 3532 | |
8ec526a4 | 3533 | // Create the 2D histo |
3534 | if (fHisto2d) { | |
3535 | CreatePH2d(fNtotal[1]); | |
3536 | } | |
3537 | if (fVector2d){ | |
3538 | fVectorPH = new TObjArray(); | |
3539 | fPlaPH = new TObjArray(); | |
3540 | } | |
77566f2a | 3541 | |
3542 | } | |
77566f2a | 3543 | |
3544 | AliTRDrawData *rawdata = new AliTRDrawData(); | |
3545 | AliInfo("AliTRDrawData object created "); | |
3546 | ||
8ec526a4 | 3547 | // Loop on events |
77566f2a | 3548 | for (Int_t ievent = iev1; ievent < iev2; ievent++) { |
77566f2a | 3549 | |
8ec526a4 | 3550 | // AliRawReaderFile |
77566f2a | 3551 | AliRawReaderFile *readerfile = new AliRawReaderFile(dirname,ievent); |
8ec526a4 | 3552 | if (!readerfile) { |
77566f2a | 3553 | AliInfo("No readerfile found!"); |
3554 | return kFALSE; | |
3555 | } | |
3556 | ||
77566f2a | 3557 | AliTRDdigitsManager *digitsManager = rawdata->Raw2Digits((AliRawReader *) readerfile); |
8ec526a4 | 3558 | if (!digitsManager) { |
77566f2a | 3559 | AliInfo("No DigitsManager done!"); |
3560 | return kFALSE; | |
3561 | } | |
3562 | ||
8ec526a4 | 3563 | // Loop on detectors |
3564 | for (Int_t iSect = 0; iSect < 18; iSect++) { | |
3565 | for (Int_t iPlane = 0; iPlane < kNplan; iPlane++) { | |
3566 | for (Int_t iChamb = 0; iChamb < kNcham; iChamb++) { | |
77566f2a | 3567 | |
8ec526a4 | 3568 | // A little geometry: |
77566f2a | 3569 | Int_t iDet = AliTRDgeometry::GetDetector(iPlane,iChamb,iSect); |
3570 | Int_t rowMax = parCom->GetRowMax(iPlane,iChamb,iSect); | |
3571 | Int_t colMax = parCom->GetColMax(iPlane); | |
3572 | ||
8ec526a4 | 3573 | // Variables for the group |
3574 | LocalisationDetectorXbins(iDet); | |
3575 | ||
3576 | // In the cas of charge | |
77566f2a | 3577 | Float_t *amptotal; |
8ec526a4 | 3578 | amptotal = new Float_t[fNfragRphi[0]*fNfragZ[0]]; |
3579 | if(fCH2dOn) { | |
3580 | for (Int_t k = 0; k < fNfragRphi[0]*fNfragZ[0]; k++) { | |
77566f2a | 3581 | amptotal[k] = 0.0; |
3582 | } | |
3583 | } | |
8ec526a4 | 3584 | |
3585 | // Loop through the detector pixel | |
77566f2a | 3586 | for (Int_t time = 0; time < fTimeMax; time++) { |
3587 | for (Int_t col = 0; col < colMax; col++) { | |
3588 | for (Int_t row = 0; row < rowMax; row++) { | |
3589 | ||
8ec526a4 | 3590 | // Amplitude and position of the digit |
3591 | AliTRDdigit *digit = digitsManager->GetDigit(row,col,time,iDet); | |
3592 | Int_t amp = digit->GetAmp(); | |
3593 | Int_t posr[2] = { 0, 0 }; | |
3594 | Int_t posc[2] = { 0, 0 }; | |
3595 | if ((fCH2dOn) && | |
3596 | (fNnZ[0] != 0)) { | |
3597 | posr[0] = (Int_t) row / fNnZ[0]; | |
3598 | } | |
3599 | if ((fCH2dOn) && | |
3600 | (fNnRphi[0] != 0)) { | |
3601 | posc[0] = (Int_t) col / fNnRphi[0]; | |
3602 | } | |
3603 | if ((fPH2dOn) && | |
3604 | (fNnZ[1] != 0)) { | |
3605 | posr[1] = (Int_t) row / fNnZ[1]; | |
3606 | } | |
3607 | if ((fPH2dOn) && | |
3608 | (fNnRphi[1] != 0)) { | |
3609 | posc[1] = (Int_t) col / fNnRphi[1]; | |
3610 | } | |
77566f2a | 3611 | |
3612 | // Total spectrum | |
8ec526a4 | 3613 | if (fCH2dOn) { |
3614 | if (amp < fThresholdDigit) { | |
3615 | amp = 0; | |
3616 | } | |
3617 | amptotal[(Int_t) (posc[0]*fNfragZ[0]+posr[0])] += amp; | |
77566f2a | 3618 | } |
3619 | ||
8ec526a4 | 3620 | if (fPH2dOn ) { |
3621 | if (fHisto2d) { | |
3622 | fPH2d->Fill((fXbins[1]+posc[1]*fNfragZ[1]+posr[1])+0.5,(Float_t)time/fSf,amp); | |
3623 | } | |
3624 | if (fVector2d) { | |
3625 | UpdateVectorPH(fXbins[1]+posc[1]*fNfragZ[1]+posr[1],time,amp); | |
3626 | } | |
3627 | } | |
77566f2a | 3628 | |
3629 | delete digit; | |
77566f2a | 3630 | |
8ec526a4 | 3631 | } // Boucle row |
3632 | } // Boucle col | |
3633 | } // Boucle time | |
77566f2a | 3634 | |
8ec526a4 | 3635 | if (fCH2dOn) { |
77566f2a | 3636 | |
8ec526a4 | 3637 | // If automatic scale |
3638 | if ((fCountRelativeScale < 100) && (fRelativeScaleAuto)) { | |
3639 | // Take only the one zone track | |
3640 | for (Int_t k = 0; k < fNfragZ[0]*fNfragRphi[0]; k++) { | |
3641 | if ((fCountRelativeScale < 100) && (amptotal[k] > 2.0)) { | |
3642 | fRelativeScale += amptotal[k] * 0.014 * 0.01; | |
3643 | fCountRelativeScale++; | |
3644 | } | |
3645 | } | |
3646 | } | |
3647 | ||
3648 | // We fill the CH2d after having scale with the first 100 | |
3649 | if ((fCountRelativeScale >= 100) && (fRelativeScaleAuto)) { | |
3650 | // Case of | |
3651 | for (Int_t k = 0; k < fNfragZ[0]*fNfragRphi[0]; k++) { | |
3652 | if (fHisto2d && (amptotal[k] > 0.0)) { | |
3653 | fCH2d->Fill(fXbins[0]+k+0.5,amptotal[k]/fRelativeScale); | |
3654 | } | |
3655 | if (fVector2d && (amptotal[k] > 0.0)) { | |
3656 | UpdateVectorCH(fXbins[0]+k, amptotal[k]/fRelativeScale); | |
3657 | } | |
3658 | } | |
3659 | } | |
3660 | ||
3661 | // No relative salce | |
3662 | if (!fRelativeScaleAuto) { | |
3663 | for (Int_t k = 0; k < fNfragZ[0]*fNfragRphi[0]; k++) { | |
3664 | if (fHisto2d && | |
3665 | (amptotal[k] > 0.0)) { | |
3666 | fCH2d->Fill(fXbins[0]+k+0.5,amptotal[k]/fRelativeScale); | |
3667 | } | |
3668 | if (fVector2d && | |
3669 | (amptotal[k] > 0.0)) { | |
3670 | UpdateVectorCH(fXbins[0]+k, amptotal[k]/fRelativeScale); | |
3671 | } | |
3672 | } | |
77566f2a | 3673 | } |
77566f2a | 3674 | |
8ec526a4 | 3675 | } |
3676 | ||
77566f2a | 3677 | delete amptotal; |
3678 | ||
8ec526a4 | 3679 | } // Boucle chamber |
3680 | } // Boucle plane | |
3681 | } // Boucle sect | |
77566f2a | 3682 | |
3683 | delete digitsManager; | |
3684 | delete readerfile; | |
77566f2a | 3685 | |
8ec526a4 | 3686 | } // Boucle event |
3687 | ||
3688 | if (fDebug == 1) { | |
3689 | if (fPH2dOn && fHisto2d) { | |
3690 | PlotPH2d(); | |
3691 | } | |
3692 | if (fCH2dOn && fHisto2d) { | |
3693 | PlotCH2d(); | |
3694 | } | |
77566f2a | 3695 | } |
3696 | ||
8ec526a4 | 3697 | if (fWrite[0] || fWrite[1]) { |
77566f2a | 3698 | |
3699 | TFile *fout = TFile::Open(fWriteName,"UPDATE"); | |
8ec526a4 | 3700 | // Check if the file could be opened |
77566f2a | 3701 | if (!fout || !fout->IsOpen()) { |
3702 | AliInfo("<No File found!"); | |
3703 | return kFALSE; | |
3704 | } | |
77566f2a | 3705 | |
8ec526a4 | 3706 | if (fCH2dOn && fHisto2d && fWrite[0]) { |
3707 | fout->WriteTObject(fCH2d); | |
3708 | } | |
3709 | if (fPH2dOn && fHisto2d && fWrite[1]) { | |
3710 | fout->WriteTObject(fPH2d); | |
3711 | } | |
77566f2a | 3712 | |
8ec526a4 | 3713 | if (fVector2d && fCH2dOn && fWrite[0]) { |
3714 | TString name("Nz"); | |
3715 | name += fNz[0]; | |
3716 | name += "Nrphi"; | |
3717 | name += fNrphi[0]; | |
3718 | TTree *treeCH2d = ConvertVectorCTTreeHisto(fVectorCH,fPlaCH,"treeCH2d",(const Char_t *) name); | |
77566f2a | 3719 | fout->WriteTObject(treeCH2d); |
3720 | } | |
3721 | ||
8ec526a4 | 3722 | if (fVector2d && fPH2dOn && fWrite[1]) { |
3723 | TString name("Nz"); | |
3724 | name += fNz[1]; | |
3725 | name += "Nrphi"; | |
3726 | name += fNrphi[1]; | |
3727 | TTree *treePH2d = ConvertVectorPTreeHisto(fVectorPH,fPlaPH,"treePH2d",(const Char_t *) name); | |
77566f2a | 3728 | fout->WriteTObject(treePH2d); |
3729 | } | |
3730 | ||
3731 | } | |
3732 | ||
3733 | return kTRUE; | |
3734 | ||
3735 | } | |
77566f2a | 3736 | |
8ec526a4 | 3737 | //____________Pad Calibration Public___________________________________________ |
3738 | ||
3739 | //____________Define the number of pads per group for one detector and one calibration | |
77566f2a | 3740 | void AliTRDCalibra::ModePadCalibration(Int_t iChamb, Int_t i) |
3741 | { | |
3742 | // | |
3743 | // Definition of the calibration mode | |
3744 | // from Nz and Nrphi, the number of row and col pads per calibration groups are setted | |
3745 | // | |
3746 | ||
3747 | ||
8ec526a4 | 3748 | fNnZ[i] = 0; |
3749 | fNnRphi[i] = 0; | |
77566f2a | 3750 | |
8ec526a4 | 3751 | if ((fNz[i] == 0) && (iChamb == 2)) { |
3752 | fNnZ[i] = 12; | |
77566f2a | 3753 | } |
8ec526a4 | 3754 | if ((fNz[i] == 0) && (iChamb != 2)) { |
3755 | fNnZ[i] = 16; | |
77566f2a | 3756 | } |
8ec526a4 | 3757 | if ((fNz[i] == 1) && (iChamb == 2)) { |
3758 | fNnZ[i] = 6; | |
77566f2a | 3759 | } |
8ec526a4 | 3760 | if ((fNz[i] == 1) && (iChamb != 2)) { |
3761 | fNnZ[i] = 8; | |
77566f2a | 3762 | } |
8ec526a4 | 3763 | if ((fNz[i] == 2) && (iChamb == 2)) { |
3764 | fNnZ[i] = 3; | |
77566f2a | 3765 | } |
8ec526a4 | 3766 | if ((fNz[i] == 2) && (iChamb != 2)) { |
3767 | fNnZ[i] = 4; | |
77566f2a | 3768 | } |
8ec526a4 | 3769 | if (fNz[i] == 3) { |
3770 | fNnZ[i] = 2; | |
77566f2a | 3771 | } |
8ec526a4 | 3772 | if (fNz[i] == 4) { |
3773 | fNnZ[i] = 1; | |
77566f2a | 3774 | } |
3775 | ||
8ec526a4 | 3776 | if (fNrphi[i] == 0) { |
3777 | fNnRphi[i] = 144; | |
77566f2a | 3778 | } |
8ec526a4 | 3779 | if (fNrphi[i] == 1) { |
3780 | fNnRphi[i] = 72; | |
77566f2a | 3781 | } |
8ec526a4 | 3782 | if (fNrphi[i] == 2) { |
3783 | fNnRphi[i] = 36; | |
77566f2a | 3784 | } |
8ec526a4 | 3785 | if (fNrphi[i] == 3) { |
3786 | fNnRphi[i] = 18; | |
77566f2a | 3787 | } |
8ec526a4 | 3788 | if (fNrphi[i] == 4) { |
3789 | fNnRphi[i] = 9; | |
77566f2a | 3790 | } |
8ec526a4 | 3791 | if (fNrphi[i] == 5) { |
3792 | fNnRphi[i] = 4; | |
77566f2a | 3793 | } |
8ec526a4 | 3794 | if (fNrphi[i] == 6) { |
3795 | fNnRphi[i] = 1; | |
77566f2a | 3796 | } |
8ec526a4 | 3797 | |
77566f2a | 3798 | } |
8ec526a4 | 3799 | |
3800 | //____________Define the number of pad groups in one detector for one calibration | |
77566f2a | 3801 | Bool_t AliTRDCalibra::ModePadFragmentation(Int_t iPlane,Int_t iChamb, Int_t iSect, Int_t i) |
3802 | { | |
3803 | // | |
3804 | // Definition of the calibration mode | |
8ec526a4 | 3805 | // From the number of row and col pads per calibration groups the |
3806 | // number of calibration groups are setted | |
77566f2a | 3807 | // |
3808 | ||
8ec526a4 | 3809 | fNfragZ[i] = 0; |
3810 | fNfragRphi[i] = 0; | |
77566f2a | 3811 | |
3812 | AliTRDCommonParam *parCom = AliTRDCommonParam::Instance(); | |
3813 | if (!parCom) { | |
3814 | AliInfo("Could not get CommonParam Manager"); | |
3815 | return kFALSE; | |
3816 | } | |
3817 | ||
8ec526a4 | 3818 | // A little geometry: |
77566f2a | 3819 | Int_t rowMax = parCom->GetRowMax(iPlane,iChamb,iSect); |
3820 | Int_t colMax = parCom->GetColMax(iPlane); | |
3821 | ||
8ec526a4 | 3822 | // The fragmentation |
3823 | if (fNnZ[i] != 0) { | |
3824 | fNfragZ[i] = (Int_t) rowMax / fNnZ[i]; | |
3825 | } | |
77566f2a | 3826 | |
8ec526a4 | 3827 | if (fNnRphi[i] != 0) { |
3828 | fNfragRphi[i] = (Int_t) colMax / fNnRphi[i]; | |
3829 | } | |
77566f2a | 3830 | |
3831 | return kTRUE; | |
77566f2a | 3832 | |
8ec526a4 | 3833 | } |
77566f2a | 3834 | |
8ec526a4 | 3835 | //____________Protected Functions______________________________________________ |
3836 | //____________Create the 2D histo to be filled online__________________________ | |
3837 | // | |
77566f2a | 3838 | |
8ec526a4 | 3839 | //_____________________________________________________________________________ |
3840 | void AliTRDCalibra::CreatePRF2d(Int_t nn) | |
77566f2a | 3841 | { |
3842 | // | |
3843 | // Create the 2D histos | |
3844 | // | |
3845 | ||
8ec526a4 | 3846 | TString name("Nz"); |
3847 | name += fNz[2]; | |
3848 | name += "Nrphi"; | |
3849 | name += fNrphi[2]; | |
3850 | ||
3851 | fPRF2d = new TProfile2D("PRF2d",(const Char_t *) name | |
3852 | ,nn,0,nn,fNumberBinPRF,-1.0,1.0); | |
77566f2a | 3853 | fPRF2d->SetXTitle("Det/pad groups"); |
3854 | fPRF2d->SetYTitle("Position x/W [pad width units]"); | |
3855 | fPRF2d->SetZTitle("Q_{i}/Q_{total}"); | |
3856 | fPRF2d->SetStats(0); | |
77566f2a | 3857 | |
3858 | } | |
3859 | ||
8ec526a4 | 3860 | //_____________________________________________________________________________ |
3861 | void AliTRDCalibra::CreatePH2d(Int_t nn) | |
77566f2a | 3862 | { |
3863 | // | |
3864 | // Create the 2D histos | |
3865 | // | |
3866 | ||
8ec526a4 | 3867 | TString name("Nz"); |
3868 | name += fNz[1]; | |
3869 | name += "Nrphi"; | |
3870 | name += fNrphi[1]; | |
3871 | ||
3872 | fPH2d = new TProfile2D("PH2d",(const Char_t *) name | |
3873 | ,nn,0,nn,fTimeMax | |
3874 | ,-0.5/fSf,(Float_t) (fTimeMax-0.5)/fSf); | |
77566f2a | 3875 | fPH2d->SetXTitle("Det/pad groups"); |
3876 | fPH2d->SetYTitle("time [#mus]"); | |
3877 | fPH2d->SetZTitle("<PH> [a.u.]"); | |
3878 | fPH2d->SetStats(0); | |
77566f2a | 3879 | |
3880 | } | |
3881 | ||
8ec526a4 | 3882 | //_____________________________________________________________________________ |
3883 | void AliTRDCalibra::CreateCH2d(Int_t nn) | |
77566f2a | 3884 | { |
3885 | // | |
3886 | // Create the 2D histos | |
3887 | // | |
3888 | ||
8ec526a4 | 3889 | TString name("Nz"); |
3890 | name += fNz[0]; | |
3891 | name += "Nrphi"; | |
3892 | name += fNrphi[0]; | |
3893 | ||
3894 | fCH2d = new TH2I("CH2d",(const Char_t *) name | |
3895 | ,nn,0,nn,fNumberBinCharge,0,300); | |
77566f2a | 3896 | fCH2d->SetXTitle("Det/pad groups"); |
3897 | fCH2d->SetYTitle("charge deposit [a.u]"); | |
3898 | fCH2d->SetZTitle("counts"); | |
3899 | fCH2d->SetStats(0); | |
3900 | fCH2d->Sumw2(); | |
3901 | ||
3902 | } | |
8ec526a4 | 3903 | |
3904 | //____________Offine tracking in the AliTRDtracker_____________________________ | |
77566f2a | 3905 | void AliTRDCalibra::FillTheInfoOfTheTrackCH() |
3906 | { | |
3907 | // | |
3908 | // For the offline tracking or mcm tracklets | |
3909 | // This function will be called in the functions UpdateHistogram... | |
3910 | // to fill the info of a track for the relativ gain calibration | |
3911 | // | |
3912 | ||
8ec526a4 | 3913 | Int_t nb = 0; // Nombre de zones traversees |
3914 | Int_t fd = -1; // Premiere zone non nulle | |
77566f2a | 3915 | |
3916 | ||
8ec526a4 | 3917 | // See if the track goes through different zones |
3918 | for (Int_t k = 0; k < fNfragZ[0]*fNfragRphi[0]; k++) { | |
3919 | if (fAmpTotal[k] > 0.0) { | |
3920 | nb++; | |
3921 | if (nb == 1) { | |
3922 | fd = k; | |
3923 | } | |
77566f2a | 3924 | } |
3925 | } | |
3926 | ||
8ec526a4 | 3927 | // If automatic scale |
3928 | if ((fCountRelativeScale < 100) && (fRelativeScaleAuto)) { | |
3929 | // Take only the one zone track | |
3930 | if (nb == 1) { | |
3931 | fRelativeScale += fAmpTotal[fd] * 0.014 * 0.01; | |
3932 | fCountRelativeScale++; | |
77566f2a | 3933 | } |
3934 | } | |
8ec526a4 | 3935 | |
3936 | // We fill the CH2d after having scale with the first 100 | |
3937 | if ((fCountRelativeScale >= 100) && (fRelativeScaleAuto)) { | |
3938 | // Case of track with only one zone | |
3939 | if (nb == 1) { | |
3940 | if (fHisto2d) { | |
3941 | fCH2d->Fill(fXbins[0]+fd+0.5,fAmpTotal[fd]/fRelativeScale); | |
3942 | } | |
3943 | if (fVector2d) { | |
3944 | UpdateVectorCH(fXbins[0]+fd,fAmpTotal[fd]/fRelativeScale); | |
3945 | } | |
3946 | } // Case 1 zone | |
3947 | // Case of track with two zones | |
3948 | if (nb == 2) { | |
3949 | // Two zones voisines sinon rien! | |
3950 | if ((fAmpTotal[fd] > 0.0) && | |
3951 | (fAmpTotal[fd+1] > 0.0)) { | |
3952 | // One of the two very big | |
3953 | if (fAmpTotal[fd] > fProcent*fAmpTotal[fd+1]) { | |
3954 | if (fHisto2d) { | |
3955 | fCH2d->Fill(fXbins[0]+fd+0.5,fAmpTotal[fd]/fRelativeScale); | |
3956 | } | |
3957 | if (fVector2d) { | |
3958 | UpdateVectorCH(fXbins[0]+fd,fAmpTotal[fd]/fRelativeScale); | |
3959 | } | |
77566f2a | 3960 | } |
8ec526a4 | 3961 | if (fAmpTotal[fd+1] > fProcent*fAmpTotal[fd]) { |
3962 | if (fHisto2d) { | |
3963 | fCH2d->Fill(fXbins[0]+fd+1.5,fAmpTotal[fd+1]/fRelativeScale); | |
3964 | } | |
3965 | if (fVector2d) { | |
3966 | UpdateVectorCH(fXbins[0]+fd,fAmpTotal[fd+1]/fRelativeScale); | |
3967 | } | |
77566f2a | 3968 | } |
3969 | } | |
8ec526a4 | 3970 | } // Case 2 zones |
3971 | } | |
3972 | ||
3973 | // Fill with no automatic scale | |
3974 | if (!fRelativeScaleAuto) { | |
3975 | // Case of track with only one zone | |
3976 | if (nb == 1) { | |
3977 | fNumberUsedCh[0]++; | |
3978 | if (fHisto2d) { | |
3979 | fCH2d->Fill(fXbins[0]+fd+0.5,fAmpTotal[fd]/fRelativeScale); | |
3980 | } | |
3981 | if (fVector2d) { | |
3982 | UpdateVectorCH(fXbins[0]+fd,fAmpTotal[fd]/fRelativeScale); | |
3983 | } | |
3984 | } // Case 1 zone | |
3985 | // Case of track with two zones | |
3986 | if (nb == 2) { | |
3987 | // Two zones voisines sinon rien! | |
3988 | // Case 1 | |
3989 | if ((fAmpTotal[fd] > 0.0) && | |
3990 | (fAmpTotal[fd+1] > 0.0)) { | |
3991 | // One of the two very big | |
3992 | if (fAmpTotal[fd] > fProcent*fAmpTotal[fd+1]) { | |
3993 | if (fHisto2d) { | |
3994 | fCH2d->Fill(fXbins[0]+fd+0.5,fAmpTotal[fd]/fRelativeScale); | |
3995 | } | |
3996 | if (fVector2d) { | |
3997 | UpdateVectorCH(fXbins[0]+fd,fAmpTotal[fd]/fRelativeScale); | |
3998 | } | |
3999 | fNumberUsedCh[1]++; | |
77566f2a | 4000 | } |
8ec526a4 | 4001 | if (fAmpTotal[fd+1] > fProcent*fAmpTotal[fd]) { |
4002 | if (fHisto2d) { | |
4003 | fCH2d->Fill(fXbins[0]+fd+1.5,fAmpTotal[fd+1]/fRelativeScale); | |
4004 | } | |
4005 | if (fVector2d) { | |
4006 | UpdateVectorCH(fXbins[0]+fd+1,fAmpTotal[fd+1]/fRelativeScale); | |
4007 | } | |
4008 | fNumberUsedCh[1]++; | |
77566f2a | 4009 | } |
4010 | } | |
8ec526a4 | 4011 | // Case 2 |
4012 | if (fNfragZ[0] > 1) { | |
4013 | if (fAmpTotal[fd] > 0.0) { | |
4014 | if ((fd+fNfragZ[0]) < (fNfragZ[0]*fNfragRphi[0])) { | |
4015 | if (fAmpTotal[fd+fNfragZ[0]] > 0.0) { | |
4016 | // One of the two very big | |
4017 | if (fAmpTotal[fd] > fProcent*fAmpTotal[fd+fNfragZ[0]]) { | |
4018 | if (fHisto2d) { | |
4019 | fCH2d->Fill(fXbins[0]+fd+0.5,fAmpTotal[fd]/fRelativeScale); | |
4020 | } | |
4021 | if (fVector2d) { | |
4022 | UpdateVectorCH(fXbins[0]+fd,fAmpTotal[fd]/fRelativeScale); | |
4023 | } | |
4024 | fNumberUsedCh[1]++; | |
77566f2a | 4025 | } |
8ec526a4 | 4026 | if (fAmpTotal[fd+fNfragZ[0]] > fProcent*fAmpTotal[fd]) { |
4027 | if (fHisto2d) { | |
4028 | fCH2d->Fill(fXbins[0]+fd+fNfragZ[0]+0.5,fAmpTotal[fd+fNfragZ[0]]/fRelativeScale); | |
4029 | } | |
4030 | fNumberUsedCh[1]++; | |
4031 | if (fVector2d) { | |
4032 | UpdateVectorCH(fXbins[0]+fd+fNfragZ[0],fAmpTotal[fd+fNfragZ[0]]/fRelativeScale); | |
4033 | } | |
77566f2a | 4034 | } |
4035 | } | |
4036 | } | |
4037 | } | |
4038 | } | |
8ec526a4 | 4039 | } // Case 2 zones |
4040 | ||
77566f2a | 4041 | } |
8ec526a4 | 4042 | |
77566f2a | 4043 | } |
8ec526a4 | 4044 | |
4045 | //____________Offine tracking in the AliTRDtracker_____________________________ | |
4046 | void AliTRDCalibra::ResetfVariables() | |
77566f2a | 4047 | { |
4048 | // | |
8ec526a4 | 4049 | // Reset values of fAmpTotal, fPHValue and fPHPlace for |
4050 | // the updateHistogram... functions | |
77566f2a | 4051 | // |
4052 | ||
8ec526a4 | 4053 | // Reset the good track |
77566f2a | 4054 | fGoodTrack = kTRUE; |
4055 | ||
8ec526a4 | 4056 | // Reset the fAmpTotal where we put value |
4057 | if (fCH2dOn) { | |
4058 | for (Int_t k = 0; k < fNfragZ[0]*fNfragRphi[0]; k++) { | |
4059 | fAmpTotal[k] = 0.0; | |
4060 | } | |
4061 | } | |
4062 | ||
4063 | // Reset the fPHValue | |
4064 | if (fPH2dOn) { | |
4065 | for (Int_t k = 0; k < fTimeMax; k++) { | |
4066 | fPHValue[k] = -1.0; | |
4067 | fPHPlace[k] = -1; | |
4068 | } | |
4069 | } | |
4070 | ||
4071 | } | |
4072 | ||
4073 | //____________Offine tracking in the AliTRDtracker_____________________________ | |
77566f2a | 4074 | void AliTRDCalibra::FillTheInfoOfTheTrackPH() |
4075 | { | |
4076 | // | |
4077 | // For the offline tracking or mcm tracklets | |
4078 | // This function will be called in the functions UpdateHistogram... | |
4079 | // to fill the info of a track for the drift velocity calibration | |
4080 | // | |
4081 | ||
8ec526a4 | 4082 | Int_t nb = 1; // Nombre de zones traversees 1, 2 ou plus de 3 |
4083 | Int_t fd1 = -1; // Premiere zone non nulle | |
4084 | Int_t fd2 = -1; // Deuxieme zone non nulle | |
4085 | Int_t k1 = -1; // Debut de la premiere zone | |
4086 | Int_t k2 = -1; // Debut de la seconde zone | |
4087 | ||
4088 | // See if the track goes through different zones | |
4089 | for (Int_t k = 0; k < fTimeMax; k++) { | |
4090 | if (fPHValue[k] > 0.0) { | |
4091 | if (fd1 == -1) { | |
4092 | fd1 = fPHPlace[k]; | |
4093 | k1 = k; | |
77566f2a | 4094 | } |
8ec526a4 | 4095 | if (fPHPlace[k] != fd1) { |
4096 | if (fd2 == -1) { | |
4097 | k2 = k; | |
4098 | fd2 = fPHPlace[k]; | |
4099 | nb = 2; | |
4100 | } | |
4101 | if (fPHPlace[k] != fd2) { | |
4102 | nb = 3; | |
77566f2a | 4103 | } |
77566f2a | 4104 | } |
4105 | } | |
4106 | } | |
4107 | ||
8ec526a4 | 4108 | // Fill |
4109 | // Case of track with only one zone | |
4110 | if (nb == 1) { | |
4111 | fNumberUsedPh[0]++; | |
4112 | for (Int_t i = 0; i < fTimeMax; i++) { | |
4113 | if (fPHValue[i] > 0.0) { | |
4114 | if (fHisto2d) { | |
4115 | fPH2d->Fill((fXbins[1]+fPHPlace[i])+0.5,(Float_t) i/fSf,(Float_t) fPHValue[i]); | |
4116 | } | |
4117 | if (fDebug == 13) { | |
4118 | AliInfo(Form("WRITE nb %d ,place final: %d, fPHPlace[i]: %d, i: %d, fPHValue[i]: %f" | |
4119 | ,nb,fXbins[1]+fPHPlace[i],fPHPlace[i],i,fPHValue[i])); | |
4120 | } | |
4121 | if (fVector2d) { | |
4122 | UpdateVectorPH(fXbins[1]+fPHPlace[i],i,fPHValue[i]); | |
77566f2a | 4123 | } |
77566f2a | 4124 | } |
4125 | } | |
8ec526a4 | 4126 | } // Case 1 zone |
4127 | // Case of track with two zones | |
4128 | if (nb == 2) { | |
4129 | // Two zones voisines sinon rien! | |
4130 | // Case 1 | |
4131 | if ((fd1 == fd2+1) || | |
4132 | (fd2 == fd1+1)) { | |
4133 | // One of the two fast all the think | |
4134 | if (k2 > (k1+fDifference)) { | |
4135 | fNumberUsedPh[1]++; | |
4136 | for (Int_t i = k1; i < k2; i++) { | |
4137 | if (fPHValue[i] > 0.0) { | |
4138 | if (fHisto2d) { | |
4139 | fPH2d->Fill((fXbins[1]+fPHPlace[i])+0.5,(Float_t) i/fSf,(Float_t) fPHValue[i]); | |
4140 | } | |
4141 | if (fVector2d) { | |
4142 | UpdateVectorPH(fXbins[1]+fPHPlace[i],i,fPHValue[i]); | |
4143 | } | |
77566f2a | 4144 | } |
4145 | } | |
4146 | } | |
8ec526a4 | 4147 | if ((k2+fDifference) < fTimeMax) { |
4148 | fNumberUsedPh[1]++; | |
4149 | for (Int_t i = k2; i < fTimeMax; i++) { | |
4150 | if (fPHValue[i] > 0.0) { | |
4151 | if (fHisto2d) { | |
4152 | fPH2d->Fill((fXbins[1]+fPHPlace[i])+0.5,(Float_t) i/fSf,(Float_t) fPHValue[i]); | |
4153 | } | |
4154 | if (fVector2d) { | |
4155 | UpdateVectorPH(fXbins[1]+fPHPlace[i],i,fPHValue[i]); | |
4156 | } | |
77566f2a | 4157 | } |
4158 | } | |
4159 | } | |
4160 | } | |
8ec526a4 | 4161 | // Two zones voisines sinon rien! |
4162 | if (fNfragZ[1] > 1) { | |
4163 | // Case 2 | |
4164 | if ((fd1+fNfragZ[1]) < (fNfragZ[1]*fNfragRphi[1])) { | |
4165 | if (fd2 == (fd1+fNfragZ[1])) { | |
4166 | // One of the two fast all the think | |
4167 | if (k2 > (k1+fDifference)) { | |
4168 | fNumberUsedPh[1]++; | |
4169 | for (Int_t i = k1; i < k2; i++) { | |
4170 | if (fPHValue[i] > 0.0) { | |
4171 | if (fHisto2d) { | |
4172 | fPH2d->Fill((fXbins[1]+fPHPlace[i])+0.5,(Float_t) i/fSf,(Float_t) fPHValue[i]); | |
4173 | } | |
4174 | if (fVector2d) { | |
4175 | UpdateVectorPH(fXbins[1]+fPHPlace[i],i,fPHValue[i]); | |
4176 | } | |
77566f2a | 4177 | } |
4178 | } | |
4179 | } | |
8ec526a4 | 4180 | if ((k2+fDifference) < fTimeMax) { |
4181 | fNumberUsedPh[1]++; | |
4182 | for (Int_t i = k2; i < fTimeMax; i++) { | |
4183 | if (fPHValue[i] > 0.0) { | |
4184 | if (fHisto2d) { | |
4185 | fPH2d->Fill((fXbins[1]+fPHPlace[i])+0.5,(Float_t) i/fSf,(Float_t) fPHValue[i]); | |
4186 | } | |
4187 | if (fVector2d) { | |
4188 | UpdateVectorPH(fXbins[1]+fPHPlace[i],i,fPHValue[i]); | |
4189 | } | |
77566f2a | 4190 | } |
4191 | } | |
4192 | } | |
4193 | } | |
4194 | } | |
8ec526a4 | 4195 | // Two zones voisines sinon rien! |
4196 | // Case 3 | |
4197 | if ((fd1 - fNfragZ[1]) >= 0) { | |
4198 | if (fd2 == (fd1 - fNfragZ[1])) { | |
4199 | // One of the two fast all the think | |
4200 | if (k2 > (k1 + fDifference)) { | |
4201 | fNumberUsedPh[1]++; | |
4202 | for (Int_t i = k1; i < k2; i++) { | |
4203 | if (fPHValue[i] > 0.0) { | |
4204 | if (fHisto2d) { | |
4205 | fPH2d->Fill((fXbins[1]+fPHPlace[i])+0.5,(Float_t) i/fSf,(Float_t) fPHValue[i]); | |
4206 | } | |
4207 | if (fVector2d) { | |
4208 | UpdateVectorPH(fXbins[1]+fPHPlace[i],i,fPHValue[i]); | |
4209 | } | |
77566f2a | 4210 | } |
4211 | } | |
4212 | } | |
8ec526a4 | 4213 | if ((k2+fDifference) < fTimeMax) { |
4214 | fNumberUsedPh[1]++; | |
4215 | for (Int_t i = k2; i < fTimeMax; i++) { | |
4216 | if (fPHValue[i] > 0.0) { | |
4217 | if (fHisto2d) { | |
4218 | fPH2d->Fill((fXbins[1]+fPHPlace[i])+0.5,(Float_t) i/fSf,(Float_t) fPHValue[i]); | |
4219 | } | |
4220 | if (fVector2d) { | |
4221 | UpdateVectorPH(fXbins[1]+fPHPlace[i],i,fPHValue[i]); | |
4222 | } | |
77566f2a | 4223 | } |
4224 | } | |
4225 | } | |
4226 | } | |
4227 | } | |
4228 | } | |
77566f2a | 4229 | |
8ec526a4 | 4230 | } // case 2 zones |
4231 | ||
4232 | } | |
77566f2a | 4233 | |
8ec526a4 | 4234 | //____________Set the pad calibration variables for the detector_______________ |
4235 | Bool_t AliTRDCalibra::LocalisationDetectorXbins(Int_t detector) | |
77566f2a | 4236 | { |
4237 | // | |
8ec526a4 | 4238 | // For the detector calcul the first Xbins and set the number of row |
4239 | // and col pads per calibration groups, the number of calibration | |
4240 | // groups in the detector. | |
77566f2a | 4241 | // |
4242 | ||
8ec526a4 | 4243 | // first Xbins of the detector |
4244 | if (fCH2dOn) { | |
4245 | CalculXBins(detector,0); | |
4246 | } | |
4247 | if (fPH2dOn) { | |
4248 | CalculXBins(detector,1); | |
4249 | } | |
4250 | if (fPRF2dOn) { | |
4251 | CalculXBins(detector,2); | |
4252 | } | |
4253 | ||
4254 | // fragmentation of idect | |
4255 | for (Int_t i = 0; i < 3; i++) { | |
77566f2a | 4256 | ModePadCalibration((Int_t) GetChamber(detector),i); |
8ec526a4 | 4257 | ModePadFragmentation((Int_t) GetPlane(detector) |
4258 | , (Int_t) GetChamber(detector) | |
4259 | , (Int_t) GetSector(detector),i); | |
77566f2a | 4260 | } |
4261 | ||
4262 | return kTRUE; | |
8ec526a4 | 4263 | |
77566f2a | 4264 | } |
4265 | ||
8ec526a4 | 4266 | //____________Plot the 2D histos filled Online_________________________________ |
77566f2a | 4267 | |
8ec526a4 | 4268 | //_____________________________________________________________________________ |
77566f2a | 4269 | void AliTRDCalibra::PlotPH2d() |
4270 | { | |
4271 | // | |
4272 | // Plot the 2D histo | |
4273 | // | |
4274 | ||
4275 | TCanvas *cph2d = new TCanvas("cph2d","",50,50,600,800); | |
4276 | cph2d->cd(); | |
4277 | fPH2d->Draw("LEGO"); | |
4278 | ||
4279 | } | |
4280 | ||
8ec526a4 | 4281 | //_____________________________________________________________________________ |
77566f2a | 4282 | void AliTRDCalibra::PlotCH2d() |
4283 | { | |
4284 | // | |
4285 | // Plot the 2D histos | |
4286 | // | |
4287 | ||
4288 | TCanvas *cch2d = new TCanvas("cch2d","",50,50,600,800); | |
4289 | cch2d->cd(); | |
4290 | fCH2d->Draw("LEGO"); | |
4291 | ||
4292 | } | |
4293 | ||
8ec526a4 | 4294 | //_____________________________________________________________________________ |
77566f2a | 4295 | void AliTRDCalibra::PlotPRF2d() |
4296 | { | |
4297 | // | |
4298 | // Plot the 2D histos | |
4299 | // | |
4300 | ||
4301 | TCanvas *cPRF2d = new TCanvas("cPRF2d","",50,50,600,800); | |
4302 | cPRF2d->cd(); | |
4303 | fPRF2d->Draw("LEGO"); | |
4304 | ||
4305 | } | |
4306 | ||
8ec526a4 | 4307 | //____________Fit______________________________________________________________ |
77566f2a | 4308 | |
8ec526a4 | 4309 | //____________Create histos if fDebug == 1 or fDebug >= 3______________________ |
77566f2a | 4310 | |
8ec526a4 | 4311 | //_____________________________________________________________________________ |
9f4780aa | 4312 | void AliTRDCalibra::InitArrayFitPH() |
77566f2a | 4313 | { |
4314 | // | |
9f4780aa | 4315 | // Initialise fCoefVdrift[3] and fCoefVdriftE[2] to the right dimension |
4316 | // | |
4317 | ||
4318 | Int_t nbins = fDect2[1]-fDect1[1]; | |
4319 | ||
4320 | //Init the pointer to nbins | |
4321 | fCoefVdrift[0] = new Double_t[nbins]; | |
4322 | fCoefVdrift[1] = new Double_t[nbins]; | |
4323 | fCoefVdrift[2] = new Double_t[nbins]; | |
77566f2a | 4324 | |
9f4780aa | 4325 | fCoefVdriftE[0] = new Double_t[nbins]; |
4326 | fCoefVdriftE[1] = new Double_t[nbins]; | |
4327 | ||
4328 | for(Int_t k = 0; k < nbins; k++){ | |
4329 | fCoefVdriftE[0][k] = 0.0; | |
4330 | fCoefVdriftE[1][k] = 0.0; | |
4331 | } | |
4332 | ||
77566f2a | 4333 | } |
8ec526a4 | 4334 | |
4335 | //_____________________________________________________________________________ | |
9f4780aa | 4336 | void AliTRDCalibra::InitArrayFitT0() |
77566f2a | 4337 | { |
4338 | // | |
9f4780aa | 4339 | // Initialise fCoefT0[3] and fCoefT0E[2] to the right dimension |
4340 | // | |
4341 | ||
4342 | Int_t nbins = fDect2[1]-fDect1[1]; | |
4343 | ||
4344 | //Init the pointer to nbins | |
4345 | fCoefT0[0] = new Double_t[nbins]; | |
4346 | fCoefT0[1] = new Double_t[nbins]; | |
4347 | fCoefT0[2] = new Double_t[nbins]; | |
4348 | ||
4349 | fCoefT0E[0] = new Double_t[nbins]; | |
4350 | fCoefT0E[1] = new Double_t[nbins]; | |
8ec526a4 | 4351 | |
9f4780aa | 4352 | for(Int_t k = 0; k < nbins; k++){ |
4353 | fCoefT0E[0][k] = 0.0; | |
4354 | fCoefT0E[1][k] = 0.0; | |
4355 | } | |
4356 | ||
77566f2a | 4357 | } |
4358 | ||
8ec526a4 | 4359 | //_____________________________________________________________________________ |
9f4780aa | 4360 | void AliTRDCalibra::InitArrayFitCH() |
77566f2a | 4361 | { |
4362 | // | |
9f4780aa | 4363 | // Initialise fCoefCharge[4] and fCoefChargeE[3] to the right dimension |
77566f2a | 4364 | // |
4365 | ||
9f4780aa | 4366 | Int_t nbins = fDect2[0]-fDect1[0]; |
77566f2a | 4367 | |
9f4780aa | 4368 | //Init the pointer to nbins |
4369 | fCoefCharge[0] = new Double_t[nbins]; | |
4370 | fCoefCharge[1] = new Double_t[nbins]; | |
4371 | fCoefCharge[2] = new Double_t[nbins]; | |
4372 | fCoefCharge[3] = new Double_t[nbins]; | |
4373 | ||
4374 | fCoefChargeE[0] = new Double_t[nbins]; | |
4375 | fCoefChargeE[1] = new Double_t[nbins]; | |
4376 | fCoefChargeE[2] = new Double_t[nbins]; | |
4377 | ||
4378 | for(Int_t k = 0; k < nbins; k++){ | |
4379 | fCoefChargeE[0][k] = 0.0; | |
4380 | fCoefChargeE[1][k] = 0.0; | |
4381 | fCoefChargeE[2][k] = 0.0; | |
4382 | } | |
77566f2a | 4383 | |
9f4780aa | 4384 | |
77566f2a | 4385 | } |
8ec526a4 | 4386 | |
4387 | //_____________________________________________________________________________ | |
9f4780aa | 4388 | void AliTRDCalibra::InitArrayFitPRF() |
77566f2a | 4389 | { |
4390 | // | |
9f4780aa | 4391 | // Initialise fCoefPRF[2] and fCoefPRFE to the right dimension |
77566f2a | 4392 | // |
4393 | ||
9f4780aa | 4394 | Int_t nbins = fDect2[2]-fDect1[2]; |
77566f2a | 4395 | |
9f4780aa | 4396 | //Init the pointer to nbins |
4397 | fCoefPRF[0] = new Double_t[nbins]; | |
4398 | fCoefPRF[1] = new Double_t[nbins]; | |
4399 | ||
4400 | fCoefPRFE = new Double_t[nbins]; | |
4401 | ||
4402 | for(Int_t k = 0; k < nbins; k++){ | |
4403 | fCoefPRFE[k] = 0.0; | |
4404 | } | |
4405 | ||
77566f2a | 4406 | } |
8ec526a4 | 4407 | |
4408 | //_____________________________________________________________________________ | |
77566f2a | 4409 | void AliTRDCalibra::CreateFitHistoPRFDB(Int_t rowMax, Int_t colMax) |
4410 | { | |
4411 | // | |
4412 | // Create the histos for fDebug = 3 and fDebug = 4 (Fit functions) | |
4413 | // | |
8ec526a4 | 4414 | |
4415 | fCoefPRFDB = new TH2F("coefPRF","",rowMax,0,rowMax,colMax,0,colMax); | |
77566f2a | 4416 | |
4417 | fCoefPRFDB->SetStats(0); | |
4418 | fCoefPRFDB->SetXTitle("row Number"); | |
4419 | fCoefPRFDB->SetYTitle("col Number"); | |
4420 | fCoefPRFDB->SetZTitle("PRF width [pad width units]"); | |
77566f2a | 4421 | |
4422 | fCoefPRFDB->SetFillColor(6); | |
4423 | fCoefPRFDB->SetLineColor(6); | |
4424 | ||
77566f2a | 4425 | } |
4426 | ||
8ec526a4 | 4427 | //_____________________________________________________________________________ |
4428 | void AliTRDCalibra::CreateFitHistoCHDB(Int_t rowMax, Int_t colMax) | |
4429 | { | |
77566f2a | 4430 | // |
4431 | // Create the histos for fDebug = 3 and fDebug = 4 (Fit functions) | |
4432 | // | |
4433 | ||
8ec526a4 | 4434 | fCoefChargeDB[0] = new TH2F("coefchargedb0","",rowMax,0,rowMax,colMax,0,colMax); |
4435 | fCoefChargeDB[1] = new TH2F("coefchargedb1","",rowMax,0,rowMax,colMax,0,colMax); | |
4436 | fCoefChargeDB[2] = new TH2F("coefchargedb2","",rowMax,0,rowMax,colMax,0,colMax); | |
77566f2a | 4437 | |
4438 | fCoefChargeDB[0]->SetStats(0); | |
4439 | fCoefChargeDB[1]->SetStats(0); | |
4440 | fCoefChargeDB[2]->SetStats(0); | |
4441 | fCoefChargeDB[0]->SetXTitle("row Number"); | |
4442 | fCoefChargeDB[0]->SetYTitle("col Number"); | |
4443 | fCoefChargeDB[1]->SetXTitle("row Number"); | |
4444 | fCoefChargeDB[1]->SetYTitle("col Number"); | |
4445 | fCoefChargeDB[2]->SetXTitle("row Number"); | |
4446 | fCoefChargeDB[2]->SetYTitle("col Number"); | |
4447 | fCoefChargeDB[0]->SetZTitle("f_{g} Fit method"); | |
4448 | fCoefChargeDB[1]->SetZTitle("f_{g} Mean method"); | |
4449 | fCoefChargeDB[2]->SetZTitle("f_{g} Fitbis method"); | |
77566f2a | 4450 | |
4451 | fCoefChargeDB[0]->SetFillColor(6); | |
4452 | fCoefChargeDB[0]->SetLineColor(6); | |
4453 | fCoefChargeDB[0]->SetLineColor(6); | |
4454 | fCoefChargeDB[1]->SetFillColor(2); | |
4455 | fCoefChargeDB[1]->SetLineColor(2); | |
4456 | fCoefChargeDB[1]->SetLineColor(2); | |
4457 | fCoefChargeDB[2]->SetFillColor(8); | |
4458 | fCoefChargeDB[2]->SetLineColor(8); | |
4459 | fCoefChargeDB[2]->SetLineColor(8); | |
4460 | ||
4461 | } | |
4462 | ||
8ec526a4 | 4463 | //_____________________________________________________________________________ |
77566f2a | 4464 | void AliTRDCalibra::CreateFitHistoPHDB(Int_t rowMax, Int_t colMax) |
4465 | { | |
4466 | // | |
4467 | // Create the histos for fDebug = 3 and fDebug = 4 (Fit functions) | |
4468 | // | |
4469 | ||
8ec526a4 | 4470 | fCoefVdriftDB[0] = new TH2F("coefvdriftdb0","",rowMax,0,rowMax,colMax,0,colMax); |
4471 | fCoefVdriftDB[1] = new TH2F("coefvdriftdb1","",rowMax,0,rowMax,colMax,0,colMax); | |
77566f2a | 4472 | |
4473 | fCoefVdriftDB[0]->SetStats(0); | |
4474 | fCoefVdriftDB[1]->SetStats(0); | |
4475 | fCoefVdriftDB[0]->SetXTitle("row Number"); | |
4476 | fCoefVdriftDB[0]->SetYTitle("col Number"); | |
4477 | fCoefVdriftDB[1]->SetXTitle("row Number"); | |
4478 | fCoefVdriftDB[1]->SetYTitle("col Number"); | |
4479 | fCoefVdriftDB[0]->SetZTitle("v_{drift} Fit method"); | |
4480 | fCoefVdriftDB[1]->SetZTitle("v_{drift} slope method"); | |
4481 | ||
4482 | fCoefVdriftDB[0]->SetFillColor(6); | |
4483 | fCoefVdriftDB[0]->SetLineColor(6); | |
4484 | fCoefVdriftDB[0]->SetLineColor(6); | |
4485 | fCoefVdriftDB[1]->SetFillColor(2); | |
4486 | fCoefVdriftDB[1]->SetLineColor(2); | |
4487 | fCoefVdriftDB[1]->SetLineColor(2); | |
8ec526a4 | 4488 | |
77566f2a | 4489 | } |
8ec526a4 | 4490 | |
4491 | //_____________________________________________________________________________ | |
77566f2a | 4492 | void AliTRDCalibra::CreateFitHistoT0DB(Int_t rowMax, Int_t colMax) |
4493 | { | |
4494 | // | |
4495 | // Create the histos for fDebug = 3 and fDebug = 4 (Fit functions) | |
4496 | // | |
4497 | ||
8ec526a4 | 4498 | fCoefT0DB[0] = new TH2F("coefT0db0","",rowMax,0,rowMax,colMax,0,colMax); |
4499 | fCoefT0DB[1] = new TH2F("coefT0db1","",rowMax,0,rowMax,colMax,0,colMax); | |
77566f2a | 4500 | |
4501 | fCoefT0DB[0]->SetStats(0); | |
4502 | fCoefT0DB[1]->SetStats(0); | |
4503 | fCoefT0DB[0]->SetXTitle("row Number"); | |
4504 | fCoefT0DB[0]->SetYTitle("col Number"); | |
4505 | fCoefT0DB[1]->SetXTitle("row Number"); | |
4506 | fCoefT0DB[1]->SetYTitle("col Number"); | |
4507 | fCoefT0DB[0]->SetZTitle("t0 Fit method"); | |
4508 | fCoefT0DB[1]->SetZTitle("t0 slope method"); | |
4509 | ||
4510 | fCoefT0DB[0]->SetFillColor(6); | |
4511 | fCoefT0DB[0]->SetLineColor(6); | |
4512 | fCoefT0DB[0]->SetLineColor(6); | |
4513 | fCoefT0DB[1]->SetFillColor(2); | |
4514 | fCoefT0DB[1]->SetLineColor(2); | |
4515 | fCoefT0DB[1]->SetLineColor(2); | |
4516 | ||
4517 | } | |
8ec526a4 | 4518 | |
77566f2a | 4519 | //_____________________________________________________________________________ |
4520 | Bool_t AliTRDCalibra::FillVectorFitCH(Int_t countdet) | |
4521 | { | |
4522 | // | |
4523 | // For the Fit functions fill the vector FitCH special for the gain calibration | |
4524 | // | |
8ec526a4 | 4525 | |
4526 | AliTRDFitCHInfo *fitCHInfo = new AliTRDFitCHInfo(); | |
4527 | ||
4528 | Int_t ntotal = 1; | |
4529 | if (GetChamber(countdet) == 2) { | |
4530 | ntotal = 1728; | |
4531 | } | |
4532 | else { | |
4533 | ntotal = 2304; | |
4534 | } | |
4535 | ||
4536 | Float_t *coef = new Float_t[ntotal]; | |
4537 | for (Int_t i = 0; i < ntotal; i++) { | |
4538 | coef[i] = fCoefCH[i]; | |
77566f2a | 4539 | } |
8ec526a4 | 4540 | |
4541 | Int_t detector = countdet; | |
4542 | // Set | |
4543 | fitCHInfo->SetCoef(coef); | |
4544 | fitCHInfo->SetDetector(detector); | |
4545 | fVectorFitCH->Add((TObject *) fitCHInfo); | |
77566f2a | 4546 | |
4547 | return kTRUE; | |
8ec526a4 | 4548 | |
77566f2a | 4549 | } |
77566f2a | 4550 | |
8ec526a4 | 4551 | //____________Functions for initialising the AliTRDCalibra in the code_________ |
9f4780aa | 4552 | Bool_t AliTRDCalibra::InitFit(Int_t nbins, Int_t i) |
77566f2a | 4553 | { |
4554 | // | |
8ec526a4 | 4555 | // Init the calibration mode (Nz, Nrphi), the histograms for |
4556 | // debugging the fit methods if fDebug > 0, | |
77566f2a | 4557 | // |
8ec526a4 | 4558 | |
77566f2a | 4559 | gStyle->SetPalette(1); |
4560 | gStyle->SetOptStat(1111); | |
4561 | gStyle->SetPadBorderMode(0); | |
4562 | gStyle->SetCanvasColor(10); | |
4563 | gStyle->SetPadLeftMargin(0.13); | |
4564 | gStyle->SetPadRightMargin(0.01); | |
8ec526a4 | 4565 | |
77566f2a | 4566 | // Get the parameter object |
4567 | AliTRDCommonParam *parCom = AliTRDCommonParam::Instance(); | |
4568 | if (!parCom) { | |
8ec526a4 | 4569 | AliInfo("Could not get CommonParam"); |
77566f2a | 4570 | return kFALSE; |
4571 | } | |
8ec526a4 | 4572 | |
4573 | // Mode groups of pads: the total number of bins! | |
77566f2a | 4574 | Int_t numberofbinsexpected = 0; |
4575 | ModePadCalibration(2,i); | |
4576 | ModePadFragmentation(0,2,0,i); | |
8ec526a4 | 4577 | fDetChamb2[i] = fNfragZ[i] * fNfragRphi[i]; |
4578 | if (fDebug == 1) { | |
4579 | AliInfo(Form("For the chamber 2: %d",fDetChamb2[i])); | |
4580 | } | |
4581 | numberofbinsexpected += 6 * 18 * fDetChamb2[i]; | |
77566f2a | 4582 | ModePadCalibration(0,i); |
4583 | ModePadFragmentation(0,0,0,i); | |
8ec526a4 | 4584 | fDetChamb0[i] = fNfragZ[i] * fNfragRphi[i]; |
4585 | if (fDebug == 1) { | |
4586 | AliInfo(Form("For the other chamber 0: %d",fDetChamb0[i])); | |
4587 | } | |
4588 | numberofbinsexpected += 6 * 4 * 18 * fDetChamb0[i]; | |
77566f2a | 4589 | |
8ec526a4 | 4590 | // Quick verification that we have the good pad calibration mode if 2D histos! |
4591 | if (nbins != 0) { | |
4592 | if (numberofbinsexpected != nbins) { | |
77566f2a | 4593 | AliInfo("It doesn't correspond to the mode of pad group calibration!"); |
4594 | return kFALSE; | |
4595 | } | |
4596 | } | |
4597 | ||
8ec526a4 | 4598 | // Security for fDebug 3 and 4 |
4599 | if ((fDebug >= 3) && | |
4600 | ((fDet[0] > 5) || | |
4601 | (fDet[1] > 4) || | |
4602 | (fDet[2] > 17))) { | |
77566f2a | 4603 | AliInfo("This detector doesn't exit!"); |
4604 | return kFALSE; | |
77566f2a | 4605 | } |
8ec526a4 | 4606 | |
4607 | // Determine fDet1 and fDet2 | |
4608 | fDect1[i] = -1; | |
4609 | fDect2[i] = -1; | |
4610 | if (fDebug == 2) { | |
4611 | fDect1[i] = fFitVoir; | |
4612 | fDect2[i] = fDect1[i] +1; | |
77566f2a | 4613 | } |
8ec526a4 | 4614 | if (fDebug <= 1) { |
4615 | fDect1[i] = 0; | |
4616 | fDect2[i] = numberofbinsexpected; | |
77566f2a | 4617 | } |
8ec526a4 | 4618 | if (fDebug >= 3) { |
77566f2a | 4619 | CalculXBins(AliTRDgeometry::GetDetector(fDet[0],fDet[1],fDet[2]),i); |
8ec526a4 | 4620 | fDect1[i] = fXbins[i]; |
77566f2a | 4621 | CalculXBins((AliTRDgeometry::GetDetector(fDet[0],fDet[1],fDet[2])+1),i); |
8ec526a4 | 4622 | fDect2[i] = fXbins[i]; |
4623 | } | |
4624 | ||
4625 | // Create the histos for debugging | |
4626 | // CH | |
4627 | if (i == 0) { | |
4628 | ||
4629 | gDirectory = gROOT; | |
4630 | // Init the VectorFitCH | |
4631 | fVectorFitCH = new TObjArray(); | |
4632 | fCoefCH = new Float_t[2304]; | |
4633 | for (Int_t k = 0; k < 2304; k++) { | |
4634 | fCoefCH[k] = 0.0; | |
4635 | } | |
4636 | fScaleFitFactor = 0.0; | |
4637 | ||
4638 | // Number of Xbins(detectors or groups of pads) if Vector2d | |
4639 | // Quick verification that we are not out of range! | |
4640 | if (fVectorCH && fPlaCH) { | |
4641 | if ((nbins == 0) && | |
4642 | (fVectorCH->GetEntriesFast() > 0) && | |
4643 | ((Int_t) fPlaCH->GetEntriesFast() > 0)) { | |
4644 | if ((Int_t) fVectorCH->GetEntriesFast() > numberofbinsexpected) { | |
4645 | AliInfo("ch doesn't correspond to the mode of pad group calibration!"); | |
4646 | return kFALSE; | |
4647 | } | |
4648 | if ((Int_t) fVectorCH->GetEntriesFast() != (Int_t) fPlaCH->GetEntriesFast()) { | |
4649 | AliInfo("VectorCH doesn't correspond to PlaCH!"); | |
4650 | return kFALSE; | |
4651 | } | |
77566f2a | 4652 | } |
4653 | } | |
8ec526a4 | 4654 | |
4655 | // | |
4656 | // Debugging: Create the histos | |
4657 | // | |
4658 | ||
4659 | // fDebug == 0 nothing | |
77566f2a | 4660 | |
8ec526a4 | 4661 | // fDebug == 1 |
4662 | if (fDebug == 1) { | |
9f4780aa | 4663 | InitArrayFitCH(); |
77566f2a | 4664 | } |
8ec526a4 | 4665 | |
4666 | // fDebug == 2 and fFitVoir no histo | |
4667 | if (fDebug == 2) { | |
4668 | if (fFitVoir < numberofbinsexpected) { | |
77566f2a | 4669 | AliInfo(Form("We will see the fit of the object %d",fFitVoir)); |
4670 | } | |
4671 | else { | |
4672 | AliInfo("fFitVoir is out of range of the histo!"); | |
4673 | return kFALSE; | |
4674 | } | |
4675 | } | |
8ec526a4 | 4676 | |
4677 | // fDebug == 3 or 4 and fDet | |
4678 | if (fDebug >= 3) { | |
4679 | if ((fNz[0] == 0) && (fNrphi[0] == 0)) { | |
77566f2a | 4680 | AliInfo("Do you really want to see one detector without pad groups?"); |
4681 | return kFALSE; | |
4682 | } | |
8ec526a4 | 4683 | else { |
4684 | AliInfo(Form("You will see the detector: iPlane %d, iChamb %d, iSect %d" | |
4685 | ,fDet[0],fDet[1],fDet[2])); | |
4686 | // A little geometry: | |
77566f2a | 4687 | Int_t rowMax = parCom->GetRowMax(fDet[0],fDet[1],fDet[2]); |
4688 | Int_t colMax = parCom->GetColMax(fDet[0]); | |
8ec526a4 | 4689 | // Create the histos to visualise |
4690 | CreateFitHistoCHDB(rowMax,colMax); | |
4691 | if (fDebug == 4) { | |
9f4780aa | 4692 | InitArrayFitCH(); |
8ec526a4 | 4693 | } |
77566f2a | 4694 | } |
4695 | } | |
8ec526a4 | 4696 | |
77566f2a | 4697 | } |
4698 | ||
8ec526a4 | 4699 | // PH and T0 |
4700 | if (i == 1) { | |
77566f2a | 4701 | |
8ec526a4 | 4702 | // Number of Xbins (detectors or groups of pads) if vector2d |
4703 | // Quick verification that we are not out of range! | |
4704 | if (fVectorPH && fPlaPH) { | |
4705 | if ((nbins == 0) && | |
4706 | (fVectorPH->GetEntriesFast() > 0) && | |
4707 | ((Int_t) fPlaPH->GetEntriesFast() > 0)) { | |
4708 | if ((Int_t) fVectorPH->GetEntriesFast() > numberofbinsexpected) { | |
4709 | AliInfo("ph doesn't correspond to the mode of pad group calibration!"); | |
4710 | return kFALSE; | |
4711 | } | |
4712 | if ((Int_t) fVectorPH->GetEntriesFast() != (Int_t) fPlaPH->GetEntriesFast()) { | |
4713 | AliInfo("VectorPH doesn't correspond to PlaPH!"); | |
4714 | return kFALSE; | |
4715 | } | |
77566f2a | 4716 | } |
4717 | } | |
4718 | ||
8ec526a4 | 4719 | // Init tree |
4720 | InitTreePH(); | |
4721 | InitTreeT0(); | |
4722 | ||
4723 | // | |
4724 | // Debugging: Create the histos | |
4725 | // | |
4726 | ||
4727 | // fDebug == 0 nothing | |
4728 | ||
4729 | // fDebug == 1 | |
4730 | if (fDebug == 1) { | |
9f4780aa | 4731 | // Create the histos replique de ph |
4732 | InitArrayFitPH(); | |
4733 | InitArrayFitT0(); | |
77566f2a | 4734 | } |
8ec526a4 | 4735 | |
4736 | // fDebug == 2 and fFitVoir no histo | |
4737 | if (fDebug == 2) { | |
4738 | if (fFitVoir < numberofbinsexpected) { | |
77566f2a | 4739 | AliInfo(Form("We will see the fit of the object %d",fFitVoir)); |
4740 | } | |
4741 | else { | |
4742 | AliInfo("fFitVoir is out of range of the histo!"); | |
4743 | return kFALSE; | |
4744 | } | |
4745 | } | |
8ec526a4 | 4746 | |
4747 | // fDebug == 3 or 4 and fDet | |
4748 | if (fDebug >= 3) { | |
4749 | if ((fNz[1] == 0) && | |
4750 | (fNrphi[1] == 0)) { | |
77566f2a | 4751 | AliInfo("Do you really want to see one detector without pad groups?"); |
4752 | return kFALSE; | |
4753 | } | |
4754 | else { | |
8ec526a4 | 4755 | AliInfo(Form("You will see the detector: iPlane %d, iChamb %d, iSect %d" |
4756 | ,fDet[0],fDet[1],fDet[2])); | |
4757 | // A little geometry: | |
77566f2a | 4758 | Int_t rowMax = parCom->GetRowMax(fDet[0],fDet[1],fDet[2]); |
4759 | Int_t colMax = parCom->GetColMax(fDet[0]); | |
8ec526a4 | 4760 | // Create the histos to visualise |
4761 | CreateFitHistoPHDB(rowMax,colMax); | |
4762 | CreateFitHistoT0DB(rowMax,colMax); | |
4763 | if (fDebug == 4) { | |
9f4780aa | 4764 | InitArrayFitPH(); |
4765 | InitArrayFitT0(); | |
77566f2a | 4766 | } |
77566f2a | 4767 | } |
4768 | } | |
8ec526a4 | 4769 | |
77566f2a | 4770 | } |
8ec526a4 | 4771 | |
4772 | // PRF | |
4773 | if (i == 2) { | |
77566f2a | 4774 | |
8ec526a4 | 4775 | // Number of Xbins(detectors or groups of pads) if vector2d |
4776 | if (fVectorPRF && fPlaPRF){ | |
4777 | if ((nbins == 0) && | |
4778 | (fVectorPRF->GetEntriesFast() > 0) && | |
4779 | (fPlaPRF->GetEntriesFast() > 0)) { | |
4780 | // Quick verification that we are not out of range! | |
4781 | if ((Int_t) fVectorPRF->GetEntriesFast() > numberofbinsexpected) { | |
4782 | AliInfo("ch doesn't correspond to the mode of pad group calibration!"); | |
4783 | return kFALSE; | |
4784 | } | |
4785 | if ((Int_t) fVectorPRF->GetEntriesFast() != (Int_t) fPlaPRF->GetEntriesFast()) { | |
4786 | AliInfo("VectorPRF doesn't correspond to PlaCH!"); | |
4787 | return kFALSE; | |
4788 | } | |
77566f2a | 4789 | } |
4790 | } | |
4791 | ||
8ec526a4 | 4792 | // Init tree |
4793 | InitTreePRF(); | |
4794 | ||
4795 | // | |
4796 | // Debugging: Create the histos | |
4797 | // | |
4798 | ||
4799 | // fDebug == 0 nothing | |
4800 | ||
4801 | // fDebug == 1 | |
4802 | if (fDebug == 1) { | |
9f4780aa | 4803 | // Create the histos replique de ch |
4804 | InitArrayFitPRF(); | |
77566f2a | 4805 | } |
4806 | ||
8ec526a4 | 4807 | // fDebug == 2 and fFitVoir no histo |
4808 | if (fDebug == 2) { | |
4809 | if (fFitVoir < numberofbinsexpected) { | |
77566f2a | 4810 | AliInfo(Form("We will see the fit of the object %d",fFitVoir)); |
4811 | } | |
4812 | else { | |
4813 | AliInfo("fFitVoir is out of range of the histo!"); | |
4814 | return kFALSE; | |
4815 | } | |
4816 | } | |
8ec526a4 | 4817 | |
4818 | // fDebug == 3 or 4 and fDet | |
4819 | if (fDebug >= 3) { | |
4820 | if ((fNz[2] == 0) && | |
4821 | (fNrphi[2] == 0)) { | |
77566f2a | 4822 | AliInfo("Do you really want to see one detector without pad groups?"); |
4823 | return kFALSE; | |
4824 | } | |
8ec526a4 | 4825 | else { |
4826 | AliInfo(Form("You will see the detector: iPlane %d, iChamb %d, iSect %d" | |
4827 | ,fDet[0],fDet[1],fDet[2])); | |
4828 | // A little geometry: | |
77566f2a | 4829 | Int_t rowMax = parCom->GetRowMax(fDet[0],fDet[1],fDet[2]); |
4830 | Int_t colMax = parCom->GetColMax(fDet[0]); | |
8ec526a4 | 4831 | // Create the histos to visualise |
4832 | CreateFitHistoPRFDB(rowMax,colMax); | |
4833 | if (fDebug == 4) { | |
9f4780aa | 4834 | InitArrayFitPRF(); |
8ec526a4 | 4835 | } |
77566f2a | 4836 | } |
4837 | } | |
8ec526a4 | 4838 | |
77566f2a | 4839 | } |
4840 | ||
4841 | return kTRUE; | |
4842 | ||
4843 | } | |
4844 | ||
8ec526a4 | 4845 | //____________Functions for initialising the AliTRDCalibra in the code_________ |
4846 | void AliTRDCalibra::InitfCountDetAndfCount(Int_t i) | |
77566f2a | 4847 | { |
4848 | // | |
8ec526a4 | 4849 | // Init the current detector where we are fCountDet and the |
4850 | // next fCount for the functions Fit... | |
77566f2a | 4851 | // |
4852 | ||
8ec526a4 | 4853 | // Loop on the Xbins of ch!! |
4854 | fCountDet[i] = -1; // Current detector | |
4855 | fCount[i] = 0; // To find the next detector | |
77566f2a | 4856 | |
8ec526a4 | 4857 | // If fDebug >= 3 |
4858 | if (fDebug >= 3) { | |
4859 | ||
4860 | // Set countdet to the detector | |
4861 | fCountDet[i] = AliTRDgeometry::GetDetector(fDet[0],fDet[1],fDet[2]); | |
4862 | ||
4863 | // Determination of fNnZ, fNnRphi, fNfragZ and fNfragRphi | |
4864 | ModePadCalibration(fDet[1],i); | |
77566f2a | 4865 | ModePadFragmentation(fDet[0],fDet[1],fDet[2],i); |
4866 | ||
8ec526a4 | 4867 | // Set counter to write at the end of the detector |
4868 | fCount[i] = fDect1[i] + fNfragZ[i]*fNfragRphi[i]; | |
4869 | ||
77566f2a | 4870 | } |
77566f2a | 4871 | |
8ec526a4 | 4872 | } |
77566f2a | 4873 | |
8ec526a4 | 4874 | //____________Functions for initialising the AliTRDCalibra in the code_________ |
4875 | void AliTRDCalibra::UpdatefCountDetAndfCount(Int_t idect, Int_t i) | |
77566f2a | 4876 | { |
4877 | // | |
8ec526a4 | 4878 | // See if we are in a new detector and update the |
4879 | // variables fNfragZ and fNfragRphi if yes | |
77566f2a | 4880 | // |
4881 | ||
8ec526a4 | 4882 | // Determination of fNnZ, fNnRphi, fNfragZ and fNfragRphi |
4883 | // If fDebug == 1 or 0 | |
4884 | if ((fDebug == 0) || | |
4885 | (fDebug == 1)) { | |
4886 | ||
4887 | if (fCount[i] == idect) { | |
77566f2a | 4888 | |
8ec526a4 | 4889 | // On en est au detector |
4890 | fCountDet[i] += 1; | |
77566f2a | 4891 | |
8ec526a4 | 4892 | // Determination of fNnZ, fNnRphi, fNfragZ and fNfragRphi |
4893 | ModePadCalibration((Int_t) GetChamber(fCountDet[i]),i); | |
4894 | ModePadFragmentation((Int_t) GetPlane(fCountDet[i]) | |
4895 | ,(Int_t) GetChamber(fCountDet[i]) | |
4896 | ,(Int_t) GetSector(fCountDet[i]),i); | |
4897 | ||
4898 | // Set for the next detector | |
4899 | fCount[i] += fNfragZ[i]*fNfragRphi[i]; | |
4900 | ||
77566f2a | 4901 | } |
8ec526a4 | 4902 | |
77566f2a | 4903 | } |
8ec526a4 | 4904 | |
77566f2a | 4905 | } |
77566f2a | 4906 | |
8ec526a4 | 4907 | //____________Functions for initialising the AliTRDCalibra in the code_________ |
4908 | void AliTRDCalibra::ReconstructFitRowMinRowMax(Int_t idect, Int_t i) | |
77566f2a | 4909 | { |
4910 | // | |
8ec526a4 | 4911 | // Reconstruct the min pad row, max pad row, min pad col and |
4912 | // max pad col of the calibration group for the Fit functions | |
77566f2a | 4913 | // |
8ec526a4 | 4914 | |
4915 | if (fDebug < 2) { | |
4916 | ReconstructionRowPadGroup((Int_t) (idect-(fCount[i]-(fNfragZ[i]*fNfragRphi[i]))),i); | |
77566f2a | 4917 | } |
8ec526a4 | 4918 | if (fDebug >= 3) { |
4919 | ReconstructionRowPadGroup((Int_t) (idect-fDect1[i]),i); | |
77566f2a | 4920 | } |
77566f2a | 4921 | |
8ec526a4 | 4922 | } |
77566f2a | 4923 | |
8ec526a4 | 4924 | //____________Functions for initialising the AliTRDCalibra in the code_________ |
77566f2a | 4925 | Bool_t AliTRDCalibra::NotEnoughStatistic(Int_t idect, Int_t i) |
4926 | { | |
4927 | // | |
8ec526a4 | 4928 | // For the case where there are not enough entries in the histograms |
4929 | // of the calibration group, the value present in the choosen database | |
4930 | // will be put. A negativ sign enables to know that a fit was not possible. | |
77566f2a | 4931 | // |
4932 | ||
77566f2a | 4933 | // Get the parameter object |
4934 | AliTRDCommonParam *parCom = AliTRDCommonParam::Instance(); | |
4935 | if (!parCom) { | |
4936 | AliInfo("Could not get CommonParam Manager"); | |
4937 | return kFALSE; | |
4938 | } | |
4939 | ||
8ec526a4 | 4940 | // Get cal |
77566f2a | 4941 | AliTRDcalibDB *cal = AliTRDcalibDB::Instance(); |
4942 | if (!cal) { | |
4943 | AliInfo("Could not get calibDB"); | |
4944 | return kFALSE; | |
4945 | } | |
4946 | ||
8ec526a4 | 4947 | if (fDebug != 2) { |
4948 | AliInfo(Form("The element %d in this detector %d has not enough statistic to be fitted" | |
4949 | ,idect-(fCount[i]-(fNfragZ[i]*fNfragRphi[i])),fCountDet[i])); | |
77566f2a | 4950 | } |
8ec526a4 | 4951 | if (fDebug == 2) { |
77566f2a | 4952 | AliInfo("The element has not enough statistic to be fitted"); |
4953 | } | |
4954 | ||
8ec526a4 | 4955 | if ((i == 0) && (fDebug != 2)) { |
77566f2a | 4956 | |
8ec526a4 | 4957 | // Calcul the coef from the database choosen |
4958 | CalculChargeCoefMean(fCountDet[0],(Int_t) (idect-fDect1[0]),kFALSE); | |
77566f2a | 4959 | |
8ec526a4 | 4960 | // Fill the coefCH[2304] with negative value to say: not fitted |
4961 | for (Int_t k = fRowMin[0]; k < fRowMax[0]; k++) { | |
4962 | for (Int_t j = fColMin[0]; j < fColMax[0]; j++) { | |
4963 | if (GetChamber(fCountDet[0]) == 2) { | |
4964 | fCoefCH[(Int_t)(j*12+k)] = -TMath::Abs(fChargeCoef[3]); | |
4965 | } | |
4966 | if (GetChamber(fCountDet[0]) != 2) { | |
4967 | fCoefCH[(Int_t)(j*16+k)] = -TMath::Abs(fChargeCoef[3]); | |
4968 | } | |
77566f2a | 4969 | } |
8ec526a4 | 4970 | } |
9f4780aa | 4971 | |
4972 | // Put the default value negative | |
4973 | if ((fDebug == 1) || | |
4974 | (fDebug == 4)) { | |
4975 | ||
4976 | if (fFitChargeBisOn) { | |
4977 | fCoefCharge[2][idect-fDect1[0]]=-TMath::Abs(fChargeCoef[3]); | |
4978 | } | |
4979 | if (fMeanChargeOn) { | |
4980 | fCoefCharge[1][idect-fDect1[0]]=-TMath::Abs(fChargeCoef[3]); | |
4981 | } | |
4982 | ||
4983 | fCoefCharge[0][idect-fDect1[0]]=-TMath::Abs(fChargeCoef[3]); | |
4984 | ||
4985 | } | |
8ec526a4 | 4986 | |
4987 | // End of one detector | |
4988 | if ((idect == (fCount[0]-1))) { | |
4989 | FillVectorFitCH((Int_t) fCountDet[0]); | |
4990 | // Reset | |
4991 | for (Int_t k = 0; k < 2304; k++) { | |
4992 | fCoefCH[k] = 0.0; | |
77566f2a | 4993 | } |
4994 | } | |
8ec526a4 | 4995 | |
77566f2a | 4996 | } |
4997 | ||
8ec526a4 | 4998 | if ((i == 1) && (fDebug != 2)) { |
77566f2a | 4999 | |
8ec526a4 | 5000 | CalculVdriftCoefMean(fCountDet[1],(Int_t) (idect-fDect1[1])); |
5001 | CalculT0CoefMean(fCountDet[1],(Int_t) (idect-fDect1[1])); | |
5002 | ||
9f4780aa | 5003 | // Put the default value (time0 can be negativ, so we stay with + ) |
8ec526a4 | 5004 | if ((fDebug == 1) || |
5005 | (fDebug == 4)) { | |
5006 | ||
5007 | if (fFitPHOn) { | |
9f4780aa | 5008 | fCoefVdrift[0][(idect-fDect1[1])] = -fVdriftCoef[2]; |
5009 | fCoefT0[0][(idect-fDect1[1])] = fT0Coef[2]; | |
77566f2a | 5010 | } |
8ec526a4 | 5011 | |
9f4780aa | 5012 | fCoefVdrift[1][(idect-fDect1[1])] = -fVdriftCoef[2]; |
5013 | fCoefT0[1][(idect-fDect1[1])] = fT0Coef[2]; | |
8ec526a4 | 5014 | |
77566f2a | 5015 | } |
5016 | ||
8ec526a4 | 5017 | // Put the default value |
5018 | if (fDebug >= 3) { | |
77566f2a | 5019 | fVdriftCoef[0] = fVdriftCoef[2]; |
5020 | fVdriftCoef[1] = fVdriftCoef[2]; | |
5021 | FillCoefVdriftDB(); | |
8ec526a4 | 5022 | fT0Coef[0] = fT0Coef[2]; |
5023 | fT0Coef[1] = fT0Coef[2]; | |
77566f2a | 5024 | FillCoefT0DB(); |
5025 | } | |
77566f2a | 5026 | |
8ec526a4 | 5027 | // Fill the tree if end of a detector. |
9f4780aa | 5028 | // The pointer to the branch stays with the default value negative!!! |
8ec526a4 | 5029 | // PH |
5030 | // Pointer to the branch | |
5031 | for (Int_t k = fRowMin[1]; k < fRowMax[1]; k++) { | |
5032 | for (Int_t j = fColMin[1]; j < fColMax[1]; j++) { | |
5033 | if (GetChamber(fCountDet[1]) == 2) { | |
5034 | fVdriftPad[(Int_t)(j*12+k)] = -TMath::Abs(fVdriftCoef[2]); | |
5035 | } | |
5036 | if (GetChamber(fCountDet[1]) != 2) { | |
5037 | fVdriftPad[(Int_t)(j*16+k)] = -TMath::Abs(fVdriftCoef[2]); | |
5038 | } | |
77566f2a | 5039 | } |
8ec526a4 | 5040 | } |
5041 | ||
5042 | // End of one detector | |
5043 | if ((idect == (fCount[1]-1)) && (fDebug != 2)) { | |
5044 | FillTreeVdrift((Int_t) fCountDet[1]); | |
5045 | } | |
5046 | ||
5047 | // T0 | |
5048 | // Fill the tree if end of a detector. | |
9f4780aa | 5049 | // The pointer to the branch stays with the default value positive!!! |
8ec526a4 | 5050 | // Pointer to the branch |
5051 | for (Int_t k = fRowMin[1]; k < fRowMax[1]; k++) { | |
5052 | for (Int_t j = fColMin[1]; j < fColMax[1]; j++) { | |
5053 | if (GetChamber(fCountDet[1]) == 2) { | |
9f4780aa | 5054 | fT0Pad[(Int_t)(j*12+k)] = fT0Coef[2]; |
8ec526a4 | 5055 | } |
5056 | if (GetChamber(fCountDet[1]) != 2) { | |
9f4780aa | 5057 | fT0Pad[(Int_t)(j*16+k)] = fT0Coef[2]; |
8ec526a4 | 5058 | } |
77566f2a | 5059 | } |
8ec526a4 | 5060 | } |
5061 | ||
5062 | // End of one detector | |
5063 | if ((idect == (fCount[1]-1)) && (fDebug != 2)) { | |
5064 | FillTreeT0((Int_t) fCountDet[1]); | |
5065 | } | |
5066 | ||
77566f2a | 5067 | } |
77566f2a | 5068 | |
8ec526a4 | 5069 | if ((i == 2) && (fDebug != 2)) { |
5070 | ||
5071 | CalculPRFCoefMean(fCountDet[2],(Int_t) (idect-fDect1[2])); | |
77566f2a | 5072 | |
8ec526a4 | 5073 | if ((fDebug == 1) || |
5074 | (fDebug == 4)) { | |
9f4780aa | 5075 | fCoefPRF[0][(idect-fDect1[2])] = -fPRFCoef[1]; |
77566f2a | 5076 | } |
8ec526a4 | 5077 | |
5078 | if (fDebug >= 3){ | |
77566f2a | 5079 | fPRFCoef[0] = fPRFCoef[1]; |
5080 | FillCoefPRFDB(); | |
5081 | } | |
5082 | ||
8ec526a4 | 5083 | // Fill the tree if end of a detector. |
5084 | // The pointer to the branch stays with the default value 1.5!!! | |
5085 | // Pointer to the branch | |
5086 | for (Int_t k = fRowMin[2]; k < fRowMax[2]; k++) { | |
5087 | for (Int_t j = fColMin[2]; j < fColMax[2]; j++) { | |
5088 | if((parCom->GetColMax(GetPlane(fCountDet[2])) != (j+1)) && (j != 0)){ | |
5089 | if (GetChamber(fCountDet[2]) == 2) { | |
5090 | fPRFPad[(Int_t)(j*12+k)] = -fPRFCoef[1]; | |
5091 | } | |
5092 | if (GetChamber(fCountDet[2]) != 2) { | |
5093 | fPRFPad[(Int_t)(j*16+k)] = -fPRFCoef[1]; | |
5094 | } | |
77566f2a | 5095 | } |
8ec526a4 | 5096 | else { |
5097 | if (fAccCDB) { | |
5098 | if (GetChamber(fCountDet[2]) == 2) { | |
5099 | fPRFPad[(Int_t)(j*12+k)] = -((Float_t) cal->GetPRFWidth(fCountDet[2],j,k)); | |
5100 | } | |
5101 | if (GetChamber(fCountDet[2]) != 2) { | |
5102 | fPRFPad[(Int_t)(j*16+k)] = -((Float_t) cal->GetPRFWidth(fCountDet[2],j,k)); | |
5103 | } | |
5104 | } | |
5105 | if (!fAccCDB) { | |
5106 | if (GetChamber(fCountDet[2]) == 2) { | |
5107 | fPRFPad[(Int_t)(j*12+k)] = -((Float_t) GetPRFDefault(GetPlane(fCountDet[2]))); | |
5108 | } | |
5109 | if (GetChamber(fCountDet[2]) != 2) { | |
5110 | fPRFPad[(Int_t)(j*16+k)] = -((Float_t) GetPRFDefault(GetPlane(fCountDet[2]))); | |
5111 | } | |
5112 | } | |
77566f2a | 5113 | } |
5114 | } | |
8ec526a4 | 5115 | } |
5116 | ||
5117 | // End of one detector | |
5118 | if ((idect == (fCount[2]-1)) && (fDebug != 2)) { | |
5119 | FillTreePRF((Int_t) fCountDet[2]); | |
5120 | } | |
5121 | ||
77566f2a | 5122 | } |
5123 | ||
5124 | return kTRUE; | |
8ec526a4 | 5125 | |
77566f2a | 5126 | } |
5127 | ||
8ec526a4 | 5128 | //____________Functions for initialising the AliTRDCalibra in the code_________ |
77566f2a | 5129 | Bool_t AliTRDCalibra::FillInfosFit(Int_t idect, Int_t i) |
5130 | { | |
5131 | // | |
8ec526a4 | 5132 | // Fill the coefficients found with the fits or other |
5133 | // methods from the Fit functions | |
77566f2a | 5134 | // |
77566f2a | 5135 | |
5136 | // Get the parameter object | |
5137 | AliTRDCommonParam *parCom = AliTRDCommonParam::Instance(); | |
5138 | if (!parCom) { | |
5139 | AliInfo("Could not get CommonParam Manager"); | |
5140 | return kFALSE; | |
5141 | } | |
5142 | ||
8ec526a4 | 5143 | // Get cal |
77566f2a | 5144 | AliTRDcalibDB *cal = AliTRDcalibDB::Instance(); |
5145 | if (!cal) { | |
5146 | AliInfo("Could not get calibDB"); | |
5147 | return kFALSE; | |
5148 | } | |
5149 | ||
8ec526a4 | 5150 | if ((i == 0) && (fDebug != 2)) { |
5151 | // Fill the coefCH[2304] with fChargeCoef[0] | |
5152 | // that would be negativ only if the fit failed totally | |
5153 | for (Int_t k = fRowMin[0]; k < fRowMax[0]; k++) { | |
5154 | for (Int_t j = fColMin[0]; j < fColMax[0]; j++) { | |
5155 | if (GetChamber(fCountDet[0]) == 2) { | |
5156 | fCoefCH[(Int_t)(j*12+k)] = fChargeCoef[0]; | |
5157 | } | |
5158 | if (GetChamber(fCountDet[0]) != 2) { | |
5159 | fCoefCH[(Int_t)(j*16+k)] = fChargeCoef[0]; | |
5160 | } | |
77566f2a | 5161 | } |
5162 | } | |
8ec526a4 | 5163 | // End of one detector |
5164 | if ((idect == (fCount[0]-1))) { | |
5165 | FillVectorFitCH((Int_t) fCountDet[0]); | |
5166 | // Reset | |
5167 | for (Int_t k = 0; k < 2304; k++) { | |
5168 | fCoefCH[k] = 0.0; | |
77566f2a | 5169 | } |
5170 | } | |
5171 | } | |
77566f2a | 5172 | |
8ec526a4 | 5173 | if ((i == 1) && (fDebug != 2)) { |
5174 | ||
5175 | // PH | |
5176 | // Pointer to the branch: fVdriftCoef[1] will ne negativ only if the fit failed totally | |
5177 | for (Int_t k = fRowMin[1]; k < fRowMax[1]; k++) { | |
5178 | for (Int_t j = fColMin[1]; j < fColMax[1]; j++) { | |
5179 | if (GetChamber(fCountDet[1]) == 2) { | |
5180 | fVdriftPad[(Int_t)(j*12+k)]=fVdriftCoef[1]; | |
5181 | } | |
5182 | if (GetChamber(fCountDet[1]) != 2) { | |
5183 | fVdriftPad[(Int_t)(j*16+k)]=fVdriftCoef[1]; | |
5184 | } | |
77566f2a | 5185 | } |
5186 | } | |
8ec526a4 | 5187 | // End of one detector |
5188 | if ((idect == (fCount[1]-1)) && (fDebug != 2)) { | |
5189 | FillTreeVdrift((Int_t) fCountDet[1]); | |
5190 | } | |
77566f2a | 5191 | |
8ec526a4 | 5192 | // T0 |
5193 | // Pointer to the branch: fT0Coef[1] will ne negativ only if the fit failed totally | |
5194 | for (Int_t k = fRowMin[1]; k < fRowMax[1]; k++) { | |
5195 | for (Int_t j = fColMin[1]; j < fColMax[1]; j++) { | |
5196 | if (GetChamber(fCountDet[1]) == 2) { | |
5197 | fT0Pad[(Int_t)(j*12+k)]=fT0Coef[1]; | |
5198 | } | |
5199 | if (GetChamber(fCountDet[1]) != 2) { | |
5200 | fT0Pad[(Int_t)(j*16+k)]=fT0Coef[1]; | |
5201 | } | |
77566f2a | 5202 | } |
5203 | } | |
8ec526a4 | 5204 | // End of one detector |
5205 | if ((idect == (fCount[1]-1)) && (fDebug != 2)) { | |
5206 | FillTreeT0((Int_t) fCountDet[1]); | |
5207 | } | |
5208 | ||
77566f2a | 5209 | } |
8ec526a4 | 5210 | |
5211 | if ((i == 2) && (fDebug != 2)) { | |
5212 | // Pointer to the branch | |
5213 | for (Int_t k = fRowMin[2]; k < fRowMax[2]; k++) { | |
5214 | for (Int_t j = fColMin[2]; j < fColMax[2]; j++) { | |
5215 | if ((parCom->GetColMax(GetPlane(fCountDet[2])) != (j+1)) && (j != 0)) { | |
5216 | if (GetChamber(fCountDet[2]) == 2) { | |
5217 | fPRFPad[(Int_t)(j*12+k)] = fPRFCoef[0]; | |
5218 | } | |
5219 | if (GetChamber(fCountDet[2]) != 2) { | |
5220 | fPRFPad[(Int_t)(j*16+k)] = fPRFCoef[0]; | |
5221 | } | |
5222 | } | |
5223 | else { | |
5224 | if (fAccCDB) { | |
5225 | if (GetChamber(fCountDet[2]) == 2) { | |
5226 | fPRFPad[(Int_t)(j*12+k)] = (Float_t) cal->GetPRFWidth(fCountDet[2],j,k); | |
5227 | } | |
5228 | if (GetChamber(fCountDet[2]) != 2) { | |
5229 | fPRFPad[(Int_t)(j*16+k)] = (Float_t) cal->GetPRFWidth(fCountDet[2],j,k); | |
5230 | } | |
5231 | } | |
5232 | if (!fAccCDB) { | |
5233 | if (GetChamber(fCountDet[2]) == 2) { | |
5234 | fPRFPad[(Int_t)(j*12+k)] = (Float_t) GetPRFDefault(GetPlane(fCountDet[2])); | |
5235 | } | |
5236 | if (GetChamber(fCountDet[2]) != 2) { | |
5237 | fPRFPad[(Int_t)(j*16+k)] = (Float_t) GetPRFDefault(GetPlane(fCountDet[2])); | |
5238 | } | |
77566f2a | 5239 | } |
77566f2a | 5240 | } |
8ec526a4 | 5241 | } |
5242 | } | |
5243 | // End of one detector | |
5244 | if ((idect == (fCount[2]-1)) && (fDebug != 2)) { | |
5245 | FillTreePRF((Int_t) fCountDet[2]); | |
5246 | } | |
77566f2a | 5247 | } |
8ec526a4 | 5248 | |
77566f2a | 5249 | return kTRUE; |
5250 | ||
5251 | } | |
77566f2a | 5252 | |
8ec526a4 | 5253 | //____________Functions for initialising the AliTRDCalibra in the code_________ |
77566f2a | 5254 | Bool_t AliTRDCalibra::WriteFitInfos(Int_t i) |
5255 | { | |
5256 | // | |
8ec526a4 | 5257 | // In the case the user wants to write a file with a tree of the found |
5258 | // coefficients for the calibration before putting them in the database | |
77566f2a | 5259 | // |
5260 | ||
77566f2a | 5261 | TFile *fout = TFile::Open(fWriteNameCoef,"UPDATE"); |
8ec526a4 | 5262 | // Check if the file could be opened |
77566f2a | 5263 | if (!fout || !fout->IsOpen()) { |
5264 | AliInfo("No File found!"); | |
5265 | return kFALSE; | |
5266 | } | |
8ec526a4 | 5267 | |
5268 | if ((i == 0) && (fDebug != 2)) { | |
8ec526a4 | 5269 | // The DB stuff |
5270 | if ((fDebug == 4) || | |
5271 | (fDebug == 3)) { | |
5272 | WriteCHDB(fout); | |
5273 | } | |
5274 | // The tree | |
5275 | fout->WriteTObject(fGain,fGain->GetName(),(Option_t *) "writedelete"); | |
5276 | } | |
5277 | ||
5278 | if ((i == 1) && (fDebug != 2)) { | |
8ec526a4 | 5279 | // The DB stuff |
5280 | if ((fDebug == 4) || | |
5281 | (fDebug == 3)) { | |
5282 | WritePHDB(fout); | |
5283 | } | |
5284 | // The tree | |
5285 | fout->WriteTObject(fVdrift,fVdrift->GetName(),(Option_t *) "writedelete"); | |
8ec526a4 | 5286 | // The DB stuff |
5287 | if ((fDebug == 4) || | |
5288 | (fDebug == 3)) { | |
5289 | WriteT0DB(fout); | |
5290 | } | |
5291 | // The tree | |
5292 | fout->WriteTObject(fT0,fT0->GetName(),(Option_t *) "writedelete"); | |
5293 | } | |
5294 | ||
5295 | if ((i == 2) && (fDebug != 2)) { | |
8ec526a4 | 5296 | // The DB stuff |
5297 | if ((fDebug == 4) || | |
5298 | (fDebug == 3)) { | |
5299 | WritePRFDB(fout); | |
5300 | } | |
5301 | // The tree | |
5302 | fout->WriteTObject(fPRF,fPRF->GetName(),(Option_t *) "writedelete"); | |
77566f2a | 5303 | } |
8ec526a4 | 5304 | |
77566f2a | 5305 | fout->Close(); |
8ec526a4 | 5306 | |
77566f2a | 5307 | return kTRUE; |
8ec526a4 | 5308 | |
77566f2a | 5309 | } |
77566f2a | 5310 | |
8ec526a4 | 5311 | // |
5312 | //____________Fill Coef DB in case of visualisation of one detector____________ | |
5313 | // | |
5314 | ||
5315 | //_____________________________________________________________________________ | |
77566f2a | 5316 | void AliTRDCalibra::FillCoefVdriftDB() |
5317 | { | |
5318 | // | |
5319 | // Fill the histos for fDebug = 3 and fDebug = 4 to visualise the detector | |
5320 | // | |
5321 | ||
8ec526a4 | 5322 | for (Int_t row = fRowMin[1]; row < fRowMax[1]; row++) { |
5323 | for (Int_t col = fColMin[1]; col < fColMax[1]; col++) { | |
77566f2a | 5324 | fCoefVdriftDB[1]->SetBinContent(row+1,col+1,TMath::Abs(fVdriftCoef[1])); |
8ec526a4 | 5325 | if (fFitPHOn ) { |
5326 | fCoefVdriftDB[0]->SetBinContent(row+1,col+1,TMath::Abs(fVdriftCoef[0])); | |
5327 | } | |
77566f2a | 5328 | } |
5329 | } | |
8ec526a4 | 5330 | |
77566f2a | 5331 | } |
8ec526a4 | 5332 | |
5333 | //_____________________________________________________________________________ | |
77566f2a | 5334 | void AliTRDCalibra::FillCoefT0DB() |
5335 | { | |
5336 | // | |
5337 | // Fill the histos for fDebug = 3 and fDebug = 4 to visualise the detector | |
5338 | // | |
5339 | ||
8ec526a4 | 5340 | for (Int_t row = fRowMin[1]; row < fRowMax[1]; row++) { |
5341 | for (Int_t col = fColMin[1]; col < fColMax[1]; col++) { | |
77566f2a | 5342 | fCoefT0DB[1]->SetBinContent(row+1,col+1,TMath::Abs(fT0Coef[1])); |
8ec526a4 | 5343 | if (fFitPHOn) { |
5344 | fCoefT0DB[0]->SetBinContent(row+1,col+1,TMath::Abs(fT0Coef[0])); | |
5345 | } | |
77566f2a | 5346 | } |
5347 | } | |
8ec526a4 | 5348 | |
77566f2a | 5349 | } |
8ec526a4 | 5350 | |
5351 | //_____________________________________________________________________________ | |
77566f2a | 5352 | void AliTRDCalibra::FillCoefChargeDB() |
5353 | { | |
5354 | // | |
5355 | // Fill the histos for fDebug = 3 and fDebug = 4 to visualise the detector | |
5356 | // | |
5357 | ||
8ec526a4 | 5358 | for (Int_t row = fRowMin[0]; row < fRowMax[0]; row++) { |
5359 | for (Int_t col = fColMin[0]; col < fColMax[0]; col++) { | |
5360 | if (fMeanChargeOn) { | |
5361 | fCoefChargeDB[1]->SetBinContent(row+1,col+1,TMath::Abs(fChargeCoef[1])); | |
5362 | } | |
5363 | if (fFitChargeBisOn) { | |
5364 | fCoefChargeDB[2]->SetBinContent(row+1,col+1,TMath::Abs(fChargeCoef[2])); | |
5365 | } | |
77566f2a | 5366 | fCoefChargeDB[0]->SetBinContent(row+1,col+1,TMath::Abs(fChargeCoef[0])); |
5367 | } | |
8ec526a4 | 5368 | } |
5369 | ||
77566f2a | 5370 | } |
8ec526a4 | 5371 | |
5372 | //_____________________________________________________________________________ | |
77566f2a | 5373 | void AliTRDCalibra::FillCoefPRFDB() |
5374 | { | |
5375 | // | |
5376 | // Fill the histos for fDebug = 3 and fDebug = 4 to visualise the detector | |
5377 | // | |
8ec526a4 | 5378 | |
5379 | for (Int_t row = fRowMin[2]; row < fRowMax[2]; row++) { | |
5380 | for (Int_t col = fColMin[2]; col < fColMax[2]; col++) { | |
77566f2a | 5381 | fCoefPRFDB->SetBinContent(row+1,col+1,fPRFCoef[0]); |
77566f2a | 5382 | } |
8ec526a4 | 5383 | } |
77566f2a | 5384 | |
8ec526a4 | 5385 | } |
77566f2a | 5386 | |
8ec526a4 | 5387 | // |
5388 | //____________Plot histos CoefPRF....__________________________________________ | |
5389 | // | |
77566f2a | 5390 | |
8ec526a4 | 5391 | //_____________________________________________________________________________ |
9f4780aa | 5392 | void AliTRDCalibra::PlotWriteCH() |
77566f2a | 5393 | { |
5394 | // | |
9f4780aa | 5395 | // Scale the coefficients to one, create the graph errors and write them if wanted |
77566f2a | 5396 | // |
8ec526a4 | 5397 | |
9f4780aa | 5398 | //TObjArray of the grapherrors and so on |
5399 | TObjArray *listofgraphs = new TObjArray(); | |
5400 | ||
5401 | Int_t nbins = fDect2[0]-fDect1[0]; | |
5402 | ||
5403 | //Scale the coefs | |
5404 | ||
5405 | //counter | |
5406 | Int_t counter[3]; | |
5407 | counter[0] = 0; | |
5408 | counter[1] = 0; | |
5409 | counter[2] = 0; | |
5410 | Double_t sum = 0.0; | |
5411 | Double_t scale = 1.0; | |
5412 | ||
5413 | // Scale the histo | |
5414 | Double_t *xValuesFitted = new Double_t[nbins]; | |
5415 | Double_t *xValuesFittedMean = new Double_t[nbins]; | |
5416 | Double_t *xValuesFittedBis = new Double_t[nbins]; | |
5417 | for(Int_t k = 0; k < nbins; k ++){ | |
5418 | xValuesFitted[k] = -1; | |
5419 | xValuesFittedMean[k] = -1; | |
5420 | xValuesFittedBis[k] = -1; | |
5421 | } | |
5422 | ||
5423 | for(Int_t l = 0; l < nbins; l++){ | |
5424 | if(fCoefCharge[0][l] > 0){ | |
5425 | fCoefCharge[0][l]=fCoefCharge[0][l]*fScaleFitFactor; | |
5426 | fCoefChargeE[0][l]=fCoefChargeE[0][l]*fScaleFitFactor; | |
5427 | xValuesFitted[counter[0]]=l; | |
5428 | counter[0]++; | |
5429 | } | |
5430 | } | |
5431 | if(fMeanChargeOn){ | |
5432 | sum = 0.0; | |
5433 | for(Int_t l = 0; l < nbins; l++){ | |
5434 | if(fCoefCharge[1][l] > 0){ | |
5435 | sum += fCoefCharge[1][l]; | |
5436 | xValuesFittedMean[counter[1]]= l; | |
5437 | counter[1]++; | |
5438 | } | |
5439 | } | |
5440 | scale = 1.0; | |
5441 | if(sum > 0.0) scale = counter[1]/sum; | |
5442 | for(Int_t l = 0; l < nbins; l++){ | |
5443 | if(fCoefCharge[1][l] > 0){ | |
5444 | fCoefCharge[1][l]=fCoefCharge[1][l]*scale; | |
5445 | fCoefChargeE[1][l]=fCoefChargeE[1][l]*scale; | |
5446 | } | |
5447 | } | |
5448 | } | |
5449 | if(fFitChargeBisOn){ | |
5450 | sum = 0.0; | |
5451 | for(Int_t l = 0; l < nbins; l++){ | |
5452 | if(fCoefCharge[2][l] > 0){ | |
5453 | fCoefCharge[2][l]=fCoefCharge[2][l]*fScaleFitFactor; | |
5454 | fCoefChargeE[2][l]=fCoefChargeE[2][l]*fScaleFitFactor; | |
5455 | sum += fCoefCharge[2][l]; | |
5456 | xValuesFittedBis[counter[2]]= l; | |
5457 | counter[2]++; | |
5458 | } | |
5459 | } | |
5460 | scale = 1.0; | |
5461 | if(sum > 0.0) scale = counter[2]/sum; | |
5462 | for(Int_t l = 0; l < nbins; l++){ | |
5463 | if(fCoefCharge[2][l] > 0){ | |
5464 | fCoefCharge[2][l]=fCoefCharge[2][l]*scale; | |
5465 | fCoefChargeE[2][l]=fCoefChargeE[2][l]*scale; | |
5466 | if(fCoefCharge[2][l] > 1.0) printf("for the group %d, I have the coef %f with the error %f\n",l,fCoefCharge[2][l],fCoefChargeE[2][l]); | |
5467 | } | |
5468 | } | |
5469 | } | |
5470 | ||
5471 | //Create the X and Xerror | |
5472 | Double_t *xValues = new Double_t[nbins]; | |
5473 | Double_t *xValuesE = new Double_t[nbins]; | |
5474 | for(Int_t k = 0; k < nbins; k ++){ | |
5475 | xValues[k] = k; | |
5476 | xValuesE[k] = 0.0; | |
5477 | } | |
5478 | ||
5479 | //Create the graph erros and plot them | |
5480 | TGraph *graphCharge3 = new TGraph(nbins,xValues,fCoefCharge[3]); | |
5481 | graphCharge3->SetName("coefcharge3"); | |
5482 | graphCharge3->SetTitle(""); | |
5483 | graphCharge3->GetXaxis()->SetTitle("Det/Pad groups"); | |
5484 | graphCharge3->GetYaxis()->SetTitle("gain factor"); | |
5485 | graphCharge3->SetLineColor(4); | |
5486 | listofgraphs->Add((TObject *)graphCharge3); | |
5487 | TGraphErrors *graphCharge0 = new TGraphErrors(nbins,xValues,fCoefCharge[0],xValuesE,fCoefChargeE[0]); | |
5488 | graphCharge0->SetName("coefcharge0"); | |
5489 | graphCharge0->SetTitle(""); | |
5490 | graphCharge0->GetXaxis()->SetTitle("Det/Pad groups"); | |
5491 | graphCharge0->GetYaxis()->SetTitle("gain factor"); | |
5492 | graphCharge0->SetMarkerColor(6); | |
5493 | graphCharge0->SetLineColor(6); | |
5494 | graphCharge0->SetMarkerStyle(26); | |
5495 | listofgraphs->Add((TObject *)graphCharge0); | |
77566f2a | 5496 | TCanvas *cch1 = new TCanvas("cch1","",50,50,600,800); |
5497 | cch1->cd(); | |
5498 | TLegend *legch1 = new TLegend(0.4,0.6,0.89,0.89); | |
9f4780aa | 5499 | legch1->AddEntry(graphCharge3,"f_{g} simulated","l"); |
5500 | legch1->AddEntry(graphCharge0,"f_{g} fit","p"); | |
5501 | graphCharge0->Draw("AP"); | |
5502 | //graphCharge3->Draw("AL"); | |
8ec526a4 | 5503 | if (fMeanChargeOn) { |
9f4780aa | 5504 | TGraphErrors *graphCharge1 = new TGraphErrors(nbins,xValues,fCoefCharge[1],xValuesE,fCoefChargeE[1]); |
5505 | graphCharge1->SetName("coefcharge1"); | |
5506 | graphCharge1->GetXaxis()->SetTitle("Det/Pad groups"); | |
5507 | graphCharge1->GetYaxis()->SetTitle("gain factor"); | |
5508 | graphCharge1->SetTitle(""); | |
5509 | graphCharge1->SetMarkerColor(2); | |
5510 | graphCharge1->SetLineColor(2); | |
5511 | graphCharge1->SetMarkerStyle(24); | |
5512 | legch1->AddEntry(graphCharge1,"f_{g} mean","p"); | |
5513 | graphCharge1->Draw("P"); | |
5514 | listofgraphs->Add((TObject *)graphCharge1); | |
8ec526a4 | 5515 | } |
8ec526a4 | 5516 | if (fFitChargeBisOn ) { |
9f4780aa | 5517 | TGraphErrors *graphCharge2 = new TGraphErrors(nbins,xValues,fCoefCharge[2],xValuesE,fCoefChargeE[2]); |
5518 | graphCharge2->SetName("coefcharge2"); | |
5519 | graphCharge2->SetTitle(""); | |
5520 | graphCharge2->GetXaxis()->SetTitle("Det/Pad groups"); | |
5521 | graphCharge2->GetYaxis()->SetTitle("gain factor"); | |
5522 | graphCharge2->SetMarkerColor(8); | |
5523 | graphCharge2->SetLineColor(8); | |
5524 | graphCharge2->SetMarkerStyle(25); | |
5525 | legch1->AddEntry(graphCharge2,"f_{g} fitbis","p"); | |
5526 | graphCharge2->Draw("P"); | |
5527 | listofgraphs->Add((TObject *)graphCharge2); | |
5528 | } | |
77566f2a | 5529 | legch1->Draw("same"); |
8ec526a4 | 5530 | |
9f4780aa | 5531 | |
5532 | //Create the arrays and the graphs for the delta | |
77566f2a | 5533 | TCanvas *cch2 = new TCanvas("cch2","",50,50,600,800); |
5534 | cch2->Divide(2,1); | |
77566f2a | 5535 | cch2->cd(2); |
9f4780aa | 5536 | Double_t *yValuesDelta = new Double_t[counter[0]]; |
5537 | for(Int_t k = 0; k < counter[0]; k++){ | |
5538 | if(fCoefCharge[3][(Int_t)(xValuesFitted[k])] > 0.0) { | |
5539 | yValuesDelta[k] = (fCoefCharge[0][(Int_t)xValuesFitted[k]]-fCoefCharge[3][(Int_t)xValuesFitted[k]])/fCoefCharge[3][(Int_t)xValuesFitted[k]]; | |
5540 | } | |
5541 | else yValuesDelta[k] = 0.0; | |
5542 | } | |
5543 | TGraph *graphDeltaCharge0 = new TGraph(counter[0],&xValuesFitted[0],yValuesDelta); | |
5544 | graphDeltaCharge0->SetName("deltacharge0"); | |
5545 | graphDeltaCharge0->GetXaxis()->SetTitle("Det/Pad groups"); | |
5546 | graphDeltaCharge0->GetYaxis()->SetTitle("#Deltag/g_{sim}"); | |
5547 | graphDeltaCharge0->SetMarkerColor(6); | |
5548 | graphDeltaCharge0->SetTitle(""); | |
5549 | graphDeltaCharge0->SetLineColor(6); | |
5550 | graphDeltaCharge0->SetMarkerStyle(26); | |
5551 | listofgraphs->Add((TObject *)graphDeltaCharge0); | |
77566f2a | 5552 | TLegend *legch3 = new TLegend(0.4,0.6,0.89,0.89); |
9f4780aa | 5553 | legch3->AddEntry(graphDeltaCharge0,"fit","p"); |
5554 | graphDeltaCharge0->Draw("AP"); | |
5555 | cch2->cd(1); | |
5556 | TH1I *histoErrorCharge0 = new TH1I("errorcharge0","",100 ,-0.3,0.3); | |
5557 | histoErrorCharge0->SetXTitle("#Deltag/g_{sim}"); | |
5558 | histoErrorCharge0->SetYTitle("counts"); | |
5559 | histoErrorCharge0->SetLineColor(6); | |
5560 | histoErrorCharge0->SetLineStyle(1); | |
5561 | histoErrorCharge0->SetStats(0); | |
5562 | for(Int_t k = 0; k < counter[0]; k++){ | |
5563 | histoErrorCharge0->Fill(yValuesDelta[k]); | |
8ec526a4 | 5564 | } |
9f4780aa | 5565 | TLegend *legch2 = new TLegend(0.4,0.6,0.89,0.89); |
5566 | legch2->AddEntry(histoErrorCharge0,"f_{g} fit","l"); | |
5567 | histoErrorCharge0->Draw(); | |
5568 | listofgraphs->Add((TObject *)histoErrorCharge0); | |
8ec526a4 | 5569 | if (fMeanChargeOn) { |
9f4780aa | 5570 | cch2->cd(2); |
5571 | Double_t *yValuesDeltaMean = new Double_t[counter[1]]; | |
5572 | for(Int_t k = 0; k < counter[1]; k++){ | |
5573 | if(fCoefCharge[3][(Int_t)xValuesFittedMean[k]] > 0.0) { | |
5574 | yValuesDeltaMean[k] = (fCoefCharge[1][(Int_t)xValuesFittedMean[k]]-fCoefCharge[3][(Int_t)xValuesFittedMean[k]])/fCoefCharge[3][(Int_t)xValuesFittedMean[k]]; | |
5575 | } | |
5576 | else yValuesDeltaMean[k] = 0.0; | |
5577 | } | |
5578 | TGraph *graphDeltaCharge1 = new TGraph(counter[1],&xValuesFittedMean[0],yValuesDeltaMean); | |
5579 | graphDeltaCharge1->SetName("deltacharge1"); | |
5580 | graphDeltaCharge1->GetXaxis()->SetTitle("Det/Pad groups"); | |
5581 | graphDeltaCharge1->GetYaxis()->SetTitle("#Deltag/g_{sim}"); | |
5582 | graphDeltaCharge1->SetMarkerColor(2); | |
5583 | graphDeltaCharge1->SetMarkerStyle(24); | |
5584 | graphDeltaCharge1->SetLineColor(2); | |
5585 | graphDeltaCharge1->SetTitle(""); | |
5586 | legch3->AddEntry(graphDeltaCharge1,"mean","p"); | |
5587 | graphDeltaCharge1->Draw("P"); | |
5588 | listofgraphs->Add((TObject *)graphDeltaCharge1); | |
5589 | cch2->cd(1); | |
5590 | TH1I *histoErrorCharge1 = new TH1I("errorcharge1","",100 ,-0.3,0.3); | |
5591 | histoErrorCharge1->SetXTitle("#Deltag/g_{sim}"); | |
5592 | histoErrorCharge1->SetYTitle("counts"); | |
5593 | histoErrorCharge1->SetLineColor(2); | |
5594 | histoErrorCharge1->SetLineStyle(2); | |
5595 | histoErrorCharge1->SetStats(0); | |
5596 | for(Int_t k = 0; k < counter[1]; k++){ | |
5597 | histoErrorCharge1->Fill(yValuesDeltaMean[k]); | |
5598 | } | |
5599 | legch2->AddEntry(histoErrorCharge1,"f_{g} mean","l"); | |
5600 | histoErrorCharge1->Draw("same"); | |
5601 | listofgraphs->Add((TObject *)histoErrorCharge1); | |
8ec526a4 | 5602 | } |
9f4780aa | 5603 | |
8ec526a4 | 5604 | if (fFitChargeBisOn) { |
9f4780aa | 5605 | cch2->cd(2); |
5606 | Double_t *yValuesDeltaBis = new Double_t[counter[2]]; | |
5607 | for(Int_t k = 0; k < counter[2]; k++){ | |
5608 | if(fCoefCharge[3][(Int_t)xValuesFittedBis[k]] > 0.0) { | |
5609 | yValuesDeltaBis[k] = (fCoefCharge[2][(Int_t)xValuesFittedBis[k]]-fCoefCharge[3][(Int_t)xValuesFittedBis[k]])/fCoefCharge[3][(Int_t)xValuesFittedBis[k]]; | |
5610 | } | |
5611 | else yValuesDeltaBis[k] = 0.0; | |
5612 | } | |
5613 | TGraph *graphDeltaCharge2 = new TGraph(counter[2],&xValuesFittedBis[0],yValuesDeltaBis); | |
5614 | graphDeltaCharge2->SetName("deltacharge2"); | |
5615 | graphDeltaCharge2->GetXaxis()->SetTitle("Det/Pad groups"); | |
5616 | graphDeltaCharge2->GetYaxis()->SetTitle("#Deltag/g_{sim}"); | |
5617 | graphDeltaCharge2->SetMarkerColor(8); | |
5618 | graphDeltaCharge2->SetLineColor(8); | |
5619 | graphDeltaCharge2->SetMarkerStyle(25); | |
5620 | legch3->AddEntry(graphDeltaCharge2,"fit","p"); | |
5621 | graphDeltaCharge2->SetTitle(""); | |
5622 | graphDeltaCharge2->Draw("P"); | |
5623 | listofgraphs->Add((TObject *)graphDeltaCharge2); | |
5624 | cch2->cd(1); | |
5625 | TH1I *histoErrorCharge2 = new TH1I("errorcharge2","",100 ,-0.3,0.3); | |
5626 | histoErrorCharge2->SetXTitle("#Deltag/g_{sim}"); | |
5627 | histoErrorCharge2->SetYTitle("counts"); | |
5628 | histoErrorCharge2->SetLineColor(8); | |
5629 | histoErrorCharge2->SetLineStyle(5); | |
5630 | histoErrorCharge2->SetLineWidth(3); | |
5631 | histoErrorCharge2->SetStats(0); | |
5632 | for(Int_t k = 0; k < counter[2]; k++){ | |
5633 | histoErrorCharge2->Fill(yValuesDeltaBis[k]); | |
5634 | } | |
5635 | legch2->AddEntry(histoErrorCharge2,"f_{g} fitbis","l"); | |
5636 | histoErrorCharge2->Draw("same"); | |
5637 | listofgraphs->Add((TObject *)histoErrorCharge2); | |
8ec526a4 | 5638 | } |
9f4780aa | 5639 | cch2->cd(2); |
77566f2a | 5640 | legch3->Draw("same"); |
9f4780aa | 5641 | cch2->cd(1); |
5642 | legch2->Draw("same"); | |
5643 | ||
5644 | ||
5645 | //Write if wanted | |
5646 | if (fWriteCoef[0]){ | |
5647 | TFile *fout = TFile::Open(fWriteNameCoef,"UPDATE"); | |
5648 | // Check if the file could be opened | |
5649 | if (!fout || !fout->IsOpen()) { | |
5650 | AliInfo("No File found!"); | |
5651 | } | |
5652 | ||
5653 | else{ | |
5654 | for(Int_t k = 0; k < listofgraphs->GetEntriesFast(); k++){ | |
5655 | fout->WriteTObject((TObject *) listofgraphs->At(k),((TObject *)listofgraphs->At(k))->GetName(),(Option_t *) "OverWrite"); | |
5656 | } | |
5657 | } | |
5658 | fout->Close(); | |
5659 | } | |
5660 | ||
77566f2a | 5661 | } |
8ec526a4 | 5662 | |
5663 | //_____________________________________________________________________________ | |
9f4780aa | 5664 | void AliTRDCalibra::PlotWritePH() |
77566f2a | 5665 | { |
5666 | // | |
9f4780aa | 5667 | // create the graph errors and write them if wanted |
77566f2a | 5668 | // |
5669 | ||
9f4780aa | 5670 | //TObjArray of the grapherrors and so on |
5671 | TObjArray *listofgraphs = new TObjArray(); | |
5672 | ||
5673 | Int_t nbins = fDect2[1]-fDect1[1]; | |
5674 | ||
5675 | //See the number of fitted for delta | |
5676 | ||
5677 | //counter | |
5678 | Int_t counter[2]; | |
5679 | counter[0] = 0; | |
5680 | counter[1] = 0; | |
5681 | ||
5682 | Double_t *xValuesFitted = new Double_t[nbins]; | |
5683 | Double_t *xValuesFittedPH = new Double_t[nbins]; | |
5684 | for(Int_t k = 0; k < nbins; k ++){ | |
5685 | xValuesFitted[k] = -1; | |
5686 | xValuesFittedPH[k] = -1; | |
5687 | } | |
5688 | ||
5689 | for(Int_t l = 0; l < nbins; l++){ | |
5690 | if(fCoefVdrift[1][l] > 0){ | |
5691 | xValuesFitted[counter[1]]=l; | |
5692 | counter[1]++; | |
5693 | } | |
5694 | } | |
5695 | if(fFitPHOn){ | |
5696 | for(Int_t l = 0; l < nbins; l++){ | |
5697 | if(fCoefVdrift[0][l] > 0){ | |
5698 | xValuesFittedPH[counter[0]]= l; | |
5699 | counter[0]++; | |
5700 | } | |
5701 | } | |
5702 | } | |
5703 | ||
5704 | ||
5705 | //Create the X and Xerror | |
5706 | Double_t *xValues = new Double_t[nbins]; | |
5707 | Double_t *xValuesE = new Double_t[nbins]; | |
5708 | for(Int_t k = 0; k < nbins; k ++){ | |
5709 | xValues[k] = k; | |
5710 | xValuesE[k] = 0.0; | |
5711 | } | |
5712 | ||
5713 | //Create the graph erros and plot them | |
5714 | TGraph *graphVdrift2 = new TGraph(nbins,xValues,fCoefVdrift[2]); | |
5715 | graphVdrift2->SetName("coefvdrift2"); | |
5716 | graphVdrift2->SetTitle(""); | |
5717 | graphVdrift2->GetXaxis()->SetTitle("Det/Pad groups"); | |
5718 | graphVdrift2->GetYaxis()->SetTitle("Vdrift [cm/#mus]"); | |
5719 | graphVdrift2->SetLineColor(4); | |
5720 | listofgraphs->Add((TObject *)graphVdrift2); | |
5721 | TGraphErrors *graphVdrift1 = new TGraphErrors(nbins,xValues,fCoefVdrift[1],xValuesE,fCoefVdriftE[1]); | |
5722 | graphVdrift1->SetName("coefvdrift1"); | |
5723 | graphVdrift1->SetTitle(""); | |
5724 | graphVdrift1->GetXaxis()->SetTitle("Det/Pad groups"); | |
5725 | graphVdrift1->GetYaxis()->SetTitle("Vdrift [cm/#mus]"); | |
5726 | graphVdrift1->SetMarkerColor(6); | |
5727 | graphVdrift1->SetLineColor(6); | |
5728 | graphVdrift1->SetMarkerStyle(26); | |
5729 | listofgraphs->Add((TObject *)graphVdrift1); | |
77566f2a | 5730 | TCanvas *cph1 = new TCanvas("cph1","",50,50,600,800); |
5731 | cph1->cd(); | |
5732 | TLegend *legph1 = new TLegend(0.4,0.6,0.89,0.89); | |
9f4780aa | 5733 | legph1->AddEntry(graphVdrift2,"Vdrift simulated","l"); |
5734 | legph1->AddEntry(graphVdrift1,"Vdrift fit","p"); | |
5735 | graphVdrift2->Draw("AL"); | |
5736 | graphVdrift1->Draw("P"); | |
8ec526a4 | 5737 | if (fFitPHOn) { |
9f4780aa | 5738 | TGraphErrors *graphVdrift0 = new TGraphErrors(nbins,xValues,fCoefVdrift[0],xValuesE,fCoefVdriftE[0]); |
5739 | graphVdrift0->SetName("coefVdrift0"); | |
5740 | graphVdrift0->GetXaxis()->SetTitle("Det/Pad groups"); | |
5741 | graphVdrift0->GetYaxis()->SetTitle("Vdrift [cm/#mus]"); | |
5742 | graphVdrift0->SetTitle(""); | |
5743 | graphVdrift0->SetMarkerColor(2); | |
5744 | graphVdrift0->SetLineColor(2); | |
5745 | graphVdrift0->SetMarkerStyle(24); | |
5746 | legph1->AddEntry(graphVdrift0,"v_{fit PH}","p"); | |
5747 | graphVdrift0->Draw("P"); | |
5748 | listofgraphs->Add((TObject *)graphVdrift0); | |
5749 | } | |
77566f2a | 5750 | legph1->Draw("same"); |
77566f2a | 5751 | |
9f4780aa | 5752 | |
5753 | //Create the arrays and the graphs for the delta | |
77566f2a | 5754 | TCanvas *cph2 = new TCanvas("cph2","",50,50,600,800); |
5755 | cph2->Divide(2,1); | |
77566f2a | 5756 | cph2->cd(2); |
9f4780aa | 5757 | Double_t *yValuesDelta = new Double_t[counter[1]]; |
5758 | for(Int_t k = 0; k < counter[1]; k++){ | |
5759 | if(fCoefVdrift[2][(Int_t)(xValuesFitted[k])] > 0.0) { | |
5760 | yValuesDelta[k] = (fCoefVdrift[1][(Int_t)xValuesFitted[k]]-fCoefVdrift[2][(Int_t)xValuesFitted[k]])/fCoefVdrift[2][(Int_t)xValuesFitted[k]]; | |
5761 | } | |
5762 | else yValuesDelta[k] = 0.0; | |
5763 | } | |
5764 | TGraph *graphDeltaVdrift1 = new TGraph(counter[1],&xValuesFitted[0],yValuesDelta); | |
5765 | graphDeltaVdrift1->SetName("deltavdrift1"); | |
5766 | graphDeltaVdrift1->GetXaxis()->SetTitle("Det/Pad groups"); | |
5767 | graphDeltaVdrift1->GetYaxis()->SetTitle("#Deltav/v_{sim}"); | |
5768 | graphDeltaVdrift1->SetMarkerColor(6); | |
5769 | graphDeltaVdrift1->SetTitle(""); | |
5770 | graphDeltaVdrift1->SetLineColor(6); | |
5771 | graphDeltaVdrift1->SetMarkerStyle(26); | |
5772 | listofgraphs->Add((TObject *)graphDeltaVdrift1); | |
77566f2a | 5773 | TLegend *legph3 = new TLegend(0.4,0.6,0.89,0.89); |
9f4780aa | 5774 | legph3->AddEntry(graphDeltaVdrift1,"v_{slope method}","p"); |
5775 | graphDeltaVdrift1->Draw("AP"); | |
5776 | cph2->cd(1); | |
5777 | TH1I *histoErrorVdrift1 = new TH1I("errorvdrift1","",100 ,-0.05,0.05); | |
5778 | histoErrorVdrift1->SetXTitle("#Deltav/v_{sim}"); | |
5779 | histoErrorVdrift1->SetYTitle("counts"); | |
5780 | histoErrorVdrift1->SetLineColor(6); | |
5781 | histoErrorVdrift1->SetLineStyle(1); | |
5782 | histoErrorVdrift1->SetStats(0); | |
5783 | for(Int_t k = 0; k < counter[1]; k++){ | |
5784 | histoErrorVdrift1->Fill(yValuesDelta[k]); | |
8ec526a4 | 5785 | } |
9f4780aa | 5786 | TLegend *legph2 = new TLegend(0.4,0.6,0.89,0.89); |
5787 | legph2->AddEntry(histoErrorVdrift1,"v_{slope method}","l"); | |
5788 | histoErrorVdrift1->Draw(); | |
5789 | listofgraphs->Add((TObject *)histoErrorVdrift1); | |
8ec526a4 | 5790 | if (fFitPHOn) { |
9f4780aa | 5791 | cph2->cd(2); |
5792 | Double_t *yValuesDeltaPH = new Double_t[counter[0]]; | |
5793 | for(Int_t k = 0; k < counter[0]; k++){ | |
5794 | if(fCoefVdrift[2][(Int_t)xValuesFittedPH[k]] > 0.0) { | |
5795 | yValuesDeltaPH[k] = (fCoefVdrift[0][(Int_t)xValuesFittedPH[k]]-fCoefVdrift[2][(Int_t)xValuesFittedPH[k]])/fCoefVdrift[2][(Int_t)xValuesFittedPH[k]]; | |
5796 | } | |
5797 | else yValuesDeltaPH[k] = 0.0; | |
5798 | } | |
5799 | TGraph *graphDeltaVdrift0 = new TGraph(counter[0],&xValuesFittedPH[0],yValuesDeltaPH); | |
5800 | graphDeltaVdrift0->SetName("deltavdrift0"); | |
5801 | graphDeltaVdrift0->GetXaxis()->SetTitle("Det/Pad groups"); | |
5802 | graphDeltaVdrift0->GetYaxis()->SetTitle("#Deltav/v_{sim}"); | |
5803 | graphDeltaVdrift0->SetMarkerColor(2); | |
5804 | graphDeltaVdrift0->SetMarkerStyle(24); | |
5805 | graphDeltaVdrift0->SetLineColor(2); | |
5806 | graphDeltaVdrift0->SetTitle(""); | |
5807 | legph3->AddEntry(graphDeltaVdrift0,"v_{fit PH}","p"); | |
5808 | graphDeltaVdrift0->Draw("P"); | |
5809 | listofgraphs->Add((TObject *)graphDeltaVdrift0); | |
5810 | cph2->cd(1); | |
5811 | TH1I *histoErrorVdrift0 = new TH1I("errorvdrift0","",100 ,-0.05,0.05); | |
5812 | histoErrorVdrift0->SetXTitle("#Deltav/v_{sim}"); | |
5813 | histoErrorVdrift0->SetYTitle("counts"); | |
5814 | histoErrorVdrift0->SetLineColor(2); | |
5815 | histoErrorVdrift0->SetLineStyle(2); | |
5816 | histoErrorVdrift0->SetStats(0); | |
5817 | for(Int_t k = 0; k < counter[0]; k++){ | |
5818 | histoErrorVdrift0->Fill(yValuesDeltaPH[k]); | |
5819 | } | |
5820 | legph2->AddEntry(histoErrorVdrift0,"v_{fit PH}","l"); | |
5821 | histoErrorVdrift0->Draw("same"); | |
5822 | listofgraphs->Add((TObject *)histoErrorVdrift0); | |
8ec526a4 | 5823 | } |
9f4780aa | 5824 | cph2->cd(2); |
77566f2a | 5825 | legph3->Draw("same"); |
9f4780aa | 5826 | cph2->cd(1); |
5827 | legph2->Draw("same"); | |
5828 | ||
5829 | ||
5830 | //Write if wanted | |
5831 | if (fWriteCoef[1]){ | |
5832 | TFile *fout = TFile::Open(fWriteNameCoef,"UPDATE"); | |
5833 | // Check if the file could be opened | |
5834 | if (!fout || !fout->IsOpen()) { | |
5835 | AliInfo("No File found!"); | |
5836 | } | |
5837 | ||
5838 | else{ | |
5839 | for(Int_t k = 0; k < listofgraphs->GetEntriesFast(); k++){ | |
5840 | fout->WriteTObject((TObject *) listofgraphs->At(k),((TObject *)listofgraphs->At(k))->GetName(),(Option_t *) "OverWrite"); | |
5841 | } | |
5842 | } | |
5843 | fout->Close(); | |
5844 | } | |
8ec526a4 | 5845 | |
77566f2a | 5846 | } |
8ec526a4 | 5847 | |
5848 | //_____________________________________________________________________________ | |
9f4780aa | 5849 | void AliTRDCalibra::PlotWriteT0() |
77566f2a | 5850 | { |
5851 | // | |
9f4780aa | 5852 | // create the graph errors and write them if wanted |
77566f2a | 5853 | // |
5854 | ||
9f4780aa | 5855 | //TObjArray of the grapherrors and so on |
5856 | TObjArray *listofgraphs = new TObjArray(); | |
5857 | ||
5858 | Int_t nbins = fDect2[1]-fDect1[1]; | |
5859 | ||
5860 | //See the number of fitted for delta: here T0 can be negative, we don't use the sign but the error | |
5861 | //and the grapherrors of the coefficients contained the no fitted with error 0.0 | |
5862 | ||
5863 | //counter | |
5864 | Int_t counter[2]; | |
5865 | counter[0] = 0; | |
5866 | counter[1] = 0; | |
5867 | ||
5868 | Double_t *xValuesFitted = new Double_t[nbins]; | |
5869 | Double_t *xValuesFittedPH = new Double_t[nbins]; | |
5870 | for(Int_t k = 0; k < nbins; k ++){ | |
5871 | xValuesFitted[k] = -1; | |
5872 | xValuesFittedPH[k] = -1; | |
5873 | } | |
5874 | ||
5875 | for(Int_t l = 0; l < nbins; l++){ | |
5876 | if(fCoefT0E[1][l] != 0.0){ | |
5877 | xValuesFitted[counter[1]]=l; | |
5878 | counter[1]++; | |
5879 | } | |
5880 | } | |
5881 | if(fFitPHOn){ | |
5882 | for(Int_t l = 0; l < nbins; l++){ | |
5883 | if(fCoefT0E[0][l] != 0.0){ | |
5884 | xValuesFittedPH[counter[0]]= l; | |
5885 | counter[0]++; | |
5886 | } | |
5887 | } | |
5888 | } | |
5889 | ||
5890 | ||
5891 | //Create the X and Xerror | |
5892 | Double_t *xValues = new Double_t[nbins]; | |
5893 | Double_t *xValuesE = new Double_t[nbins]; | |
5894 | for(Int_t k = 0; k < nbins; k ++){ | |
5895 | xValues[k] = k; | |
5896 | xValuesE[k] = 0.0; | |
5897 | } | |
5898 | ||
5899 | //Create the graph erros and plot them | |
5900 | TGraph *graphT02 = new TGraph(nbins,xValues,fCoefT0[2]); | |
5901 | graphT02->SetName("coeft02"); | |
5902 | graphT02->SetTitle(""); | |
5903 | graphT02->GetXaxis()->SetTitle("Det/Pad groups"); | |
5904 | graphT02->GetYaxis()->SetTitle("T0 [time bins]"); | |
5905 | graphT02->SetLineColor(4); | |
5906 | listofgraphs->Add((TObject *)graphT02); | |
5907 | TGraphErrors *graphT01 = new TGraphErrors(nbins,xValues,fCoefT0[1],xValuesE,fCoefT0E[1]); | |
5908 | graphT01->SetName("coeft01"); | |
5909 | graphT01->SetTitle(""); | |
5910 | graphT01->GetXaxis()->SetTitle("Det/Pad groups"); | |
5911 | graphT01->GetYaxis()->SetTitle("T0 [time bins]"); | |
5912 | graphT01->SetMarkerColor(6); | |
5913 | graphT01->SetLineColor(6); | |
5914 | graphT01->SetMarkerStyle(26); | |
5915 | listofgraphs->Add((TObject *)graphT01); | |
77566f2a | 5916 | TCanvas *ct01 = new TCanvas("ct01","",50,50,600,800); |
5917 | ct01->cd(); | |
5918 | TLegend *legt01 = new TLegend(0.4,0.6,0.89,0.89); | |
9f4780aa | 5919 | legt01->AddEntry(graphT02,"T0 simulated","l"); |
5920 | legt01->AddEntry(graphT01,"T0 slope method","p"); | |
5921 | graphT02->Draw("AL"); | |
5922 | graphT01->Draw("P"); | |
8ec526a4 | 5923 | if (fFitPHOn) { |
9f4780aa | 5924 | TGraphErrors *graphT00 = new TGraphErrors(nbins,xValues,fCoefT0[0],xValuesE,fCoefT0E[0]); |
5925 | graphT00->SetName("coeft00"); | |
5926 | graphT00->GetXaxis()->SetTitle("Det/Pad groups"); | |
5927 | graphT00->GetYaxis()->SetTitle("T0 [time bins]"); | |
5928 | graphT00->SetTitle(""); | |
5929 | graphT00->SetMarkerColor(2); | |
5930 | graphT00->SetLineColor(2); | |
5931 | graphT00->SetMarkerStyle(24); | |
5932 | legt01->AddEntry(graphT00,"T0 fit","p"); | |
5933 | graphT00->Draw("P"); | |
5934 | listofgraphs->Add((TObject *)graphT00); | |
5935 | } | |
77566f2a | 5936 | legt01->Draw("same"); |
77566f2a | 5937 | |
9f4780aa | 5938 | |
5939 | //Create the arrays and the graphs for the delta | |
77566f2a | 5940 | TCanvas *ct02 = new TCanvas("ct02","",50,50,600,800); |
5941 | ct02->Divide(2,1); | |
77566f2a | 5942 | ct02->cd(2); |
9f4780aa | 5943 | Double_t *yValuesDelta = new Double_t[counter[1]]; |
5944 | for(Int_t k = 0; k < counter[1]; k++){ | |
5945 | yValuesDelta[k] = (fCoefT0[1][(Int_t)xValuesFitted[k]]-fCoefT0[2][(Int_t)xValuesFitted[k]]); | |
5946 | } | |
5947 | TGraph *graphDeltaT01 = new TGraph(counter[1],&xValuesFitted[0],yValuesDelta); | |
5948 | graphDeltaT01->SetName("deltat01"); | |
5949 | graphDeltaT01->GetXaxis()->SetTitle("Det/Pad groups"); | |
5950 | graphDeltaT01->GetYaxis()->SetTitle("#Deltat0 [time bins]"); | |
5951 | graphDeltaT01->SetMarkerColor(6); | |
5952 | graphDeltaT01->SetTitle(""); | |
5953 | graphDeltaT01->SetLineColor(6); | |
5954 | graphDeltaT01->SetMarkerStyle(26); | |
5955 | listofgraphs->Add((TObject *)graphDeltaT01); | |
77566f2a | 5956 | TLegend *legt03 = new TLegend(0.4,0.6,0.89,0.89); |
9f4780aa | 5957 | legt03->AddEntry(graphDeltaT01,"T0_{slope method}","p"); |
5958 | graphDeltaT01->Draw("AP"); | |
5959 | ct02->cd(1); | |
5960 | TH1I *histoErrorT01 = new TH1I("errort01","",100 ,-0.05,0.05); | |
5961 | histoErrorT01->SetXTitle("#Deltat0 [time bins]"); | |
5962 | histoErrorT01->SetYTitle("counts"); | |
5963 | histoErrorT01->SetLineColor(6); | |
5964 | histoErrorT01->SetLineStyle(1); | |
5965 | histoErrorT01->SetStats(0); | |
5966 | for(Int_t k = 0; k < counter[1]; k++){ | |
5967 | histoErrorT01->Fill(yValuesDelta[k]); | |
8ec526a4 | 5968 | } |
9f4780aa | 5969 | TLegend *legt02 = new TLegend(0.4,0.6,0.89,0.89); |
5970 | legt02->AddEntry(histoErrorT01,"T0_{slope method}","l"); | |
5971 | histoErrorT01->Draw(); | |
5972 | listofgraphs->Add((TObject *)histoErrorT01); | |
8ec526a4 | 5973 | if (fFitPHOn) { |
9f4780aa | 5974 | ct02->cd(2); |
5975 | Double_t *yValuesDeltaPH = new Double_t[counter[0]]; | |
5976 | for(Int_t k = 0; k < counter[0]; k++){ | |
5977 | yValuesDeltaPH[k] = (fCoefT0[0][(Int_t)xValuesFittedPH[k]]-fCoefT0[2][(Int_t)xValuesFittedPH[k]]); | |
5978 | } | |
5979 | TGraph *graphDeltaT00 = new TGraph(counter[0],&xValuesFittedPH[0],yValuesDeltaPH); | |
5980 | graphDeltaT00->SetName("deltat00"); | |
5981 | graphDeltaT00->GetXaxis()->SetTitle("Det/Pad groups"); | |
5982 | graphDeltaT00->GetYaxis()->SetTitle("#Deltat0 [time bins]"); | |
5983 | graphDeltaT00->SetMarkerColor(2); | |
5984 | graphDeltaT00->SetMarkerStyle(24); | |
5985 | graphDeltaT00->SetLineColor(2); | |
5986 | graphDeltaT00->SetTitle(""); | |
5987 | legt03->AddEntry(graphDeltaT00,"T0_{fit PH}","p"); | |
5988 | graphDeltaT00->Draw("P"); | |
5989 | listofgraphs->Add((TObject *)graphDeltaT00); | |
5990 | ct02->cd(1); | |
5991 | TH1I *histoErrorT00 = new TH1I("errort00","",100 ,-0.05,0.05); | |
5992 | histoErrorT00->SetXTitle("#Deltat0 [time bins]"); | |
5993 | histoErrorT00->SetYTitle("counts"); | |
5994 | histoErrorT00->SetLineColor(2); | |
5995 | histoErrorT00->SetLineStyle(2); | |
5996 | histoErrorT00->SetStats(0); | |
5997 | for(Int_t k = 0; k < counter[0]; k++){ | |
5998 | histoErrorT00->Fill(yValuesDeltaPH[k]); | |
5999 | } | |
6000 | legt02->AddEntry(histoErrorT00,"T0_{fit PH}","l"); | |
6001 | histoErrorT00->Draw("same"); | |
6002 | listofgraphs->Add((TObject *)histoErrorT00); | |
8ec526a4 | 6003 | } |
9f4780aa | 6004 | ct02->cd(2); |
77566f2a | 6005 | legt03->Draw("same"); |
9f4780aa | 6006 | ct02->cd(1); |
6007 | legt02->Draw("same"); | |
6008 | ||
6009 | ||
6010 | //Write if wanted | |
6011 | if (fWriteCoef[1]){ | |
6012 | TFile *fout = TFile::Open(fWriteNameCoef,"UPDATE"); | |
6013 | // Check if the file could be opened | |
6014 | if (!fout || !fout->IsOpen()) { | |
6015 | AliInfo("No File found!"); | |
6016 | } | |
6017 | ||
6018 | else{ | |
6019 | for(Int_t k = 0; k < listofgraphs->GetEntriesFast(); k++){ | |
6020 | fout->WriteTObject((TObject *) listofgraphs->At(k),((TObject *)listofgraphs->At(k))->GetName(),(Option_t *) "OverWrite"); | |
6021 | } | |
6022 | } | |
6023 | fout->Close(); | |
6024 | } | |
8ec526a4 | 6025 | |
77566f2a | 6026 | } |
6027 | ||
8ec526a4 | 6028 | //_____________________________________________________________________________ |
9f4780aa | 6029 | void AliTRDCalibra::PlotWritePRF() |
77566f2a | 6030 | { |
6031 | // | |
9f4780aa | 6032 | // create the graph errors and write them if wanted |
77566f2a | 6033 | // |
6034 | ||
9f4780aa | 6035 | //TObjArray of the grapherrors and so on |
6036 | TObjArray *listofgraphs = new TObjArray(); | |
6037 | ||
6038 | Int_t nbins = fDect2[2]-fDect1[2]; | |
6039 | ||
6040 | //See the number of fitted for delta | |
6041 | ||
6042 | //counter | |
6043 | Int_t counter = 0; | |
6044 | ||
6045 | Double_t *xValuesFitted = new Double_t[nbins]; | |
6046 | for(Int_t k = 0; k < nbins; k ++){ | |
6047 | xValuesFitted[k] = -1; | |
6048 | } | |
6049 | ||
6050 | for(Int_t l = 0; l < nbins; l++){ | |
6051 | if(fCoefPRF[0][l] > 0){ | |
6052 | xValuesFitted[counter]=l; | |
6053 | counter++; | |
6054 | } | |
6055 | } | |
6056 | ||
6057 | ||
6058 | ||
6059 | //Create the X and Xerror | |
6060 | Double_t *xValues = new Double_t[nbins]; | |
6061 | Double_t *xValuesE = new Double_t[nbins]; | |
6062 | for(Int_t k = 0; k < nbins; k ++){ | |
6063 | xValues[k] = k; | |
6064 | xValuesE[k] = 0.0; | |
6065 | } | |
6066 | ||
6067 | //Create the graph erros and plot them | |
6068 | TGraph *graphPRF1 = new TGraph(nbins,xValues,fCoefPRF[1]); | |
6069 | graphPRF1->SetName("coefprf1"); | |
6070 | graphPRF1->SetTitle(""); | |
6071 | graphPRF1->GetXaxis()->SetTitle("Det/Pad groups"); | |
6072 | graphPRF1->GetYaxis()->SetTitle("PRF width [p.u]"); | |
6073 | graphPRF1->SetLineColor(4); | |
6074 | graphPRF1->SetMarkerColor(4); | |
6075 | graphPRF1->SetMarkerStyle(25); | |
6076 | graphPRF1->SetMarkerSize(0.7); | |
6077 | listofgraphs->Add((TObject *)graphPRF1); | |
6078 | TGraphErrors *graphPRF0 = new TGraphErrors(nbins,xValues,fCoefPRF[0],xValuesE,fCoefPRFE); | |
6079 | graphPRF0->SetName("coefprf0"); | |
6080 | graphPRF0->SetTitle(""); | |
6081 | graphPRF0->GetXaxis()->SetTitle("Det/Pad groups"); | |
6082 | graphPRF0->GetYaxis()->SetTitle("PRF Width [p.u]"); | |
6083 | graphPRF0->SetMarkerColor(6); | |
6084 | graphPRF0->SetLineColor(6); | |
6085 | graphPRF0->SetMarkerStyle(26); | |
6086 | listofgraphs->Add((TObject *)graphPRF0); | |
77566f2a | 6087 | TCanvas *cprf1 = new TCanvas("cprf1","",50,50,600,800); |
6088 | cprf1->cd(); | |
6089 | TLegend *legprf1 = new TLegend(0.4,0.6,0.89,0.89); | |
9f4780aa | 6090 | legprf1->AddEntry(graphPRF1,"PRF width simulated","p"); |
6091 | legprf1->AddEntry(graphPRF0,"PRF fit","p"); | |
6092 | graphPRF1->Draw("AP"); | |
6093 | graphPRF0->Draw("P"); | |
77566f2a | 6094 | legprf1->Draw("same"); |
9f4780aa | 6095 | |
77566f2a | 6096 | |
9f4780aa | 6097 | //Create the arrays and the graphs for the delta |
77566f2a | 6098 | TCanvas *cprf2 = new TCanvas("cprf2","",50,50,600,800); |
6099 | cprf2->Divide(2,1); | |
77566f2a | 6100 | cprf2->cd(2); |
9f4780aa | 6101 | Double_t *yValuesDelta = new Double_t[counter]; |
6102 | for(Int_t k = 0; k < counter; k++){ | |
6103 | if(fCoefPRF[1][(Int_t)xValuesFitted[k]] > 0.0){ | |
6104 | yValuesDelta[k] = (fCoefPRF[0][(Int_t)xValuesFitted[k]]-fCoefPRF[1][(Int_t)xValuesFitted[k]])/(fCoefPRF[1][(Int_t)xValuesFitted[k]]); | |
6105 | } | |
6106 | } | |
6107 | TGraph *graphDeltaPRF = new TGraph(counter,&xValuesFitted[0],yValuesDelta); | |
6108 | graphDeltaPRF->SetName("deltaprf"); | |
6109 | graphDeltaPRF->GetXaxis()->SetTitle("Det/Pad groups"); | |
6110 | graphDeltaPRF->GetYaxis()->SetTitle("#Delta#sigma/#sigma_{sim}"); | |
6111 | graphDeltaPRF->SetMarkerColor(6); | |
6112 | graphDeltaPRF->SetTitle(""); | |
6113 | graphDeltaPRF->SetLineColor(6); | |
6114 | graphDeltaPRF->SetMarkerStyle(26); | |
6115 | listofgraphs->Add((TObject *)graphDeltaPRF); | |
77566f2a | 6116 | TLegend *legprf3 = new TLegend(0.4,0.6,0.89,0.89); |
9f4780aa | 6117 | legprf3->AddEntry(graphDeltaPRF,"#sigma_{fit}","p"); |
6118 | graphDeltaPRF->Draw("AP"); | |
6119 | cprf2->cd(1); | |
6120 | TH1I *histoErrorPRF = new TH1I("errorprf1","",100 ,-0.5,0.5); | |
6121 | histoErrorPRF->SetXTitle("#Delta#sigma/#sigma_{sim}"); | |
6122 | histoErrorPRF->SetYTitle("counts"); | |
6123 | histoErrorPRF->SetLineColor(6); | |
6124 | histoErrorPRF->SetLineStyle(1); | |
6125 | histoErrorPRF->SetStats(0); | |
6126 | for(Int_t k = 0; k < counter; k++){ | |
6127 | histoErrorPRF->Fill(yValuesDelta[k]); | |
6128 | } | |
6129 | TLegend *legprf2 = new TLegend(0.4,0.6,0.89,0.89); | |
6130 | legprf2->AddEntry(histoErrorPRF,"#sigma_{fit}","l"); | |
6131 | histoErrorPRF->Draw(); | |
6132 | listofgraphs->Add((TObject *)histoErrorPRF); | |
6133 | cprf2->cd(2); | |
77566f2a | 6134 | legprf3->Draw("same"); |
9f4780aa | 6135 | cprf2->cd(1); |
6136 | legprf2->Draw("same"); | |
6137 | ||
77566f2a | 6138 | |
9f4780aa | 6139 | //Write if wanted |
6140 | if (fWriteCoef[2]){ | |
6141 | TFile *fout = TFile::Open(fWriteNameCoef,"UPDATE"); | |
6142 | // Check if the file could be opened | |
6143 | if (!fout || !fout->IsOpen()) { | |
6144 | AliInfo("No File found!"); | |
6145 | } | |
6146 | ||
6147 | else{ | |
6148 | for(Int_t k = 0; k < listofgraphs->GetEntriesFast(); k++){ | |
6149 | fout->WriteTObject((TObject *) listofgraphs->At(k),((TObject *)listofgraphs->At(k))->GetName(),(Option_t *) "OverWrite"); | |
6150 | } | |
6151 | } | |
6152 | fout->Close(); | |
6153 | } | |
6154 | ||
77566f2a | 6155 | } |
6156 | ||
8ec526a4 | 6157 | // |
6158 | //____________Plot histos DB___________________________________________________ | |
6159 | // | |
6160 | ||
6161 | //_____________________________________________________________________________ | |
77566f2a | 6162 | void AliTRDCalibra::PlotCHDB() |
6163 | { | |
6164 | // | |
6165 | // Plot the histos for fDebug = 3 and fDebug = 4 to visualise the detector | |
6166 | // | |
6167 | ||
6168 | TCanvas *cchdb = new TCanvas("cchdb","",50,50,600,800); | |
8ec526a4 | 6169 | if ((fFitChargeBisOn) && (fMeanChargeOn)) { |
77566f2a | 6170 | cchdb->Divide(3,1); |
6171 | cchdb->cd(1); | |
6172 | fCoefChargeDB[0]->Draw("LEGO"); | |
6173 | cchdb->cd(2); | |
6174 | fCoefChargeDB[1]->Draw("LEGO"); | |
6175 | cchdb->cd(3); | |
6176 | fCoefChargeDB[2]->Draw("LEGO"); | |
6177 | } | |
8ec526a4 | 6178 | if ((!fFitChargeBisOn) && (fMeanChargeOn)) { |
77566f2a | 6179 | cchdb->Divide(2,1); |
6180 | cchdb->cd(1); | |
6181 | fCoefChargeDB[0]->Draw("LEGO"); | |
6182 | cchdb->cd(2); | |
6183 | fCoefChargeDB[1]->Draw("LEGO"); | |
6184 | } | |
8ec526a4 | 6185 | else { |
77566f2a | 6186 | cchdb->cd(); |
6187 | fCoefChargeDB[0]->Draw("LEGO"); | |
6188 | } | |
6189 | ||
6190 | } | |
77566f2a | 6191 | |
8ec526a4 | 6192 | //_____________________________________________________________________________ |
77566f2a | 6193 | void AliTRDCalibra::PlotPHDB() |
6194 | { | |
6195 | // | |
6196 | // Plot the histos for fDebug = 3 and fDebug = 4 to visualise the detector | |
6197 | // | |
6198 | ||
6199 | TCanvas *cphdb = new TCanvas("cphdb","",50,50,600,800); | |
8ec526a4 | 6200 | if (fFitPHOn) { |
77566f2a | 6201 | cphdb->Divide(2,1); |
6202 | cphdb->cd(1); | |
6203 | fCoefVdriftDB[0]->Draw("LEGO"); | |
6204 | cphdb->cd(2); | |
6205 | fCoefVdriftDB[1]->Draw("LEGO"); | |
6206 | } | |
8ec526a4 | 6207 | else { |
77566f2a | 6208 | cphdb->cd(); |
6209 | fCoefVdriftDB[1]->Draw("LEGO"); | |
6210 | } | |
8ec526a4 | 6211 | |
77566f2a | 6212 | } |
77566f2a | 6213 | |
8ec526a4 | 6214 | //_____________________________________________________________________________ |
77566f2a | 6215 | void AliTRDCalibra::PlotT0DB() |
6216 | { | |
6217 | // | |
6218 | // Plot the histos for fDebug = 3 and fDebug = 4 to visualise the detector | |
6219 | // | |
6220 | ||
6221 | TCanvas *ct0db = new TCanvas("ct0db","",50,50,600,800); | |
8ec526a4 | 6222 | if (fFitPHOn ) { |
77566f2a | 6223 | ct0db->Divide(2,1); |
6224 | ct0db->cd(1); | |
6225 | fCoefT0DB[0]->Draw("LEGO"); | |
6226 | ct0db->cd(2); | |
6227 | fCoefT0DB[1]->Draw("LEGO"); | |
6228 | } | |
8ec526a4 | 6229 | else { |
77566f2a | 6230 | ct0db->cd(); |
6231 | fCoefT0DB[1]->Draw("LEGO"); | |
6232 | } | |
8ec526a4 | 6233 | |
77566f2a | 6234 | } |
77566f2a | 6235 | |
8ec526a4 | 6236 | //_____________________________________________________________________________ |
77566f2a | 6237 | void AliTRDCalibra::PlotPRFDB() |
6238 | { | |
6239 | // | |
6240 | // Plot the histos for fDebug = 3 and fDebug = 4 to visualise the detector | |
6241 | // | |
6242 | ||
6243 | TCanvas *cprfdb = new TCanvas("cprfdb","",50,50,600,800); | |
6244 | cprfdb->cd(); | |
6245 | fCoefPRFDB->Draw("LEGO"); | |
8ec526a4 | 6246 | |
77566f2a | 6247 | } |
6248 | ||
8ec526a4 | 6249 | // |
6250 | //____________Write DB Histos__________________________________________________ | |
6251 | // | |
77566f2a | 6252 | |
8ec526a4 | 6253 | //_____________________________________________________________________________ |
77566f2a | 6254 | void AliTRDCalibra::WriteCHDB(TFile *fout) |
6255 | { | |
6256 | // | |
6257 | // If wanted, write the debug histos for fDebug = 3 and fDebug = 4 | |
6258 | // | |
6259 | ||
8ec526a4 | 6260 | fout->WriteTObject(fCoefChargeDB[0],fCoefChargeDB[0]->GetName(),(Option_t *) "OverWrite"); |
6261 | if (fMeanChargeOn) { | |
6262 | fout->WriteTObject(fCoefChargeDB[1],fCoefChargeDB[1]->GetName(),(Option_t *) "OverWrite"); | |
6263 | } | |
6264 | if (fFitChargeBisOn ) { | |
6265 | fout->WriteTObject(fCoefChargeDB[2],fCoefChargeDB[2]->GetName(),(Option_t *) "OverWrite"); | |
6266 | } | |
77566f2a | 6267 | |
6268 | } | |
8ec526a4 | 6269 | |
6270 | //_____________________________________________________________________________ | |
77566f2a | 6271 | void AliTRDCalibra::WritePHDB(TFile *fout) |
6272 | { | |
6273 | // | |
6274 | // If wanted, write the debug histos for fDebug = 3 and fDebug = 4 | |
6275 | // | |
6276 | ||
8ec526a4 | 6277 | if (fFitPHOn) { |
6278 | fout->WriteTObject(fCoefVdriftDB[0],fCoefVdriftDB[0]->GetName(),(Option_t *) "OverWrite"); | |
6279 | } | |
6280 | fout->WriteTObject(fCoefVdriftDB[1],fCoefVdriftDB[1]->GetName(),(Option_t *) "OverWrite"); | |
77566f2a | 6281 | |
6282 | } | |
8ec526a4 | 6283 | |
6284 | //_____________________________________________________________________________ | |
77566f2a | 6285 | void AliTRDCalibra::WriteT0DB(TFile *fout) |
6286 | { | |
6287 | // | |
6288 | // If wanted, write the debug histos for fDebug = 3 and fDebug = 4 | |
6289 | // | |
6290 | ||
8ec526a4 | 6291 | if (fFitPHOn) { |
6292 | fout->WriteTObject(fCoefT0DB[0],fCoefT0DB[0]->GetName(),(Option_t *) "OverWrite"); | |
6293 | } | |
6294 | fout->WriteTObject(fCoefT0DB[1],fCoefT0DB[1]->GetName(),(Option_t *) "OverWrite"); | |
77566f2a | 6295 | |
6296 | } | |
8ec526a4 | 6297 | |
6298 | //_____________________________________________________________________________ | |
77566f2a | 6299 | void AliTRDCalibra::WritePRFDB(TFile *fout) |
6300 | { | |
6301 | // | |
6302 | // If wanted, write the debug histos for fDebug = 3 and fDebug = 4 | |
6303 | // | |
6304 | ||
8ec526a4 | 6305 | fout->WriteTObject(fCoefPRFDB,fCoefPRFDB->GetName(),(Option_t *) "OverWrite"); |
77566f2a | 6306 | |
6307 | } | |
6308 | ||
8ec526a4 | 6309 | // |
6310 | //____________Calcul Coef Mean_________________________________________________ | |
6311 | // | |
77566f2a | 6312 | |
8ec526a4 | 6313 | //_____________________________________________________________________________ |
6314 | Bool_t AliTRDCalibra::CalculT0CoefMean(Int_t dect, Int_t idect) | |
77566f2a | 6315 | { |
6316 | // | |
8ec526a4 | 6317 | // For the detector Dect calcul the mean time 0 |
6318 | // for the calibration group idect from the choosen database | |
77566f2a | 6319 | // |
6320 | ||
8ec526a4 | 6321 | AliTRDcalibDB *cal = AliTRDcalibDB::Instance(); |
77566f2a | 6322 | if (!cal) { |
6323 | AliInfo("Could not get calibDB Manager"); | |
6324 | return kFALSE; | |
6325 | } | |
6326 | ||
6327 | fT0Coef[2] = 0.0; | |
6328 | ||
8ec526a4 | 6329 | if ((fDebug != 2) && fAccCDB) { |
77566f2a | 6330 | |
8ec526a4 | 6331 | for (Int_t row = fRowMin[1]; row < fRowMax[1]; row++) { |
6332 | for (Int_t col = fColMin[1]; col < fColMax[1]; col++) { | |
6333 | // Groups of pads | |
6334 | if ((fNz[1] > 0) && | |
6335 | (fNrphi[1] > 0)) { | |
6336 | fT0Coef[2] += (Float_t) cal->GetT0(dect,col,row); | |
6337 | } | |
6338 | // Per detectors | |
6339 | else { | |
6340 | fT0Coef[2] += (Float_t) cal->GetT0Average(dect); | |
77566f2a | 6341 | } |
77566f2a | 6342 | } |
6343 | } | |
8ec526a4 | 6344 | |
6345 | fT0Coef[2] = fT0Coef[2] / ((fColMax[1]-fColMin[1])*(fRowMax[1]-fRowMin[1])); | |
6346 | if ((fDebug == 1) || | |
6347 | (fDebug == 4)) { | |
9f4780aa | 6348 | fCoefT0[2][idect] = fT0Coef[2]; |
8ec526a4 | 6349 | } |
6350 | ||
77566f2a | 6351 | } |
8ec526a4 | 6352 | |
77566f2a | 6353 | return kTRUE; |
6354 | ||
6355 | } | |
8ec526a4 | 6356 | |
6357 | //_____________________________________________________________________________ | |
6358 | Bool_t AliTRDCalibra::CalculChargeCoefMean(Int_t dect, Int_t idect, Bool_t vrai) | |
77566f2a | 6359 | { |
6360 | // | |
8ec526a4 | 6361 | // For the detector Dect calcul the mean gain factor |
6362 | // for the calibration group idect from the choosen database | |
77566f2a | 6363 | // |
6364 | ||
77566f2a | 6365 | AliTRDcalibDB *cal = AliTRDcalibDB::Instance(); |
6366 | if (!cal) { | |
6367 | AliInfo("Could not get calibDB Manager"); | |
6368 | return kFALSE; | |
6369 | } | |
8ec526a4 | 6370 | AliTRDCommonParam *parCom = AliTRDCommonParam::Instance(); |
77566f2a | 6371 | if (!parCom) { |
6372 | AliInfo("Could not get CommonParam Manager"); | |
6373 | return kFALSE; | |
6374 | } | |
6375 | ||
6376 | fChargeCoef[3] = 0.0; | |
8ec526a4 | 6377 | |
6378 | if (fDebug != 2) { | |
6379 | ||
6380 | for (Int_t row = fRowMin[0]; row < fRowMax[0]; row++) { | |
6381 | for (Int_t col = fColMin[0]; col < fColMax[0]; col++) { | |
6382 | // Groups of pads | |
6383 | if ((fNz[0] > 0) || | |
6384 | (fNrphi[0] > 0)) { | |
6385 | if (fAccCDB) { | |
6386 | fChargeCoef[3] += (Float_t) cal->GetGainFactor(dect,col,row); | |
6387 | } | |
6388 | if (vrai && fAccCDB) { | |
6389 | fScaleFitFactor += (Float_t) cal->GetGainFactor(dect,col,row); | |
6390 | } | |
6391 | if (!fAccCDB) { | |
6392 | fChargeCoef[3] += 1.0; | |
6393 | } | |
6394 | if (vrai && (!fAccCDB)) { | |
6395 | fScaleFitFactor += 1.0; | |
6396 | } | |
77566f2a | 6397 | } |
8ec526a4 | 6398 | // Per detectors |
77566f2a | 6399 | else { |
8ec526a4 | 6400 | if (fAccCDB) { |
6401 | fChargeCoef[3] += (Float_t) cal->GetGainFactorAverage(dect); | |
6402 | } | |
6403 | if (vrai && fAccCDB) { | |
6404 | fScaleFitFactor += ((Float_t) cal->GetGainFactorAverage(dect)); | |
6405 | } | |
6406 | if (!fAccCDB) { | |
6407 | fChargeCoef[3] += 1.0; | |
6408 | } | |
6409 | if (vrai && (!fAccCDB)) { | |
6410 | fScaleFitFactor += 1.0; | |
6411 | } | |
77566f2a | 6412 | } |
6413 | } | |
6414 | } | |
8ec526a4 | 6415 | |
6416 | fChargeCoef[3] = fChargeCoef[3] / ((fColMax[0]-fColMin[0])*(fRowMax[0]-fRowMin[0])); | |
6417 | if ((fDebug == 1) || | |
6418 | (fDebug == 4)) { | |
9f4780aa | 6419 | fCoefCharge[3][idect]=fChargeCoef[3]; |
8ec526a4 | 6420 | } |
6421 | ||
77566f2a | 6422 | } |
77566f2a | 6423 | |
8ec526a4 | 6424 | return kTRUE; |
77566f2a | 6425 | |
6426 | } | |
8ec526a4 | 6427 | |
6428 | //_____________________________________________________________________________ | |
6429 | Bool_t AliTRDCalibra::CalculPRFCoefMean(Int_t dect, Int_t idect) | |
77566f2a | 6430 | { |
6431 | // | |
8ec526a4 | 6432 | // For the detector Dect calcul the mean sigma of pad response |
6433 | // function for the calibration group idect from the choosen database | |
77566f2a | 6434 | // |
6435 | ||
77566f2a | 6436 | AliTRDcalibDB *cal = AliTRDcalibDB::Instance(); |
6437 | if (!cal) { | |
6438 | AliInfo("Could not get calibDB Manager"); | |
6439 | return kFALSE; | |
6440 | } | |
6441 | ||
8ec526a4 | 6442 | AliTRDCommonParam *parCom = AliTRDCommonParam::Instance(); |
77566f2a | 6443 | if (!parCom) { |
6444 | AliInfo("Could not get CommonParam Manager"); | |
6445 | return kFALSE; | |
6446 | } | |
6447 | ||
77566f2a | 6448 | fPRFCoef[1] = 0.0; |
6449 | Int_t cot = 0; | |
8ec526a4 | 6450 | |
6451 | if (fDebug != 2) { | |
77566f2a | 6452 | |
8ec526a4 | 6453 | for (Int_t row = fRowMin[2]; row < fRowMax[2]; row++) { |
6454 | for (Int_t col = fColMin[2]; col < fColMax[2]; col++) { | |
6455 | if ((parCom->GetColMax(GetPlane(dect)) != (col+1)) && (col != 0)) { | |
77566f2a | 6456 | cot++; |
8ec526a4 | 6457 | if (fAccCDB) { |
6458 | fPRFCoef[1] += (Float_t) cal->GetPRFWidth(dect,col,row); | |
6459 | } | |
6460 | if (!fAccCDB) { | |
6461 | fPRFCoef[1] += GetPRFDefault(GetPlane(dect)); | |
6462 | } | |
77566f2a | 6463 | } |
6464 | } | |
6465 | } | |
8ec526a4 | 6466 | |
6467 | if (cot > 0) { | |
77566f2a | 6468 | fPRFCoef[1] = fPRFCoef[1]/cot; |
8ec526a4 | 6469 | if ((fDebug == 1) || |
6470 | (fDebug == 4)) { | |
9f4780aa | 6471 | fCoefPRF[1][idect] = fPRFCoef[1]; |
8ec526a4 | 6472 | } |
77566f2a | 6473 | } |
8ec526a4 | 6474 | if (cot <= 0) { |
6475 | if ((fDebug == 1) || | |
6476 | (fDebug == 4)) { | |
6477 | if (fAccCDB) { | |
9f4780aa | 6478 | fCoefPRF[1][idect] = cal->GetPRFWidth(dect,fColMin[2],fRowMin[2]); |
8ec526a4 | 6479 | } |
6480 | if (!fAccCDB) { | |
9f4780aa | 6481 | fCoefPRF[1][idect] = GetPRFDefault(GetPlane(dect)); |
8ec526a4 | 6482 | } |
6483 | } | |
77566f2a | 6484 | } |
8ec526a4 | 6485 | |
77566f2a | 6486 | } |
8ec526a4 | 6487 | |
77566f2a | 6488 | return kTRUE; |
6489 | ||
6490 | } | |
8ec526a4 | 6491 | |
6492 | //_____________________________________________________________________________ | |
6493 | Bool_t AliTRDCalibra::CalculVdriftCoefMean(Int_t dect, Int_t idect) | |
77566f2a | 6494 | { |
6495 | // | |
8ec526a4 | 6496 | // For the detector dect calcul the mean drift velocity for the |
6497 | // calibration group idect from the choosen database | |
77566f2a | 6498 | // |
6499 | ||
8ec526a4 | 6500 | AliTRDcalibDB *cal = AliTRDcalibDB::Instance(); |
77566f2a | 6501 | if (!cal) { |
6502 | AliInfo("Could not get calibDB Manager"); | |
6503 | return kFALSE; | |
6504 | } | |
6505 | ||
77566f2a | 6506 | fVdriftCoef[2] = 0.0; |
6507 | ||
8ec526a4 | 6508 | if (fDebug != 2) { |
6509 | for (Int_t row = fRowMin[1]; row < fRowMax[1]; row++) { | |
6510 | for (Int_t col = fColMin[1]; col < fColMax[1]; col++) { | |
6511 | // Groups of pads | |
6512 | if ((fNz[1] > 0) || | |
6513 | (fNrphi[1] > 0)) { | |
6514 | if (fAccCDB) { | |
6515 | fVdriftCoef[2] += (Float_t) cal->GetVdrift(dect,col,row); | |
6516 | } | |
6517 | if (!fAccCDB) { | |
6518 | fVdriftCoef[2] += 1.5; | |
6519 | } | |
6520 | } | |
6521 | // Per detectors | |
6522 | else { | |
6523 | if (fAccCDB) { | |
6524 | fVdriftCoef[2] += (Float_t) cal->GetVdriftAverage(dect); | |
6525 | } | |
6526 | if (!fAccCDB) { | |
6527 | fVdriftCoef[2] += 1.5; | |
6528 | } | |
77566f2a | 6529 | } |
77566f2a | 6530 | } |
6531 | } | |
8ec526a4 | 6532 | fVdriftCoef[2] = fVdriftCoef[2] / ((fColMax[1]-fColMin[1])*(fRowMax[1]-fRowMin[1])); |
6533 | if ((fDebug == 1) || | |
6534 | (fDebug == 4)) { | |
9f4780aa | 6535 | fCoefVdrift[2][idect] = fVdriftCoef[2]; |
8ec526a4 | 6536 | } |
77566f2a | 6537 | } |
8ec526a4 | 6538 | |
77566f2a | 6539 | return kTRUE; |
6540 | ||
6541 | } | |
6542 | ||
8ec526a4 | 6543 | //_____________________________________________________________________________ |
6544 | Float_t AliTRDCalibra::GetPRFDefault(Int_t plane) const | |
6545 | { | |
6546 | // | |
6547 | // Default width of the PRF if there is no database as reference | |
6548 | // | |
6549 | ||
6550 | if (plane == 0) { | |
6551 | return 0.515; | |
6552 | } | |
6553 | if (plane == 1) { | |
6554 | return 0.502; | |
6555 | } | |
6556 | if (plane == 2) { | |
6557 | return 0.491; | |
6558 | } | |
6559 | if (plane == 3) { | |
6560 | return 0.481; | |
6561 | } | |
6562 | if (plane == 4) { | |
6563 | return 0.471; | |
6564 | } | |
6565 | if (plane == 5) { | |
6566 | return 0.463; | |
6567 | } | |
6568 | else { | |
6569 | return 0.0; | |
6570 | } | |
6571 | ||
6572 | } | |
6573 | ||
6574 | // | |
6575 | //____________Pad group calibration mode_______________________________________ | |
6576 | // | |
6577 | ||
6578 | //_____________________________________________________________________________ | |
77566f2a | 6579 | void AliTRDCalibra::ReconstructionRowPadGroup(Int_t idect, Int_t i) |
6580 | { | |
6581 | // | |
8ec526a4 | 6582 | // For the calibration group idect in a detector calculate the |
6583 | // first and last row pad and col pad. | |
77566f2a | 6584 | // The pads in the interval will have the same calibrated coefficients |
6585 | // | |
6586 | ||
77566f2a | 6587 | Int_t posc = -1; |
6588 | Int_t posr = -1; | |
8ec526a4 | 6589 | fRowMin[i] = -1; |
6590 | fRowMax[i] = -1; | |
6591 | fColMin[i] = -1; | |
6592 | fColMax[i] = -1; | |
77566f2a | 6593 | |
8ec526a4 | 6594 | if (fNfragZ[i] != 0) { |
6595 | posc = (Int_t) idect / fNfragZ[i]; | |
6596 | } | |
6597 | if (fNfragRphi[i] != 0) { | |
6598 | posr = (Int_t) idect % fNfragZ[i]; | |
6599 | } | |
6600 | fRowMin[i] = posr * fNnZ[i]; | |
6601 | fRowMax[i] = (posr+1) * fNnZ[i]; | |
6602 | fColMin[i] = posc * fNnRphi[i]; | |
6603 | fColMax[i] = (posc+1) * fNnRphi[i]; | |
6604 | ||
77566f2a | 6605 | } |
6606 | ||
6607 | //_____________________________________________________________________________ | |
6608 | void AliTRDCalibra::CalculXBins(Int_t idect, Int_t i) | |
6609 | { | |
6610 | // | |
6611 | // For the detector idect calcul the first Xbins | |
6612 | // | |
6613 | ||
77566f2a | 6614 | fXbins[i] = 0; |
8ec526a4 | 6615 | if (fDebug == 4) { |
77566f2a | 6616 | AliInfo(Form("detector: %d", idect)); |
6617 | } | |
6618 | ||
8ec526a4 | 6619 | // In which sector? |
77566f2a | 6620 | Int_t sector = GetSector(idect); |
8ec526a4 | 6621 | fXbins[i] += sector*(6*fDetChamb2[i]+6*4*fDetChamb0[i]); |
77566f2a | 6622 | |
8ec526a4 | 6623 | // In which chamber? |
77566f2a | 6624 | Int_t chamber = GetChamber(idect); |
8ec526a4 | 6625 | Int_t kc = 0; |
6626 | while (kc < chamber) { | |
6627 | if (kc == 2) { | |
6628 | fXbins[i] += 6 * fDetChamb2[i]; | |
6629 | } | |
6630 | else { | |
6631 | fXbins[i] += 6 * fDetChamb0[i]; | |
6632 | } | |
77566f2a | 6633 | kc ++; |
6634 | } | |
6635 | ||
8ec526a4 | 6636 | // In which plane? |
77566f2a | 6637 | Int_t plane = GetPlane(idect); |
8ec526a4 | 6638 | if (chamber == 2) { |
6639 | fXbins[i] += plane*fDetChamb2[i]; | |
6640 | } | |
6641 | else { | |
6642 | fXbins[i] += plane*fDetChamb0[i]; | |
6643 | } | |
77566f2a | 6644 | |
6645 | } | |
8ec526a4 | 6646 | |
77566f2a | 6647 | //_____________________________________________________________________________ |
8ec526a4 | 6648 | Int_t AliTRDCalibra::SearchInVector(Int_t group, Int_t i) const |
77566f2a | 6649 | { |
6650 | // | |
8ec526a4 | 6651 | // Search if the calibration group "group" has already been |
6652 | // initialised by a previous track in the vector | |
77566f2a | 6653 | // |
6654 | ||
8ec526a4 | 6655 | if (i == 0) { |
6656 | for (Int_t k = 0; k < (Int_t) fPlaCH->GetEntriesFast(); k++) { | |
6657 | if (((AliTRDPlace *) fPlaCH->At(k))->GetPlace() == group) { | |
6658 | return k; | |
6659 | } | |
77566f2a | 6660 | } |
6661 | return -1; | |
6662 | } | |
6663 | ||
8ec526a4 | 6664 | if (i == 1) { |
6665 | for (Int_t k = 0; k < (Int_t) fPlaPH->GetEntriesFast(); k++) { | |
6666 | if (((AliTRDPlace *) fPlaPH->At(k))->GetPlace() == group) { | |
6667 | return k; | |
6668 | } | |
77566f2a | 6669 | } |
6670 | return -1; | |
6671 | } | |
6672 | ||
8ec526a4 | 6673 | if (i == 2) { |
6674 | for (Int_t k = 0; k < (Int_t) fPlaPRF->GetEntriesFast(); k++) { | |
6675 | if (((AliTRDPlace *) fPlaPRF->At(k))->GetPlace() == group) { | |
6676 | return k; | |
6677 | } | |
77566f2a | 6678 | } |
6679 | return -1; | |
6680 | } | |
8ec526a4 | 6681 | |
77566f2a | 6682 | return -1; |
8ec526a4 | 6683 | |
77566f2a | 6684 | } |
8ec526a4 | 6685 | |
77566f2a | 6686 | //_____________________________________________________________________________ |
8ec526a4 | 6687 | Int_t AliTRDCalibra::SearchInTreeVector(TObjArray *vectorplace, Int_t group) const |
77566f2a | 6688 | { |
6689 | // | |
6690 | // Search if the calibration group "group" is present in the tree | |
6691 | // | |
6692 | ||
8ec526a4 | 6693 | for (Int_t k = 0; k < (Int_t) vectorplace->GetEntriesFast(); k++) { |
6694 | if (((AliTRDPlace *) vectorplace->At(k))->GetPlace() == group) { | |
6695 | return k; | |
6696 | } | |
77566f2a | 6697 | } |
8ec526a4 | 6698 | |
77566f2a | 6699 | return -1; |
6700 | ||
6701 | } | |
8ec526a4 | 6702 | |
77566f2a | 6703 | //_____________________________________________________________________________ |
8ec526a4 | 6704 | Int_t AliTRDCalibra::SearchBin(Float_t value, Int_t i) const |
77566f2a | 6705 | { |
6706 | // | |
6707 | // Search the bin | |
6708 | // | |
6709 | ||
8ec526a4 | 6710 | Int_t reponse = 0; |
6711 | Int_t fbinmin = 0; | |
6712 | Int_t fbinmax = (Int_t) value; | |
77566f2a | 6713 | Int_t fNumberOfBin = -1; |
6714 | ||
8ec526a4 | 6715 | // Charge |
6716 | if (i == 0) { | |
6717 | fbinmax = 300; | |
6718 | fbinmin = 0; | |
77566f2a | 6719 | fNumberOfBin = fNumberBinCharge; |
6720 | } | |
6721 | ||
8ec526a4 | 6722 | // PRF |
6723 | if (i == 2) { | |
6724 | fbinmax = 1; | |
6725 | fbinmin = -1; | |
77566f2a | 6726 | fNumberOfBin = fNumberBinPRF; |
6727 | } | |
6728 | ||
8ec526a4 | 6729 | // Return -1 if out |
6730 | if ((value >= fbinmax) || | |
6731 | (value < fbinmin)) { | |
6732 | return -1; | |
6733 | } | |
6734 | // Sinon | |
6735 | else { | |
6736 | reponse = (Int_t) ((fNumberOfBin*(value-fbinmin)) / (fbinmax-fbinmin)); | |
77566f2a | 6737 | } |
6738 | ||
6739 | return reponse; | |
8ec526a4 | 6740 | |
77566f2a | 6741 | } |
8ec526a4 | 6742 | |
77566f2a | 6743 | //_____________________________________________________________________________ |
6744 | Bool_t AliTRDCalibra::UpdateVectorCH(Int_t group, Float_t value) | |
6745 | { | |
6746 | // | |
8ec526a4 | 6747 | // Fill the vector if a new calibration group "group" or update the |
6748 | // values of the calibration group "group" if already here | |
77566f2a | 6749 | // |
6750 | ||
8ec526a4 | 6751 | // Search bin |
77566f2a | 6752 | Int_t bin = SearchBin(value,0); |
8ec526a4 | 6753 | // Out |
6754 | if ((bin < 0) || (bin >= fNumberBinCharge)) { | |
6755 | return kFALSE; | |
77566f2a | 6756 | } |
8ec526a4 | 6757 | |
6758 | // Search place | |
6759 | Int_t place = SearchInVector(group,0); | |
6760 | ||
6761 | // New group | |
6762 | if (place == -1) { | |
6763 | AliTRDPlace *placegroup = new AliTRDPlace(); | |
6764 | placegroup->SetPlace(group); | |
6765 | fPlaCH->Add((TObject *) placegroup); | |
6766 | // Variable | |
6767 | AliTRDCTInfo *fCHInfo = new AliTRDCTInfo(); | |
6768 | UShort_t *entries = new UShort_t[fNumberBinCharge]; | |
6769 | // Initialise first | |
6770 | for(Int_t k = 0; k < fNumberBinCharge; k++) { | |
6771 | entries[k] = 0; | |
6772 | } | |
6773 | // Add the value | |
6774 | entries[bin]= 1; | |
6775 | // Set | |
6776 | fCHInfo->SetEntries(entries); | |
6777 | // Set in the vector | |
6778 | fVectorCH->Add((TObject *) fCHInfo); | |
6779 | } | |
6780 | // Group already exits | |
6781 | else { | |
6782 | // Variable | |
6783 | AliTRDCTInfo *fCHInfo = new AliTRDCTInfo(); | |
6784 | // Retrieve | |
6785 | fCHInfo = ((AliTRDCTInfo *) fVectorCH->At(place)); | |
6786 | UShort_t *entries = fCHInfo->GetEntries(); | |
6787 | // Add | |
6788 | entries[bin]++; | |
6789 | // Set | |
6790 | fCHInfo->SetEntries(entries); | |
6791 | // Update the vector | |
6792 | fVectorCH->AddAt((TObject *) fCHInfo,place); | |
77566f2a | 6793 | } |
6794 | ||
6795 | return kTRUE; | |
8ec526a4 | 6796 | |
77566f2a | 6797 | } |
6798 | ||
6799 | //_____________________________________________________________________________ | |
6800 | Bool_t AliTRDCalibra::UpdateVectorPRF(Int_t group, Float_t x, Float_t y) | |
6801 | { | |
6802 | // | |
8ec526a4 | 6803 | // Fill the vector if a new calibration group "group" or update the |
6804 | // values of the calibration group "group" if already here | |
77566f2a | 6805 | // |
6806 | ||
8ec526a4 | 6807 | // Search bin |
77566f2a | 6808 | Int_t bin = SearchBin(x,2); |
8ec526a4 | 6809 | // Out |
6810 | if ((bin < 0) || (bin >= fNumberBinPRF)) { | |
6811 | return kFALSE; | |
6812 | } | |
6813 | ||
6814 | // Search place | |
77566f2a | 6815 | Int_t place = SearchInVector(group,2); |
8ec526a4 | 6816 | |
6817 | // New group | |
6818 | if (place == -1) { | |
6819 | ||
6820 | AliTRDPlace *placegroup = new AliTRDPlace(); | |
6821 | placegroup->SetPlace(group); | |
6822 | fPlaPRF->Add((TObject *) placegroup); | |
6823 | AliTRDPInfo *fPRFInfo = new AliTRDPInfo(); | |
6824 | ||
6825 | Float_t *sum = new Float_t[fNumberBinPRF]; | |
6826 | Float_t *sumsquare = new Float_t[fNumberBinPRF]; | |
6827 | UShort_t *entries = new UShort_t[fNumberBinPRF]; | |
6828 | ||
6829 | // Initialise first | |
6830 | for (Int_t k = 0; k < fNumberBinPRF; k++) { | |
6831 | sum[k] = 0.0; | |
6832 | sumsquare[k] = 0.0; | |
6833 | entries[k] = 0; | |
6834 | } | |
6835 | ||
6836 | // Add the value | |
6837 | sum[bin] += y; | |
6838 | sumsquare[bin] += y*y; | |
6839 | entries[bin]++; | |
6840 | ||
6841 | // Set | |
6842 | fPRFInfo->SetSum(sum); | |
6843 | fPRFInfo->SetSumSquare(sumsquare); | |
6844 | fPRFInfo->SetEntries(entries); | |
6845 | ||
6846 | // Set in the vector | |
6847 | fVectorPRF->Add((TObject *) fPRFInfo); | |
77566f2a | 6848 | |
6849 | } | |
8ec526a4 | 6850 | // Group already exits |
6851 | else { | |
6852 | ||
6853 | AliTRDPInfo *fPRFInfo = new AliTRDPInfo(); | |
6854 | // Retrieve | |
6855 | fPRFInfo = (AliTRDPInfo *) fVectorPRF->At(place); | |
6856 | ||
6857 | Float_t *sum = fPRFInfo->GetSum(); | |
6858 | Float_t *sumsquare = fPRFInfo->GetSumSquare(); | |
6859 | UShort_t *entries = fPRFInfo->GetEntries(); | |
6860 | ||
6861 | // Add | |
6862 | Double_t calcul = (((Double_t) fPRFInfo->GetEntries()[bin]) | |
6863 | * ((Double_t) fPRFInfo->GetSum()[bin]) + (Double_t) y) | |
6864 | / (((Double_t) fPRFInfo->GetEntries()[bin]) + 1); | |
6865 | sum[bin] = (Float_t) calcul; | |
6866 | Double_t calculsquare = (((Double_t) fPRFInfo->GetSumSquare()[bin]) | |
6867 | * ((Double_t) fPRFInfo->GetEntries()[bin]) + ((Double_t) y)*((Double_t) y)) | |
6868 | / (((Double_t) fPRFInfo->GetEntries()[bin]) + 1); | |
6869 | sumsquare[bin] = (Float_t) calculsquare; | |
6870 | entries[bin]++; | |
6871 | ||
6872 | // Set | |
6873 | fPRFInfo->SetSum(sum); | |
6874 | fPRFInfo->SetSumSquare(sumsquare); | |
6875 | fPRFInfo->SetEntries(entries); | |
6876 | ||
6877 | // Update the vector | |
6878 | fVectorPRF->AddAt((TObject *) fPRFInfo,place); | |
77566f2a | 6879 | |
6880 | } | |
6881 | ||
6882 | return kTRUE; | |
8ec526a4 | 6883 | |
77566f2a | 6884 | } |
6885 | ||
6886 | //_____________________________________________________________________________ | |
6887 | Bool_t AliTRDCalibra::UpdateVectorPH(Int_t group, Int_t time, Float_t value) | |
6888 | { | |
6889 | // | |
8ec526a4 | 6890 | // Fill the vector if a new calibration group "group" or update |
6891 | // the values of the calibration group "group" if already here | |
77566f2a | 6892 | // |
6893 | ||
8ec526a4 | 6894 | // Search bin |
77566f2a | 6895 | Int_t bin = time; |
8ec526a4 | 6896 | // Out |
6897 | if ((bin < 0) || | |
6898 | (bin >= fTimeMax)) { | |
6899 | return kFALSE; | |
6900 | } | |
6901 | ||
6902 | // Search place | |
77566f2a | 6903 | Int_t place = SearchInVector(group,1); |
8ec526a4 | 6904 | |
6905 | // New group | |
77566f2a | 6906 | if(place == -1){ |
8ec526a4 | 6907 | |
6908 | AliTRDPlace *placegroup = new AliTRDPlace(); | |
6909 | placegroup->SetPlace(group); | |
6910 | fPlaPH->Add((TObject *) placegroup); | |
6911 | AliTRDPInfo *fPHInfo = new AliTRDPInfo(); | |
6912 | ||
6913 | Float_t *sum = new Float_t[fTimeMax]; | |
6914 | Float_t *sumsquare = new Float_t[fTimeMax]; | |
6915 | UShort_t *entries = new UShort_t[fTimeMax]; | |
6916 | ||
6917 | // Initialise first | |
6918 | for (Int_t k = 0; k < fTimeMax; k++) { | |
6919 | sum[k] = 0.0; | |
6920 | sumsquare[k] = 0.0; | |
6921 | entries[k] = 0; | |
6922 | } | |
6923 | ||
6924 | // Add the value | |
6925 | sum[bin] += value; | |
6926 | sumsquare[bin] += value*value; | |
6927 | entries[bin]++; | |
6928 | ||
6929 | // Set | |
6930 | fPHInfo->SetSum(sum); | |
6931 | fPHInfo->SetSumSquare(sumsquare); | |
6932 | fPHInfo->SetEntries(entries); | |
6933 | ||
6934 | // Set in the vector | |
6935 | fVectorPH->Add((TObject *) fPHInfo); | |
6936 | ||
77566f2a | 6937 | } |
8ec526a4 | 6938 | // Group already exits |
6939 | else { | |
6940 | ||
6941 | AliTRDPInfo *fPHInfo = new AliTRDPInfo(); | |
6942 | // Retrieve | |
6943 | fPHInfo = (AliTRDPInfo *) fVectorPH->At(place); | |
6944 | ||
6945 | Float_t *sum = fPHInfo->GetSum(); | |
6946 | Float_t *sumsquare = fPHInfo->GetSumSquare(); | |
6947 | UShort_t *entries = fPHInfo->GetEntries(); | |
6948 | ||
6949 | // Add | |
6950 | Double_t calcul = (((Double_t) fPHInfo->GetEntries()[bin]) | |
6951 | * ((Double_t) fPHInfo->GetSum()[bin]) + (Double_t) value) | |
6952 | / (((Double_t) fPHInfo->GetEntries()[bin]) + 1); | |
6953 | sum[bin] = (Float_t) calcul; | |
6954 | Double_t calculsquare = ((((Double_t) fPHInfo->GetSumSquare()[bin]) | |
6955 | * ((Double_t) fPHInfo->GetEntries()[bin])) | |
6956 | + (((Double_t) value) * ((Double_t)value))) | |
6957 | / (((Double_t) fPHInfo->GetEntries()[bin]) + 1); | |
6958 | sumsquare[bin] = (Float_t) calculsquare; | |
6959 | entries[bin]++; | |
6960 | ||
6961 | // Set | |
6962 | fPHInfo->SetSum(sum); | |
6963 | fPHInfo->SetSumSquare(sumsquare); | |
6964 | fPHInfo->SetEntries(entries); | |
6965 | ||
6966 | // Update the vector | |
6967 | fVectorPH->AddAt((TObject *) fPHInfo,place); | |
6968 | ||
77566f2a | 6969 | } |
6970 | ||
6971 | return kTRUE; | |
6972 | ||
6973 | } | |
6974 | ||
6975 | //_____________________________________________________________________________ | |
8ec526a4 | 6976 | TGraphErrors *AliTRDCalibra::ConvertVectorPHisto(AliTRDPInfo *pInfo |
6977 | , const Char_t *name) const | |
77566f2a | 6978 | { |
6979 | // | |
8ec526a4 | 6980 | // Convert the PInfo in a 1D grapherror, name must contains "PRF" |
6981 | // if PRF calibration and not "PRF" for Vdrift calibration | |
77566f2a | 6982 | // |
6983 | ||
6984 | TGraphErrors *histo; | |
8ec526a4 | 6985 | const Char_t *pattern1 = "PRF"; |
77566f2a | 6986 | |
8ec526a4 | 6987 | // Axis |
77566f2a | 6988 | Double_t *x; |
6989 | Double_t *y; | |
6990 | Double_t *ex; | |
6991 | Double_t *ey; | |
6992 | Double_t step = 0.0; | |
8ec526a4 | 6993 | Double_t min = 0.0; |
77566f2a | 6994 | |
8ec526a4 | 6995 | // Ntimes |
6996 | Int_t ntimes = 0; | |
6997 | if (strstr(name,pattern1)) { | |
6998 | ntimes = fNumberBinPRF; | |
6999 | } | |
7000 | else { | |
7001 | ntimes = fTimeMax; | |
7002 | } | |
7003 | x = new Double_t[ntimes]; // Xaxis | |
7004 | y = new Double_t[ntimes]; // Mean | |
7005 | ex = new Double_t[ntimes]; // Nentries | |
7006 | ey = new Double_t[ntimes]; // Sum of square/nentries | |
77566f2a | 7007 | |
8ec526a4 | 7008 | // Init histo |
7009 | if (!strstr(name,pattern1)) { | |
7010 | step = 1.0 / fSf; | |
7011 | min = 0.0; | |
77566f2a | 7012 | } |
7013 | else { | |
8ec526a4 | 7014 | step = (1.0 - (-1.0)) / fNumberBinPRF; |
7015 | min = -1.0 + step / 2.0; | |
77566f2a | 7016 | } |
7017 | ||
8ec526a4 | 7018 | // Fill histo |
7019 | for (Int_t k = 0; k < ntimes; k++) { | |
7020 | x[k] = min + k*step; | |
7021 | y[k] = 0.0; | |
77566f2a | 7022 | ex[k] = 0.0; |
7023 | ey[k] = 0.0; | |
8ec526a4 | 7024 | // Fill only if there is more than 0 something |
7025 | if (pInfo->GetEntries()[k] > 0) { | |
7026 | ex[k] = pInfo->GetEntries()[k]; | |
7027 | y[k] = pInfo->GetSum()[k]; | |
7028 | ey[k] = pInfo->GetSumSquare()[k]; | |
77566f2a | 7029 | } |
77566f2a | 7030 | } |
7031 | ||
8ec526a4 | 7032 | // Define the TGraphErrors |
7033 | histo = new TGraphErrors(ntimes,x,y,ex,ey); | |
77566f2a | 7034 | histo->SetTitle(name); |
7035 | return histo; | |
7036 | ||
77566f2a | 7037 | } |
7038 | ||
77566f2a | 7039 | //_____________________________________________________________________________ |
8ec526a4 | 7040 | TH1F *AliTRDCalibra::ConvertVectorCTHisto(AliTRDCTInfo *cTInfo |
7041 | , const Char_t * name) const | |
77566f2a | 7042 | { |
7043 | // | |
7044 | // Convert the CTInfo in a 1D histo | |
7045 | // | |
7046 | ||
7047 | TH1F *histo; | |
7048 | ||
8ec526a4 | 7049 | Int_t ntimes = fNumberBinCharge; |
7050 | UShort_t *entries = cTInfo->GetEntries(); | |
77566f2a | 7051 | |
8ec526a4 | 7052 | // Init histo |
77566f2a | 7053 | histo = new TH1F(name,name,fNumberBinCharge,0,300); |
7054 | histo->Sumw2(); | |
8ec526a4 | 7055 | // Fill histo |
7056 | for (Int_t k = 0; k < ntimes; k++) { | |
7057 | histo->SetBinContent(k+1,entries[k]); | |
7058 | histo->SetBinError(k+1,TMath::Sqrt(TMath::Abs(entries[k]))); | |
77566f2a | 7059 | } |
8ec526a4 | 7060 | |
77566f2a | 7061 | return histo; |
7062 | ||
77566f2a | 7063 | } |
8ec526a4 | 7064 | |
77566f2a | 7065 | //_____________________________________________________________________________ |
8ec526a4 | 7066 | TTree *AliTRDCalibra::ConvertVectorCTTreeHisto(TObjArray *vVectorCT |
7067 | , TObjArray *pPlaCT | |
7068 | , const Char_t *name | |
7069 | , const Char_t *nametitle) const | |
77566f2a | 7070 | { |
7071 | // | |
8ec526a4 | 7072 | // Convert the vector in a tree with two branchs: the group number |
7073 | // and the TH1F histo reconstructed from the vector | |
77566f2a | 7074 | // |
7075 | ||
8ec526a4 | 7076 | // Size of the things |
7077 | Int_t ntotal = (Int_t) pPlaCT->GetEntriesFast(); | |
7078 | if (ntotal == 0) { | |
77566f2a | 7079 | AliInfo("nothing to write!"); |
8ec526a4 | 7080 | TTree *treeCT = new TTree(name,nametitle); |
7081 | return treeCT; | |
77566f2a | 7082 | } |
77566f2a | 7083 | |
8ec526a4 | 7084 | // Variable of the tree |
7085 | Int_t groupnumber = -1; // Group calibration | |
7086 | TH1F *histo = 0x0; | |
7087 | TObjArray vectorCT = *vVectorCT; | |
7088 | TObjArray plaCT = *pPlaCT; | |
77566f2a | 7089 | |
8ec526a4 | 7090 | // Init the tree |
7091 | TTree *treeCT = new TTree(name,nametitle); | |
7092 | treeCT->Branch("groupnumber",&groupnumber,"groupnumber/I"); | |
7093 | treeCT->Branch("histo","TH1F",&histo,32000,0); | |
7094 | ||
7095 | // Fill | |
77566f2a | 7096 | Int_t k = 0; |
8ec526a4 | 7097 | while (k < ntotal) { |
77566f2a | 7098 | TString nome(name); |
8ec526a4 | 7099 | groupnumber = ((AliTRDPlace *) plaCT.At(0))->GetPlace(); |
7100 | nome += groupnumber; | |
7101 | histo = ConvertVectorCTHisto(((AliTRDCTInfo *) vectorCT.At(0)),nome); | |
7102 | treeCT->Fill(); | |
7103 | vectorCT.RemoveAt(0); | |
7104 | vectorCT.Compress(); | |
7105 | plaCT.RemoveAt(0); | |
7106 | plaCT.Compress(); | |
77566f2a | 7107 | k++; |
77566f2a | 7108 | } |
7109 | ||
8ec526a4 | 7110 | return treeCT; |
77566f2a | 7111 | |
7112 | } | |
7113 | ||
7114 | //_____________________________________________________________________________ | |
8ec526a4 | 7115 | TTree *AliTRDCalibra::ConvertVectorPTreeHisto(TObjArray *vVectorP |
7116 | , TObjArray *pPlaP | |
7117 | , const Char_t *name | |
7118 | , const Char_t *nametitle) const | |
77566f2a | 7119 | { |
7120 | // | |
8ec526a4 | 7121 | // Convert the vector in a tree with two branchs: the group number |
7122 | // and the TGraphErrors histo reconstructed from the vector. | |
7123 | // The name must contain "PRF" for PRF calibration and not "PRF" | |
7124 | // for Vdrift calibration | |
77566f2a | 7125 | // |
7126 | ||
8ec526a4 | 7127 | // Size of the things |
7128 | Int_t ntotal = (Int_t) pPlaP->GetEntriesFast(); | |
7129 | if (ntotal == 0) { | |
77566f2a | 7130 | AliInfo("nothing to write!"); |
8ec526a4 | 7131 | TTree *treeP = new TTree(name,nametitle); |
7132 | return treeP; | |
77566f2a | 7133 | } |
7134 | ||
8ec526a4 | 7135 | // Variable of the tree |
7136 | Int_t groupnumber = -1; // Group calibration | |
7137 | TGraphErrors *histo = 0x0; | |
7138 | TObjArray vectorP = *vVectorP; | |
7139 | TObjArray plaP = *pPlaP; | |
77566f2a | 7140 | |
8ec526a4 | 7141 | // Init the tree |
7142 | TTree *treeP = new TTree(name,nametitle); | |
7143 | treeP->Branch("groupnumber",&groupnumber,"groupnumber/I"); | |
7144 | treeP->Branch("histo","TGraphErrors",&histo,32000,0); | |
77566f2a | 7145 | |
8ec526a4 | 7146 | // Fill |
77566f2a | 7147 | Int_t k = 0; |
8ec526a4 | 7148 | while (k < ntotal) { |
77566f2a | 7149 | TString nome(name); |
8ec526a4 | 7150 | groupnumber = ((AliTRDPlace *) plaP.At(0))->GetPlace(); |
7151 | nome += groupnumber; | |
7152 | histo = ConvertVectorPHisto((AliTRDPInfo *) vectorP.At(0),nome); | |
7153 | treeP->Fill(); | |
7154 | vectorP.RemoveAt(0); | |
7155 | vectorP.Compress(); | |
7156 | plaP.RemoveAt(0); | |
7157 | plaP.Compress(); | |
77566f2a | 7158 | k++; |
77566f2a | 7159 | } |
7160 | ||
8ec526a4 | 7161 | return treeP; |
77566f2a | 7162 | |
7163 | } | |
7164 | ||
7165 | //_____________________________________________________________________________ | |
8ec526a4 | 7166 | TObjArray *AliTRDCalibra::ConvertTreeVector(TTree *tree) const |
77566f2a | 7167 | { |
7168 | // | |
8ec526a4 | 7169 | // Convert the branch groupnumber of the tree taken from |
7170 | // TRD.calibration.root in case of vector method in a std::vector | |
7171 | // to be faster | |
77566f2a | 7172 | // |
7173 | ||
8ec526a4 | 7174 | // Initialise |
7175 | TObjArray *vectorplace = new TObjArray(); | |
77566f2a | 7176 | |
8ec526a4 | 7177 | // Variable of the tree |
7178 | Int_t groupnumber = -1; // Group calibration | |
77566f2a | 7179 | |
8ec526a4 | 7180 | // Set the branch |
77566f2a | 7181 | tree->SetBranchAddress("groupnumber",&groupnumber); |
8ec526a4 | 7182 | |
7183 | // Fill | |
7184 | Int_t ntotal = tree->GetEntries(); | |
7185 | for (Int_t k = 0; k < ntotal; k++) { | |
77566f2a | 7186 | tree->GetEntry(k); |
8ec526a4 | 7187 | AliTRDPlace *placegroupnumber = new AliTRDPlace(); |
7188 | placegroupnumber->SetPlace(groupnumber); | |
7189 | vectorplace->Add((TObject *) placegroupnumber); | |
7190 | } | |
7191 | ||
77566f2a | 7192 | return vectorplace; |
7193 | ||
7194 | } | |
7195 | ||
7196 | //_____________________________________________________________________________ | |
8ec526a4 | 7197 | Bool_t AliTRDCalibra::MergeVectorCT(TObjArray *vVectorCT2, TObjArray *pPlaCT2) |
77566f2a | 7198 | { |
7199 | // | |
7200 | // Add the two vectors and place the result in the first | |
7201 | // | |
7202 | ||
8ec526a4 | 7203 | if (((Int_t) pPlaCT2->GetEntriesFast()) != ((Int_t) vVectorCT2->GetEntriesFast())){ |
77566f2a | 7204 | AliInfo("VectorCT2 doesn't correspond to PlaCT2!"); |
7205 | return kFALSE; | |
7206 | } | |
77566f2a | 7207 | |
8ec526a4 | 7208 | // CH case |
7209 | for (Int_t k = 0; k < (Int_t) fPlaCH->GetEntriesFast(); k++) { | |
77566f2a | 7210 | |
8ec526a4 | 7211 | // Look if PlaCT1[k] it is also in the second vector |
77566f2a | 7212 | Int_t place = -1; |
8ec526a4 | 7213 | for (Int_t j = 0; j < (Int_t) pPlaCT2->GetEntriesFast(); j++) { |
7214 | if (((AliTRDPlace *) pPlaCT2->At(j))->GetPlace() == | |
7215 | ((AliTRDPlace *) fPlaCH->At(k))->GetPlace()) { | |
77566f2a | 7216 | place = j; |
7217 | break; | |
7218 | } | |
7219 | } | |
7220 | ||
8ec526a4 | 7221 | // If not in the second vector nothing to do |
7222 | ||
7223 | // If in the second vector | |
7224 | if (place != -1) { | |
77566f2a | 7225 | |
8ec526a4 | 7226 | AliTRDCTInfo *fCTInfo = new AliTRDCTInfo(); |
7227 | UShort_t *entries = new UShort_t[fNumberBinCharge]; | |
77566f2a | 7228 | |
8ec526a4 | 7229 | for (Int_t nu = 0; nu < fNumberBinCharge; nu++) { |
7230 | entries[nu] = ((AliTRDCTInfo *) fVectorCH->At(((AliTRDPlace *) fPlaCH->At(k))->GetPlace()))->GetEntries()[nu] | |
7231 | + ((AliTRDCTInfo *) vVectorCT2->At(((AliTRDPlace *) fPlaCH->At(k))->GetPlace()))->GetEntries()[nu]; | |
77566f2a | 7232 | } |
7233 | ||
8ec526a4 | 7234 | // Set |
7235 | fCTInfo->SetEntries(entries); | |
7236 | ||
7237 | // Nothing to do on PlaCT1 | |
77566f2a | 7238 | |
8ec526a4 | 7239 | // Update the vector |
7240 | fVectorCH->AddAt((TObject *) fCTInfo,((AliTRDPlace *) fPlaCH->At(k))->GetPlace()); | |
7241 | ||
77566f2a | 7242 | } |
7243 | ||
8ec526a4 | 7244 | } |
7245 | ||
7246 | // And at the end the vector in CT2 but not in CH1 | |
7247 | for (Int_t k = 0; k < (Int_t) pPlaCT2->GetEntriesFast(); k++) { | |
77566f2a | 7248 | |
8ec526a4 | 7249 | // Look if pPlaCT2[k] it is also in the second vector |
77566f2a | 7250 | Int_t place = -1; |
8ec526a4 | 7251 | for (Int_t j = 0; j < (Int_t) fPlaCH->GetEntriesFast(); j++) { |
7252 | if (((AliTRDPlace *) fPlaCH->At(j))->GetPlace() == ((AliTRDPlace *) pPlaCT2->At(k))->GetPlace()) { | |
77566f2a | 7253 | place = j; |
7254 | break; | |
7255 | } | |
7256 | } | |
8ec526a4 | 7257 | |
7258 | // If not in the first vector | |
7259 | if (place == -1) { | |
77566f2a | 7260 | |
8ec526a4 | 7261 | AliTRDCTInfo *fCTInfo = new AliTRDCTInfo(); |
7262 | fCTInfo = ((AliTRDCTInfo *) vVectorCT2->At(((AliTRDPlace *) pPlaCT2->At(k))->GetPlace())); | |
77566f2a | 7263 | |
8ec526a4 | 7264 | // Add at the end |
7265 | fPlaCH->Add((TObject *) (pPlaCT2->At(k))); | |
7266 | fVectorCH->Add((TObject *) fCTInfo); | |
7267 | ||
77566f2a | 7268 | } |
7269 | ||
7270 | } | |
77566f2a | 7271 | |
7272 | return kTRUE; | |
7273 | ||
77566f2a | 7274 | } |
7275 | ||
7276 | //_____________________________________________________________________________ | |
8ec526a4 | 7277 | Bool_t AliTRDCalibra::MergeVectorP(TObjArray *vVectorP2 |
7278 | , TObjArray *pPlaP2 | |
7279 | , Int_t i) | |
77566f2a | 7280 | { |
7281 | // | |
7282 | // Add the two vectors and place the result in the first | |
7283 | // | |
77566f2a | 7284 | |
8ec526a4 | 7285 | if (((Int_t) pPlaP2->GetEntriesFast()) != ((Int_t) vVectorP2->GetEntriesFast())) { |
7286 | AliInfo("VectorP2 doesn't correspond to PlaP2!"); | |
7287 | return kFALSE; | |
7288 | } | |
7289 | ||
7290 | // PH case | |
7291 | if (i == 1) { | |
77566f2a | 7292 | |
8ec526a4 | 7293 | for (Int_t k = 0; k < (Int_t) fPlaPH->GetEntriesFast(); k++) { |
77566f2a | 7294 | |
8ec526a4 | 7295 | // Look if fPlaPH[k] it is also in the second vector |
77566f2a | 7296 | Int_t place = -1; |
8ec526a4 | 7297 | for (Int_t j = 0; j < (Int_t) pPlaP2->GetEntriesFast(); j++) { |
7298 | if (((AliTRDPlace *) pPlaP2->At(j))->GetPlace() == ((AliTRDPlace *) fPlaPH->At(k))->GetPlace()) { | |
77566f2a | 7299 | place = j; |
7300 | break; | |
7301 | } | |
7302 | } | |
7303 | ||
8ec526a4 | 7304 | // If not in the second vector nothing to do |
7305 | ||
7306 | // If in the second vector | |
7307 | if (place != -1) { | |
7308 | ||
7309 | AliTRDPInfo *fPInfo = new AliTRDPInfo(); | |
7310 | UShort_t *entries = new UShort_t[fTimeMax]; | |
7311 | Float_t *sum = new Float_t[fTimeMax]; | |
7312 | Float_t *sumsquare = new Float_t[fTimeMax]; | |
7313 | ||
7314 | for (Int_t nu = 0; nu < fTimeMax; nu++) { | |
77566f2a | 7315 | |
8ec526a4 | 7316 | entries[nu] = ((AliTRDPInfo *) fVectorPH->At(((AliTRDPlace *) fPlaPH->At(k))->GetPlace()))->GetEntries()[nu] |
7317 | + ((AliTRDPInfo *) vVectorP2->At(((AliTRDPlace *) fPlaPH->At(k))->GetPlace()))->GetEntries()[nu]; | |
77566f2a | 7318 | |
8ec526a4 | 7319 | Double_t calcul = ((((Double_t) ((AliTRDPInfo *) fVectorPH->At(((AliTRDPlace *) fPlaPH->At(k))->GetPlace()))->GetSum()[nu]) |
7320 | * ((Double_t) ((AliTRDPInfo *) fVectorPH->At(((AliTRDPlace *) fPlaPH->At(k))->GetPlace()))->GetEntries()[nu])) | |
7321 | + (((Double_t) ((AliTRDPInfo *) vVectorP2->At(((AliTRDPlace *) fPlaPH->At(k))->GetPlace()))->GetSum()[nu]) | |
7322 | * ((Double_t) ((AliTRDPInfo *) vVectorP2->At(((AliTRDPlace *) fPlaPH->At(k))->GetPlace()))->GetEntries()[nu]))) | |
7323 | / ((Double_t) fPInfo->GetEntries()[nu]); | |
7324 | ||
7325 | sum[nu] = (Float_t) calcul; | |
77566f2a | 7326 | |
8ec526a4 | 7327 | Double_t calculsquare = ((((Double_t) ((AliTRDPInfo *) fVectorPH->At(((AliTRDPlace *) fPlaPH->At(k))->GetPlace()))->GetSumSquare()[nu]) |
7328 | * ((Double_t) ((AliTRDPInfo *) fVectorPH->At(((AliTRDPlace *) fPlaPH->At(k))->GetPlace()))->GetEntries()[nu])) | |
7329 | + (((Double_t) ((AliTRDPInfo *) vVectorP2->At(((AliTRDPlace *) fPlaPH->At(k))->GetPlace()))->GetSumSquare()[nu]) | |
7330 | * ((Double_t) ((AliTRDPInfo *) vVectorP2->At(((AliTRDPlace *) fPlaPH->At(k))->GetPlace()))->GetEntries()[nu]))) | |
7331 | / ((Double_t) fPInfo->GetEntries()[nu]); | |
77566f2a | 7332 | |
7333 | ||
8ec526a4 | 7334 | sumsquare[nu] = calculsquare; |
7335 | ||
77566f2a | 7336 | } |
8ec526a4 | 7337 | |
7338 | // Set | |
7339 | fPInfo->SetSum(sum); | |
7340 | fPInfo->SetSumSquare(sumsquare); | |
7341 | fPInfo->SetEntries(entries); | |
77566f2a | 7342 | |
8ec526a4 | 7343 | // Nothing to do on PlaCT1 |
77566f2a | 7344 | |
8ec526a4 | 7345 | // Update the vector VectorCT1 |
7346 | fVectorPH->AddAt((TObject *) fPInfo,((AliTRDPlace *) fPlaPH->At(k))->GetPlace()); | |
77566f2a | 7347 | |
7348 | } | |
8ec526a4 | 7349 | |
77566f2a | 7350 | } |
8ec526a4 | 7351 | |
7352 | // And at the end the vector in P2 but not in CH1 | |
7353 | for (Int_t k = 0; k < (Int_t) pPlaP2->GetEntriesFast(); k++) { | |
77566f2a | 7354 | |
8ec526a4 | 7355 | // Look if PlaCT2[k] it is also in the second vector |
77566f2a | 7356 | Int_t place = -1; |
8ec526a4 | 7357 | for (Int_t j = 0; j < (Int_t) fPlaPH->GetEntriesFast(); j++) { |
7358 | if (((AliTRDPlace *) fPlaPH->At(j))->GetPlace() == ((AliTRDPlace *) pPlaP2->At(k))->GetPlace()) { | |
77566f2a | 7359 | place = j; |
7360 | break; | |
7361 | } | |
7362 | } | |
7363 | ||
8ec526a4 | 7364 | // If not in the first vector |
7365 | if (place == -1) { | |
77566f2a | 7366 | |
8ec526a4 | 7367 | AliTRDPInfo *fPInfo = new AliTRDPInfo(); |
7368 | fPInfo = (AliTRDPInfo *) vVectorP2->At(((AliTRDPlace *) pPlaP2->At(k))->GetPlace()); | |
77566f2a | 7369 | |
8ec526a4 | 7370 | // Add at the end of CH1 |
7371 | fPlaPH->Add(((TObject *) pPlaP2->At(k))); | |
7372 | fVectorPH->Add((TObject *) fPInfo); | |
7373 | ||
77566f2a | 7374 | } |
8ec526a4 | 7375 | |
77566f2a | 7376 | } |
8ec526a4 | 7377 | |
77566f2a | 7378 | } |
7379 | ||
7380 | ||
8ec526a4 | 7381 | // PRF case |
7382 | if (i == 1) { | |
7383 | ||
7384 | for (Int_t k = 0; k < (Int_t) fPlaPRF->GetEntriesFast(); k++) { | |
77566f2a | 7385 | |
8ec526a4 | 7386 | // Look if fPlaPRF[k] it is also in the second vector |
77566f2a | 7387 | Int_t place = -1; |
8ec526a4 | 7388 | for (Int_t j = 0; j < (Int_t) pPlaP2->GetEntriesFast(); j++) { |
7389 | if (((AliTRDPlace *) pPlaP2->At(j))->GetPlace() == ((AliTRDPlace *) fPlaPRF->At(k))->GetPlace()) { | |
77566f2a | 7390 | place = j; |
7391 | break; | |
7392 | } | |
7393 | } | |
8ec526a4 | 7394 | |
7395 | // If not in the second vector nothing to do | |
7396 | ||
7397 | // If in the second vector | |
7398 | if (place != -1) { | |
77566f2a | 7399 | |
8ec526a4 | 7400 | AliTRDPInfo *fPInfo = new AliTRDPInfo(); |
7401 | UShort_t *entries = new UShort_t[fNumberBinPRF]; | |
7402 | Float_t *sum = new Float_t[fNumberBinPRF]; | |
7403 | Float_t *sumsquare = new Float_t[fNumberBinPRF]; | |
7404 | ||
7405 | for (Int_t nu = 0; nu < fNumberBinPRF; nu++) { | |
77566f2a | 7406 | |
8ec526a4 | 7407 | entries[nu] = ((AliTRDPInfo *) fVectorPRF->At(((AliTRDPlace *) fPlaPRF->At(k))->GetPlace()))->GetEntries()[nu] |
7408 | + ((AliTRDPInfo *) vVectorP2->At(((AliTRDPlace *) fPlaPRF->At(k))->GetPlace()))->GetEntries()[nu]; | |
77566f2a | 7409 | |
8ec526a4 | 7410 | Double_t calcul = ((((Double_t) ((AliTRDPInfo *) fVectorPRF->At(((AliTRDPlace *) fPlaPRF->At(k))->GetPlace()))->GetSum()[nu]) |
7411 | * ((Double_t) ((AliTRDPInfo *) fVectorPRF->At(((AliTRDPlace *) fPlaPRF->At(k))->GetPlace()))->GetEntries()[nu])) | |
7412 | + (((Double_t) ((AliTRDPInfo *) vVectorP2->At(((AliTRDPlace *) fPlaPRF->At(k))->GetPlace()))->GetSum()[nu]) | |
7413 | * ((Double_t) ((AliTRDPInfo *) vVectorP2->At(((AliTRDPlace *) fPlaPRF->At(k))->GetPlace()))->GetEntries()[nu]))) | |
7414 | / ((Double_t) fPInfo->GetEntries()[nu]); | |
7415 | ||
7416 | sum[nu] = (Float_t) calcul; | |
77566f2a | 7417 | |
8ec526a4 | 7418 | Double_t calculsquare = ((((Double_t) ((AliTRDPInfo *) fVectorPRF->At(((AliTRDPlace *) fPlaPRF->At(k))->GetPlace()))->GetSumSquare()[nu]) |
7419 | * ((Double_t) ((AliTRDPInfo *) fVectorPRF->At(((AliTRDPlace *) fPlaPRF->At(k))->GetPlace()))->GetEntries()[nu])) | |
7420 | + (((Double_t) ((AliTRDPInfo *) vVectorP2->At(((AliTRDPlace *) fPlaPRF->At(k))->GetPlace()))->GetSumSquare()[nu]) | |
7421 | * ((Double_t) ((AliTRDPInfo *) vVectorP2->At(((AliTRDPlace *) fPlaPRF->At(k))->GetPlace()))->GetEntries()[nu]))) | |
7422 | / ((Double_t) fPInfo->GetEntries()[nu]); | |
7423 | ||
7424 | sumsquare[nu] = calculsquare; | |
7425 | ||
77566f2a | 7426 | } |
8ec526a4 | 7427 | |
7428 | // Set | |
7429 | fPInfo->SetSum(sum); | |
7430 | fPInfo->SetSumSquare(sumsquare); | |
7431 | fPInfo->SetEntries(entries); | |
7432 | ||
7433 | // Nothing to do on PlaCT1 | |
77566f2a | 7434 | |
8ec526a4 | 7435 | // Update the vector VectorCT1 |
7436 | fVectorPRF->AddAt((TObject *) fPInfo,((AliTRDPlace *) fPlaPRF->At(k))->GetPlace()); | |
77566f2a | 7437 | |
7438 | } | |
8ec526a4 | 7439 | |
77566f2a | 7440 | } |
8ec526a4 | 7441 | |
7442 | // And at the end the vector in P2 but not in CH1 | |
7443 | for (Int_t k = 0; k < (Int_t) pPlaP2->GetEntriesFast(); k++) { | |
77566f2a | 7444 | |
8ec526a4 | 7445 | // Look if PlaCT2[k] it is also in the second vector |
77566f2a | 7446 | Int_t place = -1; |
8ec526a4 | 7447 | for (Int_t j = 0; j < (Int_t) fPlaPRF->GetEntriesFast(); j++) { |
7448 | if (((AliTRDPlace *) fPlaPRF->At(j))->GetPlace() == ((AliTRDPlace *) pPlaP2->At(k))->GetPlace()) { | |
77566f2a | 7449 | place = j; |
7450 | break; | |
7451 | } | |
7452 | } | |
8ec526a4 | 7453 | |
7454 | // If not in the first vector | |
7455 | if (place == -1) { | |
7456 | ||
7457 | AliTRDPInfo *fPInfo = new AliTRDPInfo(); | |
7458 | fPInfo = (AliTRDPInfo *) vVectorP2->At(((AliTRDPlace *) pPlaP2->At(k))->GetPlace()); | |
7459 | ||
7460 | // Add at the end of CH1 | |
7461 | fPlaPRF->Add(((TObject *) pPlaP2->At(k))); | |
7462 | fVectorPRF->Add((TObject *) fPInfo); | |
7463 | ||
77566f2a | 7464 | } |
7465 | ||
7466 | } | |
8ec526a4 | 7467 | |
77566f2a | 7468 | } |
8ec526a4 | 7469 | |
77566f2a | 7470 | return kTRUE; |
8ec526a4 | 7471 | |
77566f2a | 7472 | } |
77566f2a | 7473 | |
8ec526a4 | 7474 | //____________Fit Methods______________________________________________________ |
7475 | ||
7476 | //_____________________________________________________________________________ | |
77566f2a | 7477 | void AliTRDCalibra::FitPente(TH1* projPH, Int_t idect) |
7478 | { | |
7479 | // | |
7480 | // Slope methode for the drift velocity | |
7481 | // | |
7482 | ||
8ec526a4 | 7483 | // Constants |
77566f2a | 7484 | const Float_t kDrWidth = AliTRDgeometry::DrThick(); |
8ec526a4 | 7485 | Int_t binmax = 0; |
7486 | Int_t binmin = 0; | |
7487 | fPhd[0] = 0.0; | |
7488 | fPhd[1] = 0.0; | |
7489 | fPhd[2] = 0.0; | |
7490 | Int_t ju = 0; | |
9f4780aa | 7491 | Double_t vdriftCoefE = 0.0; |
7492 | Double_t t0CoefE = 0.0; | |
77566f2a | 7493 | fVdriftCoef[1] = 0.0; |
8ec526a4 | 7494 | fT0Coef[1] = 0.0; |
77566f2a | 7495 | TLine *line = new TLine(); |
77566f2a | 7496 | |
8ec526a4 | 7497 | // Some variables |
7498 | TAxis *xpph = projPH->GetXaxis(); | |
7499 | Int_t nbins = xpph->GetNbins(); | |
7500 | Double_t lowedge = xpph->GetBinLowEdge(1); | |
7501 | Double_t upedge = xpph->GetBinUpEdge(xpph->GetNbins()); | |
7502 | Double_t widbins = (upedge - lowedge) / nbins; | |
7503 | Double_t limit = upedge + 0.5 * widbins; | |
7504 | ||
7505 | // Beginning of the signal | |
7506 | TH1D *pentea = new TH1D("pentea","pentea",projPH->GetNbinsX(),0,(Float_t) limit); | |
7507 | for (Int_t k = 1; k < projPH->GetNbinsX(); k++) { | |
7508 | pentea->SetBinContent(k,(Double_t) (projPH->GetBinContent(k+1) - projPH->GetBinContent(k))); | |
77566f2a | 7509 | } |
8ec526a4 | 7510 | |
7511 | binmax = (Int_t) pentea->GetMaximumBin(); | |
7512 | if (binmax == 1) { | |
77566f2a | 7513 | binmax = 2; |
7514 | AliInfo("Put the binmax from 1 to 2 to enable the fit"); | |
7515 | } | |
7516 | pentea->Fit("pol2","0MR","",TMath::Max(pentea->GetBinCenter(binmax-1),0.0),pentea->GetBinCenter(binmax+1)); | |
7517 | Float_t l3P1am = pentea->GetFunction("pol2")->GetParameter(1); | |
7518 | Float_t l3P2am = pentea->GetFunction("pol2")->GetParameter(2); | |
9f4780aa | 7519 | Float_t l3P1amE = pentea->GetFunction("pol2")->GetParError(1); |
7520 | Float_t l3P2amE = pentea->GetFunction("pol2")->GetParError(2); | |
8ec526a4 | 7521 | if (l3P2am != 0) { |
7522 | fPhd[0] = -(l3P1am / (2 * l3P2am)); | |
7523 | } | |
9f4780aa | 7524 | if((l3P1am != 0.0) && (l3P2am != 0.0)){ |
7525 | t0CoefE = (l3P1amE/l3P1am + l3P2amE/l3P2am)*fPhd[0]; | |
7526 | } | |
77566f2a | 7527 | |
8ec526a4 | 7528 | // Amplification region |
77566f2a | 7529 | binmax = 0; |
8ec526a4 | 7530 | ju = 0; |
7531 | for (Int_t kbin = 1; kbin < projPH->GetNbinsX(); kbin ++) { | |
9f4780aa | 7532 | if (((projPH->GetBinContent(kbin+1) - projPH->GetBinContent(kbin)) <= 0.0) && (ju == 0) && (kbin > (fPhd[0]/widbins))) { |
77566f2a | 7533 | binmax = kbin; |
8ec526a4 | 7534 | ju = 1; |
77566f2a | 7535 | } |
7536 | } | |
8ec526a4 | 7537 | if (binmax == 1) { |
77566f2a | 7538 | binmax = 2; |
7539 | AliInfo("Put the binmax from 1 to 2 to enable the fit"); | |
7540 | } | |
7541 | projPH->Fit("pol2","0MR","",TMath::Max(projPH->GetBinCenter(binmax-1),0.0),projPH->GetBinCenter(binmax+1)); | |
7542 | Float_t l3P1amf = projPH->GetFunction("pol2")->GetParameter(1); | |
7543 | Float_t l3P2amf = projPH->GetFunction("pol2")->GetParameter(2); | |
9f4780aa | 7544 | Float_t l3P1amfE = projPH->GetFunction("pol2")->GetParError(1); |
7545 | Float_t l3P2amfE = projPH->GetFunction("pol2")->GetParError(2); | |
77566f2a | 7546 | |
8ec526a4 | 7547 | if (l3P2amf != 0) { |
7548 | fPhd[1] = -(l3P1amf / (2 * l3P2amf)); | |
7549 | } | |
9f4780aa | 7550 | if((l3P1amf != 0.0) && (l3P2amf != 0.0)){ |
7551 | vdriftCoefE = (l3P1amfE/l3P1amf + l3P2amfE/l3P2amf)*fPhd[1]; | |
7552 | } | |
77566f2a | 7553 | |
8ec526a4 | 7554 | // Drift region |
7555 | TH1D *pente = new TH1D("pente","pente",projPH->GetNbinsX(),0,(Float_t) limit); | |
7556 | for (Int_t k = binmax+4; k < projPH->GetNbinsX(); k++) { | |
7557 | pente->SetBinContent(k,(Double_t) (projPH->GetBinContent(k+1) - projPH->GetBinContent(k))); | |
77566f2a | 7558 | } |
8ec526a4 | 7559 | binmin = (Int_t) pente->GetMinimumBin(); |
7560 | if (binmin == 1) { | |
77566f2a | 7561 | binmin = 2; |
7562 | AliInfo("Put the binmax from 1 to 2 to enable the fit"); | |
7563 | } | |
9244c78b | 7564 | pente->Fit("pol2" |
7565 | ,"0MR" | |
7566 | ,"" | |
7567 | ,TMath::Max(pente->GetBinCenter(binmin-1), 0.0) | |
7568 | ,TMath::Min(pente->GetBinCenter(binmin+2),(Double_t) limit)); | |
77566f2a | 7569 | Float_t l3P1dr = pente->GetFunction("pol2")->GetParameter(1); |
7570 | Float_t l3P2dr = pente->GetFunction("pol2")->GetParameter(2); | |
9f4780aa | 7571 | Float_t l3P1drE = pente->GetFunction("pol2")->GetParError(1); |
7572 | Float_t l3P2drE = pente->GetFunction("pol2")->GetParError(2); | |
8ec526a4 | 7573 | if (l3P2dr != 0) { |
7574 | fPhd[2] = -(l3P1dr / (2 * l3P2dr)); | |
7575 | } | |
9f4780aa | 7576 | if((l3P1dr != 0.0) && (l3P2dr != 0.0)){ |
7577 | vdriftCoefE += (l3P1drE/l3P1dr + l3P2drE/l3P2dr)*fPhd[2]; | |
7578 | } | |
77566f2a | 7579 | |
8ec526a4 | 7580 | if ((fPhd[2] > fPhd[0]) && |
7581 | (fPhd[2] > fPhd[1]) && | |
7582 | (fPhd[1] > fPhd[0])) { | |
7583 | fVdriftCoef[1] = (kDrWidth) / (fPhd[2]-fPhd[1]); | |
7584 | if (fPhd[0] >= 0.0) { | |
9244c78b | 7585 | fT0Coef[1] = (fPhd[0] - fT0Shift) / widbins; |
9f4780aa | 7586 | if (fT0Coef[1] < -1.0) { |
7587 | fT0Coef[1] = fT0Coef[2]; | |
9244c78b | 7588 | } |
8ec526a4 | 7589 | } |
7590 | else { | |
9f4780aa | 7591 | fT0Coef[1] = fT0Coef[2]; |
8ec526a4 | 7592 | } |
77566f2a | 7593 | } |
8ec526a4 | 7594 | else { |
77566f2a | 7595 | fVdriftCoef[1] = -TMath::Abs(fVdriftCoef[2]); |
9f4780aa | 7596 | fT0Coef[1] = fT0Coef[2]; |
77566f2a | 7597 | } |
77566f2a | 7598 | |
8ec526a4 | 7599 | if ((fDebug == 1) || |
7600 | (fDebug == 4)) { | |
9f4780aa | 7601 | fCoefVdrift[1][idect] = fVdriftCoef[1]; |
7602 | fCoefVdriftE[1] [idect] = vdriftCoefE; | |
7603 | fCoefT0[1][idect] = fT0Coef[1]; | |
7604 | fCoefT0E[1][idect] = t0CoefE; | |
77566f2a | 7605 | } |
7606 | ||
8ec526a4 | 7607 | if (fDebug == 2) { |
77566f2a | 7608 | TCanvas *cpentei = new TCanvas("cpentei","cpentei",50,50,600,800); |
7609 | cpentei->cd(); | |
7610 | projPH->Draw(); | |
7611 | line->SetLineColor(2); | |
7612 | line->DrawLine(fPhd[0],0,fPhd[0],projPH->GetMaximum()); | |
7613 | line->DrawLine(fPhd[1],0,fPhd[1],projPH->GetMaximum()); | |
7614 | line->DrawLine(fPhd[2],0,fPhd[2],projPH->GetMaximum()); | |
8ec526a4 | 7615 | AliInfo(Form("fPhd[0] (beginning of the signal): %f" ,(Float_t) fPhd[0])); |
7616 | AliInfo(Form("fPhd[1] (end of the amplification region): %f" ,(Float_t) fPhd[1])); | |
7617 | AliInfo(Form("fPhd[2] (end of the drift region): %f" ,(Float_t) fPhd[2])); | |
7618 | AliInfo(Form("fVriftCoef[1] (with only the drift region(default)): %f",(Float_t) fVdriftCoef[1])); | |
77566f2a | 7619 | } |
8ec526a4 | 7620 | |
7621 | if (fDebug != 2) { | |
7622 | delete pentea; | |
7623 | } | |
7624 | if (fDebug != 2) { | |
7625 | delete pente; | |
7626 | } | |
7627 | ||
77566f2a | 7628 | } |
7629 | ||
8ec526a4 | 7630 | //_____________________________________________________________________________ |
77566f2a | 7631 | void AliTRDCalibra::FitPH(TH1* projPH, Int_t idect) |
7632 | { | |
7633 | // | |
7634 | // Fit methode for the drift velocity | |
7635 | // | |
7636 | ||
8ec526a4 | 7637 | // Constants |
7638 | const Float_t kDrWidth = AliTRDgeometry::DrThick(); | |
7639 | ||
7640 | // Some variables | |
7641 | TAxis *xpph = projPH->GetXaxis(); | |
7642 | Double_t upedge = xpph->GetBinUpEdge(xpph->GetNbins()); | |
77566f2a | 7643 | |
8ec526a4 | 7644 | TF1 *fPH = new TF1("fPH",AliTRDCalibra::PH,-0.05,3.2,6); |
7645 | fPH->SetParameter(0,0.469); // Scaling | |
7646 | fPH->SetParameter(1,0.18); // Start | |
7647 | fPH->SetParameter(2,0.0857325); // AR | |
7648 | fPH->SetParameter(3,1.89); // DR | |
7649 | fPH->SetParameter(4,0.08); // QA/QD | |
7650 | fPH->SetParameter(5,0.0); // Baseline | |
77566f2a | 7651 | |
7652 | TLine *line = new TLine(); | |
7653 | ||
7654 | fVdriftCoef[0] = 0.0; | |
8ec526a4 | 7655 | fT0Coef[0] = 0.0; |
9f4780aa | 7656 | Double_t vdriftCoefE = 0.0; |
7657 | Double_t t0CoefE = 0.0; | |
77566f2a | 7658 | |
8ec526a4 | 7659 | if (idect%fFitPHPeriode == 0) { |
7660 | ||
7661 | AliInfo(Form("<AliTRDCalibra::FitPH> The detector %d will be fitted",idect)); | |
7662 | fPH->SetParameter(0,(projPH->Integral()-(projPH->GetBinContent(1)*projPH->GetNbinsX())) * 0.00028); // Scaling | |
7663 | fPH->SetParameter(1,fPhd[0] - 0.1); // Start | |
7664 | fPH->SetParameter(2,fPhd[1] - fPhd[0]); // AR | |
7665 | fPH->SetParameter(3,fPhd[2] - fPhd[1]); // DR | |
7666 | fPH->SetParameter(4,0.225); // QA/QD | |
77566f2a | 7667 | fPH->SetParameter(5,(Float_t) projPH->GetBinContent(1)); |
7668 | ||
8ec526a4 | 7669 | if (fDebug != 2) { |
7670 | projPH->Fit(fPH,"0M","",0.0,upedge); | |
77566f2a | 7671 | } |
7672 | ||
8ec526a4 | 7673 | if (fDebug == 2) { |
77566f2a | 7674 | TCanvas *cpente = new TCanvas("cpente","cpente",50,50,600,800); |
7675 | cpente->cd(); | |
8ec526a4 | 7676 | projPH->Fit(fPH,"M+","",0.0,upedge); |
77566f2a | 7677 | projPH->Draw("E0"); |
7678 | line->SetLineColor(4); | |
8ec526a4 | 7679 | line->DrawLine(fPH->GetParameter(1) |
7680 | ,0 | |
7681 | ,fPH->GetParameter(1) | |
7682 | ,projPH->GetMaximum()); | |
7683 | line->DrawLine(fPH->GetParameter(1)+fPH->GetParameter(2) | |
7684 | ,0 | |
7685 | ,fPH->GetParameter(1)+fPH->GetParameter(2) | |
7686 | ,projPH->GetMaximum()); | |
7687 | line->DrawLine(fPH->GetParameter(1)+fPH->GetParameter(2)+fPH->GetParameter(3) | |
7688 | ,0 | |
7689 | ,fPH->GetParameter(1)+fPH->GetParameter(2)+fPH->GetParameter(3) | |
7690 | ,projPH->GetMaximum()); | |
7691 | } | |
7692 | ||
7693 | if (fPH->GetParameter(3) != 0) { | |
7694 | fVdriftCoef[0] = kDrWidth / (fPH->GetParameter(3)); | |
9f4780aa | 7695 | vdriftCoefE = (fPH->GetParError(3)/fPH->GetParameter(3))*fVdriftCoef[0]; |
8ec526a4 | 7696 | fT0Coef[0] = fPH->GetParameter(1); |
9f4780aa | 7697 | t0CoefE = fPH->GetParError(1); |
77566f2a | 7698 | } |
7699 | else { | |
7700 | fVdriftCoef[0] = -TMath::Abs(fVdriftCoef[2]); | |
9f4780aa | 7701 | fT0Coef[0] = fT0Coef[2]; |
77566f2a | 7702 | } |
8ec526a4 | 7703 | |
7704 | if ((fDebug == 1) || | |
7705 | (fDebug == 4)) { | |
9f4780aa | 7706 | fCoefVdrift[0][idect] = fVdriftCoef[0]; |
7707 | fCoefVdriftE[0][idect] = vdriftCoefE; | |
7708 | fCoefT0[0][idect] = fT0Coef[0]; | |
7709 | fCoefT0E[0][idect] = t0CoefE; | |
77566f2a | 7710 | } |
8ec526a4 | 7711 | if (fDebug == 2) { |
7712 | AliInfo(Form("fVdriftCoef[0]: %f",(Float_t) fVdriftCoef[0])); | |
77566f2a | 7713 | } |
8ec526a4 | 7714 | |
77566f2a | 7715 | } |
7716 | ||
8ec526a4 | 7717 | else { |
7718 | ||
7719 | // Put the default value | |
7720 | if ((fDebug <= 1) || | |
e3cd8b1a | 7721 | (fDebug == 4)) { |
9f4780aa | 7722 | fCoefVdrift[0][idect] = -TMath::Abs(fVdriftCoef[2]); |
7723 | fCoefT0[0][idect] = -TMath::Abs(fT0Coef[2]); | |
77566f2a | 7724 | } |
7725 | ||
7726 | } | |
7727 | ||
8ec526a4 | 7728 | if (fDebug != 2) { |
7729 | delete fPH; | |
7730 | } | |
77566f2a | 7731 | |
7732 | } | |
8ec526a4 | 7733 | |
7734 | //_____________________________________________________________________________ | |
7735 | void AliTRDCalibra::FitPRF(TH1 *projPRF, Int_t idect) | |
77566f2a | 7736 | { |
7737 | // | |
7738 | // Fit methode for the sigma of the pad response function | |
7739 | // | |
7740 | ||
7741 | fPRFCoef[0] = 0.0; | |
9f4780aa | 7742 | Double_t prfCoefE = 0.0; |
77566f2a | 7743 | |
8ec526a4 | 7744 | if (fDebug != 2) { |
7745 | projPRF->Fit("gaus","0M","",-fRangeFitPRF,fRangeFitPRF); | |
77566f2a | 7746 | } |
7747 | ||
8ec526a4 | 7748 | if (fDebug == 2) { |
77566f2a | 7749 | TCanvas *cfit = new TCanvas("cfit","cfit",50,50,600,800); |
7750 | cfit->cd(); | |
8ec526a4 | 7751 | projPRF->Fit("gaus","M+","",-fRangeFitPRF,fRangeFitPRF); |
77566f2a | 7752 | projPRF->Draw(); |
77566f2a | 7753 | } |
8ec526a4 | 7754 | |
77566f2a | 7755 | fPRFCoef[0] = projPRF->GetFunction("gaus")->GetParameter(2); |
9f4780aa | 7756 | prfCoefE = projPRF->GetFunction("gaus")->GetParError(2); |
e5c60cc7 | 7757 | if(fPRFCoef[0] <= 0.0) fPRFCoef[0] = -fPRFCoef[1]; |
77566f2a | 7758 | |
8ec526a4 | 7759 | if ((fDebug == 1) || |
7760 | (fDebug == 4)) { | |
9f4780aa | 7761 | fCoefPRF[0][idect] = fPRFCoef[0]; |
7762 | fCoefPRFE[idect] = prfCoefE; | |
77566f2a | 7763 | } |
8ec526a4 | 7764 | if (fDebug == 2) { |
7765 | AliInfo(Form("fPRFCoef[0]: %f",(Float_t) fPRFCoef[0])); | |
77566f2a | 7766 | } |
7767 | ||
7768 | } | |
8ec526a4 | 7769 | |
7770 | //_____________________________________________________________________________ | |
7771 | void AliTRDCalibra::FitCH(TH1 *projch, Int_t idect) | |
77566f2a | 7772 | { |
7773 | // | |
7774 | // Fit methode for the gain factor | |
7775 | // | |
7776 | ||
7777 | fChargeCoef[0] = 0.0; | |
7778 | fChargeCoef[1] = 0.0; | |
9f4780aa | 7779 | Double_t chargeCoefE0 = 0.0; |
7780 | Double_t chargeCoefE1 = 0.0; | |
8ec526a4 | 7781 | TF1 *fLandauGaus = new TF1("fLandauGaus",FuncLandauGaus,0,300,5); |
77566f2a | 7782 | |
7783 | fChargeCoef[1] = projch->GetMean(); | |
9f4780aa | 7784 | chargeCoefE1 = projch->GetMeanError(); |
8ec526a4 | 7785 | projch->Fit("landau","0","" |
7786 | ,(Float_t) fChargeCoef[1]/fBeginFitCharge | |
7787 | ,projch->GetBinCenter(projch->GetNbinsX())); | |
7788 | fL3P0 = projch->GetFunction("landau")->GetParameter(0); | |
77566f2a | 7789 | Double_t l3P1 = projch->GetFunction("landau")->GetParameter(1); |
8ec526a4 | 7790 | fL3P2 = projch->GetFunction("landau")->GetParameter(2); |
77566f2a | 7791 | |
8ec526a4 | 7792 | projch->Fit("gaus","0","" |
7793 | ,(Float_t) fChargeCoef[1]/fBeginFitCharge | |
7794 | ,projch->GetBinCenter(projch->GetNbinsX())); | |
77566f2a | 7795 | Double_t g3P0 = projch->GetFunction("gaus")->GetParameter(0); |
8ec526a4 | 7796 | fG3P2 = projch->GetFunction("gaus")->GetParameter(2); |
77566f2a | 7797 | |
8ec526a4 | 7798 | fLandauGaus->SetParameters(fL3P0,l3P1,fL3P2,g3P0,fG3P2); |
7799 | if ((fDebug <= 1) || | |
7800 | (fDebug >= 3)) { | |
7801 | projch->Fit("fLandauGaus","0","" | |
7802 | ,(Float_t) fChargeCoef[1]/fBeginFitCharge | |
7803 | ,projch->GetBinCenter(projch->GetNbinsX())); | |
77566f2a | 7804 | } |
8ec526a4 | 7805 | |
7806 | if (fDebug == 2) { | |
77566f2a | 7807 | TCanvas *cp = new TCanvas("cp","cp",50,50,600,800); |
7808 | cp->cd(); | |
8ec526a4 | 7809 | projch->Fit("fLandauGaus","+","" |
7810 | ,(Float_t) fChargeCoef[1]/fBeginFitCharge | |
7811 | ,projch->GetBinCenter(projch->GetNbinsX())); | |
77566f2a | 7812 | projch->Draw(); |
7813 | fLandauGaus->Draw("same"); | |
7814 | } | |
7815 | ||
8ec526a4 | 7816 | if (projch->GetFunction("fLandauGaus")->GetParameter(1) > 0) { |
7817 | // Calcul of "real" coef | |
7818 | CalculChargeCoefMean(fCountDet[0],(Int_t) idect,kTRUE); | |
7819 | fChargeCoef[0] = projch->GetFunction("fLandauGaus")->GetParameter(1); | |
9f4780aa | 7820 | chargeCoefE0 = projch->GetFunction("fLandauGaus")->GetParError(1); |
8ec526a4 | 7821 | } |
77566f2a | 7822 | else { |
8ec526a4 | 7823 | // Calcul of "real" coef |
7824 | CalculChargeCoefMean(fCountDet[0],(Int_t) idect,kFALSE); | |
77566f2a | 7825 | fChargeCoef[0] = -TMath::Abs(fChargeCoef[3]); |
7826 | } | |
8ec526a4 | 7827 | |
7828 | if (fDebug == 2) { | |
7829 | AliInfo(Form("fChargeCoef[0]: %f",(Float_t) fChargeCoef[0])); | |
77566f2a | 7830 | AliInfo(Form("fChargeCoef[1]: %f",(Float_t) fChargeCoef[1])); |
7831 | } | |
7832 | ||
8ec526a4 | 7833 | if ((fDebug == 1) || |
7834 | (fDebug == 4)) { | |
7835 | if (fChargeCoef[0] > 0.0) { | |
9f4780aa | 7836 | fCoefCharge[0][idect]= fChargeCoef[0]; |
7837 | fCoefChargeE[0][idect]= chargeCoefE0; | |
7838 | fCoefCharge[1][idect]= fChargeCoef[1]; | |
7839 | fCoefChargeE[1][idect]= chargeCoefE1; | |
77566f2a | 7840 | } |
7841 | } | |
8ec526a4 | 7842 | fL3P0 = fLandauGaus->Integral(0.3*projch->GetMean(),3*projch->GetMean()); |
7843 | fG3P2 = fLandauGaus->GetParameter(2); | |
7844 | fL3P2 = fLandauGaus->GetParameter(4); | |
77566f2a | 7845 | |
8ec526a4 | 7846 | if (fDebug != 2) { |
7847 | delete fLandauGaus; | |
7848 | } | |
7849 | ||
77566f2a | 7850 | } |
8ec526a4 | 7851 | |
7852 | //_____________________________________________________________________________ | |
7853 | void AliTRDCalibra::FitBisCH(TH1* projch, Int_t idect) | |
77566f2a | 7854 | { |
7855 | // | |
7856 | // Fit methode for the gain factor more time consuming | |
7857 | // | |
77566f2a | 7858 | |
77566f2a | 7859 | // Setting fit range and start values |
7860 | Double_t fr[2]; | |
8ec526a4 | 7861 | //Double_t sv[4] = { l3P2, fChargeCoef[1], projch->Integral("width"), fG3P2 }; |
7862 | Double_t sv[4] = { fL3P2, fChargeCoef[1], fL3P0, fG3P2 }; | |
7863 | Double_t pllo[4] = { 0.001, 0.001, 0.001, 0.001 }; | |
7864 | Double_t plhi[4] = { 300.0, 300.0, 100000000.0, 300.0 }; | |
7865 | Double_t fp[4] = { 1.0, 1.0, 1.0, 1.0 }; | |
7866 | Double_t fpe[4] = { 1.0, 1.0, 1.0, 1.0 }; | |
7867 | fr[0] = 0.3 * projch->GetMean(); | |
7868 | fr[1] = 3.0 * projch->GetMean(); | |
7869 | fChargeCoef[2] = 0.0; | |
9f4780aa | 7870 | Double_t chargeCoefE2 = 0.0; |
8ec526a4 | 7871 | |
77566f2a | 7872 | Double_t chisqr; |
7873 | Int_t ndf; | |
8ec526a4 | 7874 | TF1 *fitsnr = LanGauFit(projch,&fr[0],&sv[0] |
7875 | ,&pllo[0],&plhi[0] | |
7876 | ,&fp[0],&fpe[0] | |
7877 | ,&chisqr,&ndf); | |
77566f2a | 7878 | |
8ec526a4 | 7879 | Double_t projchPeak; |
7880 | Double_t projchFWHM; | |
7881 | LanGauPro(fp,projchPeak,projchFWHM); | |
7882 | ||
7883 | if (fp[1] > 0) { | |
7884 | fChargeCoef[2] = fp[1]; | |
9f4780aa | 7885 | chargeCoefE2 = fpe[1]; |
7886 | //chargeCoefE2 = chisqr; | |
8ec526a4 | 7887 | } |
7888 | else { | |
7889 | fChargeCoef[2] = -TMath::Abs(fChargeCoef[3]); | |
7890 | } | |
77566f2a | 7891 | |
8ec526a4 | 7892 | if (fDebug == 2) { |
7893 | AliInfo(Form("fChargeCoef[2]: %f",(Float_t) fChargeCoef[2])); | |
77566f2a | 7894 | TCanvas *cpy = new TCanvas("cpy","cpy",50,50,600,800); |
7895 | cpy->cd(); | |
7896 | projch->Draw(); | |
7897 | fitsnr->Draw("same"); | |
7898 | } | |
8ec526a4 | 7899 | |
7900 | if ((fDebug == 1) || | |
7901 | (fDebug == 4)) { | |
7902 | if (fChargeCoef[2] > 0.0) { | |
9f4780aa | 7903 | fCoefCharge[2][idect]= fChargeCoef[2]; |
7904 | fCoefChargeE[2][idect]= chargeCoefE2; | |
77566f2a | 7905 | } |
7906 | } | |
8ec526a4 | 7907 | |
7908 | if (fDebug != 2) { | |
7909 | delete fitsnr; | |
7910 | } | |
7911 | ||
77566f2a | 7912 | } |
8ec526a4 | 7913 | |
7914 | //_____________________________________________________________________________ | |
77566f2a | 7915 | void AliTRDCalibra::NormierungCharge() |
7916 | { | |
7917 | // | |
8ec526a4 | 7918 | // Normalisation of the gain factor resulting for the fits |
77566f2a | 7919 | // |
7920 | ||
8ec526a4 | 7921 | // Calcul of the mean of the fit |
7922 | Double_t sum = 0.0; | |
8ec526a4 | 7923 | for (Int_t k = 0; k < (Int_t) fVectorFitCH->GetEntriesFast(); k++) { |
7924 | Int_t total = 0; | |
7925 | Int_t detector = ((AliTRDFitCHInfo *) fVectorFitCH->At(k))->GetDetector(); | |
7926 | Float_t *coef = ((AliTRDFitCHInfo *) fVectorFitCH->At(k))->GetCoef(); | |
7927 | if (GetChamber(detector) == 2) { | |
7928 | total = 1728; | |
7929 | } | |
7930 | if (GetChamber(detector) != 2) { | |
7931 | total = 2304; | |
7932 | } | |
7933 | for (Int_t j = 0; j < total; j++) { | |
7934 | if (coef[j] >= 0) { | |
7935 | sum += coef[j]; | |
77566f2a | 7936 | } |
7937 | } | |
7938 | } | |
8ec526a4 | 7939 | |
7940 | if (sum > 0) { | |
7941 | fScaleFitFactor = fScaleFitFactor / sum; | |
7942 | } | |
7943 | else { | |
7944 | fScaleFitFactor = 1.0; | |
7945 | } | |
7946 | ||
8ec526a4 | 7947 | if ((fDebug == 3) || |
7948 | (fDebug == 4)) { | |
9f4780aa | 7949 | if ((fCoefChargeDB[0]->GetEntries() > 0.0) && |
7950 | (fCoefChargeDB[0]->GetSumOfWeights() > 0.0)) { | |
7951 | fCoefChargeDB[0]->Scale(fCoefChargeDB[0]->GetEntries() / fCoefChargeDB[0]->GetSumOfWeights()); | |
7952 | } | |
8ec526a4 | 7953 | if ((fMeanChargeOn) && |
7954 | (fCoefChargeDB[1]->GetEntries() > 0.0) && | |
7955 | (fCoefChargeDB[1]->GetSumOfWeights() > 0.0)) { | |
7956 | fCoefChargeDB[1]->Scale(fCoefChargeDB[1]->GetEntries() / fCoefChargeDB[1]->GetSumOfWeights()); | |
7957 | } | |
7958 | if ((fFitChargeBisOn) && | |
7959 | (fCoefChargeDB[2]->GetEntries() > 0.0) && | |
7960 | (fCoefChargeDB[2]->GetSumOfWeights() > 0.0)) { | |
7961 | fCoefChargeDB[2]->Scale(fCoefChargeDB[2]->GetEntries() / fCoefChargeDB[2]->GetSumOfWeights()); | |
7962 | } | |
77566f2a | 7963 | } |
77566f2a | 7964 | |
7965 | } | |
7966 | ||
8ec526a4 | 7967 | //_____________________________________________________________________________ |
7968 | TH1I *AliTRDCalibra::ReBin(TH1I *hist) const | |
77566f2a | 7969 | { |
7970 | // | |
7971 | // Rebin of the 1D histo for the gain calibration if needed. | |
7972 | // you have to choose fRebin, divider of fNumberBinCharge | |
7973 | // | |
7974 | ||
8ec526a4 | 7975 | TAxis *xhist = hist->GetXaxis(); |
7976 | TH1I *rehist = new TH1I("projrebin","",(Int_t) xhist->GetNbins()/fRebin | |
7977 | ,xhist->GetBinLowEdge(1) | |
7978 | ,xhist->GetBinUpEdge(xhist->GetNbins())); | |
7979 | ||
7980 | AliInfo(Form("fRebin: %d",fRebin)); | |
77566f2a | 7981 | Int_t i = 1; |
8ec526a4 | 7982 | for (Int_t k = 1; k <= (Int_t) xhist->GetNbins()/fRebin; k++) { |
77566f2a | 7983 | Double_t sum = 0.0; |
8ec526a4 | 7984 | for (Int_t ji = i; ji < i+fRebin; ji++) { |
77566f2a | 7985 | sum += hist->GetBinContent(ji); |
7986 | } | |
8ec526a4 | 7987 | sum = sum / fRebin; |
77566f2a | 7988 | rehist->SetBinContent(k,sum); |
8ec526a4 | 7989 | i += fRebin; |
77566f2a | 7990 | } |
8ec526a4 | 7991 | |
7992 | if (fDebug == 2) { | |
77566f2a | 7993 | TCanvas *crebin = new TCanvas("crebin","",50,50,600,800); |
7994 | crebin->cd(); | |
7995 | rehist->Draw(); | |
7996 | } | |
8ec526a4 | 7997 | |
77566f2a | 7998 | return rehist; |
7999 | ||
8000 | } | |
8001 | ||
8ec526a4 | 8002 | //_____________________________________________________________________________ |
8003 | TH1F *AliTRDCalibra::ReBin(TH1F *hist) const | |
77566f2a | 8004 | { |
8005 | // | |
8006 | // Rebin of the 1D histo for the gain calibration if needed | |
8007 | // you have to choose fRebin divider of fNumberBinCharge | |
8008 | // | |
8009 | ||
8ec526a4 | 8010 | TAxis *xhist = hist->GetXaxis(); |
8011 | TH1F *rehist = new TH1F("projrebin","",(Int_t) xhist->GetNbins()/fRebin | |
8012 | ,xhist->GetBinLowEdge(1) | |
8013 | ,xhist->GetBinUpEdge(xhist->GetNbins())); | |
8014 | ||
8015 | AliInfo(Form("fRebin: %d",fRebin)); | |
77566f2a | 8016 | Int_t i = 1; |
8ec526a4 | 8017 | for (Int_t k = 1; k <= (Int_t) xhist->GetNbins()/fRebin; k++) { |
77566f2a | 8018 | Double_t sum = 0.0; |
8ec526a4 | 8019 | for (Int_t ji = i; ji < i+fRebin; ji++) { |
77566f2a | 8020 | sum += hist->GetBinContent(ji); |
8021 | } | |
8022 | sum = sum/fRebin; | |
8023 | rehist->SetBinContent(k,sum); | |
8ec526a4 | 8024 | i += fRebin; |
77566f2a | 8025 | } |
8ec526a4 | 8026 | |
8027 | if (fDebug == 2) { | |
77566f2a | 8028 | TCanvas *crebin = new TCanvas("crebin","",50,50,600,800); |
8029 | crebin->cd(); | |
8030 | rehist->Draw(); | |
8031 | } | |
8032 | ||
8033 | return rehist; | |
8034 | ||
8035 | } | |
8ec526a4 | 8036 | |
8037 | //_____________________________________________________________________________ | |
77566f2a | 8038 | TH1F *AliTRDCalibra::CorrectTheError(TGraphErrors *hist) |
8039 | { | |
8040 | // | |
8041 | // In the case of the vectors method the trees contains TGraphErrors for PH and PRF | |
8042 | // to be able to add them after | |
8043 | // We convert it to a TH1F to be able to applied the same fit function method | |
8044 | // After having called this function you can not add the statistics anymore | |
8045 | // | |
8046 | ||
8ec526a4 | 8047 | TH1F *rehist = 0x0; |
77566f2a | 8048 | |
8ec526a4 | 8049 | Int_t nbins = hist->GetN(); |
8050 | Double_t *x = hist->GetX(); | |
77566f2a | 8051 | Double_t *entries = hist->GetEX(); |
8ec526a4 | 8052 | Double_t *mean = hist->GetY(); |
8053 | Double_t *square = hist->GetEY(); | |
8054 | fEntriesCurrent = 0; | |
77566f2a | 8055 | |
8ec526a4 | 8056 | if (nbins < 2) { |
8057 | return rehist; | |
8058 | } | |
77566f2a | 8059 | |
8ec526a4 | 8060 | Double_t step = x[1] - x[0]; |
8061 | Double_t minvalue = x[0] - step/2; | |
8062 | Double_t maxvalue = x[(nbins-1)] + step/2; | |
77566f2a | 8063 | |
8064 | rehist = new TH1F("projcorrecterror","",nbins,minvalue,maxvalue); | |
8065 | ||
8ec526a4 | 8066 | for (Int_t k = 0; k < nbins; k++) { |
77566f2a | 8067 | rehist->SetBinContent(k+1,mean[k]); |
8ec526a4 | 8068 | if (entries[k] > 0.0) { |
77566f2a | 8069 | fEntriesCurrent += (Int_t) entries[k]; |
8ec526a4 | 8070 | Double_t d = TMath::Abs(square[k] - (mean[k]*mean[k])); |
77566f2a | 8071 | rehist->SetBinError(k+1,TMath::Sqrt(d/entries[k])); |
8072 | } | |
8ec526a4 | 8073 | else { |
8074 | rehist->SetBinError(k+1,0.0); | |
8075 | } | |
77566f2a | 8076 | } |
8ec526a4 | 8077 | |
8078 | return rehist; | |
77566f2a | 8079 | |
8080 | } | |
8ec526a4 | 8081 | |
8082 | //_____________________________________________________________________________ | |
8083 | TGraphErrors *AliTRDCalibra::AddProfiles(TGraphErrors *hist1 | |
8084 | , TGraphErrors *hist2) const | |
77566f2a | 8085 | { |
8086 | // | |
8087 | // In the case of the vectors method we use TGraphErrors for PH and PRF | |
8088 | // to be able to add the them after | |
8089 | // Here we add the TGraphErrors | |
8ec526a4 | 8090 | // |
77566f2a | 8091 | |
8ec526a4 | 8092 | // First TGraphErrors |
8093 | Int_t nbins1 = hist1->GetN(); | |
8094 | Double_t *x1 = hist1->GetX(); | |
8095 | Double_t *ex1 = hist1->GetEX(); | |
8096 | Double_t *y1 = hist1->GetY(); | |
8097 | Double_t *ey1 = hist1->GetEY(); | |
77566f2a | 8098 | |
8ec526a4 | 8099 | TGraphErrors *rehist = new TGraphErrors(nbins1); |
77566f2a | 8100 | |
8ec526a4 | 8101 | // Second TGraphErrors |
8102 | Double_t *ex2 = hist2->GetEX(); | |
8103 | Double_t *y2 = hist2->GetY(); | |
8104 | Double_t *ey2 = hist2->GetEY(); | |
77566f2a | 8105 | |
8ec526a4 | 8106 | // Define the Variables for the new TGraphErrors |
8107 | Double_t x; | |
8108 | Double_t ex; | |
8109 | Double_t y; | |
8110 | Double_t ey; | |
8111 | ||
8112 | for (Int_t k = 0; k < nbins1; k++) { | |
8113 | Double_t nentries = 0.0; | |
8114 | x = x1[k]; | |
8115 | y = 0.0; | |
8116 | ey = 0.0; | |
8117 | ex = 0.0; | |
8118 | if ((ex2[k] == 0.0) && | |
8119 | (ex1[k] == 0.0)) { | |
8120 | nentries = 0.0; | |
8121 | } | |
8122 | if ((ex2[k] == 0.0) && | |
8123 | (ex1[k] > 0.0)) { | |
8124 | nentries = ex1[k]; | |
8125 | y = y1[k]; | |
8126 | ey = ey1[k]; | |
8127 | ex = ex1[k]; | |
8128 | } | |
8129 | if ((ex2[k] > 0.0) && | |
8130 | (ex1[k] == 0.0)) { | |
8131 | nentries = ex2[k]; | |
8132 | y = y2[k]; | |
8133 | ey = ey2[k]; | |
8134 | ex = ex2[k]; | |
8135 | } | |
8136 | if ((ex2[k] > 0.0) && | |
8137 | (ex1[k] > 0.0)) { | |
8138 | nentries = ex1[k] + ex2[k]; | |
8139 | y = ( y1[k]*ex1[k]+ y2[k]*ex2[k]) / nentries; | |
8140 | ey = (ey1[k]*ex1[k]+ey2[k]*ex2[k]) / nentries; | |
77566f2a | 8141 | ex = nentries; |
8142 | } | |
8143 | rehist->SetPoint(k,x,y); | |
8144 | rehist->SetPointError(k,ex,ey); | |
77566f2a | 8145 | } |
8146 | ||
77566f2a | 8147 | return rehist; |
77566f2a | 8148 | |
8ec526a4 | 8149 | } |
77566f2a | 8150 | |
8ec526a4 | 8151 | // |
8152 | //____________Some basic geometry function_____________________________________ | |
8153 | // | |
77566f2a | 8154 | |
8155 | //_____________________________________________________________________________ | |
8156 | Int_t AliTRDCalibra::GetPlane(Int_t d) const | |
8157 | { | |
8158 | // | |
8ec526a4 | 8159 | // Reconstruct the plane number from the detector number |
77566f2a | 8160 | // |
8161 | ||
8162 | return ((Int_t) (d % 6)); | |
8163 | ||
8164 | } | |
8165 | ||
8166 | //_____________________________________________________________________________ | |
8167 | Int_t AliTRDCalibra::GetChamber(Int_t d) const | |
8168 | { | |
8169 | // | |
8ec526a4 | 8170 | // Reconstruct the chamber number from the detector number |
77566f2a | 8171 | // |
8172 | Int_t fgkNplan = 6; | |
8173 | ||
8174 | return ((Int_t) (d % 30) / fgkNplan); | |
8175 | ||
8176 | } | |
8177 | ||
8178 | //_____________________________________________________________________________ | |
8179 | Int_t AliTRDCalibra::GetSector(Int_t d) const | |
8180 | { | |
8181 | // | |
8ec526a4 | 8182 | // Reconstruct the sector number from the detector number |
77566f2a | 8183 | // |
8184 | Int_t fg = 30; | |
8185 | ||
8186 | return ((Int_t) (d / fg)); | |
8187 | ||
8188 | } | |
8189 | ||
8ec526a4 | 8190 | // |
8191 | //____________Fill and Init tree Gain, PRF, Vdrift and T0______________________ | |
8192 | // | |
77566f2a | 8193 | |
8194 | //_____________________________________________________________________________ | |
8ec526a4 | 8195 | void AliTRDCalibra::InitTreePRF() |
77566f2a | 8196 | { |
8197 | // | |
8198 | // Init the tree where the coefficients from the fit methods can be stored | |
8199 | // | |
8ec526a4 | 8200 | |
8201 | gDirectory = gROOT; | |
8202 | fPRFPad = new Float_t[2304]; | |
8203 | fPRF = new TTree("PRF","PRF"); | |
77566f2a | 8204 | fPRF->Branch("detector",&fPRFDetector,"detector/I"); |
8ec526a4 | 8205 | fPRF->Branch("width" ,fPRFPad ,"width[2304]/F"); |
8206 | ||
8207 | // Set to default value for the plane 0 supposed to be the first one | |
8208 | for (Int_t k = 0; k < 2304; k++) { | |
77566f2a | 8209 | fPRFPad[k] = 0.515; |
8210 | } | |
8211 | fPRFDetector = -1; | |
8212 | ||
77566f2a | 8213 | } |
8ec526a4 | 8214 | |
77566f2a | 8215 | //_____________________________________________________________________________ |
8ec526a4 | 8216 | void AliTRDCalibra::FillTreePRF(Int_t countdet) |
77566f2a | 8217 | { |
8218 | // | |
8219 | // Fill the tree with the sigma of the pad response function for the detector countdet | |
8220 | // | |
8221 | ||
8222 | Int_t numberofgroup = 0; | |
8223 | fPRFDetector = countdet; | |
8224 | fPRF->Fill(); | |
8ec526a4 | 8225 | |
8226 | if (GetChamber((Int_t)(countdet+1)) == 2) { | |
8227 | numberofgroup = 1728; | |
8228 | } | |
8229 | else { | |
8230 | numberofgroup = 2304; | |
8231 | } | |
8232 | ||
8233 | // Reset to default value for the next | |
8234 | for (Int_t k = 0; k < numberofgroup; k++) { | |
8235 | if (GetPlane((Int_t) (countdet+1)) == 0) { | |
8236 | fPRFPad[k] = 0.515; | |
8237 | } | |
8238 | if (GetPlane((Int_t) (countdet+1)) == 1) { | |
8239 | fPRFPad[k] = 0.502; | |
8240 | } | |
8241 | if (GetPlane((Int_t) (countdet+1)) == 2) { | |
8242 | fPRFPad[k] = 0.491; | |
8243 | } | |
8244 | if (GetPlane((Int_t) (countdet+1)) == 3) { | |
8245 | fPRFPad[k] = 0.481; | |
8246 | } | |
8247 | if (GetPlane((Int_t) (countdet+1)) == 4) { | |
8248 | fPRFPad[k] = 0.471; | |
8249 | } | |
8250 | if (GetPlane((Int_t) (countdet+1)) == 5) { | |
8251 | fPRFPad[k] = 0.463; | |
8252 | } | |
77566f2a | 8253 | } |
8ec526a4 | 8254 | |
77566f2a | 8255 | fPRFDetector = -1; |
8256 | ||
8257 | } | |
8258 | ||
8259 | //_____________________________________________________________________________ | |
8260 | void AliTRDCalibra::ConvertVectorFitCHTree() | |
8261 | { | |
8262 | // | |
8ec526a4 | 8263 | // Convert the vector stuff to a tree of 1D histos if the user |
8264 | // want to write it after the fill functions | |
77566f2a | 8265 | // |
8ec526a4 | 8266 | |
8267 | Int_t detector = -1; | |
8268 | Int_t numberofgroup = 1; | |
77566f2a | 8269 | Float_t gainPad[2304]; |
8ec526a4 | 8270 | |
77566f2a | 8271 | fGain = new TTree("Gain","Gain"); |
8272 | fGain->Branch("detector",&detector,"detector/I"); | |
8ec526a4 | 8273 | fGain->Branch("gainPad" ,gainPad ,"gainPad[2304]/F"); |
8274 | ||
8275 | Int_t loop = (Int_t) fVectorFitCH->GetEntriesFast(); | |
8276 | for (Int_t k = 0; k < loop; k++) { | |
8277 | detector = ((AliTRDFitCHInfo *) fVectorFitCH->At(k))->GetDetector(); | |
8278 | if (GetChamber((Int_t) ((AliTRDFitCHInfo *) fVectorFitCH->At(k))->GetDetector()) == 2) { | |
8279 | numberofgroup = 1728; | |
8280 | } | |
8281 | else { | |
8282 | numberofgroup = 2304; | |
8283 | } | |
8284 | for (Int_t i = 0; i < numberofgroup; i++) { | |
8285 | if (((AliTRDFitCHInfo *) fVectorFitCH->At(k))->GetCoef()[i] >= 0) { | |
8286 | gainPad[i] = ((AliTRDFitCHInfo *) fVectorFitCH->At(k))->GetCoef()[i] * fScaleFitFactor; | |
8287 | } | |
77566f2a | 8288 | else { |
8ec526a4 | 8289 | gainPad[i] = (Float_t) ((AliTRDFitCHInfo *) fVectorFitCH->At(k))->GetCoef()[i]; |
77566f2a | 8290 | } |
8291 | } | |
8292 | fGain->Fill(); | |
8293 | } | |
77566f2a | 8294 | |
8295 | } | |
8ec526a4 | 8296 | |
77566f2a | 8297 | //_____________________________________________________________________________ |
8ec526a4 | 8298 | void AliTRDCalibra::FillTreeVdrift(Int_t countdet) |
77566f2a | 8299 | { |
8300 | // | |
8301 | // Fill the tree with the drift velocities for the detector countdet | |
8302 | // | |
8ec526a4 | 8303 | |
77566f2a | 8304 | Int_t numberofgroup = 0; |
8305 | fVdriftDetector = countdet; | |
9f4780aa | 8306 | |
77566f2a | 8307 | fVdrift->Fill(); |
8ec526a4 | 8308 | if (GetChamber((Int_t)(countdet+1)) == 2) { |
8309 | numberofgroup = 1728; | |
8310 | } | |
8311 | else { | |
8312 | numberofgroup = 2304; | |
8313 | } | |
8314 | // Reset to default value the gain coef | |
8315 | for (Int_t k = 0; k < numberofgroup; k++) { | |
77566f2a | 8316 | fVdriftPad[k] = -1.5; |
8317 | } | |
8318 | fVdriftDetector = -1; | |
8319 | ||
8320 | } | |
8321 | ||
8322 | //_____________________________________________________________________________ | |
8ec526a4 | 8323 | void AliTRDCalibra::InitTreePH() |
77566f2a | 8324 | { |
8325 | // | |
8326 | // Init the tree where the coefficients from the fit methods can be stored | |
8327 | // | |
8328 | ||
8ec526a4 | 8329 | gDirectory = gROOT; |
77566f2a | 8330 | fVdriftPad = new Float_t[2304]; |
8ec526a4 | 8331 | fVdrift = new TTree("Vdrift","Vdrift"); |
77566f2a | 8332 | fVdrift->Branch("detector",&fVdriftDetector,"detector/I"); |
8ec526a4 | 8333 | fVdrift->Branch("vdrift" ,fVdriftPad ,"vdrift[2304]/F"); |
8334 | // Set to default value for the plane 0 supposed to be the first one | |
8335 | for (Int_t k = 0; k < 2304; k++) { | |
77566f2a | 8336 | fVdriftPad[k] = -1.5; |
8337 | } | |
8338 | fVdriftDetector = -1; | |
8339 | ||
8340 | } | |
8ec526a4 | 8341 | |
77566f2a | 8342 | //_____________________________________________________________________________ |
8ec526a4 | 8343 | void AliTRDCalibra::FillTreeT0(Int_t countdet) |
77566f2a | 8344 | { |
8345 | // | |
8346 | // Fill the tree with the t0 value for the detector countdet | |
8347 | // | |
8ec526a4 | 8348 | |
77566f2a | 8349 | Int_t numberofgroup = 0; |
8ec526a4 | 8350 | |
77566f2a | 8351 | fT0Detector = countdet; |
9f4780aa | 8352 | |
77566f2a | 8353 | fT0->Fill(); |
8ec526a4 | 8354 | if (GetChamber((Int_t) (countdet+1)) == 2) { |
8355 | numberofgroup = 1728; | |
8356 | } | |
8357 | else { | |
8358 | numberofgroup = 2304; | |
8359 | } | |
9f4780aa | 8360 | // Reset to default value |
8ec526a4 | 8361 | for (Int_t k = 0; k < numberofgroup; k++) { |
77566f2a | 8362 | fT0Pad[k] = 0.0; |
8363 | } | |
8364 | fT0Detector = -1; | |
8365 | ||
8366 | } | |
8367 | ||
8368 | //_____________________________________________________________________________ | |
8ec526a4 | 8369 | void AliTRDCalibra::InitTreeT0() |
77566f2a | 8370 | { |
8371 | // | |
8372 | // Init the tree where the coefficients from the fit methods can be stored | |
8373 | // | |
8374 | ||
8ec526a4 | 8375 | gDirectory = gROOT; |
77566f2a | 8376 | fT0Pad = new Float_t[2304]; |
8377 | fT0 = new TTree("T0","T0"); | |
8378 | fT0->Branch("detector",&fT0Detector,"detector/I"); | |
8379 | fT0->Branch("t0",fT0Pad,"t0[2304]/F"); | |
8380 | //Set to default value for the plane 0 supposed to be the first one | |
8381 | for(Int_t k = 0; k < 2304; k++){ | |
8382 | fT0Pad[k] = 0.0; | |
8383 | } | |
8384 | fT0Detector = -1; | |
8385 | ||
8386 | } | |
8387 | ||
8ec526a4 | 8388 | // |
8389 | //____________Private Functions________________________________________________ | |
8390 | // | |
77566f2a | 8391 | |
8ec526a4 | 8392 | //_____________________________________________________________________________ |
8393 | Double_t AliTRDCalibra::PH(Double_t *x, Double_t *par) | |
77566f2a | 8394 | { |
8395 | // | |
8396 | // Function for the fit | |
8397 | // | |
8398 | ||
8ec526a4 | 8399 | //TF1 *fAsymmGauss = new TF1("fAsymmGauss",AsymmGauss,0,4,6); |
77566f2a | 8400 | |
8401 | //PARAMETERS FOR FIT PH | |
8402 | // PASAv.4 | |
8ec526a4 | 8403 | //fAsymmGauss->SetParameter(0,0.113755); |
8404 | //fAsymmGauss->SetParameter(1,0.350706); | |
8405 | //fAsymmGauss->SetParameter(2,0.0604244); | |
8406 | //fAsymmGauss->SetParameter(3,7.65596); | |
8407 | //fAsymmGauss->SetParameter(4,1.00124); | |
8408 | //fAsymmGauss->SetParameter(5,0.870597); // No tail cancelation | |
77566f2a | 8409 | |
8410 | Double_t xx = x[0]; | |
8411 | ||
8ec526a4 | 8412 | if (xx < par[1]) { |
8413 | return par[5]; | |
8414 | } | |
8415 | ||
8416 | Double_t dx = 0.005; | |
8417 | Double_t xs = par[1]; | |
8418 | Double_t ss = 0.0; | |
8419 | Double_t paras[2] = { 0.0, 0.0 }; | |
77566f2a | 8420 | |
77566f2a | 8421 | while (xs < xx) { |
8ec526a4 | 8422 | if ((xs >= par[1]) && |
8423 | (xs < (par[1]+par[2]))) { | |
77566f2a | 8424 | //fAsymmGauss->SetParameter(0,par[0]); |
8425 | //fAsymmGauss->SetParameter(1,xs); | |
8426 | //ss += fAsymmGauss->Eval(xx); | |
8427 | paras[0] = par[0]; | |
8428 | paras[1] = xs; | |
8429 | ss += AsymmGauss(&xx,paras); | |
8430 | } | |
8ec526a4 | 8431 | if ((xs >= (par[1]+par[2])) && |
8432 | (xs < (par[1]+par[2]+par[3]))) { | |
77566f2a | 8433 | //fAsymmGauss->SetParameter(0,par[0]*par[4]); |
8434 | //fAsymmGauss->SetParameter(1,xs); | |
8435 | //ss += fAsymmGauss->Eval(xx); | |
8436 | paras[0] = par[0]*par[4]; | |
8437 | paras[1] = xs; | |
8438 | ss += AsymmGauss(&xx,paras); | |
8439 | } | |
8440 | xs += dx; | |
8441 | } | |
8442 | ||
8ec526a4 | 8443 | return ss + par[5]; |
77566f2a | 8444 | |
8445 | } | |
8446 | ||
8ec526a4 | 8447 | //_____________________________________________________________________________ |
8448 | Double_t AliTRDCalibra::AsymmGauss(Double_t *x, Double_t *par) | |
77566f2a | 8449 | { |
8450 | // | |
8451 | // Function for the fit | |
8452 | // | |
8453 | ||
8454 | //par[0] = normalization | |
8455 | //par[1] = mean | |
8456 | //par[2] = sigma | |
8457 | //norm0 = 1 | |
8458 | //par[3] = lambda0 | |
8459 | //par[4] = norm1 | |
8460 | //par[5] = lambda1 | |
77566f2a | 8461 | |
8462 | Double_t par1save = par[1]; | |
8463 | //Double_t par2save = par[2]; | |
8464 | Double_t par2save = 0.0604244; | |
8465 | //Double_t par3save = par[3]; | |
8466 | Double_t par3save = 7.65596; | |
8467 | //Double_t par5save = par[5]; | |
8468 | Double_t par5save = 0.870597; | |
8ec526a4 | 8469 | Double_t dx = x[0] - par1save; |
77566f2a | 8470 | |
8ec526a4 | 8471 | Double_t sigma2 = par2save*par2save; |
8472 | Double_t sqrt2 = TMath::Sqrt(2.0); | |
8473 | Double_t exp1 = par3save * TMath::Exp(-par3save * (dx - 0.5 * par3save * sigma2)) | |
8474 | * (1.0 - TMath::Erf((par3save * sigma2 - dx) / (sqrt2 * par2save))); | |
8475 | Double_t exp2 = par5save * TMath::Exp(-par5save * (dx - 0.5 * par5save * sigma2)) | |
8476 | * (1.0 - TMath::Erf((par5save * sigma2 - dx) / (sqrt2 * par2save))); | |
77566f2a | 8477 | |
8478 | //return par[0]*(exp1+par[4]*exp2); | |
8ec526a4 | 8479 | return par[0] * (exp1 + 1.00124 * exp2); |
77566f2a | 8480 | |
8ec526a4 | 8481 | } |
77566f2a | 8482 | |
8ec526a4 | 8483 | //_____________________________________________________________________________ |
8484 | Double_t AliTRDCalibra::FuncLandauGaus(Double_t *x, Double_t *par) | |
77566f2a | 8485 | { |
8486 | // | |
8ec526a4 | 8487 | // Sum Landau + Gaus with identical mean |
77566f2a | 8488 | // |
8489 | ||
8ec526a4 | 8490 | Double_t valLandau = par[0] * TMath::Landau(x[0],par[1],par[2]); |
8491 | //Double_t valGaus = par[3] * TMath::Gaus(x[0],par[4],par[5]); | |
8492 | Double_t valGaus = par[3] * TMath::Gaus(x[0],par[1],par[4]); | |
8493 | Double_t val = valLandau + valGaus; | |
77566f2a | 8494 | |
77566f2a | 8495 | return val; |
8ec526a4 | 8496 | |
77566f2a | 8497 | } |
8ec526a4 | 8498 | |
8499 | //_____________________________________________________________________________ | |
8500 | Double_t AliTRDCalibra::LanGauFun(Double_t *x, Double_t *par) | |
77566f2a | 8501 | { |
8502 | // | |
8503 | // Function for the fit | |
8504 | // | |
8ec526a4 | 8505 | // Fit parameters: |
8506 | // par[0]=Width (scale) parameter of Landau density | |
8507 | // par[1]=Most Probable (MP, location) parameter of Landau density | |
8508 | // par[2]=Total area (integral -inf to inf, normalization constant) | |
8509 | // par[3]=Width (sigma) of convoluted Gaussian function | |
77566f2a | 8510 | // |
8ec526a4 | 8511 | // In the Landau distribution (represented by the CERNLIB approximation), |
8512 | // the maximum is located at x=-0.22278298 with the location parameter=0. | |
8513 | // This shift is corrected within this function, so that the actual | |
8514 | // maximum is identical to the MP parameter. | |
8515 | // | |
8516 | ||
77566f2a | 8517 | // Numeric constants |
8518 | Double_t invsq2pi = 0.3989422804014; // (2 pi)^(-1/2) | |
8519 | Double_t mpshift = -0.22278298; // Landau maximum location | |
8520 | ||
8521 | // Control constants | |
8ec526a4 | 8522 | Double_t np = 100.0; // Number of convolution steps |
8523 | Double_t sc = 5.0; // Convolution extends to +-sc Gaussian sigmas | |
77566f2a | 8524 | |
8525 | // Variables | |
8526 | Double_t xx; | |
8527 | Double_t mpc; | |
8528 | Double_t fland; | |
8529 | Double_t sum = 0.0; | |
8ec526a4 | 8530 | Double_t xlow; |
8531 | Double_t xupp; | |
77566f2a | 8532 | Double_t step; |
8533 | Double_t i; | |
8534 | ||
77566f2a | 8535 | // MP shift correction |
8536 | mpc = par[1] - mpshift * par[0]; | |
8ec526a4 | 8537 | |
77566f2a | 8538 | // Range of convolution integral |
8539 | xlow = x[0] - sc * par[3]; | |
8540 | xupp = x[0] + sc * par[3]; | |
8541 | ||
8ec526a4 | 8542 | step = (xupp - xlow) / np; |
8543 | ||
77566f2a | 8544 | // Convolution integral of Landau and Gaussian by sum |
8ec526a4 | 8545 | for (i = 1.0; i <= np/2; i++) { |
8546 | ||
8547 | xx = xlow + (i-.5) * step; | |
77566f2a | 8548 | fland = TMath::Landau(xx,mpc,par[0]) / par[0]; |
8ec526a4 | 8549 | sum += fland * TMath::Gaus(x[0],xx,par[3]); |
77566f2a | 8550 | |
8ec526a4 | 8551 | xx = xupp - (i-.5) * step; |
77566f2a | 8552 | fland = TMath::Landau(xx,mpc,par[0]) / par[0]; |
8ec526a4 | 8553 | sum += fland * TMath::Gaus(x[0],xx,par[3]); |
8554 | ||
77566f2a | 8555 | } |
8ec526a4 | 8556 | |
77566f2a | 8557 | return (par[2] * step * sum * invsq2pi / par[3]); |
8ec526a4 | 8558 | |
77566f2a | 8559 | } |
8ec526a4 | 8560 | |
8561 | //_____________________________________________________________________________ | |
8562 | TF1 *AliTRDCalibra::LanGauFit(TH1 *his, Double_t *fitrange, Double_t *startvalues | |
8563 | , Double_t *parlimitslo, Double_t *parlimitshi | |
8564 | , Double_t *fitparams, Double_t *fiterrors | |
8565 | , Double_t *chiSqr, Int_t *ndf) | |
77566f2a | 8566 | { |
8567 | // | |
8568 | // Function for the fit | |
8569 | // | |
8570 | ||
77566f2a | 8571 | Int_t i; |
8ec526a4 | 8572 | Char_t funname[100]; |
77566f2a | 8573 | |
8ec526a4 | 8574 | AliInfo(Form(funname,"Fitfcn_%s",his->GetName())); |
77566f2a | 8575 | |
8ec526a4 | 8576 | TF1 *ffitold = (TF1 *) gROOT->GetListOfFunctions()->FindObject(funname); |
8577 | if (ffitold) { | |
8578 | delete ffitold; | |
8579 | } | |
8580 | ||
8581 | TF1 *ffit = new TF1(funname,LanGauFun,fitrange[0],fitrange[1],4); | |
77566f2a | 8582 | ffit->SetParameters(startvalues); |
8583 | ffit->SetParNames("Width","MP","Area","GSigma"); | |
8584 | ||
8ec526a4 | 8585 | for (i = 0; i < 4; i++) { |
8586 | ffit->SetParLimits(i,parlimitslo[i],parlimitshi[i]); | |
77566f2a | 8587 | } |
8588 | ||
8ec526a4 | 8589 | his->Fit(funname,"RB0"); // Fit within specified range, use ParLimits, do not plot |
77566f2a | 8590 | |
8ec526a4 | 8591 | ffit->GetParameters(fitparams); // Obtain fit parameters |
8592 | for (i = 0; i < 4; i++) { | |
8593 | fiterrors[i] = ffit->GetParError(i); // Obtain fit parameter errors | |
8594 | } | |
8595 | chiSqr[0] = ffit->GetChisquare(); // Obtain chi^2 | |
8596 | ndf[0] = ffit->GetNDF(); // Obtain ndf | |
77566f2a | 8597 | |
8ec526a4 | 8598 | return (ffit); // Return fit function |
77566f2a | 8599 | |
8600 | } | |
8ec526a4 | 8601 | |
8602 | //_____________________________________________________________________________ | |
8603 | Int_t AliTRDCalibra::LanGauPro(Double_t *params, Double_t &maxx, Double_t &fwhm) | |
8604 | { | |
77566f2a | 8605 | // |
8606 | // Function for the fit | |
8607 | // | |
8ec526a4 | 8608 | |
8609 | Double_t p; | |
8610 | Double_t x; | |
8611 | Double_t fy; | |
8612 | Double_t fxr; | |
8613 | Double_t fxl; | |
77566f2a | 8614 | Double_t step; |
8ec526a4 | 8615 | Double_t l; |
8616 | Double_t lold; | |
8617 | ||
8618 | Int_t i = 0; | |
8619 | Int_t maxcalls = 10000; | |
77566f2a | 8620 | |
8621 | // Search for maximum | |
8ec526a4 | 8622 | p = params[1] - 0.1 * params[0]; |
77566f2a | 8623 | step = 0.05 * params[0]; |
8624 | lold = -2.0; | |
8625 | l = -1.0; | |
8626 | ||
8ec526a4 | 8627 | while ((l != lold) && (i < maxcalls)) { |
77566f2a | 8628 | i++; |
77566f2a | 8629 | lold = l; |
8ec526a4 | 8630 | x = p + step; |
8631 | l = LanGauFun(&x,params); | |
8632 | if (l < lold) { | |
8633 | step = -step / 10.0; | |
8634 | } | |
77566f2a | 8635 | p += step; |
8636 | } | |
8637 | ||
8ec526a4 | 8638 | if (i == maxcalls) { |
77566f2a | 8639 | return (-1); |
8ec526a4 | 8640 | } |
77566f2a | 8641 | maxx = x; |
8ec526a4 | 8642 | fy = l / 2.0; |
77566f2a | 8643 | |
8ec526a4 | 8644 | // Search for right x location of fy |
8645 | p = maxx + params[0]; | |
77566f2a | 8646 | step = params[0]; |
8647 | lold = -2.0; | |
8648 | l = -1e300; | |
8649 | i = 0; | |
8650 | ||
8ec526a4 | 8651 | while ( (l != lold) && (i < maxcalls) ) { |
77566f2a | 8652 | i++; |
8653 | ||
8654 | lold = l; | |
8655 | x = p + step; | |
8ec526a4 | 8656 | l = TMath::Abs(LanGauFun(&x,params) - fy); |
77566f2a | 8657 | |
8658 | if (l > lold) | |
8659 | step = -step/10; | |
8660 | ||
8661 | p += step; | |
8662 | } | |
8663 | ||
8ec526a4 | 8664 | if (i == maxcalls) |
77566f2a | 8665 | return (-2); |
8666 | ||
8667 | fxr = x; | |
8668 | ||
8669 | ||
8670 | // Search for left x location of fy | |
8671 | ||
8672 | p = maxx - 0.5 * params[0]; | |
8673 | step = -params[0]; | |
8674 | lold = -2.0; | |
8ec526a4 | 8675 | l = -1.0e300; |
77566f2a | 8676 | i = 0; |
8677 | ||
8ec526a4 | 8678 | while ((l != lold) && (i < maxcalls)) { |
77566f2a | 8679 | i++; |
77566f2a | 8680 | lold = l; |
8ec526a4 | 8681 | x = p + step; |
8682 | l = TMath::Abs(LanGauFun(&x,params) - fy); | |
8683 | if (l > lold) { | |
8684 | step = -step / 10.0; | |
8685 | } | |
77566f2a | 8686 | p += step; |
8687 | } | |
8688 | ||
8ec526a4 | 8689 | if (i == maxcalls) { |
8690 | return (-3); | |
8691 | } | |
77566f2a | 8692 | |
8ec526a4 | 8693 | fxl = x; |
8694 | fwhm = fxr - fxl; | |
77566f2a | 8695 | |
8ec526a4 | 8696 | return (0); |
77566f2a | 8697 | |
8ec526a4 | 8698 | } |