#include <TArrayI.h>\r
#include <TRandom.h>\r
#include <TParticle.h>\r
+#include <TFile.h>\r
\r
#include "AliAnalysisTaskESDfilter.h"\r
#include "AliAnalysisManager.h"\r
#include "AliAnalysisFilter.h"\r
#include "AliESDMuonTrack.h"\r
#include "AliESDVertex.h"\r
+#include "AliCentrality.h"\r
#include "AliESDv0.h"\r
#include "AliESDkink.h"\r
#include "AliESDcascade.h"\r
#include "AliESDCaloCells.h"\r
#include "AliMultiplicity.h"\r
#include "AliLog.h"\r
+#include "AliTrackerBase.h"\r
+#include "AliESDtrackCuts.h"\r
\r
ClassImp(AliAnalysisTaskESDfilter)\r
\r
fKinkFilter(0x0),\r
fV0Filter(0x0),\r
fCascadeFilter(0x0),\r
+ fTPCOnlyFilterMask(0),\r
fHighPthreshold(0),\r
fPtshape(0x0),\r
fEnableFillAOD(kTRUE)\r
fKinkFilter(0x0),\r
fV0Filter(0x0),\r
fCascadeFilter(0x0),\r
+ fTPCOnlyFilterMask(0),\r
fHighPthreshold(0),\r
fPtshape(0x0),\r
fEnableFillAOD(kTRUE)\r
\r
header->SetRunNumber(esd->GetRunNumber());\r
header->SetOfflineTrigger(fInputHandler->IsEventSelected()); // propagate the decision of the physics selection\r
+ TTree* tree = fInputHandler->GetTree();\r
+ if (tree) {\r
+ TFile* file = tree->GetCurrentFile();\r
+ if (file) header->SetESDFileName(file->GetName());\r
+ }\r
+ \r
if (old) {\r
header->SetBunchCrossNumber(0);\r
header->SetOrbitNumber(0);\r
header->SetPeriodNumber(0);\r
header->SetEventType(0);\r
header->SetMuonMagFieldScale(-999.);\r
- header->SetCentrality(-999.); \r
+ header->SetCentrality(0); \r
} else {\r
header->SetBunchCrossNumber(esd->GetBunchCrossNumber());\r
header->SetOrbitNumber(esd->GetOrbitNumber());\r
header->SetPeriodNumber(esd->GetPeriodNumber());\r
header->SetEventType(esd->GetEventType());\r
- header->SetCentrality(-999.); // FIXME\r
+\r
+ header->SetEventNumberESDFile(esd->GetHeader()->GetEventNumberInFile());\r
+ if(esd->GetCentrality()){\r
+ header->SetCentrality(new AliCentrality(*(esd->GetCentrality())));\r
+ }\r
+ else{\r
+ header->SetCentrality(0);\r
+ }\r
}\r
+ \r
// Trigger\r
header->SetFiredTriggerClasses(esd->GetFiredTriggerClasses());\r
header->SetTriggerMask(esd->GetTriggerMask()); \r
header->SetTriggerCluster(esd->GetTriggerCluster());\r
- \r
+ header->SetL0TriggerInputs(esd->GetHeader()->GetL0TriggerInputs()); \r
+ header->SetL1TriggerInputs(esd->GetHeader()->GetL1TriggerInputs()); \r
+ header->SetL2TriggerInputs(esd->GetHeader()->GetL2TriggerInputs()); \r
\r
header->SetMagneticField(esd->GetMagneticField());\r
header->SetMuonMagFieldScale(esd->GetCurrentDip()/6000.);\r
for (Int_t nTrack = 0; nTrack < nTracks; ++nTrack) {\r
\r
\r
- if (usedTrack[nTrack]) continue;\r
-\r
+ if (usedTrack[nTrack]){\r
+ continue;\r
+ }\r
AliESDtrack *esdTrack = esd->GetTrack(nTrack);\r
UInt_t selectInfo = 0;\r
//\r
header->SetRefMultiplicityNeg(jTracks - nPosTracks);\r
if (fDebug > 0) \r
printf(" NAODTRACKS=%d NPOS=%d NNEG=%d\n", jTracks, nPosTracks, jTracks - nPosTracks);\r
+\r
+\r
// Do not shrink the array of tracks - other filters may add to it (M.G)\r
// tracks.Expand(jTracks); // remove 'empty slots' due to unwritten tracks\r
- \r
+ \r
+ if(fTPCOnlyFilterMask){\r
+ // Loop over the tracks and extract and mask out all aod tracks that pass the selections for AODt racks\r
+ for(int it = 0;it < jTracks;++it){\r
+ AliAODTrack *tr = (AliAODTrack*)tracks.At(it);\r
+ if(!tr)continue;\r
+ UInt_t map = tr->GetFilterMap();\r
+ if(map&fTPCOnlyFilterMask){\r
+ // we only reset the track select ionfo, no deletion...\r
+ tr->SetFilterMap(map&~fTPCOnlyFilterMask);\r
+ }\r
+ }\r
+ // Loop over the ESD trcks and pick out the tracks passing TPC only cuts\r
+ \r
+ \r
+ const AliESDVertex *vtxSPD = esd->GetPrimaryVertexSPD();\r
+ for (Int_t nTrack = 0; nTrack < nTracks; ++nTrack) {\r
+ AliESDtrack* esdTrack = esd->GetTrack(nTrack); //carefull do not modify it othwise need to work with a copy \r
+ \r
+ UInt_t selectInfo = 0;\r
+ //\r
+ // Track selection\r
+ if (fTrackFilter) {\r
+ selectInfo = fTrackFilter->IsSelected(esdTrack);\r
+ }\r
+ selectInfo &= fTPCOnlyFilterMask;\r
+ if (!selectInfo)continue;\r
+\r
+ // create a tpc only tracl\r
+ AliESDtrack *track = AliESDtrackCuts::GetTPCOnlyTrack(esd,esdTrack->GetID());\r
+ if(!track) continue;\r
+\r
+ AliExternalTrackParam exParam;\r
+ Bool_t relate = false;\r
+ // take the B-feild from the ESD, no 3D fieldMap available at this point\r
+ relate = track->RelateToVertex(vtxSPD,esd->GetMagneticField(),kVeryBig,&exParam);\r
+ if(!relate){\r
+ delete track;\r
+ continue;\r
+ }\r
+ track->Set(exParam.GetX(),exParam.GetAlpha(),exParam.GetParameter(),exParam.GetCovariance());\r
+\r
+\r
+ track->GetPxPyPz(p);\r
+ track->GetXYZ(pos);\r
+ track->GetCovarianceXYZPxPyPz(covTr);\r
+ track->GetESDpid(pid);\r
+ if(mcH)mcH->SelectParticle(esdTrack->GetLabel());\r
+ aodTrack = new(tracks[jTracks++]) AliAODTrack(track->GetID(),\r
+ track->GetLabel(),\r
+ p,\r
+ kTRUE,\r
+ pos,\r
+ kFALSE,\r
+ covTr, \r
+ (Short_t)track->GetSign(),\r
+ track->GetITSClusterMap(), \r
+ pid,\r
+ primary,\r
+ kTRUE, // check if this is right\r
+ vtx->UsesTrack(track->GetID()),\r
+ AliAODTrack::kPrimary, \r
+ selectInfo);\r
+ aodTrack->SetTPCClusterMap(track->GetTPCClusterMap());\r
+ aodTrack->SetTPCSharedMap (track->GetTPCSharedMap());\r
+ aodTrack->SetChi2perNDF(Chi2perNDF(track));\r
+ \r
+ aodTrackRefs->AddAt(aodTrack, nTrack);\r
+ \r
+ delete track;\r
+ } // end of loop on tracks\r
+ \r
+ }//end if(fTPCOnlyFilterMask\r
+ \r
// Access to the AOD container of PMD clusters\r
TClonesArray &pmdClusters = *(AODEvent()->GetPmdClusters());\r
Int_t jPmdClusters=0;\r