2 // This class is the task to check the
3 // Propagation and Update method used in the
4 // 1. AliExternalTrackParam
7 // Pure Monte-Carlo data used, not influence of detectors
9 // Input - TParticle + Array of track references - (Points alogn track trajectories)
10 // Output - Trees with track references - no histograms
11 // MC tree - test for material budget correction
12 // see function ProcessRefTracker
13 // MCupdate tree - test for correctness of propagation and update
14 // see function AliMCTrackingTestTask::FitTrackRefs
16 // Principle - Creates AliExternalTrackParam form 1 Track Refernece -
17 // Propagate it to other
18 // Magnetic field and the geometry has to be created before using it
34 #include <TTreeStream.h>
35 #include <AliAnalysisManager.h>
36 #include <AliESDInputHandler.h>
38 #include "AliMCEvent.h"
39 #include "AliMCEventHandler.h"
42 #include "AliTrackComparison.h"
43 #include "AliMCTrackingTestTask.h"
44 #include "AliGenInfoMaker.h"
46 #include "AliTrackPointArray.h"
47 #include "AliESDCaloCluster.h"
50 #include "AliMCInfo.h"
51 #include "AliComparisonObject.h"
52 #include "AliESDRecInfo.h"
53 #include "AliTPCParamSR.h"
54 #include "AliTracker.h"
55 #include "AliTPCseed.h"
57 #include "AliCDBManager.h"
58 #include "AliGRPManager.h"
59 #include "AliGeomManager.h"
66 ClassImp(AliMCTrackingTestTask)
68 #define USE_STREAMER 0
71 //________________________________________________________________________
72 AliMCTrackingTestTask::AliMCTrackingTestTask() :
74 fMCinfo(0), //! MC event handler
86 // Default constructor (should not be used)
90 AliMCTrackingTestTask::AliMCTrackingTestTask(const AliMCTrackingTestTask& /*info*/) :
92 fMCinfo(0), //! MC event handler
104 // Default constructor
110 //________________________________________________________________________
111 AliMCTrackingTestTask::AliMCTrackingTestTask(const char *name) :
112 AliAnalysisTask(name, "AliMCTrackingTestTask"),
113 fMCinfo(0), //! MC event handler
125 // Normal constructor
127 // Input slot #0 works with a TChain
128 DefineInput(0, TChain::Class());
129 DefineOutput(0, TList::Class());
131 // create the list for comparison objects
132 fCompList = new TList;
137 AliMCTrackingTestTask::~AliMCTrackingTestTask(){
141 if (fDebugLevel>0) printf("AliMCTrackingTestTask::~AliMCTrackingTestTask\n");
142 if (fDebugStreamer) delete fDebugStreamer;
144 if (fOutList) delete fOutList; fOutList = 0;
145 if (fCompList) delete fCompList; fCompList = 0;
149 //_____________________________________________________________________________
150 Bool_t AliMCTrackingTestTask::AddComparisonObject(AliTrackComparison *cObj)
152 // add comparison object to the list
154 Printf("ERROR: Could not add comparison object");
158 // add object to the list
159 fCompList->AddLast(cObj);
163 //________________________________________________________________________
164 void AliMCTrackingTestTask::ConnectInputData(Option_t *)
167 // Connect the input data
170 cout << "AnalysisTaskTPCCluster::ConnectInputData()" << endl;
172 TTree* tree=dynamic_cast<TTree*>(GetInputData(0));
174 //Printf("ERROR: Could not read chain from input slot 0");
177 AliESDInputHandler *esdH = dynamic_cast<AliESDInputHandler*> (AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler());
179 //Printf("ERROR: Could not get ESDInputHandler");
182 fESD = esdH->GetEvent();
183 //Printf("*** CONNECTED NEW EVENT ****");
186 AliMCEventHandler* mcinfo = (AliMCEventHandler*) (AliAnalysisManager::GetAnalysisManager()->GetMCtruthEventHandler());
187 mcinfo->SetReadTR(kTRUE);
189 fMCinfo = mcinfo->MCEvent();
192 //________________________________________________________________________
193 void AliMCTrackingTestTask::CreateOutputObjects()
196 // Connect the output objects
199 cout << "AnalysisTaskTPCCluster::CreateOutputObjects()" << endl;
202 fOutList = new TList;
203 fOutList->SetOwner(kTRUE);
204 fPitList = fOutList->MakeIterator();
206 // create output list
208 // add comparison objects to the output
209 AliTrackComparison *cObj=0;
211 TIterator *pitCompList = fCompList->MakeIterator();
212 pitCompList->Reset();
213 while(( cObj = (AliTrackComparison*)pitCompList->Next()) != NULL) {
217 Printf("UserCreateOutputObjects(): Number of output comparison objects: %d \n", count);
219 PostData(0, fOutList);
223 //________________________________________________________________________
224 void AliMCTrackingTestTask::Exec(Option_t *) {
226 // Execute analysis for current event
230 printf("New event!\n");
234 cout << "AliMCTrackingTestTask::Exec()" << endl;
238 // If MC has been connected
240 cout << "Not MC info\n" << endl;
247 PostData(0, fOutList);
251 //________________________________________________________________________
252 void AliMCTrackingTestTask::Terminate(Option_t *) {
257 printf("AliMCTrackingTestTask: Terminate() \n");
259 if (fDebugLevel>0) printf("AliMCtrackingTestTask::Terminate\n");
260 if (fDebugStreamer) delete fDebugStreamer;
263 // AliTrackComparison *cObj=0;
264 // TIterator *pitCompList = fCompList->MakeIterator();
265 // pitCompList->Reset();
266 // while(( cObj = (AliTrackComparison*)pitCompList->Next()) != NULL) {
267 // for(Int_t i=0; i<6; i++)
268 // cObj->MakeDistortionMap(438,i);
275 //________________________________________________________________________
276 TTreeSRedirector *AliMCTrackingTestTask::GetDebugStreamer(){
278 // Get Debug streamer
279 // In case debug streamer not yet initialized and StreamLevel>0 create new one
281 if (fStreamLevel==0) return 0;
282 if (fDebugStreamer) return fDebugStreamer;
285 dsName+="Debug.root";
287 printf(" get debug streamer \n");
289 dsName.ReplaceAll(" ","");
290 fDebugStreamer = new TTreeSRedirector(dsName.Data());
291 return fDebugStreamer;
294 //________________________________________________________________________
295 AliExternalTrackParam * AliMCTrackingTestTask::MakeTrack(const AliTrackReference* ref, TParticle*part)
298 // Make track out of the track ref
299 // part - TParticle used to determine chargr
300 // the covariance matrix - equal 0 - starting from ideal MC position
301 if (!ref) return 0x0;
302 if (!part) return 0x0;
303 Double_t xyz[3]={ref->X(),ref->Y(),ref->Z()};
304 Double_t pxyz[3]={ref->Px(),ref->Py(),ref->Pz()};
306 for (Int_t i=0; i<21;i++) cv[i]=0;
307 if (!part->GetPDG()) return 0;
308 AliExternalTrackParam * param = new AliExternalTrackParam(xyz,pxyz,cv,TMath::Nint(part->GetPDG()->Charge()/3.));
312 //________________________________________________________________________
313 Bool_t AliMCTrackingTestTask::PropagateToPoint(AliExternalTrackParam *param, Double_t *xyz, Double_t mass, Float_t step){
315 // Propagate track to point xyz using
316 // AliTracker::PropagateToBxByBz functionality
318 // param - track parameters
319 // xyz - position to propagate
320 // mass - particle mass
321 // step - step to be used
322 Double_t radius=TMath::Sqrt(xyz[0]*xyz[0]+xyz[1]*xyz[1]);
323 Double_t alpha = TMath::ATan2(xyz[1],xyz[0]);
325 AliTracker::PropagateTrackToBxByBz(param, radius+step, mass, step, kTRUE,0.99,-1);
326 param->Rotate(alpha);
327 Bool_t isOK = param->PropagateTo(radius,AliTracker::GetBz());
332 //________________________________________________________________________
333 void AliMCTrackingTestTask::ProcessMCInfo(){
339 printf("ProcessMCInfo\n");
342 const AliESDVertex *pVertex = fESD->GetPrimaryVertex();
343 if(!pVertex) AliError("No primary vertex found!\n");
345 pVertex->GetXYZ(vPos);
347 TParticle * particle= new TParticle();
348 TClonesArray * trefs = new TClonesArray("AliTrackReference");
349 const Double_t kPcut=0.1;
354 Int_t npart = fMCinfo->GetNumberOfTracks();
355 if (npart==0) return;
356 Double_t vertex[4]={0,0,0,0};
357 fMCinfo->GetParticleAndTR(0, particle, trefs);
359 vertex[0]=particle->Vx();
360 vertex[1]=particle->Vy();
361 vertex[2]=particle->Vz();
362 vertex[3]=particle->R();
368 for (Int_t ipart=0;ipart<npart;ipart++){
369 Int_t status = fMCinfo->GetParticleAndTR(ipart, particle, trefs);
370 if (status<0 || !particle || !trefs) continue;
371 Int_t nref = trefs->GetEntries();
372 if (nref<5) continue;
373 FitTrackRefs(particle,trefs);
375 AliTrackReference * tpcIn=0;
376 AliTrackReference * tpcOut=0;
377 AliTrackReference * trdIn=0;
378 AliTrackReference * trdOut=0;
379 AliTrackReference * itsIn=0;
380 AliTrackReference * itsOut=0;
382 AliTrackReference * tofIn=0;
383 AliTrackReference * tofOut=0;
384 AliTrackReference * hmpidIn=0;
385 AliTrackReference * hmpidOut=0;
386 AliTrackReference * emcalIn=0;
387 AliTrackReference * emcalOut=0;
391 for (Int_t iref=0;iref<nref;iref++){
392 AliTrackReference * ref = (AliTrackReference*)trefs->At(iref);
395 Float_t dir = ref->X()*ref->Px()+ref->Y()*ref->Py();
397 if (dir<0) break; // oposite direction - looping track - return back
398 if (ref->P()<kPcut) continue;
399 if (ref->R()<rmax) break;
400 //if (ref->R()<rmin) break;
402 if (ref->DetectorId()==AliTrackReference::kTPC){
406 if (ref->R()>tpcIn->R()) tpcOut = ref;
410 if (ref->DetectorId()==AliTrackReference::kITS){
414 if (ref->R()>itsIn->R()) itsOut = ref;
418 if (ref->DetectorId()==AliTrackReference::kTRD){
422 if (ref->R()>trdIn->R()) trdOut = ref;
426 if (ref->DetectorId()==AliTrackReference::kTOF){
430 if (ref->R()>tofIn->R()) tofOut = ref;
435 if (ref->DetectorId()==AliTrackReference::kHMPID){
439 if (ref->R()>hmpidIn->R()) hmpidOut = ref;
445 if (ref->DetectorId()==AliTrackReference::kEMCAL){
449 if (ref->R()>emcalIn->R()) emcalOut = ref;
453 if (ref->R()<rmin) rmin=ref->R();
454 if (ref->R()>rmax) rmax=ref->R();
457 // -----------------------------------------------
461 if ( TMath::Abs(particle->GetPdgCode()) == 11 ) {
464 if (IsFindable(ipart,70)) {
466 // is from gamma conversion
467 Int_t motherId = particle->GetFirstMother();
469 if (motherId < npart) {
470 TParticle* mother = (fMCinfo->Stack())->Particle(motherId);
471 if (mother && TMath::Abs(mother->GetPdgCode()) == 22) {
472 Int_t nDaughters = mother->GetNDaughters();
474 for (Int_t idx=0; idx<nDaughters; ++idx) {
475 Int_t daughterId = mother->GetDaughter(idx);
476 if ( daughterId == ipart || daughterId >= npart )
479 TParticle* daughter = (fMCinfo->Stack())->Particle(daughterId);
480 if (daughter && TMath::Abs(daughter->GetPdgCode()) == 11) {
481 //Bool_t findable = IsFindable(daughterId,70);
483 TTreeSRedirector *pcstream = GetDebugStreamer();
485 (*pcstream)<<"MCgamma"<<
486 "triggerP="<<particle<< // trigger electron
487 "motherP="<<mother<< // mother gamma
488 "daughterP="<<daughter<< // daughter electron
489 "isFindable="<<findable<< // 2nd is findable
501 // -----------------------------------------------
502 if (tpcIn && tpcOut) {
503 ProcessRefTracker(tpcIn,tpcOut,particle,1);
504 ProcessRefTracker(tpcIn,tpcOut,particle,3);
506 if (itsIn && itsOut) ProcessRefTracker(itsIn, itsOut, particle, 0);
507 if (trdIn && trdOut) ProcessRefTracker(trdIn, trdOut, particle, 2);
509 if (tpcOut && trdIn) ProcessRefTracker(tpcOut,trdIn, particle, 4);
510 if (tpcOut && tofIn) ProcessRefTracker(tpcOut,tofIn, particle, 5);
511 if (tpcOut && hmpidIn) ProcessRefTracker(tpcOut,hmpidIn,particle, 6);
512 if (tpcOut && emcalIn) ProcessRefTracker(tpcOut,emcalIn,particle, 7);
514 if (tpcOut && trdOut) ProcessRefTracker(tpcOut,trdOut, particle, 8);
515 if (trdIn && tofIn) ProcessRefTracker(trdIn, tofIn, particle, 9);
516 if (tofIn && tofOut) ProcessRefTracker(tofIn, tofOut, particle,10);
519 // -----------------------------------------------
520 //Test for new base tracking class
522 AliTrackComparison *cObj=0;
523 AliTrackPoint *point=new AliTrackPoint();
524 AliESDCaloCluster *cluster=0;
525 AliExternalTrackParam *tpcOuter=0;
530 for(Int_t iCluster=0; iCluster<fESD->GetNumberOfCaloClusters(); iCluster++)
532 cluster = fESD->GetCaloCluster(iCluster);
533 if(!cluster->IsEMCAL()) continue;
534 if(cluster->GetLabel()==ipart && cluster->E()>eMax)
543 if(cluster) cluster=0;
544 cluster = fESD->GetCaloCluster(clsIndex);
545 Float_t clusterPos[3];
546 cluster->GetPosition(clusterPos);
547 point->SetXYZ(clusterPos[0],clusterPos[1],clusterPos[2],0);
551 tpcOuter = MakeTrack(tpcOut,particle);
554 Double_t mass = particle->GetMass();
555 Int_t charge = TMath::Nint(particle->GetPDG()->Charge()/3.);
557 while(( cObj = (AliTrackComparison *)fPitList->Next()) != NULL) {
558 TString objName(cObj->GetName());
559 if(!objName.CompareTo("TPCOutToEMCalInElecCls"))
561 if(TMath::Abs(particle->GetPdgCode())==11 && tpcOuter && point && cluster && emcalIn)
563 printf("\n\nTPCOutToEMCalInElecCls: ");
564 cout<<cObj->AddTracks(tpcOuter,point,mass,cluster->E(),vPos)<<endl;
568 if(!objName.CompareTo("TPCOutToEMCalInElec"))
570 if(TMath::Abs(particle->GetPdgCode())==11 && tpcOut && emcalIn)
572 printf("TPCOutToEMCalInElec: ");
573 cout<<cObj->AddTracks(tpcOut,emcalIn,mass,charge)<<endl;
577 if(!objName.CompareTo("TPCOutToEMCalInPion"))
579 if(TMath::Abs(particle->GetPdgCode())==211 && tpcOut && emcalIn)
580 cObj->AddTracks(tpcOut,emcalIn,mass,charge);
583 if(!objName.CompareTo("TPCOutToTOFIn"))
586 cObj->AddTracks(tpcOut,tofIn,mass,charge);
589 if(!objName.CompareTo("TPCOutToHMPIDIn"))
591 if(tpcOut && hmpidIn)
592 cObj->AddTracks(tpcOut,hmpidIn,mass,charge);
595 //End of the test for new base tracking class
596 // -----------------------------------------------
601 if (trefs) trefs->Clear("C");
607 void AliMCTrackingTestTask::ProcessRefTracker(AliTrackReference* refIn, AliTrackReference* refOut, TParticle*part,Int_t type){
609 // Test propagation from In to out
613 printf("ProcessRefTracker\n");
616 AliExternalTrackParam *param = 0;
617 AliExternalTrackParam *paramMC = 0;
618 AliExternalTrackParam *paramDebug = 0;
620 // Double_t xyzIn[3]={refIn->X(),refIn->Y(), refIn->Z()};
621 Double_t xyzOut[3]={refOut->X(),refOut->Y(), refOut->Z()};
622 Double_t mass = part->GetMass();
625 param=MakeTrack(refIn,part);
626 paramMC=MakeTrack(refOut,part);
627 paramDebug=MakeTrack(refIn,part);
630 if (type!=3) PropagateToPoint(param,xyzOut, mass, step);
636 seed.Set(param->GetX(),param->GetAlpha(),param->GetParameter(),param->GetCovariance());
637 Float_t alpha= TMath::ATan2(refIn->Y(),refIn->X());
638 seed.Rotate(alpha-seed.GetAlpha());
640 for (Float_t xlayer= seed.GetX(); xlayer<refOut->R(); xlayer+=step){
641 seed.PropagateTo(xlayer);
643 seed.PropagateTo(refOut->R());
644 param->Set(seed.GetX(),seed.GetAlpha(),seed.GetParameter(),seed.GetCovariance());
649 TTreeSRedirector *pcstream = GetDebugStreamer();
653 isOK&=param->Rotate(paramMC->GetAlpha());
654 isOK&=param->PropagateTo(paramMC->GetX(),AliTracker::GetBz());
655 param->GetXYZ(gpos.GetMatrixArray());
656 param->GetPxPyPz(gmom.GetMatrixArray());
660 "type="<<type<< // detector matching type
661 "step="<<step<< // propagation step length
662 "refIn.="<<refIn<< // starting track refernce
663 "refOut.="<<refOut<< // outer track reference
664 "p.="<<part<< // particle desription (TParticle)
665 "par.="<<param<< // AliExternalTrackParam create at starting point propagated to outer track ref radius
666 "parMC.="<<paramMC<< // AliExternalTrackParam created at the outer point
667 "gpos.="<<&gpos<< // global position
668 "gmom.="<<&gmom<< // global momenta
678 Bool_t AliMCTrackingTestTask::IsFindable(Int_t label, Float_t minTrackLength ) {
680 // Find findable tracks
683 AliMCParticle *mcParticle = (AliMCParticle*) fMCinfo->GetTrack(label);
684 if(!mcParticle) return kFALSE;
687 Float_t tpcTrackLength = mcParticle->GetTPCTrackLength(AliTracker::GetBz(),0.05,counter,3.0);
688 //printf("tpcTrackLength %f \n", tpcTrackLength);
690 return (tpcTrackLength>minTrackLength);
694 void AliMCTrackingTestTask::FitTrackRefs(TParticle * part, TClonesArray * trefs){
701 printf("FitTrackRefs\n");
705 const Int_t kMinRefs=6;
706 Int_t nrefs = trefs->GetEntries();
707 if (nrefs<kMinRefs) return; // we should have enough references
711 for (Int_t iref=0; iref<nrefs; iref++){
712 AliTrackReference * ref = (AliTrackReference*)trefs->At(iref);
714 Float_t dir = ref->X()*ref->Px()+ref->Y()*ref->Py();
716 if (ref->DetectorId()!=AliTrackReference::kTPC) continue;
717 if (iref0<0) iref0 = iref;
720 if (iref1-iref0<kMinRefs) return;
722 for (Int_t icov=0; icov<15; icov++) covar[icov]=0;
729 AliTrackReference * refIn = (AliTrackReference*)trefs->At(iref0);
730 //AliTrackReference * refOut = (AliTrackReference*)trefs->At(iref1);
731 AliExternalTrackParam *paramPropagate= MakeTrack(refIn,part);
732 AliExternalTrackParam *paramUpdate = MakeTrack(refIn,part);
733 paramUpdate->AddCovariance(covar);
734 //Double_t mass = part->GetMass();
735 //Double_t charge = part->GetPDG()->Charge()/3.;
737 Float_t alphaIn= TMath::ATan2(refIn->Y(),refIn->X());
738 Float_t radiusIn= refIn->R();
739 Float_t alphaOut= TMath::ATan2(refOut->Y(),refOut->X());
740 Float_t radiusOut= refOut->R();
744 AliMagF * field = (AliMagF*) TGeoGlobalMagField::Instance()->GetField();
745 for (Int_t iref = iref0; iref<=iref1; iref++){
746 AliTrackReference * ref = (AliTrackReference*)trefs->At(iref);
747 Float_t alphaC= TMath::ATan2(ref->Y(),ref->X());
748 Double_t pos[3] = {ref->X(), ref->Y(), ref->Z()};
750 field->Field(pos,mag);
751 isOKP&=paramPropagate->Rotate(alphaC);
752 isOKU&=paramUpdate->Rotate(alphaC);
753 for (Float_t xref= paramPropagate->GetX(); xref<ref->R(); xref++){
754 isOKP&=paramPropagate->PropagateTo(xref, mag[2]);
755 isOKU&=paramUpdate->PropagateTo(xref, mag[2]);
757 isOKP&=paramPropagate->PropagateTo(ref->R(), mag[2]);
758 isOKU&=paramUpdate->PropagateTo(ref->R(), mag[2]);
759 Double_t clpos[2] = {0, ref->Z()};
760 Double_t clcov[3] = { 0.005,0,0.005};
761 isOKU&= paramUpdate->Update(clpos, clcov);
764 TTreeSRedirector *pcstream = GetDebugStreamer();
770 paramUpdate->GetXYZ(gposU.GetMatrixArray());
771 paramUpdate->GetPxPyPz(gmomU.GetMatrixArray());
772 paramPropagate->GetXYZ(gposP.GetMatrixArray());
773 paramPropagate->GetPxPyPz(gmomP.GetMatrixArray());
775 (*pcstream)<<"MCupdate"<<
783 "pP.="<<paramPropagate<<
784 "pU.="<<paramUpdate<<
792 delete paramPropagate;
799 void AliMCTrackingTestTask::FinishTaskOutput()
802 // According description in AliAnalisysTask this method is call
803 // on the slaves before sending data
806 gSystem->Exec("pwd");
807 RegisterDebugOutput();
812 void AliMCTrackingTestTask::RegisterDebugOutput(){
817 // store - copy debug output to the destination position
818 // currently ONLY for local copy
821 dsName+="Debug.root";
822 dsName.ReplaceAll(" ","");
823 TString dsName2=fDebugOutputPath.Data();
824 gSystem->MakeDirectory(dsName2.Data());
825 dsName2+=gSystem->HostName();
826 gSystem->MakeDirectory(dsName2.Data());
828 dsName2+=gSystem->BaseName(gSystem->pwd());
830 gSystem->MakeDirectory(dsName2.Data());
832 AliInfo(Form("copy %s\t%s\n",dsName.Data(),dsName2.Data()));
833 printf("copy %s\t%s\n",dsName.Data(),dsName2.Data());
834 TFile::Cp(dsName.Data(),dsName2.Data());
839 gSystem->AddIncludePath("-I$ALICE_ROOT/TPC/macros");
840 gROOT->LoadMacro("$ALICE_ROOT/TPC/macros/AliXRDPROOFtoolkit.cxx+")
841 AliXRDPROOFtoolkit tool;
842 TChain * chain = tool.MakeChain("mctracking.txt","MC",0,100);
846 chain->SetAlias("pdg","(p.fPdgCode)");
847 chain->SetAlias("dPRec","(refOut.P()-par.P())/refIn.P()");
848 chain->SetAlias("dPMC","(refOut.P()-refIn.P())/refIn->P()");
849 chain->SetAlias("dPtRec","(refOut.Pt()-par.Pt())/refIn.Pt()");
850 chain->SetAlias("dPtMC","(refOut.Pt()-refIn.Pt())/refIn->Pt()");
854 chain->Draw("-sqrt(dPRec):-sqrt(dPMC)","abs(pdg)!=11&&type==0&&p.Pt()<0.5&&abs(p.R())<1&&abs(refOut.fZ)<220");
855 htemp->SetYTitle("#sqrt{#DeltaP_{rec}/P}");
856 htemp->SetXTitle("#sqrt{#DeltaP_{mc}/P}");
857 gPad->SaveAs("picLoss/dPcorr_ITS_step1.gif");
858 gPad->SaveAs("picLoss/dPcorr_ITS_step1.eps");
860 chain->Draw("-sqrt(dPRec):-sqrt(dPMC)","abs(pdg)!=11&&type==1&&p.Pt()<0.5&&abs(p.R())<1&&abs(refOut.fZ)<220");
861 htemp->SetYTitle("#sqrt{#DeltaP_{rec}/P}");
862 htemp->SetXTitle("#sqrt{#DeltaP_{mc}/P}");
863 gPad->SaveAs("picLoss/dPcorr_TPC_step1.gif");
864 gPad->SaveAs("picLoss/dPcorr_TPC_step1.eps");
867 chain->Draw("-sqrt(dPRec):-sqrt(dPMC)","abs(pdg)!=11&&type==3&&p.Pt()<0.5&&abs(p.R())<1&&abs(refOut.fZ)<220");
868 htemp->SetYTitle("#sqrt{#DeltaP_{rec}/P}");
869 htemp->SetXTitle("#sqrt{#DeltaP_{mc}/P}");
870 gPad->SaveAs("picLoss/dPcorr_TPCseed_step1.gif");
871 gPad->SaveAs("picLoss/dPcorr_TPCseed_step1.eps");
875 chain->Draw("-sqrt(dPRec):-sqrt(dPMC)","abs(pdg)!=11&&type==2&&p.Pt()<0.5&&abs(p.R())<1&&abs(refOut.fZ)<220");
876 htemp->SetYTitle("#sqrt{#DeltaP_{rec}/P}");
877 htemp->SetXTitle("#sqrt{#DeltaP_{mc}/P}");
878 gPad->SaveAs("picLoss/dPcorr_TRD_step1.gif");
879 gPad->SaveAs("picLoss/dPcorr_TRD_step1.eps");
884 chain->Draw("(par.Pt()-refIn.Pt())/refIn.Pt()>>his(100,-0.02,0.02)","abs(pdg)!=11&&type==3&&p.Pt()<0.5&&abs(p.R())<1&&abs(refOut.fZ)<220");
885 his->SetXTitle("(P_{trec}-P_{tmc})/P_{tmc}");
886 gPad->SaveAs("picLoss/dPtcorr_TPCseed_step1_1D.eps");
887 gPad->SaveAs("picLoss/dPtcorr_TPCseed_step1_1D.gif");
889 chain->Draw("(par.P()-refIn.P())/refIn.P()>>his(100,-0.02,0.02)","abs(pdg)!=11&&type==3&&p.Pt()<0.5&&abs(p.R())<1&&abs(refOut.fZ)<220");
890 his->SetXTitle("(P_{rec}-P_{mc})/P_{mc}");
891 gPad->SaveAs("picLoss/dPcorr_TPCseed_step1_1D.eps");
892 gPad->SaveAs("picLoss/dPcorr_TPCseed_step1_1D.gif");