]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - ANALYSIS/AliAnalysisTaskESDfilter.cxx
Creation of buffer delayed until Init()
[u/mrichter/AliRoot.git] / ANALYSIS / AliAnalysisTaskESDfilter.cxx
index 9f7526b3d1fc31ee251acc461a15dc04c9504b32..ba72ab02f6d84f3cca41530bf1231386238cbb67 100644 (file)
@@ -56,7 +56,8 @@ AliAnalysisTaskESDfilter::AliAnalysisTaskESDfilter():
     fV0Filter(0x0),\r
     fCascadeFilter(0x0),\r
     fHighPthreshold(0),\r
-    fPtshape(0x0)\r
+    fPtshape(0x0),\r
+    fEnableFillAOD(kTRUE)\r
 {\r
   // Default constructor\r
 }\r
@@ -68,7 +69,8 @@ AliAnalysisTaskESDfilter::AliAnalysisTaskESDfilter(const char* name):
     fV0Filter(0x0),\r
     fCascadeFilter(0x0),\r
     fHighPthreshold(0),\r
-    fPtshape(0x0)\r
+    fPtshape(0x0),\r
+    fEnableFillAOD(kTRUE)\r
 {\r
   // Constructor\r
 }\r
@@ -78,7 +80,12 @@ void AliAnalysisTaskESDfilter::UserCreateOutputObjects()
   //\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
@@ -101,7 +108,10 @@ void AliAnalysisTaskESDfilter::UserExec(Option_t */*option*/)
       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
+  // Filters must explicitely enable AOD filling in their UserExec (AG)\r
+  if (!AliAnalysisManager::GetAnalysisManager()->GetOutputEventHandler()) AliFatal("Cannot run ESD filter without an output event handler");\r
+  if(fEnableFillAOD) AliAnalysisManager::GetAnalysisManager()->GetOutputEventHandler()->SetFillAOD(kTRUE);\r
+\r
   ConvertESDtoAOD();\r
 }\r
 \r
