FairRoot/PandaRoot
PndMQHitsEventBuilder.cxx
Go to the documentation of this file.
1 /*
2  * PndMQHitsEventBuilder.cxx
3  *
4  * Created on: 21.10.2015
5  * Author: Stockmanns
6  */
7 
9 
10 #include "FairMQLogger.h"
11 
12 PndMQHitsEventBuilder::PndMQHitsEventBuilder(int nChannels) : fNChannels(nChannels), fEventCounter(0), fSensorsInEvent(nChannels, 0) {
13  fInputData.resize(nChannels);
14 
15 }
16 
18  // TODO Auto-generated destructor stub
19 }
20 
21 void PndMQHitsEventBuilder::AddData(vector<vector<vector<PndSdsHit> > >& data)
22 {
23  for (int channelNr = 0; channelNr < data.size(); channelNr++){
24  //LOG(INFO) << "PndMQHitsEventBuilder::AddData from Channel " << channelNr << " size " << data[channelNr].size();
25  fInputData[channelNr].insert(fInputData[channelNr].end(), data[channelNr].begin(), data[channelNr].end());
26  }
27 }
28 
29 vector<vector<PndSdsHit> > PndMQHitsEventBuilder::GetEvents()
30 {
31  vector<vector<PndSdsHit> > result;
32  while (HasData()){
33  result.push_back(GetNextEvent());
34  }
35  return result;
36 }
37 
39 {
40  bool result = true;
41  for (int channelIter = 0; channelIter < fInputData.size(); channelIter++){
42  if (fInputData[channelIter].size() == 0){
43  result = false;
44  }
45  }
46 // if (result == false)
47 // LOG(INFO) << "HasData " << result;
48  return result;
49 }
50 
52 {
53  vector<PndSdsHit> result;
54 // if (fEventCounter % 1000 == 0){
55 // LOG(INFO) << fEventCounter;
56 // for (int channelNr = 0; channelNr < fNChannels; channelNr++){
57 // LOG(INFO) << channelNr << " : " << fInputData[channelNr].size();
58 // }
59 // }
60 // fEventCounter++;
61 // LOG(INFO) << "Data in channels";
62 // for (auto channelIter: fInputData){
63 // LOG(INFO) << "Channel size: " << channelIter.size();
64 // for (auto eventIter : channelIter)
65 // for (auto dataIter : eventIter)
66 // LOG(INFO) << dataIter.GetSensorID() << " " << dataIter.GetTimeStamp();
67 // }
68 
69  vector<vector<PndSdsHit> > firstDataInChannels;
70  firstDataInChannels.resize(fNChannels);
71  for (int channelNr = 0; channelNr < fInputData.size(); channelNr++){
72  if (fInputData[channelNr].size() > 0){
73  if (fInputData[channelNr][0].size() > 0)
74  firstDataInChannels[channelNr] = fInputData[channelNr][0];
75  else
76  return result;
77  }
78  }
79 // LOG(INFO) << "FirstDataInChannel:";
80 // for (int channel = 0; channel < firstDataInChannels.size(); channel++){
81 // //LOG(INFO) << "Channel: " << channel << " : ";
82 // for (auto data : firstDataInChannels[channel]){
83 // LOG(INFO) << channel << " : " << TString::Format("%12.0f", data.GetTimeStamp()).Data();
84 // }
85 // }
86  vector<bool> channelInEvent = GetChannelsInEvent(firstDataInChannels);
87 
88  int nSensorsInEvent = 0;
89 // LOG(INFO) << "ChannelMatch:";
90  for (auto inEvent : channelInEvent){
91  //LOG(INFO) << inEvent;
92  nSensorsInEvent += inEvent;
93  }
94 
95  if (nSensorsInEvent > 0)
96  fSensorsInEvent[nSensorsInEvent - 1]++;
97 
98 // LOG(INFO) << "channelInEvent.size " << channelInEvent.size();
99  for(int channelNr = 0; channelNr < fNChannels; channelNr++){
100  if (channelInEvent[channelNr] == true){
101  //LOG(INFO) << "Add Data to result from: " << channelNr;
102  result.insert(result.end(), firstDataInChannels[channelNr].begin(), firstDataInChannels[channelNr].end());
103  //LOG(INFO) << "DataInserted: " << result.size();
104  fInputData[channelNr].erase(fInputData[channelNr].begin());
105 // LOG(INFO) << "Delete data from InputData " << channelNr << " " << fInputData[channelNr].size();
106  }
107  }
108  //if (nChannelsInEvent > 2){
109  // LOG(INFO) << "Data in Result: ";
110  // for (auto data : result)
111  // LOG(INFO) << data.GetSensorID() << " : " << data.GetTimeStamp();
112  //}
113  return result;
114 }
115 
116 vector<bool> PndMQHitsEventBuilder::GetChannelsInEvent(vector<vector<PndSdsHit> >& eventData)
117 {
118  double offset = 50;
119  vector<bool> result(fNChannels, false);
120 
121  int firstChannel = FindFirstChannel(eventData);
122 // LOG(INFO) << "FirstChannel: " << firstChannel;
123  if (firstChannel > -1){
124  double firstTimeStamp = eventData[firstChannel][0].GetTimeStamp();
125  double lastTimeStamp = eventData[firstChannel].rbegin()->GetTimeStamp() + offset;
126  result[firstChannel] = true;
127 
128  for (int channelNr = 0; channelNr < eventData.size(); channelNr++){
129  if (channelNr != firstChannel){
130  double actualFirstTS = eventData[channelNr].begin()->GetTimeStamp();
131  double actualLastTS = eventData[channelNr].rbegin()->GetTimeStamp();
132  if (actualFirstTS == firstTimeStamp)
133  result[channelNr] = true;
134  if (actualFirstTS < firstTimeStamp){
135  if (actualLastTS >= firstTimeStamp){
136  result[channelNr] = true;
137  }
138  } else if (actualFirstTS <= lastTimeStamp) {
139  result[channelNr] = true;
140  }
141  }
142  }
143  }
144  return result;
145 }
146 
147 int PndMQHitsEventBuilder::FindFirstChannel(vector<vector<PndSdsHit> >& eventData)
148 {
149  int result = -1;
150  double oldTimeStamp = -1;
151  for (int channelNr = 0; channelNr < eventData.size(); channelNr++){
152  double actualTimeStamp = eventData[channelNr].front().GetTimeStamp();
153  if (actualTimeStamp < oldTimeStamp || oldTimeStamp < 0){
154  result = channelNr;
155  oldTimeStamp = actualTimeStamp;
156  }
157  }
158  return result;
159 }
void AddData(vector< vector< vector< PndSdsHit > > > &data)
vector< vector< vector< PndSdsHit > > > fInputData
vector< bool > GetChannelsInEvent(vector< vector< PndSdsHit > > &eventData)
TVector3 offset(2, 0, 0)
vector< vector< PndSdsHit > > GetEvents()
int FindFirstChannel(vector< vector< PndSdsHit > > &eventData)
channel which has the oldest data
vector< PndSdsHit > GetNextEvent()
PndMQHitsEventBuilder(int nChannels=4)