#include "AliInputEventHandler.h"
#include "AliStack.h"
#include "AliTrackReference.h"
+#include "AliTrackPointArray.h"
+#include "AliSysInfo.h"
#include "AliPhysicsSelection.h"
#include "AliAnalysisTask.h"
, fLowPtV0DownscaligF(0)
, fProcessAll(kFALSE)
, fProcessCosmics(kFALSE)
+ , fProcessITSTPCmatchOut(kFALSE) // swittch to process ITS/TPC standalone tracks
, fHighPtTree(0)
, fV0Tree(0)
, fdEdxTree(0)
, fPtResEtaPtTPCITS(0)
, fPtResCentPtTPC(0)
, fPtResCentPtTPCc(0)
- , fPtResCentPtTPCITS(0)
+ , fPtResCentPtTPCITS(0)
+ , fDummyFriendTrack(0)
+ , fDummyTrack(0)
{
// Constructor
fMCEffTree = ((*fTreeSRedirector)<<"MCEffTree").GetTree();
fCosmicPairsTree = ((*fTreeSRedirector)<<"CosmicPairs").GetTree();
-
-
+ if (!fDummyFriendTrack)
+ {
+ fDummyFriendTrack=new AliESDfriendTrack();
+ fDummyFriendTrack->SetTrackPointArray(new AliTrackPointArray(164));
+ printf("just made a new dummy friend track!");
+ }
+ if (!fDummyTrack)
+ {
+ fDummyTrack=new AliESDtrack();
+ }
// histogram booking
if (fProcessCosmics) { ProcessCosmics(fESD,fESDfriend); }
if(fMC) { ProcessMCEff(fESD,fMC,fESDfriend);}
+ if (fProcessITSTPCmatchOut) ProcessITSTPCmatchOut(fESD, fESDfriend);
+ printf("processed event %d\n", Entry());
}
//_____________________________________________________________________________
//if (TMath::Abs(dcaTPC[0])<kMaxDelta[0]) continue;
//if (TMath::Abs(dcaTPC[1])<kMaxDelta[0]*2) continue;
// const AliExternalTrackParam * trackIn0 = track0->GetInnerParam();
- Bool_t newFriendTrack0=kFALSE;
AliESDfriendTrack* friendTrack0=NULL;
if (esdFriend) {if (!esdFriend->TestSkipBit()) friendTrack0 = esdFriend->GetTrack(itrack0);} //this guy can be NULL
- if (!friendTrack0) {friendTrack0=new AliESDfriendTrack(); newFriendTrack0=kTRUE;}
+ //Bool_t newFriendTrack0=kFALSE;
+ //if (!friendTrack0) {friendTrack0=new AliESDfriendTrack(); newFriendTrack0=kTRUE;}
+ if (!friendTrack0) {friendTrack0=fDummyFriendTrack;}
for (Int_t itrack1=itrack0+1;itrack1<ntracks;itrack1++) {
AliESDtrack *track1 = event->GetTrack(itrack1);
//
//fCosmicPairsTree->Fill();
- Bool_t newFriendTrack1=kFALSE;
AliESDfriendTrack* friendTrack1=NULL;
if (esdFriend) {if (!esdFriend->TestSkipBit()) friendTrack1 = esdFriend->GetTrack(itrack1);} //this guy can be NULL
- if (!friendTrack1) {friendTrack1=new AliESDfriendTrack(); newFriendTrack1=kTRUE;}
+ //Bool_t newFriendTrack1=kFALSE;
+ //if (!friendTrack1) {friendTrack1=new AliESDfriendTrack(); newFriendTrack1=kTRUE;}
+ if (!friendTrack1) {friendTrack1=fDummyFriendTrack;}
if(!fFillTree) return;
if(!fTreeSRedirector) return;
"friendTrack0.="<<friendTrack0<<
"friendTrack1.="<<friendTrack1<<
"\n";
- if (newFriendTrack1) {delete friendTrack1; friendTrack1=NULL;}
+ //if (newFriendTrack1) {delete friendTrack1; friendTrack1=NULL;}
}
- if (newFriendTrack0) {delete friendTrack0; friendTrack0=NULL;}
+ //if (newFriendTrack0) {delete friendTrack0; friendTrack0=NULL;}
}
}
if(track->GetTPCInnerParam()) countLaserTracks++;
- Bool_t newFriendTrack=kFALSE;
AliESDfriendTrack* friendTrack=NULL;
if (esdFriend) {if (!esdFriend->TestSkipBit()) friendTrack = esdFriend->GetTrack(iTrack);} //this guy can be NULL
- if (!friendTrack) {friendTrack=new AliESDfriendTrack(); newFriendTrack=kTRUE;}
+ //Bool_t newFriendTrack=kFALSE;
+ //if (!friendTrack) {friendTrack=new AliESDfriendTrack(); newFriendTrack=kTRUE;}
+ if (!friendTrack) {friendTrack=fDummyFriendTrack;}
(*fTreeSRedirector)<<"Laser"<<
"gid="<<gid<<
"multTPCtracks="<<countLaserTracks<<
"friendTrack.="<<friendTrack<<
"\n";
- if (newFriendTrack) {delete friendTrack; friendTrack=NULL;}
+ //if (newFriendTrack) {delete friendTrack; friendTrack=NULL;}
}
}
}
Int_t evtTimeStamp = esdEvent->GetTimeStamp();
Int_t evtNumberInFile = esdEvent->GetEventNumberInFile();
+ Int_t numberOfTracks=esdEvent->GetNumberOfTracks();
// high pT tracks
- for (Int_t iTrack = 0; iTrack < esdEvent->GetNumberOfTracks(); iTrack++)
+ for (Int_t iTrack = 0; iTrack < numberOfTracks; iTrack++)
{
AliESDtrack *track = esdEvent->GetTrack(iTrack);
AliESDfriendTrack* friendTrack=NULL;
- if (esdFriend) {if (!esdFriend->TestSkipBit()) friendTrack = esdFriend->GetTrack(iTrack);} //this guy can be NULL
+ Int_t numberOfFriendTracks=0;
+ if (esdFriend) numberOfFriendTracks=esdFriend->GetNumberOfTracks();
+ if (esdFriend && iTrack<numberOfFriendTracks) {if (!esdFriend->TestSkipBit()) friendTrack = esdFriend->GetTrack(iTrack);} //this guy can be NULL
if(!track) continue;
if(track->Charge()==0) continue;
if(!esdTrackCuts->AcceptTrack(track)) continue;
Bool_t isOKtrackInnerC3 = kFALSE;
AliExternalTrackParam *trackInnerC3 = new AliExternalTrackParam(*(track->GetInnerParam()));
- if(mcEvent)
+ if(mcEvent && stack)
{
- if(!stack) return;
- multMCTrueTracks = GetMCTrueTrackMult(mcEvent,evtCuts,accCuts);
- //
- // global track
- //
- Int_t label = TMath::Abs(track->GetLabel());
- if (label >= mcStackSize) continue;
- particle = stack->Particle(label);
- if (!particle) continue;
- if(particle && particle->GetPDG() && particle->GetPDG()->Charge()!=0.)
- {
- particleMother = GetMother(particle,stack);
- mech = particle->GetUniqueID();
- isPrim = stack->IsPhysicalPrimary(label);
- isFromStrangess = IsFromStrangeness(label,stack);
- isFromConversion = IsFromConversion(label,stack);
- isFromMaterial = IsFromMaterial(label,stack);
- }
-
- //
- // TPC track
- //
- Int_t labelTPC = TMath::Abs(track->GetTPCLabel());
- if (labelTPC >= mcStackSize) continue;
- particleTPC = stack->Particle(labelTPC);
- if (!particleTPC) continue;
- if(particleTPC && particleTPC->GetPDG() && particleTPC->GetPDG()->Charge()!=0.)
+ do //artificial loop (once) to make the continue statements jump out of the MC part
{
- particleMotherTPC = GetMother(particleTPC,stack);
- mechTPC = particleTPC->GetUniqueID();
- isPrimTPC = stack->IsPhysicalPrimary(labelTPC);
- isFromStrangessTPC = IsFromStrangeness(labelTPC,stack);
- isFromConversionTPC = IsFromConversion(labelTPC,stack);
- isFromMaterialTPC = IsFromMaterial(labelTPC,stack);
- }
+ multMCTrueTracks = GetMCTrueTrackMult(mcEvent,evtCuts,accCuts);
+ //
+ // global track
+ //
+ Int_t label = TMath::Abs(track->GetLabel());
+ if (label >= mcStackSize) continue;
+ particle = stack->Particle(label);
+ if (!particle) continue;
+ if(particle && particle->GetPDG() && particle->GetPDG()->Charge()!=0.)
+ {
+ particleMother = GetMother(particle,stack);
+ mech = particle->GetUniqueID();
+ isPrim = stack->IsPhysicalPrimary(label);
+ isFromStrangess = IsFromStrangeness(label,stack);
+ isFromConversion = IsFromConversion(label,stack);
+ isFromMaterial = IsFromMaterial(label,stack);
+ }
- //
- // store first track reference
- // for TPC track
- //
- TParticle *part=0;
- TClonesArray *trefs=0;
- Int_t status = mcEvent->GetParticleAndTR(TMath::Abs(labelTPC), part, trefs);
+ //
+ // TPC track
+ //
+ Int_t labelTPC = TMath::Abs(track->GetTPCLabel());
+ if (labelTPC >= mcStackSize) continue;
+ particleTPC = stack->Particle(labelTPC);
+ if (!particleTPC) continue;
+ if(particleTPC && particleTPC->GetPDG() && particleTPC->GetPDG()->Charge()!=0.)
+ {
+ particleMotherTPC = GetMother(particleTPC,stack);
+ mechTPC = particleTPC->GetUniqueID();
+ isPrimTPC = stack->IsPhysicalPrimary(labelTPC);
+ isFromStrangessTPC = IsFromStrangeness(labelTPC,stack);
+ isFromConversionTPC = IsFromConversion(labelTPC,stack);
+ isFromMaterialTPC = IsFromMaterial(labelTPC,stack);
+ }
- if(status>0 && part && trefs && part->GetPDG() && part->GetPDG()->Charge()!=0.)
- {
- Int_t nTrackRef = trefs->GetEntries();
- //printf("nTrackRef %d \n",nTrackRef);
+ //
+ // store first track reference
+ // for TPC track
+ //
+ TParticle *part=0;
+ TClonesArray *trefs=0;
+ Int_t status = mcEvent->GetParticleAndTR(TMath::Abs(labelTPC), part, trefs);
- Int_t countITS = 0;
- for (Int_t iref = 0; iref < nTrackRef; iref++)
+ if(status>0 && part && trefs && part->GetPDG() && part->GetPDG()->Charge()!=0.)
{
- AliTrackReference *ref = (AliTrackReference *)trefs->At(iref);
+ Int_t nTrackRef = trefs->GetEntries();
+ //printf("nTrackRef %d \n",nTrackRef);
- // Ref. in the middle ITS
- if(ref && ref->Label()==label && ref->DetectorId()==AliTrackReference::kITS)
+ Int_t countITS = 0;
+ for (Int_t iref = 0; iref < nTrackRef; iref++)
{
- nrefITS++;
- if(!refITS && countITS==2) {
- refITS = ref;
- //printf("refITS %p \n",refITS);
+ AliTrackReference *ref = (AliTrackReference *)trefs->At(iref);
+
+ // Ref. in the middle ITS
+ if(ref && ref->Label()==label && ref->DetectorId()==AliTrackReference::kITS)
+ {
+ nrefITS++;
+ if(!refITS && countITS==2) {
+ refITS = ref;
+ //printf("refITS %p \n",refITS);
+ }
+ countITS++;
}
- countITS++;
- }
- // TPC
- if(ref && ref->Label()==label && ref->DetectorId()==AliTrackReference::kTPC)
- {
- nrefTPC++;
- refTPCOut=ref;
- if(!refTPCIn) {
- refTPCIn = ref;
- //printf("refTPCIn %p \n",refTPCIn);
- //break;
+ // TPC
+ if(ref && ref->Label()==label && ref->DetectorId()==AliTrackReference::kTPC)
+ {
+ nrefTPC++;
+ refTPCOut=ref;
+ if(!refTPCIn) {
+ refTPCIn = ref;
+ //printf("refTPCIn %p \n",refTPCIn);
+ //break;
+ }
}
- }
- // TRD
- if(ref && ref->Label()==label && ref->DetectorId()==AliTrackReference::kTRD)
- {
- nrefTRD++;
- if(!refTRD) {
- refTRD = ref;
+ // TRD
+ if(ref && ref->Label()==label && ref->DetectorId()==AliTrackReference::kTRD)
+ {
+ nrefTRD++;
+ if(!refTRD) {
+ refTRD = ref;
+ }
}
- }
- // TOF
- if(ref && ref->Label()==label && ref->DetectorId()==AliTrackReference::kTOF)
- {
- nrefTOF++;
- if(!refTOF) {
- refTOF = ref;
+ // TOF
+ if(ref && ref->Label()==label && ref->DetectorId()==AliTrackReference::kTOF)
+ {
+ nrefTOF++;
+ if(!refTOF) {
+ refTOF = ref;
+ }
}
+ // EMCAL
+ if(ref && ref->Label()==label && ref->DetectorId()==AliTrackReference::kEMCAL)
+ {
+ nrefEMCAL++;
+ if(!refEMCAL) {
+ refEMCAL = ref;
+ }
+ }
+ // PHOS
+ // if(ref && ref->Label()==label && ref->DetectorId()==AliTrackReference::kPHOS)
+ // {
+ // nrefPHOS++;
+ // if(!refPHOS) {
+ // refPHOS = ref;
+ // }
+ // }
}
- // EMCAL
- if(ref && ref->Label()==label && ref->DetectorId()==AliTrackReference::kEMCAL)
+
+ // transform inner params to TrackRef
+ // reference frame
+ if(refTPCIn && trackInnerC3)
{
- nrefEMCAL++;
- if(!refEMCAL) {
- refEMCAL = ref;
- }
+ Double_t kRefPhi = TMath::ATan2(refTPCIn->Y(),refTPCIn->X());
+ isOKtrackInnerC3 = trackInnerC3->Rotate(kRefPhi);
+ isOKtrackInnerC3 = AliTracker::PropagateTrackToBxByBz(trackInnerC3,refTPCIn->R(),track->GetMass(),kStep,kFALSE);
}
- // PHOS
- // if(ref && ref->Label()==label && ref->DetectorId()==AliTrackReference::kPHOS)
- // {
- // nrefPHOS++;
- // if(!refPHOS) {
- // refPHOS = ref;
- // }
- // }
}
- // transform inner params to TrackRef
- // reference frame
- if(refTPCIn && trackInnerC3)
+ //
+ // ITS track
+ //
+ Int_t labelITS = TMath::Abs(track->GetITSLabel());
+ if (labelITS >= mcStackSize) continue;
+ particleITS = stack->Particle(labelITS);
+ if (!particleITS) continue;
+ if(particleITS && particleITS->GetPDG() && particleITS->GetPDG()->Charge()!=0.)
{
- Double_t kRefPhi = TMath::ATan2(refTPCIn->Y(),refTPCIn->X());
- isOKtrackInnerC3 = trackInnerC3->Rotate(kRefPhi);
- isOKtrackInnerC3 = AliTracker::PropagateTrackToBxByBz(trackInnerC3,refTPCIn->R(),track->GetMass(),kStep,kFALSE);
+ particleMotherITS = GetMother(particleITS,stack);
+ mechITS = particleITS->GetUniqueID();
+ isPrimITS = stack->IsPhysicalPrimary(labelITS);
+ isFromStrangessITS = IsFromStrangeness(labelITS,stack);
+ isFromConversionITS = IsFromConversion(labelITS,stack);
+ isFromMaterialITS = IsFromMaterial(labelITS,stack);
}
}
-
- //
- // ITS track
- //
- Int_t labelITS = TMath::Abs(track->GetITSLabel());
- if (labelITS >= mcStackSize) continue;
- particleITS = stack->Particle(labelITS);
- if (!particleITS) continue;
- if(particleITS && particleITS->GetPDG() && particleITS->GetPDG()->Charge()!=0.)
- {
- particleMotherITS = GetMother(particleITS,stack);
- mechITS = particleITS->GetUniqueID();
- isPrimITS = stack->IsPhysicalPrimary(labelITS);
- isFromStrangessITS = IsFromStrangeness(labelITS,stack);
- isFromConversionITS = IsFromConversion(labelITS,stack);
- isFromMaterialITS = IsFromMaterial(labelITS,stack);
- }
+ while (0);
}
- //
- Bool_t dumpToTree=kFALSE;
-
- if(isOKtpcInnerC && isOKtrackInnerC) dumpToTree = kTRUE;
- //if(fUseESDfriends && isOKtrackInnerC2 && isOKouterITSc) dumpToTree = kTRUE;
- if(isOKtrackInnerC2 && isOKouterITSc) dumpToTree = kTRUE;
- if(mcEvent && isOKtrackInnerC3) dumpToTree = kTRUE;
- TObjString triggerClass = esdEvent->GetFiredTriggerClasses().Data();
- if (fReducePileUp){
//
- // 18.03 - Reduce pile-up chunks, done outside of the ESDTrackCuts for 2012/2013 data pile-up about 95 % of tracks
- // Done only in case no MC info
- //
- Float_t dcaTPC[2];
- track->GetImpactParametersTPC(dcaTPC[0],dcaTPC[1]);
- Bool_t isRoughPrimary = TMath::Abs(dcaTPC[1])<10;
- Bool_t hasOuter=(track->IsOn(AliVTrack::kITSin))||(track->IsOn(AliVTrack::kTOFout))||(track->IsOn(AliVTrack::kTRDin));
- Bool_t keepPileUp=gRandom->Rndm()<0.05;
- if ( (!hasOuter) && (!isRoughPrimary) && (!keepPileUp)){
- dumpToTree=kFALSE;
+ Bool_t dumpToTree=kFALSE;
+
+ if(isOKtpcInnerC && isOKtrackInnerC) dumpToTree = kTRUE;
+ //if(fUseESDfriends && isOKtrackInnerC2 && isOKouterITSc) dumpToTree = kTRUE;
+ if(isOKtrackInnerC2 && isOKouterITSc) dumpToTree = kTRUE;
+ if(mcEvent && isOKtrackInnerC3) dumpToTree = kTRUE;
+ TObjString triggerClass = esdEvent->GetFiredTriggerClasses().Data();
+ if (fReducePileUp){
+ //
+ // 18.03 - Reduce pile-up chunks, done outside of the ESDTrackCuts for 2012/2013 data pile-up about 95 % of tracks
+ // Done only in case no MC info
+ //
+ Float_t dcaTPC[2];
+ track->GetImpactParametersTPC(dcaTPC[0],dcaTPC[1]);
+ Bool_t isRoughPrimary = TMath::Abs(dcaTPC[1])<10;
+ Bool_t hasOuter=(track->IsOn(AliVTrack::kITSin))||(track->IsOn(AliVTrack::kTOFout))||(track->IsOn(AliVTrack::kTRDin));
+ Bool_t keepPileUp=gRandom->Rndm()<0.05;
+ if ( (!hasOuter) && (!isRoughPrimary) && (!keepPileUp)){
+ dumpToTree=kFALSE;
+ }
}
- }
- /////////////////
- //book keeping of created dummy objects (to avoid NULL in trees)
- Bool_t newvtxESD=kFALSE;
- Bool_t newtrack=kFALSE;
- Bool_t newtpcInnerC=kFALSE;
- Bool_t newtrackInnerC=kFALSE;
- Bool_t newtrackInnerC2=kFALSE;
- Bool_t newouterITSc=kFALSE;
- Bool_t newtrackInnerC3=kFALSE;
- Bool_t newrefTPCIn=kFALSE;
- Bool_t newrefITS=kFALSE;
- Bool_t newparticle=kFALSE;
- Bool_t newparticleMother=kFALSE;
- Bool_t newparticleTPC=kFALSE;
- Bool_t newparticleMotherTPC=kFALSE;
- Bool_t newparticleITS=kFALSE;
- Bool_t newparticleMotherITS=kFALSE;
- Bool_t newFriendTrack=kFALSE;
-
- //check that the vertex is there and that it is OK,
- //i.e. no null member arrays, otherwise a problem with merging
- //later on.
- //this is a very ugly hack!
- if (!vtxESD)
- {
- AliInfo("fixing the ESD vertex for streaming");
- vtxESD=new AliESDVertex();
- //vtxESD->SetNContributors(1);
- //UShort_t pindices[1]; pindices[0]=0;
- //vtxESD->SetIndices(1,pindices);
- //vtxESD->SetNContributors(0);
- newvtxESD=kTRUE;
- }
- //
- if (!track) {track=new AliESDtrack();newtrack=kTRUE;}
- if (!friendTrack) {friendTrack=new AliESDfriendTrack(); newFriendTrack=kTRUE;}
- if (!tpcInnerC) {tpcInnerC=new AliExternalTrackParam();newtpcInnerC=kTRUE;}
- if (!trackInnerC) {trackInnerC=new AliExternalTrackParam();newtrackInnerC=kTRUE;}
- if (!trackInnerC2) {trackInnerC2=new AliExternalTrackParam();newtrackInnerC2=kTRUE;}
- if (!outerITSc) {outerITSc=new AliExternalTrackParam();newouterITSc=kTRUE;}
- if (!trackInnerC3) {trackInnerC3=new AliExternalTrackParam();newtrackInnerC3=kTRUE;}
- if (mcEvent)
- {
- if (!refTPCIn) {refTPCIn=new AliTrackReference(); newrefTPCIn=kTRUE;}
- if (!refITS) {refITS=new AliTrackReference();newrefITS=kTRUE;}
- if (!particle) {particle=new TParticle(); newparticle=kTRUE;}
- if (!particleMother) {particleMother=new TParticle();newparticleMother=kTRUE;}
- if (!particleTPC) {particleTPC=new TParticle();newparticleTPC=kTRUE;}
- if (!particleMotherTPC) {particleMotherTPC=new TParticle();newparticleMotherTPC=kTRUE;}
- if (!particleITS) {particleITS=new TParticle();newparticleITS=kTRUE;}
- if (!particleMotherITS) {particleMotherITS=new TParticle();newparticleMotherITS=kTRUE;}
- }
- /////////////////////////
-
- //Double_t vtxX=vtxESD->GetX();
- //Double_t vtxY=vtxESD->GetY();
- //Double_t vtxZ=vtxESD->GetZ();
-
- //AliESDVertex* pvtxESD = (AliESDVertex*)vtxESD->Clone();
- //AliESDtrack* ptrack=(AliESDtrack*)track->Clone();
- //AliExternalTrackParam* ptpcInnerC = (AliExternalTrackParam*)tpcInnerC->Clone();
- //AliExternalTrackParam* ptrackInnerC = (AliExternalTrackParam*)trackInnerC->Clone();
- //AliExternalTrackParam* ptrackInnerC2 = (AliExternalTrackParam*)trackInnerC2->Clone();
- //AliExternalTrackParam* pouterITSc = (AliExternalTrackParam*)outerITSc->Clone();
- //AliExternalTrackParam* ptrackInnerC3 = (AliExternalTrackParam*)trackInnerC3->Clone();
- //AliESDVertex* pvtxESD = new AliESDVertex(*vtxESD);
- //AliESDtrack* ptrack= new AliESDtrack(*track);
- //AliExternalTrackParam* ptpcInnerC = new AliExternalTrackParam(*tpcInnerC);
- //AliExternalTrackParam* ptrackInnerC = new AliExternalTrackParam(*trackInnerC);
- //AliExternalTrackParam* ptrackInnerC2 = new AliExternalTrackParam(*trackInnerC2);
- //AliExternalTrackParam* pouterITSc = new AliExternalTrackParam(*outerITSc);
- //AliExternalTrackParam* ptrackInnerC3 = new AliExternalTrackParam(*trackInnerC3);
-
- Int_t ntracks = esdEvent->GetNumberOfTracks();
-
- // Global event id calculation using orbitID, bunchCrossingID and periodID
- ULong64_t orbitID = (ULong64_t)esdEvent->GetOrbitNumber();
- ULong64_t bunchCrossID = (ULong64_t)esdEvent->GetBunchCrossNumber();
- ULong64_t periodID = (ULong64_t)esdEvent->GetPeriodNumber();
- ULong64_t gid = ((periodID << 36) | (orbitID << 12) | bunchCrossID);
-
- // fill histograms
- FillHistograms(track, tpcInnerC, centralityF, (Double_t)chi2(0,0));
-
- if(fTreeSRedirector && dumpToTree && fFillTree)
- {
- (*fTreeSRedirector)<<"highPt"<<
- "gid="<<gid<<
- "fileName.="<<&fileName<< // name of the chunk file (hopefully full)
- "runNumber="<<runNumber<< // runNumber
- "evtTimeStamp="<<evtTimeStamp<< // time stamp of event (in seconds)
- "evtNumberInFile="<<evtNumberInFile<< // event number
- "triggerClass="<<&triggerClass<< // trigger class as a string
- "Bz="<<bz<< // solenoid magnetic field in the z direction (in kGaus)
- "vtxESD.="<<vtxESD<< // vertexer ESD tracks (can be biased by TPC pileup tracks)
- //"vtxESDx="<<vtxX<<
- //"vtxESDy="<<vtxY<<
- //"vtxESDz="<<vtxZ<<
- "IRtot="<<ir1<< // interaction record (trigger) counters - coutner 1
- "IRint2="<<ir2<< // interaction record (trigger) coutners - counter 2
- "mult="<<mult<< // multiplicity of tracks pointing to the primary vertex
- "ntracks="<<ntracks<< // number of the esd tracks (to take into account the pileup in the TPC)
- // important variables for the pile-up studies
- "contTPC="<< contTPC<< // number of contributors to the TPC primary vertex candidate
- "contSPD="<< contSPD<< // number of contributors to the SPD primary vertex candidate
- "vertexPosTPC.="<<&vertexPosTPC<< // TPC vertex position
- "vertexPosSPD.="<<&vertexPosSPD<< // SPD vertex position
- "ntracksTPC="<<ntracksTPC<< // total number of the TPC tracks which were refitted
- "ntracksITS="<<ntracksITS<< // total number of the ITS tracks which were refitted
- //
- "esdTrack.="<<track<< // esdTrack as used in the physical analysis
- "friendTrack.="<<friendTrack<< // esdFriendTrack associated to the esdTrack
- "extTPCInnerC.="<<tpcInnerC<< // ???
- "extInnerParamC.="<<trackInnerC<< // ???
- "extInnerParam.="<<trackInnerC2<< // ???
- "extOuterITS.="<<outerITSc<< // ???
- "extInnerParamRef.="<<trackInnerC3<< // ???
- "chi2TPCInnerC="<<chi2(0,0)<< // chi2 of tracks ???
- "chi2InnerC="<<chi2trackC(0,0)<< // chi2s of tracks TPCinner to the combined
- "chi2OuterITS="<<chi2OuterITS(0,0)<< // chi2s of tracks TPC at inner wall to the ITSout
- "centralityF="<<centralityF;
+ //init dummy objects
+ static AliESDVertex dummyvtxESD;
+ //if (!dummyvtxESD)
+ //{
+ // dummyvtxESD=new AliESDVertex();
+ // //dummyvtxESD->SetNContributors(1);
+ // //UShort_t pindices[1]; pindices[0]=0;
+ // //dummyvtxESD->SetIndices(1,pindices);
+ // //dummyvtxESD->SetNContributors(0);
+ //}
+ static AliExternalTrackParam dummyexternaltrackparam;
+ //if (!dummyexternaltrackparam) dummyexternaltrackparam=new AliExternalTrackParam();
+ static AliTrackReference dummytrackreference;
+ //if (!dummytrackreference) dummytrackreference=new AliTrackReference();
+ static TParticle dummyparticle;
+ //if (!dummyparticle) dummyparticle=new TParticle();
+
+ //assign the dummy objects if needed
+ if (!track) {track=fDummyTrack;}
+ if (!friendTrack) {friendTrack=fDummyFriendTrack;}
+ if (!vtxESD) {vtxESD=&dummyvtxESD;}
if (mcEvent)
{
- AliTrackReference refDummy;
- if (!refITS) refITS = &refDummy;
- if (!refTRD) refTRD = &refDummy;
- if (!refTOF) refTOF = &refDummy;
- if (!refEMCAL) refEMCAL = &refDummy;
- if (!refPHOS) refPHOS = &refDummy;
- (*fTreeSRedirector)<<"highPt"<<
- "multMCTrueTracks="<<multMCTrueTracks<< // mC track multiplicities
- "nrefITS="<<nrefITS<< // number of track references in the ITS
- "nrefTPC="<<nrefTPC<< // number of track references in the TPC
- "nrefTRD="<<nrefTRD<< // number of track references in the TRD
- "nrefTOF="<<nrefTOF<< // number of track references in the TOF
- "nrefEMCAL="<<nrefEMCAL<< // number of track references in the TOF
- "nrefPHOS="<<nrefPHOS<< // number of track references in the TOF
- "refTPCIn.="<<refTPCIn<<
- "refTPCOut.="<<refTPCOut<<
- "refITS.="<<refITS<<
- "refTRD.="<<refTRD<<
- "refTOF.="<<refTOF<<
- "refEMCAL.="<<refEMCAL<<
- "refPHOS.="<<refPHOS<<
- "particle.="<<particle<<
- "particleMother.="<<particleMother<<
- "mech="<<mech<<
- "isPrim="<<isPrim<<
- "isFromStrangess="<<isFromStrangess<<
- "isFromConversion="<<isFromConversion<<
- "isFromMaterial="<<isFromMaterial<<
- "particleTPC.="<<particleTPC<<
- "particleMotherTPC.="<<particleMotherTPC<<
- "mechTPC="<<mechTPC<<
- "isPrimTPC="<<isPrimTPC<<
- "isFromStrangessTPC="<<isFromStrangessTPC<<
- "isFromConversionTPC="<<isFromConversionTPC<<
- "isFromMaterialTPC="<<isFromMaterialTPC<<
- "particleITS.="<<particleITS<<
- "particleMotherITS.="<<particleMotherITS<<
- "mechITS="<<mechITS<<
- "isPrimITS="<<isPrimITS<<
- "isFromStrangessITS="<<isFromStrangessITS<<
- "isFromConversionITS="<<isFromConversionITS<<
- "isFromMaterialITS="<<isFromMaterialITS;
+ if (!refTPCIn) {refTPCIn=&dummytrackreference;}
+ if (!refITS) {refITS=&dummytrackreference;}
+ if (!particle) {particle=&dummyparticle;}
+ if (!particleMother) {particleMother=&dummyparticle;}
+ if (!particleTPC) {particleTPC=&dummyparticle;}
+ if (!particleMotherTPC) {particleMotherTPC=&dummyparticle;}
+ if (!particleITS) {particleITS=&dummyparticle;}
+ if (!particleMotherITS) {particleMotherITS=&dummyparticle;}
}
- //finish writing the entry
- AliInfo("writing tree highPt");
- (*fTreeSRedirector)<<"highPt"<<"\n";
- }
+ //the following are guaranteed to exist:
+ //if (!tpcInnerC) {tpcInnerC=&dummyexternaltrackparam;}
+ //if (!trackInnerC) {trackInnerC=&dummyexternaltrackparam;}
+ //if (!trackInnerC2) {trackInnerC2=&dummyexternaltrackparam;}
+ //if (!outerITSc) {outerITSc=&dummyexternaltrackparam;}
+ //if (!trackInnerC3) {trackInnerC3=&dummyexternaltrackparam;}
+ /////////////////////////
+
+ //Double_t vtxX=vtxESD->GetX();
+ //Double_t vtxY=vtxESD->GetY();
+ //Double_t vtxZ=vtxESD->GetZ();
+
+ //AliESDVertex* pvtxESD = (AliESDVertex*)vtxESD->Clone();
+ //AliESDtrack* ptrack=(AliESDtrack*)track->Clone();
+ //AliExternalTrackParam* ptpcInnerC = (AliExternalTrackParam*)tpcInnerC->Clone();
+ //AliExternalTrackParam* ptrackInnerC = (AliExternalTrackParam*)trackInnerC->Clone();
+ //AliExternalTrackParam* ptrackInnerC2 = (AliExternalTrackParam*)trackInnerC2->Clone();
+ //AliExternalTrackParam* pouterITSc = (AliExternalTrackParam*)outerITSc->Clone();
+ //AliExternalTrackParam* ptrackInnerC3 = (AliExternalTrackParam*)trackInnerC3->Clone();
+ //AliESDVertex* pvtxESD = new AliESDVertex(*vtxESD);
+ //AliESDtrack* ptrack= new AliESDtrack(*track);
+ //AliExternalTrackParam* ptpcInnerC = new AliExternalTrackParam(*tpcInnerC);
+ //AliExternalTrackParam* ptrackInnerC = new AliExternalTrackParam(*trackInnerC);
+ //AliExternalTrackParam* ptrackInnerC2 = new AliExternalTrackParam(*trackInnerC2);
+ //AliExternalTrackParam* pouterITSc = new AliExternalTrackParam(*outerITSc);
+ //AliExternalTrackParam* ptrackInnerC3 = new AliExternalTrackParam(*trackInnerC3);
+
+ Int_t ntracks = esdEvent->GetNumberOfTracks();
+
+ // Global event id calculation using orbitID, bunchCrossingID and periodID
+ ULong64_t orbitID = (ULong64_t)esdEvent->GetOrbitNumber();
+ ULong64_t bunchCrossID = (ULong64_t)esdEvent->GetBunchCrossNumber();
+ ULong64_t periodID = (ULong64_t)esdEvent->GetPeriodNumber();
+ ULong64_t gid = ((periodID << 36) | (orbitID << 12) | bunchCrossID);
+
+ // fill histograms
+ FillHistograms(track, tpcInnerC, centralityF, (Double_t)chi2(0,0));
+
+ if(fTreeSRedirector && dumpToTree && fFillTree)
+ {
- ////////////////////
- //delete the dummy objects we might have created.
- if (newvtxESD) {delete vtxESD; vtxESD=NULL;}
- if (newtrack) {delete track; track=NULL;}
- if (newFriendTrack) {delete friendTrack; friendTrack=NULL;}
- if (newtpcInnerC) {delete tpcInnerC; tpcInnerC=NULL;}
- if (newtrackInnerC) {delete trackInnerC; trackInnerC=NULL;}
- if (newtrackInnerC2) {delete trackInnerC2; trackInnerC2=NULL;}
- if (newouterITSc) {delete outerITSc; outerITSc=NULL;}
- if (newtrackInnerC3) {delete trackInnerC3; trackInnerC3=NULL;}
- if (newrefTPCIn) {delete refTPCIn; refTPCIn=NULL;}
- if (newrefITS) {delete refITS; refITS=NULL;}
- if (newparticle) {delete particle; particle=NULL;}
- if (newparticleMother) {delete particleMother; particleMother=NULL;}
- if (newparticleTPC) {delete particleTPC; particleTPC=NULL;}
- if (newparticleMotherTPC) {delete particleMotherTPC; particleMotherTPC=NULL;}
- if (newparticleITS) {delete particleITS; particleITS=NULL;}
- if (newparticleMotherITS) {delete particleMotherITS; particleMotherITS=NULL;}
- ///////////////
-
- delete tpcInnerC;
- delete trackInnerC;
- delete trackInnerC2;
- delete outerITSc;
- delete trackInnerC3;
- }
+ //if (friendTrack)
+ //{
+ // const AliTrackPointArray* array = friendTrack->GetTrackPointArray();
+ // if (!array) {printf("we have a friend, but the ponits are empty\n"); continue;}
+ // if (friendTrack==fDummyFriendTrack) printf("using the dummy friend track\n");
+ // cout<<array->GetX()[0]<<" "<<array->GetX()[2]<<endl;
+ //}
+ //else
+ //{
+ // printf("no friend track\n");
+ //}
+
+
+ (*fTreeSRedirector)<<"highPt"<<
+ "gid="<<gid<<
+ "fileName.="<<&fileName<< // name of the chunk file (hopefully full)
+ "runNumber="<<runNumber<< // runNumber
+ "evtTimeStamp="<<evtTimeStamp<< // time stamp of event (in seconds)
+ "evtNumberInFile="<<evtNumberInFile<< // event number
+ "triggerClass="<<&triggerClass<< // trigger class as a string
+ "Bz="<<bz<< // solenoid magnetic field in the z direction (in kGaus)
+ "vtxESD.="<<vtxESD<< // vertexer ESD tracks (can be biased by TPC pileup tracks)
+ //"vtxESDx="<<vtxX<<
+ //"vtxESDy="<<vtxY<<
+ //"vtxESDz="<<vtxZ<<
+ "IRtot="<<ir1<< // interaction record (trigger) counters - coutner 1
+ "IRint2="<<ir2<< // interaction record (trigger) coutners - counter 2
+ "mult="<<mult<< // multiplicity of tracks pointing to the primary vertex
+ "ntracks="<<ntracks<< // number of the esd tracks (to take into account the pileup in the TPC)
+ // important variables for the pile-up studies
+ "contTPC="<< contTPC<< // number of contributors to the TPC primary vertex candidate
+ "contSPD="<< contSPD<< // number of contributors to the SPD primary vertex candidate
+ "vertexPosTPC.="<<&vertexPosTPC<< // TPC vertex position
+ "vertexPosSPD.="<<&vertexPosSPD<< // SPD vertex position
+ "ntracksTPC="<<ntracksTPC<< // total number of the TPC tracks which were refitted
+ "ntracksITS="<<ntracksITS<< // total number of the ITS tracks which were refitted
+ //
+ "esdTrack.="<<track<< // esdTrack as used in the physical analysis
+ "friendTrack.="<<friendTrack<< // esdFriendTrack associated to the esdTrack
+ "extTPCInnerC.="<<tpcInnerC<< // ???
+ "extInnerParamC.="<<trackInnerC<< // ???
+ "extInnerParam.="<<trackInnerC2<< // ???
+ "extOuterITS.="<<outerITSc<< // ???
+ "extInnerParamRef.="<<trackInnerC3<< // ???
+ "chi2TPCInnerC="<<chi2(0,0)<< // chi2 of tracks ???
+ "chi2InnerC="<<chi2trackC(0,0)<< // chi2s of tracks TPCinner to the combined
+ "chi2OuterITS="<<chi2OuterITS(0,0)<< // chi2s of tracks TPC at inner wall to the ITSout
+ "centralityF="<<centralityF;
+ if (mcEvent)
+ {
+ static AliTrackReference refDummy;
+ if (!refITS) refITS = &refDummy;
+ if (!refTRD) refTRD = &refDummy;
+ if (!refTOF) refTOF = &refDummy;
+ if (!refEMCAL) refEMCAL = &refDummy;
+ if (!refPHOS) refPHOS = &refDummy;
+ (*fTreeSRedirector)<<"highPt"<<
+ "multMCTrueTracks="<<multMCTrueTracks<< // mC track multiplicities
+ "nrefITS="<<nrefITS<< // number of track references in the ITS
+ "nrefTPC="<<nrefTPC<< // number of track references in the TPC
+ "nrefTRD="<<nrefTRD<< // number of track references in the TRD
+ "nrefTOF="<<nrefTOF<< // number of track references in the TOF
+ "nrefEMCAL="<<nrefEMCAL<< // number of track references in the TOF
+ "nrefPHOS="<<nrefPHOS<< // number of track references in the TOF
+ "refTPCIn.="<<refTPCIn<<
+ "refTPCOut.="<<refTPCOut<<
+ "refITS.="<<refITS<<
+ "refTRD.="<<refTRD<<
+ "refTOF.="<<refTOF<<
+ "refEMCAL.="<<refEMCAL<<
+ "refPHOS.="<<refPHOS<<
+ "particle.="<<particle<<
+ "particleMother.="<<particleMother<<
+ "mech="<<mech<<
+ "isPrim="<<isPrim<<
+ "isFromStrangess="<<isFromStrangess<<
+ "isFromConversion="<<isFromConversion<<
+ "isFromMaterial="<<isFromMaterial<<
+ "particleTPC.="<<particleTPC<<
+ "particleMotherTPC.="<<particleMotherTPC<<
+ "mechTPC="<<mechTPC<<
+ "isPrimTPC="<<isPrimTPC<<
+ "isFromStrangessTPC="<<isFromStrangessTPC<<
+ "isFromConversionTPC="<<isFromConversionTPC<<
+ "isFromMaterialTPC="<<isFromMaterialTPC<<
+ "particleITS.="<<particleITS<<
+ "particleMotherITS.="<<particleMotherITS<<
+ "mechITS="<<mechITS<<
+ "isPrimITS="<<isPrimITS<<
+ "isFromStrangessITS="<<isFromStrangessITS<<
+ "isFromConversionITS="<<isFromConversionITS<<
+ "isFromMaterialITS="<<isFromMaterialITS;
+ }
+ //finish writing the entry
+ AliInfo("writing tree highPt");
+ (*fTreeSRedirector)<<"highPt"<<"\n";
+ }
+ AliSysInfo::AddStamp("filteringTask",iTrack,numberOfTracks,numberOfFriendTracks,(friendTrack=fDummyFriendTrack)?0:1);
+
+ delete tpcInnerC;
+ delete trackInnerC;
+ delete trackInnerC2;
+ delete outerITSc;
+ delete trackInnerC3;
+ }
}
}
} else if (trackIndex >-1) {
recTrack = esdEvent->GetTrack(trackIndex);
} else {
- recTrack = new AliESDtrack();
+ recTrack = fDummyTrack;
}
particleMother = GetMother(particle,stack);
"\n";
}
- if(trackIndex <0 && recTrack) delete recTrack; recTrack=0;
+ //if(trackIndex <0 && recTrack) delete recTrack; recTrack=0;
}
}
friendTrack1 = esdFriend->GetTrack(v0->GetIndex(1)); //this guy can be NULL
}
}
- Bool_t newFriendTrack0=kFALSE;
- Bool_t newFriendTrack1=kFALSE;
- if (!friendTrack0) {friendTrack0=new AliESDfriendTrack(); newFriendTrack0=kTRUE;}
- if (!friendTrack1) {friendTrack1=new AliESDfriendTrack(); newFriendTrack1=kTRUE;}
+ //Bool_t newFriendTrack0=kFALSE;
+ //Bool_t newFriendTrack1=kFALSE;
+ //if (!friendTrack0) {friendTrack0=new AliESDfriendTrack(); newFriendTrack0=kTRUE;}
+ //if (!friendTrack1) {friendTrack1=new AliESDfriendTrack(); newFriendTrack1=kTRUE;}
+ if (!friendTrack0) {friendTrack0=fDummyFriendTrack;}
+ if (!friendTrack1) {friendTrack1=fDummyFriendTrack;}
if (track0->GetSign()<0) {
track1 = esdEvent->GetTrack(v0->GetIndex(0));
track0 = esdEvent->GetTrack(v0->GetIndex(1));
"friendTrack1.="<<friendTrack1<<
"centralityF="<<centralityF<<
"\n";
- if (newFriendTrack0) {delete friendTrack0;}
- if (newFriendTrack1) {delete friendTrack1;}
+ //if (newFriendTrack0) {delete friendTrack0;}
+ //if (newFriendTrack1) {delete friendTrack1;}
}
}
}
{
AliESDtrack *track = esdEvent->GetTrack(iTrack);
if(!track) continue;
- Bool_t newFriendTrack=kFALSE;
AliESDfriendTrack* friendTrack=NULL;
if (esdFriend) {if (!esdFriend->TestSkipBit()) friendTrack = esdFriend->GetTrack(iTrack);} //this guy can be NULL
- if (!friendTrack) {friendTrack=new AliESDfriendTrack(); newFriendTrack=kTRUE;}
+ //Bool_t newFriendTrack=kFALSE;
+ //if (!friendTrack) {friendTrack=new AliESDfriendTrack(); newFriendTrack=kTRUE;}
+ if (!friendTrack) {friendTrack=fDummyFriendTrack;}
if(track->Charge()==0) continue;
if(!esdTrackCuts->AcceptTrack(track)) continue;
if(!accCuts->AcceptTrack(track)) continue;
"esdTrack.="<<track<<
"friendTrack.="<<friendTrack<<
"\n";
- if (newFriendTrack) delete friendTrack;
+ //if (newFriendTrack) delete friendTrack;
}
}
}
}
//_____________________________________________________________________________
-Bool_t AliAnalysisTaskFilteredTree::IsFromConversion(const Int_t label, AliStack *const stack)
+Bool_t AliAnalysisTaskFilteredTree::IsFromConversion(Int_t label, AliStack *const stack)
{
Bool_t isFromConversion = kFALSE;
}
//_____________________________________________________________________________
-Bool_t AliAnalysisTaskFilteredTree::IsFromMaterial(const Int_t label, AliStack *const stack)
+Bool_t AliAnalysisTaskFilteredTree::IsFromMaterial(Int_t label, AliStack *const stack)
{
Bool_t isFromMaterial = kFALSE;
}
//_____________________________________________________________________________
-Bool_t AliAnalysisTaskFilteredTree::IsFromStrangeness(const Int_t label, AliStack *const stack)
+Bool_t AliAnalysisTaskFilteredTree::IsFromStrangeness(Int_t label, AliStack *const stack)
{
Bool_t isFromStrangeness = kFALSE;
}
//_____________________________________________________________________________
-void AliAnalysisTaskFilteredTree::FillHistograms(AliESDtrack* const ptrack, AliExternalTrackParam* const ptpcInnerC, const Double_t centralityF, const Double_t chi2TPCInnerC)
+void AliAnalysisTaskFilteredTree::FillHistograms(AliESDtrack* const ptrack, AliExternalTrackParam* const ptpcInnerC, Double_t centralityF, Double_t chi2TPCInnerC)
{
//
// Fill pT relative resolution histograms for
fPtResCentPtTPCc->Fill(ptpcInnerC->Pt(),centralityF,1./abs(ptpcInnerC->GetSigned1Pt())*TMath::Sqrt(ptpcInnerC->GetSigma1Pt2()));
}
}
+
+
+void AliAnalysisTaskFilteredTree::ProcessITSTPCmatchOut(AliESDEvent *const esdEvent, AliESDfriend *const esdFriend){
+ //
+ // Process ITS standalone tracks find match with closest TPC(or combined tracks) tracks
+ // marian.ivanov@cern.ch
+ // 0.) Init variables
+ // 1.) GetTrack parameters at TPC inner wall
+ // 2.) Match closest TPC track (STANDALONE/global) - chi2 match criteria
+ //
+ // Logic to be used in reco:
+ // 1.) Find matching ITSalone->TPCalone
+ // 2.) if (!TPCalone.FindClose(TPCother)) TPCalone.Addopt(ITSalone)
+ // 3.) ff ((ITSalone.FindClose(Global)==0) CreateGlobaltrack
+ const Double_t radiusMatch=84.; // redius to propagate
+ //
+ const Double_t dFastPhiCut=0.2; // 6 sigma (200 MeV) fast angular cut
+ const Double_t dFastThetaCut=0.12; // 6 sigma (200 MeV) fast angular cut
+ const Double_t dFastPosPhiCut=0.06; // 6 sigma (200 MeV) fast angular cut
+ const Double_t dFastZCut=6; // 6 sigma (200 MeV) fast z difference cut
+ const Double_t dFastPtCut=2.; // 6 sigma (200 MeV) fast 1/pt cut
+ const Double_t chi2Cut=100; // chi2 matching cut
+ //
+ if (!esdFriend) return; // not ITS standalone track
+ if (esdFriend->TestSkipBit()) return; // friends tracks not stored
+ Int_t ntracks=esdEvent->GetNumberOfTracks();
+ Float_t bz = esdEvent->GetMagneticField();
+ //
+ // 0.) Get parameters in reference radius TPC Inner wall
+ //
+ //
+ TMatrixD vecPosR0(ntracks,6); // possition and momentum estimate at reference radius
+ TMatrixD vecMomR0(ntracks,6); //
+ TMatrixD vecPosR1(ntracks,6); // possition and momentum estimate at reference radius TPC track
+ TMatrixD vecMomR1(ntracks,6); //
+ Double_t xyz[3], pxyz[3]; //
+ for (Int_t iTrack=0; iTrack<ntracks; iTrack++){
+ AliESDtrack *track = esdEvent->GetTrack(iTrack);
+ if(!track) continue;
+ if (track->GetInnerParam()){
+ const AliExternalTrackParam *trackTPC=track->GetInnerParam();
+ trackTPC->GetXYZAt(radiusMatch,bz,xyz);
+ trackTPC->GetPxPyPzAt(radiusMatch,bz,pxyz);
+ for (Int_t i=0; i<3; i++){
+ vecPosR1(iTrack,i)=xyz[i];
+ vecMomR1(iTrack,i)=pxyz[i];
+ }
+ vecPosR1(iTrack,3)= TMath::ATan2(xyz[1],xyz[0]); // phi pos angle
+ vecMomR1(iTrack,3)= TMath::ATan2(pxyz[1],pxyz[0]); // phi mom angle
+ vecMomR1(iTrack,4)= trackTPC->GetSigned1Pt();;
+ vecMomR1(iTrack,5)= trackTPC->GetTgl();;
+ }
+ AliESDfriendTrack* friendTrack=esdFriend->GetTrack(iTrack);
+ if(!friendTrack) continue;
+ if (friendTrack->GetITSOut()){
+ const AliExternalTrackParam *trackITS=friendTrack->GetITSOut();
+ trackITS->GetXYZAt(radiusMatch,bz,xyz);
+ trackITS->GetPxPyPzAt(radiusMatch,bz,pxyz);
+ for (Int_t i=0; i<3; i++){
+ vecPosR0(iTrack,i)=xyz[i];
+ vecMomR0(iTrack,i)=pxyz[i];
+ }
+ vecPosR0(iTrack,3)= TMath::ATan2(xyz[1],xyz[0]);
+ vecMomR0(iTrack,3)= TMath::ATan2(pxyz[1],pxyz[0]);
+ vecMomR0(iTrack,4)= trackITS->GetSigned1Pt();;
+ vecMomR0(iTrack,5)= trackITS->GetTgl();;
+ }
+ }
+ //
+ // 1.) Find closest matching tracks, between the ITS standalone track
+ // and the all other tracks
+ // a.) caltegory - All
+ // b.) category - without ITS
+ //
+ //
+ Int_t ntracksPropagated=0;
+ AliExternalTrackParam extTrackDummy;
+ AliESDtrack esdTrackDummy;
+ AliExternalTrackParam itsAtTPC;
+ AliExternalTrackParam itsAtITSTPC;
+ for (Int_t iTrack0=0; iTrack0<ntracks; iTrack0++){
+ AliESDtrack *track0 = esdEvent->GetTrack(iTrack0);
+ if(!track0) continue;
+ if (track0->IsOn(AliVTrack::kTPCin)) continue;
+ AliESDfriendTrack* friendTrack0=esdFriend->GetTrack(iTrack0);
+ if (!friendTrack0) continue;
+ //if (!track0->IsOn(AliVTrack::kITSpureSA)) continue;
+ //if (!friendTrack0->GetITSOut()) continue; // is there flag for ITS standalone?
+ ntracksPropagated++;
+ //
+ // 2.) find clostest TPCtrack
+ // a.) all tracks
+ Double_t minChi2All=10000000;
+ Double_t minChi2TPC=10000000;
+ Double_t minChi2TPCITS=10000000;
+ Int_t indexAll=-1;
+ Int_t indexTPC=-1;
+ Int_t indexTPCITS=-1;
+ Int_t ncandidates0=0; // n candidates - rough cut
+ Int_t ncandidates1=0; // n candidates - rough + chi2 cut
+ itsAtTPC=*(friendTrack0->GetITSOut());
+ itsAtITSTPC=*(friendTrack0->GetITSOut());
+ for (Int_t iTrack1=0; iTrack1<ntracks; iTrack1++){
+ AliESDtrack *track1 = esdEvent->GetTrack(iTrack1);
+ if(!track1) continue;
+ if (!track1->IsOn(AliVTrack::kTPCin)) continue;
+ // fast checks
+ //
+ if (TMath::Abs(vecPosR1(iTrack1,2)-vecPosR0(iTrack0,2))>dFastZCut) continue;
+ if (TMath::Abs(vecPosR1(iTrack1,3)-vecPosR0(iTrack0,3))>dFastPosPhiCut) continue;
+ if (TMath::Abs(vecMomR1(iTrack1,3)-vecMomR0(iTrack0,3))>dFastPhiCut) continue;
+ if (TMath::Abs(vecMomR1(iTrack1,5)-vecMomR0(iTrack0,5))>dFastThetaCut) continue;
+ if (TMath::Abs(vecMomR1(iTrack1,4)-vecMomR0(iTrack0,4))>dFastPtCut) continue;
+ ncandidates0++;
+ //
+ const AliExternalTrackParam * param1= track1->GetInnerParam();
+ if (!friendTrack0->GetITSOut()) continue;
+ AliExternalTrackParam outerITS = *(friendTrack0->GetITSOut());
+ if (!outerITS.Rotate(param1->GetAlpha())) continue;
+ if (!outerITS.PropagateTo(param1->GetX(),bz)) continue; // assume track close to the TPC inner wall
+ Double_t chi2 = outerITS.GetPredictedChi2(param1);
+ if (chi2>chi2Cut) continue;
+ ncandidates1++;
+ if (chi2<minChi2All){
+ minChi2All=chi2;
+ indexAll=iTrack1;
+ }
+ if (chi2<minChi2TPC && track1->IsOn(AliVTrack::kITSin)==0){
+ minChi2TPC=chi2;
+ indexTPC=iTrack1;
+ itsAtTPC=outerITS;
+ }
+ if (chi2<minChi2TPCITS && track1->IsOn(AliVTrack::kITSin)){
+ minChi2TPCITS=chi2;
+ indexTPCITS=iTrack1;
+ itsAtITSTPC=outerITS;
+ }
+ }
+ //
+ AliESDtrack * trackAll= (indexAll>=0)? esdEvent->GetTrack(indexAll):&esdTrackDummy;
+ AliESDtrack * trackTPC= (indexTPC>=0)? esdEvent->GetTrack(indexTPC):&esdTrackDummy;
+ AliESDtrack * trackTPCITS= (indexTPCITS>=0)? esdEvent->GetTrack(indexTPCITS):&esdTrackDummy;
+ (*fTreeSRedirector)<<"itsTPC"<<
+ "indexAll="<<indexAll<< // index of closest track (chi2)
+ "indexTPC="<<indexTPC<< // index of closest TPCalone tracks
+ "indexTPCITS="<<indexTPCITS<< // index of closest cobined tracks
+ "ncandidates0="<<ncandidates0<< // number of candidates
+ "ncandidates1="<<ncandidates1<<
+ //
+ "chi2All="<<minChi2All<< // chi2 of closest tracks
+ "chi2TPC="<<minChi2TPC<<
+ "chi2TPCITS="<<minChi2TPCITS<<
+ //
+ "track0.="<<track0<< // ITS standalone tracks
+ "trackAll.="<<trackAll<< // Closets other track
+ "trackTPC.="<<trackTPC<< // Closest TPC only track
+ "trackTPCITS.="<<trackTPCITS<< // closest combined track
+ //
+ "itsAtTPC.="<<&itsAtTPC<< // ITS track parameters at the TPC alone track frame
+ "itsAtITSTPC.="<<&itsAtITSTPC<< // ITS track parameters at the TPC combeined track frame
+ "\n";
+ }
+}
+
+//void AliAnalysisTaskFilteredTree::ProcessTrackMatch(AliESDEvent *const esdEvent, AliESDfriend *const esdFriend){
+/*
+
+Track categories:
+TPC+ITS
+TPC only
+ITS only
+
+Options:
+-OK
+-Multiple found (check overlap factor)
+-Kink decays - change of direction
+
+To make - matrix closest tracks from each categories
+Characterization - chi2, index, overlap ratio
+
+New features:
+1.) if (TPConly && !(TPC+ITS) && ITSonly match ) TPCOnly.addoptITS
+2.) if (ITSonly && !(TPC+ITS)) (TPC+ITS).createConbined
+3.) Overlap tracks - doUnfold
+
+*/