55a288e5 |
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$ */ |
17 | |
18 | ///////////////////////////////////////////////////////////////////////////////// |
19 | // |
20 | // AliTRDCalibraFit |
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. It fits the histos. |
24 | // The 2D histograms or vectors (first converted in 1D histos) will be fitted |
25 | // if they have enough entries, otherwise the (default) value of the choosen database |
26 | // will be put. For the relative gain calibration the resulted factors will be globally |
27 | // normalized to the gain factors of the choosen database. It unables to precise |
28 | // previous calibration procedure. |
29 | // The function SetDebug enables the user to see: |
30 | // _fDebug = 0: nothing, only the values are written in the tree if wanted |
31 | // _fDebug = 1: a comparaison of the coefficients found and the default values |
32 | // in the choosen database. |
33 | // fCoef , histogram of the coefs as function of the calibration group number |
34 | // fDelta , histogram of the relative difference of the coef with the default |
35 | // value in the database as function of the calibration group number |
36 | // fError , dirstribution of this relative difference |
37 | // _fDebug = 2: only the fit of the choosen calibration group fFitVoir (SetFitVoir) |
38 | // _fDebug = 3: The coefficients in the choosen detector fDet (SetDet) as function of the |
39 | // pad row and col number |
40 | // _fDebug = 4; The coeffcicients in the choosen detector fDet (SetDet) like in the 3 but with |
41 | // also the comparaison histograms of the 1 for this detector |
42 | // |
43 | // |
44 | // Author: |
45 | // R. Bailhache (R.Bailhache@gsi.de) |
46 | // |
47 | ////////////////////////////////////////////////////////////////////////////////////// |
48 | |
49 | #include <TTree.h> |
50 | #include <TLine.h> |
51 | #include <TH1I.h> |
52 | #include <TStyle.h> |
53 | #include <TProfile2D.h> |
54 | #include <TFile.h> |
55 | #include <TCanvas.h> |
56 | #include <TGraphErrors.h> |
57 | #include <TGraph.h> |
58 | #include <TObjArray.h> |
59 | #include <TH1.h> |
60 | #include <TH1F.h> |
61 | #include <TF1.h> |
62 | #include <TH2F.h> |
63 | #include <TAxis.h> |
64 | #include <TStopwatch.h> |
65 | #include <TMath.h> |
66 | #include <TLegend.h> |
67 | #include <TDirectory.h> |
68 | #include <TROOT.h> |
69 | |
70 | #include "AliLog.h" |
71 | #include "AliCDBManager.h" |
72 | |
73 | #include "AliTRDCalibraFit.h" |
74 | #include "AliTRDCalibraMode.h" |
75 | #include "AliTRDCalibraVector.h" |
76 | #include "AliTRDcalibDB.h" |
77 | #include "AliTRDgeometry.h" |
78 | #include "AliTRDCommonParam.h" |
79 | #include "./Cal/AliTRDCalROC.h" |
80 | #include "./Cal/AliTRDCalPad.h" |
81 | #include "./Cal/AliTRDCalDet.h" |
82 | |
83 | |
84 | ClassImp(AliTRDCalibraFit) |
85 | |
86 | AliTRDCalibraFit* AliTRDCalibraFit::fgInstance = 0; |
87 | Bool_t AliTRDCalibraFit::fgTerminated = kFALSE; |
88 | |
89 | //_____________singleton implementation_________________________________________________ |
90 | AliTRDCalibraFit *AliTRDCalibraFit::Instance() |
91 | { |
92 | // |
93 | // Singleton implementation |
94 | // |
95 | |
96 | if (fgTerminated != kFALSE) { |
97 | return 0; |
98 | } |
99 | |
100 | if (fgInstance == 0) { |
101 | fgInstance = new AliTRDCalibraFit(); |
102 | } |
103 | |
104 | return fgInstance; |
105 | |
106 | } |
107 | |
108 | //______________________________________________________________________________________ |
109 | void AliTRDCalibraFit::Terminate() |
110 | { |
111 | // |
112 | // Singleton implementation |
113 | // Deletes the instance of this class |
114 | // |
115 | |
116 | fgTerminated = kTRUE; |
117 | |
118 | if (fgInstance != 0) { |
119 | delete fgInstance; |
120 | fgInstance = 0; |
121 | } |
122 | |
123 | } |
124 | |
125 | //______________________________________________________________________________________ |
126 | AliTRDCalibraFit::AliTRDCalibraFit() |
127 | :TObject() |
128 | ,fWriteNameCoef(0) |
129 | ,fFitPHOn(kFALSE) |
130 | ,fFitPol2On(kFALSE) |
131 | ,fFitLagrPolOn(kFALSE) |
132 | ,fTakeTheMaxPH(kFALSE) |
133 | ,fFitPHPeriode(0) |
134 | ,fFitPHNDB(1) |
135 | ,fBeginFitCharge(0.0) |
136 | ,fT0Shift(0.0) |
137 | ,fRangeFitPRF(0.0) |
138 | ,fFitPRFOn(kFALSE) |
139 | ,fRMSPRFOn(kFALSE) |
140 | ,fFitPRFNDB(0) |
141 | ,fMeanChargeOn(kFALSE) |
142 | ,fFitChargeBisOn(kFALSE) |
143 | ,fFitChargeOn(kFALSE) |
144 | ,fFitMeanWOn(kFALSE) |
145 | ,fFitChargeNDB(0) |
146 | ,fAccCDB(kFALSE) |
147 | ,fMinEntries(0) |
148 | ,fRebin(0) |
149 | ,fNumberFit(0) |
150 | ,fNumberFitSuccess(0) |
151 | ,fNumberEnt(0) |
152 | ,fStatisticMean(0.0) |
153 | ,fDebug(0) |
154 | ,fFitVoir(0) |
155 | ,fCalibraMode(0) |
156 | ,fPRF(0) |
157 | ,fGain(0) |
158 | ,fT0(0) |
159 | ,fVdrift(0) |
160 | ,fVdriftDetector(0) |
161 | ,fVdriftPad(0x0) |
162 | ,fT0Detector(0) |
163 | ,fT0Pad(0x0) |
164 | ,fPRFDetector(0) |
165 | ,fPRFPad(0x0) |
166 | ,fCoefCH(0x0) |
167 | ,fScaleFitFactor(0.0) |
168 | ,fEntriesCurrent(0) |
169 | ,fCalibraVector(0) |
170 | ,fVectorFitCH(0) |
171 | { |
172 | // |
173 | // Default constructor |
174 | // |
175 | |
176 | fCalibraMode = new AliTRDCalibraMode(); |
177 | |
178 | // Write |
179 | for (Int_t i = 0; i < 3; i++) { |
180 | fWriteCoef[i] = kFALSE; |
181 | } |
182 | |
183 | // Debug Mode |
184 | for (Int_t k = 0; k < 3; k++) { |
185 | fDet[k] = 0; |
186 | } |
187 | |
188 | for (Int_t i = 0; i < 3; i++) { |
189 | fPhd[i] = 0.0; |
190 | } |
191 | |
192 | // Init |
193 | Init(); |
194 | |
195 | } |
196 | |
197 | //______________________________________________________________________________________ |
198 | AliTRDCalibraFit::AliTRDCalibraFit(const AliTRDCalibraFit &c) |
199 | :TObject(c) |
200 | ,fWriteNameCoef(0) |
201 | ,fFitPHOn(kFALSE) |
202 | ,fFitPol2On(kFALSE) |
203 | ,fFitLagrPolOn(kFALSE) |
204 | ,fTakeTheMaxPH(kFALSE) |
205 | ,fFitPHPeriode(0) |
206 | ,fFitPHNDB(1) |
207 | ,fBeginFitCharge(0.0) |
208 | ,fT0Shift(0.0) |
209 | ,fRangeFitPRF(0.0) |
210 | ,fFitPRFOn(kFALSE) |
211 | ,fRMSPRFOn(kFALSE) |
212 | ,fFitPRFNDB(0) |
213 | ,fMeanChargeOn(kFALSE) |
214 | ,fFitChargeBisOn(kFALSE) |
215 | ,fFitChargeOn(kFALSE) |
216 | ,fFitMeanWOn(kFALSE) |
217 | ,fFitChargeNDB(0) |
218 | ,fAccCDB(kFALSE) |
219 | ,fMinEntries(0) |
220 | ,fRebin(0) |
221 | ,fNumberFit(0) |
222 | ,fNumberFitSuccess(0) |
223 | ,fNumberEnt(0) |
224 | ,fStatisticMean(0.0) |
225 | ,fDebug(0) |
226 | ,fFitVoir(0) |
227 | ,fCalibraMode(0) |
228 | ,fPRF(0) |
229 | ,fGain(0) |
230 | ,fT0(0) |
231 | ,fVdrift(0) |
232 | ,fVdriftDetector(0) |
233 | ,fVdriftPad(0x0) |
234 | ,fT0Detector(0) |
235 | ,fT0Pad(0x0) |
236 | ,fPRFDetector(0) |
237 | ,fPRFPad(0x0) |
238 | ,fCoefCH(0x0) |
239 | ,fScaleFitFactor(0.0) |
240 | ,fEntriesCurrent(0) |
241 | ,fCalibraVector(0) |
242 | ,fVectorFitCH(0) |
243 | { |
244 | // |
245 | // Copy constructor |
246 | // |
247 | |
248 | } |
249 | |
250 | //____________________________________________________________________________________ |
251 | AliTRDCalibraFit::~AliTRDCalibraFit() |
252 | { |
253 | // |
254 | // AliTRDCalibraFit destructor |
255 | // |
256 | |
257 | ClearTree(); |
258 | |
259 | } |
260 | |
261 | //_____________________________________________________________________________ |
262 | void AliTRDCalibraFit::Destroy() |
263 | { |
264 | // |
265 | // Delete instance |
266 | // |
267 | |
268 | if (fgInstance) { |
269 | delete fgInstance; |
270 | fgInstance = 0x0; |
271 | } |
272 | |
273 | } |
274 | |
275 | //_____________________________________________________________________________ |
276 | void AliTRDCalibraFit::ClearTree() |
277 | { |
278 | // |
279 | // Delete the trees |
280 | // |
281 | |
282 | if (fPRF) { |
283 | delete fPRF; |
284 | fPRF = 0x0; |
285 | } |
286 | if (fGain) { |
287 | delete fGain; |
288 | fGain = 0x0; |
289 | } |
290 | if (fT0) { |
291 | delete fT0; |
292 | fT0 = 0x0; |
293 | } |
294 | if (fVdrift) { |
295 | delete fVdrift; |
296 | fVdrift = 0x0; |
297 | } |
298 | |
299 | } |
300 | |
301 | //_____________________________________________________________________________ |
302 | void AliTRDCalibraFit::Init() |
303 | { |
304 | // |
305 | // Init some default values |
306 | // |
307 | |
308 | // Write |
309 | fWriteNameCoef = "TRD.coefficient.root"; |
310 | |
311 | // Fit |
312 | fFitPHPeriode = 1; |
313 | fBeginFitCharge = 3.5; |
314 | fRangeFitPRF = 1.0; |
315 | fMinEntries = 800; |
316 | fT0Shift = 0.126256; |
317 | |
318 | // Internal variables |
319 | |
320 | // Variables in the loop |
321 | for (Int_t k = 0; k < 4; k++) { |
322 | fChargeCoef[k] = 1.0; |
323 | fVdriftCoef[k] = 1.5; |
324 | fT0Coef[k] = -1.0; |
325 | } |
326 | fChargeCoef[4] = 1.0; |
327 | for (Int_t i = 0; i < 3; i++) { |
328 | fPRFCoef[i] = -1.0; |
329 | } |
330 | |
331 | // Local database to be changed |
332 | fRebin = 1; |
333 | |
334 | } |
335 | |
336 | //____________Functions fit Online CH2d________________________________________ |
337 | Bool_t AliTRDCalibraFit::FitCHOnline(TH2I *ch) |
338 | { |
339 | // |
340 | // Fit the 1D histos, projections of the 2D ch on the Xaxis, for each |
341 | // calibration group normalized the resulted coefficients (to 1 normally) |
342 | // and write the results in a tree |
343 | // |
344 | |
345 | //A small check |
346 | if((fFitChargeNDB == 0) && (!fFitChargeOn)){ |
347 | AliInfo("You have choosen to write the default fit method but it is not on!"); |
348 | return kFALSE; |
349 | } |
350 | if((fFitChargeNDB == 1) && (!fMeanChargeOn)){ |
351 | AliInfo("You have choosen to write the mean method but it is not on!"); |
352 | return kFALSE; |
353 | } |
354 | if((fFitChargeNDB == 2) && (!fFitChargeBisOn)){ |
355 | AliInfo("You have choosen to write the second fit method but it is not on!"); |
356 | return kFALSE; |
357 | } |
358 | if((fFitChargeNDB == 4) && (!fFitMeanWOn)){ |
359 | AliInfo("You have choosen to write the mean w method but it is not on!"); |
360 | return kFALSE; |
361 | } |
362 | |
363 | |
364 | // Number of Xbins (detectors or groups of pads) |
365 | TAxis *xch = ch->GetXaxis(); |
366 | Int_t nbins = xch->GetNbins(); |
367 | TAxis *yph = ch->GetYaxis(); |
368 | Int_t nybins = yph->GetNbins(); |
369 | if (!InitFit(nbins,0)) { |
370 | return kFALSE; |
371 | } |
372 | fStatisticMean = 0.0; |
373 | fNumberFit = 0; |
374 | fNumberFitSuccess = 0; |
375 | fNumberEnt = 0; |
376 | |
377 | // Init fCountDet and fCount |
378 | InitfCountDetAndfCount(0); |
379 | |
380 | // Beginning of the loop betwwen dect1 and dect2 |
381 | for (Int_t idect = fDect1[0]; idect < fDect2[0]; idect++) { |
382 | |
383 | TH1I *projch = (TH1I *) ch->ProjectionY("projch",idect+1,idect+1,(Option_t *)"e"); |
384 | projch->SetDirectory(0); |
385 | |
386 | // Determination of fNnZ, fNnRphi, fNfragZ and fNfragRphi |
387 | UpdatefCountDetAndfCount(idect,0); |
388 | |
389 | // Reconstruction of the row and pad group: rowmin, row max ... |
390 | ReconstructFitRowMinRowMax(idect, 0); |
391 | |
392 | // Number of entries for this calibration group |
393 | Double_t nentries = 0.0; |
394 | Double_t mean = 0.0; |
395 | for (Int_t k = 0; k < nybins; k++) { |
396 | nentries += ch->GetBinContent(ch->GetBin(idect+1,k+1)); |
397 | mean += projch->GetBinCenter(k+1)*projch->GetBinContent(k+1); |
398 | } |
399 | if (nentries > 0) { |
400 | fNumberEnt++; |
401 | mean /= nentries; |
402 | } |
403 | |
404 | |
405 | // Rebin and statistic stuff |
406 | // Rebin |
407 | if (fRebin > 1) { |
408 | projch = ReBin((TH1I *) projch); |
409 | } |
410 | // This detector has not enough statistics or was off |
411 | if (nentries < fMinEntries) { |
412 | // Fill with the default infos |
413 | NotEnoughStatistic(idect,0); |
414 | // Memory!!! |
415 | if (fDebug != 2) { |
416 | delete projch; |
417 | } |
418 | continue; |
419 | } |
420 | |
421 | // Statistics of the group fitted |
422 | AliInfo(Form("For the group number %d there are %f stats",idect,nentries)); |
423 | fStatisticMean += nentries; |
424 | fNumberFit++; |
425 | |
426 | |
427 | // Method Mean and fit |
428 | // idect is egal for fDebug = 0 and 2, only to fill the hist |
429 | fChargeCoef[1] = mean; |
430 | if(fMeanChargeOn){ |
431 | FitMean((TH1 *) projch,(Int_t) (idect-fDect1[0]),nentries); |
432 | } |
433 | if(fFitChargeOn){ |
434 | FitCH((TH1 *) projch,(Int_t) (idect-fDect1[0])); |
435 | } |
436 | if(fFitChargeBisOn) { |
437 | FitBisCH((TH1 *) projch,(Int_t) (idect-fDect1[0])); |
438 | } |
439 | if(fFitMeanWOn){ |
440 | FitMeanW((TH1 *) projch,(Int_t) (idect-fDect1[0])); |
441 | } |
442 | |
443 | // Visualise the detector for fDebug 3 or 4 |
444 | // Here is the reconstruction of the pad and row group is used! |
445 | if (fDebug >= 3) { |
446 | FillCoefChargeDB(); |
447 | } |
448 | // Fill Infos Fit |
449 | FillInfosFit(idect,0); |
450 | |
451 | // Memory!!! |
452 | if (fDebug != 2) { |
453 | delete projch; |
454 | } |
455 | |
456 | |
457 | } // Boucle object |
458 | |
459 | |
460 | // Normierungcharge |
461 | if (fDebug != 2) { |
462 | NormierungCharge(); |
463 | } |
464 | |
465 | // Plot |
466 | // 0 no plot, 1 and 4 error plot, 3 and 4 DB plot |
467 | if ((fDebug == 1) || |
468 | (fDebug == 4)) { |
469 | PlotWriteCH(); |
470 | } |
471 | if ((fDebug == 4) || |
472 | (fDebug == 3)) { |
473 | PlotCHDB(); |
474 | } |
475 | |
476 | // Mean Statistic |
477 | if (fNumberFit > 0) { |
478 | AliInfo(Form("There are %d with at least one entries.",fNumberEnt)); |
479 | AliInfo(Form("%d fits have been proceeded (sucessfully or not...).",fNumberFit)); |
480 | AliInfo(Form("There is a mean statistic of: %d over these fitted histograms and %d successfulled fits" |
481 | , (Int_t) fStatisticMean/fNumberFit, fNumberFitSuccess)); |
482 | fStatisticMean = fStatisticMean / fNumberFit; |
483 | } |
484 | else { |
485 | AliInfo(Form("There are %d with at least one entries. There is no fit!",fNumberEnt)); |
486 | } |
487 | |
488 | // Write the things! |
489 | ConvertVectorFitCHTree(); |
490 | if (fWriteCoef[0]) { |
491 | WriteFitInfos(0); |
492 | } |
493 | |
494 | return kTRUE; |
495 | |
496 | } |
497 | |
498 | //____________Functions fit Online CH2d________________________________________ |
499 | Bool_t AliTRDCalibraFit::FitCHOnline() |
500 | { |
501 | // |
502 | // Reconstruct a 1D histo from the vectorCH for each calibration group, |
503 | // fit the histo, normalized the resulted coefficients (to 1 normally) |
504 | // and write the results in a tree |
505 | // |
506 | |
507 | //A small check |
508 | if((fFitChargeNDB == 0) && (!fFitChargeOn)){ |
509 | AliInfo("You have choosen to write the default fit method but it is not on!"); |
510 | return kFALSE; |
511 | } |
512 | if((fFitChargeNDB == 1) && (!fMeanChargeOn)){ |
513 | AliInfo("You have choosen to write the mean method but it is not on!"); |
514 | return kFALSE; |
515 | } |
516 | if((fFitChargeNDB == 2) && (!fFitChargeBisOn)){ |
517 | AliInfo("You have choosen to write the second fit method but it is not on!"); |
518 | return kFALSE; |
519 | } |
520 | if((fFitChargeNDB == 4) && (!fFitMeanWOn)){ |
521 | AliInfo("You have choosen to write the mean w method but it is not on!"); |
522 | return kFALSE; |
523 | } |
524 | |
525 | |
526 | //Warning |
527 | if (!fCalibraVector) { |
528 | AliError("You have first to set the calibravector before using this function!"); |
529 | return kFALSE; |
530 | } |
531 | |
532 | // Number of Xbins (detectors or groups of pads) |
533 | if (!InitFit(0,0)) { |
534 | return kFALSE; |
535 | } |
536 | fStatisticMean = 0.0; |
537 | fNumberFit = 0; |
538 | fNumberFitSuccess = 0; |
539 | fNumberEnt = 0; |
540 | |
541 | // Init fCountDet and fCount |
542 | InitfCountDetAndfCount(0); |
543 | |
544 | // Beginning of the loop between dect1 and dect2 |
545 | for (Int_t idect = fDect1[0]; idect < fDect2[0]; idect++) { |
546 | |
547 | // Search if the group is in the VectorCH |
548 | Int_t place = fCalibraVector->SearchInVector(idect,0); |
549 | |
550 | // Is in |
551 | TH1F *projch = 0x0; |
552 | TString name("CH"); |
553 | name += idect; |
554 | if (place != -1) { |
555 | projch = fCalibraVector->ConvertVectorCTHisto(place,(const char *) name); |
556 | projch->SetDirectory(0); |
557 | } |
558 | |
559 | // Determination of fNnZ, fNnRphi, fNfragZ and fNfragRphi |
560 | UpdatefCountDetAndfCount(idect,0); |
561 | |
562 | // Reconstruction of the row and pad group: rowmin, row max ... |
563 | ReconstructFitRowMinRowMax(idect,0); |
564 | |
565 | // Number of entries and mean |
566 | Double_t nentries = 0.0; |
567 | Double_t mean = 0.0; |
568 | if (projch) { |
569 | for (Int_t k = 0; k < fCalibraVector->GetNumberBinCharge(); k++) { |
570 | nentries += projch->GetBinContent(k+1); |
571 | mean += projch->GetBinCenter(k+1)*projch->GetBinContent(k+1); |
572 | } |
573 | } |
574 | if (nentries > 0) { |
575 | fNumberEnt++; |
576 | mean /= nentries; |
577 | } |
578 | |
579 | // Rebin and statistic stuff |
580 | // Rebin |
581 | if ((fRebin > 1) && |
582 | (place != -1)) { |
583 | projch = ReBin((TH1F *) projch); |
584 | } |
585 | |
586 | // This detector has not enough statistics or was not found in VectorCH |
587 | if ((place == -1) || |
588 | ((place != -1) && |
589 | (nentries < fMinEntries))) { |
590 | |
591 | // Fill with the default infos |
592 | NotEnoughStatistic(idect,0); |
593 | |
594 | // Memory!!! |
595 | if (fDebug != 2) { |
596 | delete projch; |
597 | } |
598 | |
599 | continue; |
600 | |
601 | } |
602 | |
603 | // Statistic of the histos fitted |
604 | AliInfo(Form("For the group number %d there are %f stats",idect,nentries)); |
605 | fStatisticMean += nentries; |
606 | fNumberFit++; |
607 | |
608 | |
609 | // Method Mean and fit |
610 | // idect is egal for fDebug = 0 and 2, only to fill the hist |
611 | fChargeCoef[1] = mean; |
612 | if(fMeanChargeOn){ |
613 | FitMean((TH1 *) projch,(Int_t) (idect-fDect1[0]),nentries); |
614 | } |
615 | if(fFitChargeOn){ |
616 | FitCH((TH1 *) projch,(Int_t) (idect-fDect1[0])); |
617 | } |
618 | if(fFitChargeBisOn) { |
619 | FitBisCH((TH1 *) projch,(Int_t) (idect-fDect1[0])); |
620 | } |
621 | if(fFitMeanWOn){ |
622 | FitMeanW((TH1 *) projch,(Int_t) (idect-fDect1[0])); |
623 | } |
624 | |
625 | // Visualise the detector for fDebug 3 or 4 |
626 | // Here is the reconstruction of the pad and row group is used! |
627 | if (fDebug >= 3) { |
628 | FillCoefChargeDB(); |
629 | } |
630 | |
631 | // Fill Infos Fit |
632 | FillInfosFit(idect,0); |
633 | |
634 | // Memory!!! |
635 | if (fDebug != 2) { |
636 | delete projch; |
637 | } |
638 | |
639 | } // Boucle object |
640 | |
641 | |
642 | // Normierungcharge |
643 | if (fDebug != 2) { |
644 | NormierungCharge(); |
645 | } |
646 | |
647 | |
648 | // Plot |
649 | // 0 no plot, 1 and 4 error plot, 3 and 4 DB plot |
650 | if ((fDebug == 1) || |
651 | (fDebug == 4)){ |
652 | PlotWriteCH(); |
653 | } |
654 | if((fDebug == 4) || |
655 | (fDebug == 3)){ |
656 | PlotCHDB(); |
657 | } |
658 | |
659 | // Mean Statistics |
660 | if (fNumberFit > 0) { |
661 | AliInfo(Form("There are %d with at least one entries.",fNumberEnt)); |
662 | AliInfo(Form("%d fits have been proceeded (sucessfully or not...).",fNumberFit)); |
663 | AliInfo(Form("There is a mean statistic of: %d over these fitted histograms and %d successfulled fits" |
664 | ,(Int_t) fStatisticMean/fNumberFit, fNumberFitSuccess)); |
665 | fStatisticMean = fStatisticMean / fNumberFit; |
666 | } |
667 | else { |
668 | AliInfo(Form("There are %d with at least one entries. There is no fit!",fNumberEnt)); |
669 | } |
670 | |
671 | // Write the things! |
672 | ConvertVectorFitCHTree(); |
673 | if (fWriteCoef[0]) { |
674 | WriteFitInfos(0); |
675 | } |
676 | |
677 | return kTRUE; |
678 | |
679 | } |
680 | |
681 | //____________Functions fit Online CH2d________________________________________ |
682 | Bool_t AliTRDCalibraFit::FitCHOnline(TTree *tree) |
683 | { |
684 | // |
685 | // Look if the calibration group can be found in the tree, if yes take the |
686 | // histo, fit it, normalized the resulted coefficients (to 1 normally) and |
687 | // write the results in a tree |
688 | // |
689 | |
690 | //A small check |
691 | if((fFitChargeNDB == 0) && (!fFitChargeOn)){ |
692 | AliInfo("You have choosen to write the default fit method but it is not on!"); |
693 | return kFALSE; |
694 | } |
695 | if((fFitChargeNDB == 1) && (!fMeanChargeOn)){ |
696 | AliInfo("You have choosen to write the mean method but it is not on!"); |
697 | return kFALSE; |
698 | } |
699 | if((fFitChargeNDB == 2) && (!fFitChargeBisOn)){ |
700 | AliInfo("You have choosen to write the second fit method but it is not on!"); |
701 | return kFALSE; |
702 | } |
703 | if((fFitChargeNDB == 4) && (!fFitMeanWOn)){ |
704 | AliInfo("You have choosen to write the mean w method but it is not on!"); |
705 | return kFALSE; |
706 | } |
707 | |
708 | |
709 | // Number of Xbins (detectors or groups of pads) |
710 | if (!InitFit(0,0)) { |
711 | return kFALSE; |
712 | } |
713 | fStatisticMean = 0.0; |
714 | fNumberFit = 0; |
715 | fNumberFitSuccess = 0; |
716 | fNumberEnt = 0; |
717 | |
718 | // Initialise |
719 | fCalibraVector = new AliTRDCalibraVector(); |
720 | |
721 | |
722 | // Init fCountDet and fCount |
723 | InitfCountDetAndfCount(0); |
724 | TH1F *projch = 0x0; |
725 | tree->SetBranchAddress("histo",&projch); |
726 | TObjArray *vectorplace = fCalibraVector->ConvertTreeVector(tree); |
727 | |
728 | // Beginning of the loop between dect1 and dect2 |
729 | for (Int_t idect = fDect1[0]; idect < fDect2[0]; idect++) { |
730 | |
731 | //Search if the group is in the VectorCH |
732 | Int_t place = fCalibraVector->SearchInTreeVector(vectorplace,idect); |
733 | |
734 | // Is in |
735 | if (place != -1) { |
736 | // Variable |
737 | tree->GetEntry(place); |
738 | } |
739 | |
740 | // Determination of fNnZ, fNnRphi, fNfragZ and fNfragRphi |
741 | UpdatefCountDetAndfCount(idect,0); |
742 | |
743 | // Reconstruction of the row and pad group: rowmin, row max ... |
744 | ReconstructFitRowMinRowMax(idect,0); |
745 | |
746 | // Number of entries and mean |
747 | Double_t nentries = 0.0; |
748 | Double_t mean = 0.0; |
749 | if (projch) { |
750 | for (Int_t k = 0; k < projch->GetXaxis()->GetNbins(); k++) { |
751 | nentries += projch->GetBinContent(k+1); |
752 | mean += projch->GetBinCenter(k+1)*projch->GetBinContent(k+1); |
753 | } |
754 | } |
755 | if (nentries > 0) { |
756 | fNumberEnt++; |
757 | mean /= nentries; |
758 | } |
759 | |
760 | |
761 | // Rebin and statistic stuff |
762 | // Rebin |
763 | if ((fRebin > 1) && |
764 | (place != -1)) { |
765 | projch = ReBin((TH1F *) projch); |
766 | } |
767 | |
768 | // This detector has not enough statistics or was not found in VectorCH |
769 | if((place == -1) || |
770 | ((place != -1) && |
771 | (nentries < fMinEntries))) { |
772 | |
773 | // Fill with the default infos |
774 | NotEnoughStatistic(idect,0); |
775 | |
776 | continue; |
777 | |
778 | } |
779 | |
780 | // Statistics of the group fitted |
781 | AliInfo(Form("For the group number %d there are %f stats",idect,nentries)); |
782 | fNumberFit++; |
783 | fStatisticMean += nentries; |
784 | |
785 | // Method Mean and fit |
786 | // idect is egal for fDebug = 0 and 2, only to fill the hist |
787 | fChargeCoef[1] = mean; |
788 | if(fMeanChargeOn){ |
789 | FitMean((TH1 *) projch,(Int_t) (idect-fDect1[0]),nentries); |
790 | } |
791 | if(fFitChargeOn){ |
792 | FitCH((TH1 *) projch,(Int_t) (idect-fDect1[0])); |
793 | } |
794 | if(fFitChargeBisOn) { |
795 | FitBisCH((TH1 *) projch,(Int_t) (idect-fDect1[0])); |
796 | } |
797 | if(fFitMeanWOn){ |
798 | FitMeanW((TH1 *) projch,(Int_t) (idect-fDect1[0])); |
799 | } |
800 | |
801 | // Visualise the detector for fDebug 3 or 4 |
802 | // Here is the reconstruction of the pad and row group is used! |
803 | if (fDebug >= 3) { |
804 | FillCoefChargeDB(); |
805 | } |
806 | |
807 | // Fill Infos Fit |
808 | FillInfosFit(idect,0); |
809 | |
810 | } // Boucle object |
811 | |
812 | |
813 | // Normierungcharge |
814 | if (fDebug != 2) { |
815 | NormierungCharge(); |
816 | } |
817 | |
818 | |
819 | // Plot |
820 | // 0 no plot, 1 and 4 error plot, 3 and 4 DB plot |
821 | if ((fDebug == 1) || |
822 | (fDebug == 4)){ |
823 | PlotWriteCH(); |
824 | } |
825 | if ((fDebug == 4) || |
826 | (fDebug == 3)){ |
827 | PlotCHDB(); |
828 | } |
829 | |
830 | // Mean Statistic |
831 | if (fNumberFit > 0) { |
832 | AliInfo(Form("There are %d with at least one entries.",fNumberEnt)); |
833 | AliInfo(Form("%d fits have been proceeded (sucessfully or not...).",fNumberFit)); |
834 | AliInfo(Form("There is a mean statistic of: %d over these fitted histograms and %d successfulled fits" |
835 | ,(Int_t) fStatisticMean/fNumberFit,fNumberFitSuccess)); |
836 | fStatisticMean = fStatisticMean / fNumberFit; |
837 | } |
838 | else { |
839 | AliInfo(Form("There are %d with at least one entries. There is no fit!",fNumberEnt)); |
840 | } |
841 | |
842 | // Write the things! |
843 | ConvertVectorFitCHTree(); |
844 | if (fWriteCoef[0]) { |
845 | WriteFitInfos(0); |
846 | } |
847 | |
848 | |
849 | return kTRUE; |
850 | |
851 | } |
852 | |
853 | //________________functions fit Online PH2d____________________________________ |
854 | Bool_t AliTRDCalibraFit::FitPHOnline(TProfile2D *ph) |
855 | { |
856 | // |
857 | // Take the 1D profiles (average pulse height), projections of the 2D PH |
858 | // on the Xaxis, for each calibration group |
859 | // Fit or use the slope of the average pulse height to reconstruct the |
860 | // drift velocity write the results in a tree |
861 | // A first calibration of T0 is also made using the same method (slope method) |
862 | // |
863 | |
864 | //A small check |
865 | if((fFitPHNDB == 0) && (!fFitPHOn)){ |
866 | AliInfo("You have choosen to write the fit method but it is not on!"); |
867 | return kFALSE; |
868 | } |
869 | if((fFitPHNDB == 1) && (!fFitPol2On)){ |
870 | AliInfo("You have choosen to write the Pol2 method but it is not on!"); |
871 | return kFALSE; |
872 | } |
873 | if((fFitPHNDB == 3) && (!fFitLagrPolOn)){ |
874 | AliInfo("You have choosen to write the LagrPol2 method but it is not on!"); |
875 | return kFALSE; |
876 | } |
877 | |
878 | // Number of Xbins (detectors or groups of pads) |
879 | TAxis *xph = ph->GetXaxis(); |
880 | TAxis *yph = ph->GetYaxis(); |
881 | Int_t nbins = xph->GetNbins(); |
882 | Int_t nybins = yph->GetNbins(); |
883 | if (!InitFit(nbins,1)) { |
884 | return kFALSE; |
885 | } |
886 | fStatisticMean = 0.0; |
887 | fNumberFit = 0; |
888 | fNumberFitSuccess = 0; |
889 | fNumberEnt = 0; |
890 | |
891 | // Init fCountDet and fCount |
892 | InitfCountDetAndfCount(1); |
893 | |
894 | // Beginning of the loop |
895 | for (Int_t idect = fDect1[1]; idect < fDect2[1]; idect++) { |
896 | |
897 | TH1D *projph = (TH1D *) ph->ProjectionY("projph",idect+1,idect+1,(Option_t *) "e"); |
898 | projph->SetDirectory(0); |
899 | |
900 | // Number of entries for this calibration group |
901 | Double_t nentries = 0; |
902 | for (Int_t k = 0; k < nybins; k++) { |
903 | nentries += ph->GetBinEntries(ph->GetBin(idect+1,k+1)); |
904 | } |
905 | if (nentries > 0) { |
906 | fNumberEnt++; |
907 | } |
908 | |
909 | // Determination of fNnZ, fNnRphi, fNfragZ and fNfragRphi |
910 | UpdatefCountDetAndfCount(idect,1); |
911 | |
912 | // Reconstruction of the row and pad group: rowmin, row max ... |
913 | ReconstructFitRowMinRowMax(idect,1); |
914 | |
915 | // Rebin and statistic stuff |
916 | // This detector has not enough statistics or was off |
917 | if (nentries < fMinEntries) { |
918 | |
919 | // Fill with the default values |
920 | NotEnoughStatistic(idect,1); |
921 | |
922 | // Memory!!! |
923 | if (fDebug != 2) { |
924 | delete projph; |
925 | } |
926 | |
927 | continue; |
928 | |
929 | } |
930 | |
931 | // Statistics of the histos fitted |
932 | AliInfo(Form("For the group number %d there are %f stats",idect,nentries)); |
933 | fNumberFit++; |
934 | fStatisticMean += nentries; |
935 | |
936 | // Calcul of "real" coef |
937 | CalculVdriftCoefMean(fCountDet[1],(Int_t) (idect - fDect1[1])); |
938 | CalculT0CoefMean(fCountDet[1],(Int_t) (idect - fDect1[1])); |
939 | |
940 | // Method Mean and fit |
941 | // idect is egal for fDebug = 0 and 2, only to fill the hist |
942 | if(fFitPol2On){ |
943 | FitPente((TH1 *) projph,(Int_t) (idect - fDect1[1])); |
944 | } |
945 | if(fFitLagrPolOn){ |
946 | FitLagrangePoly((TH1 *) projph,(Int_t) (idect - fDect1[1])); |
947 | } |
948 | if (fFitPHOn) { |
949 | FitPH((TH1 *) projph,(Int_t) (idect - fDect1[1])); |
950 | } |
951 | |
952 | // Visualise the detector for fDebug 3 or 4 |
953 | // Here is the reconstruction of the pad and row group is used! |
954 | if (fDebug >= 3) { |
955 | FillCoefVdriftDB(); |
956 | FillCoefT0DB(); |
957 | } |
958 | // Fill the tree if end of a detector or only the pointer to the branch!!! |
959 | FillInfosFit(idect,1); |
960 | // Memory!!! |
961 | if (fDebug != 2) { |
962 | delete projph; |
963 | } |
964 | |
965 | } // Boucle object |
966 | |
967 | |
968 | // Plot |
969 | // 0 no plot, 1 and 4 error plot, 3 and 4 DB plot |
970 | if ((fDebug == 1) || |
971 | (fDebug == 4)) { |
972 | PlotWritePH(); |
973 | PlotWriteT0(); |
974 | } |
975 | if ((fDebug == 4) || |
976 | (fDebug == 3)) { |
977 | PlotPHDB(); |
978 | PlotT0DB(); |
979 | } |
980 | |
981 | // Mean Statistic |
982 | if (fNumberFit > 0) { |
983 | AliInfo(Form("There are %d with at least one entries.",fNumberEnt)); |
984 | AliInfo(Form("%d fits have been proceeded (sucessfully or not...).",fNumberFit)); |
985 | AliInfo(Form("There is a mean statistic of: %d over these fitted histograms and %d successfulled fits" |
986 | ,(Int_t) fStatisticMean/fNumberFit,fNumberFitSuccess)); |
987 | fStatisticMean = fStatisticMean / fNumberFit; |
988 | } |
989 | else { |
990 | AliInfo(Form("There are %d with at least one entries. There is no fit!",fNumberEnt)); |
991 | } |
992 | |
993 | // Write the things! |
994 | if(fWriteCoef[1]) { |
995 | WriteFitInfos(1); |
996 | } |
997 | |
998 | return kTRUE; |
999 | |
1000 | } |
1001 | |
1002 | //____________Functions fit Online PH2d________________________________________ |
1003 | Bool_t AliTRDCalibraFit::FitPHOnline() |
1004 | { |
1005 | // |
1006 | // Reconstruct the average pulse height from the vectorPH for each |
1007 | // calibration group |
1008 | // Fit or use the slope of the average pulse height to reconstruct the |
1009 | // drift velocity write the results in a tree |
1010 | // A first calibration of T0 is also made using the same method (slope method) |
1011 | // |
1012 | |
1013 | //A small check |
1014 | if((fFitPHNDB == 0) && (!fFitPHOn)){ |
1015 | AliInfo("You have choosen to write the fit method but it is not on!"); |
1016 | return kFALSE; |
1017 | } |
1018 | if((fFitPHNDB == 1) && (!fFitPol2On)){ |
1019 | AliInfo("You have choosen to write the Pol2 method but it is not on!"); |
1020 | return kFALSE; |
1021 | } |
1022 | if((fFitPHNDB == 3) && (!fFitLagrPolOn)){ |
1023 | AliInfo("You have choosen to write the LagrPol2 method but it is not on!"); |
1024 | return kFALSE; |
1025 | } |
1026 | |
1027 | //Warning |
1028 | if (!fCalibraVector) { |
1029 | AliError("You have first to set the calibravector before using this function!"); |
1030 | return kFALSE; |
1031 | } |
1032 | |
1033 | |
1034 | // Number of Xbins (detectors or groups of pads) |
1035 | if (!InitFit(0,1)) { |
1036 | return kFALSE; |
1037 | } |
1038 | fStatisticMean = 0.0; |
1039 | fNumberFit = 0; |
1040 | fNumberFitSuccess = 0; |
1041 | fNumberEnt = 0; |
1042 | |
1043 | // Init fCountDet and fCount |
1044 | InitfCountDetAndfCount(1); |
1045 | |
1046 | // Beginning of the loop |
1047 | for (Int_t idect = fDect1[1]; idect < fDect2[1]; idect++) { |
1048 | |
1049 | // Search if the group is in the VectorCH |
1050 | Int_t place = fCalibraVector->SearchInVector(idect,1); |
1051 | |
1052 | // Is in |
1053 | TH1F *projph = 0x0; |
1054 | TString name("PH"); |
1055 | name += idect; |
1056 | if (place != -1) { |
1057 | //Entries |
1058 | fNumberEnt++; |
1059 | projph = CorrectTheError((TGraphErrors *) (fCalibraVector->ConvertVectorPHisto(place,(const char *) name))); |
1060 | projph->SetDirectory(0); |
1061 | } |
1062 | |
1063 | // Determination of fNnZ, fNnRphi, fNfragZ and fNfragRphi |
1064 | UpdatefCountDetAndfCount(idect,1); |
1065 | |
1066 | // Reconstruction of the row and pad group: rowmin, row max ... |
1067 | ReconstructFitRowMinRowMax(idect,1); |
1068 | |
1069 | // Rebin and statistic stuff |
1070 | // This detector has not enough statistics or was off |
1071 | if ((place == -1) || |
1072 | ((place != -1) && |
1073 | (fEntriesCurrent < fMinEntries))) { |
1074 | |
1075 | // Fill with the default values |
1076 | NotEnoughStatistic(idect,1); |
1077 | |
1078 | // Memory!!! |
1079 | if (fDebug != 2) { |
1080 | delete projph; |
1081 | } |
1082 | |
1083 | continue; |
1084 | |
1085 | } |
1086 | |
1087 | // Statistic of the histos fitted |
1088 | AliInfo(Form("For the group number %d there are %d stats",idect,fEntriesCurrent)); |
1089 | fNumberFit++; |
1090 | fStatisticMean += fEntriesCurrent; |
1091 | |
1092 | // Calcul of "real" coef |
1093 | CalculVdriftCoefMean(fCountDet[1],(Int_t) (idect - fDect1[1])); |
1094 | CalculT0CoefMean(fCountDet[1],(Int_t) (idect - fDect1[1])); |
1095 | |
1096 | // Method Mean and fit |
1097 | // idect is egal for fDebug = 0 and 2, only to fill the hist |
1098 | if(fFitPol2On){ |
1099 | FitPente((TH1 *) projph,(Int_t) (idect - fDect1[1])); |
1100 | } |
1101 | if(fFitLagrPolOn){ |
1102 | FitLagrangePoly((TH1 *) projph,(Int_t) (idect - fDect1[1])); |
1103 | } |
1104 | if (fFitPHOn) { |
1105 | FitPH((TH1 *) projph,(Int_t) (idect - fDect1[1])); |
1106 | } |
1107 | |
1108 | // Visualise the detector for fDebug 3 or 4 |
1109 | // Here is the reconstruction of the pad and row group is used! |
1110 | if (fDebug >= 3) { |
1111 | FillCoefVdriftDB(); |
1112 | FillCoefT0DB(); |
1113 | } |
1114 | |
1115 | // Fill the tree if end of a detector or only the pointer to the branch!!! |
1116 | FillInfosFit(idect,1); |
1117 | |
1118 | // Memory!!! |
1119 | if (fDebug != 2) { |
1120 | delete projph; |
1121 | } |
1122 | |
1123 | } // Boucle object |
1124 | |
1125 | |
1126 | // Plot |
1127 | // 0 no plot, 1 and 4 error plot, 3 and 4 DB plot |
1128 | if ((fDebug == 1) || |
1129 | (fDebug == 4)) { |
1130 | PlotWritePH(); |
1131 | PlotWriteT0(); |
1132 | } |
1133 | if ((fDebug == 4) || |
1134 | (fDebug == 3)) { |
1135 | PlotPHDB(); |
1136 | PlotT0DB(); |
1137 | } |
1138 | |
1139 | // Mean Statistic |
1140 | if (fNumberFit > 0) { |
1141 | AliInfo(Form("There are %d with at least one entries.",fNumberEnt)); |
1142 | AliInfo(Form("%d fits have been proceeded (sucessfully or not...).",fNumberFit)); |
1143 | AliInfo(Form("There is a mean statistic of: %d over these fitted histograms and %d successfulled fits" |
1144 | ,(Int_t) fStatisticMean/fNumberFit,fNumberFitSuccess)); |
1145 | fStatisticMean = fStatisticMean / fNumberFit; |
1146 | } |
1147 | else { |
1148 | AliInfo(Form("There are %d with at least one entries. There is no fit!",fNumberEnt)); |
1149 | } |
1150 | |
1151 | // Write the things! |
1152 | if (fWriteCoef[1]) { |
1153 | WriteFitInfos(1); |
1154 | } |
1155 | |
1156 | return kTRUE; |
1157 | |
1158 | } |
1159 | |
1160 | //____________Functions fit Online PH2d________________________________________ |
1161 | Bool_t AliTRDCalibraFit::FitPHOnline(TTree *tree) |
1162 | { |
1163 | // |
1164 | // Look if the calibration group can be found in the tree, if yes take the |
1165 | // histo, fit it, and write the results in a tree |
1166 | // A first calibration of T0 is also made using the same method (slope method) |
1167 | // |
1168 | |
1169 | //A small check |
1170 | if ((fFitPHNDB == 0) && (!fFitPHOn)){ |
1171 | AliInfo("You have choosen to write the fit method but it is not on!"); |
1172 | return kFALSE; |
1173 | } |
1174 | if ((fFitPHNDB == 1) && (!fFitPol2On)){ |
1175 | AliInfo("You have choosen to write the Pol2 method but it is not on!"); |
1176 | return kFALSE; |
1177 | } |
1178 | if ((fFitPHNDB == 3) && (!fFitLagrPolOn)){ |
1179 | AliInfo("You have choosen to write the LagrPol2 method but it is not on!"); |
1180 | return kFALSE; |
1181 | } |
1182 | |
1183 | // Number of Xbins (detectors or groups of pads) |
1184 | if (!InitFit(0,1)) { |
1185 | return kFALSE; |
1186 | } |
1187 | fStatisticMean = 0.0; |
1188 | fNumberFit = 0; |
1189 | fNumberFitSuccess = 0; |
1190 | fNumberEnt = 0; |
1191 | |
1192 | // Initialise |
1193 | fCalibraVector = new AliTRDCalibraVector(); |
1194 | |
1195 | // Init fCountDet and fCount |
1196 | InitfCountDetAndfCount(1); |
1197 | TGraphErrors *projphtree = 0x0; |
1198 | tree->SetBranchAddress("histo",&projphtree); |
1199 | TObjArray *vectorplace = fCalibraVector->ConvertTreeVector(tree); |
1200 | |
1201 | // Beginning of the loop |
1202 | for (Int_t idect = fDect1[1]; idect < fDect2[1]; idect++) { |
1203 | |
1204 | // Search if the group is in the VectorCH |
1205 | Int_t place = fCalibraVector->SearchInTreeVector(vectorplace,idect); |
1206 | |
1207 | TH1F *projph = 0x0; |
1208 | // Is in |
1209 | if (place != -1) { |
1210 | //Entries |
1211 | fNumberEnt++; |
1212 | // Variable |
1213 | tree->GetEntry(place); |
1214 | projph = CorrectTheError(projphtree); |
1215 | } |
1216 | |
1217 | // Determination of fNnZ, fNnRphi, fNfragZ and fNfragRphi |
1218 | UpdatefCountDetAndfCount(idect,1); |
1219 | |
1220 | // Reconstruction of the row and pad group: rowmin, row max ... |
1221 | ReconstructFitRowMinRowMax(idect,1); |
1222 | |
1223 | // Rebin and statistic stuff |
1224 | // This detector has not enough statistics or was off |
1225 | if((place == -1) || |
1226 | ((place != -1) && |
1227 | (fEntriesCurrent < fMinEntries))) { |
1228 | |
1229 | // Fill with the default values |
1230 | NotEnoughStatistic(idect,1); |
1231 | |
1232 | // Memory!!! |
1233 | if (fDebug != 2) { |
1234 | delete projph; |
1235 | } |
1236 | |
1237 | continue; |
1238 | |
1239 | } |
1240 | |
1241 | // Statistics of the histos fitted |
1242 | AliInfo(Form("For the group number %d there are %d stats",idect,fEntriesCurrent)); |
1243 | fNumberFit++; |
1244 | fStatisticMean += fEntriesCurrent; |
1245 | |
1246 | // Calcul of "real" coef |
1247 | CalculVdriftCoefMean(fCountDet[1],(Int_t) (idect - fDect1[1])); |
1248 | CalculT0CoefMean(fCountDet[1],(Int_t) (idect - fDect1[1])); |
1249 | |
1250 | // Method Mean and fit |
1251 | // idect is egal for fDebug = 0 and 2, only to fill the hist |
1252 | if(fFitPol2On){ |
1253 | FitPente((TH1 *) projph,(Int_t) (idect - fDect1[1])); |
1254 | } |
1255 | if(fFitLagrPolOn){ |
1256 | FitLagrangePoly((TH1 *) projph,(Int_t) (idect - fDect1[1])); |
1257 | } |
1258 | if (fFitPHOn) { |
1259 | FitPH((TH1 *) projph,(Int_t) (idect - fDect1[1])); |
1260 | } |
1261 | |
1262 | // Visualise the detector for fDebug 3 or 4 |
1263 | // Here is the reconstruction of the pad and row group is used! |
1264 | if (fDebug >= 3) { |
1265 | FillCoefVdriftDB(); |
1266 | FillCoefT0DB(); |
1267 | } |
1268 | |
1269 | // Fill the tree if end of a detector or only the pointer to the branch!!! |
1270 | FillInfosFit(idect,1); |
1271 | |
1272 | // Memory!!! |
1273 | if (fDebug != 2) { |
1274 | delete projph; |
1275 | } |
1276 | |
1277 | } // Boucle object |
1278 | |
1279 | // Plot |
1280 | // 0 no plot, 1 and 4 error plot, 3 and 4 DB plot |
1281 | if ((fDebug == 1) || |
1282 | (fDebug == 4)){ |
1283 | PlotWritePH(); |
1284 | PlotWriteT0(); |
1285 | } |
1286 | if ((fDebug == 4) || |
1287 | (fDebug == 3)){ |
1288 | PlotPHDB(); |
1289 | PlotT0DB(); |
1290 | } |
1291 | |
1292 | // Mean Statistics |
1293 | if (fNumberFit > 0) { |
1294 | AliInfo(Form("There are %d with at least one entries.",fNumberEnt)); |
1295 | AliInfo(Form("%d fits have been proceeded (sucessfully or not...).",fNumberFit)); |
1296 | AliInfo(Form("There is a mean statistic of: %d over these fitted histograms and %d successfulled fits" |
1297 | ,(Int_t) fStatisticMean/fNumberFit,fNumberFitSuccess)); |
1298 | fStatisticMean = fStatisticMean / fNumberFit; |
1299 | } |
1300 | else { |
1301 | AliInfo(Form("There are %d with at least one entries. There is no fit!",fNumberEnt)); |
1302 | } |
1303 | |
1304 | // Write the things! |
1305 | if (fWriteCoef[1]) { |
1306 | WriteFitInfos(1); |
1307 | } |
1308 | |
1309 | return kTRUE; |
1310 | |
1311 | } |
1312 | |
1313 | //____________Functions fit Online PRF2d_______________________________________ |
1314 | Bool_t AliTRDCalibraFit::FitPRFOnline(TProfile2D *prf) |
1315 | { |
1316 | // |
1317 | // Take the 1D profiles (pad response function), projections of the 2D PRF |
1318 | // on the Xaxis, for each calibration group |
1319 | // Fit with a gaussian to reconstruct the sigma of the pad response function |
1320 | // write the results in a tree |
1321 | // |
1322 | |
1323 | // A small check |
1324 | if ((fFitPRFNDB == 2) && (!fRMSPRFOn)){ |
1325 | AliInfo("You have choosen to write the RMS method but it is not on!"); |
1326 | return kFALSE; |
1327 | } |
1328 | if ((fFitPRFNDB == 0) && (!fFitPRFOn)){ |
1329 | AliInfo("You have choosen to write the fit method but it is not on!"); |
1330 | return kFALSE; |
1331 | } |
1332 | |
1333 | // Number of Xbins (detectors or groups of pads) |
1334 | TAxis *xprf = prf->GetXaxis(); |
1335 | TAxis *yprf = prf->GetYaxis(); |
1336 | Int_t nybins = yprf->GetNbins(); |
1337 | Int_t nbins = xprf->GetNbins(); |
1338 | if (!InitFit(nbins,2)) { |
1339 | return kFALSE; |
1340 | } |
1341 | fStatisticMean = 0.0; |
1342 | fNumberFit = 0; |
1343 | fNumberFitSuccess = 0; |
1344 | fNumberEnt = 0; |
1345 | |
1346 | // Init fCountDet and fCount |
1347 | InitfCountDetAndfCount(2); |
1348 | |
1349 | // Beginning of the loop |
1350 | for (Int_t idect = fDect1[2]; idect < fDect2[2]; idect++) { |
1351 | |
1352 | TH1D *projprf = (TH1D *) prf->ProjectionY("projprf",idect+1,idect+1,(Option_t *) "e"); |
1353 | projprf->SetDirectory(0); |
1354 | |
1355 | // Number of entries for this calibration group |
1356 | Double_t nentries = 0; |
1357 | for (Int_t k = 0; k < nybins; k++) { |
1358 | nentries += prf->GetBinEntries(prf->GetBin(idect+1,k+1)); |
1359 | } |
1360 | if(nentries > 0) fNumberEnt++; |
1361 | |
1362 | // Determination of fNnZ, fNnRphi, fNfragZ and fNfragRphi |
1363 | UpdatefCountDetAndfCount(idect,2); |
1364 | |
1365 | // Reconstruction of the row and pad group: rowmin, row max ... |
1366 | ReconstructFitRowMinRowMax(idect,2); |
1367 | |
1368 | // Rebin and statistic stuff |
1369 | // This detector has not enough statistics or was off |
1370 | if (nentries < fMinEntries) { |
1371 | |
1372 | // Fill with the default values |
1373 | NotEnoughStatistic(idect,2); |
1374 | |
1375 | // Memory! |
1376 | if (fDebug != 2) { |
1377 | delete projprf; |
1378 | } |
1379 | |
1380 | continue; |
1381 | |
1382 | } |
1383 | |
1384 | // Statistics of the histos fitted |
1385 | AliInfo(Form("For the group number %d there are %f stats",idect,nentries)); |
1386 | fNumberFit++; |
1387 | fStatisticMean += nentries; |
1388 | |
1389 | // Calcul of "real" coef |
1390 | if ((fDebug == 1) || |
1391 | (fDebug == 4)) { |
1392 | CalculPRFCoefMean(fCountDet[2],(Int_t) (idect - fDect1[2])); |
1393 | } |
1394 | |
1395 | // Method Mean and fit |
1396 | // idect is egal for fDebug = 0 and 2, only to fill the hist |
1397 | if(fFitPRFOn){ |
1398 | FitPRF((TH1 *) projprf,(Int_t) (idect - fDect1[2])); |
1399 | } |
1400 | if(fRMSPRFOn){ |
1401 | RmsPRF((TH1 *) projprf,(Int_t) (idect - fDect1[2])); |
1402 | } |
1403 | |
1404 | |
1405 | // Visualise the detector for fDebug 3 or 4 |
1406 | // Here is the reconstruction of the pad and row group is used! |
1407 | if (fDebug >= 3) { |
1408 | FillCoefPRFDB(); |
1409 | } |
1410 | |
1411 | // Fill the tree if end of a detector or only the pointer to the branch!!! |
1412 | FillInfosFit(idect,2); |
1413 | |
1414 | // Memory!!! |
1415 | if (fDebug != 2) { |
1416 | delete projprf; |
1417 | } |
1418 | |
1419 | } // Boucle object |
1420 | |
1421 | // Plot |
1422 | // No plot, 1 and 4 error plot, 3 and 4 DB plot |
1423 | if ((fDebug == 1) || |
1424 | (fDebug == 4)) { |
1425 | PlotWritePRF(); |
1426 | } |
1427 | if ((fDebug == 4) || |
1428 | (fDebug == 3)){ |
1429 | PlotPRFDB(); |
1430 | } |
1431 | |
1432 | // Mean Statistic |
1433 | if (fNumberFit > 0) { |
1434 | AliInfo(Form("There are %d with at least one entries.",fNumberEnt)); |
1435 | AliInfo(Form("%d fits have been proceeded (sucessfully or not...).",fNumberFit)); |
1436 | AliInfo(Form("There is a mean statistic of: %d over these fitted histograms and %d successfulled fits" |
1437 | ,(Int_t) fStatisticMean/fNumberFit,fNumberFitSuccess)); |
1438 | fStatisticMean = fStatisticMean / fNumberFit; |
1439 | } |
1440 | else { |
1441 | AliInfo(Form("There are %d with at least one entries. There is no fit!",fNumberEnt)); |
1442 | } |
1443 | |
1444 | // Write the things! |
1445 | if (fWriteCoef[2]) { |
1446 | WriteFitInfos(2); |
1447 | } |
1448 | |
1449 | return kTRUE; |
1450 | |
1451 | } |
1452 | |
1453 | //____________Functions fit Online PRF2d_______________________________________ |
1454 | Bool_t AliTRDCalibraFit::FitPRFOnline() |
1455 | { |
1456 | // |
1457 | // Reconstruct the 1D histo (pad response function) from the vectorPRD for |
1458 | // each calibration group |
1459 | // Fit with a gaussian to reconstruct the sigma of the pad response function |
1460 | // write the results in a tree |
1461 | // |
1462 | |
1463 | // A small check |
1464 | if ((fFitPRFNDB == 2) && (!fRMSPRFOn)){ |
1465 | AliInfo("You have choosen to write the RMS method but it is not on!"); |
1466 | return kFALSE; |
1467 | } |
1468 | if ((fFitPRFNDB == 0) && (!fFitPRFOn)){ |
1469 | AliInfo("You have choosen to write the fit method but it is not on!"); |
1470 | return kFALSE; |
1471 | } |
1472 | |
1473 | // Warning |
1474 | if (!fCalibraVector) { |
1475 | AliError("You have first to set the calibravector before using this function!"); |
1476 | return kFALSE; |
1477 | } |
1478 | |
1479 | // Number of Xbins (detectors or groups of pads) |
1480 | if (!InitFit(0,2)) { |
1481 | return kFALSE; |
1482 | } |
1483 | fStatisticMean = 0.0; |
1484 | fNumberFit = 0; |
1485 | fNumberFitSuccess = 0; |
1486 | fNumberEnt = 0; |
1487 | |
1488 | // Init fCountDet and fCount |
1489 | InitfCountDetAndfCount(2); |
1490 | |
1491 | // Beginning of the loop |
1492 | for (Int_t idect = fDect1[2]; idect < fDect2[2]; idect++) { |
1493 | |
1494 | // Search if the group is in the VectorCH |
1495 | Int_t place = fCalibraVector->SearchInVector(idect,2); |
1496 | |
1497 | // Is in |
1498 | TH1F *projprf = 0x0; |
1499 | TString name("PRF"); |
1500 | name += idect; |
1501 | if (place != -1) { |
1502 | //Entries |
1503 | fNumberEnt++; |
1504 | projprf = CorrectTheError((TGraphErrors *) (fCalibraVector->ConvertVectorPHisto(place,(const char *)name))); |
1505 | projprf->SetDirectory(0); |
1506 | } |
1507 | |
1508 | // Determination of fNnZ, fNnRphi, fNfragZ and fNfragRphi |
1509 | UpdatefCountDetAndfCount(idect,2); |
1510 | |
1511 | // Reconstruction of the row and pad group: rowmin, row max ... |
1512 | ReconstructFitRowMinRowMax(idect,2); |
1513 | |
1514 | // Rebin and statistic stuff |
1515 | // This detector has not enough statistics or was off |
1516 | if ((place == -1) || |
1517 | ((place != -1) && |
1518 | (fEntriesCurrent < fMinEntries))) { |
1519 | |
1520 | // Fill with the default values |
1521 | NotEnoughStatistic(idect,2); |
1522 | |
1523 | // Memory |
1524 | if (fDebug != 2) { |
1525 | delete projprf; |
1526 | } |
1527 | |
1528 | continue; |
1529 | |
1530 | } |
1531 | |
1532 | // Statistic of the histos fitted |
1533 | AliInfo(Form("For the group number %d there are %d stats", idect,fEntriesCurrent)); |
1534 | fNumberFit++; |
1535 | fStatisticMean += fEntriesCurrent; |
1536 | |
1537 | // Calcul of "real" coef |
1538 | if ((fDebug == 1) || |
1539 | (fDebug == 4)) { |
1540 | CalculPRFCoefMean(fCountDet[2],(Int_t) (idect-fDect1[2])); |
1541 | } |
1542 | |
1543 | // Method Mean and fit |
1544 | // idect is egal for fDebug = 0 and 2, only to fill the hist |
1545 | if(fFitPRFOn){ |
1546 | FitPRF((TH1 *) projprf,(Int_t) (idect-fDect1[2])); |
1547 | } |
1548 | if(fRMSPRFOn){ |
1549 | RmsPRF((TH1 *) projprf,(Int_t) (idect-fDect1[2])); |
1550 | } |
1551 | |
1552 | // Visualise the detector for fDebug 3 or 4 |
1553 | // Here is the reconstruction of the pad and row group is used! |
1554 | if (fDebug >= 3) { |
1555 | FillCoefPRFDB(); |
1556 | } |
1557 | // Fill the tree if end of a detector or only the pointer to the branch!!! |
1558 | FillInfosFit(idect,2); |
1559 | |
1560 | // Memory!!! |
1561 | if (fDebug != 2) { |
1562 | delete projprf; |
1563 | } |
1564 | |
1565 | } // Boucle object |
1566 | |
1567 | // Plot |
1568 | // No plot, 1 and 4 error plot, 3 and 4 DB plot |
1569 | if ((fDebug == 1) || |
1570 | (fDebug == 4)) { |
1571 | PlotWritePRF(); |
1572 | } |
1573 | if ((fDebug == 4) || |
1574 | (fDebug == 3)) { |
1575 | PlotPRFDB(); |
1576 | } |
1577 | |
1578 | // Mean Statistics |
1579 | if (fNumberFit > 0) { |
1580 | AliInfo(Form("There are %d with at least one entries.",fNumberEnt)); |
1581 | AliInfo(Form("%d fits have been proceeded (sucessfully or not...).",fNumberFit)); |
1582 | AliInfo(Form("There is a mean statistic of: %d over these fitted histograms and %d successfulled fits" |
1583 | ,(Int_t) fStatisticMean/fNumberFit,fNumberFitSuccess)); |
1584 | } |
1585 | else { |
1586 | AliInfo(Form("There are %d with at least one entries. There is no fit!",fNumberEnt)); |
1587 | } |
1588 | |
1589 | // Write the things! |
1590 | if (fWriteCoef[2]) { |
1591 | WriteFitInfos(2); |
1592 | } |
1593 | |
1594 | return kTRUE; |
1595 | |
1596 | } |
1597 | |
1598 | //____________Functions fit Online PRF2d_______________________________________ |
1599 | Bool_t AliTRDCalibraFit::FitPRFOnline(TTree *tree) |
1600 | { |
1601 | // |
1602 | // Look if the calibration group can be found in the tree, if yes take |
1603 | // the histo, fit it, and write the results in a tree |
1604 | // |
1605 | |
1606 | // A small check |
1607 | if ((fFitPRFNDB == 2) && (!fRMSPRFOn)){ |
1608 | AliInfo("You have choosen to write the RMS method but it is not on!"); |
1609 | return kFALSE; |
1610 | } |
1611 | if ((fFitPRFNDB == 0) && (!fFitPRFOn)){ |
1612 | AliInfo("You have choosen to write the fit method but it is not on!"); |
1613 | return kFALSE; |
1614 | } |
1615 | |
1616 | // Number of Xbins (detectors or groups of pads) |
1617 | if (!InitFit(0,2)) { |
1618 | return kFALSE; |
1619 | } |
1620 | fStatisticMean = 0.0; |
1621 | fNumberFit = 0; |
1622 | fNumberFitSuccess = 0; |
1623 | fNumberEnt = 0; |
1624 | |
1625 | // Initialise |
1626 | fCalibraVector = new AliTRDCalibraVector(); |
1627 | |
1628 | // Init fCountDet and fCount |
1629 | InitfCountDetAndfCount(2); |
1630 | TGraphErrors *projprftree = 0x0; |
1631 | tree->SetBranchAddress("histo",&projprftree); |
1632 | TObjArray *vectorplace = fCalibraVector->ConvertTreeVector(tree); |
1633 | |
1634 | // Beginning of the loop |
1635 | for (Int_t idect = fDect1[2]; idect < fDect2[2]; idect++) { |
1636 | |
1637 | // Search if the group is in the VectorCH |
1638 | Int_t place = fCalibraVector->SearchInTreeVector(vectorplace,idect); |
1639 | |
1640 | // Is in |
1641 | TH1F *projprf = 0x0; |
1642 | if (place != -1) { |
1643 | //Entries |
1644 | fNumberEnt++; |
1645 | // Variable |
1646 | tree->GetEntry(place); |
1647 | projprf = CorrectTheError(projprftree); |
1648 | } |
1649 | |
1650 | // Determination of fNnZ, fNnRphi, fNfragZ and fNfragRphi |
1651 | UpdatefCountDetAndfCount(idect,2); |
1652 | |
1653 | // Reconstruction of the row and pad group: rowmin, row max ... |
1654 | ReconstructFitRowMinRowMax(idect,2); |
1655 | |
1656 | // Rebin and statistic stuff |
1657 | // This detector has not enough statistics or was off |
1658 | if ((place == -1) || |
1659 | ((place != -1) && |
1660 | (fEntriesCurrent < fMinEntries))) { |
1661 | |
1662 | // Fill with the default values |
1663 | NotEnoughStatistic(idect,2); |
1664 | |
1665 | // Memory!!! |
1666 | if (fDebug != 2) { |
1667 | delete projprf; |
1668 | } |
1669 | |
1670 | continue; |
1671 | |
1672 | } |
1673 | |
1674 | // Statistics of the histos fitted |
1675 | AliInfo(Form("For the group number %d there are %d stats",idect,fEntriesCurrent)); |
1676 | fNumberFit++; |
1677 | fStatisticMean += fEntriesCurrent; |
1678 | |
1679 | // Calcul of "real" coef |
1680 | if ((fDebug == 1) || |
1681 | (fDebug == 4)){ |
1682 | CalculPRFCoefMean(fCountDet[2],(Int_t) (idect - fDect1[2])); |
1683 | } |
1684 | |
1685 | // Method Mean and fit |
1686 | // idect is egal for fDebug = 0 and 2, only to fill the hist |
1687 | if(fFitPRFOn){ |
1688 | FitPRF((TH1 *) projprf,(Int_t) (idect - fDect1[2])); |
1689 | } |
1690 | if(fRMSPRFOn){ |
1691 | RmsPRF((TH1 *) projprf,(Int_t) (idect - fDect1[2])); |
1692 | } |
1693 | |
1694 | // Visualise the detector for fDebug 3 or 4 |
1695 | // Here is the reconstruction of the pad and row group is used! |
1696 | if (fDebug >= 3) { |
1697 | FillCoefPRFDB(); |
1698 | } |
1699 | // Fill the tree if end of a detector or only the pointer to the branch!!! |
1700 | FillInfosFit(idect,2); |
1701 | |
1702 | // Memory!!! |
1703 | if (fDebug != 2) { |
1704 | delete projprf; |
1705 | } |
1706 | |
1707 | } // Boucle object |
1708 | |
1709 | // Plot |
1710 | // No plot, 1 and 4 error plot, 3 and 4 DB plot |
1711 | if ((fDebug == 1) || |
1712 | (fDebug == 4)){ |
1713 | PlotWritePRF(); |
1714 | } |
1715 | if ((fDebug == 4) || |
1716 | (fDebug == 3)){ |
1717 | PlotPRFDB(); |
1718 | } |
1719 | |
1720 | // Mean Statistics |
1721 | if (fNumberFit > 0) { |
1722 | AliInfo(Form("There are %d with at least one entries.",fNumberEnt)); |
1723 | AliInfo(Form("%d fits have been proceeded (sucessfully or not...).",fNumberFit)); |
1724 | AliInfo(Form("There is a mean statistic of: %d over these fitted histograms and %d successfulled fits" |
1725 | ,(Int_t) fStatisticMean/fNumberFit,fNumberFitSuccess)); |
1726 | fStatisticMean = fStatisticMean / fNumberFit; |
1727 | } |
1728 | else { |
1729 | AliInfo(Form("There are %d with at least one entries. There is no fit!",fNumberEnt)); |
1730 | } |
1731 | |
1732 | // Write the things! |
1733 | if (fWriteCoef[2]) { |
1734 | WriteFitInfos(2); |
1735 | } |
1736 | |
1737 | return kTRUE; |
1738 | |
1739 | } |
1740 | |
1741 | //____________Functions for seeing if the pad is really okey___________________ |
1742 | |
1743 | //_____________________________________________________________________________ |
1744 | Bool_t AliTRDCalibraFit::SetModeCalibrationFromTObject(TObject *object, Int_t i) |
1745 | { |
1746 | // |
1747 | // Set fNz[i] and fNrphi[i] of the AliTRDCalibraFit::Instance() |
1748 | // corresponding to the given TObject |
1749 | // |
1750 | |
1751 | const char *nametitle = object->GetTitle(); |
1752 | |
1753 | // Some patterns |
1754 | const Char_t *patternz0 = "Nz0"; |
1755 | const Char_t *patternz1 = "Nz1"; |
1756 | const Char_t *patternz2 = "Nz2"; |
1757 | const Char_t *patternz3 = "Nz3"; |
1758 | const Char_t *patternz4 = "Nz4"; |
1759 | const Char_t *patternrphi0 = "Nrphi0"; |
1760 | const Char_t *patternrphi1 = "Nrphi1"; |
1761 | const Char_t *patternrphi2 = "Nrphi2"; |
1762 | const Char_t *patternrphi3 = "Nrphi3"; |
1763 | const Char_t *patternrphi4 = "Nrphi4"; |
1764 | const Char_t *patternrphi5 = "Nrphi5"; |
1765 | const Char_t *patternrphi6 = "Nrphi6"; |
1766 | |
1767 | UShort_t testz = 0; |
1768 | UShort_t testrphi = 0; |
1769 | |
1770 | // Nz mode |
1771 | if (strstr(nametitle,patternz0)) { |
1772 | testz++; |
1773 | fCalibraMode->SetNz(i, 0); |
1774 | } |
1775 | if (strstr(nametitle,patternz1)) { |
1776 | testz++; |
1777 | fCalibraMode->SetNz(i ,1); |
1778 | } |
1779 | if (strstr(nametitle,patternz2)) { |
1780 | testz++; |
1781 | fCalibraMode->SetNz(i ,2); |
1782 | } |
1783 | if (strstr(nametitle,patternz3)) { |
1784 | testz++; |
1785 | fCalibraMode->SetNz(i ,3); |
1786 | } |
1787 | if (strstr(nametitle,patternz4)) { |
1788 | testz++; |
1789 | fCalibraMode->SetNz(i ,4); |
1790 | } |
1791 | |
1792 | // Nrphi mode |
1793 | if (strstr(nametitle,patternrphi0)) { |
1794 | testrphi++; |
1795 | fCalibraMode->SetNrphi(i ,0); |
1796 | } |
1797 | if (strstr(nametitle,patternrphi1)) { |
1798 | testrphi++; |
1799 | fCalibraMode->SetNrphi(i, 1); |
1800 | } |
1801 | if (strstr(nametitle,patternrphi2)) { |
1802 | testrphi++; |
1803 | fCalibraMode->SetNrphi(i, 2); |
1804 | } |
1805 | if (strstr(nametitle,patternrphi3)) { |
1806 | testrphi++; |
1807 | fCalibraMode->SetNrphi(i, 3); |
1808 | } |
1809 | if (strstr(nametitle,patternrphi4)) { |
1810 | testrphi++; |
1811 | fCalibraMode->SetNrphi(i, 4); |
1812 | } |
1813 | if (strstr(nametitle,patternrphi5)) { |
1814 | testrphi++; |
1815 | fCalibraMode->SetNrphi(i, 5); |
1816 | } |
1817 | if (strstr(nametitle,patternrphi6)) { |
1818 | testrphi++; |
1819 | fCalibraMode->SetNrphi(i, 6); |
1820 | } |
1821 | |
1822 | // Look if all is okey |
1823 | if ((testz == 1) && |
1824 | (testrphi == 1)) { |
1825 | return kTRUE; |
1826 | } |
1827 | else { |
1828 | fCalibraMode->SetNrphi(i ,0); |
1829 | fCalibraMode->SetNz(i ,0); |
1830 | return kFALSE; |
1831 | } |
1832 | |
1833 | } |
1834 | |
1835 | //_____________________________________________________________________________ |
1836 | AliTRDCalDet *AliTRDCalibraFit::CreateDetObjectTree(TTree *tree, Int_t i) |
1837 | { |
1838 | // |
1839 | // It creates the AliTRDCalDet object from the tree of the coefficient |
1840 | // for the calibration i (i != 2) |
1841 | // It takes the mean value of the coefficients per detector |
1842 | // This object has to be written in the database |
1843 | // |
1844 | |
1845 | // Create the DetObject |
1846 | AliTRDCalDet *object = 0x0; |
1847 | if (i == 0) { |
1848 | object = new AliTRDCalDet("ChamberGainFactor","GainFactor (detector value)"); |
1849 | } |
1850 | if (i == 1) { |
1851 | object = new AliTRDCalDet("ChamberVdrift","TRD drift velocities (detector value)"); |
1852 | } |
1853 | else { |
1854 | object = new AliTRDCalDet("ChamberT0","T0 (detector value)"); |
1855 | } |
1856 | |
1857 | // Read the Tree |
1858 | Int_t detector = -1; |
1859 | Float_t values[2304]; |
1860 | tree->SetBranchAddress("detector",&detector); |
1861 | if (i == 0) { |
1862 | tree->SetBranchAddress("gainPad",values); |
1863 | } |
1864 | if (i == 1) { |
1865 | tree->SetBranchAddress("vdrift" ,values); |
1866 | } |
1867 | if (i == 3) { |
1868 | tree->SetBranchAddress("t0" ,values); |
1869 | } |
1870 | |
1871 | // For calculating the mean |
1872 | Float_t mean = 0.0; |
1873 | Int_t nto = 0; |
1874 | Int_t numberofentries = tree->GetEntries(); |
1875 | |
1876 | if (numberofentries != 540) { |
1877 | AliInfo("The tree is not complete"); |
1878 | } |
1879 | |
1880 | for (Int_t det = 0; det < numberofentries; ++det) { |
1881 | tree->GetEntry(det); |
1882 | if (GetChamber(detector) == 2) { |
1883 | nto = 1728; |
1884 | } |
1885 | else { |
1886 | nto = 2304; |
1887 | } |
1888 | mean = 0.0; |
1889 | if(i != 3){ |
1890 | for (Int_t k = 0; k < nto; k++) { |
1891 | mean += TMath::Abs(values[k]) / nto; |
1892 | } |
1893 | } |
1894 | else { |
1895 | for (Int_t k = 0; k < nto; k++) { |
1896 | if(k == 0) mean = values[k]; |
1897 | if(mean > values[k]) mean = values[k]; |
1898 | } |
1899 | } |
1900 | object->SetValue(detector,mean); |
1901 | } |
1902 | |
1903 | return object; |
1904 | |
1905 | } |
1906 | |
1907 | //_____________________________________________________________________________ |
1908 | TObject *AliTRDCalibraFit::CreatePadObjectTree(TTree *tree, Int_t i |
1909 | , AliTRDCalDet *detobject) |
1910 | { |
1911 | // |
1912 | // It Creates the AliTRDCalPad object from the tree of the |
1913 | // coefficient for the calibration i (i != 2) |
1914 | // You need first to create the object for the detectors, |
1915 | // where the mean value is put. |
1916 | // This object has to be written in the database |
1917 | // |
1918 | |
1919 | // Create the DetObject |
1920 | AliTRDCalPad *object = 0x0; |
1921 | if (i == 0) { |
1922 | object = new AliTRDCalPad("GainFactor","GainFactor (local variations)"); |
1923 | } |
1924 | if (i == 1) { |
1925 | object = new AliTRDCalPad("LocalVdrift","TRD drift velocities (local variations)"); |
1926 | } |
1927 | else { |
1928 | object = new AliTRDCalPad("LocalT0","T0 (local variations)"); |
1929 | } |
1930 | |
1931 | // Read the Tree |
1932 | Int_t detector = -1; |
1933 | Float_t values[2304]; |
1934 | tree->SetBranchAddress("detector",&detector); |
1935 | if (i == 0) { |
1936 | tree->SetBranchAddress("gainPad",values); |
1937 | } |
1938 | if (i == 1) { |
1939 | tree->SetBranchAddress("vdrift" ,values); |
1940 | } |
1941 | if (i == 3) { |
1942 | tree->SetBranchAddress("t0" ,values); |
1943 | } |
1944 | |
1945 | // Variables |
1946 | Float_t mean = 0.0; |
1947 | Int_t numberofentries = tree->GetEntries(); |
1948 | |
1949 | if (numberofentries != 540) { |
1950 | AliInfo("The tree is not complete"); |
1951 | } |
1952 | |
1953 | for (Int_t det = 0; det < numberofentries; ++det) { |
1954 | tree->GetEntry(det); |
1955 | AliTRDCalROC *calROC = object->GetCalROC(detector); |
1956 | mean = detobject->GetValue(detector); |
1957 | if ((mean == 0) && (i != 3)) { |
1958 | continue; |
1959 | } |
1960 | Int_t rowMax = calROC->GetNrows(); |
1961 | Int_t colMax = calROC->GetNcols(); |
1962 | for (Int_t row = 0; row < rowMax; ++row) { |
1963 | for (Int_t col = 0; col < colMax; ++col) { |
1964 | if(i != 3) calROC->SetValue(col,row,TMath::Abs(values[(Int_t) (col*rowMax+row)])/mean); |
1965 | else calROC->SetValue(col,row,values[(Int_t) (col*rowMax+row)]-mean); |
1966 | |
1967 | } // Col |
1968 | } // Row |
1969 | } |
1970 | |
1971 | return object; |
1972 | |
1973 | } |
1974 | |
1975 | //_____________________________________________________________________________ |
1976 | TObject *AliTRDCalibraFit::CreatePadObjectTree(TTree *tree) |
1977 | { |
1978 | // |
1979 | // It Creates the AliTRDCalPad object from the tree of the |
1980 | // coefficient for the calibration PRF (i = 2) |
1981 | // This object has to be written in the database |
1982 | // |
1983 | |
1984 | // Create the DetObject |
1985 | AliTRDCalPad *object = new AliTRDCalPad("PRFWidth","PRFWidth"); |
1986 | |
1987 | // Read the Tree |
1988 | Int_t detector = -1; |
1989 | Float_t values[2304]; |
1990 | tree->SetBranchAddress("detector",&detector); |
1991 | tree->SetBranchAddress("width" ,values); |
1992 | |
1993 | // Variables |
1994 | Int_t numberofentries = tree->GetEntries(); |
1995 | |
1996 | if (numberofentries != 540) { |
1997 | AliInfo("The tree is not complete"); |
1998 | } |
1999 | |
2000 | for (Int_t det = 0; det < numberofentries; ++det) { |
2001 | tree->GetEntry(det); |
2002 | AliTRDCalROC *calROC = object->GetCalROC(detector); |
2003 | Int_t rowMax = calROC->GetNrows(); |
2004 | Int_t colMax = calROC->GetNcols(); |
2005 | for (Int_t row = 0; row < rowMax; ++row) { |
2006 | for (Int_t col = 0; col < colMax; ++col) { |
2007 | calROC->SetValue(col,row,TMath::Abs(values[(Int_t) (col*rowMax+row)])); |
2008 | } // Col |
2009 | } // Row |
2010 | } |
2011 | |
2012 | return object; |
2013 | |
2014 | } |
2015 | |
2016 | //_____________________________________________________________________________ |
2017 | void AliTRDCalibraFit::SetPeriodeFitPH(Int_t periodeFitPH) |
2018 | { |
2019 | // |
2020 | // Set FitPH if 1 then each detector will be fitted |
2021 | // |
2022 | |
2023 | if (periodeFitPH > 0) { |
2024 | fFitPHPeriode = periodeFitPH; |
2025 | } |
2026 | else { |
2027 | AliInfo("periodeFitPH must be higher than 0!"); |
2028 | } |
2029 | |
2030 | } |
2031 | |
2032 | //_____________________________________________________________________________ |
2033 | void AliTRDCalibraFit::SetFitPRFNDB(Int_t fitPRFNDB) |
2034 | { |
2035 | // |
2036 | // TO choose the method that you write into the database |
2037 | // |
2038 | |
2039 | if ((fitPRFNDB >= 3) || (fitPRFNDB == 1)) { |
2040 | AliInfo("fitPRFNDB is not a correct number!"); |
2041 | } |
2042 | else { |
2043 | fFitPRFNDB = fitPRFNDB; |
2044 | } |
2045 | |
2046 | } |
2047 | |
2048 | //_____________________________________________________________________________ |
2049 | void AliTRDCalibraFit::SetFitChargeNDB(Int_t fitChargeNDB) |
2050 | { |
2051 | // |
2052 | // To choose the method that you write into the database |
2053 | // |
2054 | if ((fitChargeNDB >= 5) || (fitChargeNDB == 3)) { |
2055 | AliInfo("fitChargeNDB is not a correct number!"); |
2056 | } |
2057 | else { |
2058 | fFitChargeNDB = fitChargeNDB; |
2059 | } |
2060 | |
2061 | } |
2062 | |
2063 | //_____________________________________________________________________________ |
2064 | void AliTRDCalibraFit::SetFitPHNDB(Int_t fitPHNDB) |
2065 | { |
2066 | // |
2067 | // To choose the method that you write into the database |
2068 | // |
2069 | |
2070 | if ((fitPHNDB >= 4) || (fitPHNDB == 2)) { |
2071 | AliInfo("fitPHNDB is not a correct number!"); |
2072 | } |
2073 | else { |
2074 | fFitPHNDB = fitPHNDB; |
2075 | } |
2076 | |
2077 | } |
2078 | |
2079 | //_____________________________________________________________________________ |
2080 | void AliTRDCalibraFit::SetBeginFitCharge(Float_t beginFitCharge) |
2081 | { |
2082 | // |
2083 | // The fit of the deposited charge distribution begins at |
2084 | // histo->Mean()/beginFitCharge |
2085 | // You can here set beginFitCharge |
2086 | // |
2087 | |
2088 | if (beginFitCharge > 0) { |
2089 | fBeginFitCharge = beginFitCharge; |
2090 | } |
2091 | else { |
2092 | AliInfo("beginFitCharge must be strict positif!"); |
2093 | } |
2094 | |
2095 | } |
2096 | |
2097 | //_____________________________________________________________________________ |
2098 | void AliTRDCalibraFit::SetT0Shift(Float_t t0Shift) |
2099 | { |
2100 | // |
2101 | // The t0 calculated with the maximum positif slope is shift from t0Shift |
2102 | // You can here set t0Shift |
2103 | // |
2104 | |
2105 | if (t0Shift > 0) { |
2106 | fT0Shift = t0Shift; |
2107 | } |
2108 | else { |
2109 | AliInfo("t0Shift must be strict positif!"); |
2110 | } |
2111 | |
2112 | } |
2113 | |
2114 | //_____________________________________________________________________________ |
2115 | void AliTRDCalibraFit::SetRangeFitPRF(Float_t rangeFitPRF) |
2116 | { |
2117 | // |
2118 | // The fit of the PRF is from -rangeFitPRF to rangeFitPRF |
2119 | // You can here set rangeFitPRF |
2120 | // |
2121 | |
2122 | if ((rangeFitPRF > 0) && |
2123 | (rangeFitPRF <= 1.5)) { |
2124 | fRangeFitPRF = rangeFitPRF; |
2125 | } |
2126 | else { |
2127 | AliInfo("rangeFitPRF must be between 0 and 1.0"); |
2128 | } |
2129 | |
2130 | } |
2131 | |
2132 | //_____________________________________________________________________________ |
2133 | void AliTRDCalibraFit::SetRebin(Short_t rebin) |
2134 | { |
2135 | // |
2136 | // Rebin with rebin time less bins the Ch histo |
2137 | // You can set here rebin that should divide the number of bins of CH histo |
2138 | // |
2139 | |
2140 | if (rebin > 0) { |
2141 | fRebin = rebin; |
2142 | AliInfo("You have to be sure that fRebin divides fNumberBinCharge used!"); |
2143 | } |
2144 | else { |
2145 | AliInfo("You have to choose a positiv value!"); |
2146 | } |
2147 | |
2148 | } |
2149 | |
2150 | //____________Pad Calibration Public___________________________________________ |
2151 | |
2152 | //____________Protected Functions______________________________________________ |
2153 | //____________Create the 2D histo to be filled online__________________________ |
2154 | // |
2155 | //____________Fit______________________________________________________________ |
2156 | //____________Create histos if fDebug == 1 or fDebug >= 3______________________ |
2157 | |
2158 | //_____________________________________________________________________________ |
2159 | void AliTRDCalibraFit::InitArrayFitPH() |
2160 | { |
2161 | // |
2162 | // Initialise fCoefVdrift[3] and fCoefVdriftE[2] to the right dimension |
2163 | // |
2164 | |
2165 | Int_t nbins = fDect2[1]-fDect1[1]; |
2166 | |
2167 | fCoefVdrift[2] = new Double_t[nbins]; |
2168 | |
2169 | // Init the pointer to nbins |
2170 | if (fFitPHOn) { |
2171 | fCoefVdrift[0] = new Double_t[nbins]; |
2172 | fCoefVdriftE[0] = new Double_t[nbins]; |
2173 | for(Int_t k = 0; k < nbins; k++){ |
2174 | fCoefVdriftE[0][k] = 0.0; |
2175 | } |
2176 | } |
2177 | |
2178 | |
2179 | if (fFitPol2On){ |
2180 | fCoefVdrift[1] = new Double_t[nbins]; |
2181 | fCoefVdriftE[1] = new Double_t[nbins]; |
2182 | for(Int_t k = 0; k < nbins; k++){ |
2183 | fCoefVdriftE[1][k] = 0.0; |
2184 | } |
2185 | } |
2186 | if (fFitLagrPolOn){ |
2187 | fCoefVdrift[3] = new Double_t[nbins]; |
2188 | fCoefVdriftE[2] = new Double_t[nbins]; |
2189 | for(Int_t k = 0; k < nbins; k++){ |
2190 | fCoefVdriftE[2][k] = 0.0; |
2191 | } |
2192 | } |
2193 | |
2194 | } |
2195 | |
2196 | //_____________________________________________________________________________ |
2197 | void AliTRDCalibraFit::InitArrayFitT0() |
2198 | { |
2199 | // |
2200 | // Initialise fCoefT0[3] and fCoefT0E[2] to the right dimension |
2201 | // |
2202 | |
2203 | Int_t nbins = fDect2[1]-fDect1[1]; |
2204 | |
2205 | fCoefT0[2] = new Double_t[nbins]; |
2206 | |
2207 | // Init the pointer to nbins |
2208 | if(fFitPHOn){ |
2209 | fCoefT0[0] = new Double_t[nbins]; |
2210 | fCoefT0E[0] = new Double_t[nbins]; |
2211 | for(Int_t k = 0; k < nbins; k++){ |
2212 | fCoefT0E[0][k] = 0.0; |
2213 | } |
2214 | } |
2215 | if(fFitPol2On){ |
2216 | fCoefT0[1] = new Double_t[nbins]; |
2217 | fCoefT0E[1] = new Double_t[nbins]; |
2218 | for(Int_t k = 0; k < nbins; k++){ |
2219 | fCoefT0E[1][k] = 0.0; |
2220 | } |
2221 | } |
2222 | if(fFitLagrPolOn){ |
2223 | fCoefT0[3] = new Double_t[nbins]; |
2224 | fCoefT0E[2] = new Double_t[nbins]; |
2225 | for(Int_t k = 0; k < nbins; k++){ |
2226 | fCoefT0E[2][k] = 0.0; |
2227 | } |
2228 | } |
2229 | |
2230 | } |
2231 | |
2232 | //_____________________________________________________________________________ |
2233 | void AliTRDCalibraFit::InitArrayFitCH() |
2234 | { |
2235 | // |
2236 | // Initialise fCoefCharge[4] and fCoefChargeE[3] to the right dimension |
2237 | // |
2238 | |
2239 | Int_t nbins = fDect2[0]-fDect1[0]; |
2240 | |
2241 | //Init the pointer to nbins |
2242 | if(fMeanChargeOn){ |
2243 | fCoefCharge[1] = new Double_t[nbins]; |
2244 | fCoefChargeE[1] = new Double_t[nbins]; |
2245 | for(Int_t k = 0; k < nbins; k++){ |
2246 | fCoefChargeE[1][k] = 0.0; |
2247 | } |
2248 | } |
2249 | if(fFitMeanWOn){ |
2250 | fCoefCharge[4] = new Double_t[nbins]; |
2251 | fCoefChargeE[3] = new Double_t[nbins]; |
2252 | for(Int_t k = 0; k < nbins; k++){ |
2253 | fCoefChargeE[3][k] = 0.0; |
2254 | } |
2255 | } |
2256 | if(fFitChargeOn){ |
2257 | fCoefCharge[0] = new Double_t[nbins]; |
2258 | fCoefChargeE[0] = new Double_t[nbins]; |
2259 | for(Int_t k = 0; k < nbins; k++){ |
2260 | fCoefChargeE[0][k] = 0.0; |
2261 | } |
2262 | } |
2263 | |
2264 | if(fFitChargeBisOn){ |
2265 | fCoefCharge[2] = new Double_t[nbins]; |
2266 | fCoefChargeE[2] = new Double_t[nbins]; |
2267 | for(Int_t k = 0; k < nbins; k++){ |
2268 | fCoefChargeE[2][k] = 0.0; |
2269 | } |
2270 | } |
2271 | |
2272 | fCoefCharge[3] = new Double_t[nbins]; |
2273 | |
2274 | } |
2275 | |
2276 | //_____________________________________________________________________________ |
2277 | void AliTRDCalibraFit::InitArrayFitPRF() |
2278 | { |
2279 | // |
2280 | // Initialise fCoefPRF[2] and fCoefPRFE to the right dimension |
2281 | // |
2282 | |
2283 | Int_t nbins = fDect2[2]-fDect1[2]; |
2284 | fCoefPRF[1] = new Double_t[nbins]; |
2285 | |
2286 | //Init the pointer to nbins |
2287 | if(fFitPRFOn){ |
2288 | fCoefPRF[0] = new Double_t[nbins]; |
2289 | fCoefPRFE[0] = new Double_t[nbins]; |
2290 | for(Int_t k = 0; k < nbins; k++){ |
2291 | fCoefPRFE[0][k] = 0.0; |
2292 | } |
2293 | } |
2294 | if(fRMSPRFOn){ |
2295 | fCoefPRF[2] = new Double_t[nbins]; |
2296 | fCoefPRFE[1] = new Double_t[nbins]; |
2297 | for(Int_t k = 0; k < nbins; k++){ |
2298 | fCoefPRFE[1][k] = 0.0; |
2299 | } |
2300 | } |
2301 | } |
2302 | |
2303 | //_____________________________________________________________________________ |
2304 | void AliTRDCalibraFit::CreateFitHistoPRFDB(Int_t rowMax, Int_t colMax) |
2305 | { |
2306 | // |
2307 | // Create the histos for fDebug = 3 and fDebug = 4 (Fit functions) |
2308 | // |
2309 | if(fFitPRFOn){ |
2310 | fCoefPRFDB[0] = new TH2F("coefPRF0","",rowMax,0,rowMax,colMax,0,colMax); |
2311 | fCoefPRFDB[0]->SetStats(0); |
2312 | fCoefPRFDB[0]->SetXTitle("row Number"); |
2313 | fCoefPRFDB[0]->SetYTitle("col Number"); |
2314 | fCoefPRFDB[0]->SetZTitle("PRF width [pad width units]"); |
2315 | fCoefPRFDB[0]->SetFillColor(6); |
2316 | fCoefPRFDB[0]->SetLineColor(6); |
2317 | } |
2318 | if(fRMSPRFOn){ |
2319 | fCoefPRFDB[1] = new TH2F("coefPRF1","",rowMax,0,rowMax,colMax,0,colMax); |
2320 | fCoefPRFDB[1]->SetStats(0); |
2321 | fCoefPRFDB[1]->SetXTitle("row Number"); |
2322 | fCoefPRFDB[1]->SetYTitle("col Number"); |
2323 | fCoefPRFDB[1]->SetZTitle("PRF width [pad width units]"); |
2324 | fCoefPRFDB[1]->SetFillColor(1); |
2325 | fCoefPRFDB[1]->SetLineColor(1); |
2326 | } |
2327 | } |
2328 | |
2329 | //_____________________________________________________________________________ |
2330 | void AliTRDCalibraFit::CreateFitHistoCHDB(Int_t rowMax, Int_t colMax) |
2331 | { |
2332 | // |
2333 | // Create the histos for fDebug = 3 and fDebug = 4 (Fit functions) |
2334 | // |
2335 | |
2336 | if(fFitChargeOn){ |
2337 | fCoefChargeDB[0] = new TH2F("coefchargedb0","",rowMax,0,rowMax,colMax,0,colMax); |
2338 | fCoefChargeDB[0]->SetStats(0); |
2339 | fCoefChargeDB[0]->SetXTitle("row Number"); |
2340 | fCoefChargeDB[0]->SetYTitle("col Number"); |
2341 | fCoefChargeDB[0]->SetZTitle("f_{g} Fit method"); |
2342 | fCoefChargeDB[0]->SetFillColor(6); |
2343 | fCoefChargeDB[0]->SetLineColor(6); |
2344 | } |
2345 | if(fFitChargeBisOn){ |
2346 | fCoefChargeDB[2] = new TH2F("coefchargedb2","",rowMax,0,rowMax,colMax,0,colMax); |
2347 | fCoefChargeDB[2]->SetStats(0); |
2348 | fCoefChargeDB[2]->SetXTitle("row Number"); |
2349 | fCoefChargeDB[2]->SetYTitle("col Number"); |
2350 | fCoefChargeDB[2]->SetZTitle("f_{g} Fitbis method"); |
2351 | fCoefChargeDB[2]->SetFillColor(8); |
2352 | fCoefChargeDB[2]->SetLineColor(8); |
2353 | } |
2354 | if(fFitMeanWOn){ |
2355 | fCoefChargeDB[3] = new TH2F("coefchargedb3","",rowMax,0,rowMax,colMax,0,colMax); |
2356 | fCoefChargeDB[3]->SetStats(0); |
2357 | fCoefChargeDB[3]->SetXTitle("row Number"); |
2358 | fCoefChargeDB[3]->SetYTitle("col Number"); |
2359 | fCoefChargeDB[3]->SetFillColor(1); |
2360 | fCoefChargeDB[3]->SetLineColor(1); |
2361 | |
2362 | } |
2363 | if(fMeanChargeOn){ |
2364 | fCoefChargeDB[1] = new TH2F("coefchargedb1","",rowMax,0,rowMax,colMax,0,colMax); |
2365 | fCoefChargeDB[1]->SetStats(0); |
2366 | fCoefChargeDB[1]->SetXTitle("row Number"); |
2367 | fCoefChargeDB[1]->SetYTitle("col Number"); |
2368 | fCoefChargeDB[1]->SetZTitle("f_{g} Mean method"); |
2369 | fCoefChargeDB[1]->SetFillColor(2); |
2370 | fCoefChargeDB[1]->SetLineColor(2); |
2371 | } |
2372 | |
2373 | } |
2374 | |
2375 | //_____________________________________________________________________________ |
2376 | void AliTRDCalibraFit::CreateFitHistoPHDB(Int_t rowMax, Int_t colMax) |
2377 | { |
2378 | // |
2379 | // Create the histos for fDebug = 3 and fDebug = 4 (Fit functions) |
2380 | // |
2381 | |
2382 | if(fFitPHOn){ |
2383 | fCoefVdriftDB[0] = new TH2F("coefvdriftdb0","",rowMax,0,rowMax,colMax,0,colMax); |
2384 | fCoefVdriftDB[0]->SetStats(0); |
2385 | fCoefVdriftDB[0]->SetXTitle("row Number"); |
2386 | fCoefVdriftDB[0]->SetYTitle("col Number"); |
2387 | fCoefVdriftDB[0]->SetZTitle("v_{drift} Fit method"); |
2388 | fCoefVdriftDB[0]->SetFillColor(6); |
2389 | fCoefVdriftDB[0]->SetLineColor(6); |
2390 | } |
2391 | |
2392 | if(fFitPol2On){ |
2393 | fCoefVdriftDB[1] = new TH2F("coefvdriftdb1","",rowMax,0,rowMax,colMax,0,colMax); |
2394 | fCoefVdriftDB[1]->SetStats(0); |
2395 | fCoefVdriftDB[1]->SetXTitle("row Number"); |
2396 | fCoefVdriftDB[1]->SetYTitle("col Number"); |
2397 | fCoefVdriftDB[1]->SetZTitle("v_{drift} slope method"); |
2398 | fCoefVdriftDB[1]->SetFillColor(2); |
2399 | fCoefVdriftDB[1]->SetLineColor(2); |
2400 | } |
2401 | if(fFitLagrPolOn){ |
2402 | fCoefVdriftDB[2] = new TH2F("coefvdriftdb1","",rowMax,0,rowMax,colMax,0,colMax); |
2403 | fCoefVdriftDB[2]->SetStats(0); |
2404 | fCoefVdriftDB[2]->SetXTitle("row Number"); |
2405 | fCoefVdriftDB[2]->SetYTitle("col Number"); |
2406 | fCoefVdriftDB[2]->SetZTitle("v_{drift} slope method"); |
2407 | fCoefVdriftDB[2]->SetFillColor(1); |
2408 | fCoefVdriftDB[2]->SetLineColor(1); |
2409 | } |
2410 | |
2411 | } |
2412 | |
2413 | //_____________________________________________________________________________ |
2414 | void AliTRDCalibraFit::CreateFitHistoT0DB(Int_t rowMax, Int_t colMax) |
2415 | { |
2416 | // |
2417 | // Create the histos for fDebug = 3 and fDebug = 4 (Fit functions) |
2418 | // |
2419 | |
2420 | if(fFitPHOn){ |
2421 | fCoefT0DB[0] = new TH2F("coefT0db0","",rowMax,0,rowMax,colMax,0,colMax); |
2422 | fCoefT0DB[0]->SetStats(0); |
2423 | fCoefT0DB[0]->SetXTitle("row Number"); |
2424 | fCoefT0DB[0]->SetYTitle("col Number"); |
2425 | fCoefT0DB[0]->SetZTitle("t0 Fit method"); |
2426 | fCoefT0DB[0]->SetFillColor(6); |
2427 | fCoefT0DB[0]->SetLineColor(6); |
2428 | } |
2429 | if(fFitPol2On){ |
2430 | fCoefT0DB[1] = new TH2F("coefT0db1","",rowMax,0,rowMax,colMax,0,colMax); |
2431 | fCoefT0DB[1]->SetStats(0); |
2432 | fCoefT0DB[1]->SetXTitle("row Number"); |
2433 | fCoefT0DB[1]->SetYTitle("col Number"); |
2434 | fCoefT0DB[1]->SetZTitle("t0 slope method"); |
2435 | fCoefT0DB[1]->SetFillColor(2); |
2436 | fCoefT0DB[1]->SetLineColor(2); |
2437 | } |
2438 | if(fFitLagrPolOn){ |
2439 | fCoefT0DB[2] = new TH2F("coefT0db1","",rowMax,0,rowMax,colMax,0,colMax); |
2440 | fCoefT0DB[2]->SetStats(0); |
2441 | fCoefT0DB[2]->SetXTitle("row Number"); |
2442 | fCoefT0DB[2]->SetYTitle("col Number"); |
2443 | fCoefT0DB[2]->SetZTitle("t0 slope method"); |
2444 | fCoefT0DB[2]->SetFillColor(1); |
2445 | fCoefT0DB[2]->SetLineColor(1); |
2446 | } |
2447 | |
2448 | } |
2449 | |
2450 | //_____________________________________________________________________________ |
2451 | Bool_t AliTRDCalibraFit::FillVectorFitCH(Int_t countdet) |
2452 | { |
2453 | // |
2454 | // For the Fit functions fill the vector FitCH special for the gain calibration |
2455 | // |
2456 | |
2457 | AliTRDFitCHInfo *fitCHInfo = new AliTRDFitCHInfo(); |
2458 | |
2459 | Int_t ntotal = 1; |
2460 | if (GetChamber(countdet) == 2) { |
2461 | ntotal = 1728; |
2462 | } |
2463 | else { |
2464 | ntotal = 2304; |
2465 | } |
2466 | |
2467 | //printf("For the detector %d , ntotal %d and fCoefCH[0] %f\n",countdet,ntotal,fCoefCH[0]); |
2468 | Float_t *coef = new Float_t[ntotal]; |
2469 | for (Int_t i = 0; i < ntotal; i++) { |
2470 | coef[i] = fCoefCH[i]; |
2471 | } |
2472 | |
2473 | Int_t detector = countdet; |
2474 | // Set |
2475 | fitCHInfo->SetCoef(coef); |
2476 | fitCHInfo->SetDetector(detector); |
2477 | fVectorFitCH->Add((TObject *) fitCHInfo); |
2478 | |
2479 | return kTRUE; |
2480 | |
2481 | } |
2482 | |
2483 | //____________Functions for initialising the AliTRDCalibraFit in the code_________ |
2484 | Bool_t AliTRDCalibraFit::InitFit(Int_t nbins, Int_t i) |
2485 | { |
2486 | // |
2487 | // Init the calibration mode (Nz, Nrphi), the histograms for |
2488 | // debugging the fit methods if fDebug > 0, |
2489 | // |
2490 | |
2491 | gStyle->SetPalette(1); |
2492 | gStyle->SetOptStat(1111); |
2493 | gStyle->SetPadBorderMode(0); |
2494 | gStyle->SetCanvasColor(10); |
2495 | gStyle->SetPadLeftMargin(0.13); |
2496 | gStyle->SetPadRightMargin(0.01); |
2497 | |
2498 | // Get the parameter object |
2499 | AliTRDCommonParam *parCom = AliTRDCommonParam::Instance(); |
2500 | if (!parCom) { |
2501 | AliInfo("Could not get CommonParam"); |
2502 | return kFALSE; |
2503 | } |
2504 | |
2505 | // Mode groups of pads: the total number of bins! |
2506 | Int_t numberofbinsexpected = 0; |
2507 | fCalibraMode->ModePadCalibration(2,i); |
2508 | fCalibraMode->ModePadFragmentation(0,2,0,i); |
2509 | fCalibraMode->SetDetChamb2(i); |
2510 | if (fDebug == 1) { |
2511 | AliInfo(Form("For the chamber 2: %d",fCalibraMode->GetDetChamb2(i))); |
2512 | } |
2513 | numberofbinsexpected += 6 * 18 * fCalibraMode->GetDetChamb2(i); |
2514 | fCalibraMode->ModePadCalibration(0,i); |
2515 | fCalibraMode->ModePadFragmentation(0,0,0,i); |
2516 | fCalibraMode->SetDetChamb0(i); |
2517 | if (fDebug == 1) { |
2518 | AliInfo(Form("For the other chamber 0: %d",fCalibraMode->GetDetChamb0(i))); |
2519 | } |
2520 | numberofbinsexpected += 6 * 4 * 18 * fCalibraMode->GetDetChamb0(i); |
2521 | |
2522 | // Quick verification that we have the good pad calibration mode if 2D histos! |
2523 | if (nbins != 0) { |
2524 | if (numberofbinsexpected != nbins) { |
2525 | AliInfo("It doesn't correspond to the mode of pad group calibration!"); |
2526 | return kFALSE; |
2527 | } |
2528 | } |
2529 | |
2530 | // Security for fDebug 3 and 4 |
2531 | if ((fDebug >= 3) && |
2532 | ((fDet[0] > 5) || |
2533 | (fDet[1] > 4) || |
2534 | (fDet[2] > 17))) { |
2535 | AliInfo("This detector doesn't exit!"); |
2536 | return kFALSE; |
2537 | } |
2538 | |
2539 | // Determine fDet1 and fDet2 |
2540 | fDect1[i] = -1; |
2541 | fDect2[i] = -1; |
2542 | if (fDebug == 2) { |
2543 | fDect1[i] = fFitVoir; |
2544 | fDect2[i] = fDect1[i] +1; |
2545 | } |
2546 | if (fDebug <= 1) { |
2547 | fDect1[i] = 0; |
2548 | fDect2[i] = numberofbinsexpected; |
2549 | } |
2550 | if (fDebug >= 3) { |
2551 | fCalibraMode->CalculXBins(AliTRDgeometry::GetDetector(fDet[0],fDet[1],fDet[2]),i); |
2552 | fDect1[i] = fCalibraMode->GetXbins(i); |
2553 | fCalibraMode->CalculXBins((AliTRDgeometry::GetDetector(fDet[0],fDet[1],fDet[2])+1),i); |
2554 | fDect2[i] = fCalibraMode->GetXbins(i); |
2555 | } |
2556 | |
2557 | // Create the histos for debugging |
2558 | // CH |
2559 | if (i == 0) { |
2560 | |
2561 | gDirectory = gROOT; |
2562 | // Init the VectorFitCH |
2563 | fVectorFitCH = new TObjArray(); |
2564 | fCoefCH = new Float_t[2304]; |
2565 | for (Int_t k = 0; k < 2304; k++) { |
2566 | fCoefCH[k] = 0.0; |
2567 | } |
2568 | fScaleFitFactor = 0.0; |
2569 | |
2570 | // Number of Xbins(detectors or groups of pads) if Vector2d |
2571 | // Quick verification that we are not out of range! |
2572 | if (fCalibraVector) { |
2573 | if ((nbins == 0) && |
2574 | (fCalibraVector->GetVectorCH()->GetEntriesFast() > 0) && |
2575 | ((Int_t) fCalibraVector->GetPlaCH()->GetEntriesFast() > 0)) { |
2576 | if ((Int_t) fCalibraVector->GetVectorCH()->GetEntriesFast() > numberofbinsexpected) { |
2577 | AliInfo("ch doesn't correspond to the mode of pad group calibration!"); |
2578 | return kFALSE; |
2579 | } |
2580 | if ((Int_t) fCalibraVector->GetVectorCH()->GetEntriesFast() != |
2581 | (Int_t) fCalibraVector->GetPlaCH()->GetEntriesFast()) { |
2582 | AliInfo("VectorCH doesn't correspond to PlaCH!"); |
2583 | return kFALSE; |
2584 | } |
2585 | } |
2586 | } |
2587 | |
2588 | // |
2589 | // Debugging: Create the histos |
2590 | // |
2591 | |
2592 | // fDebug == 0 nothing |
2593 | |
2594 | // fDebug == 1 |
2595 | if (fDebug == 1) { |
2596 | InitArrayFitCH(); |
2597 | } |
2598 | |
2599 | // fDebug == 2 and fFitVoir no histo |
2600 | if (fDebug == 2) { |
2601 | if (fFitVoir < numberofbinsexpected) { |
2602 | AliInfo(Form("We will see the fit of the object %d",fFitVoir)); |
2603 | } |
2604 | else { |
2605 | AliInfo("fFitVoir is out of range of the histo!"); |
2606 | return kFALSE; |
2607 | } |
2608 | } |
2609 | |
2610 | // fDebug == 3 or 4 and fDet |
2611 | if (fDebug >= 3) { |
2612 | if ((fCalibraMode->GetNz(0) == 0) && (fCalibraMode->GetNrphi(0) == 0)) { |
2613 | AliInfo("Do you really want to see one detector without pad groups?"); |
2614 | return kFALSE; |
2615 | } |
2616 | else { |
2617 | AliInfo(Form("You will see the detector: iPlane %d, iChamb %d, iSect %d" |
2618 | ,fDet[0],fDet[1],fDet[2])); |
2619 | // A little geometry: |
2620 | Int_t rowMax = parCom->GetRowMax(fDet[0],fDet[1],fDet[2]); |
2621 | Int_t colMax = parCom->GetColMax(fDet[0]); |
2622 | // Create the histos to visualise |
2623 | CreateFitHistoCHDB(rowMax,colMax); |
2624 | if (fDebug == 4) { |
2625 | InitArrayFitCH(); |
2626 | } |
2627 | } |
2628 | } |
2629 | |
2630 | } |
2631 | |
2632 | // PH and T0 |
2633 | if (i == 1) { |
2634 | |
2635 | // Number of Xbins (detectors or groups of pads) if vector2d |
2636 | // Quick verification that we are not out of range! |
2637 | if (fCalibraVector) { |
2638 | if ((nbins == 0) && |
2639 | (fCalibraVector->GetVectorPH()->GetEntriesFast() > 0) && |
2640 | ((Int_t) fCalibraVector->GetPlaPH()->GetEntriesFast() > 0)) { |
2641 | if ((Int_t) fCalibraVector->GetVectorPH()->GetEntriesFast() > numberofbinsexpected) { |
2642 | AliInfo("ph doesn't correspond to the mode of pad group calibration!"); |
2643 | return kFALSE; |
2644 | } |
2645 | if ((Int_t) fCalibraVector->GetVectorPH()->GetEntriesFast() != |
2646 | (Int_t) fCalibraVector->GetPlaPH()->GetEntriesFast()) { |
2647 | AliInfo("VectorPH doesn't correspond to PlaPH!"); |
2648 | return kFALSE; |
2649 | } |
2650 | } |
2651 | } |
2652 | |
2653 | // Init tree |
2654 | InitTreePH(); |
2655 | InitTreeT0(); |
2656 | |
2657 | // |
2658 | // Debugging: Create the histos |
2659 | // |
2660 | |
2661 | // fDebug == 0 nothing |
2662 | |
2663 | // fDebug == 1 |
2664 | if (fDebug == 1) { |
2665 | // Create the histos replique de ph |
2666 | InitArrayFitPH(); |
2667 | InitArrayFitT0(); |
2668 | } |
2669 | |
2670 | // fDebug == 2 and fFitVoir no histo |
2671 | if (fDebug == 2) { |
2672 | if (fFitVoir < numberofbinsexpected) { |
2673 | AliInfo(Form("We will see the fit of the object %d",fFitVoir)); |
2674 | } |
2675 | else { |
2676 | AliInfo("fFitVoir is out of range of the histo!"); |
2677 | return kFALSE; |
2678 | } |
2679 | } |
2680 | |
2681 | // fDebug == 3 or 4 and fDet |
2682 | if (fDebug >= 3) { |
2683 | if ((fCalibraMode->GetNz(1) == 0) && |
2684 | (fCalibraMode->GetNrphi(1) == 0)) { |
2685 | AliInfo("Do you really want to see one detector without pad groups?"); |
2686 | return kFALSE; |
2687 | } |
2688 | else { |
2689 | AliInfo(Form("You will see the detector: iPlane %d, iChamb %d, iSect %d" |
2690 | ,fDet[0],fDet[1],fDet[2])); |
2691 | // A little geometry: |
2692 | Int_t rowMax = parCom->GetRowMax(fDet[0],fDet[1],fDet[2]); |
2693 | Int_t colMax = parCom->GetColMax(fDet[0]); |
2694 | // Create the histos to visualise |
2695 | CreateFitHistoPHDB(rowMax,colMax); |
2696 | CreateFitHistoT0DB(rowMax,colMax); |
2697 | if (fDebug == 4) { |
2698 | InitArrayFitPH(); |
2699 | InitArrayFitT0(); |
2700 | } |
2701 | } |
2702 | } |
2703 | |
2704 | } |
2705 | |
2706 | // PRF |
2707 | if (i == 2) { |
2708 | |
2709 | // Number of Xbins(detectors or groups of pads) if vector2d |
2710 | if (fCalibraVector){ |
2711 | if ((nbins == 0) && |
2712 | (fCalibraVector->GetVectorPRF()->GetEntriesFast() > 0) && |
2713 | (fCalibraVector->GetPlaPRF()->GetEntriesFast() > 0)) { |
2714 | // Quick verification that we are not out of range! |
2715 | if ((Int_t) fCalibraVector->GetVectorPRF()->GetEntriesFast() > numberofbinsexpected) { |
2716 | AliInfo("ch doesn't correspond to the mode of pad group calibration!"); |
2717 | return kFALSE; |
2718 | } |
2719 | if ((Int_t) fCalibraVector->GetVectorPRF()->GetEntriesFast() != |
2720 | (Int_t) fCalibraVector->GetPlaPRF()->GetEntriesFast()) { |
2721 | AliInfo("VectorPRF doesn't correspond to PlaCH!"); |
2722 | return kFALSE; |
2723 | } |
2724 | } |
2725 | } |
2726 | |
2727 | // Init tree |
2728 | InitTreePRF(); |
2729 | |
2730 | // |
2731 | // Debugging: Create the histos |
2732 | // |
2733 | |
2734 | // fDebug == 0 nothing |
2735 | |
2736 | // fDebug == 1 |
2737 | if (fDebug == 1) { |
2738 | // Create the histos replique de ch |
2739 | InitArrayFitPRF(); |
2740 | } |
2741 | |
2742 | // fDebug == 2 and fFitVoir no histo |
2743 | if (fDebug == 2) { |
2744 | if (fFitVoir < numberofbinsexpected) { |
2745 | AliInfo(Form("We will see the fit of the object %d",fFitVoir)); |
2746 | } |
2747 | else { |
2748 | AliInfo("fFitVoir is out of range of the histo!"); |
2749 | return kFALSE; |
2750 | } |
2751 | } |
2752 | |
2753 | // fDebug == 3 or 4 and fDet |
2754 | if (fDebug >= 3) { |
2755 | if ((fCalibraMode->GetNz(2) == 0) && |
2756 | (fCalibraMode->GetNrphi(2) == 0)) { |
2757 | AliInfo("Do you really want to see one detector without pad groups?"); |
2758 | return kFALSE; |
2759 | } |
2760 | else { |
2761 | AliInfo(Form("You will see the detector: iPlane %d, iChamb %d, iSect %d" |
2762 | ,fDet[0],fDet[1],fDet[2])); |
2763 | // A little geometry: |
2764 | Int_t rowMax = parCom->GetRowMax(fDet[0],fDet[1],fDet[2]); |
2765 | Int_t colMax = parCom->GetColMax(fDet[0]); |
2766 | // Create the histos to visualise |
2767 | CreateFitHistoPRFDB(rowMax,colMax); |
2768 | if (fDebug == 4) { |
2769 | InitArrayFitPRF(); |
2770 | } |
2771 | } |
2772 | } |
2773 | |
2774 | } |
2775 | |
2776 | return kTRUE; |
2777 | |
2778 | } |
2779 | |
2780 | //____________Functions for initialising the AliTRDCalibraFit in the code_________ |
2781 | void AliTRDCalibraFit::InitfCountDetAndfCount(Int_t i) |
2782 | { |
2783 | // |
2784 | // Init the current detector where we are fCountDet and the |
2785 | // next fCount for the functions Fit... |
2786 | // |
2787 | |
2788 | // Loop on the Xbins of ch!! |
2789 | fCountDet[i] = -1; // Current detector |
2790 | fCount[i] = 0; // To find the next detector |
2791 | |
2792 | // If fDebug >= 3 |
2793 | if (fDebug >= 3) { |
2794 | |
2795 | // Set countdet to the detector |
2796 | fCountDet[i] = AliTRDgeometry::GetDetector(fDet[0],fDet[1],fDet[2]); |
2797 | |
2798 | // Determination of fNnZ, fNnRphi, fNfragZ and fNfragRphi |
2799 | fCalibraMode->ModePadCalibration(fDet[1],i); |
2800 | fCalibraMode->ModePadFragmentation(fDet[0],fDet[1],fDet[2],i); |
2801 | |
2802 | // Set counter to write at the end of the detector |
2803 | fCount[i] = fDect1[i] + fCalibraMode->GetNfragZ(i)*fCalibraMode->GetNfragRphi(i); |
2804 | |
2805 | } |
2806 | |
2807 | } |
2808 | |
2809 | //____________Functions for initialising the AliTRDCalibraFit in the code_________ |
2810 | void AliTRDCalibraFit::UpdatefCountDetAndfCount(Int_t idect, Int_t i) |
2811 | { |
2812 | // |
2813 | // See if we are in a new detector and update the |
2814 | // variables fNfragZ and fNfragRphi if yes |
2815 | // |
2816 | |
2817 | // Determination of fNnZ, fNnRphi, fNfragZ and fNfragRphi |
2818 | // If fDebug == 1 or 0 |
2819 | if ((fDebug == 0) || |
2820 | (fDebug == 1)) { |
2821 | |
2822 | if (fCount[i] == idect) { |
2823 | |
2824 | // On en est au detector |
2825 | fCountDet[i] += 1; |
2826 | |
2827 | // Determination of fNnZ, fNnRphi, fNfragZ and fNfragRphi |
2828 | fCalibraMode->ModePadCalibration((Int_t) GetChamber(fCountDet[i]),i); |
2829 | fCalibraMode->ModePadFragmentation((Int_t) GetPlane(fCountDet[i]) |
2830 | ,(Int_t) GetChamber(fCountDet[i]) |
2831 | ,(Int_t) GetSector(fCountDet[i]),i); |
2832 | |
2833 | // Set for the next detector |
2834 | fCount[i] += fCalibraMode->GetNfragZ(i)*fCalibraMode->GetNfragRphi(i); |
2835 | |
2836 | } |
2837 | |
2838 | } |
2839 | |
2840 | } |
2841 | |
2842 | //____________Functions for initialising the AliTRDCalibraFit in the code_________ |
2843 | void AliTRDCalibraFit::ReconstructFitRowMinRowMax(Int_t idect, Int_t i) |
2844 | { |
2845 | // |
2846 | // Reconstruct the min pad row, max pad row, min pad col and |
2847 | // max pad col of the calibration group for the Fit functions |
2848 | // |
2849 | |
2850 | if (fDebug < 2) { |
2851 | fCalibraMode->ReconstructionRowPadGroup((Int_t) (idect-(fCount[i]-(fCalibraMode->GetNfragZ(i) |
2852 | *fCalibraMode->GetNfragRphi(i)))),i); |
2853 | } |
2854 | if (fDebug >= 3) { |
2855 | fCalibraMode->ReconstructionRowPadGroup((Int_t) (idect-fDect1[i]),i); |
2856 | } |
2857 | |
2858 | } |
2859 | |
2860 | //____________Functions for initialising the AliTRDCalibraFit in the code_________ |
2861 | Bool_t AliTRDCalibraFit::NotEnoughStatistic(Int_t idect, Int_t i) |
2862 | { |
2863 | // |
2864 | // For the case where there are not enough entries in the histograms |
2865 | // of the calibration group, the value present in the choosen database |
2866 | // will be put. A negativ sign enables to know that a fit was not possible. |
2867 | // |
2868 | |
2869 | // Get the parameter object |
2870 | AliTRDCommonParam *parCom = AliTRDCommonParam::Instance(); |
2871 | if (!parCom) { |
2872 | AliInfo("Could not get CommonParam Manager"); |
2873 | return kFALSE; |
2874 | } |
2875 | |
2876 | // Get cal |
2877 | AliTRDcalibDB *cal = AliTRDcalibDB::Instance(); |
2878 | if (!cal) { |
2879 | AliInfo("Could not get calibDB"); |
2880 | return kFALSE; |
2881 | } |
2882 | |
2883 | if (fDebug != 2) { |
2884 | AliInfo(Form("The element %d in this detector %d has not enough statistic to be fitted" |
2885 | ,idect-(fCount[i]-(fCalibraMode->GetNfragZ(i)*fCalibraMode->GetNfragRphi(i))),fCountDet[i])); |
2886 | } |
2887 | if (fDebug == 2) { |
2888 | AliInfo("The element has not enough statistic to be fitted"); |
2889 | } |
2890 | |
2891 | if ((i == 0) && (fDebug != 2)) { |
2892 | |
2893 | // Calcul the coef from the database choosen |
2894 | CalculChargeCoefMean(fCountDet[0],(Int_t) (idect-fDect1[0]),kFALSE); |
2895 | |
2896 | // Fill the coefCH[2304] with negative value to say: not fitted |
2897 | AliInfo(Form("The row min %d, the row max %d, the colmin %d and the col max %d" |
2898 | ,fCalibraMode->GetRowMin(0) |
2899 | ,fCalibraMode->GetRowMax(0) |
2900 | ,fCalibraMode->GetColMin(0) |
2901 | ,fCalibraMode->GetColMax(0))); |
2902 | for (Int_t k = fCalibraMode->GetRowMin(0); k < fCalibraMode->GetRowMax(0); k++) { |
2903 | for (Int_t j = fCalibraMode->GetColMin(0); j < fCalibraMode->GetColMax(0); j++) { |
2904 | if (GetChamber(fCountDet[0]) == 2) { |
2905 | fCoefCH[(Int_t)(j*12+k)] = -TMath::Abs(fChargeCoef[3]); |
2906 | } |
2907 | if (GetChamber(fCountDet[0]) != 2) { |
2908 | fCoefCH[(Int_t)(j*16+k)] = -TMath::Abs(fChargeCoef[3]); |
2909 | } |
2910 | } |
2911 | } |
2912 | |
2913 | // Put the default value negative |
2914 | if ((fDebug == 1) || |
2915 | (fDebug == 4)) { |
2916 | |
2917 | if (fFitChargeBisOn) { |
2918 | fCoefCharge[2][idect-fDect1[0]]=-TMath::Abs(fChargeCoef[3]); |
2919 | } |
2920 | if (fMeanChargeOn) { |
2921 | fCoefCharge[1][idect-fDect1[0]]=-TMath::Abs(fChargeCoef[3]); |
2922 | } |
2923 | if(fFitChargeOn){ |
2924 | fCoefCharge[0][idect-fDect1[0]]=-TMath::Abs(fChargeCoef[3]); |
2925 | } |
2926 | |
2927 | } |
2928 | |
2929 | // End of one detector |
2930 | if ((idect == (fCount[0]-1))) { |
2931 | FillVectorFitCH((Int_t) fCountDet[0]); |
2932 | // Reset |
2933 | for (Int_t k = 0; k < 2304; k++) { |
2934 | fCoefCH[k] = 0.0; |
2935 | } |
2936 | } |
2937 | |
2938 | } |
2939 | |
2940 | if ((i == 1) && (fDebug != 2)) { |
2941 | |
2942 | CalculVdriftCoefMean(fCountDet[1],(Int_t) (idect-fDect1[1])); |
2943 | CalculT0CoefMean(fCountDet[1],(Int_t) (idect-fDect1[1])); |
2944 | |
2945 | // Put the default value (time0 can be negativ, so we stay with + ) |
2946 | if ((fDebug == 1) || |
2947 | (fDebug == 4)) { |
2948 | |
2949 | if (fFitPHOn) { |
2950 | fCoefVdrift[0][(idect-fDect1[1])] = -fVdriftCoef[2]; |
2951 | fCoefT0[0][(idect-fDect1[1])] = fT0Coef[2]; |
2952 | } |
2953 | |
2954 | if(fFitPol2On) { |
2955 | fCoefVdrift[1][(idect-fDect1[1])] = -fVdriftCoef[2]; |
2956 | fCoefT0[1][(idect-fDect1[1])] = fT0Coef[2]; |
2957 | } |
2958 | if(fFitLagrPolOn) { |
2959 | fCoefVdrift[3][(idect-fDect1[1])] = -fVdriftCoef[2]; |
2960 | fCoefT0[3][(idect-fDect1[1])] = fT0Coef[2]; |
2961 | } |
2962 | |
2963 | } |
2964 | |
2965 | // Put the default value |
2966 | if (fDebug >= 3) { |
2967 | if(fFitPHOn){ |
2968 | fVdriftCoef[0] = fVdriftCoef[2]; |
2969 | fT0Coef[0] = fT0Coef[2]; |
2970 | } |
2971 | if(fFitPol2On){ |
2972 | fVdriftCoef[1] = fVdriftCoef[2]; |
2973 | fT0Coef[1] = fT0Coef[2]; |
2974 | } |
2975 | if(fFitLagrPolOn){ |
2976 | fVdriftCoef[3] = fVdriftCoef[2]; |
2977 | fT0Coef[3] = fT0Coef[2]; |
2978 | } |
2979 | FillCoefVdriftDB(); |
2980 | FillCoefT0DB(); |
2981 | } |
2982 | |
2983 | // Fill the tree if end of a detector. |
2984 | // The pointer to the branch stays with the default value negative!!! |
2985 | // PH |
2986 | // Pointer to the branch |
2987 | for (Int_t k = fCalibraMode->GetRowMin(1); k < fCalibraMode->GetRowMax(1); k++) { |
2988 | for (Int_t j = fCalibraMode->GetColMin(1); j < fCalibraMode->GetColMax(1); j++) { |
2989 | if (GetChamber(fCountDet[1]) == 2) { |
2990 | fVdriftPad[(Int_t)(j*12+k)] = -TMath::Abs(fVdriftCoef[2]); |
2991 | } |
2992 | if (GetChamber(fCountDet[1]) != 2) { |
2993 | fVdriftPad[(Int_t)(j*16+k)] = -TMath::Abs(fVdriftCoef[2]); |
2994 | } |
2995 | } |
2996 | } |
2997 | |
2998 | // End of one detector |
2999 | if ((idect == (fCount[1]-1)) && (fDebug != 2)) { |
3000 | FillTreeVdrift((Int_t) fCountDet[1]); |
3001 | } |
3002 | |
3003 | // T0 |
3004 | // Fill the tree if end of a detector. |
3005 | // The pointer to the branch stays with the default value positive!!! |
3006 | // Pointer to the branch |
3007 | for (Int_t k = fCalibraMode->GetRowMin(1); k < fCalibraMode->GetRowMax(1); k++) { |
3008 | for (Int_t j = fCalibraMode->GetColMin(1); j < fCalibraMode->GetColMax(1); j++) { |
3009 | if (GetChamber(fCountDet[1]) == 2) { |
3010 | fT0Pad[(Int_t)(j*12+k)] = fT0Coef[2]; |
3011 | } |
3012 | if (GetChamber(fCountDet[1]) != 2) { |
3013 | fT0Pad[(Int_t)(j*16+k)] = fT0Coef[2]; |
3014 | } |
3015 | } |
3016 | } |
3017 | |
3018 | // End of one detector |
3019 | if ((idect == (fCount[1]-1)) && (fDebug != 2)) { |
3020 | FillTreeT0((Int_t) fCountDet[1]); |
3021 | } |
3022 | |
3023 | } |
3024 | |
3025 | if ((i == 2) && (fDebug != 2)) { |
3026 | |
3027 | CalculPRFCoefMean(fCountDet[2],(Int_t) (idect-fDect1[2])); |
3028 | |
3029 | if ((fDebug == 1) || |
3030 | (fDebug == 4)) { |
3031 | if(fFitPRFOn){ |
3032 | fCoefPRF[0][(idect-fDect1[2])] = -fPRFCoef[1]; |
3033 | } |
3034 | if(fRMSPRFOn){ |
3035 | fCoefPRF[2][(idect-fDect1[2])] = -fPRFCoef[1]; |
3036 | } |
3037 | } |
3038 | |
3039 | if (fDebug >= 3){ |
3040 | if(fFitPRFOn){ |
3041 | fPRFCoef[0] = fPRFCoef[1]; |
3042 | } |
3043 | if(fRMSPRFOn){ |
3044 | fPRFCoef[2] = fPRFCoef[1]; |
3045 | } |
3046 | FillCoefPRFDB(); |
3047 | } |
3048 | |
3049 | // Fill the tree if end of a detector. |
3050 | // The pointer to the branch stays with the default value 1.5!!! |
3051 | // Pointer to the branch |
3052 | for (Int_t k = fCalibraMode->GetRowMin(2); k < fCalibraMode->GetRowMax(2); k++) { |
3053 | for (Int_t j = fCalibraMode->GetColMin(2); j < fCalibraMode->GetColMax(2); j++) { |
3054 | if((parCom->GetColMax(GetPlane(fCountDet[2])) != (j+1)) && (j != 0)){ |
3055 | if (GetChamber(fCountDet[2]) == 2) { |
3056 | fPRFPad[(Int_t)(j*12+k)] = -fPRFCoef[1]; |
3057 | } |
3058 | if (GetChamber(fCountDet[2]) != 2) { |
3059 | fPRFPad[(Int_t)(j*16+k)] = -fPRFCoef[1]; |
3060 | } |
3061 | } |
3062 | else { |
3063 | if (fAccCDB) { |
3064 | if (GetChamber(fCountDet[2]) == 2) { |
3065 | fPRFPad[(Int_t)(j*12+k)] = -((Float_t) cal->GetPRFWidth(fCountDet[2],j,k)); |
3066 | } |
3067 | if (GetChamber(fCountDet[2]) != 2) { |
3068 | fPRFPad[(Int_t)(j*16+k)] = -((Float_t) cal->GetPRFWidth(fCountDet[2],j,k)); |
3069 | } |
3070 | } |
3071 | if (!fAccCDB) { |
3072 | if (GetChamber(fCountDet[2]) == 2) { |
3073 | fPRFPad[(Int_t)(j*12+k)] = -((Float_t) GetPRFDefault(GetPlane(fCountDet[2]))); |
3074 | } |
3075 | if (GetChamber(fCountDet[2]) != 2) { |
3076 | fPRFPad[(Int_t)(j*16+k)] = -((Float_t) GetPRFDefault(GetPlane(fCountDet[2]))); |
3077 | } |
3078 | } |
3079 | } |
3080 | } |
3081 | } |
3082 | |
3083 | // End of one detector |
3084 | if ((idect == (fCount[2]-1)) && (fDebug != 2)) { |
3085 | FillTreePRF((Int_t) fCountDet[2]); |
3086 | } |
3087 | |
3088 | } |
3089 | |
3090 | return kTRUE; |
3091 | |
3092 | } |
3093 | |
3094 | //____________Functions for initialising the AliTRDCalibraFit in the code_________ |
3095 | Bool_t AliTRDCalibraFit::FillInfosFit(Int_t idect, Int_t i) |
3096 | { |
3097 | // |
3098 | // Fill the coefficients found with the fits or other |
3099 | // methods from the Fit functions |
3100 | // |
3101 | |
3102 | // Get the parameter object |
3103 | AliTRDCommonParam *parCom = AliTRDCommonParam::Instance(); |
3104 | if (!parCom) { |
3105 | AliInfo("Could not get CommonParam Manager"); |
3106 | return kFALSE; |
3107 | } |
3108 | |
3109 | // Get cal |
3110 | AliTRDcalibDB *cal = AliTRDcalibDB::Instance(); |
3111 | if (!cal) { |
3112 | AliInfo("Could not get calibDB"); |
3113 | return kFALSE; |
3114 | } |
3115 | |
3116 | if ((i == 0) && (fDebug != 2)) { |
3117 | // Fill the coefCH[2304] with fChargeCoef[0] |
3118 | // that would be negativ only if the fit failed totally |
3119 | //printf("for fCountDet %d we have %f\n",fCountDet[0],fChargeCoef[fFitChargeNDB]); |
3120 | //printf("RowMin %d RowMax %d ColMin %d ColMax %d\n",fCalibraMode->GetRowMin(0),fCalibraMode->GetRowMax(0),fCalibraMode->GetColMin(0),fCalibraMode->GetColMax(0)); |
3121 | for (Int_t k = fCalibraMode->GetRowMin(0); k < fCalibraMode->GetRowMax(0); k++) { |
3122 | for (Int_t j = fCalibraMode->GetColMin(0); j < fCalibraMode->GetColMax(0); j++) { |
3123 | if (GetChamber(fCountDet[0]) == 2) { |
3124 | fCoefCH[(Int_t)(j*12+k)] = fChargeCoef[fFitChargeNDB]; |
3125 | } |
3126 | if (GetChamber(fCountDet[0]) != 2) { |
3127 | fCoefCH[(Int_t)(j*16+k)] = fChargeCoef[fFitChargeNDB]; |
3128 | } |
3129 | } |
3130 | } |
3131 | // End of one detector |
3132 | if ((idect == (fCount[0]-1))) { |
3133 | FillVectorFitCH((Int_t) fCountDet[0]); |
3134 | // Reset |
3135 | for (Int_t k = 0; k < 2304; k++) { |
3136 | fCoefCH[k] = 0.0; |
3137 | } |
3138 | } |
3139 | } |
3140 | |
3141 | if ((i == 1) && (fDebug != 2)) { |
3142 | |
3143 | // PH |
3144 | // Pointer to the branch: fVdriftCoef[1] will ne negativ only if the fit failed totally |
3145 | for (Int_t k = fCalibraMode->GetRowMin(1); k < fCalibraMode->GetRowMax(1); k++) { |
3146 | for (Int_t j = fCalibraMode->GetColMin(1); j < fCalibraMode->GetColMax(1); j++) { |
3147 | if (GetChamber(fCountDet[1]) == 2) { |
3148 | fVdriftPad[(Int_t)(j*12+k)]=fVdriftCoef[fFitPHNDB]; |
3149 | } |
3150 | if (GetChamber(fCountDet[1]) != 2) { |
3151 | fVdriftPad[(Int_t)(j*16+k)]=fVdriftCoef[fFitPHNDB]; |
3152 | } |
3153 | } |
3154 | } |
3155 | // End of one detector |
3156 | if ((idect == (fCount[1]-1)) && (fDebug != 2)) { |
3157 | FillTreeVdrift((Int_t) fCountDet[1]); |
3158 | } |
3159 | |
3160 | // T0 |
3161 | // Pointer to the branch: fT0Coef[1] will ne negativ only if the fit failed totally |
3162 | for (Int_t k = fCalibraMode->GetRowMin(1); k < fCalibraMode->GetRowMax(1); k++) { |
3163 | for (Int_t j = fCalibraMode->GetColMin(1); j < fCalibraMode->GetColMax(1); j++) { |
3164 | if (GetChamber(fCountDet[1]) == 2) { |
3165 | fT0Pad[(Int_t)(j*12+k)]=fT0Coef[fFitPHNDB]; |
3166 | } |
3167 | if (GetChamber(fCountDet[1]) != 2) { |
3168 | fT0Pad[(Int_t)(j*16+k)]=fT0Coef[fFitPHNDB]; |
3169 | } |
3170 | } |
3171 | } |
3172 | // End of one detector |
3173 | if ((idect == (fCount[1]-1)) && (fDebug != 2)) { |
3174 | FillTreeT0((Int_t) fCountDet[1]); |
3175 | } |
3176 | |
3177 | } |
3178 | |
3179 | if ((i == 2) && (fDebug != 2)) { |
3180 | // Pointer to the branch |
3181 | for (Int_t k = fCalibraMode->GetRowMin(2); k < fCalibraMode->GetRowMax(2); k++) { |
3182 | for (Int_t j = fCalibraMode->GetColMin(2); j < fCalibraMode->GetColMax(2); j++) { |
3183 | if ((parCom->GetColMax(GetPlane(fCountDet[2])) != (j+1)) && (j != 0)) { |
3184 | if (GetChamber(fCountDet[2]) == 2) { |
3185 | fPRFPad[(Int_t)(j*12+k)] = fPRFCoef[fFitPRFNDB]; |
3186 | } |
3187 | if (GetChamber(fCountDet[2]) != 2) { |
3188 | fPRFPad[(Int_t)(j*16+k)] = fPRFCoef[fFitPRFNDB]; |
3189 | } |
3190 | } |
3191 | else { |
3192 | if (fAccCDB) { |
3193 | if (GetChamber(fCountDet[2]) == 2) { |
3194 | fPRFPad[(Int_t)(j*12+k)] = (Float_t) cal->GetPRFWidth(fCountDet[2],j,k); |
3195 | } |
3196 | if (GetChamber(fCountDet[2]) != 2) { |
3197 | fPRFPad[(Int_t)(j*16+k)] = (Float_t) cal->GetPRFWidth(fCountDet[2],j,k); |
3198 | } |
3199 | } |
3200 | if (!fAccCDB) { |
3201 | if (GetChamber(fCountDet[2]) == 2) { |
3202 | fPRFPad[(Int_t)(j*12+k)] = (Float_t) GetPRFDefault(GetPlane(fCountDet[2])); |
3203 | } |
3204 | if (GetChamber(fCountDet[2]) != 2) { |
3205 | fPRFPad[(Int_t)(j*16+k)] = (Float_t) GetPRFDefault(GetPlane(fCountDet[2])); |
3206 | } |
3207 | } |
3208 | } |
3209 | } |
3210 | } |
3211 | // End of one detector |
3212 | if ((idect == (fCount[2]-1)) && (fDebug != 2)) { |
3213 | FillTreePRF((Int_t) fCountDet[2]); |
3214 | } |
3215 | } |
3216 | |
3217 | return kTRUE; |
3218 | |
3219 | } |
3220 | |
3221 | //____________Functions for initialising the AliTRDCalibraFit in the code_________ |
3222 | Bool_t AliTRDCalibraFit::WriteFitInfos(Int_t i) |
3223 | { |
3224 | // |
3225 | // In the case the user wants to write a file with a tree of the found |
3226 | // coefficients for the calibration before putting them in the database |
3227 | // |
3228 | |
3229 | TFile *fout = TFile::Open(fWriteNameCoef,"UPDATE"); |
3230 | // Check if the file could be opened |
3231 | if (!fout || !fout->IsOpen()) { |
3232 | AliInfo("No File found!"); |
3233 | return kFALSE; |
3234 | } |
3235 | |
3236 | if ((i == 0) && (fDebug != 2)) { |
3237 | // The DB stuff |
3238 | if ((fDebug == 4) || |
3239 | (fDebug == 3)) { |
3240 | WriteCHDB(fout); |
3241 | } |
3242 | // The tree |
3243 | fout->WriteTObject(fGain,fGain->GetName(),(Option_t *) "writedelete"); |
3244 | } |
3245 | |
3246 | if ((i == 1) && (fDebug != 2)) { |
3247 | // The DB stuff |
3248 | if ((fDebug == 4) || |
3249 | (fDebug == 3)) { |
3250 | WritePHDB(fout); |
3251 | } |
3252 | // The tree |
3253 | fout->WriteTObject(fVdrift,fVdrift->GetName(),(Option_t *) "writedelete"); |
3254 | // The DB stuff |
3255 | if ((fDebug == 4) || |
3256 | (fDebug == 3)) { |
3257 | WriteT0DB(fout); |
3258 | } |
3259 | // The tree |
3260 | fout->WriteTObject(fT0,fT0->GetName(),(Option_t *) "writedelete"); |
3261 | } |
3262 | |
3263 | if ((i == 2) && (fDebug != 2)) { |
3264 | // The DB stuff |
3265 | if ((fDebug == 4) || |
3266 | (fDebug == 3)) { |
3267 | WritePRFDB(fout); |
3268 | } |
3269 | // The tree |
3270 | fout->WriteTObject(fPRF,fPRF->GetName(),(Option_t *) "writedelete"); |
3271 | } |
3272 | |
3273 | fout->Close(); |
3274 | |
3275 | return kTRUE; |
3276 | |
3277 | } |
3278 | |
3279 | // |
3280 | //____________Fill Coef DB in case of visualisation of one detector____________ |
3281 | // |
3282 | |
3283 | //_____________________________________________________________________________ |
3284 | void AliTRDCalibraFit::FillCoefVdriftDB() |
3285 | { |
3286 | // |
3287 | // Fill the histos for fDebug = 3 and fDebug = 4 to visualise the detector |
3288 | // |
3289 | |
3290 | for (Int_t row = fCalibraMode->GetRowMin(1); row < fCalibraMode->GetRowMax(1); row++) { |
3291 | for (Int_t col = fCalibraMode->GetColMin(1); col < fCalibraMode->GetColMax(1); col++) { |
3292 | if(fFitPol2On){ |
3293 | fCoefVdriftDB[1]->SetBinContent(row+1,col+1,TMath::Abs(fVdriftCoef[1])); |
3294 | } |
3295 | if (fFitPHOn ) { |
3296 | fCoefVdriftDB[0]->SetBinContent(row+1,col+1,TMath::Abs(fVdriftCoef[0])); |
3297 | } |
3298 | if (fFitLagrPolOn ) { |
3299 | fCoefVdriftDB[2]->SetBinContent(row+1,col+1,TMath::Abs(fVdriftCoef[3])); |
3300 | } |
3301 | } |
3302 | } |
3303 | |
3304 | } |
3305 | |
3306 | //_____________________________________________________________________________ |
3307 | void AliTRDCalibraFit::FillCoefT0DB() |
3308 | { |
3309 | // |
3310 | // Fill the histos for fDebug = 3 and fDebug = 4 to visualise the detector |
3311 | // |
3312 | |
3313 | for (Int_t row = fCalibraMode->GetRowMin(1); row < fCalibraMode->GetRowMax(1); row++) { |
3314 | for (Int_t col = fCalibraMode->GetColMin(1); col < fCalibraMode->GetColMax(1); col++) { |
3315 | if(fFitPol2On){ |
3316 | fCoefT0DB[1]->SetBinContent(row+1,col+1,TMath::Abs(fT0Coef[1])); |
3317 | } |
3318 | if (fFitPHOn) { |
3319 | fCoefT0DB[0]->SetBinContent(row+1,col+1,TMath::Abs(fT0Coef[0])); |
3320 | } |
3321 | if (fFitLagrPolOn) { |
3322 | fCoefT0DB[2]->SetBinContent(row+1,col+1,TMath::Abs(fT0Coef[3])); |
3323 | } |
3324 | } |
3325 | } |
3326 | |
3327 | } |
3328 | |
3329 | //_____________________________________________________________________________ |
3330 | void AliTRDCalibraFit::FillCoefChargeDB() |
3331 | { |
3332 | // |
3333 | // Fill the histos for fDebug = 3 and fDebug = 4 to visualise the detector |
3334 | // |
3335 | |
3336 | for (Int_t row = fCalibraMode->GetRowMin(0); row < fCalibraMode->GetRowMax(0); row++) { |
3337 | for (Int_t col = fCalibraMode->GetColMin(0); col < fCalibraMode->GetColMax(0); col++) { |
3338 | if (fMeanChargeOn) { |
3339 | fCoefChargeDB[1]->SetBinContent(row+1,col+1,TMath::Abs(fChargeCoef[1])); |
3340 | } |
3341 | if (fFitChargeBisOn) { |
3342 | fCoefChargeDB[2]->SetBinContent(row+1,col+1,TMath::Abs(fChargeCoef[2])); |
3343 | } |
3344 | if(fFitChargeOn){ |
3345 | fCoefChargeDB[0]->SetBinContent(row+1,col+1,TMath::Abs(fChargeCoef[0])); |
3346 | } |
3347 | if(fFitMeanWOn){ |
3348 | fCoefChargeDB[3]->SetBinContent(row+1,col+1,TMath::Abs(fChargeCoef[4])); |
3349 | } |
3350 | } |
3351 | } |
3352 | |
3353 | } |
3354 | |
3355 | //_____________________________________________________________________________ |
3356 | void AliTRDCalibraFit::FillCoefPRFDB() |
3357 | { |
3358 | // |
3359 | // Fill the histos for fDebug = 3 and fDebug = 4 to visualise the detector |
3360 | // |
3361 | if(fFitPRFOn){ |
3362 | for (Int_t row = fCalibraMode->GetRowMin(2); row < fCalibraMode->GetRowMax(2); row++) { |
3363 | for (Int_t col = fCalibraMode->GetColMin(2); col < fCalibraMode->GetColMax(2); col++) { |
3364 | fCoefPRFDB[0]->SetBinContent(row+1,col+1,fPRFCoef[0]); |
3365 | } |
3366 | } |
3367 | } |
3368 | if(fRMSPRFOn){ |
3369 | for (Int_t row = fCalibraMode->GetRowMin(2); row < fCalibraMode->GetRowMax(2); row++) { |
3370 | for (Int_t col = fCalibraMode->GetColMin(2); col < fCalibraMode->GetColMax(2); col++) { |
3371 | fCoefPRFDB[1]->SetBinContent(row+1,col+1,fPRFCoef[2]); |
3372 | } |
3373 | } |
3374 | } |
3375 | |
3376 | } |
3377 | |
3378 | // |
3379 | //____________Plot histos CoefPRF....__________________________________________ |
3380 | // |
3381 | |
3382 | //_____________________________________________________________________________ |
3383 | void AliTRDCalibraFit::PlotWriteCH() |
3384 | { |
3385 | // |
3386 | // Scale the coefficients to one, create the graph errors and write them if wanted |
3387 | // |
3388 | |
3389 | //TObjArray of the grapherrors and so on |
3390 | TObjArray *listofgraphs = new TObjArray(); |
3391 | |
3392 | Int_t nbins = fDect2[0]-fDect1[0]; |
3393 | |
3394 | // Scale the coefs |
3395 | // We will check fScaleFitFactor for the fFitChargeNDB, otherwise we calculate and normalise to 1 |
3396 | // It can be that fScaleFitFactor is different from scale if we have taken a no default database as reference |
3397 | // |
3398 | |
3399 | //counter |
3400 | Int_t counter[4]; |
3401 | counter[0] = 0; //how many groups are fitted for 0 |
3402 | counter[1] = 0; //how many groups are with mean for 1 |
3403 | counter[2] = 0; //how many groups are fitted for 2 |
3404 | counter[3] = 0; //how many groups are fitted for 4 |
3405 | Double_t sum = 0.0; |
3406 | Double_t scale = 1.0; |
3407 | |
3408 | // Scale the histo |
3409 | // Is -1 if no fit or mean, is 1 if fit or mean |
3410 | Double_t *xValuesFitted = new Double_t[nbins]; |
3411 | Double_t *xValuesFittedMean = new Double_t[nbins]; |
3412 | Double_t *xValuesFittedBis = new Double_t[nbins]; |
3413 | Double_t *xValuesFittedMeanW = new Double_t[nbins]; |
3414 | for(Int_t k = 0; k < nbins; k ++){ |
3415 | xValuesFitted[k] = -1; |
3416 | xValuesFittedMean[k] = -1; |
3417 | xValuesFittedMeanW[k] = -1; |
3418 | xValuesFittedBis[k] = -1; |
3419 | } |
3420 | |
3421 | if(fFitChargeOn){ |
3422 | sum = 0.0; |
3423 | for(Int_t l = 0; l < nbins; l++){ |
3424 | if(fCoefCharge[0][l] > 0){ |
3425 | sum += fCoefCharge[0][l]; |
3426 | xValuesFitted[counter[0]]= l; |
3427 | counter[0]++; |
3428 | } |
3429 | } |
3430 | scale = 1.0; |
3431 | if(sum > 0.0) scale = counter[0]/sum; |
3432 | if(fFitChargeNDB == 0){ |
3433 | if(scale != fScaleFitFactor){ |
3434 | AliInfo(Form("The normalisation is different from a nomalisation to one.")); |
3435 | AliInfo(Form("For one we have %f and here %f",scale,fScaleFitFactor)); |
bb9cc02b |
3436 | if(!fAccCDB) { |
3437 | AliInfo(Form("It is not normal because we didn't choose a reference database!")); |
3438 | } |
55a288e5 |
3439 | } |
3440 | scale = fScaleFitFactor; |
3441 | } |
3442 | for(Int_t l = 0; l < nbins; l++){ |
3443 | if(fCoefCharge[0][l] > 0){ |
3444 | fCoefCharge[0][l]=fCoefCharge[0][l]*scale; |
3445 | fCoefChargeE[0][l]=fCoefChargeE[0][l]*scale; |
3446 | } |
3447 | } |
3448 | } |
3449 | |
3450 | if(fFitMeanWOn){ |
3451 | sum = 0.0; |
3452 | for(Int_t l = 0; l < nbins; l++){ |
3453 | if(fCoefCharge[4][l] > 0){ |
3454 | sum += fCoefCharge[4][l]; |
3455 | xValuesFittedMeanW[counter[3]]= l; |
3456 | counter[3]++; |
3457 | } |
3458 | } |
3459 | scale = 1.0; |
3460 | if(sum > 0.0) scale = counter[3]/sum; |
3461 | if(fFitChargeNDB == 4){ |
3462 | if(scale != fScaleFitFactor){ |
3463 | AliInfo(Form("The normalisation is different from a nomalisation to one.")); |
3464 | AliInfo(Form("For one we have %f and here %f",scale,fScaleFitFactor)); |
bb9cc02b |
3465 | if(!fAccCDB) { |
3466 | AliInfo(Form("It is not normal because we didn't choose a reference database!")); |
3467 | } |
55a288e5 |
3468 | } |
3469 | scale = fScaleFitFactor; |
3470 | } |
3471 | for(Int_t l = 0; l < nbins; l++){ |
3472 | if(fCoefCharge[4][l] > 0){ |
3473 | fCoefCharge[4][l]=fCoefCharge[4][l]*scale; |
3474 | fCoefChargeE[3][l]=fCoefChargeE[3][l]*scale; |
3475 | } |
3476 | } |
3477 | } |
3478 | |
3479 | if(fMeanChargeOn){ |
3480 | sum = 0.0; |
3481 | for(Int_t l = 0; l < nbins; l++){ |
3482 | if(fCoefCharge[1][l] > 0){ |
3483 | sum += fCoefCharge[1][l]; |
3484 | xValuesFittedMean[counter[1]]= l; |
3485 | counter[1]++; |
3486 | } |
3487 | } |
3488 | scale = 1.0; |
3489 | if(sum > 0.0) scale = counter[1]/sum; |
3490 | if(fFitChargeNDB == 1){ |
3491 | if(scale != fScaleFitFactor){ |
3492 | AliInfo(Form("The normalisation is different from a nomalisation to one.")); |
3493 | AliInfo(Form("For one we have %f and here %f",scale,fScaleFitFactor)); |
bb9cc02b |
3494 | if(!fAccCDB) { |
3495 | AliInfo(Form("It is not normal because we didn't choose a reference database!")); |
3496 | } |
55a288e5 |
3497 | } |
3498 | scale = fScaleFitFactor; |
3499 | } |
3500 | for(Int_t l = 0; l < nbins; l++){ |
3501 | if(fCoefCharge[1][l] > 0){ |
3502 | fCoefCharge[1][l]=fCoefCharge[1][l]*scale; |
3503 | fCoefChargeE[1][l]=fCoefChargeE[1][l]*scale; |
3504 | } |
3505 | } |
3506 | } |
3507 | |
3508 | if(fFitChargeBisOn){ |
3509 | sum = 0.0; |
3510 | for(Int_t l = 0; l < nbins; l++){ |
3511 | if(fCoefCharge[2][l] > 0){ |
3512 | sum += fCoefCharge[2][l]; |
3513 | xValuesFittedBis[counter[2]]= l; |
3514 | counter[2]++; |
3515 | } |
3516 | } |
3517 | scale = 1.0; |
3518 | if(sum > 0.0) scale = counter[2]/sum; |
3519 | if(fFitChargeNDB == 0){ |
3520 | if(scale != fScaleFitFactor){ |
3521 | AliInfo(Form("The normalisation is different from a nomalisation to one.")); |
3522 | AliInfo(Form("For one we have %f and here %f",scale,fScaleFitFactor)); |
bb9cc02b |
3523 | if(!fAccCDB) { |
3524 | AliInfo(Form("It is not normal because we didn't choose a reference database!")); |
3525 | } |
55a288e5 |
3526 | } |
3527 | scale = fScaleFitFactor; |
3528 | } |
3529 | for(Int_t l = 0; l < nbins; l++){ |
3530 | if(fCoefCharge[2][l] > 0){ |
3531 | fCoefCharge[2][l]=fCoefCharge[2][l]*scale; |
3532 | fCoefChargeE[2][l]=fCoefChargeE[2][l]*scale; |
3533 | } |
3534 | } |
3535 | } |
3536 | |
3537 | // Create the X and Xerror |
3538 | Double_t *xValues = new Double_t[nbins]; |
3539 | Double_t *xValuesE = new Double_t[nbins]; |
3540 | for(Int_t k = 0; k < nbins; k ++){ |
3541 | xValues[k] = k; |
3542 | xValuesE[k] = 0.0; |
3543 | } |
3544 | |
3545 | // Create the graph erros and plot them |
3546 | TCanvas *cch1 = new TCanvas("cch1","",50,50,600,800); |
3547 | cch1->cd(); |
3548 | TLegend *legch1 = new TLegend(0.4,0.6,0.89,0.89); |
3549 | |
3550 | TGraph *graphCharge3 = new TGraph(nbins,xValues,fCoefCharge[3]); |
3551 | graphCharge3->SetName("coefcharge3"); |
3552 | graphCharge3->SetTitle(""); |
3553 | graphCharge3->GetXaxis()->SetTitle("Det/Pad groups"); |
3554 | graphCharge3->GetYaxis()->SetTitle("gain factor"); |
3555 | graphCharge3->SetLineColor(4); |
3556 | graphCharge3->SetMarkerStyle(25); |
3557 | graphCharge3->SetMarkerColor(4); |
3558 | listofgraphs->Add((TObject *)graphCharge3); |
3559 | legch1->AddEntry(graphCharge3,"f_{g} simulated","p"); |
3560 | graphCharge3->Draw("AP"); |
3561 | |
3562 | if (fFitChargeOn) { |
3563 | TGraphErrors *graphCharge0 = new TGraphErrors(nbins,xValues,fCoefCharge[0],xValuesE,fCoefChargeE[0]); |
3564 | graphCharge0->SetName("coefcharge0"); |
3565 | graphCharge0->SetTitle(""); |
3566 | graphCharge0->GetXaxis()->SetTitle("Det/Pad groups"); |
3567 | graphCharge0->GetYaxis()->SetTitle("gain factor"); |
3568 | graphCharge0->SetMarkerColor(6); |
3569 | graphCharge0->SetLineColor(6); |
3570 | graphCharge0->SetMarkerStyle(26); |
3571 | listofgraphs->Add((TObject *)graphCharge0); |
3572 | legch1->AddEntry(graphCharge0,"f_{g} fit","p"); |
3573 | graphCharge0->Draw("P"); |
3574 | } |
3575 | if (fFitMeanWOn) { |
3576 | TGraphErrors *graphCharge4 = new TGraphErrors(nbins,xValues,fCoefCharge[4],xValuesE,fCoefChargeE[3]); |
3577 | graphCharge4->SetName("coefcharge4"); |
3578 | graphCharge4->SetTitle(""); |
3579 | graphCharge4->GetXaxis()->SetTitle("Det/Pad groups"); |
3580 | graphCharge4->GetYaxis()->SetTitle("gain factor"); |
3581 | graphCharge4->SetMarkerColor(1); |
3582 | graphCharge4->SetLineColor(1); |
3583 | graphCharge4->SetMarkerStyle(30); |
3584 | listofgraphs->Add((TObject *)graphCharge4); |
3585 | legch1->AddEntry(graphCharge4,"f_{g} Mean W","p"); |
3586 | graphCharge4->Draw("P"); |
3587 | } |
3588 | if (fMeanChargeOn) { |
3589 | TGraphErrors *graphCharge1 = new TGraphErrors(nbins,xValues,fCoefCharge[1],xValuesE,fCoefChargeE[1]); |
3590 | graphCharge1->SetName("coefcharge1"); |
3591 | graphCharge1->GetXaxis()->SetTitle("Det/Pad groups"); |
3592 | graphCharge1->GetYaxis()->SetTitle("gain factor"); |
3593 | graphCharge1->SetTitle(""); |
3594 | graphCharge1->SetMarkerColor(2); |
3595 | graphCharge1->SetLineColor(2); |
3596 | graphCharge1->SetMarkerStyle(24); |
3597 | legch1->AddEntry(graphCharge1,"f_{g} mean","p"); |
3598 | graphCharge1->Draw("P"); |
3599 | listofgraphs->Add((TObject *)graphCharge1); |
3600 | } |
3601 | if (fFitChargeBisOn ) { |
3602 | TGraphErrors *graphCharge2 = new TGraphErrors(nbins,xValues,fCoefCharge[2],xValuesE,fCoefChargeE[2]); |
3603 | graphCharge2->SetName("coefcharge2"); |
3604 | graphCharge2->SetTitle(""); |
3605 | graphCharge2->GetXaxis()->SetTitle("Det/Pad groups"); |
3606 | graphCharge2->GetYaxis()->SetTitle("gain factor"); |
3607 | graphCharge2->SetMarkerColor(8); |
3608 | graphCharge2->SetLineColor(8); |
3609 | graphCharge2->SetMarkerStyle(25); |
3610 | legch1->AddEntry(graphCharge2,"f_{g} fitbis","p"); |
3611 | graphCharge2->Draw("P"); |
3612 | listofgraphs->Add((TObject *)graphCharge2); |
3613 | } |
3614 | legch1->Draw("same"); |
3615 | |
3616 | //Create the arrays and the graphs for the delta |
3617 | Int_t thefirst = 0; |
3618 | TCanvas *cch2 = new TCanvas("cch2","",50,50,600,800); |
3619 | cch2->Divide(2,1); |
3620 | TLegend *legch3 = new TLegend(0.4,0.6,0.89,0.89); |
3621 | TLegend *legch2 = new TLegend(0.4,0.6,0.89,0.89); |
3622 | |
3623 | if(fFitChargeOn){ |
3624 | cch2->cd(2); |
3625 | Double_t *yValuesDelta = new Double_t[counter[0]]; |
3626 | for(Int_t k = 0; k < counter[0]; k++){ |
3627 | if (fCoefCharge[3][(Int_t)(xValuesFitted[k])] > 0.0) { |
3628 | yValuesDelta[k] = (fCoefCharge[0][(Int_t)xValuesFitted[k]]-fCoefCharge[3][(Int_t)xValuesFitted[k]]) |
3629 | / fCoefCharge[3][(Int_t)xValuesFitted[k]]; |
3630 | } |
3631 | else { |
3632 | yValuesDelta[k] = 0.0; |
3633 | } |
3634 | } |
3635 | TGraph *graphDeltaCharge0 = new TGraph(counter[0],&xValuesFitted[0],yValuesDelta); |
3636 | graphDeltaCharge0->SetName("deltacharge0"); |
3637 | graphDeltaCharge0->GetXaxis()->SetTitle("Det/Pad groups"); |
3638 | graphDeltaCharge0->GetYaxis()->SetTitle("#Deltag/g_{sim}"); |
3639 | graphDeltaCharge0->SetMarkerColor(6); |
3640 | graphDeltaCharge0->SetTitle(""); |
3641 | graphDeltaCharge0->SetLineColor(6); |
3642 | graphDeltaCharge0->SetMarkerStyle(26); |
3643 | listofgraphs->Add((TObject *)graphDeltaCharge0); |
3644 | legch3->AddEntry(graphDeltaCharge0,"fit","p"); |
3645 | graphDeltaCharge0->Draw("AP"); |
3646 | |
3647 | cch2->cd(1); |
3648 | TH1I *histoErrorCharge0 = new TH1I("errorcharge0","",100 ,-0.10,0.10); |
3649 | histoErrorCharge0->SetXTitle("#Deltag/g_{sim}"); |
3650 | histoErrorCharge0->SetYTitle("counts"); |
3651 | histoErrorCharge0->SetLineColor(6); |
3652 | histoErrorCharge0->SetLineStyle(1); |
3653 | histoErrorCharge0->SetStats(0); |
3654 | Double_t maxvalue = 0.0; |
3655 | for(Int_t k = 0; k < counter[0]; k++){ |
3656 | histoErrorCharge0->Fill(yValuesDelta[k]); |
3657 | if(k == 0) maxvalue = TMath::Abs(yValuesDelta[k]); |
3658 | if(maxvalue < (TMath::Abs(yValuesDelta[k]))) maxvalue = TMath::Abs(yValuesDelta[k]); |
3659 | } |
3660 | AliInfo(Form("The maximum deviation found dor the fit method is %f",maxvalue)); |
3661 | legch2->AddEntry(histoErrorCharge0,"f_{g} fit","l"); |
3662 | histoErrorCharge0->Draw(); |
3663 | listofgraphs->Add((TObject *)histoErrorCharge0); |
3664 | thefirst =1; |
3665 | } |
3666 | |
3667 | if(fFitMeanWOn){ |
3668 | cch2->cd(2); |
3669 | Double_t *yValuesDelta = new Double_t[counter[3]]; |
3670 | for(Int_t k = 0; k < counter[3]; k++){ |
3671 | if (fCoefCharge[3][(Int_t)(xValuesFittedMeanW[k])] > 0.0) { |
3672 | yValuesDelta[k] = (fCoefCharge[4][(Int_t)xValuesFittedMeanW[k]]-fCoefCharge[3][(Int_t)xValuesFittedMeanW[k]]) |
3673 | / fCoefCharge[3][(Int_t)xValuesFittedMeanW[k]]; |
3674 | } |
3675 | else { |
3676 | yValuesDelta[k] = 0.0; |
3677 | } |
3678 | } |
3679 | TGraph *graphDeltaCharge4 = new TGraph(counter[3],&xValuesFittedMeanW[0],yValuesDelta); |
3680 | graphDeltaCharge4->SetName("deltacharge4"); |
3681 | graphDeltaCharge4->GetXaxis()->SetTitle("Det/Pad groups"); |
3682 | graphDeltaCharge4->GetYaxis()->SetTitle("#Deltag/g_{sim}"); |
3683 | graphDeltaCharge4->SetMarkerColor(1); |
3684 | graphDeltaCharge4->SetTitle(""); |
3685 | graphDeltaCharge4->SetLineColor(1); |
3686 | graphDeltaCharge4->SetMarkerStyle(30); |
3687 | listofgraphs->Add((TObject *)graphDeltaCharge4); |
3688 | legch3->AddEntry(graphDeltaCharge4,"Mean W","p"); |
3689 | if(thefirst == 0){ |
3690 | graphDeltaCharge4->Draw("AP"); |
3691 | } |
3692 | else { |
3693 | graphDeltaCharge4->Draw("P"); |
3694 | } |
3695 | |
3696 | cch2->cd(1); |
3697 | TH1I *histoErrorCharge4 = new TH1I("errorcharge4","",100 ,-0.10,0.10); |
3698 | histoErrorCharge4->SetXTitle("#Deltag/g_{sim}"); |
3699 | histoErrorCharge4->SetYTitle("counts"); |
3700 | histoErrorCharge4->SetLineColor(1); |
3701 | histoErrorCharge4->SetLineStyle(1); |
3702 | histoErrorCharge4->SetStats(0); |
3703 | Double_t maxvalue = 0.0; |
3704 | for(Int_t k = 0; k < counter[3]; k++){ |
3705 | histoErrorCharge4->Fill(yValuesDelta[k]); |
3706 | if(k == 0) maxvalue = yValuesDelta[k]; |
3707 | if(maxvalue < (TMath::Abs(yValuesDelta[k]))) maxvalue = TMath::Abs(yValuesDelta[k]); |
3708 | } |
3709 | AliInfo(Form("The maximum deviation found for the meanW method is %f",maxvalue)); |
3710 | legch2->AddEntry(histoErrorCharge4,"f_{g} Mean W","l"); |
3711 | if(thefirst == 0){ |
3712 | histoErrorCharge4->Draw(); |
3713 | } |
3714 | else { |
3715 | histoErrorCharge4->Draw("same"); |
3716 | } |
3717 | listofgraphs->Add((TObject *)histoErrorCharge4); |
3718 | thefirst =1; |
3719 | } |
3720 | |
3721 | if (fMeanChargeOn) { |
3722 | cch2->cd(2); |
3723 | Double_t *yValuesDeltaMean = new Double_t[counter[1]]; |
3724 | for (Int_t k = 0; k < counter[1]; k++){ |
3725 | if (fCoefCharge[3][(Int_t)xValuesFittedMean[k]] > 0.0) { |
3726 | yValuesDeltaMean[k] = (fCoefCharge[1][(Int_t)xValuesFittedMean[k]]-fCoefCharge[3][(Int_t)xValuesFittedMean[k]]) |
3727 | / fCoefCharge[3][(Int_t)xValuesFittedMean[k]]; |
3728 | } |
3729 | else { |
3730 | yValuesDeltaMean[k] = 0.0; |
3731 | } |
3732 | } |
3733 | TGraph *graphDeltaCharge1 = new TGraph(counter[1],&xValuesFittedMean[0],yValuesDeltaMean); |
3734 | graphDeltaCharge1->SetName("deltacharge1"); |
3735 | graphDeltaCharge1->GetXaxis()->SetTitle("Det/Pad groups"); |
3736 | graphDeltaCharge1->GetYaxis()->SetTitle("#Deltag/g_{sim}"); |
3737 | graphDeltaCharge1->SetMarkerColor(2); |
3738 | graphDeltaCharge1->SetMarkerStyle(24); |
3739 | graphDeltaCharge1->SetLineColor(2); |
3740 | graphDeltaCharge1->SetTitle(""); |
3741 | legch3->AddEntry(graphDeltaCharge1,"mean","p"); |
3742 | if(thefirst == 0){ |
3743 | graphDeltaCharge1->Draw("AP"); |
3744 | } |
3745 | else { |
3746 | graphDeltaCharge1->Draw("P"); |
3747 | } |
3748 | listofgraphs->Add((TObject *)graphDeltaCharge1); |
3749 | |
3750 | cch2->cd(1); |
3751 | TH1I *histoErrorCharge1 = new TH1I("errorcharge1","",100 ,-0.10,0.10); |
3752 | histoErrorCharge1->SetXTitle("#Deltag/g_{sim}"); |
3753 | histoErrorCharge1->SetYTitle("counts"); |
3754 | histoErrorCharge1->SetLineColor(2); |
3755 | histoErrorCharge1->SetLineStyle(2); |
3756 | histoErrorCharge1->SetStats(0); |
3757 | Double_t maxvalue = 0.0; |
3758 | for(Int_t k = 0; k < counter[1]; k++){ |
3759 | histoErrorCharge1->Fill(yValuesDeltaMean[k]); |
3760 | if(k == 0) maxvalue = TMath::Abs(yValuesDeltaMean[k]); |
3761 | if(maxvalue < (TMath::Abs(yValuesDeltaMean[k]))) maxvalue = TMath::Abs(yValuesDeltaMean[k]); |
3762 | } |
3763 | AliInfo(Form("The maximum deviation found for the mean method is %f",maxvalue)); |
3764 | legch2->AddEntry(histoErrorCharge1,"f_{g} mean","l"); |
3765 | if(thefirst == 0){ |
3766 | histoErrorCharge1->Draw(); |
3767 | } |
3768 | else { |
3769 | histoErrorCharge1->Draw("same"); |
3770 | } |
3771 | listofgraphs->Add((TObject *)histoErrorCharge1); |
3772 | thefirst = 1; |
3773 | } |
3774 | |
3775 | if (fFitChargeBisOn) { |
3776 | cch2->cd(2); |
3777 | Double_t *yValuesDeltaBis = new Double_t[counter[2]]; |
3778 | for(Int_t k = 0; k < counter[2]; k++){ |
3779 | if (fCoefCharge[3][(Int_t)xValuesFittedBis[k]] > 0.0) { |
3780 | yValuesDeltaBis[k] = (fCoefCharge[2][(Int_t)xValuesFittedBis[k]]-fCoefCharge[3][(Int_t)xValuesFittedBis[k]]) |
3781 | / fCoefCharge[3][(Int_t)xValuesFittedBis[k]]; |
3782 | } |
3783 | else { |
3784 | yValuesDeltaBis[k] = 0.0; |
3785 | } |
3786 | } |
3787 | TGraph *graphDeltaCharge2 = new TGraph(counter[2],&xValuesFittedBis[0],yValuesDeltaBis); |
3788 | graphDeltaCharge2->SetName("deltacharge2"); |
3789 | graphDeltaCharge2->GetXaxis()->SetTitle("Det/Pad groups"); |
3790 | graphDeltaCharge2->GetYaxis()->SetTitle("#Deltag/g_{sim}"); |
3791 | graphDeltaCharge2->SetMarkerColor(8); |
3792 | graphDeltaCharge2->SetLineColor(8); |
3793 | graphDeltaCharge2->SetMarkerStyle(25); |
3794 | legch3->AddEntry(graphDeltaCharge2,"fit","p"); |
3795 | graphDeltaCharge2->SetTitle(""); |
3796 | if(thefirst == 0){ |
3797 | graphDeltaCharge2->Draw("AP"); |
3798 | } |
3799 | else { |
3800 | graphDeltaCharge2->Draw("P"); |
3801 | } |
3802 | listofgraphs->Add((TObject *)graphDeltaCharge2); |
3803 | |
3804 | cch2->cd(1); |
3805 | TH1I *histoErrorCharge2 = new TH1I("errorcharge2","",100 ,-0.10, 0.10); |
3806 | histoErrorCharge2->SetXTitle("#Deltag/g_{sim}"); |
3807 | histoErrorCharge2->SetYTitle("counts"); |
3808 | histoErrorCharge2->SetLineColor(8); |
3809 | histoErrorCharge2->SetLineStyle(5); |
3810 | histoErrorCharge2->SetLineWidth(3); |
3811 | histoErrorCharge2->SetStats(0); |
3812 | Double_t maxvalue = 0.0; |
3813 | for(Int_t k = 0; k < counter[2]; k++){ |
3814 | histoErrorCharge2->Fill(yValuesDeltaBis[k]); |
3815 | if(k == 0) maxvalue = TMath::Abs(yValuesDeltaBis[k]); |
3816 | if(maxvalue < (TMath::Abs(yValuesDeltaBis[k]))) maxvalue = TMath::Abs(yValuesDeltaBis[k]); |
3817 | } |
3818 | AliInfo(Form("The maximum deviation found for the fit bis method is %f",maxvalue)); |
3819 | legch2->AddEntry(histoErrorCharge2,"f_{g} fitbis","l"); |
3820 | if(thefirst == 0){ |
3821 | histoErrorCharge2->Draw(); |
3822 | } |
3823 | else { |
3824 | histoErrorCharge2->Draw("same"); |
3825 | } |
3826 | listofgraphs->Add((TObject *)histoErrorCharge2); |
3827 | //it doesn't matter anymore but... |
3828 | thefirst = 1; |
3829 | } |
3830 | |
3831 | cch2->cd(2); |
3832 | legch3->Draw("same"); |
3833 | cch2->cd(1); |
3834 | legch2->Draw("same"); |
3835 | |
3836 | //Write if wanted |
3837 | if (fWriteCoef[0]){ |
3838 | TFile *fout = TFile::Open(fWriteNameCoef,"UPDATE"); |
3839 | // Check if the file could be opened |
3840 | if (!fout || !fout->IsOpen()) { |
3841 | AliInfo("No File found!"); |
3842 | } |
3843 | |
3844 | else{ |
3845 | for(Int_t k = 0; k < listofgraphs->GetEntriesFast(); k++){ |
3846 | fout->WriteTObject((TObject *) listofgraphs->At(k),((TObject *)listofgraphs->At(k))->GetName() |
3847 | ,(Option_t *) "OverWrite"); |
3848 | } |
3849 | } |
3850 | fout->Close(); |
3851 | } |
3852 | |
3853 | } |
|