ROOT logo
//
// Class AliMixEventInputHandler
//
// Mixing input handler prepare N events before UserExec
// TODO example
// author:
//        Martin Vala (martin.vala@cern.ch)
//

#ifndef ALIMIXINPUTEVENTHANDLER_H
#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;
class AliMixInputEventHandler : public AliMultiInputEventHandler {

public:
   AliMixInputEventHandler(const Int_t size = 1, const Int_t mixNum = 1);
   virtual ~AliMixInputEventHandler();
   // From the interface
   virtual Bool_t  Init(Option_t *opt) { return AliMultiInputEventHandler::Init(opt); }
   virtual Bool_t  Init(TTree *tree, Option_t *opt);
   virtual Bool_t  Notify();
   virtual Bool_t  Notify(const char *path);
   virtual Bool_t  BeginEvent(Long64_t entry);
   virtual Bool_t  GetEntry();
   virtual Bool_t  FinishEvent();

   // removing default impementation
   virtual void            AddInputEventHandler(AliVEventHandler */*inHandler*/);

   void                    SetInputHandlerForMixing(const AliInputEventHandler *const inHandler);
   void                    SetEventPool(AliMixEventPool *const evPool) { fEventPool = evPool; }

   AliMixEventPool        *GetEventPool() const { return fEventPool; }
   Int_t                   BufferSize() const { return fBufferSize; }
   Int_t                   NumberMixedTimes() const { return fNumberMixed; }
   Int_t                   MixNumber() const { return fMixNumber; }
   Long64_t                EntryAll() const { return fEntryCounter; }
   void                    UseDefaultProcess(Bool_t b = kTRUE) { fUseDefautProcess = b; }
   void                    DoMixExtra(Bool_t b = kTRUE) { fDoMixExtra = b; }
   void                    DoMixIfNotEnoughEvents(Bool_t b = kTRUE) { fDoMixIfNotEnoughEvents = b; }
   void                    SetMixNumber(const Int_t mixNum);

   void                    SetCurrentBinIndex(Int_t const index) { fCurrentBinIndex = index; }
   void                    SetCurrentEntry(Long64_t const entry) { fCurrentEntry = entry ; }
   void                    SetCurrentEntryMain(Long64_t const entry) { fCurrentEntryMain = entry ; }
   void                    SetCurrentEntryMix(Long64_t const entry) { fCurrentEntryMix = entry ; }
   void                    SetNumberMixed(Int_t const index) { fNumberMixed = index; }

   Int_t                   CurrentBinIndex() const { return fCurrentBinIndex; }
   Long64_t                CurrentEntry() const { return fCurrentEntry; }
   Long64_t                CurrentEntryMain() const { return fCurrentEntryMain; }
   Long64_t                CurrentEntryMix() const { return fCurrentEntryMix; }
   Int_t                   NumberMixed() const { return fNumberMixed; }

   void                    SelectCollisionCandidates(UInt_t offlineTriggerMask = AliVEvent::kMB) {fOfflineTriggerMask = offlineTriggerMask;}
   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
   TArrayI                 fTreeMap;               // tree map
   AliMixInputHandlerInfo *fMixIntupHandlerInfoTmp;//! mix input handler info full chain
   Long64_t                fEntryCounter;          // entry counter
   AliMixEventPool        *fEventPool;             // event pool
   Int_t                   fNumberMixed;           // number of mixed events with current event
   Int_t                   fMixNumber;             // user's mix number request

private:

   Bool_t                  fUseDefautProcess;      // use default process
   Bool_t                  fDoMixExtra;            // mix extra events to get enough combinations
   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();
   virtual Bool_t          MixEventsMoreTimesWithBuffer();

   void                    UserExecMixAllTasks(Long64_t entryCounter, Int_t idEntryList, Long64_t entryMainReal, Long64_t entryMixReal, Int_t numMixed);

   AliMixInputEventHandler(const AliMixInputEventHandler &handler);
   AliMixInputEventHandler &operator=(const AliMixInputEventHandler &handler);

   ClassDef(AliMixInputEventHandler, 5)
};

