-/************************************************************************* * 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 "AliMCParticle.h"
#include "AliPDG.h"
#include "AliTrackReference.h"
#include "AliHeader.h"
#include <TTree.h>
#include <TFile.h>
+#include <TList.h>
#include <TParticle.h>
#include <TString.h>
#include <TClonesArray.h>
fFileNumber(0),
fEventsPerFile(0),
fReadTR(kTRUE),
- fInitOk(kFALSE)
+ fInitOk(kFALSE),
+ fSubsidiaryHandlers(0),
+ fEventsInContainer(0),
+ fPreReadMode(kNoPreRead)
{
//
// Default constructor
fFileNumber(0),
fEventsPerFile(0),
fReadTR(kTRUE),
- fInitOk(kFALSE)
+ fInitOk(kFALSE),
+ fSubsidiaryHandlers(0),
+ fEventsInContainer(0),
+ fPreReadMode(kNoPreRead)
{
//
// Constructor
fFileNumber = 0;
AliInfo(Form("Number of events in this directory %5d \n", fNEvent));
fInitOk = kTRUE;
+
+
+ if (fSubsidiaryHandlers) {
+ TIter next(fSubsidiaryHandlers);
+ AliMCEventHandler *handler;
+ while((handler = (AliMCEventHandler*)next())) {
+ handler->Init(opt);
+ handler->SetNumberOfEventsInContainer(fNEvent);
+ }
+ }
+
return kTRUE;
}
// Connect TR to MCEvent
fMCEvent->ConnectTreeTR(fTreeTR);
}
+
//
return kTRUE;
}
}
fInitOk = kTRUE;
+
return kTRUE;
}
fParticleSelected.Delete();
fLabelMap.Delete();
// Read the next event
+
+ if (fEventsInContainer != 0) {
+ entry = (Long64_t) ( entry * Float_t(fNEvent) / Float_t (fEventsInContainer));
+ }
+
+
if (entry == -1) {
fEvent++;
entry = fEvent;
}
if (entry >= fNEvent) {
- AliWarning(Form("AliMCEventHandler: Event number out of range %5d %5d\n", entry,fNEvent));
+ AliWarning(Form("AliMCEventHandler: Event number out of range %5d %5d\n", entry, fNEvent));
return kFALSE;
}
- return GetEvent(entry);
+
+ Bool_t result = GetEvent(entry);
+
+ if (fSubsidiaryHandlers) {
+ TIter next(fSubsidiaryHandlers);
+ AliMCEventHandler *handler;
+ while((handler = (AliMCEventHandler*)next())) {
+ handler->BeginEvent(entry);
+ }
+ next.Reset();
+ while((handler = (AliMCEventHandler*)next())) {
+ fMCEvent->AddSubsidiaryEvent(handler->MCEvent());
+ }
+ fMCEvent->InitEvent();
+ }
+
+ if (fPreReadMode == kLmPreRead) {
+ fMCEvent->PreReadAll();
+ }
+
+ return result;
+
}
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);
+ if (TMath::Abs(i) >= AliMCEvent::BgLabelOffset()) i = fMCEvent->BgLabelToIndex(TMath::Abs(i));
+ if(!IsParticleSelected(TMath::Abs(i)))fParticleSelected.Add(TMath::Abs(i),1);
}
Bool_t AliMCEventHandler::IsParticleSelected(Int_t i) {
}
VerifySelectedParticles();
- AliStack *pStack = fMCEvent->Stack();
Int_t iNew = 0;
- for(int i = 0;i < pStack->GetNtrack();++i){
+ for(int i = 0;i < fMCEvent->GetNumberOfTracks();++i){
if(IsParticleSelected(i)){
fLabelMap.Add(i,iNew);
iNew++;
}
Int_t AliMCEventHandler::GetNewLabel(Int_t i) {
- // Gets the labe from the new created Map
+ // Gets the label from the new created Map
// Call CreatLabelMap before
// otherwise only 0 returned
return fLabelMap.GetValue(TMath::Abs(i));
// Private, should be only called by CreateLabelMap
if(!fMCEvent){
- fParticleSelected.Delete();
- return;
+ 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
+ Int_t nprim = fMCEvent->GetNumberOfPrimaries();
+
+ for(int i = 0;i < fMCEvent->GetNumberOfTracks(); ++i){
+ if(i < nprim){
+ SelectParticle(i);// take all primaries
+ continue;
+ }
+
+ if(!IsParticleSelected(i))continue;
+
+ AliMCParticle* mcpart = (AliMCParticle*) fMCEvent->GetTrack(i);
+ Int_t imo = mcpart->GetMother();
+ while((imo >= nprim)&&!IsParticleSelected(imo)){
+ // Mother not yet selected
+ SelectParticle(imo);
+ mcpart = (AliMCParticle*) fMCEvent->GetTrack(imo);
+ imo = mcpart->GetMother();
+ }
+ // after last step we may have an unselected primary
// mother
if(imo>=0){
if(!IsParticleSelected(imo))
else if (fileName.BeginsWith("root:")) {
fileName.Append("?ZIP=");
}
+
*fPathName = fileName;
- AliInfo(Form("Notify() Path: %s\n", fPathName->Data()));
+ AliInfo(Form("Path: -%s-\n", fPathName->Data()));
ResetIO();
InitIO("");
+// Handle subsidiary handlers
+ if (fSubsidiaryHandlers) {
+ TIter next(fSubsidiaryHandlers);
+ AliMCEventHandler *handler;
+ while((handler = (AliMCEventHandler*) next())) {
+ TString* spath = handler->GetInputPath();
+ if (spath->Contains("merged")) {
+ if (! fPathName->IsNull()) {
+ handler->Notify(Form("%s/../.", fPathName->Data()));
+ } else {
+ handler->Notify("../");
+ }
+ }
+ }
+ }
+
return kTRUE;
}
if (fFileTR) {delete fFileTR; fFileTR = 0;}
fExtension="";
fInitOk = kFALSE;
+
+ if (fSubsidiaryHandlers) {
+ TIter next(fSubsidiaryHandlers);
+ AliMCEventHandler *handler;
+ while((handler = (AliMCEventHandler*)next())) {
+ handler->ResetIO();
+ }
+ }
+
}
delete fDirTR; fDirTR = 0;
delete fDirK; fDirK = 0;
if (fInitOk) fMCEvent->FinishEvent();
+
+ if (fSubsidiaryHandlers) {
+ TIter next(fSubsidiaryHandlers);
+ AliMCEventHandler *handler;
+ while((handler = (AliMCEventHandler*)next())) {
+ handler->FinishEvent();
+ }
+ }
+
return kTRUE;
}
delete fPathName;
fPathName = new TString(fname);
}
+
+void AliMCEventHandler::AddSubsidiaryHandler(AliMCEventHandler* handler)
+{
+ // Add a subsidiary handler. For example for background events
+
+ if (!fSubsidiaryHandlers) fSubsidiaryHandlers = new TList();
+ fSubsidiaryHandlers->Add(handler);
+}