Adding AODMCHeader, new class and in the Filter and Handler
authorkleinb <kleinb@f7af4fe6-9843-0410-8265-dc069ae4e863>
Wed, 22 Oct 2008 13:39:36 +0000 (13:39 +0000)
committerkleinb <kleinb@f7af4fe6-9843-0410-8265-dc069ae4e863>
Wed, 22 Oct 2008 13:39:36 +0000 (13:39 +0000)
ANALYSIS/AliAnalysisTaskMCParticleFilter.cxx
ANALYSIS/runAODFilterMC.C
STEER/AODLinkDef.h
STEER/AliAODHandler.cxx
STEER/AliAODHandler.h
STEER/AliAODMCHeader.cxx [new file with mode: 0644]
STEER/AliAODMCHeader.h [new file with mode: 0644]
STEER/CMake_libAOD.txt
STEER/libAOD.pkg

index 89afc31..b20a234 100644 (file)
@@ -32,6 +32,7 @@
 #include "AliMCEventHandler.h"
 #include "AliAODEvent.h"
 #include "AliAODHeader.h"
+#include "AliAODMCHeader.h"
 #include "AliAODHandler.h"
 #include "AliAODVertex.h"
 #include "AliAODMCParticle.h"
@@ -101,18 +102,29 @@ void AliAnalysisTaskMCParticleFilter::UserCreateOutputObjects()
 
     // the branch booking can also go into the AODHandler then
 
+
+    // mcparticles
     TClonesArray *tca = new TClonesArray("AliAODMCParticle", 0);
     tca->SetName(AliAODMCParticle::StdBranchName());
     AddAODBranch("TClonesArray",&tca);
-    AliMCEventHandler *mcH = (AliMCEventHandler*) ((AliAnalysisManager::GetAnalysisManager())->GetMCtruthEventHandler()); 
 
+    // MC header...
+    AliAODMCHeader *mcHeader = new AliAODMCHeader();
+    Printf("AODMCHeader %p",mcHeader);
+    Printf("AODMCHeader ** %p",&mcHeader);
+    mcHeader->SetName(AliAODMCHeader::StdBranchName());
+    AddAODBranch("AliAODMCHeader",&mcHeader);    
+
+    
+
+    AliMCEventHandler *mcH = (AliMCEventHandler*) ((AliAnalysisManager::GetAnalysisManager())->GetMCtruthEventHandler()); 
     AliAODHandler *aodH = dynamic_cast<AliAODHandler*> ((AliAnalysisManager::GetAnalysisManager())->GetOutputEventHandler());
     if(!aodH){
       Printf("%s:&d Could not get AODHandler",(char*)__FILE__,__LINE__);
       return;
     }
     aodH->SetMCEventHandler(mcH);
-    // TODO ADD MC VERTEX
+
     
 }
 
@@ -174,7 +186,6 @@ void AliAnalysisTaskMCParticleFilter::UserExec(Option_t */*option*/)
     Bool_t write = kFALSE;
     Int_t flag = 0;
 
