]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - PWGDQ/dielectron/AliAnalysisTaskDielectronFilter.cxx
Merge branch 'TPCdev' of https://git.cern.ch/reps/AliRoot into TPCdev
[u/mrichter/AliRoot.git] / PWGDQ / dielectron / AliAnalysisTaskDielectronFilter.cxx
index ccea5311f4b26cbb94b3a6ca10ad0b78ee173367..3177aa886067f24080d54ab7c2f40fed0674bff4 100644 (file)
@@ -21,7 +21,6 @@
 
 #include <TChain.h>
 #include <TH1D.h>
-
 #include <AliLog.h>
 #include <AliAODHandler.h>
 #include <AliAODInputHandler.h>
@@ -37,6 +36,7 @@
 #include "AliDielectronHistos.h"
 #include "AliDielectronVarManager.h"
 #include "AliAnalysisTaskDielectronFilter.h"
+#include "AliAODCaloCluster.h"
 
 ClassImp(AliAnalysisTaskDielectronFilter)
 
@@ -54,7 +54,9 @@ fTriggerLogic(kAny),
 fTriggerAnalysis(0x0),
 fStoreLikeSign(kFALSE),
 fStoreRotatedPairs(kFALSE),
-fStoreTrackLegs(kFALSE),
+fStoreEventsWithSingleTracks(kFALSE),
+fCreateNanoAOD(kFALSE),
+fStoreHeader(kFALSE),
 fEventFilter(0x0)
 {
   //
@@ -76,7 +78,9 @@ fTriggerLogic(kAny),
 fTriggerAnalysis(0x0),
 fStoreLikeSign(kFALSE),
 fStoreRotatedPairs(kFALSE),
-fStoreTrackLegs(kFALSE),
+fStoreEventsWithSingleTracks(kFALSE),
+fCreateNanoAOD(kFALSE),
+fStoreHeader(kFALSE),
 fEventFilter(0x0)
 {
   //
@@ -135,7 +139,24 @@ void AliAnalysisTaskDielectronFilter::UserCreateOutputObjects()
     fEventStat->GetXaxis()->SetBinLabel((kNbinsEvent+1),Form("#splitline{1 candidate}{%s}",fDielectron->GetName()));
     fEventStat->GetXaxis()->SetBinLabel((kNbinsEvent+2),Form("#splitline{With >1 candidate}{%s}",fDielectron->GetName()));
    }
+
+Bool_t isAOD=AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler()->IsA()==AliAODInputHandler::Class(); 
+if(fCreateNanoAOD && isAOD){
+  AliAODHandler *aodH = (AliAODHandler*)((AliAnalysisManager::GetAnalysisManager())->GetOutputEventHandler());
+  AliAODExtension *extDielectron = aodH->GetFilteredAOD("AliAOD.Dielectron.root");
+   TClonesArray *nanoAODTracks = new TClonesArray("AliAODTrack",500);
+   nanoAODTracks->SetName("tracks");
+   extDielectron->AddBranch("TClonesArray", &nanoAODTracks);
+   TClonesArray *nanoAODVertices = new TClonesArray("AliAODVertex",500);
+   nanoAODVertices->SetName("vertices");
+   extDielectron->AddBranch("TClonesArray", &nanoAODVertices);
+   TClonesArray *nanoAODCaloCluster = new TClonesArray("AliAODCaloCluster",500);
+   nanoAODCaloCluster->SetName("caloClusters");
+   extDielectron->AddBranch("TClonesArray", &nanoAODCaloCluster);  
+   extDielectron->GetAOD()->GetStdContent();
+   }else if(fCreateNanoAOD && !isAOD){AliWarning("Filtered-Nano AODs creation works only on AODs ");  } 
+  
+  PostData(1, const_cast<THashList*>(fDielectron->GetHistogramList()));
   PostData(2,fEventStat);
 }
 
@@ -177,7 +198,7 @@ void AliAnalysisTaskDielectronFilter::UserExec(Option_t *)
   //before physics selection
   fEventStat->Fill(kAllEvents);
   if (isSelected==0||isRejected) {
-    PostData(3,fEventStat);
+    PostData(2,fEventStat);
     return;
   }
   //after physics selection
@@ -240,9 +261,13 @@ void AliAnalysisTaskDielectronFilter::UserExec(Option_t *)
   else hasCand = (fDielectron->HasCandidates());
 
   if(fStoreRotatedPairs) hasCand = (hasCand || fDielectron->HasCandidatesTR());
