, fAnalysisMode(AlidNdPtHelper::kTPC) \r
, fTrigger(AliTriggerAnalysis::kMB1) \r
, fTriggerClass(0) \r
+, fParticleMode(AlidNdPtHelper::kAllPart) \r
{\r
// default constructor\r
}\r
, fAnalysisMode(AlidNdPtHelper::kTPC) \r
, fTrigger(AliTriggerAnalysis::kMB1) \r
, fTriggerClass(0) \r
+, fParticleMode(AlidNdPtHelper::kAllPart) \r
{\r
// constructor\r
}\r
void SetAnalysisMode(const AlidNdPtHelper::AnalysisMode mode) { fAnalysisMode = mode; }
void SetTrigger(const AliTriggerAnalysis::Trigger trigger) { fTrigger = trigger; }
void SetTriggerClass(const Char_t *triggerClass) { fTriggerClass = triggerClass; }
+ void SetParticleMode(const AlidNdPtHelper::ParticleMode mode) { fParticleMode = mode; }
AlidNdPtEventCuts* GetEventCuts() const { return fdNdPtEventCuts; }
AlidNdPtAcceptanceCuts* GetAcceptanceCuts() const { return fdNdPtAcceptanceCuts; }
AlidNdPtHelper::AnalysisMode GetAnalysisMode() const { return fAnalysisMode; }
AliTriggerAnalysis::Trigger GetTrigger() const { return fTrigger; }
const Char_t* GetTriggerClass() const { return fTriggerClass; }
+ AlidNdPtHelper::ParticleMode GetParticleMode() const { return fParticleMode; }
private:
AlidNdPtHelper::AnalysisMode fAnalysisMode; // analysis mode TPC only, TPC + ITS
AliTriggerAnalysis::Trigger fTrigger; // trigger definition MB1, MB2 ...
const Char_t * fTriggerClass; // trigger class
+ AlidNdPtHelper::ParticleMode fParticleMode; // selected particle (pion, kaon, ...)
ClassDef(AlidNdPt,1);
};
\r
//\r
Double_t kFact = 1.0;\r
- if(GetAnalysisMode() == AlidNdPtHelper::kTPCSPDvtx) kFact = 0.05; \r
+ if(GetAnalysisMode() == AlidNdPtHelper::kTPCSPDvtx || \r
+ GetAnalysisMode() == AlidNdPtHelper::kTPCSPDvtxUpdate) kFact = 0.03; \r
\r
Int_t binsRecMCEventHist1[3]={100,100,100};\r
Double_t minRecMCEventHist1[3]={-10.0*kFact,-10.0*kFact,-10.0*kFact}; \r
vtxESD = AlidNdPtHelper::GetVertex(esdEvent,evtCuts,accCuts,esdTrackCuts,GetAnalysisMode(),kFALSE,bRedoTPCVertex,bUseConstraints); \r
isRecVertex = AlidNdPtHelper::TestRecVertex(vtxESD, GetAnalysisMode(), kFALSE);\r
}\r
+\r
if( IsUseMCInfo() && !evtCuts->IsRecVertexRequired() ) {\r
vtxESD = new AliESDVertex(vtxMC[2],10.,genHeader->NProduced(),"smearMC");\r
isRecVertex = kTRUE;\r
}\r
+\r
Bool_t isEventOK = evtCuts->AcceptEvent(esdEvent,mcEvent,vtxESD) && isRecVertex; \r
//printf("isEventOK %d, isEventTriggered %d \n",isEventOK, isEventTriggered);\r
+ //printf("GetAnalysisMode() %d \n",GetAnalysisMode());\r
\r
- // MB bias tracks\r
+ // vertex contributors\r
Int_t multMBTracks = 0; \r
- if(GetAnalysisMode() == AlidNdPtHelper::kTPC || GetAnalysisMode() == AlidNdPtHelper::kMCPion || \r
- GetAnalysisMode() == AlidNdPtHelper::kMCKaon || GetAnalysisMode() == AlidNdPtHelper::kMCProton || \r
- GetAnalysisMode() ==AlidNdPtHelper::kPlus || GetAnalysisMode() ==AlidNdPtHelper::kMinus) { \r
-\r
+ if(GetAnalysisMode() == AlidNdPtHelper::kTPC) \r
+ { \r
multMBTracks = AlidNdPtHelper::GetTPCMBTrackMult(esdEvent,evtCuts,accCuts,esdTrackCuts);\r
} \r
- else if(GetAnalysisMode() == AlidNdPtHelper::kTPCSPDvtx || GetAnalysisMode() == AlidNdPtHelper::kMCPion || \r
- GetAnalysisMode() == AlidNdPtHelper::kMCKaon || GetAnalysisMode() == AlidNdPtHelper::kMCProton || \r
- GetAnalysisMode() ==AlidNdPtHelper::kPlus || GetAnalysisMode() == AlidNdPtHelper::kMinus) {\r
-\r
- multMBTracks = AlidNdPtHelper::GetSPDMBTrackMult(esdEvent,0.0);\r
+ else if(GetAnalysisMode() == AlidNdPtHelper::kTPCSPDvtx || GetAnalysisMode()==AlidNdPtHelper::kTPCSPDvtxUpdate) \r
+ {\r
+ //multMBTracks = AlidNdPtHelper::GetSPDMBTrackMult(esdEvent,0.0);\r
+ if(vtxESD)\r
+ multMBTracks = vtxESD->GetNContributors();\r
} \r
else {\r
AliDebug(AliLog::kError, Form("Found analysis type %s", GetAnalysisMode()));\r
if(!allChargedTracks) return;\r
\r
Int_t entries = allChargedTracks->GetEntries();\r
+ //printf("entries %d \n",entries);\r
+\r
labelsAll = new Int_t[entries];\r
labelsAcc = new Int_t[entries];\r
labelsRec = new Int_t[entries];\r
AliESDtrack *track = (AliESDtrack*)allChargedTracks->At(i);\r
if(!track) continue;\r
if(track->Charge()==0) continue;\r
- \r
- FillHistograms(track,stack,AlidNdPtHelper::kAllTracks); \r
- labelsAll[multAll] = TMath::Abs(track->GetLabel());\r
- multAll++;\r
-\r
- if(accCuts->AcceptTrack(track)) {\r
- FillHistograms(track,stack,AlidNdPtHelper::kAccTracks); \r
- labelsAcc[multAcc] = TMath::Abs(track->GetLabel());\r
- multAcc++;\r
-\r
- if(esdTrackCuts->AcceptTrack(track)) {\r
- FillHistograms(track,stack,AlidNdPtHelper::kRecTracks); \r
- labelsRec[multRec] = TMath::Abs(track->GetLabel());\r
- multRec++;\r
+\r
+ // cosmics analysis\r
+ if( GetParticleMode()==AlidNdPtHelper::kCosmics && \r
+ AlidNdPtHelper::IsCosmicTrack(allChargedTracks, track, i, accCuts, esdTrackCuts)==kFALSE ) \r
+ continue;\r
+\r
+ // only postive charged \r
+ if(GetParticleMode() == AlidNdPtHelper::kPlus && track->Charge() < 0) \r
+ continue;\r
+ \r
+ // only negative charged \r
+ if(GetParticleMode() == AlidNdPtHelper::kMinus && track->Charge() > 0) \r
+ continue;\r
+\r
+ FillHistograms(track,stack,AlidNdPtHelper::kAllTracks); \r
+ labelsAll[multAll] = TMath::Abs(track->GetLabel());\r
+ multAll++;\r
+\r
+ //if(accCuts->AcceptTrack(track)) {\r
+ //FillHistograms(track,stack,AlidNdPtHelper::kAccTracks); \r
+ //labelsAcc[multAcc] = TMath::Abs(track->GetLabel());\r
+ //multAcc++;\r
+\r
+ if(esdTrackCuts->AcceptTrack(track)) \r
+ {\r
+ if(GetAnalysisMode() == AlidNdPtHelper::kTPCSPDvtxUpdate) {\r
+ // update track parameters\r
+ AliExternalTrackParam cParam;\r
+ track->RelateToVertexTPC(esdEvent->GetPrimaryVertexSPD(),esdEvent->GetMagneticField(),kVeryBig,&cParam);\r
+ track->Set(cParam.GetX(),cParam.GetAlpha(),cParam.GetParameter(),cParam.GetCovariance());\r
+\r
+ if(accCuts->AcceptTrack(track)) {\r
+ FillHistograms(track,stack,AlidNdPtHelper::kRecTracks); \r
+ labelsRec[multRec] = TMath::Abs(track->GetLabel());\r
+ multRec++;\r
+ } \r
+ }\r
+ else {\r
+ if(accCuts->AcceptTrack(track)) {\r
+ FillHistograms(track,stack,AlidNdPtHelper::kRecTracks); \r
+ labelsRec[multRec] = TMath::Abs(track->GetLabel());\r
+ multRec++;\r
+ }\r
+ }\r
}\r
- }\r
+ //}\r
} \r
// fill track multiplicity histograms\r
FillHistograms(allChargedTracks,labelsAll,multAll,labelsAcc,multAcc,labelsRec,multRec);\r
continue;\r
\r
// only postive charged \r
- if(GetAnalysisMode() == AlidNdPtHelper::kPlus && charge < 0.) \r
+ if(GetParticleMode() == AlidNdPtHelper::kPlus && charge < 0.) \r
continue;\r
\r
// only negative charged \r
- if(GetAnalysisMode() == AlidNdPtHelper::kMinus && charge > 0.) \r
+ if(GetParticleMode() == AlidNdPtHelper::kMinus && charge > 0.) \r
continue;\r
\r
// physical primary\r
\r
// all genertated primaries including neutral\r
if( iMc < stack->GetNprimary() ) {\r
- fGenTrackMatrix->Fill(vTrackMatrix);\r
+ //fGenTrackMatrix->Fill(vTrackMatrix);\r
}\r
\r
// only charged particles\r
continue;\r
\r
// only postive charged \r
- if(GetAnalysisMode() == AlidNdPtHelper::kPlus && charge < 0.) \r
+ if(GetParticleMode() == AlidNdPtHelper::kPlus && charge < 0.) \r
continue;\r
\r
// only negative charged \r
- if(GetAnalysisMode() == AlidNdPtHelper::kMinus && charge > 0.) \r
+ if(GetParticleMode() == AlidNdPtHelper::kMinus && charge > 0.) \r
continue;\r
\r
// physical primary\r
if(accCuts->AcceptTrack(particle)) \r
{\r
\r
- if( AlidNdPtHelper::IsPrimaryParticle(stack, iMc, GetAnalysisMode()) ) fGenPrimTrackMatrix->Fill(vTrackMatrix);\r
+ if( AlidNdPtHelper::IsPrimaryParticle(stack, iMc, GetParticleMode()) ) fGenPrimTrackMatrix->Fill(vTrackMatrix);\r
\r
// fill control histograms\r
if(fHistogramsOn) \r
if(iMc == labelsRec[iRec]) \r
{\r
fRecTrackMatrix->Fill(vTrackMatrix);\r
- if( AlidNdPtHelper::IsPrimaryParticle(stack, iMc, GetAnalysisMode()) ) fRecPrimTrackMatrix->Fill(vTrackMatrix);\r
+ if( AlidNdPtHelper::IsPrimaryParticle(stack, iMc, GetParticleMode()) ) fRecPrimTrackMatrix->Fill(vTrackMatrix);\r
if(!prim) fRecSecTrackMatrix->Fill(vTrackMatrix);\r
\r
// fill control histograms\r
//Float_t gphi = particle->Phi();\r
\r
Double_t dpt=0;\r
+ //printf("pt %f, gpt %f \n",pt,gpt);\r
if(gpt) dpt = (pt-gpt)/gpt;\r
Double_t deta = (eta-geta);\r
\r
aFolderObj->Add(h);\r
\r
// efficiency\r
+\r
h = AlidNdPtHelper::GenerateCorrMatrix(fRecPrimTrackMatrix->Projection(1), fGenPrimTrackMatrix->Projection(1),"pt_track_eff_matrix");\r
aFolderObj->Add(h);\r
\r
h = AlidNdPtHelper::GenerateCorrMatrix(fRecSecTrackMatrix->Projection(0),fRecTrackMatrix->Projection(0),"zv_track_cont_matrix");\r
aFolderObj->Add(h);\r
\r
+\r
h = AlidNdPtHelper::GenerateCorrMatrix(fRecSecTrackMatrix->Projection(1),fRecTrackMatrix->Projection(1),"pt_track_cont_matrix");\r
aFolderObj->Add(h);\r
\r
c->cd();\r
\r
//\r
- fRecMCTrackHist1->GetAxis(1)->SetRangeUser(-0.9,0.89); \r
+ fRecMCTrackHist1->GetAxis(1)->SetRangeUser(-0.8,0.79); \r
\r
h2F = (TH2F*)fRecMCTrackHist1->Projection(2,0);\r
h = AlidNdPtHelper::MakeResol(h2F,1,0,kTRUE,10);\r
Bool_t bRedoTPCVertex = evtCuts->IsRedoTPCVertex();\r
Bool_t bUseConstraints = evtCuts->IsUseBeamSpotConstraint();\r
vtxESD = AlidNdPtHelper::GetVertex(esdEvent,evtCuts,accCuts,esdTrackCuts,GetAnalysisMode(),kFALSE,bRedoTPCVertex,bUseConstraints); \r
- isRecVertex = AlidNdPtHelper::TestRecVertex(vtxESD, GetAnalysisMode(), kFALSE); // should be moved to AcceptEvent\r
+ isRecVertex = AlidNdPtHelper::TestRecVertex(vtxESD, GetAnalysisMode(), kFALSE); \r
}\r
if( IsUseMCInfo() && !evtCuts->IsRecVertexRequired() ) {\r
vtxESD = new AliESDVertex(vtxMC[2],10.,genHeader->NProduced());\r
//printf("isEventOK %d \n",isEventOK);\r
\r
//\r
- // get multiplicity of min. bias tracks\r
+ // get multiplicity vertex contributors\r
//\r
Int_t multMBTracks = 0; \r
if(GetAnalysisMode() == AlidNdPtHelper::kTPC || GetAnalysisMode() == AlidNdPtHelper::kMCRec) { \r
multMBTracks = AlidNdPtHelper::GetTPCMBTrackMult(esdEvent,evtCuts,accCuts,esdTrackCuts);\r
} \r
- else if(GetAnalysisMode() == AlidNdPtHelper::kTPCSPDvtx || GetAnalysisMode() == AlidNdPtHelper::kMCRec) {\r
- multMBTracks = AlidNdPtHelper::GetSPDMBTrackMult(esdEvent,0.0);\r
+ else if(GetAnalysisMode() == AlidNdPtHelper::kTPCSPDvtx || GetAnalysisMode() == AlidNdPtHelper::kTPCSPDvtxUpdate || GetAnalysisMode() == AlidNdPtHelper::kMCRec) {\r
+ //multMBTracks = AlidNdPtHelper::GetSPDMBTrackMult(esdEvent,0.0);\r
+ multMBTracks = vtxESD->GetNContributors();\r
} \r
else {\r
AliDebug(AliLog::kError, Form("Found analysis type %s", GetAnalysisMode()));\r
{\r
AliESDtrack *track = (AliESDtrack*)allChargedTracks->At(i);\r
if(!track) continue;\r
- if(accCuts->AcceptTrack(track)) \r
- {\r
- if(esdTrackCuts->AcceptTrack(track)) \r
- {\r
- multRecTemp++;\r
- }\r
- }\r
+ if(track->Charge()==0) continue;\r
+\r
+ // only postive charged \r
+ if(GetParticleMode() == AlidNdPtHelper::kPlus && track->Charge() < 0) \r
+ continue;\r
+ \r
+ // only negative charged \r
+ if(GetParticleMode() == AlidNdPtHelper::kMinus && track->Charge() > 0) \r
+ continue;\r
+\r
+ if(esdTrackCuts->AcceptTrack(track) && accCuts->AcceptTrack(track)) \r
+ multRecTemp++;\r
} \r
\r
+ //\r
for(Int_t i=0; i<entries;++i) \r
{\r
AliESDtrack *track = (AliESDtrack*)allChargedTracks->At(i);\r
if(!track) continue;\r
+ if(track->Charge()==0) continue;\r
+\r
+ // only postive charged \r
+ if(GetParticleMode() == AlidNdPtHelper::kPlus && track->Charge() < 0) \r
+ continue;\r
+ \r
+ // only negative charged \r
+ if(GetParticleMode() == AlidNdPtHelper::kMinus && track->Charge() > 0) \r
+ continue;\r
\r
- if(accCuts->AcceptTrack(track)) \r
+ // track-level corrections\r
+ if(esdTrackCuts->AcceptTrack(track)) \r
{\r
- if(esdTrackCuts->AcceptTrack(track)) \r
- {\r
- // track-level corrections\r
- if(GetAnalysisMode()==AlidNdPtHelper::kMCRec && IsUseMCInfo()) { \r
- FillHistograms(track,stack,AlidNdPtHelper::kRecTracks,vtxMC[2],multRecTemp); \r
- } else {\r
- FillHistograms(track,stack,AlidNdPtHelper::kRecTracks,vtxESD->GetZv(),multRecTemp); \r
- }\r
- labelsRec[multRec] = TMath::Abs(track->GetLabel());\r
- multRec++;\r
- }\r
- }\r
+ if (GetAnalysisMode()==AlidNdPtHelper::kTPCSPDvtxUpdate) \r
+ {\r
+ //\r
+ // update track parameters\r
+ //\r
+ AliExternalTrackParam cParam;\r
+ track->RelateToVertexTPC(esdEvent->GetPrimaryVertexSPD(),esdEvent->GetMagneticField(),kVeryBig,&cParam);\r
+ track->Set(cParam.GetX(),cParam.GetAlpha(),cParam.GetParameter(),cParam.GetCovariance());\r
+\r
+ if(accCuts->AcceptTrack(track)) { \r
+ FillHistograms(track,stack,AlidNdPtHelper::kRecTracks,vtxESD->GetZv(),multRecTemp); \r
+ labelsRec[multRec] = TMath::Abs(track->GetLabel());\r
+ multRec++;\r
+ }\r
+ }\r
+ else if (GetAnalysisMode()==AlidNdPtHelper::kMCRec && IsUseMCInfo()) \r
+ { \r
+ //\r
+ // Replace rec with MC\r
+ //\r
+ if(accCuts->AcceptTrack(track)) { \r
+ FillHistograms(track,stack,AlidNdPtHelper::kRecTracks,vtxMC[2],multRecTemp); \r
+ labelsRec[multRec] = TMath::Abs(track->GetLabel());\r
+ multRec++;\r
+ }\r
+ } \r
+ else {\r
+ //\r
+ // all the rest tracking scenarios\r
+ //\r
+ if(accCuts->AcceptTrack(track)) { \r
+ FillHistograms(track,stack,AlidNdPtHelper::kRecTracks,vtxESD->GetZv(),multRecTemp); \r
+ labelsRec[multRec] = TMath::Abs(track->GetLabel());\r
+ multRec++;\r
+ }\r
+ }\r
+ }\r
}\r
// event-level corrections\r
if(GetAnalysisMode()==AlidNdPtHelper::kMCRec && IsUseMCInfo()) { \r
Double_t charge = particle->GetPDG()->Charge()/3.;\r
if (charge == 0.0)\r
continue;\r
+\r
+ // only postive charged \r
+ if(GetParticleMode() == AlidNdPtHelper::kPlus && charge < 0.) \r
+ continue;\r
+ \r
+ // only negative charged \r
+ if(GetParticleMode() == AlidNdPtHelper::kMinus && charge > 0.) \r
+ continue;\r
\r
// physical primary\r
Bool_t prim = stack->IsPhysicalPrimary(iMc);\r
//\r
// set min and max values\r
//\r
- Double_t minPt = accCuts->GetMinPt();\r
- Double_t maxPt = accCuts->GetMaxPt();\r
- Double_t minEta = accCuts->GetMinEta();\r
- Double_t maxEta = accCuts->GetMaxEta()-0.00001;\r
+ //Double_t minPt = accCuts->GetMinPt();\r
+ //Double_t maxPt = accCuts->GetMaxPt();\r
+ //Double_t minEta = accCuts->GetMinEta();\r
+ //Double_t maxEta = accCuts->GetMaxEta()-0.00001;\r
\r
//\r
// pt profile\r
fMCEventHist->Sumw2();\r
\r
//Xv-mcXv:Yv-mcYv:Zv-mcZv:Mult\r
+ Float_t fact = 0.1;\r
Int_t binsRecMCEventHist[4]={100,100,100,150};\r
- Double_t minRecMCEventHist[4]={-10.0,-10.0,-10.0,0.}; \r
- Double_t maxRecMCEventHist[4]={10.0,10.0,10.0,150.}; \r
+ Double_t minRecMCEventHist[4]={-10.0*fact,-10.0*fact,-10.0*fact,0.}; \r
+ Double_t maxRecMCEventHist[4]={10.0*fact,10.0*fact,10.0*fact,150.}; \r
fRecMCEventHist = new THnSparseF("fRecMCEventHist","mcXv-Xv:mcYv-Yv:mcZv-Zv:Mult",4,binsRecMCEventHist,minRecMCEventHist,maxRecMCEventHist);\r
fRecMCEventHist->GetAxis(0)->SetTitle("mcXv-Xv (cm)");\r
fRecMCEventHist->GetAxis(1)->SetTitle("mcYv-Yv (cm)");\r
AliESDtrack *track = (AliESDtrack*)allChargedTracks->At(i);\r
if(!track) continue;\r
\r
+ //\r
+ if (GetAnalysisMode()==AlidNdPtHelper::kTPCSPDvtxUpdate) \r
+ {\r
+ //\r
+ // update track parameters\r
+ //\r
+ AliExternalTrackParam cParam;\r
+ track->RelateToVertexTPC(esdEvent->GetPrimaryVertexSPD(),esdEvent->GetMagneticField(),kVeryBig,&cParam);\r
+ track->Set(cParam.GetX(),cParam.GetAlpha(),cParam.GetParameter(),cParam.GetCovariance());\r
+ }\r
+\r
FillHistograms(track, stack);\r
multAll++;\r
}\r
#include <TLeaf.h>
#include <TArrayI.h>
#include <TF1.h>
+#include <TLorentzVector.h>
#include <AliHeader.h>
#include <AliStack.h>
#include <AliLog.h>
-#include <AliLog.h>
#include <AliESD.h>
#include <AliESDEvent.h>
#include <AliMCEvent.h>
const AliESDVertex* vertex = 0;
AliESDVertex *initVertex = 0;
- if (analysisMode == kSPD || analysisMode == kTPCITS || analysisMode == kTPCSPDvtx ||
- analysisMode == kMCRec || analysisMode == kMCPion || analysisMode == kMCKaon ||
- analysisMode == kMCProton || analysisMode ==kPlus || analysisMode ==kMinus )
+ if (analysisMode == kSPD || analysisMode == kTPCITS || analysisMode == kTPCSPDvtx || analysisMode == kTPCSPDvtxUpdate)
{
vertex = aEsd->GetPrimaryVertexSPD();
if (debug)
Printf("AlidNdPtHelper::GetVertex: Returning SPD vertex");
}
- else if (analysisMode == kTPC || analysisMode == kMCRec ||
- analysisMode == kMCPion || analysisMode == kMCKaon || analysisMode == kMCProton ||
- analysisMode == kPlus || analysisMode == kMinus)
+ else if (analysisMode == kTPC)
{
if(bRedoTPC) {
if(!vertex) return kFALSE;
Float_t requiredZResolution = -1;
- if (analysisMode == kSPD || analysisMode == kTPCITS || analysisMode == kTPCSPDvtx)
+ if (analysisMode == kSPD || analysisMode == kTPCITS || analysisMode == kTPCSPDvtx || analysisMode == kTPCSPDvtxUpdate)
{
requiredZResolution = 0.1;
}
- else if (analysisMode == kTPC || analysisMode == kMCRec ||
- analysisMode == kMCPion || analysisMode == kMCKaon ||
- analysisMode == kMCProton || analysisMode ==kPlus || analysisMode ==kMinus)
+ else if (analysisMode == kTPC)
requiredZResolution = 10.;
// check Ncontributors
}
//____________________________________________________________________
-Bool_t AlidNdPtHelper::IsPrimaryParticle(AliStack* stack, Int_t idx, AnalysisMode analysisMode)
+Bool_t AlidNdPtHelper::IsPrimaryParticle(AliStack* stack, Int_t idx, ParticleMode particleMode)
{
// check primary particles
-// depending on the analysis mode
+// depending on the particle mode
//
if(!stack) return kFALSE;
// physical primary
Bool_t prim = stack->IsPhysicalPrimary(idx);
- if(analysisMode==kMCPion) {
+ if(particleMode==kMCPion) {
if(prim && pdg==kPiPlus) return kTRUE;
else return kFALSE;
}
- if (analysisMode==kMCKaon) {
+ if (particleMode==kMCKaon) {
if(prim && pdg==kKPlus) return kTRUE;
else return kFALSE;
}
- if (analysisMode==kMCProton) {
+ if (particleMode==kMCProton) {
if(prim && pdg==kProton) return kTRUE;
else return kFALSE;
}
return prim;
}
+//____________________________________________________________________
+Bool_t AlidNdPtHelper::IsCosmicTrack(TObjArray *allChargedTracks, AliESDtrack *track1, Int_t trackIdx, AlidNdPtAcceptanceCuts *accCuts, AliESDtrackCuts *trackCuts)
+{
+//
+// check cosmic tracks
+//
+ if(!allChargedTracks) return kFALSE;
+ if(!track1) return kFALSE;
+ if(!accCuts) return kFALSE;
+ if(!trackCuts) return kFALSE;
+
+ Int_t entries = allChargedTracks->GetEntries();
+ for(Int_t i=0; i<entries;++i)
+ {
+ //
+ // exclude the same tracks
+ //
+ if(i == trackIdx) continue;
+
+ AliESDtrack *track2 = (AliESDtrack*)allChargedTracks->At(i);
+ if(!track2) continue;
+ if(track2->Charge()==0) continue;
+
+ /*
+ if(track1->Pt() > 6. && track2->Pt() > 6. && (track1->Charge() + track2->Charge()) == 0 )
+ {
+ printf("track1->Theta() %f, track1->Eta() %f, track1->Phi() %f, track1->Charge() %d \n", track1->Theta(), track1->Eta(), track1->Phi(), track1->Charge());
+ printf("track2->Theta() %f, track2->Eta() %f, track2->Phi() %f, track2->Charge() %d \n", track2->Theta(), track2->Eta(), track2->Phi(), track2->Charge());
+
+ printf("deta %f, dphi %f, dq %d \n", track1->Eta()-track2->Eta(), track1->Phi()-track2->Phi(), track1->Charge()+track2->Charge());
+
+ }
+ */
+
+ //
+ // cosmic tracks in TPC
+ //
+ //if( TMath::Abs( track1->Theta() - track2->Theta() ) < 0.004 &&
+ // ((TMath::Abs(track1->Phi()-track2->Phi()) - TMath::Pi() )<0.004) &&
+ if( (track1->Pt()-track2->Pt()) < 0.1 && track1->Pt() > 6.0 &&
+ (track1->Charge()+track2->Charge()) == 0 )
+ {
+ //printf("COSMIC candidate \n");
+ printf("track1->Theta() %f, track1->Eta() %f, track1->Phi() %f, track1->Charge() %d \n", track1->Theta(), track1->Eta(), track1->Phi(), track1->Charge());
+ printf("track2->Theta() %f, track2->Eta() %f, track2->Phi() %f, track2->Charge() %d \n", track2->Theta(), track2->Eta(), track2->Phi(), track2->Charge());
+ printf("dtheta %f, deta %f, dphi %f, dq %d \n", track1->Theta()-track2->Theta(), track1->Eta()-track2->Eta(), track1->Phi()-track2->Phi(), track1->Charge()+track2->Charge());
+ return kTRUE;
+ }
+ }
+
+return kFALSE;
+}
+
//____________________________________________________________________
void AlidNdPtHelper::PrintConf(AnalysisMode analysisMode, AliTriggerAnalysis::Trigger trigger)
{
case kTPC : str += "TPC-only"; break;
case kTPCITS : str += "Global tracking"; break;
case kTPCSPDvtx : str += "TPC tracking + SPD event vertex"; break;
+ case kTPCSPDvtxUpdate : str += "TPC tracks updated with SPD event vertex point"; break;
case kMCRec : str += "TPC tracking + Replace rec. with MC values"; break;
- case kMCPion : str += "TPC tracking + only pion MC tracks"; break;
- case kMCKaon : str += "TPC tracking + only kaon MC tracks"; break;
- case kMCProton : str += "TPC tracking + only proton MC tracks"; break;
- case kPlus: str += "TPC tracking + only positive charged tracks"; break;
- case kMinus : str += "TPC tracking + only negative charge tracks"; break;
}
str += " and trigger ";
AliESDtrack *track=0;
for (Int_t iTrack = 0; iTrack < esdEvent->GetNumberOfTracks(); iTrack++)
{
- if(analysisMode == AlidNdPtHelper::kTPC || analysisMode == AlidNdPtHelper::kTPCSPDvtx ||
- analysisMode == AlidNdPtHelper::kMCRec || analysisMode == kMCPion || analysisMode == kMCKaon ||
- analysisMode == kMCProton || analysisMode ==kPlus || analysisMode ==kMinus) {
-
- // track must be deleted by the user
+ if(analysisMode == AlidNdPtHelper::kTPC) {
+ // track must be deleted by user
track = AliESDtrackCuts::GetTPCOnlyTrack(esdEvent,iTrack);
- } else {
+ if(!track) continue;
+ }
+ else if (analysisMode == AlidNdPtHelper::kTPCSPDvtx || AlidNdPtHelper::kTPCSPDvtxUpdate)
+ {
+ // track must be deleted by the user
+ track = AlidNdPtHelper::GetTPCOnlyTrackSPDvtx(esdEvent,iTrack,kFALSE);
+ if(!track) continue;
+ }
+ else {
track=esdEvent->GetTrack(iTrack);
}
if(!track) continue;
if(track->Charge()==0) {
- if(analysisMode == AlidNdPtHelper::kTPC || analysisMode == AlidNdPtHelper::kTPCSPDvtx ||
- analysisMode == AlidNdPtHelper::kMCRec || analysisMode == kMCPion || analysisMode == kMCKaon ||
- analysisMode == kMCProton || analysisMode ==kPlus || analysisMode ==kMinus) {
-
+ if(analysisMode == AlidNdPtHelper::kTPC || analysisMode == AlidNdPtHelper::kTPCSPDvtx ||
+ analysisMode == AlidNdPtHelper::kTPCSPDvtxUpdate)
+ {
delete track; continue;
} else {
continue;
}
if(analysisMode == AlidNdPtHelper::kTPC || analysisMode == AlidNdPtHelper::kTPCSPDvtx ||
- analysisMode == AlidNdPtHelper::kMCRec || analysisMode == kMCPion || analysisMode == kMCKaon ||
- analysisMode == kMCProton || analysisMode ==kPlus || analysisMode ==kMinus) {
+ analysisMode == AlidNdPtHelper::kTPCSPDvtxUpdate) {
allTracks->SetOwner(kTRUE);
}
return allTracks;
}
+//_____________________________________________________________________________
+AliESDtrack *AlidNdPtHelper::GetTPCOnlyTrackSPDvtx(AliESDEvent* esdEvent, Int_t iTrack, Bool_t bUpdate)
+{
+//
+// Create ESD tracks from TPCinner parameters.
+// Propagte to DCA to SPD vertex.
+// Update using SPD vertex point (parameter)
+//
+// It is user responsibility to delete these tracks
+//
+
+ if (!esdEvent) return NULL;
+ if (!esdEvent->GetPrimaryVertexSPD() ) { return NULL; }
+ if (!esdEvent->GetPrimaryVertexSPD()->GetStatus() ) { return NULL; }
+
+ //
+ AliESDtrack* track = esdEvent->GetTrack(iTrack);
+ if (!track)
+ return NULL;
+
+ // create new ESD track
+ AliESDtrack *tpcTrack = new AliESDtrack();
+
+ // relate TPC-only tracks (TPCinner) to SPD vertex
+ AliExternalTrackParam cParam;
+ if(bUpdate) {
+ track->RelateToVertexTPC(esdEvent->GetPrimaryVertexSPD(),esdEvent->GetMagneticField(),kVeryBig,&cParam);
+ track->Set(cParam.GetX(),cParam.GetAlpha(),cParam.GetParameter(),cParam.GetCovariance());
+
+ // reject fake tracks
+ if(track->Pt() > 10000.) {
+ ::Error("Exclude no physical tracks","pt>10000. GeV");
+ delete tpcTrack;
+ return NULL;
+ }
+ }
+ else {
+ track->RelateToVertexTPC(esdEvent->GetPrimaryVertexSPD(), esdEvent->GetMagneticField(), kVeryBig);
+ }
+
+ // only true if we have a tpc track
+ if (!track->FillTPCOnlyTrack(*tpcTrack))
+ {
+ delete tpcTrack;
+ return NULL;
+ }
+
+return tpcTrack;
+}
+
//_____________________________________________________________________________
Int_t AlidNdPtHelper::GetTPCMBTrackMult(AliESDEvent *esdEvent, AlidNdPtEventCuts *evtCuts, AlidNdPtAcceptanceCuts *accCuts, AliESDtrackCuts *trackCuts)
{
class AlidNdPtHelper : public TObject
{
public:
- enum AnalysisMode { kInvalid = -1, kSPD = 0, kTPC, kTPCITS, kTPCSPDvtx, kMCRec, kMCPion, kMCKaon, kMCProton, kPlus, kMinus };
+ enum AnalysisMode { kInvalid = -1, kSPD = 0, kTPC, kTPCITS, kTPCSPDvtx, kTPCSPDvtxUpdate, kMCRec };
+ enum ParticleMode { kAllPart = 0, kMCPion, kMCKaon, kMCProton, kPlus, kMinus, kCosmics};
+
static const AliESDVertex* GetVertex(AliESDEvent* aEsd, AlidNdPtEventCuts *evtCuts, AlidNdPtAcceptanceCuts *accCuts, AliESDtrackCuts *trackCuts, AnalysisMode analysisMethod, Bool_t debug = kFALSE,Bool_t bRedoTPC = kFALSE, Bool_t bUseMeanVertex = kFALSE);
static const AliESDVertex* GetTPCVertexZ(AliESDEvent* aEsd, AlidNdPtEventCuts *evtCuts, AlidNdPtAcceptanceCuts *accCuts, AliESDtrackCuts *trackCuts, Float_t fraction=0.8, Int_t ntracksMin=2);
static Bool_t TestRecVertex(const AliESDVertex* vertex, AnalysisMode analysisMode, Bool_t debug = kFALSE);
- static Bool_t IsPrimaryParticle(AliStack *stack, Int_t idx, AnalysisMode analysisMode);
+ static Bool_t IsPrimaryParticle(AliStack *stack, Int_t idx, ParticleMode particleMode);
+ static Bool_t IsCosmicTrack(TObjArray *allChargedTracks, AliESDtrack *track, Int_t trackIdx, AlidNdPtAcceptanceCuts *accCuts, AliESDtrackCuts *trackCuts);
static void PrintConf(AnalysisMode analysisMode, AliTriggerAnalysis::Trigger trigger);
static Int_t ConvertPdgToPid(TParticle *particle);
static Int_t GetSPDMBPrimTrackMult(AliESDEvent* esdEvent, AliStack * stack, Float_t deltaThetaCut =0.025, Float_t deltaPhiCut = 0.08);
static Int_t GetMCTrueTrackMult(AliMCEvent *mcEvent, AlidNdPtEventCuts *evtCuts, AlidNdPtAcceptanceCuts *accCuts);
+ static AliESDtrack* GetTPCOnlyTrackSPDvtx(AliESDEvent* esdEvent, Int_t iTrack, Bool_t bUpdate);
+
static void PrintMCInfo(AliStack *pStack, Int_t label);
static TH1* ScaleByBinWidth(TH1 *hist=0);