]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - STEER/AliAODEvent.cxx
Updated ITS PID parameters for MC tracks + usage of momentum at the vertex to paramet...
[u/mrichter/AliRoot.git] / STEER / AliAODEvent.cxx
index 2ae095c61d18c91f7ce3dde43f894c295e99eabd..350f99f09f7f1004cfbe5b674d7c020f7dc43b1f 100644 (file)
@@ -77,7 +77,7 @@ AliAODEvent::AliAODEvent() :
 AliAODEvent::AliAODEvent(const AliAODEvent& aod):
   AliVEvent(aod),
   fAODObjects(new TList()),
-  fAODFolder(new TFolder()),
+  fAODFolder(0),
   fConnected(kFALSE),
   fHeader(new AliAODHeader(*aod.fHeader)),
   fTracks(new TClonesArray(*aod.fTracks)),
@@ -219,6 +219,7 @@ AliAODEvent::~AliAODEvent()
     }
 
     delete fAODFolder;
+    fAODFolder = 0;
 }
 
 //______________________________________________________________________________
@@ -240,7 +241,7 @@ void AliAODEvent::RemoveObject(TObject* obj)
 }
 
 //______________________________________________________________________________
-TObject *AliAODEvent::FindListObject(const char *objName)
+TObject *AliAODEvent::FindListObject(const char *objName) const
 {
   // Return the pointer to the object with the given name.
 
@@ -314,6 +315,7 @@ void AliAODEvent::SetStdNames()
 void AliAODEvent::CreateStdFolders()
 {
     // Create the standard folder structure
+  if(fAODFolder)delete fAODFolder;
     fAODFolder = gROOT->GetRootFolder()->AddFolder("AOD", "AOD");
     if(fAODObjects->GetEntries()==kAODListN){
        for(int i = 0;i < fAODObjects->GetEntries();i++){
@@ -371,7 +373,7 @@ void AliAODEvent::ResetStd(Int_t trkArrSize,
   fVertices->Delete();
   if (vtxArrSize > fVertices->GetSize()) 
     fVertices->Expand(vtxArrSize);
-        
+
   fV0s->Delete();
   if (v0ArrSize > fV0s->GetSize()) 
     fV0s->Expand(v0ArrSize);
@@ -434,9 +436,9 @@ Int_t AliAODEvent::GetPHOSClusters(TRefArray *clusters) const
   
   AliAODCaloCluster *cl = 0;
   Bool_t first = kTRUE;
-  for (Int_t i = 0; i < GetNCaloClusters() ; i++) {
+  for (Int_t i = 0; i < GetNumberOfCaloClusters() ; i++) {
     if ( (cl = GetCaloCluster(i)) ) {
-      if (cl->IsPHOSCluster()){
+      if (cl->IsPHOS()){
        if(first) {
          new (clusters) TRefArray(TProcessID::GetProcessWithUID(cl)); 
          first=kFALSE;
@@ -457,9 +459,9 @@ Int_t AliAODEvent::GetEMCALClusters(TRefArray *clusters) const
   clusters->Clear();
   AliAODCaloCluster *cl = 0;
   Bool_t first = kTRUE;
-  for (Int_t i = 0; i < GetNCaloClusters(); i++) {
+  for (Int_t i = 0; i < GetNumberOfCaloClusters(); i++) {
     if ( (cl = GetCaloCluster(i)) ) {
-      if (cl->IsEMCALCluster()){
+      if (cl->IsEMCAL()){
        if(first) {
          new (clusters) TRefArray(TProcessID::GetProcessWithUID(cl)); 
          first=kFALSE;
@@ -508,101 +510,101 @@ Int_t AliAODEvent::GetNumberOfMuonTracks() const
 
 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__);
     return;
   }
-  // load the TTree
+    // load the TTree
   if(!tree->GetTree())tree->LoadTree(0);
-
-  // Try to find AliAODEvent
+  
+    // Try to find AliAODEvent
   AliAODEvent *aodEvent = 0;
   aodEvent = (AliAODEvent*)tree->GetTree()->GetUserInfo()->FindObject("AliAODEvent");
   if(aodEvent){
-    // Check if already connected to tree
+      // Check if already connected to tree
     TList* connectedList = (TList*) (tree->GetUserInfo()->FindObject("AODObjectsConnectedToTree"));
     if (connectedList && (strcmp(opt, "reconnect"))) {
-       // If connected use the connected list of objects
+        // If connected use the connected list of objects
        fAODObjects->Delete();
        fAODObjects = connectedList;
        GetStdContent(); 
        fConnected = kTRUE;
        return;
     } 
-    // Connect to tree
-    // prevent a memory leak when reading back the TList
-    // if (!(strcmp(opt, "reconnect"))) fAODObjects->Delete();
-
-    // create a new TList from the UserInfo TList... 
-    // copy constructor does not work...
+      // Connect to tree
+      // prevent a memory leak when reading back the TList
+//      if (!(strcmp(opt, "reconnect"))) fAODObjects->Delete();
+    
+      // create a new TList from the UserInfo TList... 
+      // copy constructor does not work...
     fAODObjects = (TList*)(aodEvent->GetList()->Clone());
     fAODObjects->SetOwner(kTRUE);
     if(fAODObjects->GetEntries()<kAODListN){
       printf("%s %d AliAODEvent::ReadFromTree() TList contains less than the standard contents %d < %d \n",
-            (char*)__FILE__,__LINE__,fAODObjects->GetEntries(),kAODListN);
+             (char*)__FILE__,__LINE__,fAODObjects->GetEntries(),kAODListN);
     }
-    //
-    // Let's find out whether we have friends
+      //
+      // Let's find out whether we have friends
     TList* friendL = tree->GetTree()->GetListOfFriends();
     if (friendL) 
     {
-       TIter next(friendL);
-       TFriendElement* fe;
-       while ((fe = (TFriendElement*)next())){
-           aodEvent = (AliAODEvent*)(fe->GetTree()->GetUserInfo()->FindObject("AliAODEvent"));
-           if (!aodEvent) {
-               printf("No UserInfo on tree \n");
-           } else {
-
-               TList* objL = (TList*)(aodEvent->GetList()->Clone());
-               printf("Get list of object from tree %d !!\n", objL->GetEntries());
-               TIter nextobject(objL);
-               TObject* obj =  0;
-               while((obj = nextobject()))
-               {
-                   printf("Adding object from friend %s !\n", obj->GetName());
-                   fAODObjects->Add(obj);
-               } // object "branch" loop
-           } // has userinfo  
-       } // friend loop
+      TIter next(friendL);
+      TFriendElement* fe;
+      while ((fe = (TFriendElement*)next())){
+        aodEvent = (AliAODEvent*)(fe->GetTree()->GetUserInfo()->FindObject("AliAODEvent"));
+        if (!aodEvent) {
+          printf("No UserInfo on tree \n");
+        } else {
+          
+          TList* objL = (TList*)(aodEvent->GetList()->Clone());
+          printf("Get list of object from tree %d !!\n", objL->GetEntries());
+          TIter nextobject(objL);
+          TObject* obj =  0;
+          while((obj = nextobject()))
+          {
+            printf("Adding object from friend %s !\n", obj->GetName());
+            fAODObjects->Add(obj);
+          } // object "branch" loop
+        } // has userinfo  
+      } // friend loop
     } // has friends   
-           
-
-// set the branch addresses
+    
+    
+      // set the branch addresses
     TIter next(fAODObjects);
     TNamed *el;
     while((el=(TNamed*)next())){
       TString bname(el->GetName());
-      // check if branch exists under this Name
+        // check if branch exists under this Name
       TBranch *br = tree->GetTree()->GetBranch(bname.Data());
       if(br){
-       tree->SetBranchAddress(bname.Data(),fAODObjects->GetObjectRef(el));
+        tree->SetBranchAddress(bname.Data(),fAODObjects->GetObjectRef(el));
       } else {
-         br = tree->GetBranch(Form("%s.",bname.Data()));
-         if(br){
-             tree->SetBranchAddress(Form("%s.",bname.Data()),fAODObjects->GetObjectRef(el));
-         }
-         else{
-             printf("%s %d AliAODEvent::ReadFromTree() No Branch found with Name %s. \n",
-                    (char*)__FILE__,__LINE__,bname.Data());
-         }     
+        br = tree->GetBranch(Form("%s.",bname.Data()));
+        if(br){
+          tree->SetBranchAddress(Form("%s.",bname.Data()),fAODObjects->GetObjectRef(el));
+        }
+        else{
+          printf("%s %d AliAODEvent::ReadFromTree() No Branch found with Name %s. \n",
+                 (char*)__FILE__,__LINE__,bname.Data());
+        }      
       }
     }
     GetStdContent();
-    // when reading back we are not owner of the list 
-    // must not delete it
+      // when reading back we are not owner of the list 
+      // must not delete it
     fAODObjects->SetOwner(kTRUE);
     fAODObjects->SetName("AODObjectsConnectedToTree");
-    // we are not owner of the list objects 
-    // must not delete it
+      // 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
-    // and set it by hand
+      // we can't get the list from the user data, create standard content
+      // and set it by hand
     CreateStdContent();
     TIter next(fAODObjects);
     TNamed *el;
@@ -611,11 +613,123 @@ void AliAODEvent::ReadFromTree(TTree *tree, Option_t* opt /*= ""*/)
       tree->SetBranchAddress(bname.Data(),fAODObjects->GetObjectRef(el));
     }
     GetStdContent();
-    // when reading back we are not owner of the list 
-    // must not delete it
+      // when reading back we are not owner of the list 
+      // must not delete it
     fAODObjects->SetOwner(kTRUE);
   }
 }
+  //______________________________________________________________________________
+Int_t  AliAODEvent::GetNumberOfPileupVerticesSPD() const{
+  // count number of SPD pileup vertices
+  Int_t nVertices=GetNumberOfVertices();
+  Int_t nPileupVertices=0;
+  for(Int_t iVert=0; iVert<nVertices; iVert++){
+    AliAODVertex *v=GetVertex(iVert);
+    if(v->GetType()==AliAODVertex::kPileupSPD) nPileupVertices++;
+  }
+  return nPileupVertices;
+}
+//______________________________________________________________________________
+Int_t  AliAODEvent::GetNumberOfPileupVerticesTracks() const{
+  // count number of track pileup vertices
+  Int_t nVertices=GetNumberOfVertices();
+  Int_t nPileupVertices=0;
+  for(Int_t iVert=0; iVert<nVertices; iVert++){
+    AliAODVertex *v=GetVertex(iVert);
+    if(v->GetType()==AliAODVertex::kPileupTracks) nPileupVertices++;
+  }
+  return nPileupVertices;
+}
+//______________________________________________________________________________
+AliAODVertex* AliAODEvent::GetPrimaryVertexSPD() const{
+  //
+  Int_t nVertices=GetNumberOfVertices();
+  for(Int_t iVert=0; iVert<nVertices; iVert++){
+    AliAODVertex *v=GetVertex(iVert);
+    if(v->GetType()==AliAODVertex::kMainSPD) return v;
+  }
+  return 0;
+}
+//______________________________________________________________________________
+AliAODVertex* AliAODEvent::GetPileupVertexSPD(Int_t iV) const{
+  //
+  Int_t nVertices=GetNumberOfVertices();
+  Int_t counter=0;
+  for(Int_t iVert=0; iVert<nVertices; iVert++){
+    AliAODVertex *v=GetVertex(iVert);
+    if(v->GetType()==AliAODVertex::kPileupSPD){
+      if(counter==iV) return v;
+      ++counter;
+    }
+  }
+  return 0;
+}
+//______________________________________________________________________________
+AliAODVertex* AliAODEvent::GetPileupVertexTracks(Int_t iV) const{
+  //
+  Int_t nVertices=GetNumberOfVertices();
+  Int_t counter=0;
+  for(Int_t iVert=0; iVert<nVertices; iVert++){
+    AliAODVertex *v=GetVertex(iVert);
+    if(v->GetType()==AliAODVertex::kPileupTracks){
+      if(counter==iV) return v;
+      ++counter;
+    }
+  }
+  return 0;
+}
+//______________________________________________________________________________
+Bool_t  AliAODEvent::IsPileupFromSPD(Int_t minContributors, 
+                                    Double_t minZdist, 
+                                    Double_t nSigmaZdist, 
+                                    Double_t nSigmaDiamXY, 
+                                    Double_t nSigmaDiamZ) const{
+  //
+  // This function checks if there was a pile up
+  // reconstructed with SPD
+  //
+  AliAODVertex *mainV=GetPrimaryVertexSPD();
+  if(!mainV) return kFALSE;
+  Int_t nc1=mainV->GetNContributors();
+  if(nc1<1) return kFALSE;
+  Int_t nPileVert=GetNumberOfPileupVerticesSPD();
+  if(nPileVert==0) return kFALSE;
+  Int_t nVertices=GetNumberOfVertices();
+  
+  for(Int_t iVert=0; iVert<nVertices; iVert++){
+    AliAODVertex *pv=GetVertex(iVert);
+    if(pv->GetType()!=AliAODVertex::kPileupSPD) continue;
+    Int_t nc2=pv->GetNContributors();
+    if(nc2>=minContributors){
+      Double_t z1=mainV->GetZ();
+      Double_t z2=pv->GetZ();
+      Double_t distZ=TMath::Abs(z2-z1);
+      Double_t distZdiam=TMath::Abs(z2-GetDiamondZ());
+      Double_t cutZdiam=nSigmaDiamZ*TMath::Sqrt(GetSigma2DiamondZ());
+      if(GetSigma2DiamondZ()<0.0001)cutZdiam=99999.; //protection for missing z diamond information
+      if(distZ>minZdist && distZdiam<cutZdiam){
+       Double_t x2=pv->GetX();
+       Double_t y2=pv->GetY();
+       Double_t distXdiam=TMath::Abs(x2-GetDiamondX());
+       Double_t distYdiam=TMath::Abs(y2-GetDiamondY());
+       Double_t cov1[6],cov2[6];       
+       mainV->GetCovarianceMatrix(cov1);
+       pv->GetCovarianceMatrix(cov2);
+       Double_t errxDist=TMath::Sqrt(cov2[0]+GetSigma2DiamondX());
+       Double_t erryDist=TMath::Sqrt(cov2[2]+GetSigma2DiamondY());
+       Double_t errzDist=TMath::Sqrt(cov1[5]+cov2[5]);
+       Double_t cutXdiam=nSigmaDiamXY*errxDist;
+       if(GetSigma2DiamondX()<0.0001)cutXdiam=99999.; //protection for missing diamond information
+       Double_t cutYdiam=nSigmaDiamXY*erryDist;
+       if(GetSigma2DiamondY()<0.0001)cutYdiam=99999.; //protection for missing diamond information
+       if( (distXdiam<cutXdiam) && (distYdiam<cutYdiam) && (distZ>nSigmaZdist*errzDist) ){
+         return kTRUE;
+       }
+      }
+    }
+  }
+  return kFALSE;
+}
 
 //______________________________________________________________________________
 void AliAODEvent::Print(Option_t *) const