292 std::stringstream msg{};
297 constexpr char indentCh =
'\t';
298 std::string indent(indentLevel, indentCh);
303 msg <<
" ----- CA parameters list -----\n";
305 msg << indent << indentCh <<
"Bits to code one station: " << constants::size::StationBits <<
'\n';
306 msg << indent << indentCh <<
"Bits to code one triplet: " << constants::size::TripletBits <<
'\n';
307 msg << indent << indentCh <<
"Max number of detectors: " << constants::size::MaxNdetectors <<
'\n';
308 msg << indent << indentCh <<
"Max number of stations: " << constants::size::MaxNstations <<
'\n';
309 msg << indent << indentCh <<
"Max number of triplets: " << constants::size::MaxNtriplets <<
'\n';
311 msg << indent << indentCh <<
"Random seed: " << fRandomSeed <<
'\n';
312 msg << indent << indentCh <<
"Max number of doublets per singlet: " << fMaxDoubletsPerSinglet <<
'\n';
313 msg << indent << indentCh <<
"Max number of triplets per doublet: " << fMaxTripletPerDoublets <<
'\n';
314 msg << indent << indentCh <<
"Ghost suppression: " << fGhostSuppression <<
'\n';
319 msg << indent << indentCh << indentCh <<
"Position:\n";
320 for (
int dim = 0; dim < 3 ; ++dim) {
321 msg << indent << indentCh << indentCh << indentCh << char(120 + dim) <<
" = "
322 << kfutils::simd::Cast<DataT, float>(fTargetPos[dim], 0) <<
" cm\n";
325 msg << indent << indentCh << indentCh <<
"Target field:\n";
326 msg << indent << indentCh << indentCh << indentCh
327 <<
"Bx = " << kfutils::simd::Cast<DataT, float>(fVertexFieldValue.GetBx(), 0) <<
" Kg\n";
328 msg << indent << indentCh << indentCh << indentCh
329 <<
"By = " << kfutils::simd::Cast<DataT, float>(fVertexFieldValue.GetBy(), 0) <<
" Kg\n";
330 msg << indent << indentCh << indentCh << indentCh
331 <<
"Bz = " << kfutils::simd::Cast<DataT, float>(fVertexFieldValue.GetBz(), 0) <<
" Kg\n";
335 msg << indent << indentCh << indentCh <<
"Number of stations (Geometry): ";
336 for (
int iDet = 0; iDet < constants::size::MaxNdetectors; ++iDet) {
337 msg << setw(2) << this->GetNstationsGeometry(
static_cast<EDetectorID>(iDet)) <<
' ';
339 msg <<
" | total = " << setw(2) << this->GetNstationsGeometry();
341 msg << indent << indentCh << indentCh <<
"Number of stations (Active): ";
342 for (
int iDet = 0; iDet < constants::size::MaxNdetectors; ++iDet) {
343 msg << setw(2) << setfill(
' ') << this->GetNstationsActive(
static_cast<EDetectorID>(iDet)) <<
' ';
345 msg <<
" | total = " << setw(2) << this->GetNstationsActive();
346 msg <<
'\n' << indent << indentCh << indentCh <<
clrs::CL <<
"Geometry station indices: ";
347 for (
int iStGeo = 0; iStGeo < this->GetNstationsGeometry(); ++iStGeo) {
348 bool isActive = fvGeoToActiveMap[iStGeo] != -1;
349 msg << ClrFlg(isActive) << setw(3) << setfill(
' ') << iStGeo <<
' ';
351 msg <<
'\n' << indent << indentCh << indentCh <<
clrs::CL <<
"Local station indices: ";
352 for (
int iStGeo = 0; iStGeo < this->GetNstationsGeometry(); ++iStGeo) {
353 bool isActive = fvGeoToActiveMap[iStGeo] != -1;
354 msg << ClrFlg(isActive) << setw(3) << setfill(' ') << static_cast<int>(fvGeoToLocalIdMap[iStGeo].second) <<
' ';
356 msg <<
'\n' << indent << indentCh << indentCh <<
clrs::CL <<
"Detector indices: ";
357 for (
int iStGeo = 0; iStGeo < this->GetNstationsGeometry(); ++iStGeo) {
358 bool isActive = fvGeoToActiveMap[iStGeo] != -1;
359 msg << ClrFlg(isActive) << setw(3) << setfill(' ') << static_cast<int>(fvGeoToLocalIdMap[iStGeo].
first) <<
' ';
361 msg <<
'\n' << indent << indentCh << indentCh <<
clrs::CL <<
"Active station indices: ";
362 for (
int iStGeo = 0; iStGeo < this->GetNstationsGeometry(); ++iStGeo) {
363 bool isActive = fvGeoToActiveMap[iStGeo] != -1;
364 msg << ClrFlg(isActive) << setw(3) << setfill(
' ') << fvGeoToActiveMap[iStGeo] <<
' ';
369 msg << indent << indentCh << setw(9) <<
"Active ID" <<
' ';
370 msg << fStations[0].ToString(1, 0,
true) <<
'\n';
371 for (
int iStAct = 0; iStAct < this->GetNstationsActive(); ++iStAct) {
372 msg << indent << indentCh << setw(9) << iStAct <<
' ';
373 msg << fStations[iStAct].ToString(verbosity, 0) <<
'\n';
376 msg << indent << indentCh <<
clrs::CLb <<
"MISALIGNMENT TOLERANCES:\n" <<
clrs::CL;
377 msg << indent << indentCh;
378 msg << setw(9) <<
"Active ID";
379 msg << setw(9) <<
"dx[cm]";
380 msg << setw(9) <<
"dy[cm]";
381 msg << setw(9) <<
"dt[ns]" <<
'\n';
383 for (
int iDet = 0; iDet < constants::size::MaxNdetectors; ++iDet) {
384 for (
int iStLocal = 0; iStLocal < this->GetNstationsGeometry(
static_cast<EDetectorID>(iDet)); ++iStLocal) {
385 int iStActive = this->GetStationIndexActive(iStLocal,
static_cast<EDetectorID>(iDet));
389 msg << indent << indentCh;
390 msg << setw(9) << iStActive;
391 msg << setw(9) << fMisalignmentX[iDet];
392 msg << setw(9) << fMisalignmentY[iDet];
393 msg << setw(9) << fMisalignmentT[iDet] <<
'\n';
398 msg << indent << indentCh <<
"Hits search area is ignored: " << fDevIsIgnoreHitSearchAreas <<
'\n';
399 msg << indent << indentCh <<
"Non-approx. field is used: " << fDevIsMatchDoubletsViaMc <<
'\n';
400 msg << indent << indentCh <<
"Doublets matching via MC: " << fDevIsMatchDoubletsViaMc <<
'\n';
401 msg << indent << indentCh <<
"Triplets matching via MC: " << fDevIsMatchTripletsViaMc <<
'\n';
402 msg << indent << indentCh <<
"Extend tracks with MC matching: " << fDevIsExtendTracksViaMc <<
'\n';
403 msg << indent << indentCh <<
"Overlap hits matching via MC: " << fDevIsSuppressOverlapHitsViaMc <<
'\n';
404 msg << indent << indentCh <<
"Use hit search windows: " << fDevIsParSearchWUsed <<
'\n';
406 if (fDevIsParSearchWUsed) {
407 msg << indent <<
"SEARCH WINDOWS:\n";
408 for (
int iSt = 1; iSt < fNstationsActiveTotal; ++iSt) {
409 for (
int iIter = 0; iIter < (int) fCAIterations.size(); ++iIter) {
410 msg << indent <<
"- station: " << iSt <<
", iteration: " << iIter <<
'\n';
411 msg << GetSearchWindow(iSt, iIter).ToString() <<
'\n';