BmnRoot 26.10.0-18-g4e3414f9
Software framework of the BM@N experiment
Loading...
Searching...
No Matches
align_new Directory Reference

Description

New alignment of the tracking detectors

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.

Structure

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.

Alignment calculations description

Base method

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.

Code description

All implemented math is found in BmnAligner.cxx. Calculations itself are marked by comments "calculations". Detailed explanations are given below.

Main part: BmnAligner::ProcessTracks() - test version

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.

Main part: BmnAligner::ProcessTracks() - current version ? not working with z misalignment

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.
Directory dependency graph for align_new:

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