BBQ
TBBQEventManager.cxx
Go to the documentation of this file.
1 //------------------------------------------------------------------------------
2 // Ref: http://root.cern.ch/root/html/tutorials/eve/alice_vsd.C.html
3 //------------------------------------------------------------------------------
4 
5 #include "TBBQManager.h"
6 #include "TBBQEventManager.h"
7 #include "vistpc.h"
8 
9 // C++
10 
11 #include <string>
12 #include <sstream>
13 #include <iostream>
14 
15 // ROOT
16 
17 #include "TList.h"
18 
19 #include "TGListBox.h"
20 #include "TGTextEntry.h"
21 
22 #include "TEveEventManager.h"
23 
24 // LCIO
25 
26 #include "lcio.h"
27 
28 #include "EVENT/LCIO.h"
29 #include "IO/LCReader.h"
30 
31 //------------------------------------------------------------------------------
32 // Constructors & Destructor
33 //------------------------------------------------------------------------------
34 
36  fVisTPC(visTPC),
37  fLCReader(lcio::LCFactory::getInstance()->createLCReader()),
38  fCurrentEvent(0),
39  fRunNumberEntry(0),
40  fEventNumberEntry(0),
41  fFirstEventNumber(0)
42 {
43  SetElementNameTitle("Event", "Event");
44 }
45 
46 //------------------------------------------------------------------------------
47 // Methods (alphabetical order)
48 //------------------------------------------------------------------------------
49 
50 void TBBQEventManager::readFile(const std::string& filePath, bool clearEventCollections) {
51  fCurrentFile = filePath;
52  fCurrentEvent = 0;
53 
54  fLCReader->open(fCurrentFile);
55 
56  // Only show the collections that is contained in the first event.
57  // We don't care whether other events has other collections or not.
58 
59  EVENT::LCEvent* event = 0;
60  if ( !(event = fLCReader->readNextEvent()) ) {
61  std::cout << "No events.. breaking" << std::endl;
62  return;
63  }
64 
65  if (clearEventCollections) {
68  }
69 
70  fCurrentEvent = event;
71  fFirstEventNumber = event->getEventNumber();
72 
73  EventChanged();
74  RunChanged();
75 }
76 
78  gBBQ->GetCurrentEvent()->DestroyElements();
79 }
80 
81 
82 
84  int number = fCurrentEvent->getEventNumber();
85 
86  std::stringstream eventNumber;
87  eventNumber << number;
88 
89  //std::cout << "Emitting EventChanged(" << number << ")" << std::endl;
90 
91  EventChanged(fCurrentEvent->getEventNumber());
92  EventChanged(eventNumber.str().c_str());
93 
94  // HACK
95  // Should be done via Signal/Slot mechanism
96 
98  fEventNumberEntry->SetText(eventNumber.str().c_str(), kFALSE);
99 
100  // small hack: in case no collections have been loaded in the previous
101  // events the collections are loaded now.
102  // Attention: This means the collections are not available in all events.
103  // (p.s. it is save because displayCollections doesn nothing if the
104  // collections are not empty, and they are not reset)
106 }
107 
109  Emit("EventChanged(int)", number);
110 }
111 
112 void TBBQEventManager::EventChanged(const char* number) {
113  Emit("EventChanged(const char*)", number);
114 }
115 
117  GotoEvent(fEventNumberEntry->GetText());
118 }
119 
121  // Not implemented yet.
122 }
123 
124 void TBBQEventManager::GotoEvent(int eventNumber) {
125 
126  //===================================
127  // 1. Checks
128  // 2. If we already have read an event.
129  // a. Navigate backward to event.
130  // b. Reload event.
131  // 3. Navigate forward to new event.
132  // 4. Do stuff with the event.
133 
134  //===================================
135  // 1. Checks
136 
137  if (fCurrentFile.empty()) {
138  std::cout << "First open a file to read!" << std::endl;
139  return;
140  }
141 
142  if (eventNumber < 0) {
143  std::cout << "Need positive event number." << std::endl;
144  return;
145  }
146 
147  //===================================
148  // 2. If we already have read an event.
149 
150  // This is initialized to -1 because the event numbers start from 0.
151  // Otherwise it will get into trouble with the fast forward code below.
152  int currentEventNumber = -1;
153  int lastRunNumber = -1;
154 
155  if (fCurrentEvent) {
156 
157  currentEventNumber = fCurrentEvent->getEventNumber();
158 
159  // 2a. Navigate backward to event.
160 
161  if (eventNumber - currentEventNumber < 0) {
162  std::cout << "We can go backwards. Let me reopen the file." << std::endl;
163 
164  fLCReader->close();
165  readFile(fCurrentFile, false);
166  GotoEvent(eventNumber > fFirstEventNumber ? eventNumber : fFirstEventNumber);
167 
168  return;
169  }
170 
171  // 2b. Reload event
172 
173  if (eventNumber - currentEventNumber == 0) {
174  std::cout << "Sure, we will stay on the same event." << std::endl;
175  //return;
176  }
177 
178  lastRunNumber = fCurrentEvent->getRunNumber();
179  }
180 
181  //===================================
182  // 3. Navigate forward to new event.
183 
184  EVENT::LCEvent* event = fCurrentEvent; // For reload.
185 
186  while (eventNumber - currentEventNumber) {
187 
188  if ( !(event = fLCReader->readNextEvent()) )
189  break;
190 
191  ++currentEventNumber;
192 
193  if (currentEventNumber > fLastEventNumber)
194  fLastEventNumber = currentEventNumber;
195 
196  }
197 
198  // For the future
199  // event = fLCReader->readEvent(0, eventNumber);
200 
201  //===================================
202  // 4. Do stuff with the event.
203 
204  if (event) {
205 
206  DropEvent();
207 
208  std::cout << "Run #: " << event->getRunNumber() << ", "
209  << "Event #: " << event->getEventNumber() << std::endl;
210 
211  try {
212 
213  fCurrentEvent = event;
214 
215  TList selectedEntries;
216 
217  gBBQ->getHitsCollections()->GetSelectedEntries(&selectedEntries);
218  gBBQ->getPulsesCollections()->GetSelectedEntries(&selectedEntries);
219  gBBQ->getTracksCollections()->GetSelectedEntries(&selectedEntries);
220 
221  fVisTPC->drawEvent(event, selectedEntries, NULL);
222 
223  // Emit signals. These methods uses fCurrentEvent.
224 
225  EventChanged();
226  if (event->getRunNumber() != lastRunNumber)
227  RunChanged();
228 
229  } catch (...) {
230  // Do nothing
231  }
232 
233  } else {
234 
235  std::cout << "No more events. Going back to the first one." << std::endl;
236 
237  fLCReader->close();
238  readFile(fCurrentFile, false);
240 
241  }
242 }
243 
244 void TBBQEventManager::GotoEvent(const char* eventNumberStr) {
245  std::stringstream sstr;
246 
247  sstr << eventNumberStr;
248 
249  int eventNumber;
250 
251  if (sstr >> eventNumber)
252  GotoEvent(eventNumber);
253  else
254  std::cout << "\"" << eventNumberStr << "\""
255  << "is not a number." << std::endl;
256 }
257 
259  GotoEvent(fCurrentEvent ? fCurrentEvent->getEventNumber() + 1 : fFirstEventNumber);
260 }
261 
263  GotoEvent(fCurrentEvent ? fCurrentEvent->getEventNumber() - 1 : fFirstEventNumber);
264 }
265 
268 }
269 
271  int number = fCurrentEvent->getRunNumber();
272 
273  std::stringstream runNumber;
274  runNumber << number;
275 
276  //std::cout << "Emitting RunChanged(" << number << ")" << std::endl;
277 
278  RunChanged(fCurrentEvent->getRunNumber());
279  RunChanged(runNumber.str().c_str());
280 
281  // HACK
282  // Should be done via Signal/Slot mechanism
283 
284  if (fRunNumberEntry)
285  fRunNumberEntry->SetText(runNumber.str().c_str(), kFALSE);
286 }
287 
289  Emit("RunChanged(int)", number);
290 }
291 
292 void TBBQEventManager::RunChanged(const char* number) {
293  Emit("RunChanged(const char*)", number);
294 }
void readFile(const std::string &filePath, bool clearEventCollections=true)
Read LCIO data file.
TGTextEntry * fRunNumberEntry
EVENT::LCEvent * fCurrentEvent
TGListBox * getPulsesCollections()
Definition: TBBQManager.h:83
Main visualization class. It is used to draw GEAR detector geometries and LCIO data. It is a self-contained class that depends only on ROOT, TEve, GEAR and LCIO. This means you can use this class outside and independent of BBQ.
Definition: vistpc.h:65
void displayEventCollections(const EVENT::LCEvent *event)
std::string fCurrentFile
IO::LCReader * fLCReader
virtual TBBQEventManager * GetCurrentEvent()
Definition: TBBQManager.h:75
R__EXTERN TBBQManager * gBBQ
Definition: TBBQManager.h:135
TBBQEventManager(VisTPC *&visTPC)
TGTextEntry * fEventNumberEntry
TGListBox * getTracksCollections()
Definition: TBBQManager.h:84
TGListBox * getHitsCollections()
Definition: TBBQManager.h:82
void drawEvent(EVENT::LCEvent *event, std::vector< std::string > &selectedEntries, TEveElement *parent=NULL, const char *name="Event")
Definition: vistpc.cxx:161
void GotoEvent(int eventNumber)
void clearEventCollections()