#endif
 AliMixInputEventHandler.h:1
 AliMixInputEventHandler.h:2
 AliMixInputEventHandler.h:3
 AliMixInputEventHandler.h:4
 AliMixInputEventHandler.h:5
 AliMixInputEventHandler.h:6
 AliMixInputEventHandler.h:7
 AliMixInputEventHandler.h:8
 AliMixInputEventHandler.h:9
 AliMixInputEventHandler.h:10
 AliMixInputEventHandler.h:11
 AliMixInputEventHandler.h:12
 AliMixInputEventHandler.h:13
 AliMixInputEventHandler.h:14
 AliMixInputEventHandler.h:15
 AliMixInputEventHandler.h:16
 AliMixInputEventHandler.h:17
 AliMixInputEventHandler.h:18
 AliMixInputEventHandler.h:19
 AliMixInputEventHandler.h:20
 AliMixInputEventHandler.h:21
 AliMixInputEventHandler.h:22
 AliMixInputEventHandler.h:23
 AliMixInputEventHandler.h:24
 AliMixInputEventHandler.h:25
 AliMixInputEventHandler.h:26
 AliMixInputEventHandler.h:27
 AliMixInputEventHandler.h:28
 AliMixInputEventHandler.h:29
 AliMixInputEventHandler.h:30
 AliMixInputEventHandler.h:31
 AliMixInputEventHandler.h:32
 AliMixInputEventHandler.h:33
 AliMixInputEventHandler.h:34
 AliMixInputEventHandler.h:35
 AliMixInputEventHandler.h:36
 AliMixInputEventHandler.h:37
 AliMixInputEventHandler.h:38
 AliMixInputEventHandler.h:39
 AliMixInputEventHandler.h:40
 AliMixInputEventHandler.h:41
 AliMixInputEventHandler.h:42
 AliMixInputEventHandler.h:43
 AliMixInputEventHandler.h:44
 AliMixInputEventHandler.h:45
 AliMixInputEventHandler.h:46
 AliMixInputEventHandler.h:47
 AliMixInputEventHandler.h:48
 AliMixInputEventHandler.h:49
 AliMixInputEventHandler.h:50
 AliMixInputEventHandler.h:51
 AliMixInputEventHandler.h:52
 AliMixInputEventHandler.h:53
 AliMixInputEventHandler.h:54
 AliMixInputEventHandler.h:55
 AliMixInputEventHandler.h:56
 AliMixInputEventHandler.h:57
 AliMixInputEventHandler.h:58
 AliMixInputEventHandler.h:59
 AliMixInputEventHandler.h:60
 AliMixInputEventHandler.h:61
 AliMixInputEventHandler.h:62
 AliMixInputEventHandler.h:63
 AliMixInputEventHandler.h:64
 AliMixInputEventHandler.h:65
 AliMixInputEventHandler.h:66
 AliMixInputEventHandler.h:67
 AliMixInputEventHandler.h:68
 AliMixInputEventHandler.h:69
 AliMixInputEventHandler.h:70
 AliMixInputEventHandler.h:71
 AliMixInputEventHandler.h:72
 AliMixInputEventHandler.h:73
 AliMixInputEventHandler.h:74
 AliMixInputEventHandler.h:75
 AliMixInputEventHandler.h:76
 AliMixInputEventHandler.h:77
 AliMixInputEventHandler.h:78
 AliMixInputEventHandler.h:79
 AliMixInputEventHandler.h:80
 AliMixInputEventHandler.h:81
 AliMixInputEventHandler.h:82
 AliMixInputEventHandler.h:83
 AliMixInputEventHandler.h:84
 AliMixInputEventHandler.h:85
 AliMixInputEventHandler.h:86
 AliMixInputEventHandler.h:87
 AliMixInputEventHandler.h:88
 AliMixInputEventHandler.h:89
 AliMixInputEventHandler.h:90
 AliMixInputEventHandler.h:91
 AliMixInputEventHandler.h:92
 AliMixInputEventHandler.h:93
 AliMixInputEventHandler.h:94
 AliMixInputEventHandler.h:95
 AliMixInputEventHandler.h:96
 AliMixInputEventHandler.h:97
 AliMixInputEventHandler.h:98
 AliMixInputEventHandler.h:99
 AliMixInputEventHandler.h:100
 AliMixInputEventHandler.h:101
 AliMixInputEventHandler.h:102
 AliMixInputEventHandler.h:103
 AliMixInputEventHandler.h:104
 AliMixInputEventHandler.h:105
 AliMixInputEventHandler.h:106
 AliMixInputEventHandler.h:107
 AliMixInputEventHandler.h:108
 AliMixInputEventHandler.h:109
 AliMixInputEventHandler.h:110
 AliMixInputEventHandler.h:111
 AliMixInputEventHandler.h:112
 AliMixInputEventHandler.h:113
 AliMixInputEventHandler.h:114
 AliMixInputEventHandler.h:115
 AliMixInputEventHandler.h:116