]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - STEER/AliAODEvent.cxx
Adding extra logging level option to macro.
[u/mrichter/AliRoot.git] / STEER / AliAODEvent.cxx
index e7c8c84ed377a09bc67b58bdcdfa921c19347500..72318e56e9c1ffb341ae4975709a7ae4398f9422 100644 (file)
@@ -24,8 +24,9 @@
 #include <TTree.h>
 #include <TFolder.h>
 #include <TFriendElement.h>
-
-
+#include <TProcessID.h>
+#include <TCollection.h>
+#include "Riostream.h"
 #include "AliAODEvent.h"
 #include "AliAODHeader.h"
 #include "AliAODTrack.h"
@@ -50,6 +51,7 @@ AliAODEvent::AliAODEvent() :
   AliVEvent(),
   fAODObjects(new TList()),
   fAODFolder(0),
+  fConnected(kFALSE),
   fHeader(0),
   fTracks(0),
   fVertices(0),
@@ -70,6 +72,7 @@ AliAODEvent::AliAODEvent(const AliAODEvent& aod):
   AliVEvent(aod),
   fAODObjects(new TList()),
   fAODFolder(new TFolder()),
+  fConnected(kFALSE),
   fHeader(new AliAODHeader(*aod.fHeader)),
   fTracks(new TClonesArray(*aod.fTracks)),
   fVertices(new TClonesArray(*aod.fVertices)),
@@ -94,7 +97,7 @@ AliAODEvent::AliAODEvent(const AliAODEvent& aod):
   AddObject(fCaloClusters);
   AddObject(fFmdClusters);
   AddObject(fPmdClusters);
-
+  fConnected = aod.fConnected;
   GetStdContent();
 }
 