-
     if (ip < nprim) {
       // Select the primary event
       write = kTRUE;
index 091470e..b7e656d 100644 (file)
@@ -8,8 +8,10 @@ void runAODFilterMC()
       gSystem->Load("libVMC.so");
 
       bool bKineFilter = true;
-
+      //      TProof::Mgr("alicecaf")->SetROOTVersion("v5-21-01-alice_dbg");
       TProof::Open("alicecaf");
+      //      gProof->SetParallel(1);
+
       char *dataset = "/COMMON/COMMON/LHC08c11_10TeV_0.5T";
       //      char *dataset = "/PWG4/kleinb/LHC08q_jetjet100";
       // gProof->ClearPackages();
index e0da201..d99e2f0 100644 (file)
@@ -39,6 +39,8 @@
 #pragma link C++ class AliAODCaloCells+;
 #pragma link C++ class AliAODDiJet+;
 #pragma link C++ class AliAODMCParticle+;
+#pragma link C++ class AliAODMCHeader+;
+
 #endif
 
 
index 87d78d1..45bf43b 100644 (file)
@@ -24,7 +24,7 @@
 #include <TTree.h>
 #include <TFile.h>
 #include <TString.h>
-#include <TExMap.h>
+#include <TList.h>
 
 #include "AliLog.h"
 #include "AliAODHandler.h"
 #include "AliAODTracklets.h"
 #include "AliStack.h"
 #include "AliAODMCParticle.h"
+#include "AliAODMCHeader.h"
 #include "AliMCEventHandler.h"
 #include "AliMCEvent.h"
+#include "AliGenEventHeader.h"
+#include "AliGenHijingEventHeader.h"
+#include "AliGenDPMjetEventHeader.h"
+#include "AliGenPythiaEventHeader.h"
+#include "AliGenCocktailEventHeader.h"
+
+
 
 ClassImp(AliAODHandler)
 
@@ -133,7 +141,7 @@ Bool_t AliAODHandler::Init(Option_t* opt)
 
 
 void AliAODHandler::StoreMCParticles(){
-  
+
   // 
   // Remap the labels from ESD stack and store
   // the AODMCParticles, makes only sense if we have
@@ -144,11 +152,22 @@ void AliAODHandler::StoreMCParticles(){
   // Particles have been selected by AliMCEventhanlder->SelectParticle()
   // To use the MCEventhandler here we need to set it from the outside
   // can vanish when Handler go to the ANALYSISalice library
+  //
+  // The Branch booking for mcParticles and mcHeader has to happen 
+  // in an external task for now since the AODHandler does not have access
+  // the AnalysisManager. For the same reason the pointer t o the MCEventH
+  // has to passed to the AOD Handler by this task 
+  // (doing this in the steering macro would not work on PROOF)
 
   TClonesArray *mcarray = (TClonesArray*)fAODEvent->FindListObject(AliAODMCParticle::StdBranchName()); 
   if(!mcarray)return;
   mcarray->Delete();
 
+  AliAODMCHeader *mcHeader = (AliAODMCHeader*)fAODEvent->FindListObject(AliAODMCHeader::StdBranchName()); 
+  if(!mcHeader)return;
+
+  mcHeader->Reset();
+
   // Get the MC Infos.. Handler needs to be set before 
   // while adding the branch
   // This needs to be done, not to depend on the AnalysisManager
@@ -160,7 +179,41 @@ void AliAODHandler::StoreMCParticles(){
 
   fMCEventH->CreateLabelMap();
 
-  // First store the AliAODParticlesMC
+  //
+  // Get the Event Header 
+  // 
+
+  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);
+  }
+
+
+
+
+  // Store the AliAODParticlesMC
 
   Int_t np    = pStack->GetNtrack();
   Int_t nprim = pStack->GetNprimary();
@@ -350,7 +403,7 @@ void AliAODHandler::FillTree()
 //______________________________________________________________________________
 void AliAODHandler::AddAODtoTreeUserInfo()
 {
-    // Add aod event to tree user info
+  // Add aod event to tree user info
   fTreeA->GetUserInfo()->Add(fAODEvent);
 }
 
@@ -360,12 +413,24 @@ void AliAODHandler::AddBranch(const char* cname, void* addobj)
     // Add a new branch to the aod 
     TDirectory *owd = gDirectory;
     if (fFileA) {
-       fFileA->cd();
+      fFileA->cd();
     }
     char** apointer = (char**) addobj;
     TObject* obj = (TObject*) *apointer;
-    fTreeA->Branch(obj->GetName(), cname, addobj);
+
     fAODEvent->AddObject(obj);
+    const Int_t kSplitlevel = 99; // default value in TTree::Branch()
+    const Int_t kBufsize = 32000; // default value in TTree::Branch()
+
+    if (!fTreeA->FindBranch(obj->GetName())) {
+      // Do the same as if we book via 
+      // TTree::Branch(TCollection*)
+      
+      fTreeA->Bronch(obj->GetName(), cname, fAODEvent->GetList()->GetObjectRef(obj),
+                    kBufsize, kSplitlevel - 1);
+      //    fTreeA->Branch(obj->GetName(), cname, addobj);
+    }
     owd->cd();
 }
 
@@ -382,3 +447,41 @@ const char *AliAODHandler::GetOutputFileName()
 // Get file name.
    return fFileName.Data();
 }
