|
BmnRoot 26.10.0-18-g4e3414f9
Software framework of the BM@N experiment
|
New implementation of the global alignment of the BM@N tracking detectors (Math & Soft Group of the HEP lab, 2025). The alignment parameters (shifts of the detector elements) are obtained by a simultaneous fit of the local track parameters and the global alignment parameters on a set of tracks. The older Millepede-based alignment is in alignment.
| Directory / file | Description |
|---|---|
| src | Classes of the alignment: algorithm, detector and measurement models, data readers, application of the results |
| nn | Alternative solution of the alignment problem by neural network training techniques (PyTorch) |
| cfg | Configuration files: detector lists, constraints, start approximations and solutions, input file lists |
| align.C | Main macro: runs the alignment on reconstructed data (or on a test detector model) and writes the solution |
| expdata.C | Exports the hits of the selected tracks of the experimental data into a CSV file |
| review.C, compareA.C | Draw the results of the alignment and compare alignment solutions |
| run_reco_bmn.C | Reconstruction macro with the application of the alignment corrections |
| measurement_model.tex | Description of the measurement model (LaTeX) |
| deprecated/CMakeLists.txt.standalone | Old standalone build file |
The classes are built into the BmnAligner library; the ROOT dictionary is defined in BmnAlignerLinkDef.h.
Algorithm is based on the article Volker Blobel, Claus Kleinwort. "A New Method for the High-Precision Alignment of Track Detectors", which is referred below as VBCK.
All implemented math is found in BmnAligner.cxx. Calculations itself are marked by comments "calculations". Detailed explanations are given below.
In case of correction on x, y and z according to _VBCK_(13)
on i-th iteration we have for every hit:
x = a_1 * (-1) + a_3 * alpha_2i + alpha_1 * 1 + alpha_2 * z
y = a_2 * (-1) + a_3 * alpha_2i + alpha_1 * 1 + alpha_2 * z
where:
a_1 = delta_x |
a_2 = delta_y | for the given detector
a_3 = delta_z |
alpha_1 |
alpha_2 | (local) parameters of linear trajectory approximation
alpha_2i | (constant) i-th approximations of alpha_2
thus in _VBCK_(12) we have (see matrix structure below):
| -1 : j = 1 | C matrix components
| 0 : j = 2 | for each detector index
| alpha_2i : j = 3 | when x is measured
|
| 0 : j = 1 | C matrix components
delta_jk = | -1 : j = 2 | for each detector index
| alpha_2i : j = 3 | when y is measured
|
| 1 : j = 1 | Gamma matrixes components
| z : j = 2 | for each track index - same for x and y
in _VBCK_(14) we have the following structure of matrixes (for each i-th measurement):
detector #1 | detector #2 | ...
--------------------------------
| c11 c12 c13
| c21 c22 c23
| c31 c32 c33
| c11 c12 c13
C_i = | c21 c22 c23
| c31 c32 c33
where each 3x3 block corresponds to one detector
x,tr#1 y,tr#1 x,tr#2 y,tr#2 ...
-------------------------------------------------
| gm11 gm12 | |
| gm21 gm22 | |
| gm11 gm12 | |
| gm21 gm22 | |
|-------------------------------------------------
| | gm11 gm12 |
Gamma_i = | | gm21 gm22 |
| | gm11 gm12 |
| | gm21 gm22 |
where each 4x4 block corresponds to one track and inside
it has two 2x2 blocks corresponding to x and y measurements
----------------------------
| g11 g12 | g11 g12 |
G_i = | g21 g22 | g21 g22 | ...
| g31 g32 | g31 g32 |
----------------------------
where each 3x2 block corresponds to detector and track + measurement combination
finally, according to _VBCK_(12) for each k-th hit we have matrix elements k-th terms
(measurement index k omitted everywhere):
-------------------------------------------------------------------------------------
for x measurement:
c11 = omega * (-1) * (-1) | c12 = 0 | c13 = omega * (-1) * alpha_2i
| c22 = 0 | 0
| c33 = omega * alpha_2i * alpha_2i
g11 = omega * (-1) * 1 | g12 = omega * (-1) * z
g21 = 0 | g22 = 0
g31 = omega * alpha_2i * 1 | g32 = omega * alpha_2i * z
b1 = omega * (-1) * (v - a_3i * alpha_2i)
b2 = 0
b3 = omega * alpha_2i * (v - a_3i * alpha_2i)
-------------------------------------------------------------------------------------
for y measurement:
c11 = 0 | c12 = 0 | 0
| c22 = omega * (-1) * (-1) | c23 = omega * (-1) * alpha_2i
| c33 = omega * alpha_2i * alpha_2i
g11 = 0 | g12 = 0
g21 = omega * (-1) * 1 | g22 = omega * (-1) * (z + a_3i)
g31 = omega * alpha_2i * 1 | g32 = omega * alpha_2i * (z + a_3i)
b1 = 0
b2 = omega * (-1) * (v - a_3i * alpha_2i)
b3 = omega * alpha_2i * (v - a_3i * alpha_2i)
-------------------------------------------------------------------------------------
for both x and y:
gm11 = omega * 1 * 1 | gm12 = omega * 1 * (z + a_3i)
| gm22 = omega * (z + a_3i) * (z + a_3i)
beta1 = omega * 1 * (v - a_3i * alpha_2i)
beta2 = omega * (z + a_3i) * (v - a_3i * alpha_2i)
where v stands for x and y for x and y measurements correspondingly.
In case of correction on x, y and z according to _VBCK_(13)
on i-th iteration we have for every hit:
x = a_1 * (-1) + a_3 * alpha_2i + alpha_1 * 1 + alpha_2 * (z + a_3i)
y = a_2 * (-1) + a_3 * alpha_2i + alpha_1 * 1 + alpha_2 * (z + a_3i)
where:
a_1 = delta_x |
a_2 = delta_y | for the given detector
a_3 = delta_z |
alpha_1 |
alpha_2 | (local) parameters of linear trajectory approximation
alpha_2i |
a_3i | (constant) i-th approximations of alpha_2 and a_3
and term (a_3 * alpha_2i) comes from Teylor expansion of non-liner term:
a_3 * alpha_2 = a_3i * alpha_2i + alpha_2i * (a_3 - a_3i) + a_3i * (alpha_2 - alpha_2i)
thus in _VBCK_(12) we have (see matrix structure below):
| -1 : j = 1 | C matrix components
| 0 : j = 2 | for each detector index
| alpha_2i : j = 3 | when x is measured
|
| 0 : j = 1 | C matrix components
delta_jk = | -1 : j = 2 | for each detector index
| alpha_2i : j = 3 | when y is measured
|
| 1 : j = 1 | Gamma matrixes components
| z + a_3i : j = 2 | for each track index - same for x and y
moreover, in _VBCK_(12) we need to change z_k (which stands for x and y measurements):
z_k -> z'_k = z_k - a_3i * alpha_2i
where constant term (a_3i * alpha_2i) also comes from non-liner term (a_3 * alpha_2)
in _VBCK_(14) we have the following structure of matrixes (for each i-th measurement):
detector #1 | detector #2 | ...
--------------------------------
| c11 c12 c13
| c21 c22 c23
| c31 c32 c33
| c11 c12 c13
C_i = | c21 c22 c23
| c31 c32 c33
where each 3x3 block corresponds to one detector
x,tr#1 y,tr#1 x,tr#2 y,tr#2 ...
-------------------------------------------------
| gm11 gm12 | |
| gm21 gm22 | |
| gm11 gm12 | |
| gm21 gm22 | |
|-------------------------------------------------
| | gm11 gm12 |
Gamma_i = | | gm21 gm22 |
| | gm11 gm12 |
| | gm21 gm22 |
where each 4x4 block corresponds to one track and inside
it has two 2x2 blocks corresponding to x and y measurements
----------------------------
| g11 g12 | g11 g12 |
G_i = | g21 g22 | g21 g22 | ...
| g31 g32 | g31 g32 |
----------------------------
where each 3x2 block corresponds to detector and track + measurement combination
finally, according to _VBCK_(12) for each k-th hit we have matrix elements k-th terms
(measurement index k omitted everywhere):
-------------------------------------------------------------------------------------
for x measurement:
c11 = omega * (-1) * (-1) | c12 = 0 | c13 = omega * (-1) * alpha_2i
| c22 = 0 | 0
| c33 = omega * alpha_2i * alpha_2i
g11 = omega * (-1) * 1 | g12 = omega * (-1) * (z + a_3i)
g21 = 0 | g22 = 0
g31 = omega * alpha_2i * 1 | g32 = omega * alpha_2i * (z + a_3i)
b1 = omega * (-1) * (v - a_3i * alpha_2i)
b2 = 0
b3 = omega * alpha_2i * (v - a_3i * alpha_2i)
-------------------------------------------------------------------------------------
for y measurement:
c11 = 0 | c12 = 0 | 0
| c22 = omega * (-1) * (-1) | c23 = omega * (-1) * alpha_2i
| c33 = omega * alpha_2i * alpha_2i
g11 = 0 | g12 = 0
g21 = omega * (-1) * 1 | g22 = omega * (-1) * (z + a_3i)
g31 = omega * alpha_2i * 1 | g32 = omega * alpha_2i * (z + a_3i)
b1 = 0
b2 = omega * (-1) * (v - a_3i * alpha_2i)
b3 = omega * alpha_2i * (v - a_3i * alpha_2i)
-------------------------------------------------------------------------------------
for both x and y:
gm11 = omega * 1 * 1 | gm12 = omega * 1 * (z + a_3i)
| gm22 = omega * (z + a_3i) * (z + a_3i)
beta1 = omega * 1 * (v - a_3i * alpha_2i)
beta2 = omega * (z + a_3i) * (v - a_3i * alpha_2i)
where v stands for x and y for x and y measurements correspondingly.
Directories | |
| cfg | |
| New alignment: configuration files | |
| nn | |
| New alignment: neural network solution | |
| src | |
| New alignment: classes | |
Files | |
| align.C | |
| compareA.C | |
| expdata.C | |
| review.C | |
| run_reco_bmn.C | |