]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - PWGDQ/dielectron/AliAnalysisTaskDielectronFilter.cxx
update from pr task : sjena
[u/mrichter/AliRoot.git] / PWGDQ / dielectron / AliAnalysisTaskDielectronFilter.cxx
index 053c8344f911187a9f37981e3854c4baa19437a7..9c435c8ae6765dc169ea5543cb11d70341c52e6a 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
@@ -195,8 +216,12 @@ void AliAnalysisTaskDielectronFilter::UserExec(Option_t *)
    fEventStat->Fill(kV0andEvents);
 
   //Fill Event histograms before the event filter
+  AliDielectronHistos *h=fDielectron->GetHistoManager();
+
   Double_t values[AliDielectronVarManager::kNMaxValues]={0};
   Double_t valuesMC[AliDielectronVarManager::kNMaxValues]={0};
+  if(h)  AliDielectronVarManager::SetFillMap(h->GetUsedVars());
+  else   AliDielectronVarManager::SetFillMap(0x0);
   AliDielectronVarManager::SetEvent(InputEvent());
   AliDielectronVarManager::Fill(InputEvent(),values);
   AliDielectronVarManager::Fill(InputEvent(),valuesMC);
@@ -207,13 +232,12 @@ void AliAnalysisTaskDielectronFilter::UserExec(Option_t *)
       AliDielectronVarManager::Fill(AliDielectronMC::Instance()->GetMCEvent(),valuesMC);
   }
 
-  AliDielectronHistos *h=fDielectron->GetHistoManager();
-    if (h){
-      if (h->GetHistogramList()->FindObject("Event_noCuts"))
-        h->FillClass("Event_noCuts",AliDielectronVarManager::kNMaxValues,values);
-      if (hasMC && h->GetHistogramList()->FindObject("MCEvent_noCuts"))
-        h->FillClass("Event_noCuts",AliDielectronVarManager::kNMaxValues,valuesMC);
-    }
+  if (h){
+    if (h->GetHistogramList()->FindObject("Event_noCuts"))
+      h->FillClass("Event_noCuts",AliDielectronVarManager::kNMaxValues,values);
+    if (hasMC && h->GetHistogramList()->FindObject("MCEvent_noCuts"))
+      h->FillClass("Event_noCuts",AliDielectronVarManager::kNMaxValues,valuesMC);
+  }
 
   //event filter
   if (fEventFilter) {
@@ -240,9 +264,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
@@ -259,8 +287,8 @@ void AliAnalysisTaskDielectronFilter::UserExec(Option_t *)
       if(!obj) continue;
       for(int j=0;j<obj->GetEntriesFast();j++){
         AliDielectronPair *pairObj = (AliDielectronPair*)obj->UncheckedAt(j);
-        Int_t id1 = ((AliVTrack*)pairObj->GetFirstDaughter())->GetID();
-        Int_t id2 = ((AliVTrack*)pairObj->GetSecondDaughter())->GetID();
+        Int_t id1 = ((AliVTrack*)pairObj->GetFirstDaughterP())->GetID();
+        Int_t id2 = ((AliVTrack*)pairObj->GetSecondDaughterP())->GetID();
         
         for(Int_t it=0;it<aod->GetNumberOfTracks();it++){
           if(aod->GetTrack(it)->GetID() == id1) pairObj->SetRefFirstDaughter(aod->GetTrack(it)); 
@@ -269,7 +297,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));
@@ -281,19 +308,91 @@ void AliAnalysisTaskDielectronFilter::UserExec(Option_t *)
     if(!t->GetListOfBranches()->GetEntries() && isAOD)
       t->Branch(aod->GetList());
     
-    if (!t->GetBranch("dielectrons")){
+    if (!t->GetBranch("dielectrons"))
       t->Bronch("dielectrons","TObjArray",fDielectron->GetPairArraysPointer());
+      
       // store positive and negative tracks
-      if(fStoreTrackLegs){
-      t->Branch("positiveTracks","TObjArray", (TObjArray*)(fDielectron->GetTrackArray(0)));
-      t->Branch("negativeTracks","TObjArray", (TObjArray*)(fDielectron->GetTrackArray(1)));
-      }
+      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;
 }
 
+