+
+void  AliAODHandler::SetMCHeaderInfo(AliAODMCHeader *mcHeader,AliGenEventHeader *genHeader){
+
+
+  // Utility function to cover different cases for the AliGenEventHeader
+  // Needed since different ProcessType and ImpactParamter are not 
+  // in the base class...
+  // We don't encode process types for event cocktails yet
+  // coul be done e.g. by adding offsets depnding on the generator
+
+
+  mcHeader->AddGeneratorName(genHeader->GetName());
+
+
+
+  if(!genHeader)return;
+  AliGenPythiaEventHeader *pythiaGenHeader = dynamic_cast<AliGenPythiaEventHeader*>(genHeader);
+    if (pythiaGenHeader) {
+      mcHeader->SetEventType(pythiaGenHeader->ProcessType());
+      return;
+    }
+    
+    AliGenDPMjetEventHeader* dpmJetGenHeader = dynamic_cast<AliGenDPMjetEventHeader*>(genHeader);
+
+  if (dpmJetGenHeader){
+    mcHeader->SetEventType(dpmJetGenHeader->ProcessType());
+    return;
+  } 
+
+  AliGenHijingEventHeader* hijingGenHeader = dynamic_cast<AliGenHijingEventHeader*>(genHeader);
+  if(hijingGenHeader){
+    mcHeader->SetImpactParameter(hijingGenHeader->ImpactParameter());
+    return;
+  }
+  
+  AliWarning(Form("MC Eventheader not known: %s",genHeader->GetName()));
+
+}
index a36a4a8..b2fcc36 100644 (file)
@@ -16,6 +16,8 @@ class AliAODEvent;
 class TFile;
 class TTree;
 class AliMCEventHandler;
+class AliAODMCHeader;
+class AliGenEventHeader;
 
 
 
