BmnRoot
Loading...
Searching...
No Matches
BmnSiBTStationSet.cxx
Go to the documentation of this file.
1#include "BmnSiBTStationSet.h"
2// STL
3#include <fstream>
4// Nlohmann
5#include <nlohmann/json.hpp>
6
8
10 : NStations(0)
11 , XStationPositions(NULL)
12 , YStationPositions(NULL)
13 , ZStationPositions(NULL)
14 , Stations(NULL)
15{}
16
17BmnSiBTStationSet::BmnSiBTStationSet(TString xml_config_file, map<Int_t, TVector3>* shifts)
18 : NStations(0)
19 , XStationPositions(NULL)
20 , YStationPositions(NULL)
21 , ZStationPositions(NULL)
22 , Stations(NULL)
23 , fStatShifts(shifts)
24{
25
26 Bool_t create_status = CreateConfigurationFromXMLFile(xml_config_file);
27 if (!create_status) {
28 std::cerr << "Error: There are problems with creation of the configuration from XML (in BmnSiBTStationSet)\n";
29 throw(StationSet_Exception("Error in the constructor BmnSiBTStationSet()"));
30 }
31}
32
34{
35
37 delete[] XStationPositions;
38 XStationPositions = NULL;
39 }
41 delete[] YStationPositions;
42 YStationPositions = NULL;
43 }
45 delete[] ZStationPositions;
46 ZStationPositions = NULL;
47 }
48
49 for (Int_t i = 0; i < NStations; i++) {
50 if (Stations[i]) {
51 delete Stations[i];
52 Stations[i] = NULL;
53 }
54 }
55 NStations = 0;
56
57 if (Stations) {
58 delete[] Stations;
59 Stations = NULL;
60 }
61}
62
63Double_t BmnSiBTStationSet::GetXStationPosition(Int_t station_num)
64{
65 if (XStationPositions && station_num >= 0 && station_num < NStations) {
66 return XStationPositions[station_num];
67 } else {
68 throw(StationSet_Exception("Error in the function GetXStationPosition()"));
69 }
70}
71
72Double_t BmnSiBTStationSet::GetYStationPosition(Int_t station_num)
73{
74 if (YStationPositions && station_num >= 0 && station_num < NStations) {
75 return YStationPositions[station_num];
76 } else {
77 throw(StationSet_Exception("Error in the function GetYStationPosition()"));
78 }
79}
80
81Double_t BmnSiBTStationSet::GetZStationPosition(Int_t station_num)
82{
83 if (ZStationPositions && station_num >= 0 && station_num < NStations) {
84 return ZStationPositions[station_num];
85 } else {
86 throw(StationSet_Exception("Error in the function GetZStationPosition()"));
87 }
88}
89
91{
92 if (Stations && station_num >= 0 && station_num < NStations) {
93 return Stations[station_num];
94 } else {
95 throw(StationSet_Exception("Error in the function GetStation()"));
96 }
97}
98
100{
101 for (Int_t istation = 0; istation < NStations; ++istation) {
102 Stations[istation]->Reset();
103 }
104}
105
107 Double_t ycoord,
108 Double_t zcoord,
109 Double_t px,
110 Double_t py,
111 Double_t pz,
112 Double_t dEloss,
113 Int_t refID)
114{
115
116 Int_t station = GetPointStationOwnership(xcoord, ycoord, zcoord);
117
118 if (station != -1) {
119 if (Stations[station]->AddPointToStation(xcoord, ycoord, zcoord, px, py, pz, dEloss, refID) != -1)
120 return true;
121 else
122 return false;
123 }
124 return false;
125}
126
128{
129 Int_t points_sum = 0;
130 for (Int_t iStation = 0; iStation < NStations; iStation++) {
131 points_sum += Stations[iStation]->CountNAddedToStationPoints();
132 }
133 return points_sum;
134}
135
137{
138 for (Int_t iStation = 0; iStation < NStations; iStation++) {
139 Stations[iStation]->ProcessPointsInStation();
140 }
141}
142
144{
145 Int_t points_sum = 0;
146 for (Int_t iStation = 0; iStation < NStations; iStation++) {
147 points_sum += Stations[iStation]->CountNProcessedPointInStation();
148 }
149 return points_sum;
150}
151
153{
154 // for z-positions and z-shifts of all modules in a station
155 for (Int_t iStation = 0; iStation < NStations; iStation++) {
156 Int_t NModules = Stations[iStation]->GetNModules();
157 for (Int_t iModule = 0; iModule < NModules; ++iModule) {
158 if (Stations[iStation]->GetModule(iModule)->IsPointInsideZThickness(zcoord)) {
159 return iStation;
160 }
161 }
162 }
163 return -1;
164}
165
166Int_t BmnSiBTStationSet::GetPointStationOwnership(Double_t xcoord, Double_t ycoord, Double_t zcoord)
167{
168 // for z-positions and z-shifts of all modules in a station
169 for (Int_t iStation = 0; iStation < NStations; iStation++) {
170 Int_t NModules = Stations[iStation]->GetNModules();
171 for (Int_t iModule = 0; iModule < NModules; ++iModule) {
172 // if( Stations[iStation]->GetModule(iModule)->IsPointInsideZThickness(zcoord) ) {
173 if (Stations[iStation]->GetModule(iModule)->IsPointInsideModule(xcoord, ycoord, zcoord)) {
174 return iStation;
175 }
176 }
177 }
178 return -1;
179}
180
181Bool_t BmnSiBTStationSet::CreateConfigurationFromXMLFile(TString xml_config_file)
182{
183 TDOMParser* parser = new TDOMParser();
184 parser->SetValidate(false);
185
186 Int_t parse_status = parser->ParseFile(xml_config_file);
187 if (parse_status != 0) {
188 std::cerr << "Error: An error occured when parsing the file! (in BmnSiBTStationSet)\n";
189 return false;
190 }
191
192 TXMLNode* node = parser->GetXMLDocument()->GetRootNode();
193
194 if (strcmp(node->GetNodeName(), "StationSet") != 0) {
195 std::cerr << "Error: Incorrect name of the root element! (in BmnSiBTStationSet)\n";
196 return false;
197 }
198
199 NStations = CountNumberOfStations(node);
200
202 XStationPositions = new Double_t[NStations];
203 YStationPositions = new Double_t[NStations];
204 ZStationPositions = new Double_t[NStations];
205
206 // default values
207 for (Int_t i = 0; i < NStations; ++i) {
208 Stations[i] = 0; // zero-pointer
209 XStationPositions[i] = 0.0;
210 YStationPositions[i] = 0.0;
211 ZStationPositions[i] = 0.0;
212 }
213
214 node = node->GetChildren();
215 Int_t currentStationNum = 0;
216 while (node) {
217 if (strcmp(node->GetNodeName(), "Station") == 0) {
218 Bool_t b_parse_status = ParseStation(node, currentStationNum);
219 if (!b_parse_status)
220 return false;
221 currentStationNum++;
222 }
223 node = node->GetNextNode();
224 }
225
226 delete parser;
227
228 return true;
229}
230
231Int_t BmnSiBTStationSet::CountNumberOfStations(TXMLNode* node)
232{
233 Int_t station_cnt = 0;
234 node = node->GetChildren();
235 while (node) {
236 if (strcmp(node->GetNodeName(), "Station") == 0) {
237 station_cnt++;
238 }
239 node = node->GetNextNode();
240 }
241 return station_cnt;
242}
243
244Bool_t BmnSiBTStationSet::ParseStation(TXMLNode* node, Int_t iStation)
245{
246
247 if (node->HasAttributes()) {
248 TList* attrList = node->GetAttributes();
249 TXMLAttr* attr = 0;
250 TIter next(attrList);
251
252 while ((attr = (TXMLAttr*)next()) != nullptr) {
253 if (strcmp(attr->GetName(), "xPosition") == 0) {
254 XStationPositions[iStation] = -atof(attr->GetValue()); // inverted
255 }
256 if (strcmp(attr->GetName(), "yPosition") == 0) {
257 YStationPositions[iStation] = atof(attr->GetValue());
258 }
259 if (strcmp(attr->GetName(), "zPosition") == 0) {
260 ZStationPositions[iStation] = atof(attr->GetValue());
261 }
262 }
263 }
264
265 Double_t dx = 0.;
266 Double_t dy = 0.;
267 Double_t dz = 0.;
268
269 if (fStatShifts)
270 for (auto it : *fStatShifts) {
271 Int_t stat = it.first;
272 if (iStation == stat) {
273 dx = it.second.X();
274 dy = it.second.Y();
275 dz = it.second.Z();
276 break;
277 }
278 }
279
280 Stations[iStation] = new BmnSiBTStation(node, iStation, XStationPositions[iStation] + dx,
281 YStationPositions[iStation] + dy, ZStationPositions[iStation] + dz);
282
283 return true;
284}
285
286unique_ptr<BmnSiBTStationSet> BmnSiBTStationSet::Create(Int_t period, Int_t stp)
287{
288 TString gPathConfig = getenv("VMCWORKDIR");
289 std::ifstream f(gPathConfig + "/config/bmnconf.json");
290 json data = json::parse(f);
291 json jss = data["Detectors"]["sibt"]["StationSet"];
292 TString conf_subdir = jss.value("Dir", "");
293 json xmlConfFileNameJ = jss[to_string(stp).c_str()];
294 TString xmlConfFileName = jss["Setup"][to_string(stp).c_str()]["Period"].value(to_string(period).c_str(), "");
295 TString gPathCscConfig = gPathConfig + "/" + conf_subdir + "/";
296 return std::make_unique<BmnSiBTStationSet>(gPathCscConfig + xmlConfFileName);
297}
const int NStations
Definition L1AlgoPulls.h:9
int i
Definition P4_F32vec4.h:22
float f
Definition P4_F32vec4.h:21
Bool_t AddPointToDetector(Double_t xcoord, Double_t ycoord, Double_t zcoord, Double_t px, Double_t py, Double_t pz, Double_t dEloss, Int_t refID)
Double_t GetXStationPosition(Int_t station_num)
Double_t GetYStationPosition(Int_t station_num)
Int_t GetPointStationOwnership(Double_t zcoord)
Double_t GetZStationPosition(Int_t station_num)
Double_t * ZStationPositions
y-position of each station [array]
map< Int_t, TVector3 > * fStatShifts
Stations [array].
Int_t CountNProcessedPointsInDetector()
Double_t * YStationPositions
x-position of each station [array]
BmnSiBTStation ** Stations
z-position of each station [array]
Double_t * XStationPositions
BmnSiBTStation * GetStation(Int_t station_num)
static unique_ptr< BmnSiBTStationSet > Create(Int_t period, Int_t stp=0)
void ProcessPointsInStation()
Int_t CountNAddedToStationPoints()
Int_t CountNProcessedPointInStation()
a class to store JSON values
Definition json.hpp:17282
ValueType value(const typename object_t::key_type &key, const ValueType &default_value) const
access specified object element with default value
Definition json.hpp:19319
static JSON_HEDLEY_WARN_UNUSED_RESULT basic_json parse(InputType &&i, const parser_callback_t cb=nullptr, const bool allow_exceptions=true, const bool ignore_comments=false)
deserialize from a compatible input
Definition json.hpp:20814
basic_json<> json
default specialization
Definition json.hpp:3337