R3BROOT
R3B analysis software
Loading...
Searching...
No Matches
R3BNeulandMapToCalParTask.cxx
Go to the documentation of this file.
2#include "R3BException.h"
4#include "R3BNeulandCommon.h"
6#include "R3BShared.h"
7#include <FairParRootFileIo.h>
8#include <FairRootManager.h>
9#include <FairRun.h>
10#include <FairRuntimeDb.h>
11#include <R3BLogger.h>
12#include <TDirectory.h>
13#include <fmt/core.h>
14#include <string_view>
15#include <utility>
16
17namespace
18{
19 template <typename EngineType, typename... Args>
20 void FillEngine(EngineType& engine, R3B::FTType type, unsigned int ftValue, Args&&... args)
21 {
22 engine.Fill(type, ftValue, std::forward<Args>(args)...);
23 }
24} // namespace
25
26namespace R3B::Neuland
27{
28 Map2CalParTask::Map2CalParTask(std::string_view name, int iVerbose)
29 : CalibrationTask(name.data(), iVerbose)
30 {
31 cal_strategy_.Set_cycle_period(1000. / coarse_time_frequency_);
32 }
33
35 : Map2CalParTask("NeulandMapToCalParTask", 1)
36 {
37 }
38
39 void Map2CalParTask::ExtraInit(FairRootManager* /*rootMan*/)
40 {
41 mappedData_.init();
43 {
44 trigMappedData_.init();
46 {
47 R3BLOG(info, "TrigIDMap is automatically determined!");
48 }
49 else
50 {
51 R3BLOG(info, "TrigIDMap is read from the base par file!");
52 // trigIDMappingFinder_.set_trigIDMap(base_par_->GetTrigIDMap());
53 }
54 }
55
56 plane_num_ = GetBasePar()->get_num_of_planes();
57 calibrationPar_->SetTrigEnabled(is_trig_enabled_);
58 // trigIDIO.SetNumOfModule(plane_num_ * BarsPerPlane);
59 }
60
62 {
65 {
68 {
70 }
71 }
72 }
73
79
81 {
82 for (const auto& planeSignals : mappedData_)
83 {
84 auto planeNum = planeSignals.plane_num;
85 for (const auto& [barID, barSignals] : planeSignals.bars)
86 {
87 auto moduleID = Neuland_PlaneBar2ModuleNum(planeNum, barID);
88 for (const auto& [trigID, trigSignal] : trigMappedData_)
89 {
90 trigIDMappingFinder_.add_id_pair(
91 std::make_pair(moduleID, trigID), Side::left, barSignals.left.size());
92 trigIDMappingFinder_.add_id_pair(
93 std::make_pair(moduleID, trigID), Side::right, barSignals.right.size());
94 }
95 }
96 }
97 }
98
100 {
101 for (const auto& planeSignals : mappedData_)
102 {
103 auto planeID = planeSignals.plane_num;
104 for (const auto& [barNum, barSignals] : planeSignals.bars)
105 {
106 auto barNum_tmp = barNum;
107 R3BLOG(debug,
108 fmt::format("Calibrating with the map-level bar signal: {}, barNum: {}", barSignals, barNum));
109 auto FillData = [&](FTType type, auto value)
110 { FillEngine(mapCalEngine_, type, value, planeID, barNum_tmp); };
111 for (const auto& signal : barSignals.left)
112 {
113 FillData(FTType::leftleading, signal.leading.fine);
114 FillData(FTType::lefttrailing, signal.trailing.fine);
115 }
116 for (const auto& signal : barSignals.right)
117 {
118 FillData(FTType::rightleading, signal.leading.fine);
119 FillData(FTType::righttrailing, signal.trailing.fine);
120 }
121 }
122 }
123 }
124
126 {
127 for (const auto& [moduleNum, moduleSignals] : trigMappedData_)
128 {
129 R3BLOG(debug,
130 fmt::format("Calibrating with the map-level bar trig signal: {}, module num: {}",
131 moduleSignals.signal,
132 moduleNum));
133 FillEngine(trigMapCalEngine_, FTType::trigger, moduleSignals.signal.fine, moduleNum);
134 }
135 }
136
138 {
139 R3BLOG(debug, "Starting to write calibration parameter...");
140 mapCalEngine_.Writer_to_TCalPar(cal_strategy_, *calibrationPar_);
141 if (is_trigID_auto_)
142 {
143 GetBasePar()->set_trig_id_map(trigIDMappingFinder_.extract_trigIDMap());
144 }
145 calibrationPar_->SetSlowClockFrequency(coarse_time_frequency_);
146
148 R3BLOG(debug, "Calibration parameter written complete.");
149 }
150
152 {
153 auto old_dir = gDirectory;
154 auto* runDb = FairRuntimeDb::instance();
155 if (auto* parRootFileIo = dynamic_cast<FairParRootFileIo*>(runDb->getOutput()); parRootFileIo != nullptr)
156 {
157 auto* parRootFile = parRootFileIo->getParRootFile();
158 if (!parRootFile->IsOpen() || !parRootFile->IsWritable())
159 {
160 throw R3B::runtime_error("parRootFile is either closed or unable to be written!");
161 }
162 parRootFile->cd();
163 auto* new_dir = gDirectory->mkdir("CalParHistograms", "", true);
164 if (new_dir == nullptr)
165 {
166 throw R3B::runtime_error("Cannot create a directory for the histrogams!");
167 }
168 mapCalEngine_.WriteHist2File(new_dir);
170 {
171 trigMapCalEngine_.WriteHist2File(new_dir);
172 }
173 old_dir->cd();
174 }
175 else
176 {
177 throw R3B::runtime_error("unable to obtain the FairParRootFileIo object!");
178 }
179 }
180
181 // void Map2CalParTask::PrintTrigID() const
182 // {
183 // if (calibrationPar_ == nullptr)
184 // {
185 // throw R3B::runtime_error("Cannot print trigIDMapping from a nullptr parameter!");
186 // }
187
188 // const auto& trigID = base_par_->GetTrigIDMap();
189 // if (is_trigID_auto_)
190 // {
191 // trigIDIO.Save_json(trigID);
192 // }
193 // trigIDIO.Print(trigID);
194 // }
195} // namespace R3B::Neuland
#define R3BLOG(severity, x)
Definition R3BLogger.h:32
InputVectorConnector< PaddleTamexMappedData > mappedData_
InputMapConnector< unsigned int, PaddleTamexTrigMappedData > trigMappedData_
calibration::FTEngine< calibration::PlaneCal > mapCalEngine_
void ExtraInit(FairRootManager *rootMan) override
calibration::FTCalStrategy cal_strategy_
calibration::FTEngine< calibration::ModuleCal > trigMapCalEngine_
Simulation of NeuLAND Bar/Paddle.
constexpr auto Neuland_PlaneBar2ModuleNum(unsigned int planeNum, unsigned int barNum) -> unsigned int