/* * PndMQHitsEventBuilder.cxx * * Created on: 21.10.2015 * Author: Stockmanns */ #include #include "FairMQLogger.h" PndMQHitsEventBuilder::PndMQHitsEventBuilder(int nChannels) : fNChannels(nChannels), fEventCounter(0), fSensorsInEvent(nChannels, 0) { fInputData.resize(nChannels); } PndMQHitsEventBuilder::~PndMQHitsEventBuilder() { // TODO Auto-generated destructor stub } void PndMQHitsEventBuilder::AddData(vector > >& data) { for (int channelNr = 0; channelNr < data.size(); channelNr++){ //LOG(INFO) << "PndMQHitsEventBuilder::AddData from Channel " << channelNr << " size " << data[channelNr].size(); fInputData[channelNr].insert(fInputData[channelNr].end(), data[channelNr].begin(), data[channelNr].end()); } } vector > PndMQHitsEventBuilder::GetEvents() { vector > result; while (HasData()){ result.push_back(GetNextEvent()); } return result; } bool PndMQHitsEventBuilder::HasData() { bool result = true; for (int channelIter = 0; channelIter < fInputData.size(); channelIter++){ if (fInputData[channelIter].size() == 0){ result = false; } } // if (result == false) // LOG(INFO) << "HasData " << result; return result; } vector PndMQHitsEventBuilder::GetNextEvent() { vector result; // if (fEventCounter % 1000 == 0){ // LOG(INFO) << fEventCounter; // for (int channelNr = 0; channelNr < fNChannels; channelNr++){ // LOG(INFO) << channelNr << " : " << fInputData[channelNr].size(); // } // } // fEventCounter++; // LOG(INFO) << "Data in channels"; // for (auto channelIter: fInputData){ // LOG(INFO) << "Channel size: " << channelIter.size(); // for (auto eventIter : channelIter) // for (auto dataIter : eventIter) // LOG(INFO) << dataIter.GetSensorID() << " " << dataIter.GetTimeStamp(); // } vector > firstDataInChannels; firstDataInChannels.resize(fNChannels); for (int channelNr = 0; channelNr < fInputData.size(); channelNr++){ if (fInputData[channelNr].size() > 0){ if (fInputData[channelNr][0].size() > 0) firstDataInChannels[channelNr] = fInputData[channelNr][0]; else return result; } } // LOG(INFO) << "FirstDataInChannel:"; // for (int channel = 0; channel < firstDataInChannels.size(); channel++){ // //LOG(INFO) << "Channel: " << channel << " : "; // for (auto data : firstDataInChannels[channel]){ // LOG(INFO) << channel << " : " << TString::Format("%12.0f", data.GetTimeStamp()).Data(); // } // } vector channelInEvent = GetChannelsInEvent(firstDataInChannels); int nSensorsInEvent = 0; // LOG(INFO) << "ChannelMatch:"; for (auto inEvent : channelInEvent){ //LOG(INFO) << inEvent; nSensorsInEvent += inEvent; } if (nSensorsInEvent > 0) fSensorsInEvent[nSensorsInEvent - 1]++; // LOG(INFO) << "channelInEvent.size " << channelInEvent.size(); for(int channelNr = 0; channelNr < fNChannels; channelNr++){ if (channelInEvent[channelNr] == true){ //LOG(INFO) << "Add Data to result from: " << channelNr; result.insert(result.end(), firstDataInChannels[channelNr].begin(), firstDataInChannels[channelNr].end()); //LOG(INFO) << "DataInserted: " << result.size(); fInputData[channelNr].erase(fInputData[channelNr].begin()); // LOG(INFO) << "Delete data from InputData " << channelNr << " " << fInputData[channelNr].size(); } } //if (nChannelsInEvent > 2){ // LOG(INFO) << "Data in Result: "; // for (auto data : result) // LOG(INFO) << data.GetSensorID() << " : " << data.GetTimeStamp(); //} return result; } vector PndMQHitsEventBuilder::GetChannelsInEvent(vector >& eventData) { double offset = 50; vector result(fNChannels, false); int firstChannel = FindFirstChannel(eventData); // LOG(INFO) << "FirstChannel: " << firstChannel; if (firstChannel > -1){ double firstTimeStamp = eventData[firstChannel][0].GetTimeStamp(); double lastTimeStamp = eventData[firstChannel].rbegin()->GetTimeStamp() + offset; result[firstChannel] = true; for (int channelNr = 0; channelNr < eventData.size(); channelNr++){ if (channelNr != firstChannel){ double actualFirstTS = eventData[channelNr].begin()->GetTimeStamp(); double actualLastTS = eventData[channelNr].rbegin()->GetTimeStamp(); if (actualFirstTS == firstTimeStamp) result[channelNr] = true; if (actualFirstTS < firstTimeStamp){ if (actualLastTS >= firstTimeStamp){ result[channelNr] = true; } } else if (actualFirstTS <= lastTimeStamp) { result[channelNr] = true; } } } } return result; } int PndMQHitsEventBuilder::FindFirstChannel(vector >& eventData) { int result = -1; double oldTimeStamp = -1; for (int channelNr = 0; channelNr < eventData.size(); channelNr++){ double actualTimeStamp = eventData[channelNr].front().GetTimeStamp(); if (actualTimeStamp < oldTimeStamp || oldTimeStamp < 0){ result = channelNr; oldTimeStamp = actualTimeStamp; } } return result; }