]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - ANALYSIS/AliAnalysisTaskESDfilter.cxx
Extending the functionality of the physics selection. Instead of providing a yes...
[u/mrichter/AliRoot.git] / ANALYSIS / AliAnalysisTaskESDfilter.cxx
index a1361cd0fa15e74e94e079017b48cf500cedb7d0..d9534869c07cc6ee33c01e23b2d1699d7fab586c 100644 (file)
@@ -25,6 +25,7 @@
 #include "AliAnalysisTaskESDfilter.h"\r
 #include "AliAnalysisManager.h"\r
 #include "AliESDEvent.h"\r
+#include "AliESDRun.h"\r
 #include "AliStack.h"\r
 #include "AliAODEvent.h"\r
 #include "AliMCEvent.h"\r
@@ -74,8 +75,15 @@ AliAnalysisTaskESDfilter::AliAnalysisTaskESDfilter(const char* name):
 \r
 void AliAnalysisTaskESDfilter::UserCreateOutputObjects()\r
 {\r
-// Create the output container\r
+  //\r
+  // Create Output Objects conenct filter to outputtree\r
+  // \r
+  if(OutputTree()){\r
     OutputTree()->GetUserInfo()->Add(fTrackFilter);\r
+  }\r
+  else{\r
+    AliError("No OutputTree() for adding the track filter");\r
+  }\r
 }\r
 \r
 void AliAnalysisTaskESDfilter::Init()\r
@@ -92,10 +100,13 @@ void AliAnalysisTaskESDfilter::UserExec(Option_t */*option*/)
 //\r
                                            \r
   Long64_t ientry = Entry();\r
-  if (fDebug > 0) printf("Filter: Analysing event # %5d\n", (Int_t) ientry);\r
-  if (fHighPthreshold == 0) AliInfo("detector PID signals are stored in each track");\r
-  if (!fPtshape) AliInfo("detector PID signals are not stored below the pt threshold");\r
-\r
+  \r
+  if (fDebug > 0) {\r
+      printf("Filter: Analysing event # %5d\n", (Int_t) ientry);\r
+      if (fHighPthreshold == 0) AliInfo("detector PID signals are stored in each track");\r
+      if (!fPtshape) AliInfo("detector PID signals are not stored below the pt threshold");\r
+  }\r
+  \r
   ConvertESDtoAOD();\r
 }\r
 \r
