1 /**************************************************************************
2 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
4 * Author: The ALICE Off-line Project. *
5 * Contributors are mentioned in the code where appropriate. *
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 **************************************************************************/
17 Comments to be written here:
19 1. What do we calibrate.
21 Time dependence of gain and drift velocity in order to account for changes in: temperature, pressure, gas composition.
23 AliTPCcalibTime *calibTime = new AliTPCcalibTime("cosmicTime","cosmicTime",0, 1213.9e+06, 1213.96e+06, 0.04e+04, 0.04e+04);
25 2. How to interpret results
29 a) determine the required time range:
31 AliXRDPROOFtoolkit tool;
32 TChain * chain = tool.MakeChain("pass2.txt","esdTree",0,6000);
33 chain->Draw("GetTimeStamp()")
35 b) analyse calibration object on Proof in calibration train
37 AliTPCcalibTime *calibTime = new AliTPCcalibTime("cosmicTime","cosmicTime", StartTimeStamp, EndTimeStamp, IntegrationTimeVdrift);
41 gSystem->Load("libANALYSIS");
42 gSystem->Load("libTPCcalib");
44 TFile f("CalibObjects.root");
45 AliTPCcalibTime *cal = (AliTPCcalibTime *)f->Get("TPCCalib")->FindObject("calibTime");
46 cal->GetHistoDrift("all")->Projection(2,0)->Draw()
47 cal->GetFitDrift("all")->Draw("lp")
49 4. Analysis using debug streamers.
51 gSystem->AddIncludePath("-I$ALICE_ROOT/TPC/macros");
52 gROOT->LoadMacro("$ALICE_ROOT/TPC/macros/AliXRDPROOFtoolkit.cxx+")
53 AliXRDPROOFtoolkit tool;
54 TChain * chainTime = tool.MakeChain("time.txt","timeInfo",0,10200);
58 #include "Riostream.h"
64 #include "THnSparse.h"
72 #include "TGraphErrors.h"
75 #include "AliTPCclusterMI.h"
76 #include "AliTPCseed.h"
77 #include "AliESDVertex.h"
78 #include "AliESDEvent.h"
79 #include "AliESDfriend.h"
80 #include "AliESDInputHandler.h"
81 #include "AliAnalysisManager.h"
83 #include "AliTracker.h"
85 #include "AliTPCCalROC.h"
89 #include "AliTPCcalibTime.h"
91 #include "TTreeStream.h"
92 #include "AliTPCTracklet.h"
93 #include "TTimeStamp.h"
94 #include "AliTPCcalibDB.h"
95 #include "AliTPCcalibLaser.h"
96 #include "AliDCSSensorArray.h"
97 #include "AliDCSSensor.h"
99 ClassImp(AliTPCcalibTime)
102 AliTPCcalibTime::AliTPCcalibTime()
104 fLaser(0), // pointer to laser calibration
105 fDz(0), // current delta z
106 fCutMaxD(2), // maximal distance in rfi ditection
107 fCutMaxDz(20), // maximal distance in rfi ditection
108 fCutTheta(0.03), // maximal distan theta
109 fCutMinDir(-0.99), // direction vector products
111 fMapDz(0), //NEW! Tmap of V drifts for different triggers
124 // fBinsVdrift(fTimeBins,fPtBins,fVdriftBins),
125 // fXminVdrift(fTimeStart,fPtStart,fVdriftStart),
126 // fXmaxVdrift(fTimeEnd,fPtEnd,fVdriftEnd)
129 AliInfo("Default Constructor");
130 for (Int_t i=0;i<3;i++) {
131 fHistVdriftLaserA[i]=0;
132 fHistVdriftLaserC[i]=0;
134 for (Int_t i=0;i<5;i++) {
135 fCosmiMatchingHisto[i]=0;
140 AliTPCcalibTime::AliTPCcalibTime(const Text_t *name, const Text_t *title, UInt_t StartTime, UInt_t EndTime, Int_t deltaIntegrationTimeVdrift)
142 fLaser(0), // pointer to laser calibration
143 fDz(0), // current delta z
144 fCutMaxD(2), // maximal distance in rfi ditection
145 fCutMaxDz(20), // maximal distance in rfi ditection
146 fCutTheta(0.03), // maximal distan theta
147 fCutMinDir(-0.99), // direction vector products
149 fMapDz(0), //NEW! Tmap of V drifts for different triggers
166 for (Int_t i=0;i<3;i++) {
167 fHistVdriftLaserA[i]=0;
168 fHistVdriftLaserC[i]=0;
171 AliInfo("Non Default Constructor");
173 fTimeBins =(EndTime-StartTime)/deltaIntegrationTimeVdrift;
174 fTimeStart =StartTime; //(((TObjString*)(mapGRP->GetValue("fAliceStartTime")))->GetString()).Atoi();
175 fTimeEnd =EndTime; //(((TObjString*)(mapGRP->GetValue("fAliceStopTime")))->GetString()).Atoi();
180 fVdriftStart= -20.0/500.0;
181 fVdriftEnd = 20.0/500.0;
186 Int_t binsVdriftLaser[4] = {fTimeBins , fPtBins , fVdriftBins*20, fRunBins };
187 Double_t xminVdriftLaser[4] = {fTimeStart, fPtStart, fVdriftStart , fRunStart};
188 Double_t xmaxVdriftLaser[4] = {fTimeEnd , fPtEnd , fVdriftEnd , fRunEnd };
190 for (Int_t i=0;i<3;i++) {
191 fHistVdriftLaserA[i] = new THnSparseF("HistVdriftLaser","HistVdriftLaser;time;p/T ratio;Vdrift;run",4,binsVdriftLaser,xminVdriftLaser,xmaxVdriftLaser);
192 fHistVdriftLaserC[i] = new THnSparseF("HistVdriftLaser","HistVdriftLaser;time;p/T ratio;Vdrift;run",4,binsVdriftLaser,xminVdriftLaser,xmaxVdriftLaser);
194 fBinsVdrift[0] = fTimeBins;
195 fBinsVdrift[1] = fPtBins;
196 fBinsVdrift[2] = fVdriftBins;
197 fBinsVdrift[3] = fRunBins;
198 fXminVdrift[0] = fTimeStart;
199 fXminVdrift[1] = fPtStart;
200 fXminVdrift[2] = fVdriftStart;
201 fXminVdrift[3] = fRunStart;
202 fXmaxVdrift[0] = fTimeEnd;
203 fXmaxVdrift[1] = fPtEnd;
204 fXmaxVdrift[2] = fVdriftEnd;
205 fXmaxVdrift[3] = fRunEnd;
209 for (Int_t i=0;i<5;i++) {
210 fCosmiMatchingHisto[i]=new TH1F("Cosmics matching","Cosmics matching",100,0,0);
214 AliTPCcalibTime::~AliTPCcalibTime(){
218 for (Int_t i=0;i<3;i++){
219 delete fHistVdriftLaserA[i];
220 delete fHistVdriftLaserC[i];
225 for (Int_t i=0;i<5;i++) {
226 delete fCosmiMatchingHisto[i];
230 void AliTPCcalibTime::ResetCurrent(){
232 // reset current values
234 fDz=0; // current delta z
237 Bool_t AliTPCcalibTime::IsLaser(AliESDEvent *event){
238 return ((event->GetFiredTriggerClasses()).Contains("0LSR")==1);
241 void AliTPCcalibTime::Process(AliESDEvent *event){
243 if (event->GetNumberOfTracks()<2) return;
246 // if(IsLaser(event))
247 ProcessLaser (event);
249 ProcessCosmic(event);
252 void AliTPCcalibTime::ProcessLaser(AliESDEvent *event){
254 // Fit drift velocity using laser
257 const Int_t kMinTracks = 20; // minimal number of laser tracks
258 const Int_t kMinTracksSide = 10; // minimal number of tracks per side
259 const Float_t kMaxRMS = 0.1; // maximal RMS of tracks
260 const Float_t kMaxDeltaZ = 3.; // maximal deltaZ A-C side
261 const Float_t kMaxDeltaV = 0.01; // maximal deltaV A-C side
262 const Float_t kMaxDeltaY = 2.; // maximal deltaY A-C side
264 TCut cutRMS("sqrt(laserA.fElements[4])<0.1&&sqrt(laserC.fElements[4])<0.1");
265 TCut cutZ("abs(laserA.fElements[0]-laserC.fElements[0])<3");
266 TCut cutV("abs(laserA.fElements[1]-laserC.fElements[1])<0.01");
267 TCut cutY("abs(laserA.fElements[2]-laserC.fElements[2])<2");
268 TCut cutAll = cutRMS+cutZ+cutV+cutY;
270 if (event->GetNumberOfTracks()<kMinTracks) return;
272 if(!fLaser) fLaser = new AliTPCcalibLaser("laserTPC","laserTPC",kFALSE);
273 fLaser->Process(event);
274 if (fLaser->GetNtracks()<kMinTracks) return; // small amount of tracks cut
275 if (fLaser->fFitAside->GetNrows()==0) return; // no fit A side
276 if (fLaser->fFitCside->GetNrows()==0) return; // no fit C side
278 // debug streamer - activate stream level
279 // Use it for tuning of the cuts
282 printf("Trigger: %s\n",event->GetFiredTriggerClasses().Data());
284 TTreeSRedirector *cstream = GetDebugStreamer();
286 TTimeStamp tstamp(fTime);
287 Float_t valuePressure0 = AliTPCcalibDB::GetPressure(tstamp,fRun,0);
288 Float_t valuePressure1 = AliTPCcalibDB::GetPressure(tstamp,fRun,1);
289 Double_t ptrelative0 = AliTPCcalibDB::GetPTRelative(tstamp,fRun,0);
290 Double_t ptrelative1 = AliTPCcalibDB::GetPTRelative(tstamp,fRun,1);
291 Double_t temp0 = AliTPCcalibDB::GetTemperature(tstamp,fRun,0);
292 Double_t temp1 = AliTPCcalibDB::GetTemperature(tstamp,fRun,1);
293 TVectorD vecGoofie(20);
294 AliDCSSensorArray* goofieArray = AliTPCcalibDB::Instance()->GetGoofieSensors(fRun);
296 for (Int_t isensor=0; isensor<goofieArray->NumSensors();isensor++){
297 AliDCSSensor *gsensor = goofieArray->GetSensor(isensor);
298 if (gsensor) vecGoofie[isensor]=gsensor->GetValue(tstamp);
301 (*cstream)<<"laserInfo"<<
302 "run="<<fRun<< // run number
303 "event="<<fEvent<< // event number
304 "time="<<fTime<< // time stamp of event
305 "trigger="<<fTrigger<< // trigger
306 "mag="<<fMagF<< // magnetic field
307 // Environment values
308 "press0="<<valuePressure0<<
309 "press1="<<valuePressure1<<
310 "pt0="<<ptrelative0<<
311 "pt1="<<ptrelative1<<
314 "vecGoofie.=<<"<<&vecGoofie<<
316 "laserA.="<<fLaser->fFitAside<<
317 "laserC.="<<fLaser->fFitCside<<
318 "laserAC.="<<fLaser->fFitACside<<
319 "trigger="<<event->GetFiredTriggerClasses()<<
326 if ((*fLaser->fFitAside)[3] <kMinTracksSide) return; // enough tracks A side
327 if ((*fLaser->fFitCside)[3]<kMinTracksSide) return; // enough tracks C side
329 if (TMath::Abs((*fLaser->fFitAside)[0]-(*fLaser->fFitCside)[0])>kMaxDeltaZ) return;
330 if (TMath::Abs((*fLaser->fFitAside)[2]-(*fLaser->fFitCside)[2])>kMaxDeltaY) return;
331 if (TMath::Abs((*fLaser->fFitAside)[1]-(*fLaser->fFitCside)[1])>kMaxDeltaV) return;
332 if (TMath::Sqrt(TMath::Abs((*fLaser->fFitAside)[4]))>kMaxRMS) return;
333 if (TMath::Sqrt(TMath::Abs((*fLaser->fFitCside)[4]))>kMaxRMS) return;
337 TVectorD vdriftA(5), vdriftC(5),vdriftAC(5);
338 vdriftA=*(fLaser->fFitAside);
339 vdriftC=*(fLaser->fFitCside);
340 vdriftAC=*(fLaser->fFitACside);
341 Int_t npointsA=0, npointsC=0;
342 Float_t chi2A=0, chi2C=0;
343 npointsA= TMath::Nint(vdriftA[3]);
345 npointsC= TMath::Nint(vdriftC[3]);
348 TTimeStamp tstamp(fTime);
349 Double_t ptrelative0 = AliTPCcalibDB::GetPTRelative(tstamp,fRun,0);
350 Double_t ptrelative1 = AliTPCcalibDB::GetPTRelative(tstamp,fRun,1);
352 Double_t vecVdriftLaserA[4]={fTime,(ptrelative0+ptrelative1)/2.0,1./((*(fLaser->fFitAside))[1])-1,event->GetRunNumber()};
353 Double_t vecVdriftLaserC[4]={fTime,(ptrelative0+ptrelative1)/2.0,1./((*(fLaser->fFitCside))[1])-1,event->GetRunNumber()};
355 for (Int_t i=0;i<3;i++){
356 if (i==0){ //z0 shift
357 vecVdriftLaserA[3]=(*(fLaser->fFitAside))[0]/250.;
358 vecVdriftLaserA[3]=(*(fLaser->fFitCside))[0]/250.;
360 if (i==1){ //vdrel shift
361 vecVdriftLaserA[3]=1./(*(fLaser->fFitAside))[1]-1.;
362 vecVdriftLaserA[3]=1./(*(fLaser->fFitCside))[1]-1.;
364 if (i==2){ //gy shift - full gy - full drift
365 vecVdriftLaserA[3]=(*(fLaser->fFitAside))[2]/250.;
366 vecVdriftLaserA[3]=(*(fLaser->fFitCside))[2]/250.;
368 fHistVdriftLaserA[i]->Fill(vecVdriftLaserA);
369 fHistVdriftLaserC[i]->Fill(vecVdriftLaserC);
373 void AliTPCcalibTime::ProcessCosmic(AliESDEvent *event){
375 Printf("ERROR: ESD not available");
378 if (event->GetTimeStamp() == 0 ) {
379 Printf("no time stamp!");
386 // Track0 is choosen in upper TPC part
387 // Track1 is choosen in lower TPC part
389 Int_t ntracks=event->GetNumberOfTracks();
390 if (ntracks==0) return;
391 if (ntracks > fCutTracks) return;
393 if (GetDebugLevel()>1) printf("Hallo world: Im here\n");
394 AliESDfriend *ESDfriend=static_cast<AliESDfriend*>(event->FindListObject("AliESDfriend"));
396 TObjArray tpcSeeds(ntracks);
397 Double_t vtxx[3]={0,0,0};
398 Double_t svtxx[3]={0.000001,0.000001,100.};
399 AliESDVertex vtx(vtxx,svtxx);
403 for (Int_t i=0;i<ntracks;++i) {
404 AliESDtrack *track = event->GetTrack(i);
406 const AliExternalTrackParam * trackIn = track->GetInnerParam();
407 const AliExternalTrackParam * trackOut = track->GetOuterParam();
408 if (!trackIn) continue;
409 if (!trackOut) continue;
411 AliESDfriendTrack *friendTrack = ESDfriend->GetTrack(i);
412 TObject *calibObject;
413 AliTPCseed *seed = 0;
414 for (Int_t l=0;(calibObject=friendTrack->GetCalibObject(l));++l) if ((seed=dynamic_cast<AliTPCseed*>(calibObject))) break;
415 if (seed) tpcSeeds.AddAt(seed,i);
417 if (ntracks<2) return;
421 for (Int_t i=0;i<ntracks;++i) {
422 AliESDtrack *track0 = event->GetTrack(i);
423 // track0 - choosen upper part
424 if (!track0) continue;
425 if (!track0->GetOuterParam()) continue;
426 if (track0->GetOuterParam()->GetAlpha()<0) continue;
428 track0->GetDirection(d1);
429 for (Int_t j=0;j<ntracks;++j) {
431 AliESDtrack *track1 = event->GetTrack(j);
433 if (!track1) continue;
434 if (!track1->GetOuterParam()) continue;
435 if (track1->GetOuterParam()->GetAlpha()>0) continue;
438 track1->GetDirection(d2);
440 AliTPCseed * seed0 = (AliTPCseed*) tpcSeeds.At(i);
441 AliTPCseed * seed1 = (AliTPCseed*) tpcSeeds.At(j);
442 if (! seed0) continue;
443 if (! seed1) continue;
444 Float_t dir = (d1[0]*d2[0] + d1[1]*d2[1] + d1[2]*d2[2]);
445 Float_t dist0 = track0->GetLinearD(0,0);
446 Float_t dist1 = track1->GetLinearD(0,0);
448 // conservative cuts - convergence to be guarantied
449 // applying before track propagation
450 if (TMath::Abs(dist0+dist1)>fCutMaxD) continue; // distance to the 0,0
451 if (dir>fCutMinDir) continue; // direction vector product
452 Float_t bz = AliTracker::GetBz();
453 Float_t dvertex0[2]; //distance to 0,0
454 Float_t dvertex1[2]; //distance to 0,0
455 track0->GetDZ(0,0,0,bz,dvertex0);
456 track1->GetDZ(0,0,0,bz,dvertex1);
457 if (TMath::Abs(dvertex0[1])>250) continue;
458 if (TMath::Abs(dvertex1[1])>250) continue;
462 Float_t dmax = TMath::Max(TMath::Abs(dist0),TMath::Abs(dist1));
463 AliExternalTrackParam param0(*track0);
464 AliExternalTrackParam param1(*track1);
466 // Propagate using Magnetic field and correct fo material budget
468 AliTracker::PropagateTrackTo(¶m0,dmax+1,0.0005,3,kTRUE);
469 AliTracker::PropagateTrackTo(¶m1,dmax+1,0.0005,3,kTRUE);
471 // Propagate rest to the 0,0 DCA - z should be ignored
474 param0.PropagateToDCA(&vtx,bz,1000);
476 param1.PropagateToDCA(&vtx,bz,1000);
478 param0.GetDZ(0,0,0,bz,dvertex0);
479 param1.GetDZ(0,0,0,bz,dvertex1);
481 Double_t xyz0[3];//,pxyz0[3];
482 Double_t xyz1[3];//,pxyz1[3];
485 Bool_t isPair = IsPair(¶m0,¶m1);
487 Double_t z0 = track0->GetOuterParam()->GetZ();
488 Double_t z1 = track1->GetOuterParam()->GetZ();
490 Double_t z0inner = track0->GetInnerParam()->GetZ();
491 Double_t z1inner = track1->GetInnerParam()->GetZ();
493 if (isPair && z0>0 && z0inner>0 && z1<0 && z1inner<0) {
494 if (track0->GetTPCNcls() > 80) {
495 fDz = param0.GetZ() - param1.GetZ();
496 TTimeStamp tstamp(fTime);
497 Double_t ptrelative0 = AliTPCcalibDB::GetPTRelative(tstamp,fRun,0);
498 Double_t ptrelative1 = AliTPCcalibDB::GetPTRelative(tstamp,fRun,1);
499 Double_t vecVdrift[4]={fTime,(ptrelative0+ptrelative1)/2.0,fDz/500.0,event->GetRunNumber()};
500 THnSparse* curHist=0;
502 curHist=(THnSparseF*)(fMapDz->GetValue(event->GetFiredTriggerClasses()));
504 curHist=new THnSparseF(event->GetFiredTriggerClasses(),"HistVdrift;time;p/T ratio;Vdrift;run",4,fBinsVdrift,fXminVdrift,fXmaxVdrift);
505 fMapDz->Add(new TObjString(event->GetFiredTriggerClasses()),curHist);
507 curHist->Fill(vecVdrift);
509 curHist=(THnSparseF*)(fMapDz->GetValue("all"));
511 curHist=new THnSparseF("all","HistVdrift;time;p/T ratio;Vdrift;run",4,fBinsVdrift,fXminVdrift,fXmaxVdrift);
512 fMapDz->Add(new TObjString("all"),curHist);
514 curHist->Fill(vecVdrift);
517 } // end 2nd order loop
518 } // end 1st order loop
521 TTreeSRedirector *cstream = GetDebugStreamer();
523 TTimeStamp tstamp(fTime);
524 Float_t valuePressure0 = AliTPCcalibDB::GetPressure(tstamp,fRun,0);
525 Float_t valuePressure1 = AliTPCcalibDB::GetPressure(tstamp,fRun,1);
526 Double_t ptrelative0 = AliTPCcalibDB::GetPTRelative(tstamp,fRun,0);
527 Double_t ptrelative1 = AliTPCcalibDB::GetPTRelative(tstamp,fRun,1);
528 Double_t temp0 = AliTPCcalibDB::GetTemperature(tstamp,fRun,0);
529 Double_t temp1 = AliTPCcalibDB::GetTemperature(tstamp,fRun,1);
530 TVectorD vecGoofie(20);
531 AliDCSSensorArray* goofieArray = AliTPCcalibDB::Instance()->GetGoofieSensors(fRun);
533 for (Int_t isensor=0; isensor<goofieArray->NumSensors();isensor++){
534 AliDCSSensor *gsensor = goofieArray->GetSensor(isensor);
535 if (gsensor) vecGoofie[isensor]=gsensor->GetValue(tstamp);
538 (*cstream)<<"timeInfo"<<
539 "run="<<fRun<< // run number
540 "event="<<fEvent<< // event number
541 "time="<<fTime<< // time stamp of event
542 "trigger="<<fTrigger<< // trigger
543 "mag="<<fMagF<< // magnetic field
544 // Environment values
545 "press0="<<valuePressure0<<
546 "press1="<<valuePressure1<<
547 "pt0="<<ptrelative0<<
548 "pt1="<<ptrelative1<<
551 "vecGoofie.=<<"<<&vecGoofie<<
553 // accumulated values
555 "fDz="<<fDz<< //! current delta z
556 "trigger="<<event->GetFiredTriggerClasses()<<
560 printf("Trigger: %s\n",event->GetFiredTriggerClasses().Data());
563 void AliTPCcalibTime::Analyze(){}
565 THnSparse* AliTPCcalibTime::GetHistoDrift(TObjString* name){
566 return (THnSparseF*)(fMapDz->GetValue(name));
569 THnSparse* AliTPCcalibTime::GetHistoDrift(const char* name){
570 TObjString* objName=new TObjString(name);
571 THnSparse* histoDrift=0;
573 histoDrift=GetHistoDrift(objName);
580 TMap* AliTPCcalibTime::GetHistoDrift(){
584 TGraphErrors* AliTPCcalibTime::GetGraphDrift(TObjString* name){
585 THnSparse* histoDrift=GetHistoDrift(name);
586 TGraphErrors* graphDrift=0;
587 if(histoDrift) graphDrift=FitSlices(histoDrift,2,0,400,100,0.05,0.95, kTRUE);
591 TGraphErrors* AliTPCcalibTime::GetGraphDrift(const char* name){
592 TObjString* objName=new TObjString(name);
593 TGraphErrors* graphDrift=0;
595 graphDrift=GetGraphDrift(objName);
602 TMap* AliTPCcalibTime::GetGraphDrift(){
603 TMap* mapGraphDrift=new TMap();
604 TIterator* iterator=fMapDz->MakeIterator();
607 while((addPair=(TPair*)(fMapDz->FindObject(iterator->Next())))) mapGraphDrift->Add((TObjString*)addPair->Key(), GetGraphDrift((TObjString*)addPair->Key()));
608 return mapGraphDrift;
611 TGraph* AliTPCcalibTime::GetFitDrift(TObjString* name){
612 TGraphErrors* graphDrift=GetGraphDrift(name);
614 if(graphDrift && graphDrift->GetN()){
616 fit.SetGraph(graphDrift);
617 fit.SetMinPoints(graphDrift->GetN()+1);
618 fit.InitKnots(graphDrift,2,0,0.001);
620 fitDrift=fit.MakeGraph(graphDrift->GetX()[0],graphDrift->GetX()[graphDrift->GetN()-1],50000,0);
627 TGraph* AliTPCcalibTime::GetFitDrift(const char* name){
628 TObjString* objName=new TObjString(name);
631 fitDrift=GetFitDrift(objName);
638 TMap* AliTPCcalibTime::GetFitDrift(){
639 TMap* mapFitDrift=new TMap();
640 TIterator* iterator = fMapDz->MakeIterator();
643 while((addPair=(TPair*)(fMapDz->FindObject(iterator->Next())))) mapFitDrift->Add((TObjString*)addPair->Key(), GetFitDrift((TObjString*)addPair->Key()));
647 Long64_t AliTPCcalibTime::Merge(TCollection *li) {
649 TIterator* iter = li->MakeIterator();
650 AliTPCcalibTime* cal = 0;
652 while ((cal = (AliTPCcalibTime*)iter->Next())) {
653 if (!cal->InheritsFrom(AliTPCcalibTime::Class())) {
654 Error("Merge","Attempt to add object of class %s to a %s", cal->ClassName(), this->ClassName());
657 for (Int_t imeas=0; imeas<3; imeas++){
658 if (cal->GetHistVdriftLaserA(imeas) && cal->GetHistVdriftLaserA(imeas)){
659 fHistVdriftLaserA[imeas]->Add(cal->GetHistVdriftLaserA(imeas));
660 fHistVdriftLaserC[imeas]->Add(cal->GetHistVdriftLaserC(imeas));
663 TMap * addMap=cal->GetHistoDrift();
664 if(!addMap) return 0;
665 TIterator* iterator = addMap->MakeIterator();
668 while((addPair=(TPair *)(addMap->FindObject(iterator->Next())))){
669 THnSparse* addHist=dynamic_cast<THnSparseF*>(addPair->Value());
670 if (!addHist) continue;
672 THnSparse* localHist=dynamic_cast<THnSparseF*>(fMapDz->GetValue(addHist->GetName()));
674 localHist=new THnSparseF(addHist->GetName(),"HistVdrift;time;p/T ratio;Vdrift;run",4,fBinsVdrift,fXminVdrift,fXmaxVdrift);
675 fMapDz->Add(new TObjString(addHist->GetName()),localHist);
677 localHist->Add(addHist);
679 if (cal->GetCosmiMatchingHisto(0)) fCosmiMatchingHisto[0]->Add(cal->GetCosmiMatchingHisto(0));
680 if (cal->GetCosmiMatchingHisto(1)) fCosmiMatchingHisto[1]->Add(cal->GetCosmiMatchingHisto(1));
681 if (cal->GetCosmiMatchingHisto(2)) fCosmiMatchingHisto[2]->Add(cal->GetCosmiMatchingHisto(2));
682 if (cal->GetCosmiMatchingHisto(3)) fCosmiMatchingHisto[3]->Add(cal->GetCosmiMatchingHisto(3));
683 if (cal->GetCosmiMatchingHisto(4)) fCosmiMatchingHisto[4]->Add(cal->GetCosmiMatchingHisto(4));
688 Bool_t AliTPCcalibTime::IsPair(AliExternalTrackParam *tr0, AliExternalTrackParam *tr1){
690 // 0. Same direction - OPOSITE - cutDir +cutT
691 TCut cutDir("cutDir","dir<-0.99")
693 TCut cutT("cutT","abs(Tr1.fP[3]+Tr0.fP[3])<0.03")
696 TCut cutD("cutD","abs(Tr0.fP[0]+Tr1.fP[0])<5")
698 TCut cutPt("cutPt","abs(Tr1.fP[4]+Tr0.fP[4])<1&&abs(Tr0.fP[4])+abs(Tr1.fP[4])<10");
701 const Double_t *p0 = tr0->GetParameter();
702 const Double_t *p1 = tr1->GetParameter();
703 fCosmiMatchingHisto[0]->Fill(p0[0]+p1[0]);
704 fCosmiMatchingHisto[1]->Fill(p0[1]-p1[1]);
705 fCosmiMatchingHisto[2]->Fill(tr0->GetAlpha()+tr1->GetAlpha());
706 fCosmiMatchingHisto[3]->Fill(p0[3]+p1[3]);
707 fCosmiMatchingHisto[4]->Fill(p0[4]+p1[4]);
709 if (TMath::Abs(p0[3]+p1[3])>fCutTheta) return kFALSE;
710 if (TMath::Abs(p0[0]+p1[0])>fCutMaxD) return kFALSE;
711 if (TMath::Abs(p0[1]-p1[1])>fCutMaxDz) return kFALSE;
712 Double_t d0[3], d1[3];
713 tr0->GetDirection(d0);
714 tr1->GetDirection(d1);
715 if (d0[0]*d1[0] + d0[1]*d1[1] + d0[2]*d1[2] >fCutMinDir) return kFALSE;