BmnRoot
26.10.0-18-g4e3414f9
Software framework of the BM@N experiment
Toggle main menu visibility
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
34
int
expdataNN
(
int
argc = 0,
char
** argv =
nullptr
)
35
{
36
TStopwatch
timer;
37
38
// prepare ROOT file readers
39
BmnRun8cgDetModel
detModel;
40
detModel.
Init
();
41
BmnSimpleProgressBar
pb;
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_t
int Int_t
Double_t
double Double_t
TStopwatch.h
BmnDataIterator::EndOfTracks
Bool_t EndOfTracks() const noexcept
Definition
BmnDataIterator.h:39
BmnDataIterator::EndOfHits
Bool_t EndOfHits() const noexcept
Definition
BmnDataIterator.h:40
BmnDetectorModel::Init
Bool_t Init()
Definition
BmnDetectorModel.h:56
BmnRootIterator
Definition
BmnRootIterator.h:29
BmnRootIterator::HitY
virtual Double_t HitY() const override
Definition
BmnRootIterator.cxx:181
BmnRootIterator::ResetAll
virtual void ResetAll() override
Definition
BmnRootIterator.cxx:93
BmnRootIterator::HitDetectorID
virtual Int_t HitDetectorID() const override
Definition
BmnRootIterator.cxx:211
BmnRootIterator::HitZ
virtual Double_t HitZ() const override
Definition
BmnRootIterator.cxx:188
BmnRootIterator::HitX
virtual Double_t HitX() const override
Definition
BmnRootIterator.cxx:174
BmnRootIterator::HitsInTrack
virtual Int_t HitsInTrack() const override
Definition
BmnRootIterator.cxx:219
BmnRootIterator::GetTotalEvents
Long64_t GetTotalEvents() const noexcept
Definition
BmnRootIterator.h:54
BmnRootIterator::NextTrack
virtual void NextTrack() override
Definition
BmnRootIterator.cxx:128
BmnRootIterator::NextHit
virtual void NextHit() override
Definition
BmnRootIterator.cxx:163
BmnRun8cgDetModel
Definition
BmnRun8cgDetModel.h:26
BmnRun8cgDetModel::Alignables
virtual Int_t Alignables() const noexcept override
Definition
BmnRun8cgDetModel.cxx:41
BmnSimpleProgressBar
Definition
BmnSimpleProgressBar.h:20
BmnSimpleProgressBar::Init
void Init()
Definition
BmnSimpleProgressBar.h:42
BmnSimpleProgressBar::Clear
void Clear()
Definition
BmnSimpleProgressBar.h:36
TStopwatch
TStopwatch::RealTime
Double_t RealTime()
expdataNN
int expdataNN(int argc=0, char **argv=nullptr)
Definition
expdataNN.C:34
BMN_EXPORT_PREFIX
#define BMN_EXPORT_PREFIX
Definition
expdataNN.C:32
BMN_IN_FILELIST
#define BMN_IN_FILELIST
Definition
expdataNN.C:31
n
*brief user defined string literal for JSON values *sa std::size_t n
Definition
json.hpp:20362
align_new
nn
expdataNN.C
Generated on
for BmnRoot by
1.17.0