#include "TTreeStream.h"\r
#include "TTree.h"\r
#include "TH1F.h"\r
+#include "TH3.h"\r
#include "TCanvas.h"\r
#include "TList.h"\r
#include "TObjArray.h"\r
#include "AliESDInputHandler.h"\r
#include "AliESDVertex.h"\r
#include "AliTracker.h"\r
+#include "AliVTrack.h"\r
#include "AliGeomManager.h"\r
\r
#include "AliCentrality.h"\r
, fPitList(0)\r
, fUseMCInfo(kFALSE)\r
, fUseESDfriends(kFALSE)\r
+ , fReducePileUp(kTRUE)\r
+ , fFillTree(kTRUE)\r
, fFilteredTreeEventCuts(0)\r
, fFilteredTreeAcceptanceCuts(0)\r
, fFilteredTreeRecAcceptanceCuts(0)\r
, fLaserTree(0)\r
, fMCEffTree(0)\r
, fCosmicPairsTree(0)\r
+ , fPtResPhiPtTPC(0)\r
+ , fPtResPhiPtTPCc(0)\r
+ , fPtResPhiPtTPCITS(0)\r
+ , fPtResEtaPtTPC(0)\r
+ , fPtResEtaPtTPCc(0)\r
+ , fPtResEtaPtTPCITS(0)\r
+ , fPtResCentPtTPC(0)\r
+ , fPtResCentPtTPCc(0)\r
+ , fPtResCentPtTPCITS(0)\r
{\r
// Constructor\r
\r
DefineOutput(4, TTree::Class());\r
DefineOutput(5, TTree::Class());\r
DefineOutput(6, TTree::Class());\r
+ DefineOutput(7, TList::Class());\r
}\r
\r
//_____________________________________________________________________________\r
AliAnalysisTaskFilteredTree::~AliAnalysisTaskFilteredTree()\r
{\r
- if(fOutput) delete fOutput; fOutput =0; \r
- if(fTreeSRedirector) delete fTreeSRedirector; fTreeSRedirector =0; \r
-\r
- if(fFilteredTreeEventCuts) delete fFilteredTreeEventCuts; fFilteredTreeEventCuts=NULL; \r
- if(fFilteredTreeAcceptanceCuts) delete fFilteredTreeAcceptanceCuts; fFilteredTreeAcceptanceCuts=NULL;\r
- if(fFilteredTreeRecAcceptanceCuts) delete fFilteredTreeRecAcceptanceCuts; fFilteredTreeRecAcceptanceCuts=NULL; \r
- if(fEsdTrackCuts) delete fEsdTrackCuts; fEsdTrackCuts=NULL;\r
+ //the output trees not to be deleted in case of proof analysis\r
+ //Bool_t deleteTrees=kTRUE;\r
+ //if ((AliAnalysisManager::GetAnalysisManager()))\r
+ //{\r
+ // if (AliAnalysisManager::GetAnalysisManager()->GetAnalysisType() == \r
+ // AliAnalysisManager::kProofAnalysis)\r
+ // deleteTrees=kFALSE;\r
+ //}\r
+ //if (deleteTrees) delete fTreeSRedirector;\r
+\r
+ delete fFilteredTreeEventCuts;\r
+ delete fFilteredTreeAcceptanceCuts;\r
+ delete fFilteredTreeRecAcceptanceCuts;\r
+ delete fEsdTrackCuts;\r
}\r
\r
//____________________________________________________________________________\r
{\r
// Create histograms\r
// Called once\r
- fOutput = new TList;\r
- fOutput->SetOwner();\r
\r
//\r
- // create temporary file for output tree\r
- fTreeSRedirector = new TTreeSRedirector("jotwinow_Temp_Trees.root");\r
+ //get the output file to make sure the trees will be associated to it\r
+ OpenFile(1);\r
+ fTreeSRedirector = new TTreeSRedirector();\r
\r
-\r
-\r
//\r
// Create trees\r
- fHighPtTree = new TTree;\r
- fV0Tree = new TTree;\r
- fdEdxTree = new TTree;\r
- fLaserTree = new TTree;\r
- fMCEffTree = new TTree;\r
- fCosmicPairsTree = new TTree;\r
-\r
- fOutput->Add(fHighPtTree);\r
- fOutput->Add(fV0Tree);\r
- fOutput->Add(fdEdxTree);\r
- fOutput->Add(fLaserTree);\r
- fOutput->Add(fMCEffTree);\r
- fOutput->Add(fCosmicPairsTree);\r
-\r
- PostData(1,fHighPtTree);\r
- PostData(2,fV0Tree);\r
+ fV0Tree = ((*fTreeSRedirector)<<"V0s").GetTree();\r
+ fHighPtTree = ((*fTreeSRedirector)<<"highPt").GetTree();\r
+ fdEdxTree = ((*fTreeSRedirector)<<"dEdx").GetTree();\r
+ fLaserTree = ((*fTreeSRedirector)<<"Laser").GetTree();\r
+ fMCEffTree = ((*fTreeSRedirector)<<"MCEffTree").GetTree();\r
+ fCosmicPairsTree = ((*fTreeSRedirector)<<"CosmicPairs").GetTree();\r
+\r
+\r
+\r
+\r
+ // histogram booking\r
+\r
+ Double_t minPt = 0.1; \r
+ Double_t maxPt = 100.; \r
+ Int_t nbinsPt = 30; \r
+\r
+ Double_t logminPt = TMath::Log10(minPt);\r
+ Double_t logmaxPt = TMath::Log10(maxPt);\r
+ Double_t binwidth = (logmaxPt-logminPt)/nbinsPt;\r
+ Double_t *binsPt = new Double_t[nbinsPt+1];\r
+ binsPt[0] = minPt;\r
+ for (Int_t i=1;i<=nbinsPt;i++) {\r
+ binsPt[i] = minPt + TMath::Power(10,logminPt+i*binwidth);\r
+ }\r
+\r
+ // 1pT resol cov matrix bins\r
+ Double_t min1PtRes = 0.; \r
+ Double_t max1PtRes = 0.3; \r
+ Int_t nbins1PtRes = 300; \r
+ Double_t bins1PtRes[301];\r
+ for (Int_t i=0;i<=nbins1PtRes;i++) {\r
+ bins1PtRes[i] = min1PtRes + i*(max1PtRes-min1PtRes)/nbins1PtRes;\r
+ }\r
+\r
+ // phi bins\r
+ Double_t minPhi = 0.; \r
+ Double_t maxPhi = 6.5; \r
+ Int_t nbinsPhi = 100; \r
+ Double_t binsPhi[101];\r
+ for (Int_t i=0;i<=nbinsPhi;i++) {\r
+ binsPhi[i] = minPhi + i*(maxPhi-minPhi)/nbinsPhi;\r
+ }\r
+\r
+ // eta bins\r
+ Double_t minEta = -1.;\r
+ Double_t maxEta = 1.;\r
+ Int_t nbinsEta = 20;\r
+ Double_t binsEta[21];\r
+ for (Int_t i=0;i<=nbinsEta;i++) {\r
+ binsEta[i] = minEta + i*(maxEta-minEta)/nbinsEta;\r
+ }\r
+\r
+ // mult bins\r
+ Double_t minCent = 0.;\r
+ Double_t maxCent = 100;\r
+ Int_t nbinsCent = 20;\r
+ Double_t binsCent[101];\r
+ for (Int_t i=0;i<=nbinsCent;i++) {\r
+ binsCent[i] = minCent + i*(maxCent-minCent)/nbinsCent;\r
+ }\r
+ \r
+ fPtResPhiPtTPC = new TH3D("fPtResPhiPtTPC","pt rel. resolution from cov. matrix TPC tracks",nbinsPt,binsPt,nbinsPhi,binsPhi,nbins1PtRes,bins1PtRes);\r
+ fPtResPhiPtTPCc = new TH3D("fPtResPhiPtTPCc","pt rel. resolution from cov. matrix TPC constrained tracks",nbinsPt,binsPt,nbinsPhi,binsPhi,nbins1PtRes,bins1PtRes);\r
+ fPtResPhiPtTPCITS = new TH3D("fPtResPhiPtTPCITS","pt rel. resolution from cov. matrix TPC+ITS tracks",nbinsPt,binsPt,nbinsPhi,binsPhi,nbins1PtRes,bins1PtRes);\r
+ \r
+fPtResEtaPtTPC = new TH3D("fPtResEtaPtTPC","pt rel. resolution from cov. matrix TPC tracks",nbinsPt,binsPt,nbinsEta,binsEta,nbins1PtRes,bins1PtRes);\r
+ fPtResEtaPtTPCc = new TH3D("fPtResEtaPtTPCc","pt rel. resolution from cov. matrix TPC constrained tracks",nbinsPt,binsPt,nbinsEta,binsEta,nbins1PtRes,bins1PtRes);\r
+ fPtResEtaPtTPCITS = new TH3D("fPtResEtaPtTPCITS","pt rel. resolution from cov. matrix TPC+ITS tracks",nbinsPt,binsPt,nbinsEta,binsEta,nbins1PtRes,bins1PtRes);\r
+ \r
+fPtResCentPtTPC = new TH3D("fPtResCentPtTPC","pt rel. resolution from cov. matrix TPC tracks",nbinsPt,binsPt,nbinsCent,binsCent,nbins1PtRes,bins1PtRes);\r
+ fPtResCentPtTPCc = new TH3D("fPtResCentPtTPCc","pt rel. resolution from cov. matrix TPC constrained tracks",nbinsPt,binsPt,nbinsCent,binsCent,nbins1PtRes,bins1PtRes);\r
+ fPtResCentPtTPCITS = new TH3D("fPtResCentPtTPCITS","pt rel. resolution from cov. matrix TPC+ITS tracks",nbinsPt,binsPt,nbinsCent,binsCent,nbins1PtRes,bins1PtRes);\r
+\r
+ \r
+ fOutput = new TList; \r
+ if(!fOutput) return;\r
+ fOutput->SetOwner();\r
+\r
+ fOutput->Add(fPtResPhiPtTPC);\r
+ fOutput->Add(fPtResPhiPtTPCc);\r
+ fOutput->Add(fPtResPhiPtTPCITS);\r
+ fOutput->Add(fPtResEtaPtTPC);\r
+ fOutput->Add(fPtResEtaPtTPCc);\r
+ fOutput->Add(fPtResEtaPtTPCITS);\r
+ fOutput->Add(fPtResCentPtTPC);\r
+ fOutput->Add(fPtResCentPtTPCc);\r
+ fOutput->Add(fPtResCentPtTPCITS);\r
+\r
+ // post data to outputs\r
+\r
+ PostData(1,fV0Tree);\r
+ PostData(2,fHighPtTree);\r
PostData(3,fdEdxTree);\r
PostData(4,fLaserTree);\r
PostData(5,fMCEffTree);\r
PostData(6,fCosmicPairsTree);\r
- \r
+\r
+ PostData(7,fOutput);\r
}\r
\r
//_____________________________________________________________________________\r
return;\r
}\r
\r
- // MC event\r
- if(fUseMCInfo) {\r
- fMC = MCEvent();\r
- if (!fMC) {\r
- Printf("ERROR: MC event not available");\r
- return;\r
- }\r
- }\r
+ //// MC event\r
+ //if(fUseMCInfo) {\r
+ // fMC = MCEvent();\r
+ // if (!fMC) {\r
+ // Printf("ERROR: MC event not available");\r
+ // return;\r
+ // }\r
+ //}\r
+ \r
+ //if MC info available - use it.\r
+ fMC = MCEvent();\r
\r
if(fUseESDfriends) {\r
fESDfriend = static_cast<AliESDfriend*>(fESD->FindListObject("AliESDfriend"));\r
ProcessdEdx(fESD,fMC,fESDfriend);\r
\r
if (fProcessCosmics) { ProcessCosmics(fESD); }\r
- if(IsUseMCInfo()) { ProcessMCEff(fESD,fMC,fESDfriend); }\r
+ if(fMC) { ProcessMCEff(fESD,fMC,fESDfriend);}\r
}\r
\r
//_____________________________________________________________________________\r
// vertex\r
// TPC-ITS tracks\r
//\r
+\r
+ //fCosmicPairsTree->Branch("fileName",&fileName,32000,0);\r
+ //fCosmicPairsTree->Branch("runNumber",&runNumber,"runNumber/I");\r
+ //fCosmicPairsTree->Branch("timeStamp",&timeStamp,"timeStamp/I");\r
+ //fCosmicPairsTree->Branch("eventNumber",&eventNumber,"eventNumber/I");\r
+ //fCosmicPairsTree->Branch("triggerMask",&triggerMask,32000,0);\r
+ //fCosmicPairsTree->Branch("triggerClass",&triggerClass,32000,0);\r
+ //fCosmicPairsTree->Branch("magField",&magField,"magField/F");\r
+ //fCosmicPairsTree->Branch("ntracksSPD",&ntracksSPD,"ntracksSPD/I");\r
+ //fCosmicPairsTree->Branch("ntracksTPC",&ntracksTPC,"ntracksTPC/I");\r
+ //fCosmicPairsTree->Branch("vertexSPD",vertexSPD,32000,0);\r
+ //fCosmicPairsTree->Branch("vertexTPC",vertexTPC,32000,0);\r
+ //fCosmicPairsTree->Branch("track0",track0,32000,0);\r
+ //fCosmicPairsTree->Branch("track1",track1,32000,0);\r
+ //\r
+ //fCosmicPairsTree->Fill();\r
+\r
+ if(!fFillTree) return;\r
if(!fTreeSRedirector) return;\r
(*fTreeSRedirector)<<"CosmicPairs"<<\r
"fileName.="<<&fileName<< // file name\r
TArrayF vtxMC(3);\r
\r
Int_t multMCTrueTracks = 0;\r
- if(IsUseMCInfo())\r
+ if(mcEvent)\r
{\r
- //\r
- if(!mcEvent) {\r
- AliDebug(AliLog::kError, "mcEvent not available");\r
- return;\r
- }\r
// get MC event header\r
header = mcEvent->Header();\r
if (!header) {\r
// multipliticy of all MC primary tracks\r
// in Zv, pt and eta ranges)\r
multMCTrueTracks = GetMCTrueTrackMult(mcEvent,evtCuts,accCuts);\r
-\r
} // end bUseMC\r
\r
// get reconstructed vertex \r
Bool_t isEventOK = evtCuts->AcceptEvent(esdEvent,mcEvent,vtxESD); \r
//printf("isEventOK %d, isEventTriggered %d, status %d, vz %f \n",isEventOK, isEventTriggered, vtxESD->GetStatus(), vtxESD->GetZv());\r
//printf("GetAnalysisMode() %d \n",GetAnalysisMode());\r
-\r
+ Int_t ntracks = esdEvent->GetNumberOfTracks();\r
\r
// check event cuts\r
if(isEventOK && isEventTriggered)\r
vert[1] = vtxESD->GetYv();\r
vert[2] = vtxESD->GetZv();\r
Int_t mult = vtxESD->GetNContributors();\r
- Double_t bz = esdEvent->GetMagneticField();\r
- Double_t runNumber = esdEvent->GetRunNumber();\r
- Double_t evtTimeStamp = esdEvent->GetTimeStamp();\r
+ Float_t bz = esdEvent->GetMagneticField();\r
+ Int_t runNumber = esdEvent->GetRunNumber();\r
+ Int_t evtTimeStamp = esdEvent->GetTimeStamp();\r
Int_t evtNumberInFile = esdEvent->GetEventNumberInFile();\r
\r
// high pT tracks\r
// TPC-ITS tracks\r
//\r
TObjString triggerClass = esdEvent->GetFiredTriggerClasses().Data();\r
+\r
+ //fHighPtTree->Branch("fileName",&fileName,32000,0);\r
+ //fHighPtTree->Branch("runNumber",&runNumber,"runNumber/I");\r
+ //fHighPtTree->Branch("evtTimeStamp",&evtTimeStamp,"evtTimeStamp/I");\r
+ //fHighPtTree->Branch("evtNumberInFile",&evtNumberInFile,"evtNumberInFile/I");\r
+ //fHighPtTree->Branch("triggerClass",&triggerClass,32000,0);\r
+ //fHighPtTree->Branch("Bz",&bz,"Bz/F");\r
+ //fHighPtTree->Branch("vtxESD",vtxESD,32000,0);\r
+ //fHighPtTree->Branch("IRtot",&ir1,"IRtot/I");\r
+ //fHighPtTree->Branch("IRint2",&ir2,"IRint2/I");\r
+ //fHighPtTree->Branch("mult",&mult,"mult/I");\r
+ //fHighPtTree->Branch("esdTrack",track,32000,0);\r
+ //fHighPtTree->Branch("centralityF",¢ralityF,"centralityF/F");\r
+\r
+ //fHighPtTree->Fill();\r
+\r
+ //Double_t vtxX=vtxESD->GetX();\r
+ //Double_t vtxY=vtxESD->GetY();\r
+ //Double_t vtxZ=vtxESD->GetZ();\r
+ if(!fFillTree) return;\r
if(!fTreeSRedirector) return;\r
(*fTreeSRedirector)<<"highPt"<<\r
- "fileName.="<<&fileName<<\r
+ "fileName.="<<&fileName<< \r
"runNumber="<<runNumber<<\r
"evtTimeStamp="<<evtTimeStamp<<\r
"evtNumberInFile="<<evtNumberInFile<<\r
"triggerClass="<<&triggerClass<< // trigger\r
- "Bz="<<bz<<\r
+ "Bz="<<bz<< // magnetic field\r
"vtxESD.="<<vtxESD<<\r
- "IRtot="<<ir1<<\r
+ "ntracksESD="<<ntracks<< // number of tracks in the ESD\r
+ // "vtxESDx="<<vtxX<<\r
+ // "vtxESDy="<<vtxY<<\r
+ // "vtxESDz="<<vtxZ<<\r
+ "IRtot="<<ir1<< // interaction record history info\r
"IRint2="<<ir2<<\r
- "mult="<<mult<<\r
+ "mult="<<mult<< // multiplicity of tracks pointing to the primary vertex\r
"esdTrack.="<<track<<\r
- "centralityF="<<centralityF<<\r
+ "centralityF="<<centralityF<< \r
"\n";\r
}\r
}\r
\r
if(countLaserTracks > 100) \r
{ \r
- Double_t runNumber = esdEvent->GetRunNumber();\r
- Double_t evtTimeStamp = esdEvent->GetTimeStamp();\r
+ Int_t runNumber = esdEvent->GetRunNumber();\r
+ Int_t evtTimeStamp = esdEvent->GetTimeStamp();\r
Int_t evtNumberInFile = esdEvent->GetEventNumberInFile();\r
- Double_t bz = esdEvent->GetMagneticField();\r
+ Float_t bz = esdEvent->GetMagneticField();\r
TObjString triggerClass = esdEvent->GetFiredTriggerClasses().Data();\r
\r
+ //fLaserTree->Branch("fileName",&fileName,32000,0);\r
+ //fLaserTree->Branch("runNumber",&runNumber,"runNumber/I");\r
+ //fLaserTree->Branch("evtTimeStamp",&evtTimeStamp,"evtTimeStamp/I");\r
+ //fLaserTree->Branch("evtNumberInFile",&evtNumberInFile,"evtNumberInFile/I");\r
+ //fLaserTree->Branch("triggerClass",&triggerClass,32000,0);\r
+ //fLaserTree->Branch("Bz",&bz,"Bz/F");\r
+ //fLaserTree->Branch("multTPCtracks",&countLaserTracks,"multTPCtracks/I");\r
+\r
+ //fLaserTree->Fill();\r
+\r
+ if(!fFillTree) return;\r
if(!fTreeSRedirector) return;\r
(*fTreeSRedirector)<<"Laser"<<\r
"fileName.="<<&fileName<<\r
isEventTriggered = inputHandler->IsEventSelected() & AliVEvent::kMB;\r
\r
physicsSelection = static_cast<AliPhysicsSelection*> (inputHandler->GetEventSelection());\r
- if(!physicsSelection) return;\r
+ if(!physicsSelection) {AliInfo("no physics selection"); return;}\r
//SetPhysicsTriggerSelection(physicsSelection);\r
\r
if (isEventTriggered && (GetTrigger() == AliTriggerAnalysis::kV0AND)) {\r
// set trigger (V0AND)\r
triggerAnalysis = physicsSelection->GetTriggerAnalysis();\r
- if(!triggerAnalysis) return;\r
+ if(!triggerAnalysis) {AliInfo("no trigger analysis");return;}\r
isEventTriggered = triggerAnalysis->IsOfflineTriggerFired(esdEvent, GetTrigger());\r
}\r
}\r
TArrayF vtxMC(3);\r
\r
Int_t multMCTrueTracks = 0;\r
- if(IsUseMCInfo())\r
+ if(mcEvent)\r
{\r
- //\r
- if(!mcEvent) {\r
- AliDebug(AliLog::kError, "mcEvent not available");\r
- return;\r
- }\r
// get MC event header\r
header = mcEvent->Header();\r
if (!header) {\r
vtxESD = (AliESDVertex*)esdEvent->GetPrimaryVertexTracks();\r
}\r
else {\r
+ AliInfo("no ESD vertex");\r
return;\r
}\r
\r
//\r
AliESDHeader *esdHeader = 0;\r
esdHeader = esdEvent->GetHeader();\r
- if(!esdHeader) return;\r
+ if(!esdHeader) {AliInfo("no esdHeader");return;}\r
//Int_t ir1 = esdHeader->GetTriggerIREntries(); //all ir-s\r
//Int_t ir2 = esdHeader->GetTriggerIREntries(-1,1); // int2 set, 180 ms time interval\r
//\r
vert[1] = vtxESD->GetYv();\r
vert[2] = vtxESD->GetZv();\r
Int_t mult = vtxESD->GetNContributors();\r
- Double_t bz = esdEvent->GetMagneticField();\r
- Double_t runNumber = esdEvent->GetRunNumber();\r
- Double_t evtTimeStamp = esdEvent->GetTimeStamp();\r
+ Float_t bz = esdEvent->GetMagneticField();\r
+ Int_t runNumber = esdEvent->GetRunNumber();\r
+ Int_t evtTimeStamp = esdEvent->GetTimeStamp();\r
Int_t evtNumberInFile = esdEvent->GetEventNumberInFile();\r
\r
// high pT tracks\r
Bool_t isFromMaterial=kFALSE, isFromMaterialTPC=kFALSE, isFromMaterialITS=kFALSE;\r
\r
AliTrackReference *refTPCIn = NULL;\r
+ AliTrackReference *refTPCOut = NULL;\r
AliTrackReference *refITS = NULL;\r
+ AliTrackReference *refTRD = NULL;\r
+ AliTrackReference *refTOF = NULL;\r
+ AliTrackReference *refEMCAL = NULL;\r
+ AliTrackReference *refPHOS = NULL;\r
+ Int_t nrefTPC=0, nrefTRD=0, nrefTOF=0, nrefITS=0, nrefEMCAL=0, nrefPHOS=0;\r
\r
Bool_t isOKtrackInnerC3 = kFALSE;\r
AliExternalTrackParam *trackInnerC3 = new AliExternalTrackParam(*(track->GetInnerParam()));\r
\r
- if(IsUseMCInfo()) \r
+ if(mcEvent) \r
{\r
if(!stack) return;\r
\r
//\r
TParticle *part=0;\r
TClonesArray *trefs=0;\r
- Int_t status = mcEvent->GetParticleAndTR(track->GetTPCLabel(), part, trefs);\r
+ Int_t status = mcEvent->GetParticleAndTR(TMath::Abs(track->GetTPCLabel()), part, trefs);\r
\r
if(status>0 && part && trefs && part->GetPDG() && part->GetPDG()->Charge()!=0.) \r
{\r
AliTrackReference *ref = (AliTrackReference *)trefs->At(iref);\r
\r
// Ref. in the middle ITS \r
- if(ref && ref->DetectorId()==AliTrackReference::kITS)\r
+ if(ref && ref->Label()==label && ref->DetectorId()==AliTrackReference::kITS)\r
{\r
+ nrefITS++;\r
if(!refITS && countITS==2) {\r
refITS = ref;\r
//printf("refITS %p \n",refITS);\r
}\r
\r
// TPC\r
- if(ref && ref->DetectorId()==AliTrackReference::kTPC)\r
+ if(ref && ref->Label()==label && ref->DetectorId()==AliTrackReference::kTPC)\r
{\r
+ nrefTPC++;\r
+ refTPCOut=ref;\r
if(!refTPCIn) {\r
refTPCIn = ref;\r
//printf("refTPCIn %p \n",refTPCIn);\r
//break;\r
}\r
}\r
+ // TRD\r
+ if(ref && ref->Label()==label && ref->DetectorId()==AliTrackReference::kTRD)\r
+ {\r
+ nrefTRD++;\r
+ if(!refTRD) {\r
+ refTRD = ref;\r
+ }\r
+ }\r
+ // TOF\r
+ if(ref && ref->Label()==label && ref->DetectorId()==AliTrackReference::kTOF)\r
+ {\r
+ nrefTOF++;\r
+ if(!refTOF) {\r
+ refTOF = ref;\r
+ }\r
+ }\r
+ // EMCAL\r
+ if(ref && ref->Label()==label && ref->DetectorId()==AliTrackReference::kEMCAL)\r
+ {\r
+ nrefEMCAL++;\r
+ if(!refEMCAL) {\r
+ refEMCAL = ref;\r
+ }\r
+ }\r
+ // PHOS\r
+ // if(ref && ref->Label()==label && ref->DetectorId()==AliTrackReference::kPHOS)\r
+// {\r
+// nrefPHOS++;\r
+// if(!refPHOS) {\r
+// refPHOS = ref;\r
+// }\r
+// }\r
}\r
\r
// transform inner params to TrackRef\r
\r
if(isOKtpcInnerC && isOKtrackInnerC) dumpToTree = kTRUE;\r
if(fUseESDfriends && isOKtrackInnerC2 && isOKouterITSc) dumpToTree = kTRUE;\r
- if(fUseMCInfo && isOKtrackInnerC3) dumpToTree = kTRUE;\r
+ if(mcEvent && isOKtrackInnerC3) dumpToTree = kTRUE;\r
TObjString triggerClass = esdEvent->GetFiredTriggerClasses().Data();\r
-\r
+ if (fReducePileUp){ \r
+ //\r
+ // 18.03 - Reduce pile-up chunks, done outside of the ESDTrackCuts for 2012/2013 data pile-up about 95 % of tracks\r
+ // Done only in case no MC info \r
+ //\r
+ Float_t dcaTPC[2];\r
+ track->GetImpactParametersTPC(dcaTPC[0],dcaTPC[1]);\r
+ Bool_t isRoughPrimary = TMath::Abs(dcaTPC[1])<10;\r
+ Bool_t hasOuter=(track->IsOn(AliVTrack::kITSin))||(track->IsOn(AliVTrack::kTOFout))||(track->IsOn(AliVTrack::kTRDin));\r
+ Bool_t keepPileUp=gRandom->Rndm()<0.05;\r
+ if ( (!hasOuter) && (!isRoughPrimary) && (!keepPileUp)){\r
+ dumpToTree=kFALSE;\r
+ }\r
+ }\r
+ /////////////////\r
+ //book keeping of created dummy objects (to avoid NULL in trees)\r
+ Bool_t newvtxESD=kFALSE;\r
+ Bool_t newtrack=kFALSE;\r
+ Bool_t newtpcInnerC=kFALSE;\r
+ Bool_t newtrackInnerC=kFALSE;\r
+ Bool_t newtrackInnerC2=kFALSE;\r
+ Bool_t newouterITSc=kFALSE;\r
+ Bool_t newtrackInnerC3=kFALSE;\r
+ Bool_t newrefTPCIn=kFALSE;\r
+ Bool_t newrefITS=kFALSE;\r
+ Bool_t newparticle=kFALSE;\r
+ Bool_t newparticleMother=kFALSE;\r
+ Bool_t newparticleTPC=kFALSE;\r
+ Bool_t newparticleMotherTPC=kFALSE;\r
+ Bool_t newparticleITS=kFALSE;\r
+ Bool_t newparticleMotherITS=kFALSE;\r
+ \r
+ //check that the vertex is there and that it is OK, \r
+ //i.e. no null member arrays, otherwise a problem with merging\r
+ //later on.\r
+ //this is a very ugly hack!\r
+ if (!vtxESD)\r
+ {\r
+ AliInfo("fixing the ESD vertex for streaming");\r
+ vtxESD=new AliESDVertex(); \r
+ //vtxESD->SetNContributors(1);\r
+ //UShort_t pindices[1]; pindices[0]=0;\r
+ //vtxESD->SetIndices(1,pindices);\r
+ //vtxESD->SetNContributors(0);\r
+ newvtxESD=kTRUE;\r
+ }\r
//\r
- if(fTreeSRedirector && dumpToTree) \r
+ if (!track) {track=new AliESDtrack();newtrack=kTRUE;}\r
+ if (!tpcInnerC) {tpcInnerC=new AliExternalTrackParam();newtpcInnerC=kTRUE;}\r
+ if (!trackInnerC) {trackInnerC=new AliExternalTrackParam();newtrackInnerC=kTRUE;}\r
+ if (!trackInnerC2) {trackInnerC2=new AliExternalTrackParam();newtrackInnerC2=kTRUE;}\r
+ if (!outerITSc) {outerITSc=new AliExternalTrackParam();newouterITSc=kTRUE;}\r
+ if (!trackInnerC3) {trackInnerC3=new AliExternalTrackParam();newtrackInnerC3=kTRUE;}\r
+ if (mcEvent)\r
+ {\r
+ if (!refTPCIn) {refTPCIn=new AliTrackReference(); newrefTPCIn=kTRUE;}\r
+ if (!refITS) {refITS=new AliTrackReference();newrefITS=kTRUE;}\r
+ if (!particle) {particle=new TParticle(); newparticle=kTRUE;}\r
+ if (!particleMother) {particleMother=new TParticle();newparticleMother=kTRUE;}\r
+ if (!particleTPC) {particleTPC=new TParticle();newparticleTPC=kTRUE;}\r
+ if (!particleMotherTPC) {particleMotherTPC=new TParticle();newparticleMotherTPC=kTRUE;}\r
+ if (!particleITS) {particleITS=new TParticle();newparticleITS=kTRUE;}\r
+ if (!particleMotherITS) {particleMotherITS=new TParticle();newparticleMotherITS=kTRUE;}\r
+ }\r
+ /////////////////////////\r
+\r
+ //Double_t vtxX=vtxESD->GetX();\r
+ //Double_t vtxY=vtxESD->GetY();\r
+ //Double_t vtxZ=vtxESD->GetZ();\r
+\r
+ AliESDVertex* pvtxESD = (AliESDVertex*)vtxESD->Clone();\r
+ AliESDtrack* ptrack=(AliESDtrack*)track->Clone();\r
+ AliExternalTrackParam* ptpcInnerC = (AliExternalTrackParam*)tpcInnerC->Clone();\r
+ AliExternalTrackParam* ptrackInnerC = (AliExternalTrackParam*)trackInnerC->Clone();\r
+ AliExternalTrackParam* ptrackInnerC2 = (AliExternalTrackParam*)trackInnerC2->Clone();\r
+ AliExternalTrackParam* pouterITSc = (AliExternalTrackParam*)outerITSc->Clone();\r
+ AliExternalTrackParam* ptrackInnerC3 = (AliExternalTrackParam*)trackInnerC3->Clone();\r
+ Int_t ntracks = esdEvent->GetNumberOfTracks();\r
+ \r
+ // fill histograms\r
+ FillHistograms(ptrack, ptpcInnerC, mult, (Double_t)chi2(0,0));\r
+\r
+ if(fTreeSRedirector && dumpToTree && fFillTree) \r
{\r
+\r
(*fTreeSRedirector)<<"highPt"<<\r
- "fileName.="<<&fileName<<\r
- "runNumber="<<runNumber<<\r
- "evtTimeStamp="<<evtTimeStamp<<\r
- "evtNumberInFile="<<evtNumberInFile<<\r
- "triggerClass="<<&triggerClass<< // trigger\r
- "Bz="<<bz<<\r
- "vtxESD.="<<vtxESD<<\r
- "IRtot="<<ir1<<\r
- "IRint2="<<ir2<<\r
- "mult="<<mult<<\r
- "esdTrack.="<<track<<\r
- "extTPCInnerC.="<<tpcInnerC<<\r
- "extInnerParamC.="<<trackInnerC<<\r
- "extInnerParam.="<<trackInnerC2<<\r
- "extOuterITS.="<<outerITSc<<\r
- "extInnerParamRef.="<<trackInnerC3<<\r
- "refTPCIn.="<<refTPCIn<<\r
- "refITS.="<<refITS<<\r
- "chi2TPCInnerC="<<chi2(0,0)<<\r
- "chi2InnerC="<<chi2trackC(0,0)<<\r
- "chi2OuterITS="<<chi2OuterITS(0,0)<<\r
- "centralityF="<<centralityF<<\r
- "particle.="<<particle<<\r
- "particleMother.="<<particleMother<<\r
- "mech="<<mech<<\r
- "isPrim="<<isPrim<<\r
- "isFromStrangess="<<isFromStrangess<<\r
- "isFromConversion="<<isFromConversion<<\r
- "isFromMaterial="<<isFromMaterial<<\r
- "particleTPC.="<<particleTPC<<\r
- "particleMotherTPC.="<<particleMotherTPC<<\r
- "mechTPC="<<mechTPC<<\r
- "isPrimTPC="<<isPrimTPC<<\r
- "isFromStrangessTPC="<<isFromStrangessTPC<<\r
- "isFromConversionTPC="<<isFromConversionTPC<<\r
- "isFromMaterialTPC="<<isFromMaterialTPC<<\r
- "particleITS.="<<particleITS<<\r
- "particleMotherITS.="<<particleMotherITS<<\r
- "mechITS="<<mechITS<<\r
- "isPrimITS="<<isPrimITS<<\r
- "isFromStrangessITS="<<isFromStrangessITS<<\r
- "isFromConversionITS="<<isFromConversionITS<<\r
- "isFromMaterialITS="<<isFromMaterialITS<<\r
- "\n";\r
+ "fileName.="<<&fileName<< // name of the chunk file (hopefully full)\r
+ "runNumber="<<runNumber<< // runNumber\r
+ "evtTimeStamp="<<evtTimeStamp<< // time stamp of event (in seconds)\r
+ "evtNumberInFile="<<evtNumberInFile<< // event number\r
+ "triggerClass="<<&triggerClass<< // trigger class as a string\r
+ "Bz="<<bz<< // solenoid magnetic field in the z direction (in kGaus)\r
+ "vtxESD.="<<pvtxESD<< // vertexer ESD tracks (can be biased by TPC pileup tracks)\r
+ //"vtxESDx="<<vtxX<<\r
+ //"vtxESDy="<<vtxY<<\r
+ //"vtxESDz="<<vtxZ<<\r
+ "IRtot="<<ir1<< // interaction record (trigger) counters - coutner 1\r
+ "IRint2="<<ir2<< // interaction record (trigger) coutners - counter 2\r
+ "mult="<<mult<< // multiplicity of tracks pointing to the primary vertex\r
+ "ntracks="<<ntracks<< // number of the esd tracks (to take into account the pileup in the TPC)\r
+ "esdTrack.="<<ptrack<< // esdTrack as used in the physical analysis\r
+ "extTPCInnerC.="<<ptpcInnerC<< // ??? \r
+ "extInnerParamC.="<<ptrackInnerC<< // ???\r
+ "extInnerParam.="<<ptrackInnerC2<< // ???\r
+ "extOuterITS.="<<pouterITSc<< // ???\r
+ "extInnerParamRef.="<<ptrackInnerC3<< // ???\r
+ "chi2TPCInnerC="<<chi2(0,0)<< // chi2 of tracks ???\r
+ "chi2InnerC="<<chi2trackC(0,0)<< // chi2s of tracks TPCinner to the combined\r
+ "chi2OuterITS="<<chi2OuterITS(0,0)<< // chi2s of tracks TPC at inner wall to the ITSout\r
+ "centralityF="<<centralityF;\r
+ if (mcEvent)\r
+ {\r
+ AliTrackReference refDummy;\r
+ if (!refITS) refITS = &refDummy;\r
+ if (!refTRD) refTRD = &refDummy;\r
+ if (!refTOF) refTOF = &refDummy;\r
+ if (!refEMCAL) refEMCAL = &refDummy;\r
+ if (!refPHOS) refPHOS = &refDummy;\r
+ (*fTreeSRedirector)<<"highPt"<< \r
+ "nrefITS="<<nrefITS<< // number of track references in the ITS\r
+ "nrefTPC="<<nrefTPC<< // number of track references in the TPC\r
+ "nrefTRD="<<nrefTRD<< // number of track references in the TRD\r
+ "nrefTOF="<<nrefTOF<< // number of track references in the TOF\r
+ "nrefEMCAL="<<nrefEMCAL<< // number of track references in the TOF\r
+ "nrefPHOS="<<nrefPHOS<< // number of track references in the TOF\r
+ "refTPCIn.="<<refTPCIn<<\r
+ "refTPCOut.="<<refTPCOut<<\r
+ "refITS.="<<refITS<< \r
+ "refTRD.="<<refTRD<< \r
+ "refTOF.="<<refTOF<< \r
+ "refEMCAL.="<<refEMCAL<< \r
+ "refPHOS.="<<refPHOS<< \r
+ "particle.="<<particle<<\r
+ "particleMother.="<<particleMother<<\r
+ "mech="<<mech<<\r
+ "isPrim="<<isPrim<<\r
+ "isFromStrangess="<<isFromStrangess<<\r
+ "isFromConversion="<<isFromConversion<<\r
+ "isFromMaterial="<<isFromMaterial<<\r
+ "particleTPC.="<<particleTPC<<\r
+ "particleMotherTPC.="<<particleMotherTPC<<\r
+ "mechTPC="<<mechTPC<<\r
+ "isPrimTPC="<<isPrimTPC<<\r
+ "isFromStrangessTPC="<<isFromStrangessTPC<<\r
+ "isFromConversionTPC="<<isFromConversionTPC<<\r
+ "isFromMaterialTPC="<<isFromMaterialTPC<<\r
+ "particleITS.="<<particleITS<<\r
+ "particleMotherITS.="<<particleMotherITS<<\r
+ "mechITS="<<mechITS<<\r
+ "isPrimITS="<<isPrimITS<<\r
+ "isFromStrangessITS="<<isFromStrangessITS<<\r
+ "isFromConversionITS="<<isFromConversionITS<<\r
+ "isFromMaterialITS="<<isFromMaterialITS;\r
}\r
- \r
- if(tpcInnerC) delete tpcInnerC;\r
- if(trackInnerC) delete trackInnerC;\r
- if(trackInnerC2) delete trackInnerC2;\r
- if(outerITSc) delete outerITSc;\r
- if(trackInnerC3) delete trackInnerC3;\r
+ //finish writing the entry\r
+ AliInfo("writing tree highPt");\r
+ (*fTreeSRedirector)<<"highPt"<<"\n";\r
+ }\r
+\r
+ delete pvtxESD;\r
+ delete ptrack;\r
+ delete ptpcInnerC;\r
+ delete ptrackInnerC;\r
+ delete ptrackInnerC2;\r
+ delete pouterITSc;\r
+ delete ptrackInnerC3;\r
+\r
+ ////////////////////\r
+ //delete the dummy objects we might have created.\r
+ if (newvtxESD) {delete vtxESD; vtxESD=NULL;}\r
+ if (newtrack) {delete track; track=NULL;}\r
+ if (newtpcInnerC) {delete tpcInnerC; tpcInnerC=NULL;}\r
+ if (newtrackInnerC) {delete trackInnerC; trackInnerC=NULL;}\r
+ if (newtrackInnerC2) {delete trackInnerC2; trackInnerC2=NULL;}\r
+ if (newouterITSc) {delete outerITSc; outerITSc=NULL;}\r
+ if (newtrackInnerC3) {delete trackInnerC3; trackInnerC3=NULL;}\r
+ if (newrefTPCIn) {delete refTPCIn; refTPCIn=NULL;}\r
+ if (newrefITS) {delete refITS; refITS=NULL;}\r
+ if (newparticle) {delete particle; particle=NULL;}\r
+ if (newparticleMother) {delete particleMother; particleMother=NULL;}\r
+ if (newparticleTPC) {delete particleTPC; particleTPC=NULL;}\r
+ if (newparticleMotherTPC) {delete particleMotherTPC; particleMotherTPC=NULL;}\r
+ if (newparticleITS) {delete particleITS; particleITS=NULL;}\r
+ if (newparticleMotherITS) {delete particleMotherITS; particleMotherITS=NULL;}\r
+ ///////////////\r
+\r
+ delete tpcInnerC;\r
+ delete trackInnerC;\r
+ delete trackInnerC2;\r
+ delete outerITSc;\r
+ delete trackInnerC3;\r
}\r
}\r
- \r
+\r
}\r
\r
\r
{\r
//\r
// Fill tree for efficiency studies MC only\r
+ AliInfo("we start!");\r
\r
if(!esdEvent) {\r
AliDebug(AliLog::kError, "esdEvent not available");\r
return;\r
}\r
\r
- if(!mcEvent) {\r
+ if(!mcEvent) {\r
AliDebug(AliLog::kError, "mcEvent not available");\r
return;\r
}\r
Printf("ERROR: Could not receive input handler");\r
return;\r
}\r
- \r
+\r
// get file name\r
TTree *chain = (TChain*)GetInputData(0);\r
if(!chain) { \r
TArrayF vtxMC(3);\r
\r
Int_t multMCTrueTracks = 0;\r
- if(IsUseMCInfo())\r
- {\r
- //\r
- if(!mcEvent) {\r
- AliDebug(AliLog::kError, "mcEvent not available");\r
- return;\r
- }\r
- // get MC event header\r
- header = mcEvent->Header();\r
- if (!header) {\r
- AliDebug(AliLog::kError, "Header not available");\r
- return;\r
- }\r
- // MC particle stack\r
- stack = mcEvent->Stack();\r
- if (!stack) {\r
- AliDebug(AliLog::kError, "Stack not available");\r
- return;\r
- }\r
+ //\r
+ if(!mcEvent) {\r
+ AliDebug(AliLog::kError, "mcEvent not available");\r
+ return;\r
+ }\r
+ // get MC event header\r
+ header = mcEvent->Header();\r
+ if (!header) {\r
+ AliDebug(AliLog::kError, "Header not available");\r
+ return;\r
+ }\r
+ // MC particle stack\r
+ stack = mcEvent->Stack();\r
+ if (!stack) {\r
+ AliDebug(AliLog::kError, "Stack not available");\r
+ return;\r
+ }\r
\r
- // get MC vertex\r
- genHeader = header->GenEventHeader();\r
- if (!genHeader) {\r
- AliDebug(AliLog::kError, "Could not retrieve genHeader from Header");\r
- return;\r
- }\r
- genHeader->PrimaryVertex(vtxMC);\r
+ // get MC vertex\r
+ genHeader = header->GenEventHeader();\r
+ if (!genHeader) {\r
+ AliDebug(AliLog::kError, "Could not retrieve genHeader from Header");\r
+ return;\r
+ }\r
+ genHeader->PrimaryVertex(vtxMC);\r
\r
- // multipliticy of all MC primary tracks\r
- // in Zv, pt and eta ranges)\r
- multMCTrueTracks = GetMCTrueTrackMult(mcEvent,evtCuts,accCuts);\r
+ // multipliticy of all MC primary tracks\r
+ // in Zv, pt and eta ranges)\r
+ multMCTrueTracks = GetMCTrueTrackMult(mcEvent,evtCuts,accCuts);\r
\r
- } // end bUseMC\r
\r
// get reconstructed vertex \r
//const AliESDVertex* vtxESD = 0; \r
AliESDVertex* vtxESD = 0; \r
if(GetAnalysisMode() == kTPCAnalysisMode) {\r
- vtxESD = (AliESDVertex*)esdEvent->GetPrimaryVertexTPC();\r
+ vtxESD = (AliESDVertex*)esdEvent->GetPrimaryVertexTPC();\r
}\r
else if(GetAnalysisMode() == kTPCITSAnalysisMode) {\r
- vtxESD = (AliESDVertex*)esdEvent->GetPrimaryVertexTracks();\r
+ vtxESD = (AliESDVertex*)esdEvent->GetPrimaryVertexTracks();\r
}\r
else {\r
- return;\r
+ return;\r
}\r
\r
if(!vtxESD) return;\r
// check event cuts\r
if(isEventOK && isEventTriggered)\r
{\r
- if(IsUseMCInfo()) \r
+ //if(!stack) return;\r
+\r
+ //\r
+ // MC info\r
+ //\r
+ TParticle *particle=NULL;\r
+ TParticle *particleMother=NULL;\r
+ Int_t mech=-1;\r
+\r
+ // reco event info\r
+ Double_t vert[3] = {0}; \r
+ vert[0] = vtxESD->GetXv();\r
+ vert[1] = vtxESD->GetYv();\r
+ vert[2] = vtxESD->GetZv();\r
+ Int_t mult = vtxESD->GetNContributors();\r
+ Double_t bz = esdEvent->GetMagneticField();\r
+ Double_t runNumber = esdEvent->GetRunNumber();\r
+ Double_t evtTimeStamp = esdEvent->GetTimeStamp();\r
+ Int_t evtNumberInFile = esdEvent->GetEventNumberInFile();\r
+\r
+ // loop over MC stack\r
+ for (Int_t iMc = 0; iMc < stack->GetNtrack(); ++iMc) \r
{\r
- if(!stack) return;\r
+ particle = stack->Particle(iMc);\r
+ if (!particle)\r
+ continue;\r
+\r
+ // only charged particles\r
+ if(!particle->GetPDG()) continue;\r
+ Double_t charge = particle->GetPDG()->Charge()/3.;\r
+ if (TMath::Abs(charge) < 0.001)\r
+ continue;\r
+\r
+ // only primary particles\r
+ Bool_t prim = stack->IsPhysicalPrimary(iMc);\r
+ if(!prim) continue;\r
+\r
+ // downscale low-pT particles\r
+ Double_t scalempt= TMath::Min(particle->Pt(),10.);\r
+ Double_t downscaleF = gRandom->Rndm();\r
+ downscaleF *= fLowPtTrackDownscaligF;\r
+ if(TMath::Exp(2*scalempt)<downscaleF) continue;\r
\r
- //\r
- // MC info\r
- //\r
- TParticle *particle=NULL;\r
- TParticle *particleMother=NULL;\r
- Int_t mech=-1;\r
-\r
- // reco event info\r
- Double_t vert[3] = {0}; \r
- vert[0] = vtxESD->GetXv();\r
- vert[1] = vtxESD->GetYv();\r
- vert[2] = vtxESD->GetZv();\r
- Int_t mult = vtxESD->GetNContributors();\r
- Double_t bz = esdEvent->GetMagneticField();\r
- Double_t runNumber = esdEvent->GetRunNumber();\r
- Double_t evtTimeStamp = esdEvent->GetTimeStamp();\r
- Int_t evtNumberInFile = esdEvent->GetEventNumberInFile();\r
+ // is particle in acceptance\r
+ if(!accCuts->AcceptTrack(particle)) continue;\r
\r
- // loop over MC stack\r
- for (Int_t iMc = 0; iMc < stack->GetNtrack(); ++iMc) \r
+ // check if particle reconstructed\r
+ Bool_t isRec = kFALSE;\r
+ Int_t trackIndex = -1;\r
+ for (Int_t iTrack = 0; iTrack < esdEvent->GetNumberOfTracks(); iTrack++)\r
{\r
- particle = stack->Particle(iMc);\r
- if (!particle)\r
- continue;\r
-\r
- // only charged particles\r
- if(!particle->GetPDG()) continue;\r
- Double_t charge = particle->GetPDG()->Charge()/3.;\r
- if (TMath::Abs(charge) < 0.001)\r
- continue;\r
-\r
- // only primary particles\r
- Bool_t prim = stack->IsPhysicalPrimary(iMc);\r
- if(!prim) continue;\r
-\r
- // downscale low-pT particles\r
- Double_t scalempt= TMath::Min(particle->Pt(),10.);\r
- Double_t downscaleF = gRandom->Rndm();\r
- downscaleF *= fLowPtTrackDownscaligF;\r
- if(TMath::Exp(2*scalempt)<downscaleF) continue;\r
-\r
- // is particle in acceptance\r
- if(!accCuts->AcceptTrack(particle)) continue;\r
- \r
- // check if particle reconstructed\r
- Bool_t isRec = kFALSE;\r
- Int_t trackIndex = -1;\r
- for (Int_t iTrack = 0; iTrack < esdEvent->GetNumberOfTracks(); iTrack++)\r
- {\r
- \r
- AliESDtrack *track = esdEvent->GetTrack(iTrack);\r
- if(!track) continue;\r
- if(track->Charge()==0) continue;\r
- if(esdTrackCuts->AcceptTrack(track) && accCuts->AcceptTrack(track)) \r
- {\r
- Int_t label = TMath::Abs(track->GetLabel());\r
- if(label == iMc) {\r
- isRec = kTRUE;\r
- trackIndex = iTrack;\r
- break;\r
- }\r
- } \r
- }\r
-\r
- // Store information in the output tree\r
- AliESDtrack *recTrack = NULL; \r
- if(trackIndex>-1) { \r
- recTrack = esdEvent->GetTrack(trackIndex); \r
- } else {\r
- recTrack = new AliESDtrack(); \r
- } \r
-\r
- particleMother = GetMother(particle,stack);\r
- mech = particle->GetUniqueID();\r
-\r
- //MC particle track length\r
- Double_t tpcTrackLength = 0.;\r
- AliMCParticle *mcParticle = (AliMCParticle*) mcEvent->GetTrack(iMc);\r
- if(mcParticle) {\r
- Int_t counter;\r
- tpcTrackLength = mcParticle->GetTPCTrackLength(bz,0.05,counter,3.0);\r
- } \r
-\r
-\r
- //\r
- if(fTreeSRedirector) {\r
- (*fTreeSRedirector)<<"MCEffTree"<<\r
- "fileName.="<<&fileName<<\r
- "triggerClass.="<<&triggerClass<<\r
- "runNumber="<<runNumber<<\r
- "evtTimeStamp="<<evtTimeStamp<<\r
- "evtNumberInFile="<<evtNumberInFile<<\r
- "Bz="<<bz<<\r
- "vtxESD.="<<vtxESD<<\r
- "mult="<<mult<<\r
- "esdTrack.="<<recTrack<<\r
- "isRec="<<isRec<<\r
- "tpcTrackLength="<<tpcTrackLength<<\r
- "particle.="<<particle<<\r
- "particleMother.="<<particleMother<<\r
- "mech="<<mech<<\r
- "\n";\r
- }\r
-\r
- if(trackIndex <0 && recTrack) delete recTrack; recTrack=0;\r
+\r
+ AliESDtrack *track = esdEvent->GetTrack(iTrack);\r
+ if(!track) continue;\r
+ if(track->Charge()==0) continue;\r
+ if(esdTrackCuts->AcceptTrack(track) && accCuts->AcceptTrack(track)) \r
+ {\r
+ Int_t label = TMath::Abs(track->GetLabel());\r
+ if(label == iMc) {\r
+ isRec = kTRUE;\r
+ trackIndex = iTrack;\r
+ break;\r
+ }\r
+ } \r
}\r
+\r
+ // Store information in the output tree\r
+ AliESDtrack *recTrack = NULL; \r
+ if(trackIndex>-1) { \r
+ recTrack = esdEvent->GetTrack(trackIndex); \r
+ } else {\r
+ recTrack = new AliESDtrack(); \r
+ } \r
+\r
+ particleMother = GetMother(particle,stack);\r
+ mech = particle->GetUniqueID();\r
+\r
+ //MC particle track length\r
+ Double_t tpcTrackLength = 0.;\r
+ AliMCParticle *mcParticle = (AliMCParticle*) mcEvent->GetTrack(iMc);\r
+ if(mcParticle) {\r
+ Int_t counter;\r
+ tpcTrackLength = mcParticle->GetTPCTrackLength(bz,0.05,counter,3.0);\r
+ } \r
+\r
+\r
+ //\r
+ if(fTreeSRedirector && fFillTree) {\r
+ (*fTreeSRedirector)<<"MCEffTree"<<\r
+ "fileName.="<<&fileName<<\r
+ "triggerClass.="<<&triggerClass<<\r
+ "runNumber="<<runNumber<<\r
+ "evtTimeStamp="<<evtTimeStamp<<\r
+ "evtNumberInFile="<<evtNumberInFile<<\r
+ "Bz="<<bz<<\r
+ "vtxESD.="<<vtxESD<<\r
+ "mult="<<mult<<\r
+ "esdTrack.="<<recTrack<<\r
+ "isRec="<<isRec<<\r
+ "tpcTrackLength="<<tpcTrackLength<<\r
+ "particle.="<<particle<<\r
+ "particleMother.="<<particleMother<<\r
+ "mech="<<mech<<\r
+ "\n";\r
+ }\r
+\r
+ if(trackIndex <0 && recTrack) delete recTrack; recTrack=0;\r
}\r
}\r
- \r
+\r
}\r
\r
//_____________________________________________________________________________\r
void AliAnalysisTaskFilteredTree::ProcessV0(AliESDEvent *const esdEvent, AliMCEvent * const mcEvent, AliESDfriend *const /*esdFriend*/)\r
{\r
//\r
- // Select real events with V0 (K0s and Lambda) high-pT candidates\r
+ // Select real events with V0 (K0s and Lambda and Gamma) high-pT candidates\r
//\r
if(!esdEvent) {\r
AliDebug(AliLog::kError, "esdEvent not available");\r
if (type==0) continue; \r
TObjString triggerClass = esdEvent->GetFiredTriggerClasses().Data();\r
\r
+ if(!fFillTree) return;\r
if(!fTreeSRedirector) return;\r
(*fTreeSRedirector)<<"V0s"<<\r
"isDownscaled="<<isDownscaled<<\r
if(!IsHighDeDxParticle(track)) continue;\r
TObjString triggerClass = esdEvent->GetFiredTriggerClasses().Data();\r
\r
+ if(!fFillTree) return;\r
if(!fTreeSRedirector) return;\r
(*fTreeSRedirector)<<"dEdx"<<\r
"fileName.="<<&fileName<<\r
Double_t scalempt= TMath::Min(maxPt,10.);\r
Double_t downscaleF = gRandom->Rndm();\r
downscaleF *= fLowPtV0DownscaligF;\r
- \r
+ //\r
+ // Special treatment of the gamma conversion pt spectra is softer - \r
+ Double_t mass00= v0->GetEffMass(0,0);\r
+ const Double_t cutMass=0.2;\r
+ if (TMath::Abs(mass00-0)<cutMass){\r
+ downscaleF/=10.; // 10 times smaller downscaling for the gamma concersion candidate\r
+ }\r
//printf("V0 TMath::Exp(2*scalempt) %e, downscaleF %e \n",TMath::Exp(2*scalempt), downscaleF);\r
if (TMath::Exp(2*scalempt)<downscaleF) return kTRUE;\r
return kFALSE;\r
// locally on working node\r
//\r
\r
- // must be deleted to store trees\r
- if(fTreeSRedirector) delete fTreeSRedirector; fTreeSRedirector=0;\r
-\r
- // open temporary file and copy trees to the ouptut container\r
-\r
- TChain* chain = 0;\r
- //\r
- chain = new TChain("highPt");\r
- if(chain) { \r
- chain->Add("jotwinow_Temp_Trees.root");\r
- fHighPtTree = chain->CopyTree("1");\r
- delete chain; chain=0; \r
- }\r
- if(fHighPtTree) fHighPtTree->Print();\r
-\r
- //\r
- chain = new TChain("V0s");\r
- if(chain) { \r
- chain->Add("jotwinow_Temp_Trees.root");\r
- fV0Tree = chain->CopyTree("1");\r
- delete chain; chain=0; \r
- }\r
- if(fV0Tree) fV0Tree->Print();\r
-\r
- //\r
- chain = new TChain("dEdx");\r
- if(chain) { \r
- chain->Add("jotwinow_Temp_Trees.root");\r
- fdEdxTree = chain->CopyTree("1");\r
- delete chain; chain=0; \r
- }\r
- if(fdEdxTree) fdEdxTree->Print();\r
-\r
- //\r
- chain = new TChain("Laser");\r
- if(chain) { \r
- chain->Add("jotwinow_Temp_Trees.root");\r
- fLaserTree = chain->CopyTree("1");\r
- delete chain; chain=0; \r
- }\r
- if(fLaserTree) fLaserTree->Print();\r
-\r
- //\r
- chain = new TChain("MCEffTree");\r
- if(chain) { \r
- chain->Add("jotwinow_Temp_Trees.root");\r
- fMCEffTree = chain->CopyTree("1");\r
- delete chain; chain=0; \r
- }\r
- if(fMCEffTree) fMCEffTree->Print();\r
-\r
- //\r
- chain = new TChain("CosmicPairs");\r
- if(chain) { \r
- chain->Add("jotwinow_Temp_Trees.root");\r
- fCosmicPairsTree = chain->CopyTree("1");\r
- delete chain; chain=0; \r
+ //// must be deleted to store trees\r
+ //if(fTreeSRedirector) delete fTreeSRedirector; fTreeSRedirector=0;\r
+\r
+ //// open temporary file and copy trees to the ouptut container\r
+\r
+ //TChain* chain = 0;\r
+ ////\r
+ //chain = new TChain("highPt");\r
+ //if(chain) { \r
+ // chain->Add("jotwinow_Temp_Trees.root");\r
+ // fHighPtTree = chain->CopyTree("1");\r
+ // delete chain; chain=0; \r
+ //}\r
+ //if(fHighPtTree) fHighPtTree->Print();\r
+\r
+ ////\r
+ //chain = new TChain("V0s");\r
+ //if(chain) { \r
+ // chain->Add("jotwinow_Temp_Trees.root");\r
+ // fV0Tree = chain->CopyTree("1");\r
+ // delete chain; chain=0; \r
+ //}\r
+ //if(fV0Tree) fV0Tree->Print();\r
+\r
+ ////\r
+ //chain = new TChain("dEdx");\r
+ //if(chain) { \r
+ // chain->Add("jotwinow_Temp_Trees.root");\r
+ // fdEdxTree = chain->CopyTree("1");\r
+ // delete chain; chain=0; \r
+ //}\r
+ //if(fdEdxTree) fdEdxTree->Print();\r
+\r
+ ////\r
+ //chain = new TChain("Laser");\r
+ //if(chain) { \r
+ // chain->Add("jotwinow_Temp_Trees.root");\r
+ // fLaserTree = chain->CopyTree("1");\r
+ // delete chain; chain=0; \r
+ //}\r
+ //if(fLaserTree) fLaserTree->Print();\r
+\r
+ ////\r
+ //chain = new TChain("MCEffTree");\r
+ //if(chain) { \r
+ // chain->Add("jotwinow_Temp_Trees.root");\r
+ // fMCEffTree = chain->CopyTree("1");\r
+ // delete chain; chain=0; \r
+ //}\r
+ //if(fMCEffTree) fMCEffTree->Print();\r
+\r
+ ////\r
+ //chain = new TChain("CosmicPairs");\r
+ //if(chain) { \r
+ // chain->Add("jotwinow_Temp_Trees.root");\r
+ // fCosmicPairsTree = chain->CopyTree("1");\r
+ // delete chain; chain=0; \r
+ //}\r
+ //if(fCosmicPairsTree) fCosmicPairsTree->Print(); \r
+\r
+ Bool_t deleteTrees=kTRUE;\r
+ if ((AliAnalysisManager::GetAnalysisManager()))\r
+ {\r
+ if (AliAnalysisManager::GetAnalysisManager()->GetAnalysisType() == \r
+ AliAnalysisManager::kProofAnalysis)\r
+ deleteTrees=kFALSE;\r
}\r
- if(fCosmicPairsTree) fCosmicPairsTree->Print(); \r
+ if (deleteTrees) delete fTreeSRedirector;\r
+ fTreeSRedirector=NULL;\r
\r
-\r
- OpenFile(1);\r
+ //OpenFile(1);\r
\r
// Post output data.\r
- PostData(1, fHighPtTree);\r
- PostData(2, fV0Tree);\r
- PostData(3, fdEdxTree);\r
- PostData(4, fLaserTree);\r
- PostData(5, fMCEffTree);\r
- PostData(6, fCosmicPairsTree);\r
+ //PostData(1, fHighPtTree);\r
+ //PostData(2, fV0Tree);\r
+ //PostData(3, fdEdxTree);\r
+ //PostData(4, fLaserTree);\r
+ //PostData(5, fMCEffTree);\r
+ //PostData(6, fCosmicPairsTree);\r
}\r
\r
//_____________________________________________________________________________\r
return;\r
}\r
*/\r
+ \r
}\r
\r
//_____________________________________________________________________________\r
return mult; \r
}\r
\r
+//_____________________________________________________________________________\r
+void AliAnalysisTaskFilteredTree::FillHistograms(AliESDtrack* const ptrack, AliExternalTrackParam* const ptpcInnerC, const Double_t centralityF, const Double_t chi2TPCInnerC) \r
+{\r
+//\r
+// Fill pT relative resolution histograms for \r
+// TPC only, TPC only constrained to vertex and TPC+ITS tracking\r
+//\r
+ if(!ptrack) return; \r
+ if(!ptpcInnerC) return; \r
+\r
+ const AliExternalTrackParam * innerParam = (AliExternalTrackParam *) ptrack->GetInnerParam();\r
+ if(!innerParam) return;\r
+\r
+ Float_t dxy, dz;\r
+ ptrack->GetImpactParameters(dxy,dz);\r
+\r
+// TPC+ITS primary tracks \r
+if( abs(ptrack->Eta())<0.8 && \r
+ ptrack->GetTPCClusterInfo(3,1)>130 && \r
+ ptrack->IsOn(0x40) && \r
+ ptrack->GetTPCclusters(0)>0.0 && \r
+ ptrack->GetTPCnclsS()/ptrack->GetTPCclusters(0)<0.2 && \r
+ abs(innerParam->GetX())>0.0 && \r
+ abs(innerParam->GetY()/innerParam->GetX())<0.14 && \r
+ abs(innerParam->GetTgl())<0.85 && \r
+ ptrack->IsOn(0x0004) && \r
+ ptrack->GetNcls(0)>0 &&\r
+ ptrack->GetITSchi2()>0 && \r
+ sqrt(ptrack->GetITSchi2()/ptrack->GetNcls(0))<6 &&\r
+ sqrt(chi2TPCInnerC)<6 &&\r
+ abs(dz)<2.0 && \r
+ abs(dxy)<(0.018+0.035*abs(ptrack->GetSigned1Pt())) )\r
+ {\r
+ fPtResPhiPtTPCITS->Fill(ptrack->Pt(),ptrack->Phi(),1./abs(ptrack->GetSigned1Pt())*TMath::Sqrt(ptrack->GetSigma1Pt2()));\r
+ fPtResEtaPtTPCITS->Fill(ptrack->Pt(),ptrack->Eta(),1./abs(ptrack->GetSigned1Pt())*TMath::Sqrt(ptrack->GetSigma1Pt2()));\r
+ fPtResCentPtTPCITS->Fill(ptrack->Pt(),centralityF,1./abs(ptrack->GetSigned1Pt())*TMath::Sqrt(ptrack->GetSigma1Pt2()));\r
+ }\r
+\r
+// TPC primary tracks \r
+// and TPC constrained primary tracks \r
+\r
+ AliExternalTrackParam *ptpcInner = (AliExternalTrackParam *) ptrack->GetTPCInnerParam(); \r
+ if(!ptpcInner) return;\r
+\r
+\r
+ Float_t dxyTPC, dzTPC;\r
+ ptrack->GetImpactParametersTPC(dxyTPC,dzTPC);\r
\r
+if( abs(ptrack->Eta())<0.8 && \r
+ ptrack->GetTPCClusterInfo(3,1)>130 && \r
+ ptrack->IsOn(0x40)&& \r
+ ptrack->GetTPCclusters(0)>0.0 && \r
+ ptrack->GetTPCnclsS()/ptrack->GetTPCclusters(0)<0.2 && \r
+ abs(innerParam->GetX())>0.0 && \r
+ abs(innerParam->GetY()/innerParam->GetX())<0.14 && \r
+ abs(innerParam->GetTgl())<0.85 && \r
+ abs(dzTPC)<3.2 && \r
+ abs(dxyTPC)<2.4 )\r
+ {\r
+ // TPC only\r
+ fPtResPhiPtTPC->Fill(ptpcInner->Pt(),ptpcInner->Phi(),1./abs(ptpcInner->GetSigned1Pt())*TMath::Sqrt(ptpcInner->GetSigma1Pt2()));\r
+ fPtResEtaPtTPC->Fill(ptpcInner->Pt(),ptpcInner->Eta(),1./abs(ptpcInner->GetSigned1Pt())*TMath::Sqrt(ptpcInner->GetSigma1Pt2()));\r
+ fPtResCentPtTPC->Fill(ptpcInner->Pt(),centralityF,1./abs(ptpcInner->GetSigned1Pt())*TMath::Sqrt(ptpcInner->GetSigma1Pt2()));\r
+\r
+ // TPC constrained to vertex \r
+ fPtResPhiPtTPCc->Fill(ptpcInnerC->Pt(),ptpcInnerC->Phi(),1./abs(ptpcInnerC->GetSigned1Pt())*TMath::Sqrt(ptpcInnerC->GetSigma1Pt2()));\r
+ fPtResEtaPtTPCc->Fill(ptpcInnerC->Pt(),ptpcInnerC->Eta(),1./abs(ptpcInnerC->GetSigned1Pt())*TMath::Sqrt(ptpcInnerC->GetSigma1Pt2()));\r
+ fPtResCentPtTPCc->Fill(ptpcInnerC->Pt(),centralityF,1./abs(ptpcInnerC->GetSigned1Pt())*TMath::Sqrt(ptpcInnerC->GetSigma1Pt2()));\r
+ }\r
+}\r