@@ -108,6 +111,7 @@ AliAODEvent & AliAODEvent::operator=(const AliAODEvent& aod) {
 
     fAODObjects      = new TList();
     fAODFolder       = new TFolder();
+    fConnected       = aod.fConnected;
     fHeader          = new AliAODHeader(*aod.fHeader);
     fTracks          = new TClonesArray(*aod.fTracks);
     fVertices        = new TClonesArray(*aod.fVertices);
@@ -142,7 +146,12 @@ AliAODEvent & AliAODEvent::operator=(const AliAODEvent& aod) {
 AliAODEvent::~AliAODEvent() 
 {
 // destructor
-    delete fAODObjects;
+    if(fAODObjects&&!fConnected)
+    {
+       delete fAODObjects;
+       fAODObjects = 0;
+    }
+
     delete fAODFolder;
 }
 
@@ -198,6 +207,21 @@ void AliAODEvent::CreateStdContent()
   return;
 }
 
+void  AliAODEvent::MakeEntriesReferencable()
+{
+    // Make all entries referencable in a subsequent process
+    //
+    TIter next(fAODObjects);
+    TObject* obj;
+    while ((obj = next()))
+    {
+       if(obj->InheritsFrom("TCollection"))
+           {
+               AssignIDtoCollection((TCollection*)obj);
+           }
+    }
+}
+
 //______________________________________________________________________________
 void AliAODEvent::SetStdNames()
 {
@@ -316,6 +340,55 @@ void AliAODEvent::ClearStd()
   fPmdClusters   ->Clear();
 }
 
+//_________________________________________________________________
+Int_t AliAODEvent::GetPHOSClusters(TRefArray *clusters) const
+{
+  // fills the provided TRefArray with all found phos clusters
+  
+  clusters->Clear();
+  
+  AliAODCaloCluster *cl = 0;
+  Bool_t first = kTRUE;
+  for (Int_t i = 0; i < GetNCaloClusters() ; i++) {
+    if ( (cl = GetCaloCluster(i)) ) {
+      if (cl->IsPHOSCluster()){
+       if(first) {
+         new (clusters) TRefArray(TProcessID::GetProcessWithUID(cl)); 
+         first=kFALSE;
+       }
+       clusters->Add(cl);
+       //printf("IsPHOS cluster %d, E %2.3f Size: %d \n",i,cl->E(),clusters->GetEntriesFast());
+      }
+    }
+  }
+  return clusters->GetEntriesFast();
+}
+
+//_________________________________________________________________
+Int_t AliAODEvent::GetEMCALClusters(TRefArray *clusters) const
+{
+  // fills the provided TRefArray with all found emcal clusters
+
+  clusters->Clear();
+  cout<<"AOD event 1: nclus "<<GetNCaloClusters()<<endl;
+  AliAODCaloCluster *cl = 0;
+  Bool_t first = kTRUE;
+  for (Int_t i = 0; i < GetNCaloClusters(); i++) {
+    if ( (cl = GetCaloCluster(i)) ) {
+      if (cl->IsEMCALCluster()){
+       if(first) {
+         new (clusters) TRefArray(TProcessID::GetProcessWithUID(cl)); 
+         first=kFALSE;
+       }
+       clusters->Add(cl);
+       //printf("IsEMCal cluster %d, E %2.3f Size: %d \n",i,cl->E(),clusters->GetEntriesFast());
+      }
+    }
+  }
+  return clusters->GetEntriesFast();
+}
+
+
 //______________________________________________________________________________
 Int_t AliAODEvent::GetMuonTracks(TRefArray *muonTracks) const
 {
@@ -334,9 +407,9 @@ Int_t AliAODEvent::GetMuonTracks(TRefArray *muonTracks) const
 }
 
 
-void AliAODEvent::ReadFromTree(TTree *tree)
+void AliAODEvent::ReadFromTree(TTree *tree, Option_t* opt /*= ""*/)
 {
-  // connects aod event to tree
+  // Connects aod event to tree
   
   if(!tree){
     Printf("%s %d AliAODEvent::ReadFromTree() Zero Pointer to Tree \n",(char*)__FILE__,__LINE__);
@@ -351,12 +424,13 @@ void AliAODEvent::ReadFromTree(TTree *tree)
   if(aodEvent){
     // Check if already connected to tree
     TList* connectedList = (TList*) (tree->GetUserInfo()->FindObject("AODObjectsConnectedToTree"));
-    if (connectedList) {
-      // If connected use the connected list if objects
-      fAODObjects->Delete();
-      fAODObjects = connectedList;
-      GetStdContent(); 
-      return;
+    if (connectedList && (strcmp(opt, "reconnect"))) {
+       // If connected use the connected list if objects
+       fAODObjects->Delete();
+       fAODObjects = connectedList;
+       GetStdContent(); 
+       fConnected = kTRUE;
+       return;
     }
     // Connect to tree
     // prevent a memory leak when reading back the TList
@@ -372,7 +446,7 @@ void AliAODEvent::ReadFromTree(TTree *tree)
     }
     //
     // Let's find out whether we have friends
-    TList* friendL = tree->GetListOfFriends();
+    TList* friendL = tree->GetTree()->GetListOfFriends();
     if (friendL) 
     {
        TIter next(friendL);
@@ -387,7 +461,7 @@ void AliAODEvent::ReadFromTree(TTree *tree)
                printf("Get list of object from tree %d !!\n", objL->GetEntries());
                TIter nextobject(objL);
                TObject* obj =  0;
-               while(obj = nextobject())
+               while((obj = nextobject()))
                {
                    printf("Adding object from friend %s !\n", obj->GetName());
                    fAODObjects->Add(obj);
@@ -403,11 +477,10 @@ void AliAODEvent::ReadFromTree(TTree *tree)
     while((el=(TNamed*)next())){
       TString bname(el->GetName());
       // check if branch exists under this Name
-      TBranch *br = tree->GetBranch(bname.Data());
+      TBranch *br = tree->GetTree()->GetBranch(bname.Data());
       if(br){
        tree->SetBranchAddress(bname.Data(),fAODObjects->GetObjectRef(el));
-      }
-      else{
+      } else {
          br = tree->GetBranch(Form("%s.",bname.Data()));
          if(br){
              tree->SetBranchAddress(Form("%s.",bname.Data()),fAODObjects->GetObjectRef(el));
@@ -426,6 +499,7 @@ void AliAODEvent::ReadFromTree(TTree *tree)
     // we are not owner of the list objects 
     // must not delete it
     tree->GetUserInfo()->Add(fAODObjects);
+    fConnected = kTRUE;
   }// no aodEvent
   else {
     // we can't get the list from the user data, create standard content
@@ -451,3 +525,15 @@ void AliAODEvent::Print(Option_t *) const
   
   return;
 }
+
+void AliAODEvent::AssignIDtoCollection(TCollection* col)
+{
+    // Static method which assigns a ID to each object in a collection
+    // In this way the objects are marked as referenced and written with 
+    // an ID. This has the advantage that TRefs to this objects can be 
+    // written by a subsequent process.
+    TIter next(col);
+    TObject* obj;
+    while ((obj = next()))
+       TProcessID::AssignID(obj);
+}