AliAODEvent: corrected copy constructor and assignment operator. This do not work...
[u/mrichter/AliRoot.git] / STEER / AliAODHandler.cxx
index f1c3e83..002dd95 100644 (file)
@@ -61,13 +61,15 @@ AliAODHandler::AliAODHandler() :
     fNeedsJetsBranchReplication(kFALSE),
     fNeedsFMDClustersBranchReplication(kFALSE),
     fNeedsCaloClustersBranchReplication(kFALSE),
+    fNeedsMCParticlesBranchReplication(kFALSE),
     fAODIsReplicated(kFALSE),
     fAODEvent(NULL),
     fMCEventH(NULL),
     fTreeA(NULL),
     fFileA(NULL),
     fFileName(""),
-    fExtensions(NULL)
+    fExtensions(NULL),
+    fFilters(NULL)
 {
   // default constructor
 }
@@ -86,28 +88,33 @@ AliAODHandler::AliAODHandler(const char* name, const char* title):
     fNeedsJetsBranchReplication(kFALSE),
     fNeedsFMDClustersBranchReplication(kFALSE),
     fNeedsCaloClustersBranchReplication(kFALSE),
+    fNeedsMCParticlesBranchReplication(kFALSE),
     fAODIsReplicated(kFALSE),
     fAODEvent(NULL),
     fMCEventH(NULL),
     fTreeA(NULL),
     fFileA(NULL),
     fFileName(""),
-    fExtensions(NULL)
+    fExtensions(NULL),
+    fFilters(NULL)
 {
+// Normal constructor.
 }
 
 //______________________________________________________________________________
 AliAODHandler::~AliAODHandler() 
 {
  // Destructor.
-  delete fAODEvent;
+  if (fAODEvent) delete fAODEvent;
   if(fFileA){
     // is already handled in TerminateIO
     fFileA->Close();
     delete fFileA;
+    fTreeA = 0;
   }
-  delete fTreeA;
-  if (fExtensions) delete fExtensions;
+  if (fTreeA) delete fTreeA;
+  if (fExtensions) {fExtensions->Delete(); delete fExtensions;}
+  if (fFilters)    {fFilters->Delete();    delete fFilters;}
 }
 
 //______________________________________________________________________________
@@ -128,8 +135,8 @@ Bool_t AliAODHandler::Init(Option_t* opt)
   if (option.Contains("proof")) {
     // proof
     // Merging via files. Need to access analysis manager via interpreter.
-    gROOT->ProcessLine(Form("AliAnalysisManager::GetAnalysisManager()->OpenProofFile(\"%s\", \"RECREATE\");", fFileName.Data()));
-    gROOT->ProcessLine(Form("AliAnalysisManager::GetAnalysisManager()->GetCommonOutputContainer()->SetFile((TFile*)0x%lx);", gFile));
+    gROOT->ProcessLine(Form("AliAnalysisDataContainer *c_common_out = AliAnalysisManager::GetAnalysisManager()->GetCommonOutputContainer();"));
+    gROOT->ProcessLine(Form("AliAnalysisManager::GetAnalysisManager()->OpenProofFile(c_common_out, \"RECREATE\");"));
     fFileA = gFile;
   } else {
     // local and grid
@@ -142,6 +149,14 @@ Bool_t AliAODHandler::Init(Option_t* opt)
      AliAODExtension *ext;
      while ((ext=(AliAODExtension*)next())) ext->Init(option);
   }   
+  if (fFilters) {
+     TIter nextf(fFilters);
+     AliAODExtension *filteredAOD;
+     while ((filteredAOD=(AliAODExtension*)nextf())) {
+        filteredAOD->SetEvent(fAODEvent);
+        filteredAOD->Init(option);
+     }   
+  }   
   return kTRUE;
 }
 