@@ -131,27 +142,27 @@ void AliAnalysisTaskESDfilter::ConvertESDtoAOD() {
 \r
     \r
     // loop over events and fill them\r
-    \r
     // Multiplicity information needed by the header (to be revised!)\r
     Int_t nTracks    = esd->GetNumberOfTracks();\r
+    for (Int_t iTrack=0; iTrack<nTracks; ++iTrack) esd->GetTrack(iTrack)->SetESDEvent(esd);\r
+\r
     //    if (fDebug > 0) printf("-------------------Bo: Number of ESD tracks %d \n",nTracks);\r
 \r
     Int_t nPosTracks = 0;\r
-//    for (Int_t iTrack = 0; iTrack < nTracks; ++iTrack) \r
-//     if (esd->GetTrack(iTrack)->GetSign()> 0) nPosTracks++;\r
     \r
     // Update the header\r
 \r
     AliAODHeader* header = AODEvent()->GetHeader();\r
-\r
+    \r
     header->SetRunNumber(esd->GetRunNumber());\r
+    header->SetOfflineTrigger(fInputHandler->IsEventSelected()); // propagate the decision of the physics selection\r
     if (old) {\r
        header->SetBunchCrossNumber(0);\r
        header->SetOrbitNumber(0);\r
        header->SetPeriodNumber(0);\r
        header->SetEventType(0);\r
-       header->SetMuonMagFieldScale(-999.); // FIXME\r
-       header->SetCentrality(-999.);        // FIXME\r
+       header->SetMuonMagFieldScale(-999.);\r
+       header->SetCentrality(-999.);       \r
     } else {\r
        header->SetBunchCrossNumber(esd->GetBunchCrossNumber());\r
        header->SetOrbitNumber(esd->GetOrbitNumber());\r
@@ -159,9 +170,12 @@ void AliAnalysisTaskESDfilter::ConvertESDtoAOD() {
        header->SetEventType(esd->GetEventType());\r
        header->SetCentrality(-999.);        // FIXME\r
     }\r
-    \r
+    // Trigger\r
+    header->SetFiredTriggerClasses(esd->GetFiredTriggerClasses());\r
     header->SetTriggerMask(esd->GetTriggerMask()); \r
     header->SetTriggerCluster(esd->GetTriggerCluster());\r
+    \r
+\r
     header->SetMagneticField(esd->GetMagneticField());\r
     header->SetMuonMagFieldScale(esd->GetCurrentDip()/6000.);\r
     header->SetZDCN1Energy(esd->GetZDCN1Energy());\r
@@ -169,15 +183,22 @@ void AliAnalysisTaskESDfilter::ConvertESDtoAOD() {
     header->SetZDCN2Energy(esd->GetZDCN2Energy());\r
     header->SetZDCP2Energy(esd->GetZDCP2Energy());\r
     header->SetZDCEMEnergy(esd->GetZDCEMEnergy(0),esd->GetZDCEMEnergy(1));\r
+\r
+    \r
     Float_t diamxy[2]={esd->GetDiamondX(),esd->GetDiamondY()};\r
     Float_t diamcov[3]; esd->GetDiamondCovXY(diamcov);\r
     header->SetDiamond(diamxy,diamcov);\r
+    header->SetDiamondZ(esd->GetDiamondZ(),esd->GetSigma2DiamondZ());\r
 //\r
 //\r
     Int_t nV0s      = esd->GetNumberOfV0s();\r
     Int_t nCascades = esd->GetNumberOfCascades();\r
     Int_t nKinks    = esd->GetNumberOfKinks();\r
     Int_t nVertices = nV0s + nCascades /*V0 wihtin cascade already counted*/+ nKinks + 1 /* = prim. vtx*/;\r
+    Int_t nPileSPDVertices=1+esd->GetNumberOfPileupVerticesSPD(); // also SPD main vertex\r
+    Int_t nPileTrkVertices=esd->GetNumberOfPileupVerticesTracks();\r
+    nVertices+=nPileSPDVertices;\r
+    nVertices+=nPileTrkVertices;\r
     Int_t nJets     = 0;\r
     Int_t nCaloClus = esd->GetNumberOfCaloClusters();\r
     Int_t nFmdClus  = 0;\r
@@ -259,8 +280,47 @@ void AliAnalysisTaskESDfilter::ConvertESDtoAOD() {
     primary->SetName(vtx->GetName());\r
     primary->SetTitle(vtx->GetTitle());\r
 \r
+    TString vtitle = vtx->GetTitle();\r
+    if (!vtitle.Contains("VertexerTracks")) \r
+      primary->SetNContributors(vtx->GetNContributors());\r
+\r
     if (fDebug > 0) primary->Print();\r
 \r
+\r
+    // Add SPD "main" vertex \r
+    const AliESDVertex *vtxS = esd->GetPrimaryVertexSPD();\r
+    vtxS->GetXYZ(pos); // position\r
+    vtxS->GetCovMatrix(covVtx); //covariance matrix\r
+    AliAODVertex * mVSPD = new(vertices[jVertices++])\r
+      AliAODVertex(pos, covVtx, vtxS->GetChi2toNDF(), NULL, -1, AliAODVertex::kMainSPD);\r
+    mVSPD->SetName(vtxS->GetName());\r
+    mVSPD->SetTitle(vtxS->GetTitle());\r
+    mVSPD->SetNContributors(vtxS->GetNContributors()); \r
+\r
+    // Add SPD pileup vertices\r
+    for(Int_t iV=0; iV<nPileSPDVertices-1; iV++){\r
+      const AliESDVertex *vtxP = esd->GetPileupVertexSPD(iV);\r
+      vtxP->GetXYZ(pos); // position\r
+      vtxP->GetCovMatrix(covVtx); //covariance matrix\r
+      AliAODVertex * pVSPD =  new(vertices[jVertices++])\r
+       AliAODVertex(pos, covVtx, vtxP->GetChi2toNDF(), NULL, -1, AliAODVertex::kPileupSPD);\r
+      pVSPD->SetName(vtxP->GetName());\r
+      pVSPD->SetTitle(vtxP->GetTitle());\r
+      pVSPD->SetNContributors(vtxP->GetNContributors()); \r
+    }\r
+\r
+    // Add TRK pileup vertices\r
+    for(Int_t iV=0; iV<nPileTrkVertices; iV++){\r
+      const AliESDVertex *vtxP = esd->GetPileupVertexTracks(iV);\r
+      vtxP->GetXYZ(pos); // position\r
+      vtxP->GetCovMatrix(covVtx); //covariance matrix\r
+      AliAODVertex * pVTRK = new(vertices[jVertices++])\r
+       AliAODVertex(pos, covVtx, vtxP->GetChi2toNDF(), NULL, -1, AliAODVertex::kPileupTracks);\r
+      pVTRK->SetName(vtxP->GetName());\r
+      pVTRK->SetTitle(vtxP->GetTitle());\r
+      pVTRK->SetNContributors(vtxP->GetNContributors());\r
+    }\r
+\r
     // Create vertices starting from the most complex objects\r
     Double_t chi2 = 0.;\r
     \r
@@ -391,8 +451,11 @@ void AliAnalysisTaskESDfilter::ConvertESDtoAOD() {
                                                          vtx->UsesTrack(esdCascadeBach->GetID()),\r
                                                          AliAODTrack::kSecondary,\r
                                                          selectInfo);\r
+           aodTrack->SetTPCClusterMap(esdCascadeBach->GetTPCClusterMap());\r
+           aodTrack->SetTPCSharedMap (esdCascadeBach->GetTPCSharedMap());\r
+           aodTrack->SetChi2perNDF(Chi2perNDF(esdCascadeBach));\r
            aodTrackRefs->AddAt(aodTrack,idxBachFromCascade);\r
-          \r
+           \r
            if (esdCascadeBach->GetSign() > 0) nPosTracks++;\r
            aodTrack->ConvertAliPIDtoAODPID();\r
            aodTrack->SetFlags(esdCascadeBach->GetStatus());\r
@@ -470,8 +533,11 @@ void AliAnalysisTaskESDfilter::ConvertESDtoAOD() {
                                                                vtx->UsesTrack(esdCascadePos->GetID()),\r
                                                                AliAODTrack::kSecondary,\r
                                                                selectInfo);\r
+               aodTrack->SetTPCClusterMap(esdCascadePos->GetTPCClusterMap());\r
+               aodTrack->SetTPCSharedMap (esdCascadePos->GetTPCSharedMap());\r
+               aodTrack->SetChi2perNDF(Chi2perNDF(esdCascadePos));\r
                aodTrackRefs->AddAt(aodTrack,idxPosFromV0Dghter);\r
-               \r
+\r
                if (esdCascadePos->GetSign() > 0) nPosTracks++;\r
                aodTrack->ConvertAliPIDtoAODPID();\r
                aodTrack->SetFlags(esdCascadePos->GetStatus());\r
@@ -512,7 +578,9 @@ void AliAnalysisTaskESDfilter::ConvertESDtoAOD() {
                                                                vtx->UsesTrack(esdCascadeNeg->GetID()),\r
                                                                AliAODTrack::kSecondary,\r
                                                                selectInfo);\r
-               \r
+               aodTrack->SetTPCClusterMap(esdCascadeNeg->GetTPCClusterMap());\r
+               aodTrack->SetTPCSharedMap (esdCascadeNeg->GetTPCSharedMap());\r
+               aodTrack->SetChi2perNDF(Chi2perNDF(esdCascadeNeg));\r
                aodTrackRefs->AddAt(aodTrack,idxNegFromV0Dghter);\r
                \r
                if (esdCascadeNeg->GetSign() > 0) nPosTracks++;\r
@@ -727,6 +795,9 @@ void AliAnalysisTaskESDfilter::ConvertESDtoAOD() {
                                                          vtx->UsesTrack(esdV0Pos->GetID()),\r
                                                          AliAODTrack::kSecondary,\r
                                                          selectInfo);\r
+           aodTrack->SetTPCClusterMap(esdV0Pos->GetTPCClusterMap());\r
+           aodTrack->SetTPCSharedMap (esdV0Pos->GetTPCSharedMap());\r
+           aodTrack->SetChi2perNDF(Chi2perNDF(esdV0Pos));\r
            aodTrackRefs->AddAt(aodTrack,posFromV0);\r
            //      if (fDebug > 0) printf("-------------------Bo: pos track from original pt %.3f \n",aodTrack->Pt());\r
            if (esdV0Pos->GetSign() > 0) nPosTracks++;\r
@@ -767,6 +838,9 @@ void AliAnalysisTaskESDfilter::ConvertESDtoAOD() {
                                                          vtx->UsesTrack(esdV0Neg->GetID()),\r
                                                          AliAODTrack::kSecondary,\r
                                                          selectInfo);\r
+           aodTrack->SetTPCClusterMap(esdV0Neg->GetTPCClusterMap());\r
+           aodTrack->SetTPCSharedMap (esdV0Neg->GetTPCSharedMap());\r
+           aodTrack->SetChi2perNDF(Chi2perNDF(esdV0Neg));\r
            \r
            aodTrackRefs->AddAt(aodTrack,negFromV0);\r
            //      if (fDebug > 0) printf("-------------------Bo: neg track from original pt %.3f \n",aodTrack->Pt());\r
@@ -898,6 +972,10 @@ void AliAnalysisTaskESDfilter::ConvertESDtoAOD() {
                                                               vtx->UsesTrack(esdTrack->GetID()),\r
                                                               AliAODTrack::kPrimary,\r
                                                               selectInfo);\r
+                       mother->SetTPCClusterMap(esdTrackM->GetTPCClusterMap());\r
+                       mother->SetTPCSharedMap (esdTrackM->GetTPCSharedMap());\r
+                       mother->SetChi2perNDF(Chi2perNDF(esdTrackM));\r
+\r
                        aodTrackRefs->AddAt(mother, imother);\r
                        \r
                        if (esdTrackM->GetSign() > 0) nPosTracks++;\r
@@ -954,7 +1032,8 @@ void AliAnalysisTaskESDfilter::ConvertESDtoAOD() {
                                                               vtx->UsesTrack(esdTrack->GetID()),\r
                                                               AliAODTrack::kSecondary,\r
                                                               selectInfo);\r
-                       \r
+                       daughter->SetTPCClusterMap(esdTrackD->GetTPCClusterMap());\r
+                       daughter->SetTPCSharedMap (esdTrackD->GetTPCSharedMap());\r
                        aodTrackRefs->AddAt(daughter, idaughter);\r
                        \r
                        if (esdTrackD->GetSign() > 0) nPosTracks++;\r
@@ -1015,7 +1094,12 @@ void AliAnalysisTaskESDfilter::ConvertESDtoAOD() {
                                                                AliAODTrack::kPrimary, \r
                                                                selectInfo)\r
                             );\r
+       aodTrack->SetTPCClusterMap(esdTrack->GetTPCClusterMap());\r
+       aodTrack->SetTPCSharedMap (esdTrack->GetTPCSharedMap());\r
+       aodTrack->SetChi2perNDF(Chi2perNDF(esdTrack));\r
+\r
        aodTrackRefs->AddAt(aodTrack, nTrack);\r
+\r
        \r
        if (esdTrack->GetSign() > 0) nPosTracks++;\r
        aodTrack->SetFlags(esdTrack->GetStatus());\r
@@ -1179,7 +1263,7 @@ void AliAnalysisTaskESDfilter::SetAODPID(AliESDtrack *esdtrack, AliAODTrack *aod
   // Save PID object for candidate electrons\r
     Bool_t pidSave = kFALSE;\r
     if (fTrackFilter) {\r
-       Bool_t selectInfo = fTrackFilter->IsSelected("Electrons");\r
+       Bool_t selectInfo = fTrackFilter->IsSelected((char*) "Electrons");\r
        if (selectInfo)  pidSave = kTRUE;\r
     }\r
 \r
@@ -1216,17 +1300,30 @@ void AliAnalysisTaskESDfilter::SetDetectorRawSignals(AliAODPid *aodpid, AliESDtr
  AliInfo("no ESD track found. .....exiting");\r
  return;\r
  }\r
+ // TPC momentum\r
+ const AliExternalTrackParam *in=track->GetInnerParam();\r
+ if (in) {\r
+   aodpid->SetTPCmomentum(in->GetP());\r
+ }else{\r
+   aodpid->SetTPCmomentum(-1.);\r
+ }\r
+\r
 \r
  aodpid->SetITSsignal(track->GetITSsignal());\r
  aodpid->SetTPCsignal(track->GetTPCsignal());\r
- //n TRD planes = 6\r
 \r
+ //n TRD planes = 6\r
  Int_t nslices = track->GetNumberOfTRDslices()*6;\r
  Double_t *trdslices = new Double_t[nslices];\r
  for(Int_t iSl =0; iSl < track->GetNumberOfTRDslices(); iSl++) {\r
-     for(Int_t iPl =0; iPl<6; iPl++) trdslices[iPl*track->GetNumberOfTRDslices()+iSl] = track->GetTRDslice(iPl,iSl);\r
-    }\r
-\r
+   for(Int_t iPl =0; iPl<6; iPl++) trdslices[iPl*track->GetNumberOfTRDslices()+iSl] = track->GetTRDslice(iPl,iSl);\r
+ }\r
\r
+//TRD momentum\r
+ for(Int_t iPl=0;iPl<6;iPl++){\r
+   Double_t trdmom=track->GetTRDmomentum(iPl);\r
+   aodpid->SetTRDmomentum(iPl,trdmom);\r
+ }\r
 \r
  aodpid->SetTRDsignal(track->GetNumberOfTRDslices()*6,trdslices);\r
  Double_t times[AliAODPid::kSPECIES]; track->GetIntegratedTimes(times);\r
@@ -1256,6 +1353,20 @@ void AliAnalysisTaskESDfilter::SetDetectorRawSignals(AliAODPid *aodpid, AliESDtr
 \r
 }\r
 \r
+Double_t  AliAnalysisTaskESDfilter::Chi2perNDF(AliESDtrack* track)\r
+{\r
+    // Calculate chi2 per ndf for track\r
+    Int_t  nClustersTPC = track->GetTPCNcls();\r
+\r
+    if ( nClustersTPC > 5) {\r
+       return (track->GetTPCchi2()/Float_t(nClustersTPC - 5));\r
+    } else {\r
+       return (-1.);\r
+    }\r
+ }\r
+\r
+\r
+\r
 void AliAnalysisTaskESDfilter::Terminate(Option_t */*option*/)\r
 {\r
 // Terminate analysis\r