@@ -72,6 +74,7 @@ class AliAODHandler : public AliVEventHandler {
     void                 SetMCEventHandler(AliMCEventHandler* mcH) {fMCEventH = mcH;} // For internal use
  private:
     void StoreMCParticles();
+    void SetMCHeaderInfo(AliAODMCHeader *mcHeader,AliGenEventHeader *genHeader); // Utility function t catch different types of eventheaders
     AliAODHandler(const AliAODHandler&);             // Not implemented
     AliAODHandler& operator=(const AliAODHandler&);  // Not implemented
  private:
diff --git a/STEER/AliAODMCHeader.cxx b/STEER/AliAODMCHeader.cxx
new file mode 100644 (file)
index 0000000..1e88a33
--- /dev/null
@@ -0,0 +1,112 @@
+/**************************************************************************
+ * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
+ *                                                                        *
+ * Author: The ALICE Off-line Project.                                    *
+ * Contributors are mentioned in the code where appropriate.              *
+ *                                                                        *
+ * Permission to use, copy, modify and distribute this software and its   *
+ * documentation strictly for non-commercial purposes is hereby granted   *
+ * without fee, provided that the above copyright notice appears in all   *
+ * copies and that both the copyright notice and this permission notice   *
+ * appear in the supporting documentation. The authors make no claims     *
+ * about the suitability of this software for any purpose. It is          *
+ * provided "as is" without express or implied warranty.                  *
+ **************************************************************************/
+
+//-------------------------------------------------------------------------
+//                      Implementation of   Class AliAODMCHeader
+//   Header data
+//   for the ESD   
+//   Origin: Christian Klein-Boesing, CERN, Christian.Klein-Boesing@cern.ch 
+//-------------------------------------------------------------------------
+
+#include "AliAODMCHeader.h"
+
+
+ClassImp(AliAODMCHeader)
+
+// Without a trailing dot root does not support
+// direct drawing of some variables if the name is not unique on top label
+// bnrach e.g. fEventType is found here and in AliAODHeader....
+TString AliAODMCHeader::fgkStdBranchName("mcHeader");
+
+//______________________________________________________________________________
+AliAODMCHeader::AliAODMCHeader() :
+  AliVHeader()
+  ,fGenerator("")
+  ,fImpactPar(0)
+  ,fEventType(0)
+{
+  // default constructor
+  fVertex[0] = fVertex[1] = fVertex[2] = 0;  
+  SetName(fgkStdBranchName.Data());
+}
+
+
+AliAODMCHeader::~AliAODMCHeader() 
+{
+  // destructor
+}
+
+
+AliAODMCHeader::AliAODMCHeader(const AliAODMCHeader &header) :
+  AliVHeader(header)
+  ,fGenerator(header.fGenerator)
+  ,fImpactPar(header.fImpactPar)
+  ,fEventType(header.fEventType)
+{
+  // copy constructor
+  for(int i = 0;i<3;++i)fVertex[i] = header.fVertex[i];
+  SetName(header.fName);
+  SetTitle(header.fTitle);
+}
+
+AliAODMCHeader& AliAODMCHeader::operator=(const AliAODMCHeader &header)
+{ 
+  // assigment operator
+  if(this!=&header) {
+    AliVHeader::operator=(header);
+    fGenerator = header.fGenerator;
+    for(int i = 0;i<3;++i)fVertex[i] = header.fVertex[i];
+    fImpactPar = header.fImpactPar;
+    fEventType = header.fEventType;
+  } 
+  return *this;
+}
+
+void AliAODMCHeader::Copy(TObject &obj) const {
+  
+  // this overwrites the virtual TOBject::Copy()
+  // to allow run time copying without casting
+  // in AliESDEvent
+
+  if(this==&obj)return;
+  AliAODMCHeader *robj = dynamic_cast<AliAODMCHeader*>(&obj);
+  if(!robj)return; // not an AliAODMCHeader
+  *robj = *this;
+
+}
+
+
+
+//______________________________________________________________________________
+void AliAODMCHeader::Reset()
+{
+  // reset all data members
+  fGenerator = "";
+  fImpactPar = 0;
+  fEventType = 0;
+  fVertex[0] = fVertex[1] = fVertex[2] = 0;  
+}
+
+//______________________________________________________________________________
+void AliAODMCHeader::Print(const Option_t *) const
+{
+  // Print some data members
+  Printf("MC EventHeader Generator: %s # EventType %d  Vtx = (%3.3f,%3.3f,%3.3f) Impactparameter %3.3f  \n",
+        GetGeneratorName(),
+        GetEventType(),
+        GetVtxX(),GetVtxY(),GetVtxZ(),
+        GetImpactParameter());
+}
+
diff --git a/STEER/AliAODMCHeader.h b/STEER/AliAODMCHeader.h
new file mode 100644 (file)
index 0000000..c4c675a
--- /dev/null
@@ -0,0 +1,76 @@
+// -*- mode: C++ -*- 
+#ifndef ALIAODMCHEADER_H
+#define ALIAODMCHEADER_H
+
+/* Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
+ * See cxx source for full Copyright notice                               */
+
+//-------------------------------------------------------------------------
+//                      Class AliAODMCHeader
+//   Some MC specific inforamtion for filtering KINE infomration to the AOD   
+//   Origin: Christian Klein-Boesing, CERN, Christian.Klein-Boesing@cern.ch 
+//-------------------------------------------------------------------------
+
+#include "AliVHeader.h"
+
+class AliAODMCHeader: public AliVHeader {
+public:
+  AliAODMCHeader();
+  virtual ~AliAODMCHeader();
+  AliAODMCHeader(const AliAODMCHeader& header);
+  AliAODMCHeader& operator=(const AliAODMCHeader& header);
+  virtual void Copy(TObject &obj) const;
+
+  virtual void      SetGeneratorName(const char* c){fGenerator = c;}
+  virtual void      AddGeneratorName(const char* c){fGenerator += c;}
+  virtual const char* GetGeneratorName() const {return fGenerator.Data();}
+
+  virtual void SetVertex(Double_t *vtx){
+    fVertex[0] = vtx[0]; fVertex[1] = vtx[1]; fVertex[2] = vtx[2];
+  }
+  virtual void SetVertex(Double_t x,Double_t y,Double_t z){
+    fVertex[0] = x; fVertex[1] = y; fVertex[2] = z;
+  }
+  virtual void GetVertex(Double_t *vtx) const {
+    vtx[0] = fVertex[0]; vtx[1] = fVertex[1]; vtx[2] = fVertex[2];
+  }
+
+  virtual Double_t GetVtxX() const { return fVertex[0]; }
+  virtual Double_t GetVtxY() const { return fVertex[1]; }
+  virtual Double_t GetVtxZ() const { return fVertex[2]; }
+
+  
+  virtual void      SetImpactParameter(Double_t b){fImpactPar = b;}
+  virtual Double_t  GetImpactParameter() const {return fImpactPar;}
+
+  virtual void      SetEventType(UInt_t eventType){fEventType = eventType;}
+  virtual UInt_t    GetEventType() const {return fEventType;}
+
+  virtual void      Reset();
+  virtual void      Print(const Option_t *opt=0) const;
+
+  // needed to make class non virtual
+  virtual UShort_t  GetBunchCrossNumber()   const {return 0;}
+  virtual UInt_t    GetOrbitNumber()        const {return 0;}
+  virtual UInt_t    GetPeriodNumber()       const {return 0;}
+  virtual ULong64_t GetTriggerMask()        const {return 0;}
+  virtual UChar_t   GetTriggerCluster()     const {return 0;}
+  // 
+  
+  static const char* StdBranchName(){return fgkStdBranchName.Data();}
+
+private:
+
+  static TString fgkStdBranchName;      // Standard branch name
+
+  TString      fGenerator;         // Name of the generator, combination of names in case of gen cocktail 
+  Double32_t   fVertex[3];         // MC vertex
+  Double32_t   fImpactPar;         // Impact parameter in case of Pb+Pb
+  UInt_t       fEventType;         // MC Process Type of Event
+
+  
+  ClassDef(AliAODMCHeader,1)
+
+};
+
+#endif
index 56f42f6..831eef3 100644 (file)
@@ -7,7 +7,7 @@ set(SRCS
        AliAODJet.cxx AliAODPhoton.cxx AliAODRedCov.cxx AliAODRecoDecay.cxx 
        AliAODHandler.cxx AliAODTracklets.cxx AliAODTagCreator.cxx 
        AliAODv0.cxx AliAODcascade.cxx AliAODCaloCells.cxx AliAODInputHandler.cxx 
-       AliMultiAODInputHandler.cxx AliAODDiJet.cxx AliAODMCParticle.cxx
+       AliMultiAODInputHandler.cxx AliAODDiJet.cxx AliAODMCParticle.cxx AliAODMCHeader.cxx 
 )
 
 # fill list of header files from list of source files
index ab1ae58..8a1b1d7 100644 (file)
@@ -6,7 +6,7 @@ SRCS = AliAODEvent.cxx AliAODHeader.cxx \
        AliAODJet.cxx AliAODPhoton.cxx AliAODRedCov.cxx AliAODRecoDecay.cxx \
        AliAODHandler.cxx AliAODTracklets.cxx AliAODTagCreator.cxx \
        AliAODv0.cxx AliAODcascade.cxx AliAODCaloCells.cxx AliAODInputHandler.cxx \
-       AliMultiAODInputHandler.cxx AliAODDiJet.cxx AliAODMCParticle.cxx
+       AliMultiAODInputHandler.cxx AliAODDiJet.cxx AliAODMCParticle.cxx AliAODMCHeader.cxx
 
 HDRS:= $(SRCS:.cxx=.h)