1 ////////////////////////////////////////////////////////////////////////////////
3 // Author: Artur Szostak
4 // Email: artur@alice.phy.uct.ac.za | artursz@iafrica.com
6 ////////////////////////////////////////////////////////////////////////////////
8 #ifndef dHLT_TRACKING_EVENT_HANDLER_HPP
9 #define dHLT_TRACKING_EVENT_HANDLER_HPP
14 #include "Buffers/RegionTree.hpp"
15 #include "Buffers/List.hpp"
16 #include "Buffers/CountedList.hpp"
17 #include "Buffers/LookupTable.hpp"
19 #include "IOInterface.hpp"
20 #include "Tracking/Tracker.hpp"
25 ostream& operator << (ostream& os, const dHLT::EventID& id)
27 os << "[" << id.bunch << ", " << id.timestamp << "]";
39 using dHLT::Buffers::List;
40 using dHLT::Buffers::CountedList;
41 using dHLT::Buffers::LookupTable;
48 /////////////////////////////////////////////////////////////////////////////////////////////////
50 class RegionRegistrationTable
54 struct ClusterBlockRecord
56 ClusterPoint* clusters;
59 ClusterBlockRecord() {};
61 ClusterBlockRecord(ClusterPoint* clusters, UInt count)
63 this->clusters = clusters;
67 friend bool operator == (const ClusterBlockRecord& a, const ClusterBlockRecord& b)
69 return a.clusters == b.clusters and a.count == b.count;
73 typedef List<ClusterBlockRecord> ClusterBlockList;
81 TrackerRecord(Tracker* newtracker = NULL, void* newtag = NULL)
87 friend bool operator == (const TrackerRecord& a, const TrackerRecord& b)
89 return a.tracker == b.tracker and a.tag == b.tag;
92 friend bool operator != (const TrackerRecord& a, const TrackerRecord& b)
98 typedef List<TrackerRecord> TrackerRecordList;
102 Tracker* tracker, const void* tag,
103 const ChamberID chamber, const UInt left, const UInt bottom, const UChar level,
104 ClusterBlockList& foundlist
107 AddRequestHandler addrequest(tracker, tag, &foundlist);
108 regions.ForAllOverlapping(chamber, left, bottom, level, addrequest);
109 return addrequest.endofclusters;
114 const ClusterPoint* clusters, const UInt count,
115 const ChamberID chamber, const UInt left, const UInt bottom, const UChar level,
116 TrackerRecordList& foundlist
119 AddClustersHandler addblock(clusters, count, &foundlist);
120 regions.ForAllOverlapping(chamber, left, bottom, level, addblock);
124 void MarkEndOfClusters(
125 const ChamberID chamber, const UInt left, const UInt bottom, const UChar level,
126 TrackerRecordList& foundlist
129 MarkEndOfClustersHandler markendofclusters(&foundlist);
130 regions.ForAllOverlapping(chamber, left, bottom, level, markendofclusters);
139 bool forchildren; // Set to true if end of clusters flag applies for all children.
140 ClusterBlockList clusterblocks; // The cluster blocks returned so far.
141 TrackerRecordList trackers; // Trackers interested in the region.
145 endofclusters = forchildren = false;
149 typedef Buffers::RegionTree<TreeRecord> Tree;
152 class AddRequestHandler : public Tree::Handler
156 inline AddRequestHandler(Tracker* tracker, const void* tag, ClusterBlockList* output)
158 Assert( output != NULL );
159 data.tracker = tracker;
160 data.tag = const_cast<void*>( tag );
163 // since we do an and operation on endofclusters, it must be initialised to true.
164 endofclusters = true;
167 inline void AddTo(Tree::Node* node)
169 endofclusters = endofclusters & node->data.endofclusters;
170 node->data.trackers.Add(data);
173 inline void Initialise(Tree::Node* node, Tree::Node* parent)
175 node->data.endofclusters = parent->data.endofclusters & parent->data.forchildren;
178 inline void FoundOverlapping(Tree::Node* node)
180 for (ClusterBlockList::Iterator block = node->data.clusterblocks.First();
181 block != node->data.clusterblocks.End();
185 foundlist->AddUniquely(*block);
189 inline void FoundContained(Tree::Node* node)
191 for (ClusterBlockList::Iterator block = node->data.clusterblocks.First();
192 block != node->data.clusterblocks.End();
196 foundlist->AddUniquely(*block);
201 ClusterBlockList* foundlist;
206 class AddClustersHandler : public Tree::Handler
210 inline AddClustersHandler(const ClusterPoint* clusters, const UInt count, TrackerRecordList* output)
212 Assert( output != NULL );
213 data.clusters = const_cast<ClusterPoint*>( clusters );
218 inline void AddTo(Tree::Node* node)
220 node->data.clusterblocks.Add(data);
223 inline void Initialise(Tree::Node* node, Tree::Node* parent)
225 node->data.endofclusters = parent->data.endofclusters & parent->data.forchildren;
228 inline void FoundOverlapping(Tree::Node* node)
230 for (TrackerRecordList::Iterator tracker = node->data.trackers.First();
231 tracker != node->data.trackers.End();
235 foundlist->AddUniquely(*tracker);
239 inline void FoundContained(Tree::Node* node)
241 for (TrackerRecordList::Iterator tracker = node->data.trackers.First();
242 tracker != node->data.trackers.End();
246 foundlist->AddUniquely(*tracker);
250 ClusterBlockRecord data;
251 TrackerRecordList* foundlist;
255 class MarkEndOfClustersHandler : public Tree::Handler
259 inline MarkEndOfClustersHandler(TrackerRecordList* output)
261 Assert( output != NULL );
265 inline void AddTo(Tree::Node* node)
267 node->data.forchildren = true;
270 inline void InitialiseFirst(Tree::Node* node)
272 node->data.endofclusters = true;
273 node->data.forchildren = false;
276 inline void Initialise(Tree::Node* node, Tree::Node* parent)
278 node->data.endofclusters = true;
279 node->data.forchildren = false;
282 inline void FoundOverlapping(Tree::Node* node)
284 node->data.endofclusters = true;
285 node->data.forchildren = false;
288 inline void FoundContained(Tree::Node* node)
290 node->data.endofclusters = true;
291 node->data.forchildren = true;
293 for (TrackerRecordList::Iterator tracker = node->data.trackers.First();
294 tracker != node->data.trackers.End();
298 foundlist->AddUniquely(*tracker);
302 TrackerRecordList* foundlist;
310 /////////////////////////////////////////////////////////////////////////////////////////////
313 class EventHandler : public TrackerCallback
317 EventHandler(const EventID event)
322 maxtrackcount = currenttrackcount = newtrackcount = 0;
323 endoftriggers = false;
324 endofrequests_count = 0;
327 virtual ~EventHandler() {};
329 void AddTriggers(const TriggerRecord* triggers, const UInt count);
331 void EndOfTriggers();
333 void AddClusters(const ROI region, const ClusterPoint* clusters, const UInt count);
335 void EndOfClusters(const ROI region);
338 // TrackerCallback methods
340 virtual void RequestClusters(
342 const Float left, const Float right, const Float bottom, const Float top,
343 const ChamberID chamber, const void* tag
346 virtual void EndOfClusterRequests(Tracker* tracker);
348 virtual void FoundTrack(Tracker* tracker);
350 virtual void NoTrackFound(Tracker* tracker);
352 void CheckForTotalEndOfRequests();
354 void CheckForEndOfTracks();
356 EventID Key() const { return eventid; };
357 EventID Event() const { return eventid; };
359 IOHandler* GetIOHandler() const { return iohandler; };
360 void SetIOHandler(IOHandler* handler) { iohandler = handler; };
364 typedef CountedList<Tracker*> TrackerList;
367 class TrackerList : public List<Tracker*>
370 TrackerList() : List<Tracker*>()
378 return List<Tracker*>::Add();
382 Tracker** AddNew(Tracker* data)
385 return List<Tracker*>::AddNew(data);
388 Tracker** AddUniquely(Tracker* data)
390 Tracker** result = Find(data);
400 void Remove(const UInt index)
402 List<Tracker*>::Remove(index);
406 bool Remove(Tracker* data)
408 bool removed = List<Tracker*>::Remove(data);
414 void Remove(Iterator& iter)
416 List<Tracker*>::Remove(iter);
422 List<Tracker*>::Clear();
439 IOHandler* iohandler;
442 UInt maxtrackcount, currenttrackcount, newtrackcount;
445 UInt endofrequests_count;
447 TrackerList trackers;
448 RegionRegistrationTable registration_table;
455 #endif // dHLT_TRACKING_EVENT_HANDLER_HPP