+  if(fStoreEventsWithSingleTracks) hasCand = (hasCand || fDielectron->GetTrackArray(0) || fDielectron->GetTrackArray(1));
+
   
+  AliAODHandler *aodH=(AliAODHandler*)((AliAnalysisManager::GetAnalysisManager())->GetOutputEventHandler());
+  AliAODExtension *extDielectron = aodH->GetFilteredAOD("AliAOD.Dielectron.root");
   if(hasCand){
-    AliAODHandler *aodH=(AliAODHandler*)((AliAnalysisManager::GetAnalysisManager())->GetOutputEventHandler());
     AliAODEvent *aod = aodH->GetAOD();
     
     // reset bit for all tracks
@@ -269,7 +294,6 @@ void AliAnalysisTaskDielectronFilter::UserExec(Option_t *)
       }
     }
     
-    AliAODExtension *extDielectron = aodH->GetFilteredAOD("AliAOD.Dielectron.root");
     extDielectron->SelectEvent();
     Int_t ncandidates=fDielectron->GetPairArray(1)->GetEntriesFast();
     if (ncandidates==1) fEventStat->Fill((kNbinsEvent));
@@ -283,22 +307,89 @@ void AliAnalysisTaskDielectronFilter::UserExec(Option_t *)
     
     if (!t->GetBranch("dielectrons"))
       t->Bronch("dielectrons","TObjArray",fDielectron->GetPairArraysPointer());
+      
       // store positive and negative tracks
