-/**************************************************************************
- * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
+/************************************************************************* * 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. *
#include "AliMCEventHandler.h"
#include "AliMCEvent.h"
+#include "AliPDG.h"
#include "AliTrackReference.h"
#include "AliHeader.h"
#include "AliStack.h"
fTreeTR(0),
fDirK(0),
fDirTR(0),
+ fParticleSelected(0),
+ fLabelMap(0),
fNEvent(-1),
fEvent(-1),
fPathName(new TString("./")),
fExtension(""),
fFileNumber(0),
fEventsPerFile(0),
- fReadTR(kTRUE)
+ fReadTR(kTRUE),
+ fInitOk(kFALSE)
{
- // Default constructor
+ //
+ // Default constructor
+ //
+ // Be sure to add all particles to the PDG database
+ AliPDG::AddParticlesToPdgDataBase();
}
AliMCEventHandler::AliMCEventHandler(const char* name, const char* title) :
fTreeTR(0),
fDirK(0),
fDirTR(0),
+ fParticleSelected(0),
+ fLabelMap(0),
fNEvent(-1),
fEvent(-1),
fPathName(new TString("./")),
fExtension(""),
fFileNumber(0),
- fEventsPerFile(0)
+ fEventsPerFile(0),
+ fReadTR(kTRUE),
+ fInitOk(kFALSE)
{
- // Constructor
+ //
+ // Constructor
+ //
+ // Be sure to add all particles to the PDG database
+ AliPDG::AddParticlesToPdgDataBase();
}
AliMCEventHandler::~AliMCEventHandler()
{
if (!(strcmp(opt, "proof")) || !(strcmp(opt, "local"))) return kTRUE;
//
fFileE = TFile::Open(Form("%sgalice.root", fPathName->Data()));
- if (!fFileE) AliFatal(Form("AliMCEventHandler:galice.root not found in directory %s ! \n", fPathName->Data()));
-
+ if (!fFileE) {
+ AliError(Form("AliMCEventHandler:galice.root not found in directory %s ! \n", fPathName->Data()));
+ fInitOk = kFALSE;
+ return kFALSE;
+ }
+
//
// Tree E
fFileE->GetObject("TE", fTreeE);
//
// Tree K
fFileK = TFile::Open(Form("%sKinematics%s.root", fPathName->Data(), fExtension));
- if (!fFileK) AliFatal(Form("AliMCEventHandler:Kinematics.root not found in directory %s ! \n", fPathName));
+ if (!fFileK) {
+ AliError(Form("AliMCEventHandler:Kinematics.root not found in directory %s ! \n", fPathName));
+ fInitOk = kFALSE;
+ return kTRUE;
+ }
+
fEventsPerFile = fFileK->GetNkeys() - fFileK->GetNProcessIDs();
//
// Tree TR
if (fReadTR) {
- fFileTR = TFile::Open(Form("%sTrackRefs%s.root", fPathName->Data(), fExtension));
- if (!fFileTR) AliWarning(Form("AliMCEventHandler:TrackRefs.root not found in directory %s ! \n", fPathName->Data()));
+ fFileTR = TFile::Open(Form("%sTrackRefs%s.root", fPathName->Data(), fExtension));
+ if (!fFileTR) {
+ AliError(Form("AliMCEventHandler:TrackRefs.root not found in directory %s ! \n", fPathName->Data()));
+ fInitOk = kFALSE;
+ return kTRUE;
+ }
}
//
// Reset the event number
fEvent = -1;
fFileNumber = 0;
- printf("AliMCEvenHandler::Init() %d\n",__LINE__);
- AliInfo(Form("AliMCEventHandler:Number of events in this directory %5d \n", fNEvent));
+ AliInfo(Form("Number of events in this directory %5d \n", fNEvent));
+ fInitOk = kTRUE;
return kTRUE;
}
// Load the event number iev
//
// Calculate the file number
+ if (!fInitOk) return kFALSE;
+
Int_t inew = iev / fEventsPerFile;
if (inew != fFileNumber) {
fFileNumber = inew;
AliWarning(Form("AliMCEventHandler: Event #%5d not found\n", iev));
return kFALSE;
}
+
fDirK ->GetObject("TreeK", fTreeK);
// Connect TreeK to MCEvent
fMCEvent->ConnectTreeK(fTreeK);
Bool_t AliMCEventHandler::OpenFile(Int_t i)
{
// Open file i
- Bool_t ok = kTRUE;
if (i > 0) {
fExtension = Form("%d", i);
} else {
delete fFileK;
fFileK = TFile::Open(Form("%sKinematics%s.root", fPathName->Data(), fExtension));
if (!fFileK) {
- AliFatal(Form("AliMCEventHandler:Kinematics%s.root not found in directory %s ! \n", fExtension, fPathName->Data()));
- ok = kFALSE;
+ AliError(Form("AliMCEventHandler:Kinematics%s.root not found in directory %s ! \n", fExtension, fPathName->Data()));
+ fInitOk = kFALSE;
+ return kFALSE;
}
- delete fFileTR;
- fFileTR = TFile::Open(Form("%sTrackRefs%s.root", fPathName->Data(), fExtension));
- if (!fFileTR) {
- AliWarning(Form("AliMCEventHandler:TrackRefs%s.root not found in directory %s ! \n", fExtension, fPathName->Data()));
- ok = kFALSE;
+ if (fReadTR) {
+ delete fFileTR;
+ fFileTR = TFile::Open(Form("%sTrackRefs%s.root", fPathName->Data(), fExtension));
+ if (!fFileTR) {
+ AliWarning(Form("AliMCEventHandler:TrackRefs%s.root not found in directory %s ! \n", fExtension, fPathName->Data()));
+ fInitOk = kFALSE;
+ return kFALSE;
+ }
}
- return ok;
+ fInitOk = kTRUE;
+ return kTRUE;
}
Bool_t AliMCEventHandler::BeginEvent(Long64_t entry)
{
+ fParticleSelected.Delete();
+ fLabelMap.Delete();
// Read the next event
if (entry == -1) {
fEvent++;
return GetEvent(entry);
}
+void AliMCEventHandler::SelectParticle(Int_t i){
+ // taking the absolute values here, need to take care
+ // of negative daughter and mother
+ // IDs when setting!
+ if(!IsParticleSelected(TMath::Abs(i)))fParticleSelected.Add(TMath::Abs(i),1);
+}
+
+Bool_t AliMCEventHandler::IsParticleSelected(Int_t i) {
+ // taking the absolute values here, need to take
+ // care with negative daughter and mother
+ // IDs when setting!
+ return (fParticleSelected.GetValue(TMath::Abs(i))==1);
+}
+
+
+void AliMCEventHandler::CreateLabelMap(){
+
+ //
+ // this should be called once all selections where done
+ //
+
+ fLabelMap.Delete();
+ if(!fMCEvent){
+ fParticleSelected.Delete();
+ return;
+ }
+
+ VerifySelectedParticles();
+ AliStack *pStack = fMCEvent->Stack();
+
+ Int_t iNew = 0;
+ for(int i = 0;i < pStack->GetNtrack();++i){
+ if(IsParticleSelected(i)){
+ fLabelMap.Add(i,iNew);
+ iNew++;
+ }
+ }
+}
+
+Int_t AliMCEventHandler::GetNewLabel(Int_t i) {
+ // Gets the labe from the new created Map
+ // Call CreatLabelMap before
+ // otherwise only 0 returned
+ return fLabelMap.GetValue(TMath::Abs(i));
+}
+
+void AliMCEventHandler::VerifySelectedParticles(){
+
+ //
+ // Make sure that each particle has at least it's predecessors
+ // selected so that we have the complete ancestry tree
+ // Private, should be only called by CreateLabelMap
+
+ if(!fMCEvent){
+ fParticleSelected.Delete();
+ return;
+ }
+ AliStack *pStack = fMCEvent->Stack();
+
+ Int_t nprim = pStack->GetNprimary();
+
+ for(int i = 0;i < pStack->GetNtrack();++i){
+ if(i<nprim){
+ SelectParticle(i);// take all primaries
+ continue;
+ }
+ if(!IsParticleSelected(i))continue;
+ TParticle *part = pStack->Particle(i);
+ Int_t imo = part->GetFirstMother();
+ while((imo >= nprim)&&!IsParticleSelected(imo)){
+ // Mother not yet selected
+ SelectParticle(imo);
+ TParticle *mother = pStack->Particle(imo);
+ imo = mother->GetFirstMother();
+ }
+ // after last step we may have a unselected primary
+ // mother
+ if(imo>=0){
+ if(!IsParticleSelected(imo))
+ SelectParticle(imo);
+ }
+ }// loop over all tracks
+}
+
Int_t AliMCEventHandler::GetParticleAndTR(Int_t i, TParticle*& particle, TClonesArray*& trefs)
{
// Retrieve entry i
- return (fMCEvent->GetParticleAndTR(i, particle, trefs));
+ if (!fInitOk) {
+ return 0;
+ } else {
+ return (fMCEvent->GetParticleAndTR(i, particle, trefs));
+ }
}
void AliMCEventHandler::DrawCheck(Int_t i, Int_t search)
if(fileName.Contains("AliESDs.root")){
fileName.ReplaceAll("AliESDs.root", "");
}
+ else if(fileName.Contains("AliAOD.root")){
+ fileName.ReplaceAll("AliAOD.root", "");
+ }
else if(fileName.Contains("galice.root")){
// for running with galice and kinematics alone...
fileName.ReplaceAll("galice.root", "");
}
-
+ else if (fileName.BeginsWith("root:")) {
+ fileName.Append("?ZIP=");
+ }
*fPathName = fileName;
- printf("AliMCEventHandler::Notify() Path: %s\n", fPathName->Data());
+ AliInfo(Form("Notify() Path: %s\n", fPathName->Data()));
ResetIO();
InitIO("");
void AliMCEventHandler::ResetIO()
{
// Clear header and stack
- fMCEvent->Clean();
+
+ if (fInitOk) fMCEvent->Clean();
// Delete Tree E
delete fTreeE; fTreeE = 0;
-
+
// Reset files
- if (fFileE) delete fFileE; fFileE = 0;
- if (fFileK) delete fFileK; fFileK = 0;
- if (fFileTR) delete fFileTR; fFileTR = 0;
+ if (fFileE) {delete fFileE; fFileE = 0;}
+ if (fFileK) {delete fFileK; fFileK = 0;}
+ if (fFileTR) {delete fFileTR; fFileTR = 0;}
+ fExtension="";
+ fInitOk = kFALSE;
}
// Clean-up after each event
delete fDirTR; fDirTR = 0;
delete fDirK; fDirK = 0;
- fMCEvent->FinishEvent();
+ if (fInitOk) fMCEvent->FinishEvent();
return kTRUE;
}
}
-void AliMCEventHandler::SetInputPath(char* fname)
+void AliMCEventHandler::SetInputPath(const char* fname)
{
// Set the input path name
delete fPathName;