#include "OnlineEventBuilder.h" OnlineEventBuilder::OnlineEventBuilder(Digitizer * digi){ data = digi->GetData(); nCh = digi->GetNChannels(); eventIndex = -1; isNeverBuild = true; for( int i = 0; i < MaxNEvent; i++ ) events[i].clear(); for( int i = 0; i < MaxNChannels; i++ ){ nextIndex[i] = -1; chExhaused[i] = false; } earlistTime = -1; earlistCh = -1; nExhaushedCh = 0; } OnlineEventBuilder::~OnlineEventBuilder(){ } void OnlineEventBuilder::FindEarlistTimeAndCh(){ if( isNeverBuild ){ earlistTime = -1; earlistCh = -1; } nExhaushedCh = 0; for( int i = 0; i < MaxNChannels; i++ ){ chExhaused[i] = false; } for(unsigned int ch = 0; ch < nCh; ch ++){ if( data->DataIndex[ch] == -1 || nextIndex[ch] > data->DataIndex[ch]) { nExhaushedCh ++; chExhaused[ch] = true; continue; } if( isNeverBuild || nextIndex[ch] == -1 ) nextIndex[ch] = 0; unsigned long long time = data->Timestamp[ch][nextIndex[ch]]; if( time < earlistTime ) { earlistTime = time; earlistCh = ch; printf("ch: %d , nextIndex : %d, %llu\n", ch, nextIndex[ch] , earlistTime); } } } void OnlineEventBuilder::BuildEvents(unsigned short timeWindow){ this->timeWindow = timeWindow; //======= Find the earlist time and ch FindEarlistTimeAndCh(); if( earlistCh == -1 ) { /// no data return; } //======= Start bilding event do{ eventIndex ++; if( eventIndex >= MaxNEvent ) eventIndex = 0; unsigned long long dT =0; dataPoint dp = {0, 0, 0}; for( unsigned int i = 0; i < nCh; i++){ int ch = (i + earlistCh ) % nCh; if( chExhaused[ch] ) continue; if( nextIndex[ch] > data->DataIndex[ch]) { nExhaushedCh ++; chExhaused[ch] = true; continue; } do { dT = data->Timestamp[ch][nextIndex[ch]] - earlistTime; if( dT < timeWindow ){ dp.ch = ch; dp.energy = data->Energy[ch][nextIndex[ch]]; dp.timeStamp = data->Timestamp[ch][nextIndex[ch]]; events[eventIndex].push_back(dp); nextIndex[ch]++; }else{ break; } }while( dT < timeWindow); } isNeverBuild = false; //===== print printf("######################################### Event ID : %ld\n", eventIndex); for( int i = 0; i <(int) events[eventIndex].size(); i++){ printf("%02d | %5d %llu \n", events[eventIndex][i].ch, events[eventIndex][i].energy, events[eventIndex][i].timeStamp); } ///Find the next earlist earlistTime = data->Timestamp[dp.ch][nextIndex[dp.ch]]; FindEarlistTimeAndCh(); if( nExhaushedCh == nCh ) { printf("######################### no more eevent to be built\n"); break; } printf("----- next ch : %d, next earlist Time : %llu \n", earlistCh, earlistTime); }while(nExhaushedCh < nCh); for( unsigned int i = 0; i < nCh; i ++ ) printf("%d | exhaushed ? %d \n", i, chExhaused[i] ); printf("------ nExhaushedCh = %d \n", nExhaushedCh); //TODO ----- to speed up continue with data->DataIndex data->ClearData(); for( int i = 0 ; i < MaxNChannels; i++) nextIndex[i] = -1; }