-      if(fStoreTrackLegs && t->GetBranch("tracks")){
-       Int_t nTracks = (fDielectron->GetTrackArray(0))->GetEntries() + (fDielectron->GetTrackArray(1))->GetEntries();
-      extDielectron->GetAOD()->ResetStd(nTracks);
-
-         for(int kj=0; kj<(fDielectron->GetTrackArray(0))->GetEntries(); kj++)
-         extDielectron->GetAOD()->AddTrack((AliAODTrack*)fDielectron->GetTrackArray(0)->At(kj));
-
-         for(int kj=0; kj<(fDielectron->GetTrackArray(1))->GetEntries(); kj++)
-         extDielectron->GetAOD()->AddTrack((AliAODTrack*)fDielectron->GetTrackArray(1)->At(kj));
-      }
-
+      if(fCreateNanoAOD && isAOD){
+      Int_t nTracks = (fDielectron->GetTrackArray(0))->GetEntries() + (fDielectron->GetTrackArray(1))->GetEntries();
+       AliAODEvent *nanoEv = extDielectron->GetAOD();
+       nanoEv->GetTracks()->Clear();      
+       nanoEv->GetVertices()->Clear();      
+       nanoEv->GetCaloClusters()->Clear();      
+       
+       AliAODVertex* tmp = ((static_cast<AliAODEvent*>(InputEvent()))->GetPrimaryVertex())->CloneWithoutRefs();
+       nanoEv->AddVertex(tmp);
+       AliAODVertex* tmpSpd = ((static_cast<AliAODEvent*>(InputEvent()))->GetPrimaryVertexSPD())->CloneWithoutRefs();
+       nanoEv->AddVertex(tmpSpd);
+       nanoEv->GetVertex(0)->SetNContributors((static_cast<AliAODEvent*>(InputEvent()))->GetPrimaryVertex()->GetNContributors());
+       nanoEv->GetVertex(1)->SetNContributors((static_cast<AliAODEvent*>(InputEvent()))->GetPrimaryVertexSPD()->GetNContributors());
+       // set event plane 
+       nanoEv->GetHeader()->SetEventplane((static_cast<AliAODEvent*>(InputEvent()))->GetHeader()->GetEventplaneP());
+       nanoEv->GetHeader()->ResetEventplanePointer(); 
+       // set multiplicity
+       nanoEv->GetHeader()->SetRefMultiplicity((Int_t)values[AliDielectronVarManager::kNTrk]);
+       nanoEv->GetHeader()->SetRefMultiplicityPos((Int_t)values[AliDielectronVarManager::kNacc]);
+       //nanoEv->GetHeader()->SetRefMultiplicityNeg(values[AliDielectronVarManager::kMatchEffITSTPC]);
+
+         for(int kj=0; kj<(fDielectron->GetTrackArray(0))->GetEntries(); kj++){
+         Int_t posit = nanoEv->AddTrack((AliAODTrack*)fDielectron->GetTrackArray(0)->At(kj));
+         Int_t posVtx = nanoEv->AddVertex(((AliAODTrack*)fDielectron->GetTrackArray(0)->At(kj))->GetProdVertex()); 
+         nanoEv->GetVertex(posVtx)->ResetBit(kIsReferenced);  
+         nanoEv->GetVertex(posVtx)->SetUniqueID(0);
+         nanoEv->GetVertex(posVtx)->RemoveDaughters();
+         nanoEv->GetTrack(posit)->ResetBit(kIsReferenced);  
+         nanoEv->GetTrack(posit)->SetUniqueID(0); 
+         // calo cluster
+         Int_t caloIndex = ((AliAODTrack*)fDielectron->GetTrackArray(0)->At(kj))->GetEMCALcluster();
+         if(caloIndex > 0 && (static_cast<AliAODEvent*>(InputEvent()))->GetCaloCluster(caloIndex)){
+         Int_t posCaloCls = nanoEv->AddCaloCluster(static_cast<AliAODEvent*>(InputEvent())->GetCaloCluster(caloIndex));
+         nanoEv->GetTrack(posit)->SetEMCALcluster(posCaloCls);
+         AliAODCaloCluster *clCls = nanoEv->GetCaloCluster(posCaloCls);
+         for(int u=0; u<clCls->GetNTracksMatched(); u++) clCls->RemoveTrackMatched(clCls->GetTrackMatched(u)); 
+         nanoEv->GetCaloCluster(posCaloCls)->AddTrackMatched((AliAODTrack*)nanoEv->GetTrack(posit)); 
+         }
+         // set references for vtx
+         nanoEv->GetTrack(posit)->SetProdVertex(nanoEv->GetVertex(posVtx));
+         }
+
+         for(int kj=0; kj<(fDielectron->GetTrackArray(1))->GetEntries(); kj++){
+         Int_t negat = nanoEv->AddTrack((AliAODTrack*)fDielectron->GetTrackArray(1)->At(kj));
+         Int_t negVtx = nanoEv->AddVertex(((AliAODTrack*)fDielectron->GetTrackArray(1)->At(kj))->GetProdVertex());    
+         nanoEv->GetVertex(negVtx)->ResetBit(kIsReferenced);  
+         nanoEv->GetVertex(negVtx)->SetUniqueID(0);
+         nanoEv->GetVertex(negVtx)->RemoveDaughters();
+         nanoEv->GetTrack(negat)->ResetBit(kIsReferenced);  
+         nanoEv->GetTrack(negat)->SetUniqueID(0);
+         // calo cluster
+         Int_t caloIndex = ((AliAODTrack*)fDielectron->GetTrackArray(1)->At(kj))->GetEMCALcluster(); 
+         if(caloIndex > 0 && (static_cast<AliAODEvent*>(InputEvent()))->GetCaloCluster(caloIndex)){
+         Int_t negCaloCls = nanoEv->AddCaloCluster(static_cast<AliAODEvent*>(InputEvent())->GetCaloCluster(caloIndex));
+         nanoEv->GetTrack(negat)->SetEMCALcluster(negCaloCls);
+         AliAODCaloCluster *clCls = nanoEv->GetCaloCluster(negCaloCls); 
+         for(int u=0; u<clCls->GetNTracksMatched(); u++) clCls->RemoveTrackMatched(clCls->GetTrackMatched(u));
+         nanoEv->GetCaloCluster(negCaloCls)->AddTrackMatched((AliAODTrack*)nanoEv->GetTrack(negat));
+         }
+         nanoEv->GetTrack(negat)->SetProdVertex(nanoEv->GetVertex(negVtx)); 
+         }  
+        delete tmp; delete tmpSpd; 
+        nanoEv->GetTracks()->Expand(nTracks); 
+        nanoEv->GetVertices()->Expand(nTracks+2); 
+        nanoEv->GetCaloClusters()->Expand(nanoEv->GetNumberOfCaloClusters()); 
+   
+    }
     if(isAOD) t->Fill();
   }
-  
+  if(fCreateNanoAOD && isAOD && (!hasCand) &&  fStoreHeader)  
+   {
+   // set event plane 
+   extDielectron->GetAOD()->GetHeader()->SetEventplane((static_cast<AliAODEvent*>(InputEvent()))->GetHeader()->GetEventplaneP());
+   extDielectron->GetAOD()->GetHeader()->ResetEventplanePointer();
+   extDielectron->GetTree()->Fill(); // fill header for all events without tracks
+   }
   PostData(1, const_cast<THashList*>(fDielectron->GetHistogramList()));
   PostData(2,fEventStat);
+  return;
 }
 
+