2 /**************************************************************************
3 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
5 * Author: The ALICE Off-line Project. *
6 * Contributors are mentioned in the code where appropriate. *
8 * Permission to use, copy, modify and distribute this software and its *
9 * documentation strictly for non-commercial purposes is hereby granted *
10 * without fee, provided that the above copyright notice appears in all *
11 * copies and that both the copyright notice and this permission notice *
12 * appear in the supporting documentation. The authors make no claims *
13 * about the suitability of this software for any purpose. It is *
14 * provided "as is" without express or implied warranty. *
15 **************************************************************************/
17 /////////////////////////////////////////////////////////////////////////////////
21 // Offline TRD calibration task
24 // R. Bailhache (R.Bailhache@gsi.de)
26 //////////////////////////////////////////////////////////////////////////////////////
30 #include "Riostream.h"
34 #include "TProfile2D.h"
41 #include "TObjArray.h"
47 #include "TIterator.h"
49 #include "AliAnalysisTask.h"
50 #include "AliAnalysisManager.h"
52 #include "AliESDVertex.h"
53 #include "AliESDEvent.h"
54 #include "AliESDfriend.h"
55 #include "AliESDInputHandler.h"
56 #include "AliESDtrack.h"
57 #include "AliESDfriendTrack.h"
58 #include "AliTRDtrackV1.h"
59 #include "AliTRDseedV1.h"
60 #include "AliTRDcluster.h"
61 #include "AliTRDgeometry.h"
62 #include "AliESDtrackCuts.h"
63 #include "AliESDVertex.h"
64 #include "AliTRDCalDet.h"
66 #include "AliTRDCalibraVector.h"
67 #include "AliTRDCalibraFillHisto.h"
68 #include "AliTRDCalibraVdriftLinearFit.h"
70 #include "AliTRDcalibDB.h"
75 #include "AliTRDCalibTask.h"
78 ClassImp(AliTRDCalibTask)
80 //________________________________________________________________________
81 AliTRDCalibTask::AliTRDCalibTask(const char *name)
82 : AliAnalysisTaskSE(name), fESD(0),
90 fTRDCalibraFillHisto(0),
93 fNbTRDTrackOffline(0),
94 fNbTRDTrackStandalone(0),
98 fNbTimeBinStandalone(0),
100 fNbClustersOffline(0),
101 fNbClustersStandalone(0),
103 fNbTrackletsOffline(0),
104 fNbTrackletsStandalone(0),
112 fVdriftLinear(kTRUE),
114 fSelectedTrigger(new TObjArray()),
117 fRequirePrimaryVertex(kFALSE),
120 fMinNbContributors(0),
121 fRangePrimaryVertexZ(9999999.0),
125 fNormalizeNbOfCluster(kFALSE),
129 fOfflineTracks(kFALSE),
130 fStandaloneTracks(kFALSE),
131 fVersionGainUsed(-1),
132 fSubVersionGainUsed(-1),
133 fVersionGainLocalUsed(-1),
134 fSubVersionGainLocalUsed(-1),
135 fVersionVdriftUsed(-1),
136 fSubVersionVdriftUsed(-1),
143 // Default constructor
154 // Define input and output slots here
155 // Input slot #0 works with a TChain
156 DefineInput(0, TChain::Class());
158 // Output slot #0 writes into a TList container
159 DefineOutput(1, TList::Class());
163 //____________________________________________________________________________________
164 AliTRDCalibTask::~AliTRDCalibTask()
167 // AliTRDCalibTask destructor
171 if(fNEvents) delete fNEvents;
172 if(fNbTRDTrack) delete fNbTRDTrack;
173 if(fNbTRDTrackOffline) delete fNbTRDTrackOffline;
174 if(fNbTRDTrackStandalone) delete fNbTRDTrackStandalone;
175 if(fNbTPCTRDtrack) delete fNbTPCTRDtrack;
176 if(fNbTimeBin) delete fNbTimeBin;
177 if(fNbTimeBinOffline) delete fNbTimeBinOffline;
178 if(fNbTimeBinStandalone) delete fNbTimeBinStandalone;
179 if(fNbClusters) delete fNbClusters;
180 if(fNbClustersOffline) delete fNbClustersOffline;
181 if(fNbClustersStandalone) delete fNbClustersStandalone;
182 if(fNbTracklets) delete fNbTracklets;
183 if(fNbTrackletsOffline) delete fNbTrackletsOffline;
184 if(fNbTrackletsStandalone) delete fNbTrackletsStandalone;
185 if(fAbsoluteGain) delete fAbsoluteGain;
186 if(fCH2dSum) delete fCH2dSum;
187 if(fPH2dSum) delete fPH2dSum;
188 if(fCH2dSM) delete fCH2dSM;
189 if(fPH2dSM) delete fPH2dSM;
190 if(fCalDetGain) delete fCalDetGain;
192 if(fSelectedTrigger) {
193 fSelectedTrigger->Delete();
194 delete fSelectedTrigger;
197 delete fEsdTrackCuts;
203 //________________________________________________________________________
204 void AliTRDCalibTask::ConnectInputData(Option_t *)
206 // Connect ESD or AOD here
207 // Called once per event
209 cout << "AliTRDCalibTask::ConnectInputData() IN" << endl;
212 // TTree* tree = dynamic_cast<TTree*> (GetInputData(0)); //pointer wird "umgecastet" auf anderen Variablentyp
214 //Printf("ERROR: Could not read chain from input slot 0");
217 AliESDInputHandler *esdH = dynamic_cast<AliESDInputHandler*> (AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler());
220 //Printf("ERROR: Could not get ESDInputHandler");
222 fESD = esdH->GetEvent();
223 // esdH->SetActiveBranches("ESDfriend*");
224 if ((esdH->GetTree())->GetBranch("ESDfriend.")) fESDfriend = esdH->GetESDfriend();
225 //else printf("No friend ESD\n");
226 //Printf("*** CONNECTED NEW EVENT ****");
231 //cout << "AliTRDCalibTask::ConnectInputData() OUT" << endl;
236 //________________________________________________________________________
237 void AliTRDCalibTask::UserCreateOutputObjects()
242 //cout << "AliTRDCalibTask::CreateOutputObjects() IN" << endl;
244 // Number of time bins
246 AliTRDcalibDB *cal = AliTRDcalibDB::Instance();
247 fNbTimeBins = cal->GetNumberOfTimeBinsDCS();
248 if(fNbTimeBins <= 0){
249 AliWarning(Form("No of TimeBins from DB [%d] use default [30]", fNbTimeBins));
254 // instance calibration
255 fTRDCalibraFillHisto = AliTRDCalibraFillHisto::Instance();
256 fTRDCalibraFillHisto->SetHisto2d(fHisto2d); // choose to use histograms
257 fTRDCalibraFillHisto->SetVector2d(fVector2d); // choose to use vectors
258 fTRDCalibraFillHisto->SetCH2dOn(); // choose to calibrate the gain
259 fTRDCalibraFillHisto->SetPH2dOn(); // choose to calibrate the drift velocity
260 fTRDCalibraFillHisto->SetPRF2dOn(); // choose to look at the PRF
261 fTRDCalibraFillHisto->SetLinearFitterOn(fVdriftLinear); // Other possibility vdrift VDRIFT
262 fTRDCalibraFillHisto->SetLinearFitterDebugOn(fVdriftLinear); // Other possibility vdrift
263 for(Int_t k = 0; k < 3; k++){
264 if(((fNz[k] != 10) && (fNrphi[k] != 10)) && ((fNz[k] != 100) && (fNrphi[k] != 100))) {
265 fTRDCalibraFillHisto->SetNz(k,fNz[k]); // Mode calibration
266 fTRDCalibraFillHisto->SetNrphi(k,fNrphi[k]); // Mode calibration
269 if((fNz[k] == 100) && (fNrphi[k] == 100)) {
270 if(fVector2d) AliInfo("The mode all together is not supported by the vector method");
271 fTRDCalibraFillHisto->SetAllTogether(k);
273 if((fNz[k] == 10) && (fNrphi[k] == 10)) {
274 if(fVector2d) AliInfo("The mode per supermodule is not supported by the vector method");
275 fTRDCalibraFillHisto->SetPerSuperModule(k);
279 // Variables for how to fill
280 fTRDCalibraFillHisto->SetFillWithZero(fFillZero);
281 fTRDCalibraFillHisto->SetNormalizeNbOfCluster(fNormalizeNbOfCluster);
282 fTRDCalibraFillHisto->SetMaxCluster(fMaxCluster);
283 fTRDCalibraFillHisto->SetNbMaxCluster(fNbMaxCluster);
285 // Init with 30 timebins
286 fTRDCalibraFillHisto->Init2Dhistos(fNbTimeBins); // initialise the histos
287 fTRDCalibraFillHisto->SetNumberClusters(fLow); // At least 11 clusters
288 fTRDCalibraFillHisto->SetNumberClustersf(fHigh); // At least 11 clusters
289 fRelativeScale = fTRDCalibraFillHisto->GetRelativeScale(); // Get the relative scale for the gain
292 if(fDebug > 2) fTRDCalibraFillHisto->SetDebugLevel(1); //debug stuff
295 fListHist = new TList();
296 fListHist->SetOwner();
298 fListHist->Add(fTRDCalibraFillHisto->GetCH2d());
299 fListHist->Add(fTRDCalibraFillHisto->GetPH2d());
300 fListHist->Add(fTRDCalibraFillHisto->GetPRF2d());
302 if(fVdriftLinear) fListHist->Add((TObject *) fTRDCalibraFillHisto->GetVdriftLinearFit());
303 if(fVector2d) fListHist->Add((TObject *) fTRDCalibraFillHisto->GetCalibraVector()); //calibra vector
304 fNEvents = new TH1I("NEvents","NEvents", 2, 0, 2);
305 fListHist->Add(fNEvents);
307 // absolute gain calibration even without AliESDfriend
309 Double_t minPt = 0.001;
310 Double_t maxPt = 10.0;
312 Double_t *binLimLogPt = new Double_t[nBinsPt+1];
313 Double_t *binLimPt = new Double_t[nBinsPt+1];
314 for(Int_t i=0; i<=nBinsPt; i++) binLimLogPt[i]=(Double_t)TMath::Log10(minPt) + (TMath::Log10(maxPt)-TMath::Log10(minPt))/nBinsPt*(Double_t)i ;
315 for(Int_t i=0; i<=nBinsPt; i++) binLimPt[i]=(Double_t)TMath::Power(10,binLimLogPt[i]);
317 fAbsoluteGain = new TH2F("AbsoluteGain","AbsoluteGain", 200, 0.0, 700.0, nBinsPt, binLimPt);
318 fAbsoluteGain->SetYTitle("Momentum at TRD");
319 fAbsoluteGain->SetXTitle("charge deposit [a.u]");
320 fAbsoluteGain->SetZTitle("counts");
321 fAbsoluteGain->SetStats(0);
322 fAbsoluteGain->Sumw2();
323 fListHist->Add(fAbsoluteGain);
327 /////////////////////////////////////////
329 ///////////////////////////////////////
332 // Standart with AliESDfriend
333 fPH2dSM = new TProfile2D("PH2dSM","Nz10Nrphi10"
334 ,fNbTimeBins,-0.05,(Double_t)((fNbTimeBins-0.5)/10.0)
336 fPH2dSM->SetYTitle("Det/pad groups");
337 fPH2dSM->SetXTitle("time [#mus]");
338 fPH2dSM->SetZTitle("<PH> [a.u.]");
339 fPH2dSM->SetStats(0);
341 fCH2dSM = new TH2I("CH2dSM","Nz10Nrphi10",50,0,300,18,0,18);
342 fCH2dSM->SetYTitle("Det/pad groups");
343 fCH2dSM->SetXTitle("charge deposit [a.u]");
344 fCH2dSM->SetZTitle("counts");
345 fCH2dSM->SetStats(0);
348 fPH2dSum = new TProfile2D("PH2dSum","Nz100Nrphi100"
349 ,fNbTimeBins,-0.05,(Double_t)((fNbTimeBins-0.5)/10.0)
351 fPH2dSum->SetYTitle("Det/pad groups");
352 fPH2dSum->SetXTitle("time [#mus]");
353 fPH2dSum->SetZTitle("<PH> [a.u.]");
354 fPH2dSum->SetStats(0);
356 fCH2dSum = new TH2I("CH2dSum","Nz100Nrphi100",50,0,300,1,0,1);
357 fCH2dSum->SetYTitle("Det/pad groups");
358 fCH2dSum->SetXTitle("charge deposit [a.u]");
359 fCH2dSum->SetZTitle("counts");
360 fCH2dSum->SetStats(0);
364 fListHist->Add(fPH2dSM);
365 fListHist->Add(fCH2dSM);
366 fListHist->Add(fPH2dSum);
367 fListHist->Add(fCH2dSum);
370 /////////////////////////////////////////
371 // Second debug level
372 ///////////////////////////////////////
375 fNbTRDTrack = new TH1F("TRDTrack","TRDTrack",50,0,50);
376 fNbTRDTrack->Sumw2();
377 fNbTRDTrackOffline = new TH1F("TRDTrackOffline","TRDTrackOffline",50,0,50);
378 fNbTRDTrackOffline->Sumw2();
379 fNbTRDTrackStandalone = new TH1F("TRDTrackStandalone","TRDTrackStandalone",50,0,50);
380 fNbTRDTrackStandalone->Sumw2();
381 fNbTPCTRDtrack = new TH2F("NbTPCTRDtrack","NbTPCTRDtrack",100,0,100,100,0,100);
382 fNbTPCTRDtrack->Sumw2();
384 fNbTimeBin = new TH1F("NbTimeBin","NbTimeBin",35,0,35);
386 fNbTimeBinOffline = new TH1F("NbTimeBinOffline","NbTimeBinOffline",35,0,35);
387 fNbTimeBinOffline->Sumw2();
388 fNbTimeBinStandalone = new TH1F("NbTimeBinStandalone","NbTimeBinStandalone",35,0,35);
389 fNbTimeBinStandalone->Sumw2();
391 fNbClusters = new TH1F("NbClusters","",35,0,35);
392 fNbClusters->Sumw2();
393 fNbClustersOffline = new TH1F("NbClustersOffline","",35,0,35);
394 fNbClustersOffline->Sumw2();
395 fNbClustersStandalone = new TH1F("NbClustersStandalone","",35,0,35);
396 fNbClustersStandalone->Sumw2();
398 fNbTracklets = new TH1F("NbTracklets","NbTracklets",540,0.,540.);
399 fNbTracklets->Sumw2();
400 fNbTrackletsOffline = new TH1F("NbTrackletsOffline","NbTrackletsOffline",540,0.,540.);
401 fNbTrackletsOffline->Sumw2();
402 fNbTrackletsStandalone = new TH1F("NbTrackletsStandalone","NbTrackletsStandalone",540,0.,540.);
403 fNbTrackletsStandalone->Sumw2();
405 fListHist->Add(fNbTRDTrack);
406 fListHist->Add(fNbTRDTrackOffline);
407 fListHist->Add(fNbTRDTrackStandalone);
408 fListHist->Add(fNbTPCTRDtrack);
410 fListHist->Add(fNbTimeBin);
411 fListHist->Add(fNbTimeBinOffline);
412 fListHist->Add(fNbTimeBinStandalone);
413 fListHist->Add(fNbClusters);
414 fListHist->Add(fNbClustersOffline);
415 fListHist->Add(fNbClustersStandalone);
416 fListHist->Add(fNbTracklets);
417 fListHist->Add(fNbTrackletsOffline);
418 fListHist->Add(fNbTrackletsStandalone);
422 delete [] binLimLogPt;
425 //cout << "AliTRDCalibTask::UserCreateOutputObjects() OUT" << endl;
429 //________________________________________________________________________
430 void AliTRDCalibTask::UserExec(Option_t *)
433 // Filling of the histos
435 //cout << "AliTRDCalibTask::Exec() IN" << endl;
437 // Init Versions and subversions used
438 if((fVersionGainUsed==-1) || (fSubVersionGainUsed==-1) || (fVersionGainLocalUsed==-1) || (fSubVersionGainLocalUsed==-1) || (fVersionVdriftUsed==-1) || (fSubVersionVdriftUsed==-1)) {
439 if(!SetVersionSubversion()) {
441 fSubVersionGainUsed=0;
442 fVersionGainLocalUsed=0;
443 fSubVersionGainLocalUsed=0;
444 fVersionVdriftUsed=0;
445 fSubVersionVdriftUsed=0;
449 fTRDCalibraFillHisto->SetVersionGainUsed(fVersionGainUsed); // Gain Used
450 fTRDCalibraFillHisto->SetSubVersionGainUsed(fSubVersionGainUsed); // Gain Used
451 fTRDCalibraFillHisto->SetVersionGainLocalUsed(fVersionGainLocalUsed); // Gain Used
452 fTRDCalibraFillHisto->SetSubVersionGainLocalUsed(fSubVersionGainLocalUsed); // Gain Used
453 fTRDCalibraFillHisto->SetVersionVdriftUsed(fVersionVdriftUsed); // Vdrift Used
454 fTRDCalibraFillHisto->SetSubVersionVdriftUsed(fSubVersionVdriftUsed); // Vdrift Used
455 fTRDCalibraFillHisto->InitCalDet();
458 // AliLog::SetGlobalLogLevel(AliLog::kError);
459 // cout << "AliTRDCalibTask::Exec() 1" << endl;
460 fESD = dynamic_cast<AliESDEvent*>(fInputEvent);
462 AliError("ESD Event missing");
463 PostData(1, fListHist);
467 //printf("Counter %d\n",fCounter);
470 //cout << "maxEvent = " << fMaxEvent << endl;
471 //if(fCounter%100==0) cout << "fCounter = " << fCounter << endl;
472 if((fMaxEvent != 0) && (fMaxEvent < fCounter)) return;
473 //if(fCounter%100==0) cout << "fCounter1 = " << fCounter << endl;
474 //cout << "event = " << fCounter << endl;
476 //printf("Counter %d\n",fCounter);
482 Int_t numberOfTriggerSelected = fSelectedTrigger->GetEntriesFast();
483 //printf("numberofTriggerSelected %d\n",numberOfTriggerSelected);
486 for(Int_t k = 0; k < numberOfTriggerSelected; k++){
487 const TObjString *const obString=(TObjString*)fSelectedTrigger->At(k);
488 const TString tString=obString->GetString();
489 if(fESD->IsTriggerClassFired((const char*)tString)) {
496 for(Int_t k = 0; k < numberOfTriggerSelected; k++){
497 const TObjString *const obString=(TObjString*)fSelectedTrigger->At(k);
498 const TString tString=obString->GetString();
499 if(fESD->IsTriggerClassFired((const char*)tString)) {
505 PostData(1, fListHist);
508 //printf("Class Fired %s\n",(const char*)fESD->GetFiredTriggerClasses());
509 //printf("Trigger passed\n");
511 ///////////////////////////////
512 // Require a primary vertex
513 //////////////////////////////
514 if(fRequirePrimaryVertex) {
515 const AliESDVertex* vtxESD = 0x0;
516 if (fVtxTPC) vtxESD = fESD->GetPrimaryVertexTPC() ;
517 else if (fVtxSPD) vtxESD = fESD->GetPrimaryVertexSPD() ;
518 else vtxESD = fESD->GetPrimaryVertexTracks() ;
520 PostData(1, fListHist);
523 Int_t nCtrb = vtxESD->GetNContributors();
524 if(nCtrb < fMinNbContributors) {
525 PostData(1, fListHist);
528 Double_t zPosition = vtxESD->GetZ();
529 if(TMath::Abs(zPosition) > fRangePrimaryVertexZ) {
530 PostData(1, fListHist);
536 //printf("Primary vertex passed\n");
541 Int_t nbTrdTracks = 0;
543 Int_t nbTrdTracksStandalone = 0;
545 Int_t nbTrdTracksOffline = 0;
547 Int_t nbtrackTPC = 0;
549 Double_t nbTracks = fESD->GetNumberOfTracks();
550 //printf("Number of tracks %f\n",nbTracks);
552 if (nbTracks <= 0.0) {
555 fNbTRDTrack->Fill(nbTrdTracks);
556 fNbTRDTrackStandalone->Fill(nbTrdTracksStandalone);
557 fNbTRDTrackOffline->Fill(nbTrdTracksOffline);
559 PostData(1, fListHist);
564 fESDfriend = dynamic_cast<AliESDfriend*> (fESD->FindListObject("AliESDfriend"));
566 AliError("fESDfriend not available");
567 PostData(1, fListHist);
571 //printf("has friends\n");
574 ////////////////////////////////////
575 // Check the number of TPC tracks
576 ///////////////////////////////////
577 //printf("Nb of tracks %f\n",nbTracks);
578 for(Int_t itrk = 0; itrk < nbTracks; itrk++){
580 fkEsdTrack = fESD->GetTrack(itrk);
581 ULong_t status = fkEsdTrack->GetStatus();
582 if(status&(AliESDtrack::kTPCout)) nbtrackTPC++;
583 if((status&(AliESDtrack::kTRDout)) && (!(status&(AliESDtrack::kTRDin)))) {
585 nbTrdTracksStandalone++;
587 if((status&(AliESDtrack::kTRDin))) {
589 nbTrdTracksOffline++;
593 if((nbtrackTPC>0) && (nbTrdTracks > (3.0*nbtrackTPC))) pass = kFALSE;
597 fNbTRDTrack->Fill(nbTrdTracks);
598 fNbTRDTrackStandalone->Fill(nbTrdTracksStandalone);
599 fNbTRDTrackOffline->Fill(nbTrdTracksOffline);
600 fNbTPCTRDtrack->Fill(nbTrdTracks,nbtrackTPC);
605 PostData(1, fListHist);
610 /////////////////////////////////////
611 // Loop on AliESDtrack
612 ////////////////////////////////////
613 //printf("Nb of tracks %f\n",nbTracks);
614 for(int itrk=0; itrk < nbTracks; ++itrk){
617 fkEsdTrack = fESD->GetTrack(itrk);
618 if(!fkEsdTrack) continue;
619 ULong_t status = fkEsdTrack->GetStatus();
620 if(status&(AliESDtrack::kTPCout)) ++nbtrackTPC;
622 // Quality cuts on the AliESDtrack
623 if((fEsdTrackCuts) && (!fEsdTrackCuts->IsSelected((AliVParticle *)fkEsdTrack))) {
624 //printf("Not a good track\n");
628 // First Absolute gain calibration
629 Int_t trdNTracklets = (Int_t) fkEsdTrack->GetTRDntracklets();
630 Int_t trdNTrackletsPID = (Int_t) fkEsdTrack->GetTRDntrackletsPID();
631 if((trdNTracklets > 0) && (trdNTrackletsPID > 0)) {
632 for(Int_t iPlane = 0; iPlane < 6; ++iPlane){
633 //Double_t slide = fkEsdTrack->GetTRDslice(iPlane);
634 //printf("Number of slide %d\n",fkEsdTrack->GetNumberOfTRDslices());
635 //Double_t momentum = fkEsdTrack->GetTRDmomentum(iPlane);
636 //printf("momentum %f, slide %f\n",momentum,slide);
637 if(fkEsdTrack->GetTRDslice(iPlane) > 0.0)
638 fAbsoluteGain->Fill(fkEsdTrack->GetTRDslice(iPlane)*8.0/100.0,
639 fkEsdTrack->GetTRDmomentum(iPlane));
645 Bool_t standalonetrack = kFALSE;
646 Bool_t offlinetrack = kFALSE;
647 //ULong_t status = fkEsdTrack->GetStatus();
649 fFriendTrack = fESDfriend->GetTrack(itrk);
651 //printf("No friend track %d\n",itrk);
654 //////////////////////////////////////
655 // Loop on calibration objects
656 //////////////////////////////////////
659 while((fCalibObject = (TObject *)(fFriendTrack->GetCalibObject(icalib++)))){
660 //printf("Name %s\n",fCalibObject->IsA()->GetName());
661 if(strcmp(fCalibObject->IsA()->GetName(), "AliTRDtrackV1") != 0) continue;
662 //printf("Find the calibration object\n");
665 if((status&(AliESDtrack::kTRDout)) && (!(status&(AliESDtrack::kTRDin)))) {
666 standalonetrack = kTRUE;
668 if((status&(AliESDtrack::kTRDin))) {
669 offlinetrack = kTRUE;
676 else if(fStandaloneTracks){
677 if(!standalonetrack){
682 fTrdTrack = (AliTRDtrackV1 *)fCalibObject;
684 //cout << "good" << endl;
685 fTRDCalibraFillHisto->UpdateHistogramsV1(fTrdTrack);
686 //printf("Fill fTRDCalibraFillHisto\n");
689 //////////////////////////////////
691 ////////////////////////////////
695 //printf("Enter debug\n");
697 Int_t nbtracklets = 0;
700 Bool_t standalonetracklet = kFALSE;
701 const AliTRDseedV1 *tracklet = 0x0;
702 //////////////////////////////////////
704 /////////////////////////////////////
706 Double_t phtb[AliTRDseedV1::kNtb];
707 memset(phtb, 0, AliTRDseedV1::kNtb*sizeof(Double_t));
709 Float_t normalisation = 6.67;
712 for(Int_t itr = 0; itr < 6; ++itr){
714 if(!(tracklet = fTrdTrack->GetTracklet(itr))) continue;
715 if(!tracklet->IsOK()) continue;
717 standalonetracklet = kFALSE;
718 if(tracklet->IsStandAlone()) standalonetracklet = kTRUE;
721 memset(phtb, 0, AliTRDseedV1::kNtb*sizeof(Double_t));
725 //Int_t crossrow = 0;
727 // Check no shared clusters
728 //for(int icc=AliTRDseedV1::kNtb; icc<AliTRDseedV1::kNclusters; icc++){
729 // if((fcl = tracklet->GetClusters(icc))) crossrow = 1;
736 for(int ic=0; ic<AliTRDseedV1::kNtb; ++ic){
738 if(!(fCl = tracklet->GetClusters(ic))) continue;
740 time = fCl->GetPadTime();
741 ch = tracklet->GetdQdl(ic);
742 qcl = TMath::Abs(fCl->GetQ());
743 detector = fCl->GetDetector();
744 // Add the charge if shared cluster
745 if((ic+AliTRDseedV1::kNtb) < AliTRDseedV1::kNclusters) {
746 if((fCl = tracklet->GetClusters(ic+AliTRDseedV1::kNtb))) {
747 qcl += TMath::Abs(fCl->GetQ());
748 //printf("Add the cluster charge\n");
751 if((time>-1) && (time<fNbTimeBins)) phtb[time]=qcl;
752 if((fCalDetGain) && (fCalDetGain->GetValue(detector) > 0.0)) sum += ch*fCalDetGain->GetValue(detector)/normalisation;
753 else sum += ch/normalisation;
756 fNbTimeBin->Fill(time);
757 if(tracklet->IsStandAlone()) fNbTimeBinStandalone->Fill(time);
758 else fNbTimeBinOffline->Fill(time);
761 sector = AliTRDgeometry::GetSector(detector);
764 fNbTracklets->Fill(detector);
765 if(tracklet->IsStandAlone()) fNbTrackletsStandalone->Fill(detector);
766 else fNbTrackletsOffline->Fill(detector);
768 fNbClusters->Fill(nbclusters);
769 if(tracklet->IsStandAlone()) fNbClustersStandalone->Fill(nbclusters);
770 else fNbClustersOffline->Fill(nbclusters);
774 if((nbclusters > fLow) && (nbclusters < fHigh)){
775 if(fRelativeScale > 0.0) sum = sum/fRelativeScale;
776 fCH2dSM->Fill(sum,sector+0.5);
777 fCH2dSum->Fill(sum,0.5);
778 Bool_t checknoise = kTRUE;
779 if(fMaxCluster > 0) {
780 if(phtb[0] > fMaxCluster) checknoise = kFALSE;
781 if(fNbTimeBins > fNbMaxCluster) {
782 for(Int_t k = (fNbTimeBins-fNbMaxCluster); k < fNbTimeBins; k++){
783 if(phtb[k] > fMaxCluster) checknoise = kFALSE;
788 for(int ic=0; ic<fNbTimeBins; ic++){
790 fPH2dSum->Fill((Double_t)(ic/10.0),0.5,(Double_t)phtb[ic]);
791 fPH2dSM->Fill((Double_t)(ic/10.0),sector+0.5,(Double_t)phtb[ic]);
795 fPH2dSum->Fill((Double_t)(ic/10.0),0.0,(Double_t)phtb[ic]);
796 fPH2dSM->Fill((Double_t)(ic/10.0),sector+0.5,(Double_t)phtb[ic]);
803 } // loop on tracklets
807 }// while calibration objects
808 if(nTRDtrackV1 > 0) {
810 if((status&(AliESDtrack::kTRDout)) && (!(status&(AliESDtrack::kTRDin)))) {
811 ++nbTrdTracksStandalone;
813 if((status&(AliESDtrack::kTRDin))) {
814 ++nbTrdTracksOffline;
817 //delete fFriendTrack;
821 fNbTRDTrack->Fill(nbTrdTracks);
822 fNbTRDTrackStandalone->Fill(nbTrdTracksStandalone);
823 fNbTRDTrackOffline->Fill(nbTrdTracksOffline);
824 fNbTPCTRDtrack->Fill(nbTrdTracks,nbtrackTPC);
828 PostData(1, fListHist);
829 //cout << "AliTRDCalibTask::Exec() OUT" << endl;
832 //________________________________________________________________________
833 void AliTRDCalibTask::Terminate(Option_t *)
839 if(fTRDCalibraFillHisto) fTRDCalibraFillHisto->DestroyDebugStreamer();
843 //_______________________________________________________
844 Bool_t AliTRDCalibTask::Load(const Char_t *filename)
847 // Generic container loader
850 if(!TFile::Open(filename)){
851 //AliWarning(Form("Couldn't open file %s.", filename));
855 if(!(o = (TList*)gFile->Get(GetName()))){
856 //AliWarning("Missing histogram container.");
859 fListHist = (TList*)o->Clone(GetName());
863 //_______________________________________________________
864 Bool_t AliTRDCalibTask::Load(TList *lister)
867 // Generic container loader
870 fListHist = (TList*)lister->Clone(GetName());
873 //________________________________________________________________________
874 void AliTRDCalibTask::Plot()
877 // Plot the histos stored in the TList
880 if(!fListHist) return;
882 /////////////////////////////////////
883 // Take the debug stuff
884 /////////////////////////////////////
886 TH1I *nEvents = (TH1I *) fListHist->FindObject("NEvents");
888 TH2F *absoluteGain = (TH2F *) fListHist->FindObject("AbsoluteGain");
890 TH1F *trdTrack = (TH1F *) fListHist->FindObject("TRDTrack");
891 TH1F *trdTrackOffline = (TH1F *) fListHist->FindObject("TRDTrackOffline");
892 TH1F *trdTrackStandalone = (TH1F *) fListHist->FindObject("TRDTrackStandalone");
894 TH2F *tpctrdTrack = (TH2F *) fListHist->FindObject("NbTPCTRDtrack");
896 TH1F *nbTimeBin = (TH1F *) fListHist->FindObject("NbTimeBin");
897 TH1F *nbTimeBinOffline = (TH1F *) fListHist->FindObject("NbTimeBinOffline");
898 TH1F *nbTimeBinStandalone = (TH1F *) fListHist->FindObject("NbTimeBinStandalone");
900 TH1F *nbClusters = (TH1F *) fListHist->FindObject("NbClusters");
901 TH1F *nbClustersOffline = (TH1F *) fListHist->FindObject("NbClustersOffline");
902 TH1F *nbClustersStandalone = (TH1F *) fListHist->FindObject("NbClustersStandalone");
904 TH1F *nbTracklets = (TH1F *) fListHist->FindObject("NbTracklets");
905 TH1F *nbTrackletsOffline = (TH1F *) fListHist->FindObject("NbTrackletsOffline");
906 TH1F *nbTrackletsStandalone = (TH1F *) fListHist->FindObject("NbTrackletsStandalone");
908 /////////////////////////////////////
909 // Take the calibration objects
910 /////////////////////////////////////
912 TH2I *ch2d = (TH2I *) fListHist->FindObject("CH2d");
913 TProfile2D *ph2d = (TProfile2D *) fListHist->FindObject("PH2d");
915 TH2I *ch2dSum = (TH2I *) fListHist->FindObject("CH2dSum");
916 TProfile2D *ph2dSum = (TProfile2D *) fListHist->FindObject("PH2dSum");
918 TH2I *ch2dSM = (TH2I *) fListHist->FindObject("CH2dSM");
919 TProfile2D *ph2dSM = (TProfile2D *) fListHist->FindObject("PH2dSM");
921 AliTRDCalibraVdriftLinearFit *linearfit = (AliTRDCalibraVdriftLinearFit *) fListHist->FindObject("AliTRDCalibraVdriftLinearFit");
923 ////////////////////////////////////////////////
924 // Add the AliTRDCalibraVdriftLinearFit
925 ///////////////////////////////////////////////
928 TH2S *histolinearfitsum = 0x0;
931 for(Int_t det = 0; det < 540; det++) {
932 if(linearfit->GetLinearFitterHisto(det)){
933 if(TMath::Abs(first)<0.0001){
934 histolinearfitsum = linearfit->GetLinearFitterHisto(det);
938 if (histolinearfitsum) {
939 histolinearfitsum->Add(linearfit->GetLinearFitterHisto(det));
946 ///////////////////////////
948 //////////////////////////
950 gStyle->SetPalette(1);
951 gStyle->SetOptStat(1111);
952 gStyle->SetOptFit(1111);
953 gStyle->SetPadBorderMode(0);
954 gStyle->SetCanvasColor(10);
955 gStyle->SetPadLeftMargin(0.13);
956 gStyle->SetPadRightMargin(0.13);
958 /////////////////////////
960 ////////////////////////
964 TCanvas *debugEvents = new TCanvas("cNEvents","cNEvents",10,10,510,510);
966 if(nEvents) nEvents->Draw();
972 TCanvas *debugAbsoluteGain = new TCanvas("cAbsoluteGain","cAbsoluteGain",10,10,510,510);
973 debugAbsoluteGain->cd(1);
974 if(absoluteGain) absoluteGain->Draw();
978 if(trdTrack || tpctrdTrack) {
980 TCanvas *debugtrdtpcTrack = new TCanvas("TRDtracktpctrdtrack","TRDtracktpctrdtrack",10,10,510,510);
981 debugtrdtpcTrack->Divide(2,1);
982 debugtrdtpcTrack->cd(1);
983 if(trdTrack) trdTrack->Draw();
984 if(trdTrackOffline) trdTrackOffline->Draw("same");
985 if(trdTrackStandalone) trdTrackStandalone->Draw("same");
986 TLegend *leg = new TLegend(0.4,0.6,0.89,0.89);
987 if(trdTrack) leg->AddEntry(trdTrack,"All","p");
988 if(trdTrackOffline) leg->AddEntry(trdTrackOffline,"Offline","p");
989 if(trdTrackStandalone) leg->AddEntry(trdTrackStandalone,"Standalone","p");
991 debugtrdtpcTrack->cd(2);
992 if(tpctrdTrack) tpctrdTrack->Draw();
993 TLine *line = new TLine(0.0,0.0,100.0,100.0);
998 if(nbTimeBin || nbTracklets || nbClusters) {
1000 TCanvas *debugTracklets = new TCanvas("TRDtimebintrackletcluster","TRDtimebintrackletcluster",10,10,510,510);
1001 debugTracklets->Divide(3,1);
1002 debugTracklets->cd(1);
1003 if(nbTimeBin) nbTimeBin->Draw();
1004 if(nbTimeBinOffline) nbTimeBinOffline->Draw("same");
1005 if(nbTimeBinStandalone) nbTimeBinStandalone->Draw("same");
1006 TLegend *lega = new TLegend(0.4,0.6,0.89,0.89);
1007 if(nbTimeBin) lega->AddEntry(nbTimeBin,"All","p");
1008 if(nbTimeBinOffline) lega->AddEntry(nbTimeBinOffline,"Offline","p");
1009 if(nbTimeBinStandalone) lega->AddEntry(nbTimeBinStandalone,"Standalone","p");
1011 debugTracklets->cd(2);
1012 if(nbTracklets) nbTracklets->Draw();
1013 if(nbTrackletsOffline) nbTrackletsOffline->Draw("same");
1014 if(nbTrackletsStandalone) nbTrackletsStandalone->Draw("same");
1015 TLegend *legb = new TLegend(0.4,0.6,0.89,0.89);
1016 if(nbTracklets) legb->AddEntry(nbTracklets,"All","p");
1017 if(nbTrackletsOffline) legb->AddEntry(nbTrackletsOffline,"Offline","p");
1018 if(nbTrackletsStandalone) legb->AddEntry(nbTrackletsStandalone,"Standalone","p");
1020 debugTracklets->cd(3);
1021 if(nbClusters) nbClusters->Draw();
1022 if(nbClustersOffline) nbClustersOffline->Draw("same");
1023 if(nbClustersStandalone) nbClustersStandalone->Draw("same");
1024 TLegend *legc = new TLegend(0.4,0.6,0.89,0.89);
1025 if(nbClusters) legc->AddEntry(nbClusters,"All","p");
1026 if(nbClustersOffline) legc->AddEntry(nbClustersOffline,"Offline","p");
1027 if(nbClustersStandalone) legc->AddEntry(nbClustersStandalone,"Standalone","p");
1032 if(ch2dSum || ph2dSum || histolinearfitsum) {
1034 TCanvas *debugSum = new TCanvas("SumCalibrationObjects","SumCalibrationObjects",10,10,510,510);
1035 debugSum->Divide(3,1);
1037 if(ch2dSum) ch2dSum->Draw("lego");
1039 if(ph2dSum) ph2dSum->Draw("lego");
1041 if(histolinearfitsum) histolinearfitsum->Draw();
1045 if(ch2dSM || ph2dSM) {
1047 TCanvas *debugSM = new TCanvas("SMCalibrationObjects","SMCalibrationObjects",10,10,510,510);
1048 debugSM->Divide(2,1);
1050 if(ch2dSM) ch2dSM->Draw("lego");
1052 if(ph2dSM) ph2dSM->Draw("lego");
1058 TCanvas *debug = new TCanvas("CalibrationObjects","CalibrationObjects",10,10,510,510);
1061 if(ch2d) ch2d->Draw("lego");
1063 if(ph2d) ph2d->Draw("lego");
1068 //_______________________________________________________________________________________
1069 void AliTRDCalibTask::AddTask(const AliTRDCalibTask * calibTask) {
1075 TList *listcalibTask = calibTask->GetList();
1076 if(!listcalibTask) return;
1078 TH1I *nEvents = (TH1I *) listcalibTask->FindObject("NEvents");
1079 TH2F *absoluteGain = (TH2F *) listcalibTask->FindObject("AbsoluteGain");
1081 TH1F *trdTrack = (TH1F *) listcalibTask->FindObject("TRDTrack");
1082 TH1F *trdTrackOffline = (TH1F *) listcalibTask->FindObject("TRDTrackOffline");
1083 TH1F *trdTrackStandalone = (TH1F *) listcalibTask->FindObject("TRDTrackStandalone");
1085 TH2F *tpctrdTrack = (TH2F *) listcalibTask->FindObject("NbTPCTRDtrack");
1087 TH1F *nbTimeBin = (TH1F *) listcalibTask->FindObject("NbTimeBin");
1088 TH1F *nbTimeBinOffline = (TH1F *) listcalibTask->FindObject("NbTimeBinOffline");
1089 TH1F *nbTimeBinStandalone = (TH1F *) listcalibTask->FindObject("NbTimeBinStandalone");
1091 TH1F *nbClusters = (TH1F *) listcalibTask->FindObject("NbClusters");
1092 TH1F *nbClustersOffline = (TH1F *) listcalibTask->FindObject("NbClustersOffline");
1093 TH1F *nbClustersStandalone = (TH1F *) listcalibTask->FindObject("NbClustersStandalone");
1095 TH1F *nbTracklets = (TH1F *) listcalibTask->FindObject("NbTracklets");
1096 TH1F *nbTrackletsOffline = (TH1F *) listcalibTask->FindObject("NbTrackletsOffline");
1097 TH1F *nbTrackletsStandalone = (TH1F *) listcalibTask->FindObject("NbTrackletsStandalone");
1099 TH2I *ch2d = (TH2I *) listcalibTask->FindObject("CH2d");
1100 TProfile2D *ph2d = (TProfile2D *) listcalibTask->FindObject("PH2d");
1101 TProfile2D *prf2d = (TProfile2D *) listcalibTask->FindObject("PRF2d");
1103 TH2I *ch2dSum = (TH2I *) listcalibTask->FindObject("CH2dSum");
1104 TProfile2D *ph2dSum = (TProfile2D *) listcalibTask->FindObject("PH2dSum");
1106 TH2I *ch2dSM = (TH2I *) listcalibTask->FindObject("CH2dSM");
1107 TProfile2D *ph2dSM = (TProfile2D *) listcalibTask->FindObject("PH2dSM");
1109 AliTRDCalibraVdriftLinearFit *linearfit = (AliTRDCalibraVdriftLinearFit *) listcalibTask->FindObject("AliTRDCalibraVdriftLinearFit");
1110 AliTRDCalibraVector *calibraVector = (AliTRDCalibraVector *) listcalibTask->FindObject("AliTRDCalibraVector");
1114 TH1I *inEvents = (TH1I *) fListHist->FindObject("NEvents");
1115 TH2F *iabsoluteGain = (TH2F *) fListHist->FindObject("AbsoluteGain");
1117 TH1F *itrdTrack = (TH1F *) fListHist->FindObject("TRDTrack");
1118 TH1F *itrdTrackOffline = (TH1F *) fListHist->FindObject("TRDTrackOffline");
1119 TH1F *itrdTrackStandalone = (TH1F *) fListHist->FindObject("TRDTrackStandalone");
1121 TH2F *itpctrdTrack = (TH2F *) fListHist->FindObject("NbTPCTRDtrack");
1123 TH1F *inbTimeBin = (TH1F *) fListHist->FindObject("NbTimeBin");
1124 TH1F *inbTimeBinOffline = (TH1F *) fListHist->FindObject("NbTimeBinOffline");
1125 TH1F *inbTimeBinStandalone = (TH1F *) fListHist->FindObject("NbTimeBinStandalone");
1127 TH1F *inbClusters = (TH1F *) fListHist->FindObject("NbClusters");
1128 TH1F *inbClustersOffline = (TH1F *) fListHist->FindObject("NbClustersOffline");
1129 TH1F *inbClustersStandalone = (TH1F *) fListHist->FindObject("NbClustersStandalone");
1131 TH1F *inbTracklets = (TH1F *) fListHist->FindObject("NbTracklets");
1132 TH1F *inbTrackletsOffline = (TH1F *) fListHist->FindObject("NbTrackletsOffline");
1133 TH1F *inbTrackletsStandalone = (TH1F *) fListHist->FindObject("NbTrackletsStandalone");
1135 TH2I *ich2d = (TH2I *) fListHist->FindObject("CH2d");
1136 TProfile2D *iph2d = (TProfile2D *) fListHist->FindObject("PH2d");
1137 TProfile2D *iprf2d = (TProfile2D *) fListHist->FindObject("PRF2d");
1139 TH2I *ich2dSum = (TH2I *) fListHist->FindObject("CH2dSum");
1140 TProfile2D *iph2dSum = (TProfile2D *) fListHist->FindObject("PH2dSum");
1142 TH2I *ich2dSM = (TH2I *) fListHist->FindObject("CH2dSM");
1143 TProfile2D *iph2dSM = (TProfile2D *) fListHist->FindObject("PH2dSM");
1145 AliTRDCalibraVdriftLinearFit *ilinearfit = (AliTRDCalibraVdriftLinearFit *) fListHist->FindObject("AliTRDCalibraVdriftLinearFit");
1146 AliTRDCalibraVector *icalibraVector = (AliTRDCalibraVector *) fListHist->FindObject("AliTRDCalibraVector");
1153 inEvents->Add(nEvents);
1154 //printf("Add Events\n");
1157 //printf("Create new Events\n");
1158 inEvents = new TH1I(*nEvents);
1159 fListHist->Add(inEvents);
1164 if(iabsoluteGain) iabsoluteGain->Add(absoluteGain);
1166 iabsoluteGain = new TH2F(*absoluteGain);
1167 fListHist->Add(iabsoluteGain);
1172 if(itrdTrack) itrdTrack->Add(trdTrack);
1174 itrdTrack = new TH1F(*trdTrack);
1175 fListHist->Add(itrdTrack);
1179 if(trdTrackOffline) {
1180 if(itrdTrackOffline) itrdTrackOffline->Add(trdTrackOffline);
1182 itrdTrackOffline = new TH1F(*trdTrackOffline);
1183 fListHist->Add(itrdTrackOffline);
1187 if(trdTrackStandalone) {
1188 if(itrdTrackStandalone) itrdTrackStandalone->Add(trdTrackStandalone);
1190 itrdTrackStandalone = new TH1F(*trdTrackStandalone);
1191 fListHist->Add(itrdTrackStandalone);
1196 if(itpctrdTrack) itpctrdTrack->Add(tpctrdTrack);
1198 itpctrdTrack = new TH2F(*tpctrdTrack);
1199 fListHist->Add(itpctrdTrack);
1204 if(inbTimeBin) inbTimeBin->Add(nbTimeBin);
1206 inbTimeBin = new TH1F(*inbTimeBin);
1207 fListHist->Add(inbTimeBin);
1211 if(nbTimeBinOffline) {
1212 if(inbTimeBinOffline) inbTimeBinOffline->Add(nbTimeBinOffline);
1214 inbTimeBinOffline = new TH1F(*nbTimeBinOffline);
1215 fListHist->Add(inbTimeBinOffline);
1219 if(nbTimeBinStandalone) {
1220 if(inbTimeBinStandalone) inbTimeBinStandalone->Add(nbTimeBinStandalone);
1222 inbTimeBinStandalone = new TH1F(*nbTimeBinStandalone);
1223 fListHist->Add(inbTimeBinStandalone);
1228 if(inbClusters) inbClusters->Add(nbClusters);
1230 inbClusters = new TH1F(*nbClusters);
1231 fListHist->Add(inbClusters);
1235 if(nbClustersOffline) {
1236 if(inbClustersOffline) inbClustersOffline->Add(nbClustersOffline);
1238 inbClustersOffline = new TH1F(*nbClustersOffline);
1239 fListHist->Add(inbClustersOffline);
1243 if(nbClustersStandalone) {
1244 if(inbClustersStandalone) inbClustersStandalone->Add(nbClustersStandalone);
1246 inbClustersStandalone = new TH1F(*nbClustersStandalone);
1247 fListHist->Add(inbClustersStandalone);
1252 if(inbTracklets) inbTracklets->Add(nbTracklets);
1254 inbTracklets = new TH1F(*nbTracklets);
1255 fListHist->Add(inbTracklets);
1259 if(nbTrackletsOffline) {
1260 if(inbTrackletsOffline) inbTrackletsOffline->Add(nbTrackletsOffline);
1262 inbTrackletsOffline = new TH1F(*nbTrackletsOffline);
1263 fListHist->Add(inbTrackletsOffline);
1267 if(nbTrackletsStandalone) {
1268 if(inbTrackletsStandalone) inbTrackletsStandalone->Add(nbTrackletsStandalone);
1270 inbTrackletsStandalone = new TH1F(*nbTrackletsStandalone);
1271 fListHist->Add(inbTrackletsStandalone);
1276 if(ich2d) ich2d->Add(ch2d);
1278 ich2d = new TH2I(*ch2d);
1279 fListHist->Add(ich2d);
1284 if(iph2d) iph2d->Add(ph2d);
1286 iph2d = new TProfile2D(*ph2d);
1287 fListHist->Add(iph2d);
1292 if(iprf2d) iprf2d->Add(prf2d);
1294 iprf2d = new TProfile2D(*prf2d);
1295 fListHist->Add(iprf2d);
1300 if(ich2dSum) ich2dSum->Add(ch2dSum);
1302 ich2dSum = new TH2I(*ch2dSum);
1303 fListHist->Add(ich2dSum);
1308 if(iph2dSum) iph2dSum->Add(ph2dSum);
1310 iph2dSum = new TProfile2D(*ph2dSum);
1311 fListHist->Add(iph2dSum);
1316 if(ich2dSM) ich2dSM->Add(ch2dSM);
1318 ich2dSM = new TH2I(*ch2dSM);
1319 fListHist->Add(ich2dSM);
1324 if(iph2dSM) iph2dSM->Add(ph2dSM);
1326 iph2dSM = new TProfile2D(*ph2dSM);
1327 fListHist->Add(iph2dSM);
1332 if(ilinearfit) ilinearfit->Add(linearfit);
1334 ilinearfit = new AliTRDCalibraVdriftLinearFit(*linearfit);
1335 fListHist->Add(ilinearfit);
1340 if(icalibraVector) icalibraVector->Add(calibraVector);
1342 icalibraVector = new AliTRDCalibraVector(*calibraVector);
1343 fListHist->Add(icalibraVector);
1348 //________________________________________________________________________________
1349 Long64_t AliTRDCalibTask::Merge(TCollection *li) {
1355 TIterator* iter = li->MakeIterator();
1356 AliTRDCalibTask* cal = 0;
1358 while ((cal = (AliTRDCalibTask*)iter->Next())) {
1359 if (!cal->InheritsFrom(AliTRDCalibTask::Class())) {
1360 Error("Merge","Attempt to add object of class %s to a %s", cal->ClassName(), this->ClassName());
1364 // add histograms here...
1372 //_____________________________________________________
1373 Bool_t AliTRDCalibTask::SetVersionSubversion(){
1375 // Load Chamber Gain factors into the Tender supply
1378 printf("SetVersionSubversion\n");
1380 //find previous entry from the UserInfo
1381 TTree *tree=((TChain*)GetInputData(0))->GetTree();
1383 AliError("Tree not found in ESDhandler");
1387 TList *userInfo=(TList*)tree->GetUserInfo();
1389 AliError("No UserInfo found in tree");
1393 TList *cdbList=(TList*)userInfo->FindObject("cdbList");
1395 AliError("No cdbList found in UserInfo");
1396 if (AliLog::GetGlobalLogLevel()>=AliLog::kError) userInfo->Print();
1400 TIter nextCDB(cdbList);
1402 while ( (os=(TObjString*)nextCDB()) ){
1403 if(os->GetString().Contains("TRD/Calib/ChamberGainFactor")){
1404 // Get Old gain calibration
1405 AliCDBId *id=AliCDBId::MakeFromString(os->GetString());
1406 fVersionGainUsed = id->GetVersion();
1407 fSubVersionGainUsed = id->GetSubVersion();
1408 } else if(os->GetString().Contains("TRD/Calib/ChamberVdrift")){
1409 // Get Old drift velocity calibration
1410 AliCDBId *id=AliCDBId::MakeFromString(os->GetString());
1411 fVersionVdriftUsed = id->GetVersion();
1412 fSubVersionVdriftUsed = id->GetSubVersion();
1413 } else if(os->GetString().Contains("TRD/Calib/LocalGainFactor")){
1414 // Get Old drift velocity calibration
1415 AliCDBId *id=AliCDBId::MakeFromString(os->GetString());
1416 fVersionGainLocalUsed = id->GetVersion();
1417 fSubVersionGainLocalUsed = id->GetSubVersion();
1421 //printf("VersionGain %d, SubversionGain %d, VersionLocalGain %d, Subversionlocalgain %d, Versionvdrift %d, Subversionvdrift %d\n",fVersionGainUsed,fSubVersionGainUsed,fVersionGainLocalUsed,fSubVersionGainLocalUsed,fVersionVdriftUsed,fSubVersionVdriftUsed);
1424 if((fVersionGainUsed < 0) || (fVersionGainLocalUsed < 0) || (fSubVersionGainUsed < 0) || (fSubVersionGainLocalUsed < 0) || (fVersionVdriftUsed < 0) || (fSubVersionVdriftUsed < 0)) {
1425 AliError("No recent calibration found");