#include <TFile.h>
#include <TChain.h>
-#include <TEntryList.h>
#include <TChainElement.h>
#include <TSystem.h>
fUseDefautProcess(kFALSE),
fDoMixExtra(kTRUE),
fDoMixIfNotEnoughEvents(kTRUE),
+ fDoMixEventGetEntryAuto(kTRUE),
fCurrentEntry(0),
fCurrentEntryMain(0),
fCurrentEntryMix(0),
fCurrentBinIndex(-1),
- fOfflineTriggerMask(0)
+ fOfflineTriggerMask(0),
+ fCurrentMixEntry(),
+ fCurrentEntryMainTree(0)
{
//
// Default constructor.
return kFALSE;
}
- if (!fDoMixIfNotEnoughEvents) {
+ if (!fDoMixIfNotEnoughEvents&&fDoMixExtra) {
fDoMixExtra = kFALSE;
- AliWarning("fDoMixIfNotEnoughEvents=kTRUE -> setting fDoMixExtra=kFALSE");
+ AliWarning("fDoMixIfNotEnoughEvents=kFALSE -> setting fDoMixExtra=kFALSE");
}
// clears array of input handlers
for (Int_t i = 0; i < fInputHandlers.GetEntries(); i++) {
ih = (AliInputEventHandler *) fInputHandlers.At(i);
ih->SetParentHandler(this);
-// ih->Init(tree,opt);
}
AliDebug(AliLog::kDebug + 5, Form("->"));
for (Int_t i = 0; i < fInputHandlers.GetEntries(); i++) {
AliDebug(AliLog::kDebug + 5, Form("fInputHandlers[%d]", i));
mixIHI = new AliMixInputHandlerInfo(fMixIntupHandlerInfoTmp->GetName(), fMixIntupHandlerInfoTmp->GetTitle());
-// mixIHI->PrepareEntry(che, -1, (AliInputEventHandler *)InputEventHandler(i), fAnalysisType);
if (doPrepareEntry) mixIHI->PrepareEntry(che, -1, (AliInputEventHandler *)InputEventHandler(i), fAnalysisType);
AliDebug(AliLog::kDebug + 5, Form("chain[%d]->GetEntries() = %lld", i, mixIHI->GetChain()->GetEntries()));
fMixTrees.Add(mixIHI);
//
// BeginEvent(Long64_t entry) is called for all mix input handlers
//
+ fCurrentEntryMainTree = entry;
+
AliDebug(AliLog::kDebug + 5, Form("-> %lld", entry));
if (fUseDefautProcess) {
AliDebug(AliLog::kDebug, Form("-> SKIPPED"));
if (!te) {
AliError("te is null. this is error. tell to developer (#1)");
} else {
- mihi->PrepareEntry(te, entryMix, (AliInputEventHandler *)InputEventHandler(0), fAnalysisType);
+ if (fDoMixEventGetEntryAuto) mihi->PrepareEntry(te, entryMix, (AliInputEventHandler *)InputEventHandler(0), fAnalysisType);
// runs UserExecMix for all tasks
fNumberMixed++;
UserExecMixAllTasks(fEntryCounter, 1, fEntryCounter, entryMixReal, fNumberMixed);
// check for PhysSelection
if (!IsEventCurrentSelected()) return kFALSE;
+ fCurrentMixEntry.Reset();
+
// find out zero chain entries
Long64_t zeroChainEntries = fMixIntupHandlerInfoTmp->GetChain()->GetEntries() - inEvHMain->GetTree()->GetTree()->GetEntries();
// fill entry
return kTRUE;
}
}
+
AliMixInputHandlerInfo *mihi = 0;
Long64_t entryMix = 0, entryMixReal = 0;
Int_t counter = 0;
if (!te) {
AliError("te is null. this is error. tell to developer (#1)");
} else {
+ fCurrentMixEntry.Enter(entryMixReal);
AliDebug(AliLog::kDebug + 3, Form("Preparing InputEventHandler(%d)", counter));
- mihi->PrepareEntry(te, entryMix, (AliInputEventHandler *)InputEventHandler(counter), fAnalysisType);
+ if (fDoMixEventGetEntryAuto) mihi->PrepareEntry(te, entryMix, (AliInputEventHandler *)InputEventHandler(counter), fAnalysisType);
fNumberMixed++;
}
counter++;
// runs UserExecMix for all tasks
UserExecMixAllTasks(fEntryCounter, idEntryList, fEntryCounter, entryMixReal, counter);
}
-
+
AliDebug(AliLog::kDebug + 3, Form("fEntryCounter=%lld fMixEventNumber=%d", fEntryCounter, fNumberMixed));
AliDebug(AliLog::kDebug + 3, Form("++++++++++++++ END SETUP EVENT %lld +++++++++++++++++++", fEntryCounter));
AliDebug(AliLog::kDebug + 5, Form("->"));
// check for PhysSelection
if (!IsEventCurrentSelected()) return kFALSE;
+ fCurrentMixEntry.Reset();
+
// find out zero chain entries
Long64_t zeroChainEntries = fMixIntupHandlerInfoTmp->GetChain()->GetEntries() - inEvHMain->GetTree()->GetTree()->GetEntries();
// fill entry
mihi = (AliMixInputHandlerInfo *) fMixTrees.At(0);
// fills num for main events
for (counter = 0; counter < mixNum; counter++) {
+ fCurrentMixEntry.Reset();
Long64_t entryInEntryList = elNum - 2 - counter;
AliDebug(AliLog::kDebug + 3, Form("entryInEntryList=%lld", entryInEntryList));
if (entryInEntryList < 0) break;
if (!te) {
AliError("te is null. this is error. tell to developer (#2)");
} else {
- mihi->PrepareEntry(te, entryMix, (AliInputEventHandler *)InputEventHandler(0), fAnalysisType);
+ fCurrentMixEntry.Enter(entryMixReal);
+ if (fDoMixEventGetEntryAuto) mihi->PrepareEntry(te, entryMix, (AliInputEventHandler *)InputEventHandler(0), fAnalysisType);
// runs UserExecMix for all tasks
fNumberMixed++;
UserExecMixAllTasks(fEntryCounter, idEntryList, currentMainEntry, entryMixReal, fNumberMixed);
//
// Check if event is selected by Physics selection
//
-
+
AliDebug(AliLog::kDebug + 5, Form("<-"));
Bool_t isSelected = kTRUE;
if (fOfflineTriggerMask && fOfflineTriggerMask != AliVEvent::kAny) {
AliDebug(AliLog::kDebug + 5, Form("-> %d", isSelected));
return isSelected;
}
+
+//_____________________________________________________________________________
+Bool_t AliMixInputEventHandler::GetEntryMainEvent() {
+ //
+ // Calling GetEntry for main event in input handler (Should be used in UserExecMix() only)
+ //
+
+ AliInputEventHandler *ih = ((AliMultiInputEventHandler *)ParentHandler())->GetFirstInputEventHandler();
+ ih->GetTree()->GetEntry(fCurrentEntryMainTree);
+ return kTRUE;
+}
+
+//_____________________________________________________________________________
+Bool_t AliMixInputEventHandler::GetEntryMixedEvent(Int_t id) {
+ //
+ // Calling GetEntry for mixed event in input handler with id
+ // (Should be used in UserExecMix() only)
+ //
+
+ AliMixInputHandlerInfo *mihi = (AliMixInputHandlerInfo *) fMixTrees.At(id);
+
+ Long64_t entryMix = fCurrentMixEntry.GetEntry(fCurrentMixEntry.GetN()-id-1);
+ if(entryMix<0) {
+ AliError(Form("GetEntryMixedEvent(%d) => entryMix<0 [1]",id));
+ return kFALSE;
+ }
+ TChainElement *te = fMixIntupHandlerInfoTmp->GetEntryInTree(entryMix);
+ if (!te) {
+ AliError("te is null. this is error. tell to developer (#3)");
+ return kFALSE;
+ }
+ if(entryMix<0) {
+ AliError(Form("GetEntryMixedEvent(%d) => entryMix<0 [2]",id));
+ return kFALSE;
+ }
+ mihi->PrepareEntry(te, entryMix, (AliInputEventHandler *)InputEventHandler(id), fAnalysisType);
+
+ return kTRUE;
+}
#define ALIMIXINPUTEVENTHANDLER_H
#include <TObjArray.h>
+#include <TEntryList.h>
#include <TArrayI.h>
#include <AliVEvent.h>
#include "AliMultiInputEventHandler.h"
class TChain;
+class TChainElement;
class AliMixEventPool;
class AliMixInputHandlerInfo;
class AliInputEventHandler;
Bool_t IsEventCurrentSelected();
Bool_t IsMixingIfNotEnoughEvents() { return fDoMixIfNotEnoughEvents;}
+ void DoMixEventGetEntryAuto(Bool_t doAuto=kTRUE) { fDoMixEventGetEntryAuto = doAuto; }
+
+ Bool_t GetEntryMainEvent();
+ Bool_t GetEntryMixedEvent(Int_t idHandler=0);
protected:
TObjArray fMixTrees; // buffer of input handlers
Bool_t fUseDefautProcess; // use default process
Bool_t fDoMixExtra; // mix extra events to get enough combinations
- Bool_t fDoMixIfNotEnoughEvents;// mix events if they dont have enough events to mix
+ Bool_t fDoMixIfNotEnoughEvents;// mix events if they don't have enough events to mix
+ Bool_t fDoMixEventGetEntryAuto;// flag for preparing mixed events automatically (default on)
// mixing info
Long64_t fCurrentEntry; //! current entry number (adds 1 for every event processed on each worker)
Long64_t fCurrentEntryMain; //! current entry in chain of processed files
Long64_t fCurrentEntryMix; //! current mixed entry in chain of processed files
Int_t fCurrentBinIndex; //! current bin index
-
ULong64_t fOfflineTriggerMask; // Task processes collision candidates only
+ TEntryList fCurrentMixEntry; //! array of mix entries currently used (user should touch)
+ Long64_t fCurrentEntryMainTree; //! current entry in current tree (main event)
+
virtual Bool_t MixStd();
virtual Bool_t MixBuffer();
virtual Bool_t MixEventsMoreTimesWithOneEvent();
AliMixInputEventHandler(const AliMixInputEventHandler &handler);
AliMixInputEventHandler &operator=(const AliMixInputEventHandler &handler);
- ClassDef(AliMixInputEventHandler, 4)
+ ClassDef(AliMixInputEventHandler, 5)
};
#endif