BmnRoot 26.10.0-18-g4e3414f9
Software framework of the BM@N experiment
Loading...
Searching...
No Matches
expdataNN.C
Go to the documentation of this file.
1/*
2 BM@N alignment routine
3 BM@N experiment at NICA complex, JINR, 2025
4
5 Department: Math & Soft Group of HEP lab
6 Author: Igor Polev, polev@jinr.ru
7
8 ROOT data export macro for NN alignment of each detector element.
9 Exports hits for each detector element into individual CSV files.
10 For each track computes best-fit straight line through all its hits
11 and stores the line coefficients alongside hit data.
12
13 Line fit model (independent fits in xz and yz planes):
14 x = xA + xB * z
15 y = yA + yB * z
16 Ordinary least squares, minimizing residuals in x and y.
17*/
18
19#ifndef __CLING__
20#include "BmnRootIterator.h"
21#include "BmnRun8cgDetModel.h"
22#include "BmnSimpleProgressBar.h"
23#include "TStopwatch.h"
24
25#include <fstream>
26#include <map>
27#include <string>
28#include <vector>
29#endif
30
31#define BMN_IN_FILELIST "../cfg/dst7466noa-full.txt"
32#define BMN_EXPORT_PREFIX "/home/igor/DATA/bmn/nn/data_det"
33
34int expdataNN(int argc = 0, char** argv = nullptr)
35{
36 TStopwatch timer;
37
38 // prepare ROOT file readers
39 BmnRun8cgDetModel detModel;
40 detModel.Init();
42 BmnRootIterator data(BMN_IN_FILELIST, detModel, &pb);
43
44 std::cout << "Exporting data defined in " << BMN_IN_FILELIST << std::endl;
45 std::cout << data.GetTotalEvents() << " total events to process" << std::endl;
46 std::cout << detModel.Alignables() << " detector elements expected" << std::endl;
47
48 // per-detectorID output files and hit counters (opened on first use)
49 std::map<Int_t, std::ofstream*> files;
50 std::map<Int_t, Int_t> detHitCnt;
51
52 auto GetFile = [&](Int_t detID) -> std::ofstream& {
53 auto it = files.find(detID);
54 if (it != files.end())
55 return *(it->second);
56 std::string name = std::string(BMN_EXPORT_PREFIX) + std::to_string(detID) + ".csv";
57 auto* f = new std::ofstream(name, std::ofstream::out);
58 *f << "x,y,z,xA,xB,yA,yB\n";
59 files[detID] = f;
60 detHitCnt[detID] = 0;
61 return *f;
62 };
63
64 // process ROOT data
65 Int_t trackID{0}, hitCnt{0};
66 struct HitRec
67 {
68 Int_t detID;
69 Double_t x, y, z;
70 };
71
72 pb.Init();
73 data.ResetAll();
74 while (!data.EndOfTracks()) {
75
76 // accumulate regression sums and collect hits in one pass
77 Double_t xSum{0.0}, ySum{0.0}, zSum{0.0}, z2Sum{0.0}, zxSum{0.0}, zySum{0.0};
78 std::vector<HitRec> hits;
79 hits.reserve(data.HitsInTrack());
80
81 while (!data.EndOfHits()) {
82 hits.push_back({data.HitDetectorID(), data.HitX(), data.HitY(), data.HitZ()});
83 xSum += data.HitX();
84 ySum += data.HitY();
85 zSum += data.HitZ();
86 z2Sum += data.HitZ() * data.HitZ();
87 zxSum += data.HitZ() * data.HitX();
88 zySum += data.HitZ() * data.HitY();
89 data.NextHit();
90 }
91
92 // linear regression fit
93 Double_t n{static_cast<Double_t>(data.HitsInTrack())}, factor{1.0 / (n * z2Sum - zSum * zSum)},
94 xA{(xSum * z2Sum - zSum * zxSum) * factor}, yA{(ySum * z2Sum - zSum * zySum) * factor},
95 xB{(n * zxSum - zSum * xSum) * factor}, yB{(n * zySum - zSum * ySum) * factor};
96
97 // write each hit to its detector file
98 for (const auto& h : hits) {
99 std::ofstream& f = GetFile(h.detID);
100 f << h.x << "," << h.y << "," << h.z << "," << xA << "," << xB << "," << yA << "," << yB << "\n";
101 detHitCnt[h.detID]++;
102 hitCnt++;
103 }
104
105 trackID++;
106 data.NextTrack();
107 }
108 pb.Clear();
109
110 // close all output files
111 for (auto& kv : files) {
112 kv.second->close();
113 delete kv.second;
114 }
115
116 std::cout << "Tracks exported: " << trackID << std::endl;
117 std::cout << "Hits exported: " << hitCnt << std::endl;
118 std::cout << "Output files: " << files.size() << std::endl;
119
120 if (files.size() != detModel.Alignables())
121 std::cout << "WARNING! Files count does not match detector count:"
122 << " some data may be missing!" << std::endl;
123 for (const auto& kv : detHitCnt)
124 std::cout << " det ID " << std::setw(10) << kv.first << " : " << std::setw(10) << kv.second << " hits\n";
125
126 // no memory cleanup in ROOT macro mode
127 std::cout << "Done in " << timer.RealTime() << "s" << std::endl;
128 return 0;
129}
int Int_t
double Double_t
Bool_t EndOfTracks() const noexcept
Bool_t EndOfHits() const noexcept
virtual Double_t HitY() const override
virtual void ResetAll() override
virtual Int_t HitDetectorID() const override
virtual Double_t HitZ() const override
virtual Double_t HitX() const override
virtual Int_t HitsInTrack() const override
Long64_t GetTotalEvents() const noexcept
virtual void NextTrack() override
virtual void NextHit() override
virtual Int_t Alignables() const noexcept override
Double_t RealTime()
int expdataNN(int argc=0, char **argv=nullptr)
Definition expdataNN.C:34
#define BMN_EXPORT_PREFIX
Definition expdataNN.C:32
#define BMN_IN_FILELIST
Definition expdataNN.C:31
*brief user defined string literal for JSON values *sa std::size_t n
Definition json.hpp:20362