Project
Loading...
Searching...
No Matches
EventReader.cxx
Go to the documentation of this file.
1// Copyright 2019-2020 CERN and copyright holders of ALICE O2.
2// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders.
3// All rights not expressly granted are reserved.
4//
5// This software is distributed under the terms of the GNU General Public
6// License v3 (GPL Version 3), copied verbatim in the file "COPYING".
7//
8// In applying this license CERN does not waive the privileges and immunities
9// granted to it by virtue of its status as an Intergovernmental Organization
10// or submit itself to any jurisdiction.
11
13
14using namespace o2::focal;
15
16EventReader::EventReader(TTree* eventTree)
17{
18 init(eventTree);
19}
20
21void EventReader::init(TTree* eventTree)
22{
23 mTreeReader = std::make_unique<TTreeReader>(eventTree);
24 mPadBranch = std::make_unique<TTreeReaderValue<std::vector<PadLayerEvent>>>(*mTreeReader, "FOCALPadLayer");
25 mPixelChipBranch = std::make_unique<TTreeReaderValue<std::vector<PixelChipRecord>>>(*mTreeReader, "FOCALPixelChip");
26 mPixelHitBranch = std::make_unique<TTreeReaderValue<std::vector<PixelHit>>>(*mTreeReader, "FOCALPixelHit");
27 mTriggerBranch = std::make_unique<TTreeReaderValue<std::vector<TriggerRecord>>>(*mTreeReader, "FOCALTrigger");
28
29 mHasEntryLoaded = false;
30 mTreeReaderHasNext = true;
31 mEntryInTF = 0;
32}
33
34void EventReader::nextTimeframe()
35{
36 mTreeReaderHasNext = mTreeReader->Next();
37 mHasEntryLoaded = true;
38 mEntryInTF = 0;
39}
40
42{
43 if (mHasEntryLoaded) {
44 if (mEntryInTF + 1 < (*mTriggerBranch)->size()) {
45 // more enties in current timeframe
46 return true;
47 } else {
48 // check whether we have another timeframe to read
49 return mTreeReaderHasNext;
50 }
51 } else {
52 return mTreeReaderHasNext;
53 }
54}
55
57{
58 if (!mHasEntryLoaded) {
59 nextTimeframe();
60 }
61 // 2 conditions
62 // - end of timeframe
63 // - skip empty timeframes
64 while (mEntryInTF == (*mTriggerBranch)->size() && mTreeReaderHasNext) {
65 nextTimeframe();
66 }
67
68 Event nextevent;
69 if (mEntryInTF < (*mTriggerBranch)->size()) { // Additional protection if we are closing with empty timeframe
70 auto& triggerrecord = (*mTriggerBranch)->at(mEntryInTF);
71 gsl::span<const PadLayerEvent> eventPadData;
72 if (triggerrecord.getNumberOfPadObjects()) {
73 eventPadData = gsl::span<const PadLayerEvent>((*mPadBranch)->data() + triggerrecord.getFirstPadEntry(), triggerrecord.getNumberOfPadObjects());
74 }
75 gsl::span<const PixelHit> eventPixelHits;
76 if (triggerrecord.getNumberOfPixelHitObjects()) {
77 eventPixelHits = gsl::span<const PixelHit>((*mPixelHitBranch)->data() + triggerrecord.getFirstPixelHitEntry(), triggerrecord.getNumberOfPixelHitObjects());
78 }
79 gsl::span<const PixelChipRecord> eventPixelChip;
80 if (triggerrecord.getNumberOfPixelChipObjects()) {
81 eventPixelChip = gsl::span<const PixelChipRecord>((*mPixelChipBranch)->data() + triggerrecord.getFirstPixelChipEntry(), triggerrecord.getNumberOfPixelChipObjects());
82 }
83
84 nextevent.construct(triggerrecord.getBCData(), eventPadData, eventPixelChip, eventPixelHits);
85 }
86 mEntryInTF++;
87 return nextevent;
88}
void construct(const o2::InteractionRecord &interaction, gsl::span< const PadLayerEvent > pads, gsl::span< const PixelChipRecord > eventPixels, gsl::span< const PixelHit > pixelHits)
Definition Event.cxx:64