CbmRoot
Loading...
Searching...
No Matches
CbmSourceDigiTimeslice.cxx
Go to the documentation of this file.
1/* Copyright (C) 2024 GSI Helmholtzzentrum fuer Schwerionenforschung, Darmstadt
2 SPDX-License-Identifier: GPL-3.0-only
3 Authors: Volker Friese[committer] */
4
6
7#include "CbmTimeSlice.h"
8#include "CbmTsEventHeader.h"
9
10#include <FairRootManager.h>
11#include <FairRun.h>
12#include <Logger.h>
13
14#include <utility>
15
16
17// ----- Constructor ------------------------------------------------------
18CbmSourceDigiTimeslice::CbmSourceDigiTimeslice(const char* fileName) : fInputFileName(fileName) {}
19// ----------------------------------------------------------------------------
20
21
22// ----- Close ------------------------------------------------------------
24{
25 LOG(info) << "Source: Closing after " << fNumTs << " timeslices";
26 // Clear output vectors
27 fBmonDigis->clear();
28 fStsDigis->clear();
29 fMuchDigis->clear();
30 fTrdDigis->clear();
31 fTofDigis->clear();
32 fRichDigis->clear();
33}
34// ----------------------------------------------------------------------------
35
36
37// ----- Initialisation ---------------------------------------------------
38template<typename TVecobj>
39Bool_t CbmSourceDigiTimeslice::RegisterVector(FairRootManager* ioman, std::vector<TVecobj>*& vec)
40{
41 if (ioman->GetObject(TVecobj::GetBranchName())) {
42 LOG(fatal) << "Source: Branch " << TVecobj::GetBranchName() << " already exists!";
43 return kFALSE;
44 }
45
46 ioman->RegisterAny(TVecobj::GetBranchName(), vec, kTRUE);
47 LOG(info) << "Source: Registered branch " << TVecobj::GetBranchName() << " at " << vec;
48
49 return kTRUE;
50}
51
53{
54 // Create input archive
55 fArchive = std::make_unique<cbm::algo::RecoResultsInputArchive>(fInputFileName);
56 LOG(info) << "Source: Reading from input archive " << fInputFileName;
57 auto desc = fArchive->descriptor();
58 LOG(info) << " - Time created: " << desc.time_created();
59 LOG(info) << " - Host name : " << desc.hostname();
60 LOG(info) << " - User name : " << desc.username();
61
62 // Create and register the Digi tree branches
63 FairRootManager* ioman = FairRootManager::Instance();
64 assert(ioman);
65
66 if (!(fTsEventHeader = dynamic_cast<CbmTsEventHeader*>(FairRun::Instance()->GetEventHeader()))) {
67 LOG(fatal) << "CbmSourceDigiTimeslice::Init() no CbmTsEventHeader was added to the run. Without it, we can not "
68 "store the UTC of the "
69 "Timeslices correctly. Hence, this causes a fatal. Please add it in the steering macro to the Run.";
70 return kFALSE;
71 }
72
73 // TimeSlice. branch initialization
74 if (ioman->GetObject("TimeSlice.")) {
75 LOG(fatal) << "Source: Branch TimeSlice. already exists!";
76 return kFALSE;
77 }
78 else {
79 // NOTE: the max time of timeslice is 1.28e8, taken from CbmRecoUnpack.cxx
80 fTimeslice = new CbmTimeSlice(0., 1.28e8 + 1.28e6);
81 ioman->Register("TimeSlice.", "DAQ", fTimeslice, kTRUE);
82 }
83
84 fBmonDigis = new std::vector<CbmBmonDigi>();
85 if (kFALSE == RegisterVector<CbmBmonDigi>(ioman, fBmonDigis)) {
86 return kFALSE;
87 }
88
89
90 fStsDigis = new std::vector<CbmStsDigi>();
91 if (kFALSE == RegisterVector<CbmStsDigi>(ioman, fStsDigis)) {
92 return kFALSE;
93 }
94
95
96 fMuchDigis = new std::vector<CbmMuchDigi>();
97 if (kFALSE == RegisterVector<CbmMuchDigi>(ioman, fMuchDigis)) {
98 return kFALSE;
99 }
100
101
102 fTrdDigis = new std::vector<CbmTrdDigi>();
103 if (kFALSE == RegisterVector<CbmTrdDigi>(ioman, fTrdDigis)) {
104 return kFALSE;
105 }
106
107
108 fTofDigis = new std::vector<CbmTofDigi>();
109 if (kFALSE == RegisterVector<CbmTofDigi>(ioman, fTofDigis)) {
110 return kFALSE;
111 }
112
113
114 fRichDigis = new std::vector<CbmRichDigi>();
115 if (kFALSE == RegisterVector<CbmRichDigi>(ioman, fRichDigis)) {
116 return kFALSE;
117 }
118
119
120 return kTRUE;
121}
122// ----------------------------------------------------------------------------
123
124
125// ----- Read one time slice from archive ---------------------------------
127{
128
129 // Clear output vectors
130 fBmonDigis->clear();
131 fStsDigis->clear();
132 fMuchDigis->clear();
133 fTrdDigis->clear();
134 fTofDigis->clear();
135 fRichDigis->clear();
136
137
138 // Get next timeslice data from archive. Stop run if end of archive is reached.
139 auto results = fArchive->get();
140 if (fArchive->eos()) {
141 LOG(info) << "Source: End of input archive; terminating run";
142 return 1;
143 }
144
145 // Move event data from input archive to ROOT tree
146 if (results == nullptr) {
147 LOG(error) << "Source: Failed to read RecoResults from archive";
148 return 1;
149 }
150 LOG(info) << "Source: Reading TS " << fNumTs << ", index " << results->TsIndex() << ", start "
151 << results->TsStartTime() << ", contains Digis: \n" //
152 << "STS = " << results->StsDigis().size() << " MUCH = " << results->MuchDigis().size() //
153 << " TOF = " << results->TofDigis().size() << " BMON = " << results->BmonDigis().size() //
154 << " TRD = " << results->TrdDigis().size() << " TRD2D=" << results->Trd2dDigis().size() //
155 << " RICH=" << results->RichDigis().size();
157 // << " PSD=" << results->StsDigis().size() << " FSD=" << results->StsDigis().size();
158
159 fTsEventHeader->SetTsIndex(results->TsIndex());
160 fTsEventHeader->SetTsStartTime(results->TsStartTime());
161
162 fTimeslice->SetStartTime(results->TsStartTime());
163
164 std::move(results->BmonDigis().begin(), results->BmonDigis().end(), std::back_inserter(*fBmonDigis));
165 std::move(results->StsDigis().begin(), results->StsDigis().end(), std::back_inserter(*fStsDigis));
166 std::move(results->MuchDigis().begin(), results->MuchDigis().end(), std::back_inserter(*fMuchDigis));
167 std::move(results->Trd2dDigis().begin(), results->Trd2dDigis().end(), std::back_inserter(*fTrdDigis));
168 std::move(results->TrdDigis().begin(), results->TrdDigis().end(), std::back_inserter(*fTrdDigis));
169 std::move(results->TofDigis().begin(), results->TofDigis().end(), std::back_inserter(*fTofDigis));
170 std::move(results->RichDigis().begin(), results->RichDigis().end(), std::back_inserter(*fRichDigis));
171
172 // Time-sort the TRD vector as we merged TRD1D and TRD2D (needed for compatibility with legacy unpackers)
174
175 // Update counters
176 fNumTs++;
177
178 return 0;
179}
180// ----------------------------------------------------------------------------
181
182
ClassImp(CbmConverterManager)
Source class for reading from files resulting from online processing (containing raw Digis)
std::vector< CbmStsDigi > * fStsDigis
std::vector< CbmBmonDigi > * fBmonDigis
virtual void Close()
Close source after end of run.
CbmSourceDigiTimeslice(const char *fileName="")
Constructor.
Bool_t RegisterVector(FairRootManager *ioman, std::vector< TVecobj > *&vec)
std::vector< CbmTofDigi > * fTofDigis
Int_t ReadEvent(UInt_t=0)
Read one time slice from file.
std::enable_if< std::is_member_function_pointer< decltype(&TVecobj::GetTime)>::value, void >::type Timesort(std::vector< TVecobj > *vec=nullptr)
std::vector< CbmMuchDigi > * fMuchDigis
std::vector< CbmRichDigi > * fRichDigis
std::vector< CbmTrdDigi > * fTrdDigis
CbmTsEventHeader * fTsEventHeader
virtual Bool_t Init()
Initialisation.
std::unique_ptr< cbm::algo::RecoResultsInputArchive > fArchive
Bookkeeping of time-slice content.
void SetStartTime(double time)
Set start time.
void SetTsStartTime(uint64_t value)
Set the Ts Start Time.
void SetTsIndex(uint64_t value)
Set the Ts Start Time.