]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - STEER/CreateAODfromESD.C
Transition PWG3 --> PWGHF
[u/mrichter/AliRoot.git] / STEER / CreateAODfromESD.C
index 683c19a213ed3681a12958532cbce8f43c5e6267..85b81c366b42c69923454940bbeee1a014baed79 100644 (file)
-#include "TFile.h"
-#include "TTree.h"
-
-#include "AliAODEvent.h"
-#include "AliESD.h"
-#include "AliESDtrack.h"
-#include "AliESDVertex.h"
-#include "AliESDv0.h"
-
-#include <iostream>
-
-void CreateAODfromESD(const char *inFileName = "AliESD.root", const char *outFileName = "AliAOD.root") {
-
-  // create an AliAOD object 
-  AliAODEvent *aod = new AliAODEvent();
-  aod->CreateStdContent();
-
-  // open the file
-  TFile *outFile = TFile::Open(outFileName, "RECREATE");
-
-  // create the tree
-  TTree *aodTree = new TTree("AOD", "AliAOD tree");
-  aodTree->Branch(aod->GetList());
-
-  // connect to ESD
-  TFile *inFile = TFile::Open(inFileName, "READ");
-  TTree *t = (TTree*) inFile->Get("esdTree");
-  TBranch *b = t->GetBranch("ESD");
-  AliESD *esd = 0;
-  b->SetAddress(&esd);
-
-  Int_t nEvents = b->GetEntries();
-
-  // loop over events and fill them
-  for (Int_t iEvent = 0; iEvent < nEvents; ++iEvent) {
-    b->GetEntry(iEvent);
-
-    // Multiplicity information needed by the header (to be revised!)
-    Int_t nTracks   = esd->GetNumberOfTracks();
-    Int_t nPosTracks = 0;
-    for (Int_t iTrack=0; iTrack<nTracks; ++iTrack) 
-      if (esd->GetTrack(iTrack)->GetSign()> 0) nPosTracks++;
-
-    // create the header
-    aod->AddHeader(new AliAODHeader(esd ->GetEventNumber(), 
-                                   esd->GetRunNumber(),
-                                   nTracks,
-                                   nPosTracks,
-                                   nTracks-nPosTracks,
-                                   esd->GetMagneticField(),
-                                   -999., // centrality; to be filled, still
-                                   esd->GetTriggerMask(),
-                                   esd->GetTriggerCluster(),
-                                   esd->GetEventType()));
-
-    Int_t nV0s      = esd->GetNumberOfV0s();
-    Int_t nCascades = esd->GetNumberOfCascades();
-    Int_t nKinks    = esd->GetNumberOfKinks();
-    Int_t nVertices = nV0s + nCascades + nKinks;
-    
-    aod->ResetStd(nTracks, nVertices);
+#if !defined(__CINT__) || defined(__MAKECINT__)
+#include <TChain.h>
+#include <TSystem.h>
+#include "AliAnalysisManager.h"
+#include "AliESDInputHandler.h"
+#include "AliAODHandler.h"
+#include "AliAnalysisTaskESDfilter.h"
+#include "AliAnalysisDataContainer.h"
+#endif
+
+void CreateAODfromESD(const char *inFileName = "AliESDs.root",
+                     const char *outFileName = "AliAOD.root",
+                     Bool_t bKineFilter = kTRUE) 
+{
+  
+    gSystem->Load("libTree");
+    gSystem->Load("libGeom");
+    gSystem->Load("libPhysics");
+    gSystem->Load("libVMC");
+    gSystem->Load("libSTEERBase");
+    gSystem->Load("libESD");
+    gSystem->Load("libAOD");
     
-
-    // Array to take into account the tracks already added to the AOD
-    Bool_t * usedTrack = NULL;
-    if (nTracks>0) {
-      usedTrack = new Bool_t[nTracks];
-      for (Int_t iTrack=0; iTrack<nTracks; ++iTrack) usedTrack[iTrack]=kFALSE;
+    gSystem->Load("libANALYSIS");
+    gSystem->Load("libANALYSISalice");
+    gSystem->Load("libCORRFW");
+    gSystem->Load("libPWGHFbase");
+    gSystem->Load("libPWGmuon");
+
+    TChain *chain = new TChain("esdTree");
+    // Steering input chain
+    chain->Add(inFileName);
+    AliAnalysisManager *mgr  = new AliAnalysisManager("ESD to AOD", "Analysis Manager");
+
+    // Input
+    AliESDInputHandler* inpHandler = new AliESDInputHandler();
+    inpHandler->SetReadFriends(kFALSE);
+    inpHandler->SetReadTags();
+    mgr->SetInputEventHandler  (inpHandler);
+    // Output
+    AliAODHandler* aodHandler   = new AliAODHandler();
+    aodHandler->SetOutputFileName(outFileName);
+    mgr->SetOutputEventHandler(aodHandler);
+
+    // MC Truth
+    if(bKineFilter){
+       AliMCEventHandler* mcHandler = new AliMCEventHandler();
+       mgr->SetMCtruthEventHandler(mcHandler);
     }
-    // Array to take into account the V0s already added to the AOD
-    Bool_t * usedV0 = NULL;
-    if (nV0s>0) {
-      usedV0 = new Bool_t[nV0s];
-      for (Int_t iV0=0; iV0<nV0s; ++iV0) usedV0[iV0]=kFALSE;
-    }
-
-    // Access to the AOD container of vertices
-    TClonesArray &vertices = *(aod->GetVertices());
-    Int_t jVertices=0;
-
-    // Access to the AOD container of tracks
-    TClonesArray &tracks = *(aod->GetTracks());
-    Int_t jTracks=0; 
-  
-    // Add primary vertex. The primary tracks will be defined
-    // after the loops on the composite objects (V0, cascades, kinks)
-    const AliESDVertex *vtx = esd->GetPrimaryVertex();
-      
-    Double_t pos[3];
-    vtx->GetXYZ(pos); // position
-    Double_t cov[6];
-    vtx->GetCovMatrix(cov); //covariance matrix
-
-    AliAODVertex * primary = new(vertices[jVertices++])
-      AliAODVertex(pos, cov, vtx->GetChi2(), NULL, AliAODVertex::kPrimary);
-         
-    // Create vertices starting from the most complex objects
-      
-    // Cascades
-    for (Int_t nCascade = 0; nCascade < nCascades; ++nCascade) {
-      AliESDcascade *cascade = esd->GetCascade(nCascade);
-      
-      Double_t posXi[3];
-      cascade->GetXYZ(posXi[0], posXi[1], posXi[2]);
-      Double_t covXi[6];
-      cascade->GetPosCovXi(covXi);
-     
-      // Add the cascade vertex
-      AliAODVertex * vcascade = new(vertices[jVertices++]) AliAODVertex(posXi,
-                                                                       covXi,
-                                                                       cascade->GetChi2Xi(),
-                                                                       primary,
-                                                                       AliAODVertex::kCascade);
-
-      primary->AddDaughter(vcascade);
-
-      // Add the V0 from the cascade. The ESD class have to be optimized...
-      // Now we have to search for the corresponding Vo in the list of V0s
-      // using the indeces of the positive and negative tracks
-
-      Int_t posFromV0 = cascade->GetPindex();
-      Int_t negFromV0 = cascade->GetNindex();
-
-
-      AliESDv0 * v0 = 0x0;
-      Int_t indV0 = -1;
-
-      for (Int_t iV0=0; iV0<nV0s; ++iV0) {
-
-       v0 = esd->GetV0(iV0);
-       Int_t pos = v0->GetPindex();
-       Int_t neg = v0->GetNindex();
-
-       if (pos==posFromV0 && neg==negFromV0) {
-         indV0 = iV0;
-         break;
-       }
-      }
-
-      AliAODVertex * vV0FromCascade = 0x0;
-
-      if (indV0>-1) {
-       
-       usedV0[indV0] = kTRUE;
-       
-       Double_t posV0[3];
-       v0->GetXYZ(posV0[0], posV0[1], posV0[2]);
-       Double_t covV0[6];
-       v0->GetPosCov(covV0);
-      
-       vV0FromCascade = new(vertices[jVertices++]) AliAODVertex(posV0,
-                                                                covV0,
-                                                                v0->GetChi2V0(),
-                                                                vcascade,
-                                                                AliAODVertex::kV0);
-      } else {
-
-       Double_t posV0[3];
-       cascade->GetXYZ(posV0[0], posV0[1], posV0[2]);
-       Double_t covV0[6];
-       cascade->GetPosCov(covV0);
-      
-       vV0FromCascade = new(vertices[jVertices++]) AliAODVertex(posV0,
-                                                                covV0,
-                                                                v0->GetChi2V0(),
-                                                                vcascade,
-                                                                AliAODVertex::kV0);
-       vcascade->AddDaughter(vV0FromCascade);
-      }
-
-      // Add the positive tracks from the V0
-
-      usedTrack[posFromV0] = kTRUE;
-      {
-
-       AliESDtrack *esdTrack = esd->GetTrack(posFromV0);
-      
-       Double_t p[3];
-       esdTrack->GetPxPyPz(p);
-       
-       Double_t x[3];
-       esdTrack->GetXYZ(x);
-       
-       Double_t cov[21];
-       esdTrack->GetCovarianceXYZPxPyPz(cov);
 
-       Double_t pid[10];
-       esdTrack->GetESDpid(pid);
-       
-       vV0FromCascade->AddDaughter(
-               new(tracks[jTracks++]) AliAODTrack(esdTrack->GetID(),
-                                          esdTrack->GetLabel(), 
-                                          p, kTRUE,
-                                          x,
-                                          kFALSE,
-                                          cov, 
-                                          (Short_t)esdTrack->GetSign(),
-                                          esdTrack->GetITSClusterMap(), 
-                                          pid,
-                                          vV0FromCascade,
-                                          AliAODTrack::kSecondary)
-               );
-      }
 
-      // Add the negative tracks from the V0
-
-      usedTrack[negFromV0] = kTRUE;
-      {
-
-       AliESDtrack *esdTrack = esd->GetTrack(negFromV0);
-      
-       Double_t p[3];
-       esdTrack->GetPxPyPz(p);
-       
-       Double_t x[3];
-       esdTrack->GetXYZ(x);
-       
-       Double_t cov[21];
-       esdTrack->GetCovarianceXYZPxPyPz(cov);
-       
-       Double_t pid[10];
-       esdTrack->GetESDpid(pid);
-
-       vV0FromCascade->AddDaughter(
-                new(tracks[jTracks++]) AliAODTrack(esdTrack->GetID(),
-                                          esdTrack->GetLabel(),
-                                          p,
-                                          kTRUE,
-                                          x,
-                                          kFALSE,
-                                          cov, 
-                                          (Short_t)esdTrack->GetSign(),
-                                          esdTrack->GetITSClusterMap(), 
-                                          pid,
-                                          vV0FromCascade,
-                                          AliAODTrack::kSecondary)
-               );
-      }
-
-      // Add the bachelor track from the cascade
-
-      Int_t bachelor = cascade->GetBindex();
-
-      usedTrack[bachelor] = kTRUE;
-      {
-
-       AliESDtrack *esdTrack = esd->GetTrack(bachelor);
-      
-       Double_t p[3];
-       esdTrack->GetPxPyPz(p);
-       
-       Double_t x[3];
-       esdTrack->GetXYZ(x);
-       
-       Double_t cov[21];
-       esdTrack->GetCovarianceXYZPxPyPz(cov);
-       
-       Double_t pid[10];
-       esdTrack->GetESDpid(pid);
-
-       vcascade->AddDaughter(
-               new(tracks[jTracks++]) AliAODTrack(esdTrack->GetID(),
-                                          esdTrack->GetLabel(),
-                                          p,
-                                          kTRUE,
-                                          x,
-                                          kFALSE,
-                                          cov, 
-                                          (Short_t)esdTrack->GetSign(),
-                                          esdTrack->GetITSClusterMap(), 
-                                          pid,
-                                          vcascade,
-                                          AliAODTrack::kSecondary)
-               );
-      }
-
-      // Add the primary track of the cascade (if any)
-
-    }
+    // Tasks
+    // Filtering of MC particles (decays conversions etc)
+    // this task is also needed to set the MCEventHandler
+    // to the AODHandler, this will not be needed when
+    // AODHandler goes to ANALYSISalice
+    AliAnalysisTaskMCParticleFilter *kinefilter = new AliAnalysisTaskMCParticleFilter("Particle Filter");
+    if (bKineFilter) mgr->AddTask(kinefilter);
+    
+    // Barrel Tracks
+    AliAnalysisTaskESDfilter *filter = new AliAnalysisTaskESDfilter("Filter");
+    mgr->AddTask(filter);
+    // Muons
+    AliAnalysisTaskESDMuonFilter *esdmuonfilter = new AliAnalysisTaskESDMuonFilter("ESD Muon Filter");
+    mgr->AddTask(esdmuonfilter);
+
+    // Cuts on primary tracks
+    AliESDtrackCuts* esdTrackCutsL = new AliESDtrackCuts("AliESDtrackCuts", "Standard");
+    esdTrackCutsL->SetMinNClustersTPC(50);
+    esdTrackCutsL->SetMaxChi2PerClusterTPC(3.5);
+    esdTrackCutsL->SetMaxCovDiagonalElements(2, 2, 0.5, 0.5, 2);
+    esdTrackCutsL->SetRequireTPCRefit(kTRUE);
+    esdTrackCutsL->SetMaxDCAToVertexXY(3.0);
+    esdTrackCutsL->SetMaxDCAToVertexZ(3.0);
+    esdTrackCutsL->SetDCAToVertex2D(kTRUE);
+    esdTrackCutsL->SetRequireSigmaToVertex(kFALSE);
+    esdTrackCutsL->SetAcceptKinkDaughters(kFALSE);
+    // ITS stand-alone tracks
+    AliESDtrackCuts* esdTrackCutsITSsa = new AliESDtrackCuts("AliESDtrackCuts", "ITS stand-alone");
+    esdTrackCutsITSsa->SetRequireITSStandAlone(kTRUE);
+
+    AliAnalysisFilter* trackFilter = new AliAnalysisFilter("trackFilter");
+    trackFilter->AddCuts(esdTrackCutsL);
+    trackFilter->AddCuts(esdTrackCutsITSsa);
+
+    // Cuts on V0s
+    AliESDv0Cuts*   esdV0Cuts = new AliESDv0Cuts("AliESDv0Cuts", "Standard pp");
+    esdV0Cuts->SetMinRadius(0.2);
+    esdV0Cuts->SetMaxRadius(200);
+    esdV0Cuts->SetMinDcaPosToVertex(0.05);
+    esdV0Cuts->SetMinDcaNegToVertex(0.05);
+    esdV0Cuts->SetMaxDcaV0Daughters(1.0);
+    esdV0Cuts->SetMinCosinePointingAngle(0.99);
+    AliAnalysisFilter* v0Filter = new AliAnalysisFilter("v0Filter");
+    v0Filter->AddCuts(esdV0Cuts);
+
+
+//
+    filter->SetTrackFilter(trackFilter);
+    filter->SetV0Filter(v0Filter);
+
+
+//  Create AOD Tags
+    AliAnalysisTaskTagCreator* tagTask = new AliAnalysisTaskTagCreator("AOD Tag Creator");
+    mgr->AddTask(tagTask);
+
+    // Pipelining
+    AliAnalysisDataContainer *cinput1  = mgr->GetCommonInputContainer();    
+    AliAnalysisDataContainer *coutput1 = mgr->GetCommonOutputContainer();
     
-    // V0s
-        
-    for (Int_t nV0 = 0; nV0 < nV0s; ++nV0) {
-
-      if (usedV0[nV0]) continue; // skip if aready added to the AOD
-
-      AliESDv0 *v0 = esd->GetV0(nV0);
-      
-      Double_t posV0[3];
-      v0->GetXYZ(posV0[0], posV0[1], posV0[2]);
-      Double_t covV0[6];
-      v0->GetPosCov(covV0);
-
-      AliAODVertex * vV0 = 
-       new(vertices[jVertices++]) AliAODVertex(posV0,
-                                               covV0,
-                                               v0->GetChi2V0(),
-                                               primary,
-                                               AliAODVertex::kV0);
-      primary->AddDaughter(vV0);
-
-      Int_t posFromV0 = v0->GetPindex();
-      Int_t negFromV0 = v0->GetNindex();
-
-      // Add the positive tracks from the V0
-
-      usedTrack[posFromV0] = kTRUE;
-      {
-
-       AliESDtrack *esdTrack = esd->GetTrack(posFromV0);
-      
-       Double_t p[3];
-       esdTrack->GetPxPyPz(p);
-       
-       Double_t x[3];
-       esdTrack->GetXYZ(x);
-       
-       Double_t cov[21];
-       esdTrack->GetCovarianceXYZPxPyPz(cov);
-
-       Double_t pid[10];
-       esdTrack->GetESDpid(pid);
-       
-       vV0->AddDaughter(
-               new(tracks[jTracks++]) AliAODTrack(esdTrack->GetID(),
-                                          esdTrack->GetLabel(), 
-                                          p, kTRUE,
-                                          x,
-                                          kFALSE,
-                                          cov, 
-                                          (Short_t)esdTrack->GetSign(),
-                                          esdTrack->GetITSClusterMap(), 
-                                          pid,
-                                          vV0,
-                                          AliAODTrack::kSecondary)
-               );
-      }
-
-      // Add the negative tracks from the V0
-
-      usedTrack[negFromV0] = kTRUE;
-      {
-
-       AliESDtrack *esdTrack = esd->GetTrack(negFromV0);
-      
-       Double_t p[3];
-       esdTrack->GetPxPyPz(p);
-       
-       Double_t x[3];
-       esdTrack->GetXYZ(x);
-       
-       Double_t cov[21];
-       esdTrack->GetCovarianceXYZPxPyPz(cov);
-       
-       Double_t pid[10];
-       esdTrack->GetESDpid(pid);
-
-       vV0->AddDaughter(
-                new(tracks[jTracks++]) AliAODTrack(esdTrack->GetID(),
-                                          esdTrack->GetLabel(),
-                                          p,
-                                          kTRUE,
-                                          x,
-                                          kFALSE,
-                                          cov, 
-                                          (Short_t)esdTrack->GetSign(),
-                                          esdTrack->GetITSClusterMap(), 
-                                          pid,
-                                          vV0,
-                                          AliAODTrack::kSecondary)
-               );
-      }
-
-
-    }
     
-    // Kinks
-    for (Int_t nKink = 0; nKink < nKinks; ++nKink) {
+    AliAnalysisDataContainer *coutputT
+       = mgr->CreateContainer("cTag",  TTree::Class(), AliAnalysisManager::kOutputContainer, "AOD.tag.root");
 
-      AliESDkink *kink = esd->GetKink(nKink);
-      
-      new(vertices[jVertices++]) AliAODVertex(kink->GetPosition(),
-                                             NULL,
-                                             0.,
-                                             NULL,
-                                             AliAODVertex::kKink); // create a vtx      
-    }
+    coutput1->SetSpecialOutput();
+    coutputT->SetSpecialOutput();
     
-    // create tracks
-      
-    for (Int_t nTrack = 0; nTrack < nTracks; ++nTrack) {
-       
+    if(bKineFilter) {
+       mgr->ConnectInput  (kinefilter,     0, cinput1  );
+       mgr->ConnectOutput (kinefilter,     0, coutput1 );
+    }
 
-      if (usedTrack[nTrack]) continue;
+    mgr->ConnectInput (filter, 0, cinput1 );
+    mgr->ConnectOutput(filter, 0, coutput1);
 
-      AliESDtrack *esdTrack = esd->GetTrack(nTrack);
-      
-      Double_t p[3];
-      esdTrack->GetPxPyPz(p);
-      
-      Double_t x[3];
-      esdTrack->GetXYZ(x);
-      
-      Double_t cov[21];
-      esdTrack->GetCovarianceXYZPxPyPz(cov);
-       
-      Double_t pid[10];
-      esdTrack->GetESDpid(pid);
-      
-      primary->AddDaughter(
-      new(tracks[jTracks++]) AliAODTrack(esdTrack->GetID(),
-                                        esdTrack->GetLabel(),
-                                        p,
-                                        kTRUE,
-                                        x,
-                                        kFALSE,
-                                        cov, 
-                                        (Short_t)esdTrack->GetSign(),
-                                        esdTrack->GetITSClusterMap(), 
-                                        pid,
-                                        primary,
-                                        AliAODTrack::kPrimary)
-      );
-      
-    }
-      
-    // fill the tree for this event
-    aodTree->Fill();
-  }
-  
-  aodTree->GetUserInfo()->Add(aod);
+    mgr->ConnectInput (esdmuonfilter, 0, cinput1 );
+//    mgr->ConnectOutput(esdmuonfilter, 0, coutput1);
 
-  // close ESD file
-  inFile->Close();
-  
-  // write the tree to the specified file
-  outFile = aodTree->GetCurrentFile();
-  outFile->cd();
-  aodTree->Write();
-  outFile->Close();
+    mgr->ConnectInput (tagTask, 0, cinput1);
+    mgr->ConnectOutput(tagTask, 1, coutputT);
 
+    //
+    // Run the analysis
+    //
+    mgr->InitAnalysis();
+    mgr->PrintStatus();
+    mgr->StartAnalysis("local", chain);
 }
+