@@ -190,31 +205,33 @@ void AliAODHandler::StoreMCParticles(){
   // 
 
   AliHeader* header = fMCEventH->MCEvent()->Header();
-  if (!header)return;
-
-  // get the MC vertex
-  AliGenEventHeader* genHeader = header->GenEventHeader();
-  TArrayF vtxMC(3);
-  genHeader->PrimaryVertex(vtxMC);
-  mcHeader->SetVertex(vtxMC[0],vtxMC[1],vtxMC[2]);
-
-  // we search the MCEventHeaders first 
-  // Two cases, cocktail or not...
-  AliGenCocktailEventHeader* genCocktailHeader = dynamic_cast<AliGenCocktailEventHeader*>(genHeader);
-  if(genCocktailHeader){
-    // we have a coktail header
-    mcHeader->AddGeneratorName(genHeader->GetName());
-    // Loop from the back so that the first one sets the process type
-    TList* headerList = genCocktailHeader->GetHeaders();
-    for(int i = headerList->GetEntries()-1;i>=0;--i){
-      AliGenEventHeader *headerEntry = dynamic_cast<AliGenEventHeader*>(headerList->At(i));
-      SetMCHeaderInfo(mcHeader,headerEntry);
-    }
-  }
-  else{
-    // No Cocktail just take the first one
-    SetMCHeaderInfo(mcHeader,genHeader);
+   // get the MC vertex
+  AliGenEventHeader* genHeader = 0;
+  if (header) genHeader = header->GenEventHeader();
+  if (genHeader) {
+      TArrayF vtxMC(3);
+      genHeader->PrimaryVertex(vtxMC);
+      mcHeader->SetVertex(vtxMC[0],vtxMC[1],vtxMC[2]);
+
+      // we search the MCEventHeaders first 
+      // Two cases, cocktail or not...
+      AliGenCocktailEventHeader* genCocktailHeader = dynamic_cast<AliGenCocktailEventHeader*>(genHeader);
+      if(genCocktailHeader){
+         // we have a coktail header
+         mcHeader->AddGeneratorName(genHeader->GetName());
+         // Loop from the back so that the first one sets the process type
+         TList* headerList = genCocktailHeader->GetHeaders();
+         for(int i = headerList->GetEntries()-1;i>=0;--i){
+             AliGenEventHeader *headerEntry = dynamic_cast<AliGenEventHeader*>(headerList->At(i));
+             SetMCHeaderInfo(mcHeader,headerEntry);
+         }
+      }
+      else{
+         // No Cocktail just take the first one
+         SetMCHeaderInfo(mcHeader,genHeader);
+      }
   }
+  
 
 
 
@@ -232,7 +249,7 @@ void AliAODHandler::StoreMCParticles(){
   for(int i = 0; i < np; ++i){
       if(fMCEventH->IsParticleSelected(i)){
          Int_t flag = 0;
-         AliMCParticle* mcpart =  mcEvent->GetTrack(i);
+         AliMCParticle* mcpart =  (AliMCParticle*) mcEvent->GetTrack(i);
          if(i<nprim)flag |= AliAODMCParticle::kPrimary;
          
          if(mcEvent->IsPhysicalPrimary(i))flag |= AliAODMCParticle::kPhysicalPrim;
@@ -311,17 +328,21 @@ void AliAODHandler::StoreMCParticles(){
     for(int it = 0; it < fAODEvent->GetNTracks();++it){
       AliAODTrack *track = fAODEvent->GetTrack(it);
       
-      Int_t label = TMath::Abs(track->GetLabel());
+      Int_t sign = 1;
+      Int_t label = track->GetLabel();
+      if(label<0){ // preserve the sign for later usage
+       label *= -1;
+       sign  = -1;
+      }
+
       if (label >= AliMCEvent::BgLabelOffset()) label =  mcEvent->BgLabelToIndex(label);
-      
-      
       if(label > np || track->GetLabel() == 0){
        AliWarning(Form("Wrong ESD track label %5d (%5d)",track->GetLabel(), label));
       }
       if(fMCEventH->GetNewLabel(label) == 0){
        AliWarning(Form("New label not found for %5d (%5d)",track->GetLabel(), label));
       }
-      track->SetLabel(fMCEventH->GetNewLabel(label));
+      track->SetLabel(sign*fMCEventH->GetNewLabel(label));
     }
   }
   
@@ -364,18 +385,22 @@ Bool_t AliAODHandler::FinishEvent()
   // Fill data structures
   if(fFillAOD){
     fAODEvent->MakeEntriesReferencable();
-    StoreMCParticles();
+    // StoreMCParticles();
     FillTree();
     if (fExtensions) {
       TIter next(fExtensions);
       AliAODExtension *ext;
-      while ((ext=(AliAODExtension*)next())) {
-        ext->GetAOD()->MakeEntriesReferencable();
-        ext->GetTree()->Fill();
+      while ((ext=(AliAODExtension*)next())) ext->FinishEvent();
+    }
+    if (fFilters) {   
+      TIter nextf(fFilters);
+      AliAODExtension *ext;
+      while ((ext=(AliAODExtension*)nextf())) {
+//        ext->SetEvent(fAODEvent);
+        ext->FinishEvent();
       }  
     }       
   }
-
   if (fIsStandard) fAODEvent->ResetStd();
   // Reset AOD replication flag
   fAODIsReplicated = kFALSE;
@@ -403,12 +428,19 @@ Bool_t AliAODHandler::TerminateIO()
     fFileA->Close();
     delete fFileA;
     fFileA = 0;
+    // When closing the file, the tree is also deleted.
+    fTreeA = 0;
   }
   if (fExtensions) {
     TIter next(fExtensions);
     AliAODExtension *ext;
     while ((ext=(AliAODExtension*)next())) ext->TerminateIO();
   }  
+  if (fFilters) {
+    TIter nextf(fFilters);
+    AliAODExtension *ext;
+    while ((ext=(AliAODExtension*)nextf())) ext->TerminateIO();
+  }  
   return kTRUE;
 }
 
@@ -433,6 +465,8 @@ void AliAODHandler::AddAODtoTreeUserInfo()
 {
   // Add aod event to tree user info
   fTreeA->GetUserInfo()->Add(fAODEvent);
+  // Now the tree owns our fAODEvent...
+  fAODEvent = 0;
 }
 
 //______________________________________________________________________________
@@ -485,6 +519,38 @@ AliAODExtension *AliAODHandler::AddExtension(const char *filename, const char *t
    }   
    return ext;
 }
+
+//______________________________________________________________________________
+AliAODExtension *AliAODHandler::GetExtension(const char *filename) const
+{
+// Getter for AOD extensions via file name.
+   if (!fExtensions) return NULL;
+   return (AliAODExtension*)fExtensions->FindObject(filename);
+}   
+
+//______________________________________________________________________________
+AliAODExtension *AliAODHandler::AddFilteredAOD(const char *filename, const char *filtername)
+{
+// Add an AOD extension that can write only AOD events that pass a user filter.
+   if (!fFilters) {
+      fFilters = new TObjArray();
+      fFilters->SetOwner();
+   } 
+   AliAODExtension *filter = (AliAODExtension*)fFilters->FindObject(filename);
+   if (!filter) {
+      filter = new AliAODExtension(filename, filtername, kTRUE);
+      fFilters->Add(filter);
+   }
+   return filter;
+}      
+
+//______________________________________________________________________________
+AliAODExtension *AliAODHandler::GetFilteredAOD(const char *filename) const
+{
+// Getter for AOD filters via file name.
+   if (!fFilters) return NULL;
+   return (AliAODExtension*)fFilters->FindObject(filename);
+}   
    
 //______________________________________________________________________________
 void AliAODHandler::SetOutputFileName(const char* fname)
@@ -515,6 +581,7 @@ void  AliAODHandler::SetMCHeaderInfo(AliAODMCHeader *mcHeader,AliGenEventHeader
   AliGenPythiaEventHeader *pythiaGenHeader = dynamic_cast<AliGenPythiaEventHeader*>(genHeader);
     if (pythiaGenHeader) {
       mcHeader->SetEventType(pythiaGenHeader->ProcessType());
+      mcHeader->SetPtHard(pythiaGenHeader->GetPtHard());
       return;
     }
     
@@ -545,22 +612,44 @@ ClassImp(AliAODExtension)
 //-------------------------------------------------------------------------
 
 //______________________________________________________________________________
+AliAODExtension::AliAODExtension(const char* name, const char* title, Bool_t isfilter)
+                :TNamed(name,title), 
+                 fAODEvent(0), 
+                 fTreeE(0), 
+                 fFileE(0), 
+                 fNtotal(0), 
+                 fNpassed(0),
+                 fSelected(kFALSE)
+{
+// Constructor.
+  if (isfilter) {
+    TObject::SetBit(kFilteredAOD);
+    printf("####### Added AOD filter %s\n", name);
+  } else printf("####### Added AOD extension %s\n", name);
+}   
+
+//______________________________________________________________________________
 AliAODExtension::~AliAODExtension()
 {
 // Destructor.
-  delete fAODEvent;
   if(fFileE){
     // is already handled in TerminateIO
     fFileE->Close();
     delete fFileE;
+    fTreeE = 0;
+    fAODEvent = 0;
   }
-  delete fTreeE;
+  if (fTreeE) delete fTreeE;
 }
 
 //______________________________________________________________________________
 void AliAODExtension::AddBranch(const char* cname, void* addobj)
 {
     // Add a new branch to the aod 
+    if (IsFilteredAOD()) {
+       Error("AddBranch", "Not allowed to add branched to filtered AOD's.");
+       return;
+    }   
     if (!fAODEvent) {
        char type[20];
        gROOT->ProcessLine(Form("TString s_tmp; AliAnalysisManager::GetAnalysisManager()->GetAnalysisTypeString(s_tmp); sprintf((char*)0x%lx, \"%%s\", s_tmp.Data());", type));
@@ -590,6 +679,24 @@ void AliAODExtension::AddBranch(const char* cname, void* addobj)
 }
 
 //______________________________________________________________________________
+Bool_t AliAODExtension::FinishEvent()
+{
+// Fill current event.
+  fNtotal++;
+  if (!IsFilteredAOD()) {
+    fAODEvent->MakeEntriesReferencable();
+    fTreeE->Fill();
+    return kTRUE;
+  }  
+  // Filtered AOD. Fill only if event is selected.
+  if (!fSelected) return kTRUE;
+  fNpassed++;
+  fTreeE->Fill();
+  fSelected = kFALSE; // so that next event will not be selected unless demanded
+  return kTRUE;
+}  
+
+//______________________________________________________________________________
 Bool_t AliAODExtension::Init(Option_t *option)
 {
 // Initialize IO.
@@ -612,14 +719,35 @@ Bool_t AliAODExtension::Init(Option_t *option)
 }
 
 //______________________________________________________________________________
+void AliAODExtension::SetEvent(AliAODEvent *event)
+{
+// Connects to an external event
+   if (!IsFilteredAOD()) {
+      Error("SetEvent", "Not allowed to set external event for filtered AOD's");   
+      return;
+   }
+   // Use the copy constructor or assignment operator to synchronize with external event.
+//   AliAODEvent &other = *event;
+//   if (!fAODEvent)     fAODEvent = new AliAODEvent(other);
+//   else if (fSelected) *fAODEvent = other;
+   fAODEvent = event;
+}
+   
+//______________________________________________________________________________
 Bool_t AliAODExtension::TerminateIO()
 {
   // Terminate IO
+  if (TObject::TestBit(kFilteredAOD))
+    printf("AOD Filter %s: events processed: %d   passed: %d\n", GetName(), fNtotal, fNpassed);
+  else
+    printf("AOD extension %s: events processed: %d\n", GetName(), fNtotal);
   if (fFileE) {
     fFileE->Write();
     fFileE->Close();
     delete fFileE;
     fFileE = 0;
+    fTreeE = 0;
+    fAODEvent = 0;
   }
   return kTRUE;
 }