]> git.uio.no Git - u/mrichter/AliRoot.git/blame - TRD/AliTRDCalibraFit.cxx
Update on calibration classes by Raphaelle
[u/mrichter/AliRoot.git] / TRD / AliTRDCalibraFit.cxx
CommitLineData
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>
3a0f6479 69#include <TTreeStream.h>
70#include <TLinearFitter.h>
71#include <TVectorD.h>
72#include <TArrayF.h>
55a288e5 73
74#include "AliLog.h"
75#include "AliCDBManager.h"
3a0f6479 76#include "AliMathBase.h"
55a288e5 77
78#include "AliTRDCalibraFit.h"
79#include "AliTRDCalibraMode.h"
80#include "AliTRDCalibraVector.h"
3a0f6479 81#include "AliTRDCalibraVdriftLinearFit.h"
55a288e5 82#include "AliTRDcalibDB.h"
83#include "AliTRDgeometry.h"
3a0f6479 84#include "AliTRDpadPlane.h"
85#include "AliTRDgeometry.h"
55a288e5 86#include "./Cal/AliTRDCalROC.h"
87#include "./Cal/AliTRDCalPad.h"
88#include "./Cal/AliTRDCalDet.h"
89
90
91ClassImp(AliTRDCalibraFit)
92
93AliTRDCalibraFit* AliTRDCalibraFit::fgInstance = 0;
94Bool_t AliTRDCalibraFit::fgTerminated = kFALSE;
95
96//_____________singleton implementation_________________________________________________
97AliTRDCalibraFit *AliTRDCalibraFit::Instance()
98{
99 //
100 // Singleton implementation
101 //
102
103 if (fgTerminated != kFALSE) {
104 return 0;
105 }
106
107 if (fgInstance == 0) {
108 fgInstance = new AliTRDCalibraFit();
109 }
110
111 return fgInstance;
112
113}
114
115//______________________________________________________________________________________
116void AliTRDCalibraFit::Terminate()
117{
118 //
119 // Singleton implementation
120 // Deletes the instance of this class
121 //
122
123 fgTerminated = kTRUE;
124
125 if (fgInstance != 0) {
126 delete fgInstance;
127 fgInstance = 0;
128 }
129
130}
131
132//______________________________________________________________________________________
133AliTRDCalibraFit::AliTRDCalibraFit()
134 :TObject()
f162af62 135 ,fGeo(0)
3a0f6479 136 ,fNumberOfBinsExpected(0)
137 ,fMethod(0)
138 ,fBeginFitCharge(3.5)
139 ,fFitPHPeriode(1)
55a288e5 140 ,fTakeTheMaxPH(kFALSE)
3a0f6479 141 ,fT0Shift(0.124797)
142 ,fRangeFitPRF(1.0)
55a288e5 143 ,fAccCDB(kFALSE)
3a0f6479 144 ,fMinEntries(800)
145 ,fRebin(1)
55a288e5 146 ,fNumberFit(0)
147 ,fNumberFitSuccess(0)
148 ,fNumberEnt(0)
149 ,fStatisticMean(0.0)
3a0f6479 150 ,fDebugStreamer(0x0)
151 ,fDebugLevel(0)
55a288e5 152 ,fFitVoir(0)
3a0f6479 153 ,fMagneticField(0.5)
154 ,fCalibraMode(new AliTRDCalibraMode())
155 ,fCurrentCoefE(0.0)
156 ,fCurrentCoefE2(0.0)
157 ,fDect1(0)
158 ,fDect2(0)
55a288e5 159 ,fScaleFitFactor(0.0)
160 ,fEntriesCurrent(0)
3a0f6479 161 ,fCountDet(0)
162 ,fCount(0)
163 ,fCalDet(0x0)
164 ,fCalROC(0x0)
165 ,fCalDet2(0x0)
166 ,fCalROC2(0x0)
167 ,fCurrentCoefDetector(0x0)
168 ,fCurrentCoefDetector2(0x0)
169 ,fVectorFit(0)
170 ,fVectorFit2(0)
55a288e5 171{
172 //
173 // Default constructor
174 //
175
3a0f6479 176 fGeo = new AliTRDgeometry();
177
178 // Current variables initialised
179 for (Int_t k = 0; k < 2; k++) {
180 fCurrentCoef[k] = 0.0;
181 fCurrentCoef2[k] = 0.0;
55a288e5 182 }
55a288e5 183 for (Int_t i = 0; i < 3; i++) {
3a0f6479 184 fPhd[i] = 0.0;
185 fDet[i] = 0;
55a288e5 186 }
3a0f6479 187
55a288e5 188}
55a288e5 189//______________________________________________________________________________________
190AliTRDCalibraFit::AliTRDCalibraFit(const AliTRDCalibraFit &c)
3a0f6479 191:TObject(c)
192,fGeo(0)
193,fNumberOfBinsExpected(c.fNumberOfBinsExpected)
194,fMethod(c.fMethod)
195,fBeginFitCharge(c.fBeginFitCharge)
196,fFitPHPeriode(c.fFitPHPeriode)
197,fTakeTheMaxPH(c.fTakeTheMaxPH)
198,fT0Shift(c.fT0Shift)
199,fRangeFitPRF(c.fRangeFitPRF)
200,fAccCDB(c.fAccCDB)
201,fMinEntries(c.fMinEntries)
202,fRebin(c.fRebin)
203,fNumberFit(c.fNumberFit)
204,fNumberFitSuccess(c.fNumberFitSuccess)
205,fNumberEnt(c.fNumberEnt)
206,fStatisticMean(c.fStatisticMean)
207,fDebugStreamer(0x0)
208,fDebugLevel(c.fDebugLevel)
209,fFitVoir(c.fFitVoir)
210,fMagneticField(c.fMagneticField)
211,fCalibraMode(0x0)
212,fCurrentCoefE(c.fCurrentCoefE)
213,fCurrentCoefE2(c.fCurrentCoefE2)
214,fDect1(c.fDect1)
215,fDect2(c.fDect2)
216,fScaleFitFactor(c.fScaleFitFactor)
217,fEntriesCurrent(c.fEntriesCurrent)
218,fCountDet(c.fCountDet)
219,fCount(c.fCount)
220,fCalDet(0x0)
221,fCalROC(0x0)
222,fCalDet2(0x0)
223,fCalROC2(0x0)
224,fCurrentCoefDetector(0x0)
225,fCurrentCoefDetector2(0x0)
226,fVectorFit(0)
227,fVectorFit2(0)
55a288e5 228{
229 //
230 // Copy constructor
231 //
232
3a0f6479 233 if(c.fCalibraMode) fCalibraMode = new AliTRDCalibraMode(*c.fCalibraMode);
234
235 //Current variables initialised
236 for (Int_t k = 0; k < 2; k++) {
237 fCurrentCoef[k] = 0.0;
238 fCurrentCoef2[k] = 0.0;
239 }
240 for (Int_t i = 0; i < 3; i++) {
241 fPhd[i] = 0.0;
242 fDet[i] = 0;
243 }
244 if(c.fCalDet) fCalDet = new AliTRDCalDet(*c.fCalDet);
245 if(c.fCalDet2) fCalDet2 = new AliTRDCalDet(*c.fCalDet2);
246
247 if(c.fCalROC) fCalROC = new AliTRDCalROC(*c.fCalROC);
248 if(c.fCalROC2) fCalROC = new AliTRDCalROC(*c.fCalROC2);
249
250 fVectorFit.SetName(c.fVectorFit.GetName());
251 for(Int_t k = 0; k < c.fVectorFit.GetEntriesFast(); k++){
252 AliTRDFitInfo *fitInfo = new AliTRDFitInfo();
253 Int_t detector = ((AliTRDFitInfo *)c.fVectorFit.UncheckedAt(k))->GetDetector();
254 Int_t ntotal = 1;
255 if (GetChamber(detector) == 2) {
256 ntotal = 1728;
257 }
258 else {
259 ntotal = 2304;
260 }
261 Float_t *coef = new Float_t[ntotal];
262 for (Int_t i = 0; i < ntotal; i++) {
263 coef[i] = ((AliTRDFitInfo *)c.fVectorFit.UncheckedAt(k))->GetCoef()[i];
264 }
265 fitInfo->SetCoef(coef);
266 fitInfo->SetDetector(detector);
267 fVectorFit.Add((TObject *) fitInfo);
268 }
269 fVectorFit.SetName(c.fVectorFit.GetName());
270 for(Int_t k = 0; k < c.fVectorFit2.GetEntriesFast(); k++){
271 AliTRDFitInfo *fitInfo = new AliTRDFitInfo();
272 Int_t detector = ((AliTRDFitInfo *)c.fVectorFit2.UncheckedAt(k))->GetDetector();
273 Int_t ntotal = 1;
274 if (GetChamber(detector) == 2) {
275 ntotal = 1728;
276 }
277 else {
278 ntotal = 2304;
279 }
280 Float_t *coef = new Float_t[ntotal];
281 for (Int_t i = 0; i < ntotal; i++) {
282 coef[i] = ((AliTRDFitInfo *)c.fVectorFit2.UncheckedAt(k))->GetCoef()[i];
283 }
284 fitInfo->SetCoef(coef);
285 fitInfo->SetDetector(detector);
286 fVectorFit2.Add((TObject *) fitInfo);
287 }
288 if (fGeo) {
289 delete fGeo;
290 }
291 fGeo = new AliTRDgeometry();
55a288e5 292
3a0f6479 293}
55a288e5 294//____________________________________________________________________________________
295AliTRDCalibraFit::~AliTRDCalibraFit()
296{
297 //
298 // AliTRDCalibraFit destructor
299 //
3a0f6479 300 if ( fDebugStreamer ) delete fDebugStreamer;
301 if ( fCalDet ) delete fCalDet;
302 if ( fCalDet2 ) delete fCalDet2;
303 if ( fCalROC ) delete fCalROC;
304 if ( fCalROC2 ) delete fCalROC2;
305 fVectorFit.Delete();
306 fVectorFit2.Delete();
f162af62 307 if (fGeo) {
308 delete fGeo;
309 }
310
55a288e5 311}
55a288e5 312//_____________________________________________________________________________
313void AliTRDCalibraFit::Destroy()
314{
315 //
316 // Delete instance
317 //
318
319 if (fgInstance) {
320 delete fgInstance;
321 fgInstance = 0x0;
322 }
323
324}
55a288e5 325//____________Functions fit Online CH2d________________________________________
3a0f6479 326Bool_t AliTRDCalibraFit::AnalyseCH(TH2I *ch)
55a288e5 327{
328 //
329 // Fit the 1D histos, projections of the 2D ch on the Xaxis, for each
330 // calibration group normalized the resulted coefficients (to 1 normally)
55a288e5 331 //
332
3a0f6479 333 // Set the calibration mode
334 const char *name = ch->GetTitle();
335 SetModeCalibration(name,0);
336
337 // Number of Ybins (detectors or groups of pads)
338 Int_t nbins = ch->GetNbinsX();// charge
339 Int_t nybins = ch->GetNbinsY();// groups number
340 if (!InitFit(nybins,0)) {
55a288e5 341 return kFALSE;
342 }
3a0f6479 343 if (!InitFitCH()) {
55a288e5 344 return kFALSE;
345 }
346 fStatisticMean = 0.0;
347 fNumberFit = 0;
348 fNumberFitSuccess = 0;
349 fNumberEnt = 0;
55a288e5 350 // Init fCountDet and fCount
351 InitfCountDetAndfCount(0);
55a288e5 352 // Beginning of the loop betwwen dect1 and dect2
3a0f6479 353 for (Int_t idect = fDect1; idect < fDect2; idect++) {
354 // Determination of fNnZ, fNnRphi, fNfragZ and fNfragRphi...
55a288e5 355 UpdatefCountDetAndfCount(idect,0);
55a288e5 356 ReconstructFitRowMinRowMax(idect, 0);
3a0f6479 357 // Take the histo
358 TH1I *projch = (TH1I *) ch->ProjectionX("projch",idect+1,idect+1,(Option_t *)"e");
359 projch->SetDirectory(0);
55a288e5 360 // Number of entries for this calibration group
361 Double_t nentries = 0.0;
362 Double_t mean = 0.0;
3a0f6479 363 for (Int_t k = 0; k < nbins; k++) {
364 Int_t binnb = (nbins+2)*(idect+1)+(k+1);
365 nentries += ch->GetBinContent(binnb);
55a288e5 366 mean += projch->GetBinCenter(k+1)*projch->GetBinContent(k+1);
3a0f6479 367 projch->SetBinError(k+1,TMath::Sqrt(projch->GetBinContent(k+1)));
55a288e5 368 }
3a0f6479 369 projch->SetEntries(nentries);
370 //printf("The number of entries for the group %d is %f\n",idect,nentries);
55a288e5 371 if (nentries > 0) {
372 fNumberEnt++;
373 mean /= nentries;
374 }
55a288e5 375 // Rebin and statistic stuff
55a288e5 376 if (fRebin > 1) {
377 projch = ReBin((TH1I *) projch);
378 }
379 // This detector has not enough statistics or was off
3a0f6479 380 if (nentries <= fMinEntries) {
381 NotEnoughStatisticCH(idect);
382 if (fDebugLevel != 1) {
55a288e5 383 delete projch;
384 }
385 continue;
386 }
55a288e5 387 // Statistics of the group fitted
55a288e5 388 fStatisticMean += nentries;
389 fNumberFit++;
3a0f6479 390 //Method choosen
391 switch(fMethod)
392 {
393 case 0: FitMeanW((TH1 *) projch, nentries); break;
394 case 1: FitMean((TH1 *) projch, nentries, mean); break;
395 case 2: FitCH((TH1 *) projch, mean); break;
396 case 3: FitBisCH((TH1 *) projch, mean); break;
397 default: return kFALSE;
398 }
55a288e5 399 // Fill Infos Fit
3a0f6479 400 FillInfosFitCH(idect);
55a288e5 401 // Memory!!!
3a0f6479 402 if (fDebugLevel != 1) {
55a288e5 403 delete projch;
404 }
55a288e5 405 } // Boucle object
55a288e5 406 // Normierungcharge
3a0f6479 407 if (fDebugLevel != 1) {
55a288e5 408 NormierungCharge();
409 }
55a288e5 410 // Mean Statistic
411 if (fNumberFit > 0) {
3a0f6479 412 AliInfo(Form("There are %d with at least one entries. %d fits have been proceeded (sucessfully or not...). There is a mean statistic of: %d over these fitted histograms and %d successfulled fits",fNumberEnt, fNumberFit, (Int_t) fStatisticMean/fNumberFit, fNumberFitSuccess));
55a288e5 413 fStatisticMean = fStatisticMean / fNumberFit;
414 }
415 else {
416 AliInfo(Form("There are %d with at least one entries. There is no fit!",fNumberEnt));
417 }
3a0f6479 418 delete fDebugStreamer;
419 fDebugStreamer = 0x0;
420
55a288e5 421 return kTRUE;
55a288e5 422}
55a288e5 423//____________Functions fit Online CH2d________________________________________
3a0f6479 424Bool_t AliTRDCalibraFit::AnalyseCH(AliTRDCalibraVector *calvect)
55a288e5 425{
426 //
427 // Reconstruct a 1D histo from the vectorCH for each calibration group,
428 // fit the histo, normalized the resulted coefficients (to 1 normally)
55a288e5 429 //
430
3a0f6479 431 // Set the calibraMode
432 const char *name = calvect->GetNameCH();
433 SetModeCalibration(name,0);
55a288e5 434
3a0f6479 435 // Number of Xbins (detectors or groups of pads)
436 if (!InitFit((432*calvect->GetDetCha0(0)+108*calvect->GetDetCha2(0)),0)) {
55a288e5 437 return kFALSE;
438 }
3a0f6479 439 if (!InitFitCH()) {
55a288e5 440 return kFALSE;
441 }
442 fStatisticMean = 0.0;
443 fNumberFit = 0;
444 fNumberFitSuccess = 0;
445 fNumberEnt = 0;
55a288e5 446 // Init fCountDet and fCount
447 InitfCountDetAndfCount(0);
55a288e5 448 // Beginning of the loop between dect1 and dect2
3a0f6479 449 for (Int_t idect = fDect1; idect < fDect2; idect++) {
450 // Determination of fNnZ, fNnRphi, fNfragZ and fNfragRphi...........
55a288e5 451 UpdatefCountDetAndfCount(idect,0);
55a288e5 452 ReconstructFitRowMinRowMax(idect,0);
3a0f6479 453 // Take the histo
55a288e5 454 Double_t nentries = 0.0;
455 Double_t mean = 0.0;
3a0f6479 456 TH1F *projch = 0x0;
457 Bool_t something = kTRUE;
458 if(!calvect->GetCHEntries(fCountDet)) something = kFALSE;
459 if(something){
460 TString name("CH");
461 name += idect;
462 projch = calvect->ConvertVectorCHHisto(fCountDet,(idect-(fCount-(fCalibraMode->GetNfragZ(0)*fCalibraMode->GetNfragRphi(0)))),(const char *) name);
463 projch->SetDirectory(0);
464 for (Int_t k = 0; k < calvect->GetNumberBinCharge(); k++) {
55a288e5 465 nentries += projch->GetBinContent(k+1);
466 mean += projch->GetBinCenter(k+1)*projch->GetBinContent(k+1);
467 }
3a0f6479 468 if (nentries > 0) {
469 fNumberEnt++;
470 mean /= nentries;
471 }
472 //printf("The number of entries for the group %d is %f\n",idect,nentries);
473 // Rebin
474 if (fRebin > 1) {
475 projch = ReBin((TH1F *) projch);
476 }
55a288e5 477 }
55a288e5 478 // This detector has not enough statistics or was not found in VectorCH
3a0f6479 479 if (nentries <= fMinEntries) {
480 NotEnoughStatisticCH(idect);
481 if (fDebugLevel != 1) {
482 if(projch) delete projch;
55a288e5 483 }
55a288e5 484 continue;
55a288e5 485 }
55a288e5 486 // Statistic of the histos fitted
55a288e5 487 fStatisticMean += nentries;
488 fNumberFit++;
3a0f6479 489 //Method choosen
490 switch(fMethod)
491 {
492 case 0: FitMeanW((TH1 *) projch, nentries); break;
493 case 1: FitMean((TH1 *) projch, nentries, mean); break;
494 case 2: FitCH((TH1 *) projch, mean); break;
495 case 3: FitBisCH((TH1 *) projch, mean); break;
496 default: return kFALSE;
497 }
55a288e5 498 // Fill Infos Fit
3a0f6479 499 FillInfosFitCH(idect);
55a288e5 500 // Memory!!!
3a0f6479 501 if (fDebugLevel != 1) {
55a288e5 502 delete projch;
503 }
55a288e5 504 } // Boucle object
55a288e5 505 // Normierungcharge
3a0f6479 506 if (fDebugLevel != 1) {
55a288e5 507 NormierungCharge();
508 }
55a288e5 509 // Mean Statistics
510 if (fNumberFit > 0) {
3a0f6479 511 AliInfo(Form("There are %d with at least one entries. %d fits have been proceeded (sucessfully or not...). There is a mean statistic of: %d over these fitted histograms and %d successfulled fits",fNumberEnt, fNumberFit, (Int_t) fStatisticMean/fNumberFit, fNumberFitSuccess));
55a288e5 512 fStatisticMean = fStatisticMean / fNumberFit;
513 }
514 else {
515 AliInfo(Form("There are %d with at least one entries. There is no fit!",fNumberEnt));
516 }
3a0f6479 517 delete fDebugStreamer;
518 fDebugStreamer = 0x0;
55a288e5 519 return kTRUE;
55a288e5 520}
3a0f6479 521//________________functions fit Online PH2d____________________________________
522Bool_t AliTRDCalibraFit::AnalysePH(TProfile2D *ph)
55a288e5 523{
524 //
3a0f6479 525 // Take the 1D profiles (average pulse height), projections of the 2D PH
526 // on the Xaxis, for each calibration group
527 // Reconstruct a drift velocity
528 // A first calibration of T0 is also made using the same method
55a288e5 529 //
530
3a0f6479 531 // Set the calibration mode
532 const char *name = ph->GetTitle();
533 SetModeCalibration(name,1);
534
535 // Number of Xbins (detectors or groups of pads)
536 Int_t nbins = ph->GetNbinsX();// time
537 Int_t nybins = ph->GetNbinsY();// calibration group
538 if (!InitFit(nybins,1)) {
55a288e5 539 return kFALSE;
540 }
3a0f6479 541 if (!InitFitPH()) {
55a288e5 542 return kFALSE;
543 }
544 fStatisticMean = 0.0;
545 fNumberFit = 0;
546 fNumberFitSuccess = 0;
547 fNumberEnt = 0;
55a288e5 548 // Init fCountDet and fCount
3a0f6479 549 InitfCountDetAndfCount(1);
550 // Beginning of the loop
551 for (Int_t idect = fDect1; idect < fDect2; idect++) {
552 // Determination of fNnZ, fNnRphi, fNfragZ and fNfragRphi.......
553 UpdatefCountDetAndfCount(idect,1);
554 ReconstructFitRowMinRowMax(idect,1);
555 // Take the histo
556 TH1D *projph = (TH1D *) ph->ProjectionX("projph",idect+1,idect+1,(Option_t *) "e");
557 projph->SetDirectory(0);
558 // Number of entries for this calibration group
559 Double_t nentries = 0;
560 for (Int_t k = 0; k < nbins; k++) {
561 Int_t binnb = (nbins+2)*(idect+1)+(k+1);
562 nentries += ph->GetBinEntries(binnb);
55a288e5 563 }
55a288e5 564 if (nentries > 0) {
3a0f6479 565 fNumberEnt++;
566 }
567 //printf("The number of entries for the group %d is %f\n",idect,nentries);
568 // This detector has not enough statistics or was off
569 if (nentries <= fMinEntries) {
570 //printf("Not enough statistic!\n");
571 NotEnoughStatisticPH(idect);
572 if (fDebugLevel != 1) {
573 delete projph;
574 }
55a288e5 575 continue;
55a288e5 576 }
3a0f6479 577 // Statistics of the histos fitted
55a288e5 578 fNumberFit++;
579 fStatisticMean += nentries;
3a0f6479 580 // Calcul of "real" coef
581 CalculVdriftCoefMean();
582 CalculT0CoefMean();
583 //Method choosen
584 switch(fMethod)
585 {
586 case 0: FitLagrangePoly((TH1 *) projph); break;
587 case 1: FitPente((TH1 *) projph); break;
588 case 2: FitPH((TH1 *) projph,(Int_t) (idect - fDect1)); break;
589 default: return kFALSE;
590 }
591 // Fill the tree if end of a detector or only the pointer to the branch!!!
592 FillInfosFitPH(idect);
593 // Memory!!!
594 if (fDebugLevel != 1) {
595 delete projph;
55a288e5 596 }
55a288e5 597 } // Boucle object
55a288e5 598 // Mean Statistic
599 if (fNumberFit > 0) {
3a0f6479 600 AliInfo(Form("There are %d with at least one entries. %d fits have been proceeded (sucessfully or not...). There is a mean statistic of: %d over these fitted histograms and %d successfulled fits",fNumberEnt, fNumberFit, (Int_t) fStatisticMean/fNumberFit,fNumberFitSuccess));
55a288e5 601 fStatisticMean = fStatisticMean / fNumberFit;
602 }
603 else {
604 AliInfo(Form("There are %d with at least one entries. There is no fit!",fNumberEnt));
605 }
3a0f6479 606 delete fDebugStreamer;
607 fDebugStreamer = 0x0;
55a288e5 608 return kTRUE;
55a288e5 609}
3a0f6479 610//____________Functions fit Online PH2d________________________________________
611Bool_t AliTRDCalibraFit::AnalysePH(AliTRDCalibraVector *calvect)
55a288e5 612{
613 //
3a0f6479 614 // Reconstruct the average pulse height from the vectorPH for each
615 // calibration group
616 // Reconstruct a drift velocity
55a288e5 617 // A first calibration of T0 is also made using the same method (slope method)
618 //
619
3a0f6479 620 // Set the calibration mode
621 const char *name = calvect->GetNamePH();
622 SetModeCalibration(name,1);
623
624 // Number of Xbins (detectors or groups of pads)
625 if (!InitFit((432*calvect->GetDetCha0(1)+108*calvect->GetDetCha2(1)),1)) {
55a288e5 626 return kFALSE;
627 }
3a0f6479 628 if (!InitFitPH()) {
55a288e5 629 return kFALSE;
630 }
631 fStatisticMean = 0.0;
632 fNumberFit = 0;
633 fNumberFitSuccess = 0;
634 fNumberEnt = 0;
55a288e5 635 // Init fCountDet and fCount
636 InitfCountDetAndfCount(1);
55a288e5 637 // Beginning of the loop
3a0f6479 638 for (Int_t idect = fDect1; idect < fDect2; idect++) {
639 // Determination of fNnZ, fNnRphi, fNfragZ and fNfragRphi...........
55a288e5 640 UpdatefCountDetAndfCount(idect,1);
55a288e5 641 ReconstructFitRowMinRowMax(idect,1);
3a0f6479 642 // Take the histo
643 TH1F *projph = 0x0;
644 fEntriesCurrent = 0;
645 Bool_t something = kTRUE;
646 if(!calvect->GetPHEntries(fCountDet)) something = kFALSE;
647 if(something){
648 TString name("PH");
649 name += idect;
650 projph = CorrectTheError((TGraphErrors *) (calvect->ConvertVectorPHTGraphErrors(fCountDet,(idect-(fCount-(fCalibraMode->GetNfragZ(1)*fCalibraMode->GetNfragRphi(1)))),(const char *) name)));
651 projph->SetDirectory(0);
652 }
653 //printf("The number of entries for the group %d is %d\n",idect,fEntriesCurrent);
55a288e5 654 // This detector has not enough statistics or was off
3a0f6479 655 if (fEntriesCurrent <= fMinEntries) {
656 //printf("Not enough stat!\n");
657 NotEnoughStatisticPH(idect);
658 if (fDebugLevel != 1) {
659 if(projph) delete projph;
55a288e5 660 }
55a288e5 661 continue;
55a288e5 662 }
3a0f6479 663 // Statistic of the histos fitted
55a288e5 664 fNumberFit++;
3a0f6479 665 fStatisticMean += fEntriesCurrent;
55a288e5 666 // Calcul of "real" coef
3a0f6479 667 CalculVdriftCoefMean();
668 CalculT0CoefMean();
669 //Method choosen
670 switch(fMethod)
671 {
672 case 0: FitLagrangePoly((TH1 *) projph); break;
673 case 1: FitPente((TH1 *) projph); break;
674 case 2: FitPH((TH1 *) projph,(Int_t) (idect - fDect1)); break;
675 default: return kFALSE;
676 }
55a288e5 677 // Fill the tree if end of a detector or only the pointer to the branch!!!
3a0f6479 678 FillInfosFitPH(idect);
55a288e5 679 // Memory!!!
3a0f6479 680 if (fDebugLevel != 1) {
55a288e5 681 delete projph;
682 }
55a288e5 683 } // Boucle object
3a0f6479 684
55a288e5 685 // Mean Statistic
686 if (fNumberFit > 0) {
3a0f6479 687 AliInfo(Form("There are %d with at least one entries. %d fits have been proceeded (sucessfully or not...). There is a mean statistic of: %d over these fitted histograms and %d successfulled fits",fNumberEnt, fNumberFit, (Int_t) fStatisticMean/fNumberFit,fNumberFitSuccess));
55a288e5 688 fStatisticMean = fStatisticMean / fNumberFit;
689 }
690 else {
691 AliInfo(Form("There are %d with at least one entries. There is no fit!",fNumberEnt));
692 }
3a0f6479 693 delete fDebugStreamer;
694 fDebugStreamer = 0x0;
55a288e5 695 return kTRUE;
55a288e5 696}
3a0f6479 697//____________Functions fit Online PRF2d_______________________________________
698Bool_t AliTRDCalibraFit::AnalysePRF(TProfile2D *prf)
55a288e5 699{
700 //
3a0f6479 701 // Take the 1D profiles (pad response function), projections of the 2D PRF
702 // on the Xaxis, for each calibration group
703 // Fit with a gaussian to reconstruct the sigma of the pad response function
55a288e5 704 //
705
3a0f6479 706 // Set the calibration mode
707 const char *name = prf->GetTitle();
708 SetModeCalibration(name,2);
55a288e5 709
3a0f6479 710 // Number of Ybins (detectors or groups of pads)
711 Int_t nybins = prf->GetNbinsY();// calibration groups
712 Int_t nbins = prf->GetNbinsX();// bins
713 Int_t nbg = GetNumberOfGroupsPRF((const char *)prf->GetTitle());
714 if((nbg > 0) || (nbg == -1)) return kFALSE;
715 if (!InitFit(nybins,2)) {
55a288e5 716 return kFALSE;
717 }
3a0f6479 718 if (!InitFitPRF()) {
55a288e5 719 return kFALSE;
720 }
721 fStatisticMean = 0.0;
722 fNumberFit = 0;
723 fNumberFitSuccess = 0;
724 fNumberEnt = 0;
55a288e5 725 // Init fCountDet and fCount
3a0f6479 726 InitfCountDetAndfCount(2);
55a288e5 727 // Beginning of the loop
3a0f6479 728 for (Int_t idect = fDect1; idect < fDect2; idect++) {
729 // Determination of fNnZ, fNnRphi, fNfragZ and fNfragRphi......
730 UpdatefCountDetAndfCount(idect,2);
731 ReconstructFitRowMinRowMax(idect,2);
732 // Take the histo
733 TH1D *projprf = (TH1D *) prf->ProjectionX("projprf",idect+1,idect+1,(Option_t *) "e");
734 projprf->SetDirectory(0);
735 // Number of entries for this calibration group
736 Double_t nentries = 0;
737 for (Int_t k = 0; k < nbins; k++) {
738 Int_t binnb = (nbins+2)*(idect+1)+(k+1);
739 nentries += prf->GetBinEntries(binnb);
55a288e5 740 }
3a0f6479 741 if(nentries > 0) fNumberEnt++;
55a288e5 742 // This detector has not enough statistics or was off
3a0f6479 743 if (nentries <= fMinEntries) {
744 NotEnoughStatisticPRF(idect);
745 if (fDebugLevel != 1) {
746 delete projprf;
55a288e5 747 }
55a288e5 748 continue;
55a288e5 749 }
3a0f6479 750 // Statistics of the histos fitted
55a288e5 751 fNumberFit++;
3a0f6479 752 fStatisticMean += nentries;
55a288e5 753 // Calcul of "real" coef
3a0f6479 754 CalculPRFCoefMean();
755 //Method choosen
756 switch(fMethod)
757 {
758 case 0: FitPRF((TH1 *) projprf); break;
759 case 1: RmsPRF((TH1 *) projprf); break;
760 default: return kFALSE;
761 }
55a288e5 762 // Fill the tree if end of a detector or only the pointer to the branch!!!
3a0f6479 763 FillInfosFitPRF(idect);
55a288e5 764 // Memory!!!
3a0f6479 765 if (fDebugLevel != 1) {
766 delete projprf;
55a288e5 767 }
55a288e5 768 } // Boucle object
55a288e5 769 // Mean Statistic
770 if (fNumberFit > 0) {
771 AliInfo(Form("There are %d with at least one entries.",fNumberEnt));
772 AliInfo(Form("%d fits have been proceeded (sucessfully or not...).",fNumberFit));
773 AliInfo(Form("There is a mean statistic of: %d over these fitted histograms and %d successfulled fits"
774 ,(Int_t) fStatisticMean/fNumberFit,fNumberFitSuccess));
775 fStatisticMean = fStatisticMean / fNumberFit;
776 }
777 else {
778 AliInfo(Form("There are %d with at least one entries. There is no fit!",fNumberEnt));
779 }
3a0f6479 780 delete fDebugStreamer;
781 fDebugStreamer = 0x0;
55a288e5 782 return kTRUE;
55a288e5 783}
3a0f6479 784//____________Functions fit Online PRF2d_______________________________________
785Bool_t AliTRDCalibraFit::AnalysePRFMarianFit(TProfile2D *prf)
55a288e5 786{
787 //
3a0f6479 788 // Take the 1D profiles (pad response function), projections of the 2D PRF
789 // on the Xaxis, for each calibration group
790 // Fit with a gaussian to reconstruct the sigma of the pad response function
55a288e5 791 //
3a0f6479 792
793 // Set the calibration mode
794 const char *name = prf->GetTitle();
795 SetModeCalibration(name,2);
796
797 // Number of Ybins (detectors or groups of pads)
798 TAxis *xprf = prf->GetXaxis();
799 TAxis *yprf = prf->GetYaxis();
800 Int_t nybins = yprf->GetNbins();// calibration groups
801 Int_t nbins = xprf->GetNbins();// bins
802 Float_t lowedge = (Float_t) xprf->GetBinLowEdge(1);//lowedge in bins
803 Float_t upedge = (Float_t) xprf->GetBinUpEdge(nbins);//upedge in bins
804 Int_t nbg = GetNumberOfGroupsPRF((const char *)name);
805 if(nbg == -1) return kFALSE;
806 if(nbg > 0) fMethod = 1;
807 else fMethod = 0;
808 if (!InitFit(nybins,2)) {
55a288e5 809 return kFALSE;
810 }
3a0f6479 811 if (!InitFitPRF()) {
55a288e5 812 return kFALSE;
813 }
814 fStatisticMean = 0.0;
3a0f6479 815 fNumberFit = 0;
55a288e5 816 fNumberFitSuccess = 0;
817 fNumberEnt = 0;
55a288e5 818 // Init fCountDet and fCount
3a0f6479 819 InitfCountDetAndfCount(2);
55a288e5 820 // Beginning of the loop
3a0f6479 821 for (Int_t idect = fDect1; idect < fDect2; idect++) {
822 // Determination of fNnZ, fNnRphi, fNfragZ and fNfragRphi.......
823 UpdatefCountDetAndfCount(idect,2);
824 ReconstructFitRowMinRowMax(idect,2);
825 // Build the array of entries and sum
826 TArrayD arraye = TArrayD(nbins);
827 TArrayD arraym = TArrayD(nbins);
828 TArrayD arrayme = TArrayD(nbins);
829 Double_t nentries = 0;
830 //printf("nbins %d\n",nbins);
831 for (Int_t k = 0; k < nbins; k++) {
832 Int_t binnb = (nbins+2)*(idect+1)+(k+1);
833 Double_t entries = (Double_t)prf->GetBinEntries(binnb);
834 Double_t mean = (Double_t)prf->GetBinContent(binnb);
835 Double_t error = (Double_t)prf->GetBinError(binnb);
836 //printf("for %d we have %f\n",k,entries);
837 nentries += entries;
838 arraye.AddAt(entries,k);
839 arraym.AddAt(mean,k);
840 arrayme.AddAt(error,k);
55a288e5 841 }
3a0f6479 842 if(nentries > 0) fNumberEnt++;
843 //printf("The number of entries for the group %d is %f\n",idect,nentries);
55a288e5 844 // This detector has not enough statistics or was off
3a0f6479 845 if (nentries <= fMinEntries) {
846 NotEnoughStatisticPRF(idect);
55a288e5 847 continue;
55a288e5 848 }
55a288e5 849 // Statistics of the histos fitted
55a288e5 850 fNumberFit++;
3a0f6479 851 fStatisticMean += nentries;
55a288e5 852 // Calcul of "real" coef
3a0f6479 853 CalculPRFCoefMean();
854 //Method choosen
855 switch(fMethod)
856 {
857 case 0: FitPRFGausMI( arraye.GetArray(), arraym.GetArray(), arrayme.GetArray(), nbins, lowedge, upedge); break;
858 case 1: FitTnpRange( arraye.GetArray(), arraym.GetArray(), arrayme.GetArray(), nbg, nbins); break;
859 default: return kFALSE;
860 }
55a288e5 861 // Fill the tree if end of a detector or only the pointer to the branch!!!
3a0f6479 862 FillInfosFitPRF(idect);
55a288e5 863 } // Boucle object
3a0f6479 864 // Mean Statistic
55a288e5 865 if (fNumberFit > 0) {
866 AliInfo(Form("There are %d with at least one entries.",fNumberEnt));
867 AliInfo(Form("%d fits have been proceeded (sucessfully or not...).",fNumberFit));
868 AliInfo(Form("There is a mean statistic of: %d over these fitted histograms and %d successfulled fits"
869 ,(Int_t) fStatisticMean/fNumberFit,fNumberFitSuccess));
870 fStatisticMean = fStatisticMean / fNumberFit;
871 }
872 else {
873 AliInfo(Form("There are %d with at least one entries. There is no fit!",fNumberEnt));
874 }
3a0f6479 875 delete fDebugStreamer;
876 fDebugStreamer = 0x0;
55a288e5 877 return kTRUE;
55a288e5 878}
55a288e5 879//____________Functions fit Online PRF2d_______________________________________
3a0f6479 880Bool_t AliTRDCalibraFit::AnalysePRF(AliTRDCalibraVector *calvect)
55a288e5 881{
882 //
3a0f6479 883 // Reconstruct the 1D histo (pad response function) from the vectorPRD for
884 // each calibration group
55a288e5 885 // Fit with a gaussian to reconstruct the sigma of the pad response function
55a288e5 886 //
887
3a0f6479 888 // Set the calibra mode
889 const char *name = calvect->GetNamePRF();
890 SetModeCalibration(name,2);
891 //printf("test0 %s\n",name);
55a288e5 892
893 // Number of Xbins (detectors or groups of pads)
3a0f6479 894 if (!InitFit((432*calvect->GetDetCha0(2)+108*calvect->GetDetCha2(2)),2)) {
895 //printf("test1\n");
896 return kFALSE;
897 }
898 if (!InitFitPRF()) {
899 ///printf("test2\n");
55a288e5 900 return kFALSE;
901 }
902 fStatisticMean = 0.0;
903 fNumberFit = 0;
904 fNumberFitSuccess = 0;
905 fNumberEnt = 0;
55a288e5 906 // Init fCountDet and fCount
907 InitfCountDetAndfCount(2);
55a288e5 908 // Beginning of the loop
3a0f6479 909 for (Int_t idect = fDect1; idect < fDect2; idect++) {
910 // Determination of fNnZ, fNnRphi, fNfragZ and fNfragRphi........
55a288e5 911 UpdatefCountDetAndfCount(idect,2);
55a288e5 912 ReconstructFitRowMinRowMax(idect,2);
3a0f6479 913 // Take the histo
914 TH1F *projprf = 0x0;
915 fEntriesCurrent = 0;
916 Bool_t something = kTRUE;
917 if(!calvect->GetPRFEntries(fCountDet)) something = kFALSE;
918 if(something){
919 TString name("PRF");
920 name += idect;
921 projprf = CorrectTheError((TGraphErrors *) (calvect->ConvertVectorPRFTGraphErrors(fCountDet,(idect-(fCount-(fCalibraMode->GetNfragZ(1)*fCalibraMode->GetNfragRphi(1)))),(const char *) name)));
922 projprf->SetDirectory(0);
923 }
55a288e5 924 // This detector has not enough statistics or was off
3a0f6479 925 if (fEntriesCurrent <= fMinEntries) {
926 NotEnoughStatisticPRF(idect);
927 if (fDebugLevel != 1) {
928 if(projprf) delete projprf;
55a288e5 929 }
55a288e5 930 continue;
55a288e5 931 }
3a0f6479 932 // Statistic of the histos fitted
55a288e5 933 fNumberFit++;
3a0f6479 934 fStatisticMean += fEntriesCurrent;
55a288e5 935 // Calcul of "real" coef
3a0f6479 936 CalculPRFCoefMean();
937 //Method choosen
938 switch(fMethod)
939 {
940 case 1: FitPRF((TH1 *) projprf); break;
941 case 2: RmsPRF((TH1 *) projprf); break;
942 default: return kFALSE;
943 }
55a288e5 944 // Fill the tree if end of a detector or only the pointer to the branch!!!
3a0f6479 945 FillInfosFitPRF(idect);
55a288e5 946 // Memory!!!
3a0f6479 947 if (fDebugLevel != 1) {
55a288e5 948 delete projprf;
949 }
55a288e5 950 } // Boucle object
3a0f6479 951 // Mean Statistics
55a288e5 952 if (fNumberFit > 0) {
3a0f6479 953 AliInfo(Form("There are %d with at least one entries. %d fits have been proceeded (sucessfully or not...). There is a mean statistic of: %d over these fitted histograms and %d successfulled fits",fNumberEnt, fNumberFit, (Int_t) fStatisticMean/fNumberFit,fNumberFitSuccess));
55a288e5 954 }
955 else {
956 AliInfo(Form("There are %d with at least one entries. There is no fit!",fNumberEnt));
957 }
3a0f6479 958 delete fDebugStreamer;
959 fDebugStreamer = 0x0;
55a288e5 960 return kTRUE;
55a288e5 961}
55a288e5 962//____________Functions fit Online PRF2d_______________________________________
3a0f6479 963Bool_t AliTRDCalibraFit::AnalysePRFMarianFit(AliTRDCalibraVector *calvect)
55a288e5 964{
965 //
966 // Reconstruct the 1D histo (pad response function) from the vectorPRD for
967 // each calibration group
968 // Fit with a gaussian to reconstruct the sigma of the pad response function
55a288e5 969 //
970
3a0f6479 971 // Set the calibra mode
972 const char *name = calvect->GetNamePRF();
973 SetModeCalibration(name,2);
974 //printf("test0 %s\n",name);
975 Int_t nbg = GetNumberOfGroupsPRF((const char *)name);
976 printf("test1 %d\n",nbg);
977 if(nbg == -1) return kFALSE;
978 if(nbg > 0) fMethod = 1;
979 else fMethod = 0;
980 // Number of Xbins (detectors or groups of pads)
981 if (!InitFit((432*calvect->GetDetCha0(2)+108*calvect->GetDetCha2(2)),2)) {
982 //printf("test2\n");
55a288e5 983 return kFALSE;
984 }
3a0f6479 985 if (!InitFitPRF()) {
986 //printf("test3\n");
55a288e5 987 return kFALSE;
988 }
989 fStatisticMean = 0.0;
990 fNumberFit = 0;
991 fNumberFitSuccess = 0;
992 fNumberEnt = 0;
3a0f6479 993 // Variables
994 Int_t nbins = 0;
995 Double_t *arrayx = 0;
996 Double_t *arraye = 0;
997 Double_t *arraym = 0;
998 Double_t *arrayme = 0;
999 Float_t lowedge = 0.0;
1000 Float_t upedge = 0.0;
55a288e5 1001 // Init fCountDet and fCount
1002 InitfCountDetAndfCount(2);
55a288e5 1003 // Beginning of the loop
3a0f6479 1004 for (Int_t idect = fDect1; idect < fDect2; idect++) {
1005 // Determination of fNnZ, fNnRphi, fNfragZ and fNfragRphi......
55a288e5 1006 UpdatefCountDetAndfCount(idect,2);
55a288e5 1007 ReconstructFitRowMinRowMax(idect,2);
3a0f6479 1008 // Take the histo
1009 TGraphErrors *projprftree = 0x0;
1010 fEntriesCurrent = 0;
1011 Bool_t something = kTRUE;
1012 if(!calvect->GetPRFEntries(fCountDet)) something = kFALSE;
1013 if(something){
1014 TString name("PRF");
1015 name += idect;
1016 projprftree = calvect->ConvertVectorPRFTGraphErrors(fCountDet,(idect-(fCount-(fCalibraMode->GetNfragZ(1)*fCalibraMode->GetNfragRphi(1)))),(const char *) name);
1017 nbins = projprftree->GetN();
1018 arrayx = (Double_t *)projprftree->GetX();
1019 arraye = (Double_t *)projprftree->GetEX();
1020 arraym = (Double_t *)projprftree->GetY();
1021 arrayme = (Double_t *)projprftree->GetEY();
1022 Float_t step = arrayx[1]-arrayx[0];
1023 lowedge = arrayx[0] - step/2.0;
1024 upedge = arrayx[(nbins-1)] + step/2.0;
1025 //printf("nbins est %d\n",nbins);
1026 for(Int_t k = 0; k < nbins; k++){
1027 fEntriesCurrent += (Int_t)arraye[k];
1028 //printf("for %d we have %f, %f\n",k,arraye[k],((projprftree->GetEX())[k]));
1029 if(arraye[k]>0.0) arrayme[k] = TMath::Sqrt(TMath::Abs(arrayme[k]-arraym[k]*arraym[k])/arraye[k]);
55a288e5 1030 }
3a0f6479 1031 if(fEntriesCurrent > 0) fNumberEnt++;
1032 }
1033 //printf("The number of entries for the group %d is %d\n",idect,fEntriesCurrent);
1034 // This detector has not enough statistics or was off
1035 if (fEntriesCurrent <= fMinEntries) {
1036 NotEnoughStatisticPRF(idect);
1037 if(projprftree) delete projprftree;
55a288e5 1038 continue;
55a288e5 1039 }
55a288e5 1040 // Statistic of the histos fitted
55a288e5 1041 fNumberFit++;
1042 fStatisticMean += fEntriesCurrent;
55a288e5 1043 // Calcul of "real" coef
3a0f6479 1044 CalculPRFCoefMean();
1045 //Method choosen
1046 switch(fMethod)
1047 {
1048 case 0: FitPRFGausMI(arraye,arraym,arrayme,nbins,lowedge,upedge); break;
1049 case 1: FitTnpRange(arraye,arraym,arrayme,nbg,nbins); break;
1050 default: return kFALSE;
1051 }
55a288e5 1052 // Fill the tree if end of a detector or only the pointer to the branch!!!
3a0f6479 1053 FillInfosFitPRF(idect);
55a288e5 1054 // Memory!!!
3a0f6479 1055 if (fDebugLevel != 1) {
1056 delete projprftree;
55a288e5 1057 }
55a288e5 1058 } // Boucle object
55a288e5 1059 // Mean Statistics
1060 if (fNumberFit > 0) {
3a0f6479 1061 AliInfo(Form("There are %d with at least one entries. %d fits have been proceeded (sucessfully or not...). There is a mean statistic of: %d over these fitted histograms and %d successfulled fits",fNumberEnt, fNumberFit, (Int_t) fStatisticMean/fNumberFit,fNumberFitSuccess));
55a288e5 1062 }
1063 else {
1064 AliInfo(Form("There are %d with at least one entries. There is no fit!",fNumberEnt));
1065 }
3a0f6479 1066 delete fDebugStreamer;
1067 fDebugStreamer = 0x0;
55a288e5 1068 return kTRUE;
55a288e5 1069}
3a0f6479 1070//____________Functions fit Online CH2d________________________________________
1071Bool_t AliTRDCalibraFit::AnalyseLinearFitters(AliTRDCalibraVdriftLinearFit *calivdli)
55a288e5 1072{
1073 //
3a0f6479 1074 // The linear method
55a288e5 1075 //
1076
55a288e5 1077 fStatisticMean = 0.0;
1078 fNumberFit = 0;
1079 fNumberFitSuccess = 0;
1080 fNumberEnt = 0;
3a0f6479 1081 if(!InitFitLinearFitter()) return kFALSE;
55a288e5 1082
3a0f6479 1083
1084 for(Int_t idet = 0; idet < 540; idet++){
55a288e5 1085
55a288e5 1086
3a0f6479 1087 //printf("detector number %d\n",idet);
55a288e5 1088
3a0f6479 1089 // Take the result
1090 TVectorD param(2);
1091 TVectorD error(3);
1092 fEntriesCurrent = 0;
1093 fCountDet = idet;
1094 Bool_t here = calivdli->GetParam(idet,&param);
1095 Bool_t heree = calivdli->GetError(idet,&error);
1096 //printf("here %d and heree %d\n",here, heree);
1097 if(heree) {
1098 fEntriesCurrent = (Int_t) error[2];
55a288e5 1099 fNumberEnt++;
55a288e5 1100 }
3a0f6479 1101 //printf("Number of entries %d\n",fEntriesCurrent);
1102 // Nothing found or not enough statistic
1103 if((!heree) || (!here) || (fEntriesCurrent <= fMinEntries)) {
1104 NotEnoughStatisticLinearFitter();
1105 continue;
1106 }
1107 //param.Print();
1108 //error.Print();
1109 //Statistics
1110 fNumberFit++;
1111 fStatisticMean += fEntriesCurrent;
55a288e5 1112
3a0f6479 1113 // Check the fit
1114 if((-(param[1])) <= 0.0) {
1115 NotEnoughStatisticLinearFitter();
1116 continue;
1117 }
55a288e5 1118
3a0f6479 1119 // CalculDatabaseVdriftandTan
1120 CalculVdriftLorentzCoef();
55a288e5 1121
3a0f6479 1122 // Statistics
1123 fNumberFitSuccess ++;
55a288e5 1124
3a0f6479 1125 // Put the fCurrentCoef
1126 fCurrentCoef[0] = -param[1];
1127 // here the database must be the one of the reconstruction for the lorentz angle....
1128 fCurrentCoef2[0] = (param[0]+fCurrentCoef[1]*fCurrentCoef2[1])/fCurrentCoef[0];
1129 fCurrentCoefE = error[1];
1130 fCurrentCoefE2 = error[0];
1131 if((fCurrentCoef2[0] != 0.0) && (param[0] != 0.0)){
1132 fCurrentCoefE2 = (fCurrentCoefE2/param[0]+fCurrentCoefE/fCurrentCoef[0])*fCurrentCoef2[0];
1133 }
55a288e5 1134
3a0f6479 1135 // Fill
1136 FillInfosFitLinearFitter();
55a288e5 1137
55a288e5 1138
55a288e5 1139 }
55a288e5 1140 // Mean Statistics
1141 if (fNumberFit > 0) {
3a0f6479 1142 AliInfo(Form("There are %d with at least one entries. %d fits have been proceeded (sucessfully or not...). There is a mean statistic of: %d over these fitted histograms and %d successfulled fits",fNumberEnt, fNumberFit, (Int_t) fStatisticMean/fNumberFit,fNumberFitSuccess));
55a288e5 1143 }
1144 else {
1145 AliInfo(Form("There are %d with at least one entries. There is no fit!",fNumberEnt));
1146 }
3a0f6479 1147 delete fDebugStreamer;
1148 fDebugStreamer = 0x0;
55a288e5 1149 return kTRUE;
1150
1151}
55a288e5 1152//____________Functions for seeing if the pad is really okey___________________
3a0f6479 1153//_____________________________________________________________________________
1154Int_t AliTRDCalibraFit::GetNumberOfGroupsPRF(const char* nametitle)
1155{
1156 //
1157 // Get numberofgroupsprf
1158 //
1159
1160 // Some patterns
1161 const Char_t *pattern0 = "Ngp0";
1162 const Char_t *pattern1 = "Ngp1";
1163 const Char_t *pattern2 = "Ngp2";
1164 const Char_t *pattern3 = "Ngp3";
1165 const Char_t *pattern4 = "Ngp4";
1166 const Char_t *pattern5 = "Ngp5";
1167 const Char_t *pattern6 = "Ngp6";
1168
1169 // Nrphi mode
1170 if (strstr(nametitle,pattern0)) {
1171 return 0;
1172 }
1173 if (strstr(nametitle,pattern1)) {
1174 return 1;
1175 }
1176 if (strstr(nametitle,pattern2)) {
1177 return 2;
1178 }
1179 if (strstr(nametitle,pattern3)) {
1180 return 3;
1181 }
1182 if (strstr(nametitle,pattern4)) {
1183 return 4;
1184 }
1185 if (strstr(nametitle,pattern5)) {
1186 return 5;
1187 }
1188 if (strstr(nametitle,pattern6)){
1189 return 6;
1190 }
1191 else return -1;
1192
55a288e5 1193
3a0f6479 1194}
55a288e5 1195//_____________________________________________________________________________
3a0f6479 1196Bool_t AliTRDCalibraFit::SetModeCalibration(const char *name, Int_t i)
55a288e5 1197{
1198 //
1199 // Set fNz[i] and fNrphi[i] of the AliTRDCalibraFit::Instance()
3a0f6479 1200 // corresponding to the given name
55a288e5 1201 //
1202
3a0f6479 1203 if(!SetNzFromTObject(name,i)) return kFALSE;
1204 if(!SetNrphiFromTObject(name,i)) return kFALSE;
1205
1206 return kTRUE;
55a288e5 1207
3a0f6479 1208}
1209//_____________________________________________________________________________
1210Bool_t AliTRDCalibraFit::SetNrphiFromTObject(const char *name, Int_t i)
1211{
1212 //
1213 // Set fNrphi[i] of the AliTRDCalibraFit::Instance()
1214 // corresponding to the given TObject
1215 //
1216
55a288e5 1217 // Some patterns
55a288e5 1218 const Char_t *patternrphi0 = "Nrphi0";
1219 const Char_t *patternrphi1 = "Nrphi1";
1220 const Char_t *patternrphi2 = "Nrphi2";
1221 const Char_t *patternrphi3 = "Nrphi3";
1222 const Char_t *patternrphi4 = "Nrphi4";
1223 const Char_t *patternrphi5 = "Nrphi5";
1224 const Char_t *patternrphi6 = "Nrphi6";
1225
55a288e5 1226 // Nrphi mode
3a0f6479 1227 if (strstr(name,patternrphi0)) {
55a288e5 1228 fCalibraMode->SetNrphi(i ,0);
3a0f6479 1229 return kTRUE;
55a288e5 1230 }
3a0f6479 1231 if (strstr(name,patternrphi1)) {
55a288e5 1232 fCalibraMode->SetNrphi(i, 1);
3a0f6479 1233 return kTRUE;
55a288e5 1234 }
3a0f6479 1235 if (strstr(name,patternrphi2)) {
55a288e5 1236 fCalibraMode->SetNrphi(i, 2);
3a0f6479 1237 return kTRUE;
55a288e5 1238 }
3a0f6479 1239 if (strstr(name,patternrphi3)) {
55a288e5 1240 fCalibraMode->SetNrphi(i, 3);
3a0f6479 1241 return kTRUE;
55a288e5 1242 }
3a0f6479 1243 if (strstr(name,patternrphi4)) {
55a288e5 1244 fCalibraMode->SetNrphi(i, 4);
3a0f6479 1245 return kTRUE;
55a288e5 1246 }
3a0f6479 1247 if (strstr(name,patternrphi5)) {
55a288e5 1248 fCalibraMode->SetNrphi(i, 5);
3a0f6479 1249 return kTRUE;
55a288e5 1250 }
3a0f6479 1251 if (strstr(name,patternrphi6)) {
55a288e5 1252 fCalibraMode->SetNrphi(i, 6);
55a288e5 1253 return kTRUE;
1254 }
55a288e5 1255
3a0f6479 1256 fCalibraMode->SetNrphi(i ,0);
1257 return kFALSE;
1258
55a288e5 1259}
55a288e5 1260//_____________________________________________________________________________
3a0f6479 1261Bool_t AliTRDCalibraFit::SetNzFromTObject(const char *name, Int_t i)
55a288e5 1262{
1263 //
3a0f6479 1264 // Set fNz[i] of the AliTRDCalibraFit::Instance()
1265 // corresponding to the given TObject
55a288e5 1266 //
3a0f6479 1267
1268 // Some patterns
1269 const Char_t *patternz0 = "Nz0";
1270 const Char_t *patternz1 = "Nz1";
1271 const Char_t *patternz2 = "Nz2";
1272 const Char_t *patternz3 = "Nz3";
1273 const Char_t *patternz4 = "Nz4";
55a288e5 1274
3a0f6479 1275 if (strstr(name,patternz0)) {
1276 fCalibraMode->SetNz(i, 0);
1277 return kTRUE;
55a288e5 1278 }
3a0f6479 1279 if (strstr(name,patternz1)) {
1280 fCalibraMode->SetNz(i ,1);
1281 return kTRUE;
55a288e5 1282 }
3a0f6479 1283 if (strstr(name,patternz2)) {
1284 fCalibraMode->SetNz(i ,2);
1285 return kTRUE;
55a288e5 1286 }
3a0f6479 1287 if (strstr(name,patternz3)) {
1288 fCalibraMode->SetNz(i ,3);
1289 return kTRUE;
55a288e5 1290 }
3a0f6479 1291 if (strstr(name,patternz4)) {
1292 fCalibraMode->SetNz(i ,4);
1293 return kTRUE;
55a288e5 1294 }
3a0f6479 1295
1296 fCalibraMode->SetNz(i ,0);
1297 return kFALSE;
1298}
1299//_____________________________________________________________________________
1300AliTRDCalDet *AliTRDCalibraFit::CreateDetObjectVdrift(TObjArray *vectorFit, Bool_t perdetector)
1301{
1302 //
1303 // It creates the AliTRDCalDet object from the AliTRDFitInfo
1304 // It takes the mean value of the coefficients per detector
1305 // This object has to be written in the database
1306 //
55a288e5 1307
3a0f6479 1308 // Create the DetObject
1309 AliTRDCalDet *object = new AliTRDCalDet("ChamberVdrift","TRD drift velocities (detector value)");
1310
1311 Int_t loop = (Int_t) vectorFit->GetEntriesFast();
1312 if(loop != 540) AliInfo("The Vector Fit is not complete!");
1313 Int_t detector = -1;
1314 Float_t value = 0.0;
1315
1316 for (Int_t k = 0; k < loop; k++) {
1317 detector = ((AliTRDFitInfo *) vectorFit->At(k))->GetDetector();
1318 Float_t mean = 0.0;
1319 if(perdetector){
1320 mean = TMath::Abs(((AliTRDFitInfo *) vectorFit->At(k))->GetCoef()[0]);
55a288e5 1321 }
1322 else {
3a0f6479 1323 Int_t count = 0;
1324 Int_t rowMax = fGeo->GetRowMax(GetPlane(detector),GetChamber(detector),GetSector(detector));
1325 Int_t colMax = fGeo->GetColMax(GetPlane(detector));
1326 for (Int_t row = 0; row < rowMax; row++) {
1327 for (Int_t col = 0; col < colMax; col++) {
1328 value = ((AliTRDFitInfo *) vectorFit->At(k))->GetCoef()[(Int_t)(col*rowMax+row)];
1329 mean += TMath::Abs(value);
1330 count++;
1331 } // Col
1332 } // Row
1333 if(count > 0) mean = mean/count;
55a288e5 1334 }
1335 object->SetValue(detector,mean);
1336 }
3a0f6479 1337
55a288e5 1338 return object;
55a288e5 1339}
55a288e5 1340//_____________________________________________________________________________
3a0f6479 1341AliTRDCalDet *AliTRDCalibraFit::CreateDetObjectGain(TObjArray *vectorFit, Double_t scaleFitFactor, Bool_t perdetector)
55a288e5 1342{
1343 //
3a0f6479 1344 // It creates the AliTRDCalDet object from the AliTRDFitInfo
1345 // It takes the mean value of the coefficients per detector
55a288e5 1346 // This object has to be written in the database
1347 //
1348
1349 // Create the DetObject
3a0f6479 1350 AliTRDCalDet *object = new AliTRDCalDet("ChamberGainFactor","GainFactor (detector value)");
55a288e5 1351
3a0f6479 1352
1353 Int_t loop = (Int_t) vectorFit->GetEntriesFast();
1354 if(loop != 540) AliInfo("The Vector Fit is not complete!");
1355 Int_t detector = -1;
1356 Float_t value = 0.0;
1357
1358 for (Int_t k = 0; k < loop; k++) {
1359 detector = ((AliTRDFitInfo *) vectorFit->At(k))->GetDetector();
1360 Float_t mean = 0.0;
1361 if(perdetector){
1362 value = ((AliTRDFitInfo *) vectorFit->At(k))->GetCoef()[0];
1363 if(value > 0) value = value*scaleFitFactor;
1364 mean = TMath::Abs(value);
1365 }
1366 else{
1367 Int_t count = 0;
1368 Int_t rowMax = fGeo->GetRowMax(GetPlane(detector),GetChamber(detector),GetSector(detector));
1369 Int_t colMax = fGeo->GetColMax(GetPlane(detector));
1370 for (Int_t row = 0; row < rowMax; row++) {
1371 for (Int_t col = 0; col < colMax; col++) {
1372 value = ((AliTRDFitInfo *) vectorFit->At(k))->GetCoef()[(Int_t)(col*rowMax+row)];
1373 if(value > 0) value = value*scaleFitFactor;
1374 mean += TMath::Abs(value);
1375 count++;
1376 } // Col
1377 } // Row
1378 if(count > 0) mean = mean/count;
1379 }
1380 object->SetValue(detector,mean);
55a288e5 1381 }
3a0f6479 1382
1383 return object;
1384}
1385//_____________________________________________________________________________
1386AliTRDCalDet *AliTRDCalibraFit::CreateDetObjectT0(TObjArray *vectorFit, Bool_t perdetector)
1387{
1388 //
1389 // It creates the AliTRDCalDet object from the AliTRDFitInfo2
1390 // It takes the min value of the coefficients per detector
1391 // This object has to be written in the database
1392 //
55a288e5 1393
3a0f6479 1394 // Create the DetObject
1395 AliTRDCalDet *object = new AliTRDCalDet("ChamberT0","T0 (detector value)");
55a288e5 1396
3a0f6479 1397 Int_t loop = (Int_t) vectorFit->GetEntriesFast();
1398 if(loop != 540) AliInfo("The Vector Fit is not complete!");
1399 Int_t detector = -1;
1400 Float_t value = 0.0;
1401
1402 for (Int_t k = 0; k < loop; k++) {
1403 detector = ((AliTRDFitInfo *) vectorFit->At(k))->GetDetector();
1404 Float_t min = 100.0;
1405 if(perdetector){
1406 min = ((AliTRDFitInfo *) vectorFit->At(k))->GetCoef()[0];
55a288e5 1407 }
3a0f6479 1408 else{
1409 Int_t rowMax = fGeo->GetRowMax(GetPlane(detector),GetChamber(detector),GetSector(detector));
1410 Int_t colMax = fGeo->GetColMax(GetPlane(detector));
1411 for (Int_t row = 0; row < rowMax; row++) {
1412 for (Int_t col = 0; col < colMax; col++) {
1413 value = ((AliTRDFitInfo *) vectorFit->At(k))->GetCoef()[(Int_t)(col*rowMax+row)];
1414 if(min > value) min = value;
1415 } // Col
1416 } // Row
1417 }
1418 object->SetValue(detector,min);
55a288e5 1419 }
1420
1421 return object;
1422
1423}
55a288e5 1424//_____________________________________________________________________________
3a0f6479 1425AliTRDCalDet *AliTRDCalibraFit::CreateDetObjectLorentzAngle(TObjArray *vectorFit)
55a288e5 1426{
1427 //
3a0f6479 1428 // It creates the AliTRDCalDet object from the AliTRDFitInfo2
1429 // It takes the min value of the coefficients per detector
55a288e5 1430 // This object has to be written in the database
1431 //
1432
1433 // Create the DetObject
3a0f6479 1434 AliTRDCalDet *object = new AliTRDCalDet("tan(lorentzangle)","tan(lorentzangle) (detector value)");
1435
1436
1437 Int_t loop = (Int_t) vectorFit->GetEntriesFast();
1438 if(loop != 540) AliInfo("The Vector Fit is not complete!");
1439 Int_t detector = -1;
1440 Float_t value = 0.0;
55a288e5 1441
3a0f6479 1442 for (Int_t k = 0; k < loop; k++) {
1443 detector = ((AliTRDFitInfo *) vectorFit->At(k))->GetDetector();
1444 /*
1445 Int_t rowMax = fGeo->GetRowMax(GetPlane(detector),GetChamber(detector),GetSector(detector));
1446 Int_t colMax = fGeo->GetColMax(GetPlane(detector));
1447 Float_t min = 100.0;
1448 for (Int_t row = 0; row < rowMax; row++) {
1449 for (Int_t col = 0; col < colMax; col++) {
1450 value = ((AliTRDFitInfo *) fVectorFit2.At(k))->GetCoef()[(Int_t)(col*rowMax+row)];
1451 mean += -TMath::Abs(value);
1452 count++;
55a288e5 1453 } // Col
3a0f6479 1454 } // Row
1455 if(count > 0) mean = mean/count;
1456 */
1457 value = ((AliTRDFitInfo *) vectorFit->At(k))->GetCoef()[0];
1458 object->SetValue(detector,-TMath::Abs(value));
55a288e5 1459 }
1460
1461 return object;
3a0f6479 1462
55a288e5 1463}
55a288e5 1464//_____________________________________________________________________________
3a0f6479 1465TObject *AliTRDCalibraFit::CreatePadObjectGain(TObjArray *vectorFit, Double_t scaleFitFactor, AliTRDCalDet *detobject)
1466{
55a288e5 1467 //
3a0f6479 1468 // It Creates the AliTRDCalPad object from AliTRDFitInfo
1469 // You need first to create the object for the detectors,
1470 // where the mean value is put.
1471 // This object has to be written in the database
55a288e5 1472 //
3a0f6479 1473
1474 // Create the DetObject
1475 AliTRDCalPad *object = new AliTRDCalPad("GainFactor","GainFactor (local variations)");
1476
1477 if(!vectorFit){
1478 for(Int_t k = 0; k < 540; k++){
1479 AliTRDCalROC *calROC = object->GetCalROC(k);
1480 Int_t nchannels = calROC->GetNchannels();
1481 for(Int_t ch = 0; ch < nchannels; ch++){
1482 calROC->SetValue(ch,1.0);
1483 }
1484 }
55a288e5 1485 }
3a0f6479 1486 else{
1487
1488 Int_t loop = (Int_t) vectorFit->GetEntriesFast();
1489 if(loop != 540) AliInfo("The Vector Fit is not complete!");
1490 Int_t detector = -1;
1491 Float_t value = 0.0;
1492
1493 for (Int_t k = 0; k < loop; k++) {
1494 detector = ((AliTRDFitInfo *) vectorFit->At(k))->GetDetector();
1495 AliTRDCalROC *calROC = object->GetCalROC(detector);
1496 Float_t mean = detobject->GetValue(detector);
1497 if(mean == 0) continue;
1498 Int_t rowMax = calROC->GetNrows();
1499 Int_t colMax = calROC->GetNcols();
1500 for (Int_t row = 0; row < rowMax; row++) {
1501 for (Int_t col = 0; col < colMax; col++) {
1502 value = ((AliTRDFitInfo *) vectorFit->At(k))->GetCoef()[(Int_t)(col*rowMax+row)];
1503 if(value > 0) value = value*scaleFitFactor;
1504 calROC->SetValue(col,row,TMath::Abs(value)/mean);
1505 } // Col
1506 } // Row
1507 }
55a288e5 1508 }
1509
3a0f6479 1510 return object;
55a288e5 1511}
55a288e5 1512//_____________________________________________________________________________
3a0f6479 1513TObject *AliTRDCalibraFit::CreatePadObjectVdrift(TObjArray *vectorFit, AliTRDCalDet *detobject)
1514{
55a288e5 1515 //
3a0f6479 1516 // It Creates the AliTRDCalPad object from AliTRDFitInfo
1517 // You need first to create the object for the detectors,
1518 // where the mean value is put.
1519 // This object has to be written in the database
55a288e5 1520 //
1521
3a0f6479 1522 // Create the DetObject
1523 AliTRDCalPad *object = new AliTRDCalPad("LocalVdrift","TRD drift velocities (local variations)");
1524
1525 if(!vectorFit){
1526 for(Int_t k = 0; k < 540; k++){
1527 AliTRDCalROC *calROC = object->GetCalROC(k);
1528 Int_t nchannels = calROC->GetNchannels();
1529 for(Int_t ch = 0; ch < nchannels; ch++){
1530 calROC->SetValue(ch,1.0);
1531 }
1532 }
55a288e5 1533 }
1534 else {
3a0f6479 1535
1536 Int_t loop = (Int_t) vectorFit->GetEntriesFast();
1537 if(loop != 540) AliInfo("The Vector Fit is not complete!");
1538 Int_t detector = -1;
1539 Float_t value = 0.0;
1540
1541 for (Int_t k = 0; k < loop; k++) {
1542 detector = ((AliTRDFitInfo *) vectorFit->At(k))->GetDetector();
1543 AliTRDCalROC *calROC = object->GetCalROC(detector);
1544 Float_t mean = detobject->GetValue(detector);
1545 if(mean == 0) continue;
1546 Int_t rowMax = calROC->GetNrows();
1547 Int_t colMax = calROC->GetNcols();
1548 for (Int_t row = 0; row < rowMax; row++) {
1549 for (Int_t col = 0; col < colMax; col++) {
1550 value = ((AliTRDFitInfo *) vectorFit->At(k))->GetCoef()[(Int_t)(col*rowMax+row)];
1551 calROC->SetValue(col,row,TMath::Abs(value)/mean);
1552 } // Col
1553 } // Row
1554 }
55a288e5 1555 }
3a0f6479 1556 return object;
55a288e5 1557
1558}
55a288e5 1559//_____________________________________________________________________________
3a0f6479 1560TObject *AliTRDCalibraFit::CreatePadObjectT0(TObjArray *vectorFit, AliTRDCalDet *detobject)
1561{
55a288e5 1562 //
3a0f6479 1563 // It Creates the AliTRDCalPad object from AliTRDFitInfo2
1564 // You need first to create the object for the detectors,
1565 // where the mean value is put.
1566 // This object has to be written in the database
55a288e5 1567 //
3a0f6479 1568
1569 // Create the DetObject
1570 AliTRDCalPad *object = new AliTRDCalPad("LocalT0","T0 (local variations)");
1571
1572 if(!vectorFit){
1573 for(Int_t k = 0; k < 540; k++){
1574 AliTRDCalROC *calROC = object->GetCalROC(k);
1575 Int_t nchannels = calROC->GetNchannels();
1576 for(Int_t ch = 0; ch < nchannels; ch++){
1577 calROC->SetValue(ch,0.0);
1578 }
1579 }
55a288e5 1580 }
1581 else {
3a0f6479 1582
1583 Int_t loop = (Int_t) vectorFit->GetEntriesFast();
1584 if(loop != 540) AliInfo("The Vector Fit is not complete!");
1585 Int_t detector = -1;
1586 Float_t value = 0.0;
1587
1588 for (Int_t k = 0; k < loop; k++) {
1589 detector = ((AliTRDFitInfo *) vectorFit->At(k))->GetDetector();
1590 AliTRDCalROC *calROC = object->GetCalROC(detector);
1591 Float_t min = detobject->GetValue(detector);
1592 Int_t rowMax = calROC->GetNrows();
1593 Int_t colMax = calROC->GetNcols();
1594 for (Int_t row = 0; row < rowMax; row++) {
1595 for (Int_t col = 0; col < colMax; col++) {
1596 value = ((AliTRDFitInfo *) vectorFit->At(k))->GetCoef()[(Int_t)(col*rowMax+row)];
1597 calROC->SetValue(col,row,value-min);
1598 } // Col
1599 } // Row
1600 }
55a288e5 1601 }
3a0f6479 1602 return object;
55a288e5 1603
1604}
3a0f6479 1605//_____________________________________________________________________________
1606TObject *AliTRDCalibraFit::CreatePadObjectPRF(TObjArray *vectorFit)
1607{
1608 //
1609 // It Creates the AliTRDCalPad object from AliTRDFitInfo
1610 // This object has to be written in the database
1611 //
1612
1613 // Create the DetObject
1614 AliTRDCalPad *object = new AliTRDCalPad("PRFWidth","PRFWidth");
1615
1616 Int_t loop = (Int_t) vectorFit->GetEntriesFast();
1617 if(loop != 540) AliInfo("The Vector Fit is not complete!");
1618 Int_t detector = -1;
1619 Float_t value = 0.0;
55a288e5 1620
3a0f6479 1621 for (Int_t k = 0; k < loop; k++) {
1622 detector = ((AliTRDFitInfo *) vectorFit->At(k))->GetDetector();
1623 AliTRDCalROC *calROC = object->GetCalROC(detector);
1624 Int_t rowMax = calROC->GetNrows();
1625 Int_t colMax = calROC->GetNcols();
1626 for (Int_t row = 0; row < rowMax; row++) {
1627 for (Int_t col = 0; col < colMax; col++) {
1628 value = ((AliTRDFitInfo *) vectorFit->At(k))->GetCoef()[(Int_t)(col*rowMax+row)];
1629 calROC->SetValue(col,row,TMath::Abs(value));
1630 } // Col
1631 } // Row
1632 }
1633
1634 return object;
1635
1636}
55a288e5 1637//_____________________________________________________________________________
3a0f6479 1638AliTRDCalDet *AliTRDCalibraFit::MakeOutliersStatDet(TObjArray *vectorFit, const char *name, Double_t &mean)
1639{
1640 //
1641 // It Creates the AliTRDCalDet object from AliTRDFitInfo
1642 // 0 successful fit 1 not successful fit
1643 // mean is the mean value over the successful fit
1644 // do not use it for t0: no meaning
1645 //
1646
1647 // Create the CalObject
1648 AliTRDCalDet *object = new AliTRDCalDet(name,name);
1649 mean = 0.0;
1650 Int_t count = 0;
1651
1652 Int_t loop = (Int_t) vectorFit->GetEntriesFast();
1653 if(loop != 540) {
1654 AliInfo("The Vector Fit is not complete! We initialise all outliers");
1655 for(Int_t k = 0; k < 540; k++){
1656 object->SetValue(k,1.0);
1657 }
1658 }
1659 Int_t detector = -1;
1660 Float_t value = 0.0;
1661
1662 for (Int_t k = 0; k < loop; k++) {
1663 detector = ((AliTRDFitInfo *) vectorFit->At(k))->GetDetector();
1664 value = ((AliTRDFitInfo *) vectorFit->At(k))->GetCoef()[0];
1665 if(value <= 0) object->SetValue(detector,1.0);
1666 else {
1667 object->SetValue(detector,0.0);
1668 mean += value;
1669 count++;
1670 }
1671 }
1672 if(count > 0) mean /= count;
1673 return object;
1674}
1675//_____________________________________________________________________________
1676TObject *AliTRDCalibraFit::MakeOutliersStatPad(TObjArray *vectorFit, const char *name, Double_t &mean)
1677{
1678 //
1679 // It Creates the AliTRDCalPad object from AliTRDFitInfo
1680 // 0 not successful fit 1 successful fit
1681 // mean mean value over the successful fit
1682 //
1683
1684 // Create the CalObject
1685 AliTRDCalPad *object = new AliTRDCalPad(name,name);
1686 mean = 0.0;
1687 Int_t count = 0;
1688
1689 Int_t loop = (Int_t) vectorFit->GetEntriesFast();
1690 if(loop != 540) {
1691 AliInfo("The Vector Fit is not complete! We initialise all outliers");
1692 for(Int_t k = 0; k < 540; k++){
1693 AliTRDCalROC *calROC = object->GetCalROC(k);
1694 Int_t nchannels = calROC->GetNchannels();
1695 for(Int_t ch = 0; ch < nchannels; ch++){
1696 calROC->SetValue(ch,1.0);
1697 }
1698 }
1699 }
1700 Int_t detector = -1;
1701 Float_t value = 0.0;
1702
1703 for (Int_t k = 0; k < loop; k++) {
1704 detector = ((AliTRDFitInfo *) vectorFit->At(k))->GetDetector();
1705 AliTRDCalROC *calROC = object->GetCalROC(detector);
1706 Int_t nchannels = calROC->GetNchannels();
1707 for (Int_t ch = 0; ch < nchannels; ch++) {
1708 value = ((AliTRDFitInfo *) vectorFit->At(k))->GetCoef()[ch];
1709 if(value <= 0) calROC->SetValue(ch,1.0);
1710 else {
1711 calROC->SetValue(ch,0.0);
1712 mean += value;
1713 count++;
1714 }
1715 } // channels
1716 }
1717 if(count > 0) mean /= count;
1718 return object;
1719}
1720//_____________________________________________________________________________
1721void AliTRDCalibraFit::SetPeriodeFitPH(Int_t periodeFitPH)
55a288e5 1722{
1723 //
3a0f6479 1724 // Set FitPH if 1 then each detector will be fitted
55a288e5 1725 //
1726
3a0f6479 1727 if (periodeFitPH > 0) {
1728 fFitPHPeriode = periodeFitPH;
55a288e5 1729 }
1730 else {
3a0f6479 1731 AliInfo("periodeFitPH must be higher than 0!");
55a288e5 1732 }
1733
1734}
55a288e5 1735//_____________________________________________________________________________
1736void AliTRDCalibraFit::SetBeginFitCharge(Float_t beginFitCharge)
1737{
1738 //
1739 // The fit of the deposited charge distribution begins at
1740 // histo->Mean()/beginFitCharge
1741 // You can here set beginFitCharge
1742 //
1743
1744 if (beginFitCharge > 0) {
1745 fBeginFitCharge = beginFitCharge;
1746 }
1747 else {
1748 AliInfo("beginFitCharge must be strict positif!");
1749 }
1750
1751}
1752
1753//_____________________________________________________________________________
1754void AliTRDCalibraFit::SetT0Shift(Float_t t0Shift)
1755{
1756 //
1757 // The t0 calculated with the maximum positif slope is shift from t0Shift
1758 // You can here set t0Shift
1759 //
1760
1761 if (t0Shift > 0) {
1762 fT0Shift = t0Shift;
1763 }
1764 else {
1765 AliInfo("t0Shift must be strict positif!");
1766 }
1767
1768}
1769
1770//_____________________________________________________________________________
1771void AliTRDCalibraFit::SetRangeFitPRF(Float_t rangeFitPRF)
1772{
1773 //
1774 // The fit of the PRF is from -rangeFitPRF to rangeFitPRF
1775 // You can here set rangeFitPRF
1776 //
1777
1778 if ((rangeFitPRF > 0) &&
1779 (rangeFitPRF <= 1.5)) {
1780 fRangeFitPRF = rangeFitPRF;
1781 }
1782 else {
1783 AliInfo("rangeFitPRF must be between 0 and 1.0");
1784 }
1785
1786}
1787
3a0f6479 1788//_____________________________________________________________________________
1789void AliTRDCalibraFit::SetMinEntries(Int_t minEntries)
1790{
1791 //
1792 // Minimum entries for fitting
1793 //
1794
1795 if (minEntries > 0) {
1796 fMinEntries = minEntries;
1797 }
1798 else {
1799 AliInfo("fMinEntries must be >= 0.");
1800 }
1801
1802}
1803
55a288e5 1804//_____________________________________________________________________________
1805void AliTRDCalibraFit::SetRebin(Short_t rebin)
1806{
1807 //
1808 // Rebin with rebin time less bins the Ch histo
1809 // You can set here rebin that should divide the number of bins of CH histo
1810 //
1811
1812 if (rebin > 0) {
1813 fRebin = rebin;
1814 AliInfo("You have to be sure that fRebin divides fNumberBinCharge used!");
1815 }
1816 else {
1817 AliInfo("You have to choose a positiv value!");
1818 }
1819
1820}
55a288e5 1821//_____________________________________________________________________________
3a0f6479 1822Bool_t AliTRDCalibraFit::FillVectorFit()
55a288e5 1823{
1824 //
3a0f6479 1825 // For the Fit functions fill the vector Fit
55a288e5 1826 //
55a288e5 1827
3a0f6479 1828 AliTRDFitInfo *fitInfo = new AliTRDFitInfo();
55a288e5 1829
3a0f6479 1830 Int_t ntotal = 1;
1831 if (GetChamber(fCountDet) == 2) {
1832 ntotal = 1728;
55a288e5 1833 }
3a0f6479 1834 else {
1835 ntotal = 2304;
55a288e5 1836 }
3a0f6479 1837
1838 //printf("For the detector %d , ntotal %d and fCoefCH[0] %f\n",countdet,ntotal,fCoefCH[0]);
1839 Float_t *coef = new Float_t[ntotal];
1840 for (Int_t i = 0; i < ntotal; i++) {
1841 coef[i] = fCurrentCoefDetector[i];
55a288e5 1842 }
3a0f6479 1843
1844 Int_t detector = fCountDet;
1845 // Set
1846 fitInfo->SetCoef(coef);
1847 fitInfo->SetDetector(detector);
1848 fVectorFit.Add((TObject *) fitInfo);
1849
1850 return kTRUE;
55a288e5 1851
3a0f6479 1852}
55a288e5 1853//_____________________________________________________________________________
3a0f6479 1854Bool_t AliTRDCalibraFit::FillVectorFit2()
55a288e5 1855{
1856 //
3a0f6479 1857 // For the Fit functions fill the vector Fit
55a288e5 1858 //
55a288e5 1859
3a0f6479 1860 AliTRDFitInfo *fitInfo = new AliTRDFitInfo();
55a288e5 1861
3a0f6479 1862 Int_t ntotal = 1;
1863 if (GetChamber(fCountDet) == 2) {
1864 ntotal = 1728;
55a288e5 1865 }
3a0f6479 1866 else {
1867 ntotal = 2304;
55a288e5 1868 }
3a0f6479 1869
1870 //printf("For the detector %d , ntotal %d and fCoefCH[0] %f\n",countdet,ntotal,fCoefCH[0]);
1871 Float_t *coef = new Float_t[ntotal];
1872 for (Int_t i = 0; i < ntotal; i++) {
1873 coef[i] = fCurrentCoefDetector2[i];
55a288e5 1874 }
3a0f6479 1875
1876 Int_t detector = fCountDet;
1877 // Set
1878 fitInfo->SetCoef(coef);
1879 fitInfo->SetDetector(detector);
1880 fVectorFit2.Add((TObject *) fitInfo);
55a288e5 1881
3a0f6479 1882 return kTRUE;
55a288e5 1883
3a0f6479 1884}
1885//____________Functions for initialising the AliTRDCalibraFit in the code_________
1886Bool_t AliTRDCalibraFit::InitFit(Int_t nbins, Int_t i)
55a288e5 1887{
1888 //
3a0f6479 1889 // Init the number of expected bins and fDect1[i] fDect2[i]
55a288e5 1890 //
1891
3a0f6479 1892 gStyle->SetPalette(1);
1893 gStyle->SetOptStat(1111);
1894 gStyle->SetPadBorderMode(0);
1895 gStyle->SetCanvasColor(10);
1896 gStyle->SetPadLeftMargin(0.13);
1897 gStyle->SetPadRightMargin(0.01);
1898
1899 // Mode groups of pads: the total number of bins!
1900 CalculNumberOfBinsExpected(i);
1901
1902 // Quick verification that we have the good pad calibration mode!
1903 if (fNumberOfBinsExpected != nbins) {
1904 AliInfo("It doesn't correspond to the mode of pad group calibration!");
1905 return kFALSE;
55a288e5 1906 }
3a0f6479 1907
1908 // Security for fDebug 3 and 4
1909 if ((fDebugLevel >= 3) &&
1910 ((fDet[0] > 5) ||
1911 (fDet[1] > 4) ||
1912 (fDet[2] > 17))) {
1913 AliInfo("This detector doesn't exit!");
1914 return kFALSE;
55a288e5 1915 }
1916
3a0f6479 1917 // Determine fDet1 and fDet2 and set the fNfragZ and fNfragRphi for debug 3 and 4
1918 CalculDect1Dect2(i);
55a288e5 1919
3a0f6479 1920
1921 return kTRUE;
55a288e5 1922}
3a0f6479 1923//____________Functions for initialising the AliTRDCalibraFit in the code_________
1924Bool_t AliTRDCalibraFit::InitFitCH()
55a288e5 1925{
1926 //
3a0f6479 1927 // Init the fVectorFitCH for normalisation
1928 // Init the histo for debugging
55a288e5 1929 //
1930
3a0f6479 1931 gDirectory = gROOT;
1932
1933 fScaleFitFactor = 0.0;
1934 fCurrentCoefDetector = new Float_t[2304];
1935 for (Int_t k = 0; k < 2304; k++) {
1936 fCurrentCoefDetector[k] = 0.0;
1937 }
1938 fVectorFit.SetName("gainfactorscoefficients");
55a288e5 1939
3a0f6479 1940 // fDebug == 0 nothing
1941 // fDebug == 1 and fFitVoir no histo
1942 if (fDebugLevel == 1) {
1943 if(!CheckFitVoir()) return kFALSE;
1944 }
1945 //Get the CalDet object
1946 if(fAccCDB){
1947 AliTRDcalibDB *cal = AliTRDcalibDB::Instance();
1948 if (!cal) {
1949 AliInfo("Could not get calibDB");
1950 return kFALSE;
55a288e5 1951 }
3a0f6479 1952 if(fCalDet) delete fCalDet;
1953 fCalDet = new AliTRDCalDet(*(cal->GetGainFactorDet()));
55a288e5 1954 }
3a0f6479 1955 else{
1956 Float_t devalue = 1.0;
1957 if(fCalDet) delete fCalDet;
1958 fCalDet = new AliTRDCalDet("ChamberGainFactor","GainFactor (detector value)");
1959 for(Int_t k = 0; k < 540; k++){
1960 fCalDet->SetValue(k,devalue);
55a288e5 1961 }
1962 }
3a0f6479 1963 return kTRUE;
1964
55a288e5 1965}
3a0f6479 1966//____________Functions for initialising the AliTRDCalibraFit in the code_________
1967Bool_t AliTRDCalibraFit::InitFitPH()
55a288e5 1968{
1969 //
3a0f6479 1970 // Init the arrays of results
1971 // Init the histos for debugging
55a288e5 1972 //
55a288e5 1973
3a0f6479 1974 gDirectory = gROOT;
1975 fVectorFit.SetName("driftvelocitycoefficients");
1976 fVectorFit2.SetName("t0coefficients");
55a288e5 1977
3a0f6479 1978 fCurrentCoefDetector = new Float_t[2304];
1979 for (Int_t k = 0; k < 2304; k++) {
1980 fCurrentCoefDetector[k] = 0.0;
1981 }
1982
1983 fCurrentCoefDetector2 = new Float_t[2304];
1984 for (Int_t k = 0; k < 2304; k++) {
1985 fCurrentCoefDetector2[k] = 0.0;
55a288e5 1986 }
1987
3a0f6479 1988 //fDebug == 0 nothing
1989 // fDebug == 1 and fFitVoir no histo
1990 if (fDebugLevel == 1) {
1991 if(!CheckFitVoir()) return kFALSE;
1992 }
1993 //Get the CalDet object
1994 if(fAccCDB){
1995 AliTRDcalibDB *cal = AliTRDcalibDB::Instance();
1996 if (!cal) {
1997 AliInfo("Could not get calibDB");
1998 return kFALSE;
1999 }
2000 if(fCalDet) delete fCalDet;
2001 if(fCalDet2) delete fCalDet2;
2002 fCalDet = new AliTRDCalDet(*(cal->GetVdriftDet()));
2003 fCalDet2 = new AliTRDCalDet(*(cal->GetT0Det()));
2004 }
2005 else{
2006 Float_t devalue = 1.5;
2007 Float_t devalue2 = 0.0;
2008 if(fCalDet) delete fCalDet;
2009 if(fCalDet2) delete fCalDet2;
2010 fCalDet = new AliTRDCalDet("ChamberVdrift","TRD drift velocities (detector value)");
2011 fCalDet2 = new AliTRDCalDet("ChamberT0","T0 (detector value)");
2012 for(Int_t k = 0; k < 540; k++){
2013 fCalDet->SetValue(k,devalue);
2014 fCalDet2->SetValue(k,devalue2);
2015 }
2016 }
2017 return kTRUE;
55a288e5 2018}
3a0f6479 2019//____________Functions for initialising the AliTRDCalibraFit in the code_________
2020Bool_t AliTRDCalibraFit::InitFitPRF()
55a288e5 2021{
2022 //
3a0f6479 2023 // Init the calibration mode (Nz, Nrphi), the histograms for
2024 // debugging the fit methods if fDebug > 0,
2025 //
2026
2027 gDirectory = gROOT;
2028 fVectorFit.SetName("prfwidthcoefficients");
2029
2030 fCurrentCoefDetector = new Float_t[2304];
2031 for (Int_t k = 0; k < 2304; k++) {
2032 fCurrentCoefDetector[k] = 0.0;
55a288e5 2033 }
2034
3a0f6479 2035 // fDebug == 0 nothing
2036 // fDebug == 1 and fFitVoir no histo
2037 if (fDebugLevel == 1) {
2038 if(!CheckFitVoir()) return kFALSE;
2039 }
2040 return kTRUE;
55a288e5 2041}
3a0f6479 2042//____________Functions for initialising the AliTRDCalibraFit in the code_________
2043Bool_t AliTRDCalibraFit::InitFitLinearFitter()
55a288e5 2044{
2045 //
3a0f6479 2046 // Init the fCalDet, fVectorFit fCurrentCoefDetector
55a288e5 2047 //
3a0f6479 2048
2049 gDirectory = gROOT;
2050
2051 fCurrentCoefDetector = new Float_t[2304];
2052 fCurrentCoefDetector2 = new Float_t[2304];
2053 for (Int_t k = 0; k < 2304; k++) {
2054 fCurrentCoefDetector[k] = 0.0;
2055 fCurrentCoefDetector2[k] = 0.0;
55a288e5 2056 }
2057
3a0f6479 2058 //printf("test0\n");
2059
2060 AliTRDcalibDB *cal = AliTRDcalibDB::Instance();
2061 if (!cal) {
2062 AliInfo("Could not get calibDB");
2063 return kFALSE;
55a288e5 2064 }
2065
3a0f6479 2066 //Get the CalDet object
2067 if(fAccCDB){
2068 if(fCalDet) delete fCalDet;
2069 if(fCalDet2) delete fCalDet2;
2070 fCalDet = new AliTRDCalDet(*(cal->GetVdriftDet()));
2071 //printf("test1\n");
2072 fCalDet2 = new AliTRDCalDet("lorentz angle tan","lorentz angle tan (detector value)");
2073 //printf("test2\n");
2074 for(Int_t k = 0; k < 540; k++){
2075 fCalDet2->SetValue(k,cal->GetOmegaTau(fCalDet->GetValue(k),-fMagneticField));
2076 }
2077 //printf("test3\n");
2078 }
2079 else{
2080 Float_t devalue = 1.5;
2081 Float_t devalue2 = cal->GetOmegaTau(1.5,-fMagneticField);
2082 if(fCalDet) delete fCalDet;
2083 if(fCalDet2) delete fCalDet2;
2084 //printf("test1\n");
2085 fCalDet = new AliTRDCalDet("ChamberVdrift","TRD drift velocities (detector value)");
2086 fCalDet2 = new AliTRDCalDet("lorentz angle tan","lorentz angle tan (detector value)");
2087 //printf("test2\n");
2088 for(Int_t k = 0; k < 540; k++){
2089 fCalDet->SetValue(k,devalue);
2090 fCalDet2->SetValue(k,devalue2);
2091 }
2092 //printf("test3\n");
2093 }
55a288e5 2094 return kTRUE;
55a288e5 2095}
2096
2097//____________Functions for initialising the AliTRDCalibraFit in the code_________
3a0f6479 2098void AliTRDCalibraFit::InitfCountDetAndfCount(Int_t i)
55a288e5 2099{
2100 //
3a0f6479 2101 // Init the current detector where we are fCountDet and the
2102 // next fCount for the functions Fit...
55a288e5 2103 //
2104
3a0f6479 2105 // Loop on the Xbins of ch!!
2106 fCountDet = -1; // Current detector
2107 fCount = 0; // To find the next detector
2108
2109 // If fDebug >= 3
2110 if (fDebugLevel >= 3) {
2111 // Set countdet to the detector
2112 fCountDet = AliTRDgeometry::GetDetector(fDet[0],fDet[1],fDet[2]);
2113 // Set counter to write at the end of the detector
2114 fCount = fDect2;
2115 // Get the right calib objects
2116 SetCalROC(i);
2117 }
2118 if(fDebugLevel == 1) {
2119 fCountDet = 0;
2120 fCalibraMode->CalculXBins(fCountDet,i);
2121 while(fCalibraMode->GetXbins(i) <=fFitVoir){
2122 fCountDet++;
2123 fCalibraMode->CalculXBins(fCountDet,i);
2124 }
2125 fCount = fCalibraMode->GetXbins(i);
2126 fCountDet--;
2127 // Determination of fNnZ, fNnRphi, fNfragZ and fNfragRphi
2128 fCalibraMode->ModePadCalibration((Int_t) GetChamber(fCountDet),i);
2129 fCalibraMode->ModePadFragmentation((Int_t) GetPlane(fCountDet)
2130 ,(Int_t) GetChamber(fCountDet)
2131 ,(Int_t) GetSector(fCountDet),i);
2132 }
2133}
2134//_______________________________________________________________________________
2135void AliTRDCalibraFit::CalculNumberOfBinsExpected(Int_t i)
2136{
2137 //
2138 // Calculate the number of bins expected (calibration groups)
2139 //
2140
2141 fNumberOfBinsExpected = 0;
55a288e5 2142 fCalibraMode->ModePadCalibration(2,i);
2143 fCalibraMode->ModePadFragmentation(0,2,0,i);
2144 fCalibraMode->SetDetChamb2(i);
3a0f6479 2145 if (fDebugLevel > 1) {
55a288e5 2146 AliInfo(Form("For the chamber 2: %d",fCalibraMode->GetDetChamb2(i)));
2147 }
3a0f6479 2148 fNumberOfBinsExpected += 6 * 18 * fCalibraMode->GetDetChamb2(i);
55a288e5 2149 fCalibraMode->ModePadCalibration(0,i);
2150 fCalibraMode->ModePadFragmentation(0,0,0,i);
2151 fCalibraMode->SetDetChamb0(i);
3a0f6479 2152 if (fDebugLevel > 1) {
55a288e5 2153 AliInfo(Form("For the other chamber 0: %d",fCalibraMode->GetDetChamb0(i)));
2154 }
3a0f6479 2155 fNumberOfBinsExpected += 6 * 4 * 18 * fCalibraMode->GetDetChamb0(i);
2156
2157}
2158//_______________________________________________________________________________
2159void AliTRDCalibraFit::CalculDect1Dect2(Int_t i)
2160{
2161 //
2162 // Calculate the range of fits
2163 //
55a288e5 2164
3a0f6479 2165 fDect1 = -1;
2166 fDect2 = -1;
2167 if (fDebugLevel == 1) {
2168 fDect1 = fFitVoir;
2169 fDect2 = fDect1 +1;
55a288e5 2170 }
3a0f6479 2171 if ((fDebugLevel == 2) || (fDebugLevel == 0)) {
2172 fDect1 = 0;
2173 fDect2 = fNumberOfBinsExpected;
55a288e5 2174 }
3a0f6479 2175 if (fDebugLevel >= 3) {
2176 fCountDet = AliTRDgeometry::GetDetector(fDet[0],fDet[1],fDet[2]);
2177 fCalibraMode->CalculXBins(fCountDet,i);
2178 fDect1 = fCalibraMode->GetXbins(i);
2179 // Determination of fNnZ, fNnRphi, fNfragZ and fNfragRphi
2180 fCalibraMode->ModePadCalibration((Int_t) GetChamber(fCountDet),i);
2181 fCalibraMode->ModePadFragmentation((Int_t) GetPlane(fCountDet)
2182 ,(Int_t) GetChamber(fCountDet)
2183 ,(Int_t) GetSector(fCountDet),i);
2184 // Set for the next detector
2185 fDect2 = fDect1 + fCalibraMode->GetNfragZ(i)*fCalibraMode->GetNfragRphi(i);
55a288e5 2186 }
55a288e5 2187}
3a0f6479 2188//_______________________________________________________________________________
2189Bool_t AliTRDCalibraFit::CheckFitVoir()
55a288e5 2190{
2191 //
3a0f6479 2192 // Check if fFitVoir is in the range
55a288e5 2193 //
2194
3a0f6479 2195 if (fFitVoir < fNumberOfBinsExpected) {
2196 AliInfo(Form("We will see the fit of the object %d",fFitVoir));
55a288e5 2197 }
3a0f6479 2198 else {
2199 AliInfo("fFitVoir is out of range of the histo!");
2200 return kFALSE;
2201 }
2202 return kTRUE;
55a288e5 2203}
55a288e5 2204//____________Functions for initialising the AliTRDCalibraFit in the code_________
2205void AliTRDCalibraFit::UpdatefCountDetAndfCount(Int_t idect, Int_t i)
2206{
2207 //
2208 // See if we are in a new detector and update the
2209 // variables fNfragZ and fNfragRphi if yes
3a0f6479 2210 // Will never happen for only one detector (3 and 4)
2211 // Doesn't matter for 2
2212 //
2213 if (fCount == idect) {
2214 // On en est au detector
2215 fCountDet += 1;
2216 // Determination of fNnZ, fNnRphi, fNfragZ and fNfragRphi
2217 fCalibraMode->ModePadCalibration((Int_t) GetChamber(fCountDet),i);
2218 fCalibraMode->ModePadFragmentation((Int_t) GetPlane(fCountDet)
2219 ,(Int_t) GetChamber(fCountDet)
2220 ,(Int_t) GetSector(fCountDet),i);
2221 // Set for the next detector
2222 fCount += fCalibraMode->GetNfragZ(i)*fCalibraMode->GetNfragRphi(i);
2223 // calib objects
2224 SetCalROC(i);
55a288e5 2225 }
55a288e5 2226}
55a288e5 2227//____________Functions for initialising the AliTRDCalibraFit in the code_________
2228void AliTRDCalibraFit::ReconstructFitRowMinRowMax(Int_t idect, Int_t i)
2229{
2230 //
2231 // Reconstruct the min pad row, max pad row, min pad col and
2232 // max pad col of the calibration group for the Fit functions
2233 //
3a0f6479 2234 if (fDebugLevel != 1) {
2235 fCalibraMode->ReconstructionRowPadGroup((Int_t) (idect-(fCount-(fCalibraMode->GetNfragZ(i)*fCalibraMode->GetNfragRphi(i)))),i);
55a288e5 2236 }
55a288e5 2237}
55a288e5 2238//____________Functions for initialising the AliTRDCalibraFit in the code_________
3a0f6479 2239Bool_t AliTRDCalibraFit::NotEnoughStatisticCH(Int_t idect)
55a288e5 2240{
2241 //
2242 // For the case where there are not enough entries in the histograms
3a0f6479 2243 // of the calibration group, the value present in the choosen database
2244 // will be put. A negativ sign enables to know that a fit was not possible.
2245 //
2246
2247 if (fDebugLevel == 1) {
2248 AliInfo("The element has not enough statistic to be fitted");
55a288e5 2249 }
3a0f6479 2250
2251 else {
55a288e5 2252
3a0f6479 2253 AliInfo(Form("The element %d in this detector %d has not enough statistic to be fitted"
2254 ,idect-(fCount-(fCalibraMode->GetNfragZ(0)*fCalibraMode->GetNfragRphi(0))),fCountDet));
2255
2256 // Calcul the coef from the database choosen
2257 CalculChargeCoefMean(kFALSE);
55a288e5 2258
3a0f6479 2259 //chamber 2, not chamber 2
2260 Int_t factor = 0;
2261 if(GetChamber(fCountDet) == 2) factor = 12;
2262 else factor = 16;
55a288e5 2263
3a0f6479 2264 // Fill the fCurrentCoefDetector with negative value to say: not fitted
2265 for (Int_t k = fCalibraMode->GetRowMin(0); k < fCalibraMode->GetRowMax(0); k++) {
2266 for (Int_t j = fCalibraMode->GetColMin(0); j < fCalibraMode->GetColMax(0); j++) {
2267 fCurrentCoefDetector[(Int_t)(j*factor+k)] = -TMath::Abs(fCurrentCoef[1]);
55a288e5 2268 }
2269 }
3a0f6479 2270
2271 //Put default value negative
2272 fCurrentCoef[0] = -TMath::Abs(fCurrentCoef[1]);
2273 fCurrentCoefE = 0.0;
2274
2275 FillFillCH(idect);
2276 }
2277
2278 return kTRUE;
55a288e5 2279}
2280
3a0f6479 2281
2282//____________Functions for initialising the AliTRDCalibraFit in the code_________
2283Bool_t AliTRDCalibraFit::NotEnoughStatisticPH(Int_t idect)
55a288e5 2284{
2285 //
3a0f6479 2286 // For the case where there are not enough entries in the histograms
2287 // of the calibration group, the value present in the choosen database
2288 // will be put. A negativ sign enables to know that a fit was not possible.
55a288e5 2289 //
3a0f6479 2290 if (fDebugLevel == 1) {
2291 AliInfo("The element has not enough statistic to be fitted");
2292 }
2293 else {
55a288e5 2294
3a0f6479 2295 AliInfo(Form("The element %d in this detector %d has not enough statistic to be fitted"
2296 ,idect-(fCount-(fCalibraMode->GetNfragZ(1)*fCalibraMode->GetNfragRphi(1))),fCountDet));
55a288e5 2297
3a0f6479 2298 CalculVdriftCoefMean();
2299 CalculT0CoefMean();
55a288e5 2300
3a0f6479 2301 //chamber 2 and not chamber 2
2302 Int_t factor = 0;
2303 if(GetChamber(fCountDet) == 2) factor = 12;
2304 else factor = 16;
55a288e5 2305
55a288e5 2306
3a0f6479 2307 // Fill the fCurrentCoefDetector 2
2308 for (Int_t k = fCalibraMode->GetRowMin(1); k < fCalibraMode->GetRowMax(1); k++) {
2309 for (Int_t j = fCalibraMode->GetColMin(1); j < fCalibraMode->GetColMax(1); j++) {
2310 fCurrentCoefDetector[(Int_t)(j*factor+k)] = -TMath::Abs(fCurrentCoef[1]);
2311 fCurrentCoefDetector2[(Int_t)(j*factor+k)] = fCurrentCoef2[1];
55a288e5 2312 }
2313 }
55a288e5 2314
3a0f6479 2315 // Put the default value
2316 fCurrentCoef[0] = -TMath::Abs(fCurrentCoef[1]);
2317 fCurrentCoefE = 0.0;
2318 fCurrentCoef2[0] = fCurrentCoef2[1];
2319 fCurrentCoefE2 = 0.0;
2320
2321 FillFillPH(idect);
2322
2323 }
55a288e5 2324
3a0f6479 2325 return kTRUE;
55a288e5 2326
3a0f6479 2327}
2328
2329
2330//____________Functions for initialising the AliTRDCalibraFit in the code_________
2331Bool_t AliTRDCalibraFit::NotEnoughStatisticPRF(Int_t idect)
2332{
2333 //
2334 // For the case where there are not enough entries in the histograms
2335 // of the calibration group, the value present in the choosen database
2336 // will be put. A negativ sign enables to know that a fit was not possible.
2337 //
55a288e5 2338
3a0f6479 2339 if (fDebugLevel == 1) {
2340 AliInfo("The element has not enough statistic to be fitted");
55a288e5 2341 }
3a0f6479 2342 else {
2343
2344 AliInfo(Form("The element %d in this detector %d has not enough statistic to be fitted"
2345 ,idect-(fCount-(fCalibraMode->GetNfragZ(2)*fCalibraMode->GetNfragRphi(2))),fCountDet));
2346
2347 CalculPRFCoefMean();
2348
2349 // chamber 2 and not chamber 2
2350 Int_t factor = 0;
2351 if(GetChamber(fCountDet) == 2) factor = 12;
2352 else factor = 16;
55a288e5 2353
55a288e5 2354
3a0f6479 2355 // Fill the fCurrentCoefDetector
2356 for (Int_t k = fCalibraMode->GetRowMin(2); k < fCalibraMode->GetRowMax(2); k++) {
2357 for (Int_t j = fCalibraMode->GetColMin(2); j < fCalibraMode->GetColMax(2); j++) {
2358 fCurrentCoefDetector[(Int_t)(j*factor+k)] = -fCurrentCoef[1];
55a288e5 2359 }
2360 }
55a288e5 2361
3a0f6479 2362 // Put the default value
2363 fCurrentCoef[0] = -fCurrentCoef[1];
2364 fCurrentCoefE = 0.0;
2365
2366 FillFillPRF(idect);
2367 }
2368
2369 return kTRUE;
55a288e5 2370
3a0f6479 2371}
2372//____________Functions for initialising the AliTRDCalibraFit in the code_________
2373Bool_t AliTRDCalibraFit::NotEnoughStatisticLinearFitter()
55a288e5 2374{
2375 //
3a0f6479 2376 // For the case where there are not enough entries in the histograms
2377 // of the calibration group, the value present in the choosen database
2378 // will be put. A negativ sign enables to know that a fit was not possible.
2379 //
2380
2381 // Calcul the coef from the database choosen
2382 CalculVdriftLorentzCoef();
2383
2384 Int_t factor = 0;
2385 if(GetChamber(fCountDet) == 2) factor = 1728;
2386 else factor = 2304;
2387
2388
2389 // Fill the fCurrentCoefDetector
2390 for (Int_t k = 0; k < factor; k++) {
2391 fCurrentCoefDetector[k] = -TMath::Abs(fCurrentCoef[1]);
2392 // should be negative
2393 fCurrentCoefDetector2[k] = +TMath::Abs(fCurrentCoef2[1]);
55a288e5 2394 }
3a0f6479 2395
2396
2397 //Put default opposite sign
2398 fCurrentCoef[0] = -TMath::Abs(fCurrentCoef[1]);
2399 fCurrentCoefE = 0.0;
2400 fCurrentCoef2[0] = +TMath::Abs(fCurrentCoef2[1]);
2401 fCurrentCoefE2 = 0.0;
2402
2403 FillFillLinearFitter();
2404
2405 return kTRUE;
55a288e5 2406}
2407
3a0f6479 2408//____________Functions for initialising the AliTRDCalibraFit in the code_________
2409Bool_t AliTRDCalibraFit::FillInfosFitCH(Int_t idect)
55a288e5 2410{
2411 //
3a0f6479 2412 // Fill the coefficients found with the fits or other
2413 // methods from the Fit functions
2414 //
2415
2416 if (fDebugLevel != 1) {
2417
2418 Int_t factor = 0;
2419 if(GetChamber(fCountDet) == 2) factor = 12;
2420 else factor = 16;
2421
2422 for (Int_t k = fCalibraMode->GetRowMin(0); k < fCalibraMode->GetRowMax(0); k++) {
2423 for (Int_t j = fCalibraMode->GetColMin(0); j < fCalibraMode->GetColMax(0); j++) {
2424 fCurrentCoefDetector[(Int_t)(j*factor+k)] = fCurrentCoef[0];
2425 }
55a288e5 2426 }
3a0f6479 2427
2428 FillFillCH(idect);
2429
55a288e5 2430 }
55a288e5 2431
3a0f6479 2432 return kTRUE;
2433
2434}
2435//____________Functions for initialising the AliTRDCalibraFit in the code_________
2436Bool_t AliTRDCalibraFit::FillInfosFitPH(Int_t idect)
55a288e5 2437{
2438 //
3a0f6479 2439 // Fill the coefficients found with the fits or other
2440 // methods from the Fit functions
2441 //
2442
2443 if (fDebugLevel != 1) {
2444
2445 Int_t factor = 0;
2446 if(GetChamber(fCountDet) == 2) factor = 12;
2447 else factor = 16;
2448
2449 for (Int_t k = fCalibraMode->GetRowMin(1); k < fCalibraMode->GetRowMax(1); k++) {
2450 for (Int_t j = fCalibraMode->GetColMin(1); j < fCalibraMode->GetColMax(1); j++) {
2451 fCurrentCoefDetector[(Int_t)(j*factor+k)] = fCurrentCoef[0];
2452 fCurrentCoefDetector2[(Int_t)(j*factor+k)] = fCurrentCoef2[0];
2453 }
2454 }
2455 FillFillPH(idect);
55a288e5 2456 }
3a0f6479 2457 return kTRUE;
55a288e5 2458}
3a0f6479 2459//____________Functions for initialising the AliTRDCalibraFit in the code_________
2460Bool_t AliTRDCalibraFit::FillInfosFitPRF(Int_t idect)
55a288e5 2461{
2462 //
3a0f6479 2463 // Fill the coefficients found with the fits or other
2464 // methods from the Fit functions
55a288e5 2465 //
3a0f6479 2466
2467 if (fDebugLevel != 1) {
55a288e5 2468
3a0f6479 2469 Int_t factor = 0;
2470 if(GetChamber(fCountDet) == 2) factor = 12;
2471 else factor = 16;
2472
2473 // Pointer to the branch
2474 for (Int_t k = fCalibraMode->GetRowMin(2); k < fCalibraMode->GetRowMax(2); k++) {
2475 for (Int_t j = fCalibraMode->GetColMin(2); j < fCalibraMode->GetColMax(2); j++) {
2476 fCurrentCoefDetector[(Int_t)(j*factor+k)] = fCurrentCoef[0];
2477 }
55a288e5 2478 }
3a0f6479 2479 FillFillPRF(idect);
55a288e5 2480 }
55a288e5 2481
3a0f6479 2482 return kTRUE;
55a288e5 2483
3a0f6479 2484}
2485//____________Functions for initialising the AliTRDCalibraFit in the code_________
2486Bool_t AliTRDCalibraFit::FillInfosFitLinearFitter()
55a288e5 2487{
2488 //
3a0f6479 2489 // Fill the coefficients found with the fits or other
2490 // methods from the Fit functions
55a288e5 2491 //
3a0f6479 2492
2493 Int_t factor = 0;
2494 if(GetChamber(fCountDet) == 2) factor = 1728;
2495 else factor = 2304;
2496
2497 // Pointer to the branch
2498 for (Int_t k = 0; k < factor; k++) {
2499 fCurrentCoefDetector[k] = fCurrentCoef[0];
2500 fCurrentCoefDetector2[k] = fCurrentCoef2[0];
55a288e5 2501 }
3a0f6479 2502
2503 FillFillLinearFitter();
2504
2505 return kTRUE;
55a288e5 2506
2507}
3a0f6479 2508//________________________________________________________________________________
2509void AliTRDCalibraFit::FillFillCH(Int_t idect)
55a288e5 2510{
2511 //
3a0f6479 2512 // DebugStream and fVectorFit
55a288e5 2513 //
2514
3a0f6479 2515 // End of one detector
2516 if ((idect == (fCount-1))) {
2517 FillVectorFit();
2518 // Reset
2519 for (Int_t k = 0; k < 2304; k++) {
2520 fCurrentCoefDetector[k] = 0.0;
2521 }
55a288e5 2522 }
2523
3a0f6479 2524 if(fDebugLevel > 1){
55a288e5 2525
3a0f6479 2526 if ( !fDebugStreamer ) {
2527 //debug stream
2528 TDirectory *backup = gDirectory;
2529 fDebugStreamer = new TTreeSRedirector("TRDDebugFit.root");
2530 if ( backup ) backup->cd(); //we don't want to be cd'd to the debug streamer
2531 }
2532
2533 Int_t detector = fCountDet;
2534 Int_t caligroup = idect;
2535 Short_t rowmin = fCalibraMode->GetRowMin(0);
2536 Short_t rowmax = fCalibraMode->GetRowMax(0);
2537 Short_t colmin = fCalibraMode->GetColMin(0);
2538 Short_t colmax = fCalibraMode->GetColMax(0);
2539 Float_t gf = fCurrentCoef[0];
2540 Float_t gfs = fCurrentCoef[1];
2541 Float_t gfE = fCurrentCoefE;
2542
2543 (*fDebugStreamer) << "GAIN" <<
2544 "detector=" << detector <<
2545 "caligroup=" << caligroup <<
2546 "rowmin=" << rowmin <<
2547 "rowmax=" << rowmax <<
2548 "colmin=" << colmin <<
2549 "colmax=" << colmax <<
2550 "gf=" << gf <<
2551 "gfs=" << gfs <<
2552 "gfE=" << gfE <<
2553 "\n";
2554
2555 }
2556}
2557//________________________________________________________________________________
2558void AliTRDCalibraFit::FillFillPH(Int_t idect)
55a288e5 2559{
2560 //
3a0f6479 2561 // DebugStream and fVectorFit and fVectorFit2
55a288e5 2562 //
3a0f6479 2563
2564 // End of one detector
2565 if ((idect == (fCount-1))) {
2566 FillVectorFit();
2567 FillVectorFit2();
2568 // Reset
2569 for (Int_t k = 0; k < 2304; k++) {
2570 fCurrentCoefDetector[k] = 0.0;
2571 fCurrentCoefDetector2[k] = 0.0;
2572 }
2573 }
2574
2575 if(fDebugLevel > 1){
2576
2577 if ( !fDebugStreamer ) {
2578 //debug stream
2579 TDirectory *backup = gDirectory;
2580 fDebugStreamer = new TTreeSRedirector("TRDDebugFit.root");
2581 if ( backup ) backup->cd(); //we don't want to be cd'd to the debug streamer
2582 }
2583
2584
2585 Int_t detector = fCountDet;
2586 Int_t caligroup = idect;
2587 Short_t rowmin = fCalibraMode->GetRowMin(1);
2588 Short_t rowmax = fCalibraMode->GetRowMax(1);
2589 Short_t colmin = fCalibraMode->GetColMin(1);
2590 Short_t colmax = fCalibraMode->GetColMax(1);
2591 Float_t vf = fCurrentCoef[0];
2592 Float_t vs = fCurrentCoef[1];
2593 Float_t vfE = fCurrentCoefE;
2594 Float_t t0f = fCurrentCoef2[0];
2595 Float_t t0s = fCurrentCoef2[1];
2596 Float_t t0E = fCurrentCoefE2;
2597
55a288e5 2598
3a0f6479 2599
2600 (* fDebugStreamer) << "PH"<<
2601 "detector="<<detector<<
2602 "caligroup="<<caligroup<<
2603 "rowmin="<<rowmin<<
2604 "rowmax="<<rowmax<<
2605 "colmin="<<colmin<<
2606 "colmax="<<colmax<<
2607 "vf="<<vf<<
2608 "vs="<<vs<<
2609 "vfE="<<vfE<<
2610 "t0f="<<t0f<<
2611 "t0s="<<t0s<<
2612 "t0E="<<t0E<<
2613 "\n";
2614 }
55a288e5 2615
2616}
3a0f6479 2617//________________________________________________________________________________
2618void AliTRDCalibraFit::FillFillPRF(Int_t idect)
2619{
2620 //
2621 // DebugStream and fVectorFit
2622 //
55a288e5 2623
3a0f6479 2624 // End of one detector
2625 if ((idect == (fCount-1))) {
2626 FillVectorFit();
2627 // Reset
2628 for (Int_t k = 0; k < 2304; k++) {
2629 fCurrentCoefDetector[k] = 0.0;
2630 }
2631 }
2632
2633
2634 if(fDebugLevel > 1){
2635
2636 if ( !fDebugStreamer ) {
2637 //debug stream
2638 TDirectory *backup = gDirectory;
2639 fDebugStreamer = new TTreeSRedirector("TRDDebugFit.root");
2640 if ( backup ) backup->cd(); //we don't want to be cd'd to the debug streamer
2641 }
2642
2643 Int_t detector = fCountDet;
2644 Int_t plane = GetPlane(fCountDet);
2645 Int_t caligroup = idect;
2646 Short_t rowmin = fCalibraMode->GetRowMin(2);
2647 Short_t rowmax = fCalibraMode->GetRowMax(2);
2648 Short_t colmin = fCalibraMode->GetColMin(2);
2649 Short_t colmax = fCalibraMode->GetColMax(2);
2650 Float_t widf = fCurrentCoef[0];
2651 Float_t wids = fCurrentCoef[1];
2652 Float_t widfE = fCurrentCoefE;
2653
2654 (* fDebugStreamer) << "PRF"<<
2655 "detector="<<detector<<
2656 "plane="<<plane<<
2657 "caligroup="<<caligroup<<
2658 "rowmin="<<rowmin<<
2659 "rowmax="<<rowmax<<
2660 "colmin="<<colmin<<
2661 "colmax="<<colmax<<
2662 "widf="<<widf<<
2663 "wids="<<wids<<
2664 "widfE="<<widfE<<
2665 "\n";
2666 }
2667
2668}
2669//________________________________________________________________________________
2670void AliTRDCalibraFit::FillFillLinearFitter()
55a288e5 2671{
2672 //
3a0f6479 2673 // DebugStream and fVectorFit
55a288e5 2674 //
3a0f6479 2675
2676 // End of one detector
2677 FillVectorFit();
2678 FillVectorFit2();
2679
2680
2681 // Reset
2682 for (Int_t k = 0; k < 2304; k++) {
2683 fCurrentCoefDetector[k] = 0.0;
2684 fCurrentCoefDetector2[k] = 0.0;
55a288e5 2685 }
3a0f6479 2686
55a288e5 2687
3a0f6479 2688 if(fDebugLevel > 1){
55a288e5 2689
3a0f6479 2690 if ( !fDebugStreamer ) {
2691 //debug stream
2692 TDirectory *backup = gDirectory;
2693 fDebugStreamer = new TTreeSRedirector("TRDDebugFit.root");
2694 if ( backup ) backup->cd(); //we don't want to be cd'd to the debug streamer
2695 }
2696
2697 //Debug: comparaison of the different methods (okey for first time but not for iterative procedure)
2698 AliTRDpadPlane *padplane = fGeo->GetPadPlane(GetPlane(fCountDet),GetChamber(fCountDet));
2699 Float_t rowmd = (padplane->GetRow0()+padplane->GetRowEnd())/2.;
2700 Float_t r = AliTRDgeometry::GetTime0(GetPlane(fCountDet));
2701 Float_t tiltangle = padplane->GetTiltingAngle();
2702 Int_t detector = fCountDet;
2703 Int_t chamber = GetChamber(fCountDet);
2704 Int_t plane = GetChamber(fCountDet);
2705 Float_t vf = fCurrentCoef[0];
2706 Float_t vs = fCurrentCoef[1];
2707 Float_t vfE = fCurrentCoefE;
2708 Float_t lorentzangler = fCurrentCoef2[0];
2709 Float_t Elorentzangler = fCurrentCoefE2;
2710 Float_t lorentzangles = fCurrentCoef2[1];
2711
2712 (* fDebugStreamer) << "LinearFitter"<<
2713 "detector="<<detector<<
2714 "chamber="<<chamber<<
2715 "plane="<<plane<<
2716 "rowmd="<<rowmd<<
2717 "r="<<r<<
2718 "tiltangle="<<tiltangle<<
2719 "vf="<<vf<<
2720 "vs="<<vs<<
2721 "vfE="<<vfE<<
2722 "lorentzangler="<<lorentzangler<<
2723 "Elorentzangler="<<Elorentzangler<<
2724 "lorentzangles="<<lorentzangles<<
2725 "\n";
2726 }
2727
2728}
55a288e5 2729//
2730//____________Calcul Coef Mean_________________________________________________
2731//
55a288e5 2732//_____________________________________________________________________________
3a0f6479 2733Bool_t AliTRDCalibraFit::CalculT0CoefMean()
55a288e5 2734{
2735 //
2736 // For the detector Dect calcul the mean time 0
2737 // for the calibration group idect from the choosen database
2738 //
2739
3a0f6479 2740 fCurrentCoef2[1] = 0.0;
2741 if(fDebugLevel != 1){
2742 if((fCalibraMode->GetNz(1) > 0) ||
2743 (fCalibraMode->GetNrphi(1) > 0)) {
2744 for (Int_t row = fCalibraMode->GetRowMin(1); row < fCalibraMode->GetRowMax(1); row++) {
2745 for (Int_t col = fCalibraMode->GetColMin(1); col < fCalibraMode->GetColMax(1); col++) {
2746 fCurrentCoef2[1] += (Float_t) (fCalROC2->GetValue(col,row)+fCalDet2->GetValue(fCountDet));
55a288e5 2747 }
3a0f6479 2748 }
2749 fCurrentCoef2[1] = fCurrentCoef2[1] / ((fCalibraMode->GetColMax(1)-fCalibraMode->GetColMin(1))*(fCalibraMode->GetRowMax(1)-fCalibraMode->GetRowMin(1)));
2750 }
2751 else {
2752 if(!fAccCDB){
2753 fCurrentCoef2[1] = fCalDet2->GetValue(fCountDet);
2754 }
2755 else{
2756 for(Int_t row = 0; row < fGeo->GetRowMax(GetPlane(fCountDet),GetChamber(fCountDet),GetSector(fCountDet)); row++){
2757 for(Int_t col = 0; col < fGeo->GetColMax(GetPlane(fCountDet)); col++){
2758 fCurrentCoef2[1] += (Float_t) (fCalROC2->GetValue(col,row)+fCalDet2->GetValue(fCountDet));
2759 }
55a288e5 2760 }
3a0f6479 2761 fCurrentCoef2[1] = fCurrentCoef2[1] / ((fGeo->GetRowMax(GetPlane(fCountDet),GetChamber(fCountDet),GetSector(fCountDet)))*(fGeo->GetColMax(GetPlane(fCountDet))));
55a288e5 2762 }
2763 }
55a288e5 2764 }
55a288e5 2765 return kTRUE;
55a288e5 2766}
2767
2768//_____________________________________________________________________________
3a0f6479 2769Bool_t AliTRDCalibraFit::CalculChargeCoefMean(Bool_t vrai)
55a288e5 2770{
2771 //
2772 // For the detector Dect calcul the mean gain factor
2773 // for the calibration group idect from the choosen database
2774 //
2775
3a0f6479 2776 fCurrentCoef[1] = 0.0;
2777 if(fDebugLevel != 1){
2778 if ((fCalibraMode->GetNz(0) > 0) ||
2779 (fCalibraMode->GetNrphi(0) > 0)) {
2780 for (Int_t row = fCalibraMode->GetRowMin(0); row < fCalibraMode->GetRowMax(0); row++) {
2781 for (Int_t col = fCalibraMode->GetColMin(0); col < fCalibraMode->GetColMax(0); col++) {
2782 fCurrentCoef[1] += (Float_t) (fCalROC->GetValue(col,row)*fCalDet->GetValue(fCountDet));
2783 if (vrai) fScaleFitFactor += (Float_t) (fCalROC->GetValue(col,row)*fCalDet->GetValue(fCountDet));
55a288e5 2784 }
2785 }
3a0f6479 2786 fCurrentCoef[1] = fCurrentCoef[1] / ((fCalibraMode->GetColMax(0)-fCalibraMode->GetColMin(0))*(fCalibraMode->GetRowMax(0)-fCalibraMode->GetRowMin(0)));
55a288e5 2787 }
3a0f6479 2788 else {
2789 //Per detectors
2790 fCurrentCoef[1] = (Float_t) fCalDet->GetValue(fCountDet);
2791 if (vrai) fScaleFitFactor += ((Float_t) fCalDet->GetValue(fCountDet))*(fCalibraMode->GetColMax(0)-fCalibraMode->GetColMin(0))*(fCalibraMode->GetRowMax(0)-fCalibraMode->GetRowMin(0));
2792 }
55a288e5 2793 }
55a288e5 2794 return kTRUE;
55a288e5 2795}
55a288e5 2796//_____________________________________________________________________________
3a0f6479 2797Bool_t AliTRDCalibraFit::CalculPRFCoefMean()
55a288e5 2798{
2799 //
2800 // For the detector Dect calcul the mean sigma of pad response
2801 // function for the calibration group idect from the choosen database
2802 //
3a0f6479 2803
2804 fCurrentCoef[1] = 0.0;
2805 if(fDebugLevel != 1){
55a288e5 2806 for (Int_t row = fCalibraMode->GetRowMin(2); row < fCalibraMode->GetRowMax(2); row++) {
2807 for (Int_t col = fCalibraMode->GetColMin(2); col < fCalibraMode->GetColMax(2); col++) {
3a0f6479 2808 fCurrentCoef[1] += (Float_t) fCalROC->GetValue(col,row);
55a288e5 2809 }
2810 }
3a0f6479 2811 fCurrentCoef[1] = fCurrentCoef[1] / ((fCalibraMode->GetColMax(2)-fCalibraMode->GetColMin(2))*(fCalibraMode->GetRowMax(2)-fCalibraMode->GetRowMin(2)));
55a288e5 2812 }
55a288e5 2813 return kTRUE;
55a288e5 2814}
55a288e5 2815//_____________________________________________________________________________
3a0f6479 2816Bool_t AliTRDCalibraFit::CalculVdriftCoefMean()
55a288e5 2817{
2818 //
2819 // For the detector dect calcul the mean drift velocity for the
2820 // calibration group idect from the choosen database
2821 //
2822
3a0f6479 2823 fCurrentCoef[1] = 0.0;
2824 if(fDebugLevel != 1){
2825 if ((fCalibraMode->GetNz(1) > 0) ||
2826 (fCalibraMode->GetNrphi(1) > 0)) {
2827 for (Int_t row = fCalibraMode->GetRowMin(1); row < fCalibraMode->GetRowMax(1); row++) {
2828 for (Int_t col = fCalibraMode->GetColMin(1); col < fCalibraMode->GetColMax(1); col++) {
2829 fCurrentCoef[1] += (Float_t) (fCalROC->GetValue(col,row)*fCalDet->GetValue(fCountDet));
55a288e5 2830 }
2831 }
3a0f6479 2832 fCurrentCoef[1] = fCurrentCoef[1] / ((fCalibraMode->GetColMax(1)-fCalibraMode->GetColMin(1))*(fCalibraMode->GetRowMax(1)-fCalibraMode->GetRowMin(1)));
55a288e5 2833 }
3a0f6479 2834 else {
2835 //per detectors
2836 fCurrentCoef[1] = (Float_t) fCalDet->GetValue(fCountDet);
2837 }
55a288e5 2838 }
55a288e5 2839 return kTRUE;
55a288e5 2840}
3a0f6479 2841//_____________________________________________________________________________
2842Bool_t AliTRDCalibraFit::CalculVdriftLorentzCoef()
2843{
2844 //
2845 // For the detector fCountDet, mean drift velocity and tan lorentzangle
2846 //
2847
2848 fCurrentCoef[1] = fCalDet->GetValue(fCountDet);
2849 fCurrentCoef2[1] = fCalDet2->GetValue(fCountDet);
55a288e5 2850
3a0f6479 2851 return kTRUE;
2852}
55a288e5 2853//_____________________________________________________________________________
2854Float_t AliTRDCalibraFit::GetPRFDefault(Int_t plane) const
2855{
2856 //
2857 // Default width of the PRF if there is no database as reference
2858 //
3a0f6479 2859 switch(plane)
2860 {
2861 // default database
2862 //case 0: return 0.515;
2863 //case 1: return 0.502;
2864 //case 2: return 0.491;
2865 //case 3: return 0.481;
2866 //case 4: return 0.471;
2867 //case 5: return 0.463;
2868 //default: return 0.0;
2869
2870 // fit database
2871 case 0: return 0.538429;
2872 case 1: return 0.524302;
2873 case 2: return 0.511591;
2874 case 3: return 0.500140;
2875 case 4: return 0.489821;
2876 case 5: return 0.480524;
2877 default: return 0.0;
55a288e5 2878 }
3a0f6479 2879}
2880//________________________________________________________________________________
2881void AliTRDCalibraFit::SetCalROC(Int_t i)
2882{
2883 //
2884 // Set the calib object for fCountDet
2885 //
2886
2887 Float_t value = 0.0;
2888
2889 //Get the CalDet object
2890 if(fAccCDB){
2891 AliTRDcalibDB *cal = AliTRDcalibDB::Instance();
2892 if (!cal) {
2893 AliInfo("Could not get calibDB");
2894 return;
2895 }
2896 switch (i)
2897 {
2898 case 0:
2899 if(fCalROC) delete fCalROC;
2900 fCalROC = new AliTRDCalROC(*(cal->GetGainFactorROC(fCountDet)));
2901 break;
2902 case 1:
2903 if(fCalROC) delete fCalROC;
2904 if(fCalROC2) delete fCalROC2;
2905 fCalROC = new AliTRDCalROC(*(cal->GetVdriftROC(fCountDet)));
2906 fCalROC2 = new AliTRDCalROC(*(cal->GetT0ROC(fCountDet)));
2907 break;
2908 case 2:
2909 if(fCalROC) delete fCalROC;
2910 fCalROC = new AliTRDCalROC(*(cal->GetPRFROC(fCountDet))); break;
2911 default: return;
2912 }
55a288e5 2913 }
3a0f6479 2914 else{
2915 switch (i)
2916 {
2917 case 0:
2918 if(fCalROC) delete fCalROC;
2919 fCalROC = new AliTRDCalROC(GetPlane(fCountDet),GetChamber(fCountDet));
2920 for(Int_t k = 0; k < fCalROC->GetNchannels(); k++){
2921 fCalROC->SetValue(k,1.0);
2922 }
2923 break;
2924 case 1:
2925 if(fCalROC) delete fCalROC;
2926 if(fCalROC2) delete fCalROC2;
2927 fCalROC = new AliTRDCalROC(GetPlane(fCountDet),GetChamber(fCountDet));
2928 fCalROC2 = new AliTRDCalROC(GetPlane(fCountDet),GetChamber(fCountDet));
2929 for(Int_t k = 0; k < fCalROC->GetNchannels(); k++){
2930 fCalROC->SetValue(k,1.0);
2931 fCalROC2->SetValue(k,0.0);
2932 }
2933 break;
2934 case 2:
2935 if(fCalROC) delete fCalROC;
2936 value = GetPRFDefault(GetPlane(fCountDet));
2937 fCalROC = new AliTRDCalROC(GetPlane(fCountDet),GetChamber(fCountDet));
2938 for(Int_t k = 0; k < fCalROC->GetNchannels(); k++){
2939 fCalROC->SetValue(k,value);
2940 }
2941 break;
2942 default: return;
2943 }
55a288e5 2944 }
2945
2946}
55a288e5 2947//____________Fit Methods______________________________________________________
2948
2949//_____________________________________________________________________________
3a0f6479 2950void AliTRDCalibraFit::FitPente(TH1* projPH)
55a288e5 2951{
2952 //
2953 // Slope methode for the drift velocity
2954 //
2955
2956 // Constants
2957 const Float_t kDrWidth = AliTRDgeometry::DrThick();
3a0f6479 2958 Int_t binmax = 0;
2959 Int_t binmin = 0;
2960 fPhd[0] = 0.0;
2961 fPhd[1] = 0.0;
2962 fPhd[2] = 0.0;
2963 Int_t ju = 0;
2964 fCurrentCoefE = 0.0;
2965 fCurrentCoefE2 = 0.0;
2966 fCurrentCoef[0] = 0.0;
2967 fCurrentCoef2[0] = 0.0;
2968 TLine *line = new TLine();
55a288e5 2969
2970 // Some variables
2971 TAxis *xpph = projPH->GetXaxis();
2972 Int_t nbins = xpph->GetNbins();
2973 Double_t lowedge = xpph->GetBinLowEdge(1);
2974 Double_t upedge = xpph->GetBinUpEdge(xpph->GetNbins());
2975 Double_t widbins = (upedge - lowedge) / nbins;
2976 Double_t limit = upedge + 0.5 * widbins;
2977 Bool_t put = kTRUE;
2978
2979 // Beginning of the signal
2980 TH1D *pentea = new TH1D("pentea","pentea",projPH->GetNbinsX(),0,(Float_t) limit);
2981 for (Int_t k = 1; k < projPH->GetNbinsX(); k++) {
2982 pentea->SetBinContent(k,(Double_t) (projPH->GetBinContent(k+1) - projPH->GetBinContent(k)));
2983 }
55a288e5 2984 binmax = (Int_t) pentea->GetMaximumBin();
55a288e5 2985 if (binmax <= 1) {
2986 binmax = 2;
2987 AliInfo("Put the binmax from 1 to 2 to enable the fit");
2988 }
2989 if (binmax >= nbins) {
2990 binmax = nbins-1;
2991 put = kFALSE;
2992 AliInfo("Put the binmax from nbins-1 to nbins-2 to enable the fit");
2993 }
2994 pentea->Fit("pol2","0MR","",TMath::Max(pentea->GetBinCenter(binmax-1),0.0),pentea->GetBinCenter(binmax+1));
2995 Float_t l3P1am = pentea->GetFunction("pol2")->GetParameter(1);
2996 Float_t l3P2am = pentea->GetFunction("pol2")->GetParameter(2);
2997 Float_t l3P1amE = pentea->GetFunction("pol2")->GetParError(1);
2998 Float_t l3P2amE = pentea->GetFunction("pol2")->GetParError(2);
2999 if (l3P2am != 0) {
3000 fPhd[0] = -(l3P1am / (2 * l3P2am));
3001 }
3002 if(!fTakeTheMaxPH){
3003 if((l3P1am != 0.0) && (l3P2am != 0.0)){
3a0f6479 3004 fCurrentCoefE2 = (l3P1amE/l3P1am + l3P2amE/l3P2am)*fPhd[0];
55a288e5 3005 }
3006 }
55a288e5 3007 // Amplification region
3008 binmax = 0;
3009 ju = 0;
3010 for (Int_t kbin = 1; kbin < projPH->GetNbinsX(); kbin ++) {
3a0f6479 3011 if (((projPH->GetBinContent(kbin+1) - projPH->GetBinContent(kbin)) <= 0.0) && (ju == 0) && (kbin > (fPhd[0]/widbins))) {
55a288e5 3012 binmax = kbin;
3013 ju = 1;
3014 }
3015 }
55a288e5 3016 if (binmax <= 1) {
3017 binmax = 2;
3018 AliInfo("Put the binmax from 1 to 2 to enable the fit");
3019 }
3020 if (binmax >= nbins) {
3021 binmax = nbins-1;
3022 put = kFALSE;
3023 AliInfo("Put the binmax from nbins-1 to nbins-2 to enable the fit");
3024 }
3025 projPH->Fit("pol2","0MR","",TMath::Max(projPH->GetBinCenter(binmax-1),0.0),projPH->GetBinCenter(binmax+1));
3026 Float_t l3P1amf = projPH->GetFunction("pol2")->GetParameter(1);
3027 Float_t l3P2amf = projPH->GetFunction("pol2")->GetParameter(2);
3028 Float_t l3P1amfE = projPH->GetFunction("pol2")->GetParError(1);
3029 Float_t l3P2amfE = projPH->GetFunction("pol2")->GetParError(2);
55a288e5 3030 if (l3P2amf != 0) {
3031 fPhd[1] = -(l3P1amf / (2 * l3P2amf));
3032 }
3033 if((l3P1amf != 0.0) && (l3P2amf != 0.0)){
3a0f6479 3034 fCurrentCoefE = (l3P1amfE/l3P1amf + l3P2amfE/l3P2amf)*fPhd[1];
55a288e5 3035 }
3036 if(fTakeTheMaxPH){
3a0f6479 3037 fCurrentCoefE2 = fCurrentCoefE;
55a288e5 3038 }
55a288e5 3039 // Drift region
3040 TH1D *pente = new TH1D("pente","pente",projPH->GetNbinsX(),0,(Float_t) limit);
3041 for (Int_t k = TMath::Min(binmax+4,projPH->GetNbinsX()); k < projPH->GetNbinsX(); k++) {
3042 pente->SetBinContent(k,(Double_t) (projPH->GetBinContent(k+1) - projPH->GetBinContent(k)));
3043 }
3044 binmin = 0;
3045 if(pente->GetEntries() > 0) binmin = (Int_t) pente->GetMinimumBin();
3046 if (binmin <= 1) {
3047 binmin = 2;
3048 AliInfo("Put the binmax from 1 to 2 to enable the fit");
3049 }
3050 if (binmin >= nbins) {
3051 binmin = nbins-1;
3052 put = kFALSE;
3053 AliInfo("Put the binmax from nbins-1 to nbins-2 to enable the fit");
3054 }
55a288e5 3055 pente->Fit("pol2"
3056 ,"0MR"
3057 ,""
3058 ,TMath::Max(pente->GetBinCenter(binmin-1), 0.0)
3059 ,TMath::Min(pente->GetBinCenter(binmin+1),(Double_t) limit));
3060 Float_t l3P1dr = pente->GetFunction("pol2")->GetParameter(1);
3061 Float_t l3P2dr = pente->GetFunction("pol2")->GetParameter(2);
3062 Float_t l3P1drE = pente->GetFunction("pol2")->GetParError(1);
3063 Float_t l3P2drE = pente->GetFunction("pol2")->GetParError(2);
3064 if (l3P2dr != 0) {
3065 fPhd[2] = -(l3P1dr / (2 * l3P2dr));
3066 }
3067 if((l3P1dr != 0.0) && (l3P2dr != 0.0)){
3a0f6479 3068 fCurrentCoefE += (l3P1drE/l3P1dr + l3P2drE/l3P2dr)*fPhd[2];
55a288e5 3069 }
55a288e5 3070 Float_t fPhdt0 = 0.0;
3071 if(fTakeTheMaxPH) fPhdt0 = fPhd[1];
3072 else fPhdt0 = fPhd[0];
3073
3074 if ((fPhd[2] > fPhd[0]) &&
3075 (fPhd[2] > fPhd[1]) &&
3076 (fPhd[1] > fPhd[0]) &&
3077 (put)) {
3a0f6479 3078 fCurrentCoef[0] = (kDrWidth) / (fPhd[2]-fPhd[1]);
3079 fNumberFitSuccess++;
3080
55a288e5 3081 if (fPhdt0 >= 0.0) {
3a0f6479 3082 fCurrentCoef2[0] = (fPhdt0 - fT0Shift) / widbins;
3083 if (fCurrentCoef2[0] < -1.0) {
3084 fCurrentCoef2[0] = fCurrentCoef2[1];
55a288e5 3085 }
3086 }
3087 else {
3a0f6479 3088 fCurrentCoef2[0] = fCurrentCoef2[1];
55a288e5 3089 }
3a0f6479 3090
55a288e5 3091 }
3092 else {
3a0f6479 3093 fCurrentCoef[0] = -TMath::Abs(fCurrentCoef[1]);
3094 fCurrentCoef2[0] = fCurrentCoef2[1];
55a288e5 3095 }
3096
3a0f6479 3097 if (fDebugLevel == 1) {
55a288e5 3098 TCanvas *cpentei = new TCanvas("cpentei","cpentei",50,50,600,800);
3099 cpentei->cd();
3100 projPH->Draw();
3101 line->SetLineColor(2);
3102 line->DrawLine(fPhd[0],0,fPhd[0],projPH->GetMaximum());
3103 line->DrawLine(fPhd[1],0,fPhd[1],projPH->GetMaximum());
3104 line->DrawLine(fPhd[2],0,fPhd[2],projPH->GetMaximum());
3105 AliInfo(Form("fPhd[0] (beginning of the signal): %f" ,(Float_t) fPhd[0]));
3106 AliInfo(Form("fPhd[1] (end of the amplification region): %f" ,(Float_t) fPhd[1]));
3107 AliInfo(Form("fPhd[2] (end of the drift region): %f" ,(Float_t) fPhd[2]));
3a0f6479 3108 AliInfo(Form("fVriftCoef[1] (with only the drift region(default)): %f",(Float_t) fCurrentCoef[0]));
55a288e5 3109 TCanvas *cpentei2 = new TCanvas("cpentei2","cpentei2",50,50,600,800);
3110 cpentei2->cd();
3111 pentea->Draw();
3112 TCanvas *cpentei3 = new TCanvas("cpentei3","cpentei3",50,50,600,800);
3113 cpentei3->cd();
3114 pente->Draw();
3115 }
3a0f6479 3116 else {
55a288e5 3117 delete pentea;
55a288e5 3118 delete pente;
3119 }
55a288e5 3120}
55a288e5 3121//_____________________________________________________________________________
3a0f6479 3122void AliTRDCalibraFit::FitLagrangePoly(TH1* projPH)
55a288e5 3123{
3124 //
3125 // Slope methode but with polynomes de Lagrange
3126 //
3127
3128 // Constants
3129 const Float_t kDrWidth = AliTRDgeometry::DrThick();
3a0f6479 3130 Int_t binmax = 0;
3131 Int_t binmin = 0;
3132 Double_t *x = new Double_t[5];
3133 Double_t *y = new Double_t[5];
3134 x[0] = 0.0;
3135 x[1] = 0.0;
3136 x[2] = 0.0;
3137 x[3] = 0.0;
3138 x[4] = 0.0;
3139 y[0] = 0.0;
3140 y[1] = 0.0;
3141 y[2] = 0.0;
3142 y[3] = 0.0;
3143 y[4] = 0.0;
3144 fPhd[0] = 0.0;
3145 fPhd[1] = 0.0;
3146 fPhd[2] = 0.0;
3147 Int_t ju = 0;
3148 fCurrentCoefE = 0.0;
3149 fCurrentCoefE2 = 1.0;
3150 fCurrentCoef[0] = 0.0;
3151 fCurrentCoef2[0] = 0.0;
55a288e5 3152 TLine *line = new TLine();
3153 TF1 * polynome = 0x0;
3154 TF1 * polynomea = 0x0;
3155 TF1 * polynomeb = 0x0;
3156 Double_t *c = 0x0;
3157
3158 // Some variables
3159 TAxis *xpph = projPH->GetXaxis();
3160 Int_t nbins = xpph->GetNbins();
3161 Double_t lowedge = xpph->GetBinLowEdge(1);
3162 Double_t upedge = xpph->GetBinUpEdge(xpph->GetNbins());
3163 Double_t widbins = (upedge - lowedge) / nbins;
3164 Double_t limit = upedge + 0.5 * widbins;
3165
3166
3167 Bool_t put = kTRUE;
3168
3169 // Beginning of the signal
3170 TH1D *pentea = new TH1D("pentea","pentea",projPH->GetNbinsX(),0,(Float_t) limit);
3171 for (Int_t k = 1; k < projPH->GetNbinsX(); k++) {
3172 pentea->SetBinContent(k,(Double_t) (projPH->GetBinContent(k+1) - projPH->GetBinContent(k)));
3173 }
3174
3175 binmax = (Int_t) pentea->GetMaximumBin();
55a288e5 3176
3177 Double_t minnn = 0.0;
3178 Double_t maxxx = 0.0;
3179
3a0f6479 3180 Int_t kase = nbins-binmax;
3181
3182 switch(kase)
3183 {
3184 case 0:
3185 put = kFALSE;
3186 break;
3187 case 1:
3188 minnn = pentea->GetBinCenter(binmax-2);
3189 maxxx = pentea->GetBinCenter(binmax);
3190 x[0] = pentea->GetBinCenter(binmax-2);
3191 x[1] = pentea->GetBinCenter(binmax-1);
3192 x[2] = pentea->GetBinCenter(binmax);
3193 y[0] = pentea->GetBinContent(binmax-2);
3194 y[1] = pentea->GetBinContent(binmax-1);
3195 y[2] = pentea->GetBinContent(binmax);
3196 c = CalculPolynomeLagrange2(x,y);
3197 AliInfo("At the limit for beginning!");
3198 break;
3199 case 2:
3200 minnn = pentea->GetBinCenter(binmax-2);
3201 maxxx = pentea->GetBinCenter(binmax+1);
3202 x[0] = pentea->GetBinCenter(binmax-2);
3203 x[1] = pentea->GetBinCenter(binmax-1);
3204 x[2] = pentea->GetBinCenter(binmax);
3205 x[3] = pentea->GetBinCenter(binmax+1);
3206 y[0] = pentea->GetBinContent(binmax-2);
3207 y[1] = pentea->GetBinContent(binmax-1);
3208 y[2] = pentea->GetBinContent(binmax);
3209 y[3] = pentea->GetBinContent(binmax+1);
3210 c = CalculPolynomeLagrange3(x,y);
3211 break;
3212 default:
3213 switch(binmax){
3214 case 0:
3215 put = kFALSE;
3216 break;
3217 case 1:
3218 minnn = pentea->GetBinCenter(binmax);
3219 maxxx = pentea->GetBinCenter(binmax+2);
3220 x[0] = pentea->GetBinCenter(binmax);
3221 x[1] = pentea->GetBinCenter(binmax+1);
3222 x[2] = pentea->GetBinCenter(binmax+2);
3223 y[0] = pentea->GetBinContent(binmax);
3224 y[1] = pentea->GetBinContent(binmax+1);
3225 y[2] = pentea->GetBinContent(binmax+2);
3226 c = CalculPolynomeLagrange2(x,y);
3227 break;
3228 case 2:
3229 minnn = pentea->GetBinCenter(binmax-1);
3230 maxxx = pentea->GetBinCenter(binmax+2);
3231 x[0] = pentea->GetBinCenter(binmax-1);
3232 x[1] = pentea->GetBinCenter(binmax);
3233 x[2] = pentea->GetBinCenter(binmax+1);
3234 x[3] = pentea->GetBinCenter(binmax+2);
3235 y[0] = pentea->GetBinContent(binmax-1);
3236 y[1] = pentea->GetBinContent(binmax);
3237 y[2] = pentea->GetBinContent(binmax+1);
3238 y[3] = pentea->GetBinContent(binmax+2);
3239 c = CalculPolynomeLagrange3(x,y);
3240 break;
3241 default:
3242 minnn = pentea->GetBinCenter(binmax-2);
3243 maxxx = pentea->GetBinCenter(binmax+2);
3244 x[0] = pentea->GetBinCenter(binmax-2);
3245 x[1] = pentea->GetBinCenter(binmax-1);
3246 x[2] = pentea->GetBinCenter(binmax);
3247 x[3] = pentea->GetBinCenter(binmax+1);
3248 x[4] = pentea->GetBinCenter(binmax+2);
3249 y[0] = pentea->GetBinContent(binmax-2);
3250 y[1] = pentea->GetBinContent(binmax-1);
3251 y[2] = pentea->GetBinContent(binmax);
3252 y[3] = pentea->GetBinContent(binmax+1);
3253 y[4] = pentea->GetBinContent(binmax+2);
3254 c = CalculPolynomeLagrange4(x,y);
3255 break;
3256 }
3257 break;
55a288e5 3258 }
3a0f6479 3259
3260
55a288e5 3261 if(put) {
3262 polynomeb = new TF1("polb","[0]+[1]*x+[2]*x*x+[3]*x*x*x+[4]*x*x*x*x",minnn,maxxx);
3263 polynomeb->SetParameters(c[0],c[1],c[2],c[3],c[4]);
3a0f6479 3264
55a288e5 3265 Double_t step = (maxxx-minnn)/10000;
3266 Double_t l = minnn;
3267 Double_t maxvalue = 0.0;
3268 Double_t placemaximum = minnn;
3269 for(Int_t o = 0; o < 10000; o++){
3270 if(o == 0) maxvalue = polynomeb->Eval(l);
3271 if(maxvalue < (polynomeb->Eval(l))){
3272 maxvalue = polynomeb->Eval(l);
3273 placemaximum = l;
3274 }
3275 l += step;
3276 }
3277 fPhd[0] = placemaximum;
3278 }
55a288e5 3279
3280 // Amplification region
3281 binmax = 0;
3282 ju = 0;
3283 for (Int_t kbin = 1; kbin < projPH->GetNbinsX(); kbin ++) {
3a0f6479 3284 if (((projPH->GetBinContent(kbin+1) - projPH->GetBinContent(kbin)) <= 0.0) && (ju == 0) && (kbin > (fPhd[0]/widbins))) {
55a288e5 3285 binmax = kbin;
3286 ju = 1;
3287 }
3288 }
3a0f6479 3289
55a288e5 3290 Double_t minn = 0.0;
3291 Double_t maxx = 0.0;
3a0f6479 3292 x[0] = 0.0;
3293 x[1] = 0.0;
3294 x[2] = 0.0;
3295 x[3] = 0.0;
3296 x[4] = 0.0;
3297 y[0] = 0.0;
3298 y[1] = 0.0;
3299 y[2] = 0.0;
3300 y[3] = 0.0;
3301 y[4] = 0.0;
3302
3303 Int_t kase1 = nbins - binmax;
55a288e5 3304
3305 //Determination of minn and maxx
3306 //case binmax = nbins
3307 //pol2
3a0f6479 3308 switch(kase1)
3309 {
3310 case 0:
3311 minn = projPH->GetBinCenter(binmax-2);
3312 maxx = projPH->GetBinCenter(binmax);
3313 x[0] = projPH->GetBinCenter(binmax-2);
3314 x[1] = projPH->GetBinCenter(binmax-1);
3315 x[2] = projPH->GetBinCenter(binmax);
3316 y[0] = projPH->GetBinContent(binmax-2);
3317 y[1] = projPH->GetBinContent(binmax-1);
3318 y[2] = projPH->GetBinContent(binmax);
3319 c = CalculPolynomeLagrange2(x,y);
3320 //AliInfo("At the limit for the drift!");
3321 break;
3322 case 1:
3323 minn = projPH->GetBinCenter(binmax-2);
3324 maxx = projPH->GetBinCenter(binmax+1);
3325 x[0] = projPH->GetBinCenter(binmax-2);
3326 x[1] = projPH->GetBinCenter(binmax-1);
3327 x[2] = projPH->GetBinCenter(binmax);
3328 x[3] = projPH->GetBinCenter(binmax+1);
3329 y[0] = projPH->GetBinContent(binmax-2);
3330 y[1] = projPH->GetBinContent(binmax-1);
3331 y[2] = projPH->GetBinContent(binmax);
3332 y[3] = projPH->GetBinContent(binmax+1);
3333 c = CalculPolynomeLagrange3(x,y);
3334 break;
3335 default:
3336 switch(binmax)
3337 {
3338 case 0:
3339 put = kFALSE;
3340 break;
3341 case 1:
3342 minn = projPH->GetBinCenter(binmax);
3343 maxx = projPH->GetBinCenter(binmax+2);
3344 x[0] = projPH->GetBinCenter(binmax);
3345 x[1] = projPH->GetBinCenter(binmax+1);
3346 x[2] = projPH->GetBinCenter(binmax+2);
3347 y[0] = projPH->GetBinContent(binmax);
3348 y[1] = projPH->GetBinContent(binmax+1);
3349 y[2] = projPH->GetBinContent(binmax+2);
3350 c = CalculPolynomeLagrange2(x,y);
3351 break;
3352 case 2:
3353 minn = projPH->GetBinCenter(binmax-1);
3354 maxx = projPH->GetBinCenter(binmax+2);
3355 x[0] = projPH->GetBinCenter(binmax-1);
3356 x[1] = projPH->GetBinCenter(binmax);
3357 x[2] = projPH->GetBinCenter(binmax+1);
3358 x[3] = projPH->GetBinCenter(binmax+2);
3359 y[0] = projPH->GetBinContent(binmax-1);
3360 y[1] = projPH->GetBinContent(binmax);
3361 y[2] = projPH->GetBinContent(binmax+1);
3362 y[3] = projPH->GetBinContent(binmax+2);
3363 c = CalculPolynomeLagrange3(x,y);
3364 break;
3365 default:
3366 minn = projPH->GetBinCenter(binmax-2);
3367 maxx = projPH->GetBinCenter(binmax+2);
3368 x[0] = projPH->GetBinCenter(binmax-2);
3369 x[1] = projPH->GetBinCenter(binmax-1);
3370 x[2] = projPH->GetBinCenter(binmax);
3371 x[3] = projPH->GetBinCenter(binmax+1);
3372 x[4] = projPH->GetBinCenter(binmax+2);
3373 y[0] = projPH->GetBinContent(binmax-2);
3374 y[1] = projPH->GetBinContent(binmax-1);
3375 y[2] = projPH->GetBinContent(binmax);
3376 y[3] = projPH->GetBinContent(binmax+1);
3377 y[4] = projPH->GetBinContent(binmax+2);
3378 c = CalculPolynomeLagrange4(x,y);
3379 break;
3380 }
3381 break;
55a288e5 3382 }
3a0f6479 3383
55a288e5 3384 if(put) {
3385 polynomea = new TF1("pola","[0]+[1]*x+[2]*x*x+[3]*x*x*x+[4]*x*x*x*x",minn,maxx);
3386 polynomea->SetParameters(c[0],c[1],c[2],c[3],c[4]);
3a0f6479 3387
55a288e5 3388 Double_t step = (maxx-minn)/1000;
3389 Double_t l = minn;
3390 Double_t maxvalue = 0.0;
3391 Double_t placemaximum = minn;
3392 for(Int_t o = 0; o < 1000; o++){
3393 if(o == 0) maxvalue = polynomea->Eval(l);
3394 if(maxvalue < (polynomea->Eval(l))){
3395 maxvalue = polynomea->Eval(l);
3396 placemaximum = l;
3397 }
3398 l += step;
3399 }
3400 fPhd[1] = placemaximum;
3401 }
3402
55a288e5 3403 // Drift region
3404 TH1D *pente = new TH1D("pente","pente", projPH->GetNbinsX(),0,(Float_t) limit);
3405 for (Int_t k = TMath::Min(binmax+4, projPH->GetNbinsX()); k < projPH->GetNbinsX(); k++) {
3406 pente->SetBinContent(k,(Double_t) (projPH->GetBinContent(k+1) - projPH->GetBinContent(k)));
3407 }
3408 binmin = 0;
3409 if(pente->GetEntries() > 0) binmin = (Int_t) pente->GetMinimumBin();
3410
3411 //should not happen
3412 if (binmin <= 1) {
3413 binmin = 2;
3414 put = 1;
3415 AliInfo("Put the binmax from 1 to 2 to enable the fit");
3416 }
3417
3418 //check
3419 if((projPH->GetBinContent(binmin)-projPH->GetBinError(binmin)) < (projPH->GetBinContent(binmin+1))) put = kFALSE;
3420 if((projPH->GetBinContent(binmin)+projPH->GetBinError(binmin)) > (projPH->GetBinContent(binmin-1))) put = kFALSE;
3a0f6479 3421
3422 x[0] = 0.0;
3423 x[1] = 0.0;
3424 x[2] = 0.0;
3425 x[3] = 0.0;
3426 x[4] = 0.0;
3427 y[0] = 0.0;
3428 y[1] = 0.0;
3429 y[2] = 0.0;
3430 y[3] = 0.0;
3431 y[4] = 0.0;
55a288e5 3432 Double_t min = 0.0;
3433 Double_t max = 0.0;
3434 Bool_t case1 = kFALSE;
3435 Bool_t case2 = kFALSE;
3436 Bool_t case4 = kFALSE;
3437
3438 //Determination of min and max
3439 //case binmin <= nbins-3
3440 //pol4 case 3
3441 if((binmin <= (nbins-3)) && ((binmin-2) >= TMath::Min(binmax+4, projPH->GetNbinsX()))){
3442 min = pente->GetBinCenter(binmin-2);
3443 max = pente->GetBinCenter(binmin+2);
3444 x[0] = pente->GetBinCenter(binmin-2);
3445 x[1] = pente->GetBinCenter(binmin-1);
3446 x[2] = pente->GetBinCenter(binmin);
3447 x[3] = pente->GetBinCenter(binmin+1);
3448 x[4] = pente->GetBinCenter(binmin+2);
3449 y[0] = pente->GetBinContent(binmin-2);
3450 y[1] = pente->GetBinContent(binmin-1);
3451 y[2] = pente->GetBinContent(binmin);
3452 y[3] = pente->GetBinContent(binmin+1);
3453 y[4] = pente->GetBinContent(binmin+2);
3454 //Calcul the polynome de Lagrange
3455 c = CalculPolynomeLagrange4(x,y);
3456 //richtung +/-
3457 if((pente->GetBinContent(binmin+2) <= pente->GetBinContent(binmin+1)) &&
3458 (pente->GetBinContent(binmin-2) <= pente->GetBinContent(binmin-1))) put = kFALSE;
3459 if(((binmin+3) <= (nbins-1)) &&
3460 (pente->GetBinContent(binmin+3) <= pente->GetBinContent(binmin+2)) &&
3461 ((binmin-3) >= TMath::Min(binmax+4, projPH->GetNbinsX())) &&
3462 (pente->GetBinContent(binmin-3) <= pente->GetBinContent(binmin-2))) put = kFALSE;
3463 if((pente->GetBinContent(binmin+2) <= pente->GetBinContent(binmin+1)) &&
3464 (pente->GetBinContent(binmin-2) > pente->GetBinContent(binmin-1))) case1 = kTRUE;
3465 if((pente->GetBinContent(binmin+2) > pente->GetBinContent(binmin+1)) &&
3466 (pente->GetBinContent(binmin-2) <= pente->GetBinContent(binmin-1))) case4 = kTRUE;
3467 }
3468 //case binmin = nbins-2
3469 //pol3 case 1
3470 if(((binmin == (nbins-2)) && ((binmin-2) >= TMath::Min(binmax+4, projPH->GetNbinsX()))) ||
3471 (case1)){
3472 min = pente->GetBinCenter(binmin-2);
3473 max = pente->GetBinCenter(binmin+1);
3474 x[0] = pente->GetBinCenter(binmin-2);
3475 x[1] = pente->GetBinCenter(binmin-1);
3476 x[2] = pente->GetBinCenter(binmin);
3477 x[3] = pente->GetBinCenter(binmin+1);
3478 y[0] = pente->GetBinContent(binmin-2);
3479 y[1] = pente->GetBinContent(binmin-1);
3480 y[2] = pente->GetBinContent(binmin);
3481 y[3] = pente->GetBinContent(binmin+1);
3482 //Calcul the polynome de Lagrange
3483 c = CalculPolynomeLagrange3(x,y);
3484 //richtung +: nothing
3485 //richtung -
3486 if((pente->GetBinContent(binmin-2) <= pente->GetBinContent(binmin-1))) case2 = kTRUE;
3487 }
3488 //pol3 case 4
3489 if(((binmin <= (nbins-3)) && ((binmin-1) == TMath::Min(binmax+4, projPH->GetNbinsX()))) ||
3490 (case4)){
3491 min = pente->GetBinCenter(binmin-1);
3492 max = pente->GetBinCenter(binmin+2);
3493 x[0] = pente->GetBinCenter(binmin-1);
3494 x[1] = pente->GetBinCenter(binmin);
3495 x[2] = pente->GetBinCenter(binmin+1);
3496 x[3] = pente->GetBinCenter(binmin+2);
3497 y[0] = pente->GetBinContent(binmin-1);
3498 y[1] = pente->GetBinContent(binmin);
3499 y[2] = pente->GetBinContent(binmin+1);
3500 y[3] = pente->GetBinContent(binmin+2);
3501 //Calcul the polynome de Lagrange
3502 c = CalculPolynomeLagrange3(x,y);
3503 //richtung +
3504 if((pente->GetBinContent(binmin+2) <= pente->GetBinContent(binmin+1))) case2 = kTRUE;
3505 }
3506 //pol2 case 5
3507 if((binmin <= (nbins-3)) && (binmin == TMath::Min(binmax+4, projPH->GetNbinsX()))){
3508 min = pente->GetBinCenter(binmin);
3509 max = pente->GetBinCenter(binmin+2);
3510 x[0] = pente->GetBinCenter(binmin);
3511 x[1] = pente->GetBinCenter(binmin+1);
3512 x[2] = pente->GetBinCenter(binmin+2);
3513 y[0] = pente->GetBinContent(binmin);
3514 y[1] = pente->GetBinContent(binmin+1);
3515 y[2] = pente->GetBinContent(binmin+2);
3516 //Calcul the polynome de Lagrange
3517 c = CalculPolynomeLagrange2(x,y);
3518 //richtung +
3519 if((pente->GetBinContent(binmin+2) <= pente->GetBinContent(binmin+1))) put = kFALSE;
3520 }
3521 //pol2 case 2
3522 if(((binmin == (nbins-2)) && ((binmin-1) == TMath::Min(binmax+4, projPH->GetNbinsX()))) ||
3523 (case2)){
3524 min = pente->GetBinCenter(binmin-1);
3525 max = pente->GetBinCenter(binmin+1);
3526 x[0] = pente->GetBinCenter(binmin-1);
3527 x[1] = pente->GetBinCenter(binmin);
3528 x[2] = pente->GetBinCenter(binmin+1);
3529 y[0] = pente->GetBinContent(binmin-1);
3530 y[1] = pente->GetBinContent(binmin);
3531 y[2] = pente->GetBinContent(binmin+1);
3532 //Calcul the polynome de Lagrange
3533 c = CalculPolynomeLagrange2(x,y);
3534 //richtung +: nothing
3535 //richtung -: nothing
3536 }
3537 //case binmin = nbins-1
3538 //pol2 case 0
3539 if((binmin == (nbins-1)) && ((binmin-2) >= TMath::Min(binmax+4, projPH->GetNbinsX()))){
3540 min = pente->GetBinCenter(binmin-2);
3541 max = pente->GetBinCenter(binmin);
3542 x[0] = pente->GetBinCenter(binmin-2);
3543 x[1] = pente->GetBinCenter(binmin-1);
3544 x[2] = pente->GetBinCenter(binmin);
3545 y[0] = pente->GetBinContent(binmin-2);
3546 y[1] = pente->GetBinContent(binmin-1);
3547 y[2] = pente->GetBinContent(binmin);
3548 //Calcul the polynome de Lagrange
3549 c = CalculPolynomeLagrange2(x,y);
3a0f6479 3550 //AliInfo("At the limit for the drift!");
55a288e5 3551 //fluctuation too big!
3552 //richtung +: nothing
3553 //richtung -
3554 if((pente->GetBinContent(binmin-2) <= pente->GetBinContent(binmin-1))) put = kFALSE;
3555 }
3556 if((binmin == (nbins-1)) && ((binmin-2) < TMath::Min(binmax+4, projPH->GetNbinsX()))) {
3557 put = kFALSE;
3558 AliInfo("At the limit for the drift and not usable!");
3559 }
3560
3561 //pass
3562 if((binmin == (nbins-2)) && ((binmin-1) < TMath::Min(binmax+4, projPH->GetNbinsX()))){
3563 put = kFALSE;
3564 AliInfo("For the drift...problem!");
3565 }
55a288e5 3566 //pass but should not happen
3567 if((binmin <= (nbins-3)) && (binmin < TMath::Min(binmax+4, projPH->GetNbinsX()))){
3568 put = kFALSE;
3569 AliInfo("For the drift...problem!");
3570 }
3a0f6479 3571
55a288e5 3572 if(put) {
3573 polynome = new TF1("pol","[0]+[1]*x+[2]*x*x+[3]*x*x*x+[4]*x*x*x*x",min,max);
3574 polynome->SetParameters(c[0],c[1],c[2],c[3],c[4]);
55a288e5 3575 //AliInfo(Form("GetMinimum of the function %f",polynome->GetMinimumX()));
3576 Double_t step = (max-min)/1000;
3577 Double_t l = min;
3578 Double_t minvalue = 0.0;
3579 Double_t placeminimum = min;
3580 for(Int_t o = 0; o < 1000; o++){
3581 if(o == 0) minvalue = polynome->Eval(l);
3582 if(minvalue > (polynome->Eval(l))){
3583 minvalue = polynome->Eval(l);
3584 placeminimum = l;
3585 }
3586 l += step;
3587 }
3588 fPhd[2] = placeminimum;
3589 }
3a0f6479 3590
55a288e5 3591 Float_t fPhdt0 = 0.0;
3592 if(fTakeTheMaxPH) fPhdt0 = fPhd[1];
3593 else fPhdt0 = fPhd[0];
3594
3595 if ((fPhd[2] > fPhd[0]) &&
3596 (fPhd[2] > fPhd[1]) &&
3597 (fPhd[1] > fPhd[0]) &&
3598 (put)) {
3a0f6479 3599 fCurrentCoef[0] = (kDrWidth) / (fPhd[2]-fPhd[1]);
3600 fNumberFitSuccess++;
55a288e5 3601 if (fPhdt0 >= 0.0) {
3a0f6479 3602 fCurrentCoef2[0] = (fPhdt0 - fT0Shift) / widbins;
3603 if (fCurrentCoef2[0] < -1.0) {
3604 fCurrentCoef2[0] = fCurrentCoef2[1];
55a288e5 3605 }
3606 }
3607 else {
3a0f6479 3608 fCurrentCoef2[0] = fCurrentCoef2[1];
55a288e5 3609 }
3610 }
3611 else {
3a0f6479 3612 fCurrentCoef[0] = -TMath::Abs(fCurrentCoef[1]);
3613 fCurrentCoef2[0] = fCurrentCoef2[1];
3614 //printf("Fit failed!\n");
55a288e5 3615 }
3616
3a0f6479 3617 if (fDebugLevel == 1) {
55a288e5 3618 TCanvas *cpentei = new TCanvas("cpentei","cpentei",50,50,600,800);
3619 cpentei->cd();
3620 projPH->Draw();
3621 line->SetLineColor(2);
3622 line->DrawLine(fPhd[0],0,fPhd[0],projPH->GetMaximum());
3623 line->DrawLine(fPhd[1],0,fPhd[1],projPH->GetMaximum());
3624 line->DrawLine(fPhd[2],0,fPhd[2],projPH->GetMaximum());
3625 AliInfo(Form("fPhd[0] (beginning of the signal): %f" ,(Float_t) fPhd[0]));
3626 AliInfo(Form("fPhd[1] (end of the amplification region): %f" ,(Float_t) fPhd[1]));
3627 AliInfo(Form("fPhd[2] (end of the drift region): %f" ,(Float_t) fPhd[2]));
3a0f6479 3628 AliInfo(Form("fVriftCoef[3] (with only the drift region(default)): %f",(Float_t) fCurrentCoef[0]));
55a288e5 3629 TCanvas *cpentei2 = new TCanvas("cpentei2","cpentei2",50,50,600,800);
3630 cpentei2->cd();
3631 pentea->Draw();
3632 TCanvas *cpentei3 = new TCanvas("cpentei3","cpentei3",50,50,600,800);
3633 cpentei3->cd();
3634 pente->Draw();
3635 }
3a0f6479 3636 else {
55a288e5 3637 delete pentea;
3638 delete pente;
3639 delete polynome;
3640 delete polynomea;
3641 delete polynomeb;
3642 }
3a0f6479 3643
55a288e5 3644 projPH->SetDirectory(0);
3645
3646}
3647
3648//_____________________________________________________________________________
3649void AliTRDCalibraFit::FitPH(TH1* projPH, Int_t idect)
3650{
3651 //
3652 // Fit methode for the drift velocity
3653 //
3654
3655 // Constants
3656 const Float_t kDrWidth = AliTRDgeometry::DrThick();
3657
3658 // Some variables
3659 TAxis *xpph = projPH->GetXaxis();
3660 Double_t upedge = xpph->GetBinUpEdge(xpph->GetNbins());
3661
3662 TF1 *fPH = new TF1("fPH",AliTRDCalibraFit::PH,-0.05,3.2,6);
3663 fPH->SetParameter(0,0.469); // Scaling
3664 fPH->SetParameter(1,0.18); // Start
3665 fPH->SetParameter(2,0.0857325); // AR
3666 fPH->SetParameter(3,1.89); // DR
3667 fPH->SetParameter(4,0.08); // QA/QD
3668 fPH->SetParameter(5,0.0); // Baseline
3669
3670 TLine *line = new TLine();
3671
3a0f6479 3672 fCurrentCoef[0] = 0.0;
3673 fCurrentCoef2[0] = 0.0;
3674 fCurrentCoefE = 0.0;
3675 fCurrentCoefE2 = 0.0;
55a288e5 3676
3677 if (idect%fFitPHPeriode == 0) {
3678
3a0f6479 3679 AliInfo(Form("The detector %d will be fitted",idect));
55a288e5 3680 fPH->SetParameter(0,(projPH->Integral()-(projPH->GetBinContent(1)*projPH->GetNbinsX())) * 0.00028); // Scaling
3681 fPH->SetParameter(1,fPhd[0] - 0.1); // Start
3682 fPH->SetParameter(2,fPhd[1] - fPhd[0]); // AR
3683 fPH->SetParameter(3,fPhd[2] - fPhd[1]); // DR
3684 fPH->SetParameter(4,0.225); // QA/QD
3685 fPH->SetParameter(5,(Float_t) projPH->GetBinContent(1));
3686
3a0f6479 3687 if (fDebugLevel != 1) {
55a288e5 3688 projPH->Fit(fPH,"0M","",0.0,upedge);
3689 }
3a0f6479 3690 else {
55a288e5 3691 TCanvas *cpente = new TCanvas("cpente","cpente",50,50,600,800);
3692 cpente->cd();
3693 projPH->Fit(fPH,"M+","",0.0,upedge);
3694 projPH->Draw("E0");
3695 line->SetLineColor(4);
3696 line->DrawLine(fPH->GetParameter(1)
3697 ,0
3698 ,fPH->GetParameter(1)
3699 ,projPH->GetMaximum());
3700 line->DrawLine(fPH->GetParameter(1)+fPH->GetParameter(2)
3701 ,0
3702 ,fPH->GetParameter(1)+fPH->GetParameter(2)
3703 ,projPH->GetMaximum());
3704 line->DrawLine(fPH->GetParameter(1)+fPH->GetParameter(2)+fPH->GetParameter(3)
3705 ,0
3706 ,fPH->GetParameter(1)+fPH->GetParameter(2)+fPH->GetParameter(3)
3707 ,projPH->GetMaximum());
3708 }
3709
3710 if (fPH->GetParameter(3) != 0) {
3a0f6479 3711 fNumberFitSuccess++;
3712 fCurrentCoef[0] = kDrWidth / (fPH->GetParameter(3));
3713 fCurrentCoefE = (fPH->GetParError(3)/fPH->GetParameter(3))*fCurrentCoef[0];
3714 fCurrentCoef2[0] = fPH->GetParameter(1);
3715 fCurrentCoefE2 = fPH->GetParError(1);
55a288e5 3716 }
3717 else {
3a0f6479 3718 fCurrentCoef[0] = -TMath::Abs(fCurrentCoef[1]);
3719 fCurrentCoef2[0] = fCurrentCoef2[1];
55a288e5 3720 }
3a0f6479 3721
55a288e5 3722 }
55a288e5 3723 else {
3724
3a0f6479 3725 // Put the default value
3726 fCurrentCoef[0] = -TMath::Abs(fCurrentCoef[1]);
3727 fCurrentCoef2[0] = fCurrentCoef2[1];
55a288e5 3728 }
3729
3a0f6479 3730 if (fDebugLevel != 1) {
55a288e5 3731 delete fPH;
3732 }
3733
3734}
55a288e5 3735//_____________________________________________________________________________
3a0f6479 3736Bool_t AliTRDCalibraFit::FitPRFGausMI(Double_t *arraye, Double_t *arraym, Double_t *arrayme, Int_t nBins, Float_t xMin, Float_t xMax)
55a288e5 3737{
3738 //
3739 // Fit methode for the sigma of the pad response function
3740 //
3a0f6479 3741
3742 TVectorD param(3);
55a288e5 3743
3a0f6479 3744 fCurrentCoef[0] = 0.0;
3745 fCurrentCoefE = 0.0;
3746
3747 Double_t ret = FitGausMI(arraye, arraym, arrayme, nBins, xMin, xMax,&param);
3748
3749 if(ret == -4){
3750 fCurrentCoef[0] = -fCurrentCoef[1];
3751 return kFALSE;
3752 }
3753 else {
3754 fNumberFitSuccess++;
3755 fCurrentCoef[0] = param[2];
3756 fCurrentCoefE = ret;
3757 return kTRUE;
3758 }
3759}
3760//_____________________________________________________________________________
3761Double_t AliTRDCalibraFit::FitGausMI(Double_t *arraye, Double_t *arraym, Double_t *arrayme, Int_t nBins, Float_t xMin, Float_t xMax, TVectorD *param, Bool_t kError)
3762{
3763 //
3764 // Fit methode for the sigma of the pad response function
3765 //
3766
3767 //We should have at least 3 points
3768 if(nBins <=3) return -4.0;
3769
3770 TLinearFitter fitter(3,"pol2");
3771 fitter.StoreData(kFALSE);
3772 fitter.ClearPoints();
3773 TVectorD par(3);
3774 Float_t binWidth = (xMax-xMin)/(Float_t)nBins;
3775 Float_t entries = 0;
3776 Int_t nbbinwithentries = 0;
3777 for (Int_t i=0; i<nBins; i++){
3778 entries+=arraye[i];
3779 if(arraye[i] > 15) nbbinwithentries++;
3780 //printf("entries for i %d: %f\n",i,arraye[i]);
3781 }
3782 if ((entries<700) || (nbbinwithentries < ((Int_t)(nBins/2)))) return -4;
3783 //printf("entries %f\n",entries);
3784 //printf("nbbinwithentries %d\n",nbbinwithentries);
3785
3786 Int_t npoints=0;
3787 Float_t errorm = 0.0;
3788 Float_t errorn = 0.0;
3789 Float_t error = 0.0;
3790
3791 //
3792 for (Int_t ibin=0;ibin<nBins; ibin++){
3793 Float_t entriesI = arraye[ibin];
3794 Float_t valueI = arraym[ibin];
3795 Double_t xcenter = 0.0;
3796 Float_t val = 0.0;
3797 if ((entriesI>15) && (valueI>0.0)){
3798 xcenter = xMin+(ibin+0.5)*binWidth;
3799 errorm = 0.0;
3800 errorn = 0.0;
3801 error = 0.0;
3802 if(!kError){
3803 if((valueI + 0.01) > 0.0) errorm = TMath::Log((valueI + 0.01)/valueI);
3804 if((valueI - 0.01) > 0.0) errorn = TMath::Log((valueI - 0.01)/valueI);
3805 error = TMath::Max(TMath::Abs(errorm),TMath::Abs(errorn));
3806 }
3807 else{
3808 if((valueI + arrayme[ibin]) > 0.0) errorm = TMath::Log((valueI + arrayme[ibin])/valueI);
3809 if((valueI - arrayme[ibin]) > 0.0) errorn = TMath::Log((valueI - arrayme[ibin])/valueI);
3810 error = TMath::Max(TMath::Abs(errorm),TMath::Abs(errorn));
3811 }
3812 if(error == 0.0) continue;
3813 val = TMath::Log(Float_t(valueI));
3814 fitter.AddPoint(&xcenter,val,error);
3815 npoints++;
3816 }
3817
3818 if(fDebugLevel > 1){
55a288e5 3819
3a0f6479 3820 if ( !fDebugStreamer ) {
3821 //debug stream
3822 TDirectory *backup = gDirectory;
3823 fDebugStreamer = new TTreeSRedirector("TRDDebugFit.root");
3824 if ( backup ) backup->cd(); //we don't want to be cd'd to the debug streamer
3825 }
3826
3827 Int_t detector = fCountDet;
3828 Int_t plane = GetPlane(fCountDet);
3829 Int_t group = ibin;
3830
3831 (* fDebugStreamer) << "FitGausMIFill"<<
3832 "detector="<<detector<<
3833 "plane="<<plane<<
3834 "nbins="<<nBins<<
3835 "group="<<group<<
3836 "entriesI="<<entriesI<<
3837 "valueI="<<valueI<<
3838 "val="<<val<<
3839 "xcenter="<<xcenter<<
3840 "errorm="<<errorm<<
3841 "errorn="<<errorn<<
3842 "error="<<error<<
3843 "kError="<<kError<<
3844 "\n";
3845 }
3846
3847 }
3848
3849 if(npoints <=3) return -4.0;
3850
3851 Double_t chi2 = 0;
3852 if (npoints>3){
3853 fitter.Eval();
3854 fitter.GetParameters(par);
3855 chi2 = fitter.GetChisquare()/Float_t(npoints);
55a288e5 3856
3a0f6479 3857
3858 if (!param) param = new TVectorD(3);
3859 if(par[2] == 0.0) return -4.0;
3860 Double_t x = TMath::Sqrt(TMath::Abs(-2*par[2]));
3861 Double_t deltax = (fitter.GetParError(2))/x;
3862 Double_t errorparam2 = TMath::Abs(deltax)/(x*x);
3863 chi2 = errorparam2;
55a288e5 3864
3a0f6479 3865 (*param)[1] = par[1]/(-2.*par[2]);
3866 (*param)[2] = 1./TMath::Sqrt(TMath::Abs(-2.*par[2]));
3867 Double_t lnparam0 = par[0]+ par[1]* (*param)[1] + par[2]*(*param)[1]*(*param)[1];
3868 if ( lnparam0>307 ) return -4;
3869 (*param)[0] = TMath::Exp(lnparam0);
3870
3871 if(fDebugLevel > 1){
3872
3873 if ( !fDebugStreamer ) {
3874 //debug stream
3875 TDirectory *backup = gDirectory;
3876 fDebugStreamer = new TTreeSRedirector("TRDDebugFit.root");
3877 if ( backup ) backup->cd(); //we don't want to be cd'd to the debug streamer
3878 }
3879
3880 Int_t detector = fCountDet;
3881 Int_t plane = GetPlane(fCountDet);
3882
3883
3884 (* fDebugStreamer) << "FitGausMIFit"<<
3885 "detector="<<detector<<
3886 "plane="<<plane<<
3887 "nbins="<<nBins<<
3888 "errorsigma="<<chi2<<
3889 "mean="<<(*param)[1]<<
3890 "sigma="<<(*param)[2]<<
3891 "constant="<<(*param)[0]<<
3892 "\n";
3893 }
3894 }
3895
3896 if((chi2/(*param)[2]) > 0.1){
3897 if(kError){
3898 chi2 = FitGausMI(arraye,arraym,arrayme,nBins,xMin,xMax,param,kFALSE);
3899 }
3900 else return -4.0;
55a288e5 3901 }
3a0f6479 3902
3903 if(fDebugLevel == 1){
3904 TString name("PRF");
3905 name += (Int_t)xMin;
3906 name += (Int_t)xMax;
3907 TCanvas *c1 = new TCanvas((const char *)name,(const char *)name,50,50,600,800);
3908 c1->cd();
3909 name += "histo";
3910 TH1F *histo = new TH1F((const char *)name,(const char *)name,nBins,xMin,xMax);
3911 for(Int_t k = 0; k < nBins; k++){
3912 histo->SetBinContent(k+1,arraym[k]);
3913 histo->SetBinError(k+1,arrayme[k]);
3914 }
3915 histo->Draw();
3916 name += "functionf";
3917 TF1 *f1= new TF1((const char*)name,"[0]*exp(-(x-[1])^2/(2*[2]*[2]))",xMin,xMax);
3918 f1->SetParameter(0, (*param)[0]);
3919 f1->SetParameter(1, (*param)[1]);
3920 f1->SetParameter(2, (*param)[2]);
3921 f1->Draw("same");
3922 }
3923
3924
3925 return chi2;
3926
3927}
3928//_____________________________________________________________________________
3929void AliTRDCalibraFit::FitPRF(TH1 *projPRF)
3930{
3931 //
3932 // Fit methode for the sigma of the pad response function
3933 //
55a288e5 3934
3a0f6479 3935 fCurrentCoef[0] = 0.0;
3936 fCurrentCoefE = 0.0;
3937
3938 if (fDebugLevel != 1) {
3939 projPRF->Fit("gaus","0M","",-fRangeFitPRF,fRangeFitPRF);
3940 }
3941 else {
55a288e5 3942 TCanvas *cfit = new TCanvas("cfit","cfit",50,50,600,800);
3943 cfit->cd();
3944 projPRF->Fit("gaus","M+","",-fRangeFitPRF,fRangeFitPRF);
3945 projPRF->Draw();
55a288e5 3946 }
3a0f6479 3947 fCurrentCoef[0] = projPRF->GetFunction("gaus")->GetParameter(2);
3948 fCurrentCoefE = projPRF->GetFunction("gaus")->GetParError(2);
3949 if(fCurrentCoef[0] <= 0.0) fCurrentCoef[0] = -fCurrentCoef[1];
55a288e5 3950 else {
3a0f6479 3951 fNumberFitSuccess++;
55a288e5 3952 }
3a0f6479 3953}
3954//_____________________________________________________________________________
3955void AliTRDCalibraFit::RmsPRF(TH1 *projPRF)
3956{
3957 //
3958 // Fit methode for the sigma of the pad response function
3959 //
3960 fCurrentCoef[0] = 0.0;
3961 fCurrentCoefE = 0.0;
3962 if (fDebugLevel == 1) {
3963 TCanvas *cfit = new TCanvas("cfit","cfit",50,50,600,800);
3964 cfit->cd();
3965 projPRF->Draw();
55a288e5 3966 }
3a0f6479 3967 fCurrentCoef[0] = projPRF->GetRMS();
3968 if(fCurrentCoef[0] <= 0.0) fCurrentCoef[0] = -fCurrentCoef[1];
3969 else {
3970 fNumberFitSuccess++;
55a288e5 3971 }
55a288e5 3972}
55a288e5 3973//_____________________________________________________________________________
3a0f6479 3974void AliTRDCalibraFit::FitTnpRange(Double_t *arraye, Double_t *arraym, Double_t *arrayme, Int_t nbg, Int_t nybins)
55a288e5 3975{
3976 //
3a0f6479 3977 // Fit methode for the sigma of the pad response function with 2*nbg tan bins
55a288e5 3978 //
3979
3a0f6479 3980 TLinearFitter linearfitter = TLinearFitter(3,"pol2");
55a288e5 3981
55a288e5 3982
3a0f6479 3983 Int_t nbins = (Int_t)(nybins/(2*nbg));
3984 Float_t lowedge = -3.0*nbg;
3985 Float_t upedge = lowedge + 3.0;
3986 Int_t offset = 0;
3987 Int_t npoints = 0;
3988 Double_t xvalues = -0.2*nbg+0.1;
3989 Double_t y = 0.0;
3990 Int_t total = 2*nbg;
55a288e5 3991
3a0f6479 3992
3993 for(Int_t k = 0; k < total; k++){
3994 if(FitPRFGausMI(arraye+offset, arraym+offset, arrayme+offset, nbins, lowedge, upedge)){
3995 npoints++;
3996 y = fCurrentCoef[0]*fCurrentCoef[0];
3997 linearfitter.AddPoint(&xvalues,y,2*fCurrentCoefE*fCurrentCoef[0]);
3998 }
3999
4000 if(fDebugLevel > 1){
4001
4002 if ( !fDebugStreamer ) {
4003 //debug stream
4004 TDirectory *backup = gDirectory;
4005 fDebugStreamer = new TTreeSRedirector("TRDDebugFit.root");
4006 if ( backup ) backup->cd(); //we don't want to be cd'd to the debug streamer
4007 }
4008
4009 Int_t detector = fCountDet;
4010 Int_t plane = GetPlane(fCountDet);
4011 Int_t nbtotal = total;
4012 Int_t group = k;
4013 Float_t low = lowedge;
4014 Float_t up = upedge;
4015 Float_t tnp = xvalues;
4016 Float_t wid = fCurrentCoef[0];
4017 Float_t widfE = fCurrentCoefE;
4018
4019 (* fDebugStreamer) << "FitTnpRangeFill"<<
4020 "detector="<<detector<<
4021 "plane="<<plane<<
4022 "nbtotal="<<nbtotal<<
4023 "group="<<group<<
4024 "low="<<low<<
4025 "up="<<up<<
4026 "offset="<<offset<<
4027 "tnp="<<tnp<<
4028 "wid="<<wid<<
4029 "widfE="<<widfE<<
4030 "\n";
4031 }
4032
4033 offset += nbins;
4034 lowedge += 3.0;
4035 upedge += 3.0;
4036 xvalues += 0.2;
4037
4038 }
4039
4040 fCurrentCoefE = 0.0;
4041 fCurrentCoef[0] = 0.0;
4042
4043 //printf("npoints\n",npoints);
4044
4045 if(npoints < 3){
4046 fCurrentCoef[0] = -TMath::Abs(fCurrentCoef[1]);
4047 }
4048 else{
4049
4050 TVectorD pars0;
4051 linearfitter.Eval();
4052 linearfitter.GetParameters(pars0);
4053 Double_t pointError0 = TMath::Sqrt(linearfitter.GetChisquare()/npoints);
4054 Double_t errorsx0 = linearfitter.GetParError(2)*pointError0;
4055 Double_t min0 = 0.0;
4056 Double_t ermin0 = 0.0;
4057 //Double_t prfe0 = 0.0;
4058 Double_t prf0 = 0.0;
4059 if((pars0[2] > 0.0) && (pars0[1] != 0.0)) {
4060 min0 = -pars0[1]/(2*pars0[2]);
4061 ermin0 = TMath::Abs(min0*(errorsx0/pars0[2]+linearfitter.GetParError(1)*pointError0/pars0[1]));
4062 prf0 = pars0[0]+pars0[1]*min0+pars0[2]*min0*min0;
4063 if(prf0 > 0.0) {
4064 /*
4065 prfe0 = linearfitter->GetParError(0)*pointError0
4066 +(linearfitter->GetParError(1)*pointError0/pars0[1]+ermin0/min0)*pars0[1]*min0
4067 +(linearfitter->GetParError(2)*pointError0/pars0[2]+2*ermin0/min0)*pars0[2]*min0*min0;
4068 prfe0 = prfe0/(2*TMath::Sqrt(prf0));
4069 fCurrentCoefE = (Float_t) prfe0;
4070 */
4071 fCurrentCoef[0] = (Float_t) TMath::Sqrt(TMath::Abs(prf0));
4072 }
4073 else{
4074 fCurrentCoef[0] = -TMath::Abs(fCurrentCoef[1]);
4075 }
4076 }
4077 else {
4078 fCurrentCoef[0] = -TMath::Abs(fCurrentCoef[1]);
4079 }
55a288e5 4080
3a0f6479 4081 if(fDebugLevel > 1){
4082
4083 if ( !fDebugStreamer ) {
4084 //debug stream
4085 TDirectory *backup = gDirectory;
4086 fDebugStreamer = new TTreeSRedirector("TRDDebugFit.root");
4087 if ( backup ) backup->cd(); //we don't want to be cd'd to the debug streamer
4088 }
4089
4090 Int_t detector = fCountDet;
4091 Int_t plane = GetPlane(fCountDet);
4092 Int_t nbtotal = total;
4093 Double_t colsize[6] = {0.635,0.665,0.695,0.725,0.755,0.785};
4094 Double_t sigmax = TMath::Sqrt(TMath::Abs(pars0[2]))*10000*colsize[plane];
4095
4096 (* fDebugStreamer) << "FitTnpRangeFit"<<
4097 "detector="<<detector<<
4098 "plane="<<plane<<
4099 "nbtotal="<<nbtotal<<
4100 "par0="<<pars0[0]<<
4101 "par1="<<pars0[1]<<
4102 "par2="<<pars0[2]<<
4103 "npoints="<<npoints<<
4104 "sigmax="<<sigmax<<
4105 "tan="<<min0<<
4106 "sigmaprf="<<fCurrentCoef[0]<<
4107 "sigprf="<<fCurrentCoef[1]<<
4108 "\n";
4109 }
4110
55a288e5 4111 }
4112
4113}
55a288e5 4114//_____________________________________________________________________________
3a0f6479 4115void AliTRDCalibraFit::FitMean(TH1 *projch, Double_t nentries, Double_t mean)
55a288e5 4116{
4117 //
4118 // Only mean methode for the gain factor
4119 //
4120
3a0f6479 4121 fCurrentCoef[0] = mean;
4122 fCurrentCoefE = 0.0;
4123 if(nentries > 0) fCurrentCoefE = projch->GetRMS()/TMath::Sqrt(nentries);
4124 if (fDebugLevel == 1) {
55a288e5 4125 TCanvas *cpmean = new TCanvas("cpmean","cpmean",50,50,600,800);
4126 cpmean->cd();
4127 projch->Draw();
4128 }
3a0f6479 4129 CalculChargeCoefMean(kTRUE);
4130 fNumberFitSuccess++;
55a288e5 4131}
55a288e5 4132//_____________________________________________________________________________
3a0f6479 4133void AliTRDCalibraFit::FitMeanW(TH1 *projch, Double_t nentries)
55a288e5 4134{
4135 //
4136 // mean w methode for the gain factor
4137 //
4138
4139 //Number of bins
4140 Int_t nybins = projch->GetNbinsX();
4141
4142 //The weight function
4143 Double_t a = 0.00228515;
4144 Double_t b = -0.00231487;
4145 Double_t c = 0.00044298;
4146 Double_t d = -0.00379239;
4147 Double_t e = 0.00338349;
4148
3a0f6479 4149// 0 |0.00228515
4150// 1 |-0.00231487
4151// 2 |0.00044298
4152// 3 |-0.00379239
4153// 4 |0.00338349
4154
4155
55a288e5 4156
4157 //A arbitrary error for the moment
3a0f6479 4158 fCurrentCoefE = 0.0;
4159 fCurrentCoef[0] = 0.0;
55a288e5 4160
4161 //Calcul
4162 Double_t sumw = 0.0;
4163 Double_t sum = 0.0;
3a0f6479 4164 Float_t sumAll = (Float_t) nentries;
55a288e5 4165 Int_t sumCurrent = 0;
4166 for(Int_t k = 0; k <nybins; k++){
4167 Double_t fraction = Float_t(sumCurrent)/Float_t(sumAll);
4168 if (fraction>0.95) break;
4169 Double_t weight = a + b*fraction + c*fraction*fraction + d *fraction*fraction*fraction+
4170 e*fraction*fraction*fraction*fraction;
4171 sumw += weight*projch->GetBinContent(k+1)*projch->GetBinCenter(k+1);
4172 sum += weight*projch->GetBinContent(k+1);
4173 sumCurrent += (Int_t) projch->GetBinContent(k+1);
4174 //printf("fraction %f, weight %f, bincontent %f\n",fraction,weight,projch->GetBinContent(k+1));
4175 }
3a0f6479 4176 if(sum > 0.0) fCurrentCoef[0] = (sumw/sum);
55a288e5 4177
3a0f6479 4178 if (fDebugLevel == 1) {
55a288e5 4179 TCanvas *cpmeanw = new TCanvas("cpmeanw","cpmeanw",50,50,600,800);
4180 cpmeanw->cd();
4181 projch->Draw();
4182 }
3a0f6479 4183 fNumberFitSuccess++;
4184 CalculChargeCoefMean(kTRUE);
4185}
4186//_____________________________________________________________________________
4187void AliTRDCalibraFit::FitMeanWSm(TH1 *projch, Float_t sumAll)
4188{
4189 //
4190 // mean w methode for the gain factor
4191 //
4192
4193 //Number of bins
4194 Int_t nybins = projch->GetNbinsX();
4195
4196 //The weight function
4197 Double_t a = 0.00228515;
4198 Double_t b = -0.00231487;
4199 Double_t c = 0.00044298;
4200 Double_t d = -0.00379239;
4201 Double_t e = 0.00338349;
4202
4203// 0 |0.00228515
4204// 1 |-0.00231487
4205// 2 |0.00044298
4206// 3 |-0.00379239
4207// 4 |0.00338349
4208
4209
4210
4211 //A arbitrary error for the moment
4212 fCurrentCoefE = 0.0;
4213 fCurrentCoef[0] = 0.0;
55a288e5 4214
3a0f6479 4215 //Calcul
4216 Double_t sumw = 0.0;
4217 Double_t sum = 0.0;
4218 Int_t sumCurrent = 0;
4219 for(Int_t k = 0; k <nybins; k++){
4220 Double_t fraction = Float_t(sumCurrent)/Float_t(sumAll);
4221 if (fraction>0.95) break;
4222 Double_t weight = a + b*fraction + c*fraction*fraction + d *fraction*fraction*fraction+
4223 e*fraction*fraction*fraction*fraction;
4224 sumw += weight*projch->GetBinContent(k+1)*projch->GetBinCenter(k+1);
4225 sum += weight*projch->GetBinContent(k+1);
4226 sumCurrent += (Int_t) projch->GetBinContent(k+1);
4227 //printf("fraction %f, weight %f, bincontent %f\n",fraction,weight,projch->GetBinContent(k+1));
55a288e5 4228 }
3a0f6479 4229 if(sum > 0.0) fCurrentCoef[0] = (sumw/sum);
55a288e5 4230
3a0f6479 4231 if (fDebugLevel == 1) {
4232 TCanvas *cpmeanw = new TCanvas("cpmeanw","cpmeanw",50,50,600,800);
4233 cpmeanw->cd();
4234 projch->Draw();
4235 }
4236 fNumberFitSuccess++;
55a288e5 4237}
55a288e5 4238//_____________________________________________________________________________
3a0f6479 4239void AliTRDCalibraFit::FitCH(TH1 *projch, Double_t mean)
55a288e5 4240{
4241 //
4242 // Fit methode for the gain factor
4243 //
4244
3a0f6479 4245 fCurrentCoef[0] = 0.0;
4246 fCurrentCoefE = 0.0;
55a288e5 4247 Double_t chisqrl = 0.0;
4248 Double_t chisqrg = 0.0;
3a0f6479 4249 Double_t chisqr = 0.0;
55a288e5 4250 TF1 *fLandauGaus = new TF1("fLandauGaus",FuncLandauGaus,0,300,5);
4251
4252 projch->Fit("landau","0",""
3a0f6479 4253 ,(Double_t) mean/fBeginFitCharge
55a288e5 4254 ,projch->GetBinCenter(projch->GetNbinsX()));
4255 Double_t l3P0 = projch->GetFunction("landau")->GetParameter(0);
4256 Double_t l3P1 = projch->GetFunction("landau")->GetParameter(1);
4257 Double_t l3P2 = projch->GetFunction("landau")->GetParameter(2);
4258 chisqrl = projch->GetFunction("landau")->GetChisquare();
4259
4260 projch->Fit("gaus","0",""
3a0f6479 4261 ,(Double_t) mean/fBeginFitCharge
55a288e5 4262 ,projch->GetBinCenter(projch->GetNbinsX()));
4263 Double_t g3P0 = projch->GetFunction("gaus")->GetParameter(0);
4264 Double_t g3P2 = projch->GetFunction("gaus")->GetParameter(2);
4265 chisqrg = projch->GetFunction("gaus")->GetChisquare();
4266
4267 fLandauGaus->SetParameters(l3P0,l3P1,l3P2,g3P0,g3P2);
3a0f6479 4268 if (fDebugLevel != 1) {
55a288e5 4269 projch->Fit("fLandauGaus","0",""
3a0f6479 4270 ,(Double_t) mean/fBeginFitCharge
55a288e5 4271 ,projch->GetBinCenter(projch->GetNbinsX()));
4272 chisqr = projch->GetFunction("fLandauGaus")->GetChisquare();
3a0f6479 4273 }
4274 else {
55a288e5 4275 TCanvas *cp = new TCanvas("cp","cp",50,50,600,800);
4276 cp->cd();
4277 projch->Fit("fLandauGaus","+",""
3a0f6479 4278 ,(Double_t) mean/fBeginFitCharge
55a288e5 4279 ,projch->GetBinCenter(projch->GetNbinsX()));
4280 chisqr = projch->GetFunction("fLandauGaus")->GetChisquare();
4281 projch->Draw();
4282 fLandauGaus->Draw("same");
4283 }
4284
3a0f6479 4285 if ((projch->GetFunction("fLandauGaus")->GetParameter(1) > 0) && (projch->GetFunction("fLandauGaus")->GetParError(1) < (0.05*projch->GetFunction("fLandauGaus")->GetParameter(1))) && (chisqr < chisqrl) && (chisqr < chisqrg)) {
4286 //if ((projch->GetFunction("fLandauGaus")->GetParameter(1) > 0) && (chisqr < chisqrl) && (chisqr < chisqrg)) {
4287 fNumberFitSuccess++;
4288 CalculChargeCoefMean(kTRUE);
4289 fCurrentCoef[0] = projch->GetFunction("fLandauGaus")->GetParameter(1);
4290 fCurrentCoefE = projch->GetFunction("fLandauGaus")->GetParError(1);
55a288e5 4291 }
4292 else {
3a0f6479 4293 CalculChargeCoefMean(kFALSE);
4294 fCurrentCoef[0] = -TMath::Abs(fCurrentCoef[1]);
55a288e5 4295 }
4296
3a0f6479 4297 if (fDebugLevel != 1) {
55a288e5 4298 delete fLandauGaus;
4299 }
4300
4301}
55a288e5 4302//_____________________________________________________________________________
3a0f6479 4303void AliTRDCalibraFit::FitBisCH(TH1* projch, Double_t mean)
55a288e5 4304{
4305 //
4306 // Fit methode for the gain factor more time consuming
4307 //
4308
3a0f6479 4309
55a288e5 4310 //Some parameters to initialise
4311 Double_t widthLandau, widthGaus, MPV, Integral;
4312 Double_t chisquarel = 0.0;
4313 Double_t chisquareg = 0.0;
55a288e5 4314 projch->Fit("landau","0M+",""
3a0f6479 4315 ,(Double_t) mean/6
55a288e5 4316 ,projch->GetBinCenter(projch->GetNbinsX()));
4317 widthLandau = projch->GetFunction("landau")->GetParameter(2);
4318 chisquarel = projch->GetFunction("landau")->GetChisquare();
55a288e5 4319 projch->Fit("gaus","0M+",""
3a0f6479 4320 ,(Double_t) mean/6
55a288e5 4321 ,projch->GetBinCenter(projch->GetNbinsX()));
4322 widthGaus = projch->GetFunction("gaus")->GetParameter(2);
4323 chisquareg = projch->GetFunction("gaus")->GetChisquare();
3a0f6479 4324
4325 MPV = (projch->GetFunction("landau")->GetParameter(1))/2;
4326 Integral = (projch->GetFunction("gaus")->Integral(0.3*mean,3*mean)+projch->GetFunction("landau")->Integral(0.3*mean,3*mean))/2;
4327
55a288e5 4328 // Setting fit range and start values
4329 Double_t fr[2];
4330 //Double_t sv[4] = { l3P2, fChargeCoef[1], projch->Integral("width"), fG3P2 };
4331 //Double_t sv[4] = { fL3P2, fChargeCoef[1], fL3P0, fG3P2 };
4332 Double_t sv[4] = { widthLandau, MPV, Integral, widthGaus};
4333 Double_t pllo[4] = { 0.001, 0.001, projch->Integral()/3, 0.001};
4334 Double_t plhi[4] = { 300.0, 300.0, 30*projch->Integral(), 300.0};
4335 Double_t fp[4] = { 1.0, 1.0, 1.0, 1.0 };
4336 Double_t fpe[4] = { 1.0, 1.0, 1.0, 1.0 };
3a0f6479 4337 fr[0] = 0.3 * mean;
4338 fr[1] = 3.0 * mean;
4339 fCurrentCoef[0] = 0.0;
4340 fCurrentCoefE = 0.0;
55a288e5 4341
4342 Double_t chisqr;
4343 Int_t ndf;
4344 TF1 *fitsnr = LanGauFit(projch,&fr[0],&sv[0]
4345 ,&pllo[0],&plhi[0]
4346 ,&fp[0],&fpe[0]
4347 ,&chisqr,&ndf);
4348
4349 Double_t projchPeak;
4350 Double_t projchFWHM;
4351 LanGauPro(fp,projchPeak,projchFWHM);
4352
4353 if ((fp[1] > 0) && ((fpe[1] < (0.05*fp[1])) && (chisqr < chisquarel) && (chisqr < chisquareg))) {
4354 //if ((fp[1] > 0) && ((chisqr < chisquarel) && (chisqr < chisquareg))) {
3a0f6479 4355 fNumberFitSuccess++;
4356 CalculChargeCoefMean(kTRUE);
4357 fCurrentCoef[0] = fp[1];
4358 fCurrentCoefE = fpe[1];
55a288e5 4359 //chargeCoefE2 = chisqr;
4360 }
4361 else {
3a0f6479 4362 CalculChargeCoefMean(kFALSE);
4363 fCurrentCoef[0] = -TMath::Abs(fCurrentCoef[1]);
55a288e5 4364 }
3a0f6479 4365 if (fDebugLevel == 1) {
4366 AliInfo(Form("fChargeCoef[0]: %f",(Float_t) fCurrentCoef[0]));
55a288e5 4367 TCanvas *cpy = new TCanvas("cpy","cpy",50,50,600,800);
4368 cpy->cd();
4369 projch->Draw();
4370 fitsnr->Draw("same");
4371 }
3a0f6479 4372 else {
55a288e5 4373 delete fitsnr;
4374 }
3a0f6479 4375}
55a288e5 4376//_____________________________________________________________________________
4377Double_t *AliTRDCalibraFit::CalculPolynomeLagrange2(Double_t *x, Double_t *y)
4378{
4379 //
4380 // Calcul the coefficients of the polynome passant par ces trois points de degre 2
4381 //
3a0f6479 4382 Double_t *c = new Double_t[5];
55a288e5 4383 Double_t x0 = y[0]/((x[0]-x[1])*(x[0]-x[2]));
4384 Double_t x1 = y[1]/((x[1]-x[0])*(x[1]-x[2]));
4385 Double_t x2 = y[2]/((x[2]-x[0])*(x[2]-x[1]));
4386
4387 c[4] = 0.0;
4388 c[3] = 0.0;
4389 c[2] = x0+x1+x2;
4390 c[1] = -(x0*(x[1]+x[2])+x1*(x[0]+x[2])+x2*(x[0]+x[1]));
4391 c[0] = x0*x[1]*x[2]+x1*x[0]*x[2]+x2*x[0]*x[1];
4392
4393 return c;
4394
3a0f6479 4395
55a288e5 4396}
4397
4398//_____________________________________________________________________________
4399Double_t *AliTRDCalibraFit::CalculPolynomeLagrange3(Double_t *x, Double_t *y)
4400{
4401 //
4402 // Calcul the coefficients of the polynome passant par ces quatre points de degre 3
4403 //
55a288e5 4404 Double_t *c = new Double_t[5];
4405 Double_t x0 = y[0]/((x[0]-x[1])*(x[0]-x[2])*(x[0]-x[3]));
4406 Double_t x1 = y[1]/((x[1]-x[0])*(x[1]-x[2])*(x[1]-x[3]));
4407 Double_t x2 = y[2]/((x[2]-x[0])*(x[2]-x[1])*(x[2]-x[3]));
4408 Double_t x3 = y[3]/((x[3]-x[0])*(x[3]-x[1])*(x[3]-x[2]));
4409
4410 c[4] = 0.0;
4411 c[3] = x0+x1+x2+x3;
4412 c[2] = -(x0*(x[1]+x[2]+x[3])
4413 +x1*(x[0]+x[2]+x[3])
4414 +x2*(x[0]+x[1]+x[3])
4415 +x3*(x[0]+x[1]+x[2]));
4416 c[1] = (x0*(x[1]*x[2]+x[1]*x[3]+x[2]*x[3])
4417 +x1*(x[0]*x[2]+x[0]*x[3]+x[2]*x[3])
4418 +x2*(x[0]*x[1]+x[0]*x[3]+x[1]*x[3])
4419 +x3*(x[0]*x[1]+x[0]*x[2]+x[1]*x[2]));
4420
4421 c[0] = -(x0*x[1]*x[2]*x[3]
4422 +x1*x[0]*x[2]*x[3]
4423 +x2*x[0]*x[1]*x[3]
4424 +x3*x[0]*x[1]*x[2]);
4425
3a0f6479 4426
55a288e5 4427 return c;
3a0f6479 4428
55a288e5 4429
4430}
4431
4432//_____________________________________________________________________________
4433Double_t *AliTRDCalibraFit::CalculPolynomeLagrange4(Double_t *x, Double_t *y)
4434{
4435 //
4436 // Calcul the coefficients of the polynome passant par ces cinqs points de degre 4
4437 //
55a288e5 4438 Double_t *c = new Double_t[5];
4439 Double_t x0 = y[0]/((x[0]-x[1])*(x[0]-x[2])*(x[0]-x[3])*(x[0]-x[4]));
4440 Double_t x1 = y[1]/((x[1]-x[0])*(x[1]-x[2])*(x[1]-x[3])*(x[1]-x[4]));
4441 Double_t x2 = y[2]/((x[2]-x[0])*(x[2]-x[1])*(x[2]-x[3])*(x[2]-x[4]));
4442 Double_t x3 = y[3]/((x[3]-x[0])*(x[3]-x[1])*(x[3]-x[2])*(x[3]-x[4]));
4443 Double_t x4 = y[4]/((x[4]-x[0])*(x[4]-x[1])*(x[4]-x[2])*(x[4]-x[3]));
3a0f6479 4444
55a288e5 4445
4446 c[4] = x0+x1+x2+x3+x4;
4447 c[3] = -(x0*(x[1]+x[2]+x[3]+x[4])
4448 +x1*(x[0]+x[2]+x[3]+x[4])
4449 +x2*(x[0]+x[1]+x[3]+x[4])
4450 +x3*(x[0]+x[1]+x[2]+x[4])
4451 +x4*(x[0]+x[1]+x[2]+x[3]));
4452 c[2] = (x0*(x[1]*x[2]+x[1]*x[3]+x[1]*x[4]+x[2]*x[3]+x[2]*x[4]+x[3]*x[4])
4453 +x1*(x[0]*x[2]+x[0]*x[3]+x[0]*x[4]+x[2]*x[3]+x[2]*x[4]+x[3]*x[4])
4454 +x2*(x[0]*x[1]+x[0]*x[3]+x[0]*x[4]+x[1]*x[3]+x[1]*x[4]+x[3]*x[4])
4455 +x3*(x[0]*x[1]+x[0]*x[2]+x[0]*x[4]+x[1]*x[2]+x[1]*x[4]+x[2]*x[4])
4456 +x4*(x[0]*x[1]+x[0]*x[2]+x[0]*x[3]+x[1]*x[2]+x[1]*x[3]+x[2]*x[3]));
4457
4458 c[1] = -(x0*(x[1]*x[2]*x[3]+x[1]*x[2]*x[4]+x[1]*x[3]*x[4]+x[2]*x[3]*x[4])
4459 +x1*(x[0]*x[2]*x[3]+x[0]*x[2]*x[4]+x[0]*x[3]*x[4]+x[2]*x[3]*x[4])
4460 +x2*(x[0]*x[1]*x[3]+x[0]*x[1]*x[4]+x[0]*x[3]*x[4]+x[1]*x[3]*x[4])
4461 +x3*(x[0]*x[1]*x[2]+x[0]*x[1]*x[4]+x[0]*x[2]*x[4]+x[1]*x[2]*x[4])
4462 +x4*(x[0]*x[1]*x[2]+x[0]*x[1]*x[3]+x[0]*x[2]*x[3]+x[1]*x[2]*x[3]));
4463
4464 c[0] = (x0*x[1]*x[2]*x[3]*x[4]
4465 +x1*x[0]*x[2]*x[3]*x[4]
4466 +x2*x[0]*x[1]*x[3]*x[4]
4467 +x3*x[0]*x[1]*x[2]*x[4]
4468 +x4*x[0]*x[1]*x[2]*x[3]);
4469
4470 return c;
3a0f6479 4471
55a288e5 4472
4473}
55a288e5 4474//_____________________________________________________________________________
4475void AliTRDCalibraFit::NormierungCharge()
4476{
4477 //
4478 // Normalisation of the gain factor resulting for the fits
4479 //
4480
4481 // Calcul of the mean of choosen method by fFitChargeNDB
4482 Double_t sum = 0.0;
4483 //printf("total number of entries %d\n",fVectorFitCH->GetEntriesFast());
3a0f6479 4484 for (Int_t k = 0; k < (Int_t) fVectorFit.GetEntriesFast(); k++) {
55a288e5 4485 Int_t total = 0;
3a0f6479 4486 Int_t detector = ((AliTRDFitInfo *) fVectorFit.At(k))->GetDetector();
4487 Float_t *coef = ((AliTRDFitInfo *) fVectorFit.At(k))->GetCoef();
55a288e5 4488 //printf("detector %d coef[0] %f\n",detector,coef[0]);
4489 if (GetChamber(detector) == 2) {
4490 total = 1728;
4491 }
4492 if (GetChamber(detector) != 2) {
4493 total = 2304;
4494 }
4495 for (Int_t j = 0; j < total; j++) {
4496 if (coef[j] >= 0) {
4497 sum += coef[j];
4498 }
4499 }
4500 }
4501
4502 if (sum > 0) {
4503 fScaleFitFactor = fScaleFitFactor / sum;
4504 }
4505 else {
4506 fScaleFitFactor = 1.0;
3a0f6479 4507 }
55a288e5 4508
3a0f6479 4509 //methode de boeuf mais bon...
4510 Double_t scalefactor = fScaleFitFactor;
55a288e5 4511
3a0f6479 4512 if(fDebugLevel > 1){
4513
4514 if ( !fDebugStreamer ) {
4515 //debug stream
4516 TDirectory *backup = gDirectory;
4517 fDebugStreamer = new TTreeSRedirector("TRDDebugFit.root");
4518 if ( backup ) backup->cd(); //we don't want to be cd'd to the debug streamer
4519 }
4520 (* fDebugStreamer) << "ScaleFactor"<<
4521 "scalefactor="<<scalefactor<<
4522 "\n";
4523 }
55a288e5 4524}
55a288e5 4525//_____________________________________________________________________________
4526TH1I *AliTRDCalibraFit::ReBin(TH1I *hist) const
4527{
4528 //
4529 // Rebin of the 1D histo for the gain calibration if needed.
4530 // you have to choose fRebin, divider of fNumberBinCharge
4531 //
4532
3a0f6479 4533 TAxis *xhist = hist->GetXaxis();
4534 TH1I *rehist = new TH1I("projrebin","",(Int_t) xhist->GetNbins()/fRebin
4535 ,xhist->GetBinLowEdge(1)
4536 ,xhist->GetBinUpEdge(xhist->GetNbins()));
55a288e5 4537
3a0f6479 4538 AliInfo(Form("fRebin: %d",fRebin));
4539 Int_t i = 1;
4540 for (Int_t k = 1; k <= (Int_t) xhist->GetNbins()/fRebin; k++) {
4541 Double_t sum = 0.0;
4542 for (Int_t ji = i; ji < i+fRebin; ji++) {
4543 sum += hist->GetBinContent(ji);
4544 }
4545 sum = sum / fRebin;
4546 rehist->SetBinContent(k,sum);
4547 i += fRebin;
4548 }
55a288e5 4549
3a0f6479 4550 return rehist;
55a288e5 4551
4552}
4553
4554//_____________________________________________________________________________
4555TH1F *AliTRDCalibraFit::ReBin(TH1F *hist) const
4556{
4557 //
4558 // Rebin of the 1D histo for the gain calibration if needed
4559 // you have to choose fRebin divider of fNumberBinCharge
4560 //
4561
4562 TAxis *xhist = hist->GetXaxis();
4563 TH1F *rehist = new TH1F("projrebin","",(Int_t) xhist->GetNbins()/fRebin
4564 ,xhist->GetBinLowEdge(1)
4565 ,xhist->GetBinUpEdge(xhist->GetNbins()));
4566
4567 AliInfo(Form("fRebin: %d",fRebin));
4568 Int_t i = 1;
4569 for (Int_t k = 1; k <= (Int_t) xhist->GetNbins()/fRebin; k++) {
4570 Double_t sum = 0.0;
4571 for (Int_t ji = i; ji < i+fRebin; ji++) {
4572 sum += hist->GetBinContent(ji);
4573 }
4574 sum = sum/fRebin;
4575 rehist->SetBinContent(k,sum);
4576 i += fRebin;
4577 }
4578
55a288e5 4579 return rehist;
4580
4581}
4582
4583//_____________________________________________________________________________
4584TH1F *AliTRDCalibraFit::CorrectTheError(TGraphErrors *hist)
4585{
4586 //
4587 // In the case of the vectors method the trees contains TGraphErrors for PH and PRF
4588 // to be able to add them after
4589 // We convert it to a TH1F to be able to applied the same fit function method
4590 // After having called this function you can not add the statistics anymore
4591 //
4592
4593 TH1F *rehist = 0x0;
4594
3a0f6479 4595 Int_t nbins = hist->GetN();
55a288e5 4596 Double_t *x = hist->GetX();
4597 Double_t *entries = hist->GetEX();
4598 Double_t *mean = hist->GetY();
4599 Double_t *square = hist->GetEY();
4600 fEntriesCurrent = 0;
4601
4602 if (nbins < 2) {
4603 return rehist;
4604 }
4605
4606 Double_t step = x[1] - x[0];
4607 Double_t minvalue = x[0] - step/2;
4608 Double_t maxvalue = x[(nbins-1)] + step/2;
4609
4610 rehist = new TH1F("projcorrecterror","",nbins,minvalue,maxvalue);
4611
4612 for (Int_t k = 0; k < nbins; k++) {
4613 rehist->SetBinContent(k+1,mean[k]);
4614 if (entries[k] > 0.0) {
4615 fEntriesCurrent += (Int_t) entries[k];
4616 Double_t d = TMath::Abs(square[k] - (mean[k]*mean[k]));
4617 rehist->SetBinError(k+1,TMath::Sqrt(d/entries[k]));
4618 }
4619 else {
4620 rehist->SetBinError(k+1,0.0);
4621 }
4622 }
4623
3a0f6479 4624 if(fEntriesCurrent > 0) fNumberEnt++;
4625
55a288e5 4626 return rehist;
4627
4628}
55a288e5 4629//
4630//____________Some basic geometry function_____________________________________
4631//
4632
4633//_____________________________________________________________________________
4634Int_t AliTRDCalibraFit::GetPlane(Int_t d) const
4635{
4636 //
4637 // Reconstruct the plane number from the detector number
4638 //
4639
4640 return ((Int_t) (d % 6));
4641
4642}
4643
4644//_____________________________________________________________________________
4645Int_t AliTRDCalibraFit::GetChamber(Int_t d) const
4646{
4647 //
4648 // Reconstruct the chamber number from the detector number
4649 //
4650 Int_t fgkNplan = 6;
4651
4652 return ((Int_t) (d % 30) / fgkNplan);
4653
4654}
4655
4656//_____________________________________________________________________________
4657Int_t AliTRDCalibraFit::GetSector(Int_t d) const
4658{
4659 //
4660 // Reconstruct the sector number from the detector number
4661 //
4662 Int_t fg = 30;
4663
4664 return ((Int_t) (d / fg));
4665
4666}
4667
4668//
4669//____________Fill and Init tree Gain, PRF, Vdrift and T0______________________
4670//
3a0f6479 4671//_______________________________________________________________________________
4672void AliTRDCalibraFit::ResetVectorFit()
55a288e5 4673{
3a0f6479 4674 fVectorFit.SetOwner();
4675 fVectorFit.Clear();
4676 fVectorFit2.SetOwner();
4677 fVectorFit2.Clear();
55a288e5 4678
55a288e5 4679}
55a288e5 4680//
4681//____________Private Functions________________________________________________
4682//
4683
4684//_____________________________________________________________________________
4685Double_t AliTRDCalibraFit::PH(Double_t *x, Double_t *par)
4686{
4687 //
4688 // Function for the fit
4689 //
4690
4691 //TF1 *fAsymmGauss = new TF1("fAsymmGauss",AsymmGauss,0,4,6);
4692
4693 //PARAMETERS FOR FIT PH
4694 // PASAv.4
4695 //fAsymmGauss->SetParameter(0,0.113755);
4696 //fAsymmGauss->SetParameter(1,0.350706);
4697 //fAsymmGauss->SetParameter(2,0.0604244);
4698 //fAsymmGauss->SetParameter(3,7.65596);
4699 //fAsymmGauss->SetParameter(4,1.00124);
4700 //fAsymmGauss->SetParameter(5,0.870597); // No tail cancelation
4701
4702 Double_t xx = x[0];
4703
4704 if (xx < par[1]) {
4705 return par[5];
4706 }
4707
4708 Double_t dx = 0.005;
4709 Double_t xs = par[1];
4710 Double_t ss = 0.0;
4711 Double_t paras[2] = { 0.0, 0.0 };
4712
4713 while (xs < xx) {
4714 if ((xs >= par[1]) &&
4715 (xs < (par[1]+par[2]))) {
4716 //fAsymmGauss->SetParameter(0,par[0]);
4717 //fAsymmGauss->SetParameter(1,xs);
4718 //ss += fAsymmGauss->Eval(xx);
4719 paras[0] = par[0];
4720 paras[1] = xs;
4721 ss += AsymmGauss(&xx,paras);
4722 }
4723 if ((xs >= (par[1]+par[2])) &&
4724 (xs < (par[1]+par[2]+par[3]))) {
4725 //fAsymmGauss->SetParameter(0,par[0]*par[4]);
4726 //fAsymmGauss->SetParameter(1,xs);
4727 //ss += fAsymmGauss->Eval(xx);
4728 paras[0] = par[0]*par[4];
4729 paras[1] = xs;
4730 ss += AsymmGauss(&xx,paras);
4731 }
4732 xs += dx;
4733 }
4734
4735 return ss + par[5];
4736
4737}
4738
4739//_____________________________________________________________________________
4740Double_t AliTRDCalibraFit::AsymmGauss(Double_t *x, Double_t *par)
4741{
4742 //
4743 // Function for the fit
4744 //
4745
4746 //par[0] = normalization
4747 //par[1] = mean
4748 //par[2] = sigma
4749 //norm0 = 1
4750 //par[3] = lambda0
4751 //par[4] = norm1
4752 //par[5] = lambda1
4753
4754 Double_t par1save = par[1];
4755 //Double_t par2save = par[2];
4756 Double_t par2save = 0.0604244;
4757 //Double_t par3save = par[3];
4758 Double_t par3save = 7.65596;
4759 //Double_t par5save = par[5];
4760 Double_t par5save = 0.870597;
4761 Double_t dx = x[0] - par1save;
4762
4763 Double_t sigma2 = par2save*par2save;
4764 Double_t sqrt2 = TMath::Sqrt(2.0);
4765 Double_t exp1 = par3save * TMath::Exp(-par3save * (dx - 0.5 * par3save * sigma2))
4766 * (1.0 - TMath::Erf((par3save * sigma2 - dx) / (sqrt2 * par2save)));
4767 Double_t exp2 = par5save * TMath::Exp(-par5save * (dx - 0.5 * par5save * sigma2))
4768 * (1.0 - TMath::Erf((par5save * sigma2 - dx) / (sqrt2 * par2save)));
4769
4770 //return par[0]*(exp1+par[4]*exp2);
4771 return par[0] * (exp1 + 1.00124 * exp2);
4772
4773}
4774
4775//_____________________________________________________________________________
4776Double_t AliTRDCalibraFit::FuncLandauGaus(Double_t *x, Double_t *par)
4777{
4778 //
4779 // Sum Landau + Gaus with identical mean
4780 //
4781
4782 Double_t valLandau = par[0] * TMath::Landau(x[0],par[1],par[2]);
4783 //Double_t valGaus = par[3] * TMath::Gaus(x[0],par[4],par[5]);
4784 Double_t valGaus = par[3] * TMath::Gaus(x[0],par[1],par[4]);
4785 Double_t val = valLandau + valGaus;
4786
4787 return val;
4788
4789}
4790
4791//_____________________________________________________________________________
4792Double_t AliTRDCalibraFit::LanGauFun(Double_t *x, Double_t *par)
4793{
4794 //
4795 // Function for the fit
4796 //
4797 // Fit parameters:
4798 // par[0]=Width (scale) parameter of Landau density
4799 // par[1]=Most Probable (MP, location) parameter of Landau density
4800 // par[2]=Total area (integral -inf to inf, normalization constant)
4801 // par[3]=Width (sigma) of convoluted Gaussian function
4802 //
4803 // In the Landau distribution (represented by the CERNLIB approximation),
4804 // the maximum is located at x=-0.22278298 with the location parameter=0.
4805 // This shift is corrected within this function, so that the actual
4806 // maximum is identical to the MP parameter.
4807 //
4808
4809 // Numeric constants
4810 Double_t invsq2pi = 0.3989422804014; // (2 pi)^(-1/2)
4811 Double_t mpshift = -0.22278298; // Landau maximum location
4812
4813 // Control constants
4814 Double_t np = 100.0; // Number of convolution steps
4815 Double_t sc = 5.0; // Convolution extends to +-sc Gaussian sigmas
4816
4817 // Variables
4818 Double_t xx;
4819 Double_t mpc;
4820 Double_t fland;
4821 Double_t sum = 0.0;
4822 Double_t xlow;
4823 Double_t xupp;
4824 Double_t step;
4825 Double_t i;
4826
4827 // MP shift correction
4828 mpc = par[1] - mpshift * par[0];
4829
4830 // Range of convolution integral
4831 xlow = x[0] - sc * par[3];
4832 xupp = x[0] + sc * par[3];
4833
4834 step = (xupp - xlow) / np;
4835
4836 // Convolution integral of Landau and Gaussian by sum
4837 for (i = 1.0; i <= np/2; i++) {
4838
4839 xx = xlow + (i-.5) * step;
4840 fland = TMath::Landau(xx,mpc,par[0]) / par[0];
4841 sum += fland * TMath::Gaus(x[0],xx,par[3]);
4842
4843 xx = xupp - (i-.5) * step;
4844 fland = TMath::Landau(xx,mpc,par[0]) / par[0];
4845 sum += fland * TMath::Gaus(x[0],xx,par[3]);
4846
4847 }
4848
4849 return (par[2] * step * sum * invsq2pi / par[3]);
4850
4851}
55a288e5 4852//_____________________________________________________________________________
4853TF1 *AliTRDCalibraFit::LanGauFit(TH1 *his, Double_t *fitrange, Double_t *startvalues
4854 , Double_t *parlimitslo, Double_t *parlimitshi
4855 , Double_t *fitparams, Double_t *fiterrors
4856 , Double_t *chiSqr, Int_t *ndf)
4857{
4858 //
4859 // Function for the fit
4860 //
4861
4862 Int_t i;
4863 Char_t funname[100];
4864
4865 TF1 *ffitold = (TF1 *) gROOT->GetListOfFunctions()->FindObject(funname);
4866 if (ffitold) {
4867 delete ffitold;
4868 }
4869
4870 TF1 *ffit = new TF1(funname,LanGauFun,fitrange[0],fitrange[1],4);
4871 ffit->SetParameters(startvalues);
4872 ffit->SetParNames("Width","MP","Area","GSigma");
4873
4874 for (i = 0; i < 4; i++) {
4875 ffit->SetParLimits(i,parlimitslo[i],parlimitshi[i]);
4876 }
4877
4878 his->Fit(funname,"RB0"); // Fit within specified range, use ParLimits, do not plot
4879
4880 ffit->GetParameters(fitparams); // Obtain fit parameters
4881 for (i = 0; i < 4; i++) {
4882 fiterrors[i] = ffit->GetParError(i); // Obtain fit parameter errors
4883 }
4884 chiSqr[0] = ffit->GetChisquare(); // Obtain chi^2
4885 ndf[0] = ffit->GetNDF(); // Obtain ndf
4886
4887 return (ffit); // Return fit function
4888
4889}
4890
4891//_____________________________________________________________________________
4892Int_t AliTRDCalibraFit::LanGauPro(Double_t *params, Double_t &maxx, Double_t &fwhm)
4893{
4894 //
4895 // Function for the fit
4896 //
4897
4898 Double_t p;
4899 Double_t x;
4900 Double_t fy;
4901 Double_t fxr;
4902 Double_t fxl;
4903 Double_t step;
4904 Double_t l;
4905 Double_t lold;
4906
4907 Int_t i = 0;
4908 Int_t maxcalls = 10000;
4909
4910 // Search for maximum
4911 p = params[1] - 0.1 * params[0];
4912 step = 0.05 * params[0];
4913 lold = -2.0;
4914 l = -1.0;
4915
4916 while ((l != lold) && (i < maxcalls)) {
4917 i++;
4918 lold = l;
4919 x = p + step;
4920 l = LanGauFun(&x,params);
4921 if (l < lold) {
4922 step = -step / 10.0;
4923 }
4924 p += step;
4925 }
4926
4927 if (i == maxcalls) {
4928 return (-1);
4929 }
4930 maxx = x;
4931 fy = l / 2.0;
4932
4933 // Search for right x location of fy
4934 p = maxx + params[0];
4935 step = params[0];
4936 lold = -2.0;
4937 l = -1e300;
4938 i = 0;
4939
4940 while ( (l != lold) && (i < maxcalls) ) {
4941 i++;
4942
4943 lold = l;
4944 x = p + step;
4945 l = TMath::Abs(LanGauFun(&x,params) - fy);
4946
4947 if (l > lold)
4948 step = -step/10;
4949
4950 p += step;
4951 }
4952
4953 if (i == maxcalls)
4954 return (-2);
4955
4956 fxr = x;
4957
3a0f6479 4958
55a288e5 4959 // Search for left x location of fy
4960
4961 p = maxx - 0.5 * params[0];
4962 step = -params[0];
4963 lold = -2.0;
4964 l = -1.0e300;
4965 i = 0;
4966
4967 while ((l != lold) && (i < maxcalls)) {
4968 i++;
4969 lold = l;
4970 x = p + step;
4971 l = TMath::Abs(LanGauFun(&x,params) - fy);
4972 if (l > lold) {
4973 step = -step / 10.0;
4974 }
4975 p += step;
4976 }
4977
4978 if (i == maxcalls) {
4979 return (-3);
4980 }
4981
4982 fxl = x;
4983 fwhm = fxr - fxl;
4984
4985 return (0);
55a288e5 4986}
55a288e5 4987//_____________________________________________________________________________
4988Double_t AliTRDCalibraFit::GausConstant(Double_t *x, Double_t *par)
4989{
4990 //
4991 // Gaus with identical mean
4992 //
4993
3a0f6479 4994 Double_t Gauss = par[0] * TMath::Gaus(x[0],0.0,par[1])+par[2];
55a288e5 4995
3a0f6479 4996 return Gauss;
55a288e5 4997
4998}