#ifndef MuLTI_BUILDER_H #define MuLTI_BUILDER_H #include "ClassData.h" #include "Hit.h" #define MaxNEvent 100000 // circular, this number should be at least nDigi * MaxNChannel * MaxNData class MultiBuilder { public: MultiBuilder(Data ** multiData, std::vector type, std::vector sn); MultiBuilder(Data * singleData, int type, int sn); ~MultiBuilder(); void ForceStop(bool onOff) { forceStop = onOff;} void SetTimeWindow(unsigned short nanosec) {timeWindow = nanosec; leftOverTime = nanosec;} unsigned short GetTimeWindow() const{return timeWindow;} void SetTimeJump(unsigned long long TimeJumpInNanoSec) {timeJump = TimeJumpInNanoSec;} unsigned long long GetTimeJump() const {return timeJump;} void SetLeftOverTime(unsigned long long nanosec) {leftOverTime = nanosec;} unsigned long long GetLeftOverTime() const{return leftOverTime;} void SetBreakTime(unsigned long long nanosec) {breakTime = nanosec;} unsigned long long GetBreakTime() const{return breakTime;} unsigned int GetNumOfDigitizer() const {return nData;} std::vector GetDigiIDList() const {return idList;} void BuildEvents(bool isFinal = false, bool skipTrace = false, bool verbose = false); void BuildEventsBackWard(int maxNumEvent = 100, bool verbose = false); // always skip trace, for faster online building void ClearEvents(); void PrintStat(); void PrintAllEvent(); long eventIndex; long eventBuilt; // reset once call BuildEvents() long totalEventBuilt; std::vector events[MaxNEvent]; private: std::vector typeList; std::vector snList; std::vector idList; std::vector tick2ns; const unsigned short nData; Data ** data; // assume all data has MaxNChannel (16) int numTotCh; // number of total channel = sum digi[i]->GetNChannel() std::vector dataSize; unsigned short timeWindow; unsigned long long leftOverTime; unsigned long long breakTime; // timestamp for breaking the event builder unsigned long long timeJump; //time diff for a time jump, default is 1e8 ns unsigned long long lastEventTime; // timestamp for detect time jump // int loopIndex[MaxNDigitizer][MaxNChannels]; long nextIndex[MaxNDigitizer][MaxNChannels]; // loopIndex * dataSize + index int nExhaushedCh; bool chExhaused[MaxNDigitizer][MaxNChannels]; void FindEarlistTimeAndCh(bool verbose = false); // search through the nextIndex unsigned long long earlistTime; int earlistDigi; int earlistCh; void FindLatestTimeAndCh(bool verbose = false); // search through the nextIndex unsigned long long latestTime; int latestDigi; int latestCh; void FindEarlistTimeAmongLastData(bool verbose = false); void FindLatestTimeOfData(bool verbose = false); int lastBackWardIndex[MaxNDigitizer][MaxNChannels]; // abs. index bool forceStop; }; #endif