@@ -139,6 +149,8 @@ void AliAnalysisTaskESDfilter::ConvertESDtoAOD() {
     // loop over events and fill them\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
@@ -148,6 +160,7 @@ void AliAnalysisTaskESDfilter::ConvertESDtoAOD() {
     AliAODHeader* header = AODEvent()->GetHeader();\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
@@ -180,12 +193,17 @@ void AliAnalysisTaskESDfilter::ConvertESDtoAOD() {
     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
@@ -266,11 +284,48 @@ void AliAnalysisTaskESDfilter::ConvertESDtoAOD() {
        AliAODVertex(pos, covVtx, vtx->GetChi2toNDF(), NULL, -1, AliAODVertex::kPrimary);\r
     primary->SetName(vtx->GetName());\r
     primary->SetTitle(vtx->GetTitle());\r
-    \r
-    if (!strcmp(vtx->GetTitle(), "vertexer: 3D")) primary->SetNContributors(vtx->GetNContributors());\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
@@ -384,7 +439,7 @@ void AliAnalysisTaskESDfilter::ConvertESDtoAOD() {
 \r
            usedTrack[idxBachFromCascade] = kTRUE;\r
            UInt_t selectInfo = 0;\r
-           if (fTrackFilter) selectInfo = fTrackFilter->IsSelected(esdCascadeBach,esd);\r
+           if (fTrackFilter) selectInfo = fTrackFilter->IsSelected(esdCascadeBach);\r
            if(mcH)mcH->SelectParticle(esdCascadeBach->GetLabel());\r
            aodTrack = new(tracks[jTracks++]) AliAODTrack(esdCascadeBach->GetID(),\r
                                                          esdCascadeBach->GetLabel(), \r
@@ -403,6 +458,7 @@ void AliAnalysisTaskESDfilter::ConvertESDtoAOD() {
                                                          selectInfo);\r
            aodTrack->SetTPCClusterMap(esdCascadeBach->GetTPCClusterMap());\r
            aodTrack->SetTPCSharedMap (esdCascadeBach->GetTPCSharedMap());\r
+           aodTrack->SetChi2perNDF(Chi2perNDF(esdCascadeBach));\r
            aodTrackRefs->AddAt(aodTrack,idxBachFromCascade);\r
            \r
            if (esdCascadeBach->GetSign() > 0) nPosTracks++;\r
@@ -465,7 +521,7 @@ void AliAnalysisTaskESDfilter::ConvertESDtoAOD() {
                usedTrack[idxPosFromV0Dghter] = kTRUE;\r
        \r
                UInt_t selectInfo = 0;\r
-               if (fTrackFilter) selectInfo = fTrackFilter->IsSelected(esdCascadePos,esd);\r
+               if (fTrackFilter) selectInfo = fTrackFilter->IsSelected(esdCascadePos);\r
                if(mcH) mcH->SelectParticle(esdCascadePos->GetLabel());\r
                aodTrack = new(tracks[jTracks++]) AliAODTrack(  esdCascadePos->GetID(),\r
                                                                esdCascadePos->GetLabel(), \r
@@ -484,8 +540,9 @@ void AliAnalysisTaskESDfilter::ConvertESDtoAOD() {
                                                                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
@@ -509,7 +566,7 @@ void AliAnalysisTaskESDfilter::ConvertESDtoAOD() {
                usedTrack[idxNegFromV0Dghter] = kTRUE;\r
        \r
                UInt_t selectInfo = 0;\r
-               if (fTrackFilter) selectInfo = fTrackFilter->IsSelected(esdCascadeNeg,esd);\r
+               if (fTrackFilter) selectInfo = fTrackFilter->IsSelected(esdCascadeNeg);\r
                if(mcH)mcH->SelectParticle(esdCascadeNeg->GetLabel());\r
                aodTrack = new(tracks[jTracks++]) AliAODTrack(  esdCascadeNeg->GetID(),\r
                                                                esdCascadeNeg->GetLabel(),\r
@@ -528,6 +585,7 @@ void AliAnalysisTaskESDfilter::ConvertESDtoAOD() {
                                                                selectInfo);\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
@@ -680,7 +738,7 @@ void AliAnalysisTaskESDfilter::ConvertESDtoAOD() {
        v0objects.AddAt(esdVtx,                  3);\r
        UInt_t selectV0 = 0;\r
        if (fV0Filter) {\r
-         selectV0 = fV0Filter->IsSelected(&v0objects,esd);\r
+         selectV0 = fV0Filter->IsSelected(&v0objects);\r
          // this is a little awkward but otherwise the \r
          // list wants to access the pointer (delete it) \r
          // again when going out of scope\r
@@ -725,7 +783,7 @@ void AliAnalysisTaskESDfilter::ConvertESDtoAOD() {
        if (!usedTrack[posFromV0]) {\r
            usedTrack[posFromV0] = kTRUE;\r
            UInt_t selectInfo = 0;\r
-           if (fTrackFilter) selectInfo = fTrackFilter->IsSelected(esdV0Pos,esd);\r
+           if (fTrackFilter) selectInfo = fTrackFilter->IsSelected(esdV0Pos);\r
            if(mcH)mcH->SelectParticle(esdV0Pos->GetLabel());\r
            aodTrack = new(tracks[jTracks++]) AliAODTrack(esdV0Pos->GetID(),\r
                                                          esdV0Pos->GetLabel(), \r
@@ -744,7 +802,7 @@ void AliAnalysisTaskESDfilter::ConvertESDtoAOD() {
                                                          selectInfo);\r
            aodTrack->SetTPCClusterMap(esdV0Pos->GetTPCClusterMap());\r
            aodTrack->SetTPCSharedMap (esdV0Pos->GetTPCSharedMap());\r
-\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
@@ -768,7 +826,7 @@ void AliAnalysisTaskESDfilter::ConvertESDtoAOD() {
        if (!usedTrack[negFromV0]) {\r
            usedTrack[negFromV0] = kTRUE;\r
            UInt_t selectInfo = 0;\r
-           if (fTrackFilter) selectInfo = fTrackFilter->IsSelected(esdV0Neg,esd);\r
+           if (fTrackFilter) selectInfo = fTrackFilter->IsSelected(esdV0Neg);\r
            if(mcH)mcH->SelectParticle(esdV0Neg->GetLabel());\r
            aodTrack = new(tracks[jTracks++]) AliAODTrack(esdV0Neg->GetID(),\r
                                                          esdV0Neg->GetLabel(),\r
@@ -787,6 +845,7 @@ void AliAnalysisTaskESDfilter::ConvertESDtoAOD() {
                                                          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
@@ -888,7 +947,7 @@ void AliAnalysisTaskESDfilter::ConvertESDtoAOD() {
                    \r
                    UInt_t selectInfo = 0;\r
                    if (fTrackFilter) {\r
-                       selectInfo = fTrackFilter->IsSelected(esd->GetTrack(imother),esd);\r
+                       selectInfo = fTrackFilter->IsSelected(esd->GetTrack(imother));\r
                        if (!selectInfo) continue;\r
                    }\r
                    \r
@@ -920,6 +979,8 @@ void AliAnalysisTaskESDfilter::ConvertESDtoAOD() {
                                                               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
@@ -958,7 +1019,7 @@ void AliAnalysisTaskESDfilter::ConvertESDtoAOD() {
                        esdTrackD->GetCovarianceXYZPxPyPz(covTr);\r
                        esdTrackD->GetESDpid(pid);\r
                        selectInfo = 0;\r
-                       if (fTrackFilter) selectInfo = fTrackFilter->IsSelected(esdTrackD,esd);\r
+                       if (fTrackFilter) selectInfo = fTrackFilter->IsSelected(esdTrackD);\r
                        if(mcH)mcH->SelectParticle(esdTrackD->GetLabel());\r
                        daughter = \r
                            new(tracks[jTracks++]) AliAODTrack(esdTrackD->GetID(),\r
@@ -1011,7 +1072,7 @@ void AliAnalysisTaskESDfilter::ConvertESDtoAOD() {
        //\r
        // Track selection\r
        if (fTrackFilter) {\r
-           selectInfo = fTrackFilter->IsSelected(esdTrack,esd);\r
+           selectInfo = fTrackFilter->IsSelected(esdTrack);\r
            if (!selectInfo && !vtx->UsesTrack(esdTrack->GetID())) continue;\r
        }\r
        \r
@@ -1040,6 +1101,8 @@ void AliAnalysisTaskESDfilter::ConvertESDtoAOD() {
                             );\r
        aodTrack->SetTPCClusterMap(esdTrack->GetTPCClusterMap());\r
        aodTrack->SetTPCSharedMap (esdTrack->GetTPCSharedMap());\r
+       aodTrack->SetChi2perNDF(Chi2perNDF(esdTrack));\r
+\r
        aodTrackRefs->AddAt(aodTrack, nTrack);\r
 \r
        \r
@@ -1082,50 +1145,39 @@ void AliAnalysisTaskESDfilter::ConvertESDtoAOD() {
 \r
       AliESDCaloCluster * cluster = esd->GetCaloCluster(iClust);\r
 \r
-      Int_t id        = cluster->GetID();\r
-      Int_t nLabel    = cluster->GetNLabels();\r
-      TArrayI* labels = cluster->GetLabels();\r
-      Int_t *label = 0;\r
-      if (labels){\r
-       label = (cluster->GetLabels())->GetArray();\r
-       for(int i = 0;i < labels->GetSize();++i){\r
-         if(mcH)mcH->SelectParticle(label[i]);\r
-       }\r
-      }     \r
+      Int_t  id        = cluster->GetID();\r
+      Int_t  nLabel    = cluster->GetNLabels();\r
+      Int_t *labels    = cluster->GetLabels();\r
+      if(labels){ \r
+                 for(int i = 0;i < nLabel;++i){\r
+                         if(mcH)mcH->SelectParticle(labels[i]);\r
+                 }\r
+         }             \r
 \r
       Float_t energy = cluster->E();\r
       cluster->GetPosition(posF);\r
-      Char_t ttype = AliAODCluster::kUndef; \r
 \r
-      if (cluster->GetClusterType() == AliESDCaloCluster::kPHOSCluster) {\r
-       ttype=AliAODCluster::kPHOSNeutral;\r
-      } \r
-      else if (cluster->GetClusterType() == AliESDCaloCluster::kEMCALClusterv1) {\r
-       ttype = AliAODCluster::kEMCALClusterv1;\r
-      }\r
-\r
-      \r
       AliAODCaloCluster *caloCluster = new(caloClusters[jClusters++]) AliAODCaloCluster(id,\r
                                                                                        nLabel,\r
-                                                                                       label,\r
+                                                                                       labels,\r
                                                                                        energy,\r
                                                                                        posF,\r
                                                                                        NULL,\r
-                                                                                       ttype);\r
+                                                                                       cluster->GetType(),0);\r
       \r
       caloCluster->SetCaloCluster(cluster->GetDistanceToBadChannel(),\r
-                                 cluster->GetClusterDisp(),\r
+                                 cluster->GetDispersion(),\r
                                  cluster->GetM20(), cluster->GetM02(),\r
                                  cluster->GetEmcCpvDistance(),  \r
                                  cluster->GetNExMax(),cluster->GetTOF()) ;\r
 \r
-      caloCluster->SetPIDFromESD(cluster->GetPid());\r
+      caloCluster->SetPIDFromESD(cluster->GetPID());\r
       caloCluster->SetNCells(cluster->GetNCells());\r
       caloCluster->SetCellsAbsId(cluster->GetCellsAbsId());\r
       caloCluster->SetCellsAmplitudeFraction(cluster->GetCellsAmplitudeFraction());\r
 \r
       TArrayI* matchedT =      cluster->GetTracksMatched();\r
-      if (nTracks>0 && matchedT && cluster->GetTrackMatched() >= 0) {  \r
+      if (nTracks>0 && matchedT && cluster->GetTrackMatchedIndex() >= 0) {     \r
        for (Int_t im = 0; im < matchedT->GetSize(); im++) {\r
            Int_t iESDtrack = matchedT->At(im);;\r
            if (aodTrackRefs->At(iESDtrack) != 0) {\r
@@ -1145,7 +1197,7 @@ void AliAnalysisTaskESDfilter::ConvertESDtoAOD() {
       \r
       AliAODCaloCells &aodEMcells = *(AODEvent()->GetEMCALCells());\r
       aodEMcells.CreateContainer(nEMcell);\r
-      aodEMcells.SetType(AliAODCaloCells::kEMCAL);\r
+      aodEMcells.SetType(AliAODCaloCells::kEMCALCell);\r
       for (Int_t iCell = 0; iCell < nEMcell; iCell++) {      \r
        aodEMcells.SetCell(iCell,esdEMcells.GetCellNumber(iCell),esdEMcells.GetAmplitude(iCell));\r
       }\r
@@ -1159,7 +1211,7 @@ void AliAnalysisTaskESDfilter::ConvertESDtoAOD() {
       \r
       AliAODCaloCells &aodPHcells = *(AODEvent()->GetPHOSCells());\r
       aodPHcells.CreateContainer(nPHcell);\r
-      aodPHcells.SetType(AliAODCaloCells::kPHOS);\r
+      aodPHcells.SetType(AliAODCaloCells::kPHOSCell);\r
       for (Int_t iCell = 0; iCell < nPHcell; iCell++) {      \r
        aodPHcells.SetCell(iCell,esdPHcells.GetCellNumber(iCell),esdPHcells.GetAmplitude(iCell));\r
       }\r
@@ -1205,7 +1257,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
@@ -1295,6 +1347,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