]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - ANALYSIS/AliAnalysisTaskESDfilter.cxx
AliCentrality for ESD and AOD analysis
[u/mrichter/AliRoot.git] / ANALYSIS / AliAnalysisTaskESDfilter.cxx
index 65d0fc80807acad525043be0bcdf572477f7ba08..1576ad18b80356cd9e5bf311d1001e56786d35be 100644 (file)
@@ -21,6 +21,7 @@
 #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
@@ -36,6 +37,7 @@
 #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
@@ -44,6 +46,8 @@
 #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
@@ -55,6 +59,7 @@ AliAnalysisTaskESDfilter::AliAnalysisTaskESDfilter():
     fKinkFilter(0x0),\r
     fV0Filter(0x0),\r
     fCascadeFilter(0x0),\r
+    fTPCOnlyFilterMask(0),\r
     fHighPthreshold(0),\r
     fPtshape(0x0),\r
     fEnableFillAOD(kTRUE)\r
@@ -68,6 +73,7 @@ AliAnalysisTaskESDfilter::AliAnalysisTaskESDfilter(const char* name):
     fKinkFilter(0x0),\r
     fV0Filter(0x0),\r
     fCascadeFilter(0x0),\r
+    fTPCOnlyFilterMask(0),\r
     fHighPthreshold(0),\r
     fPtshape(0x0),\r
     fEnableFillAOD(kTRUE)\r
@@ -160,25 +166,41 @@ void AliAnalysisTaskESDfilter::ConvertESDtoAOD() {
     \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
@@ -1064,8 +1086,9 @@ void AliAnalysisTaskESDfilter::ConvertESDtoAOD() {
     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
@@ -1117,9 +1140,84 @@ void AliAnalysisTaskESDfilter::ConvertESDtoAOD() {
     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