Labels and derivatives of residuals (local measurement coordinates) w.r.t.
alignment/calibration parameters Matrix "G" of derivatives valid for given prediction of track state:
G = ( du/da du/db du/dc ... ) ( dv/da dv/db dv/dc ... )
for calibration parameters a, b, c.
G = ( 0 0 0 ... ) ( dv/da dv/db dv/dc ... ) for V-strip,
G = ( du/da du/db du/dc ... ) ( 0 0 0 ... ) for U-strip,
Measurements with more dimesions (slopes, curvature) should provide full 4-5Dx(n params) matrix (state as (q/p, u', v', u, v) or (u', v', u, v))
26{
27 auto alignment = GlobalCalibrationManager::getInstance().getAlignmentHierarchy().getGlobalDerivatives<
VXDAlignment>(getPlaneId(),
28 sop);
29
30 auto globals = GlobalDerivatives(alignment);
31
33 auto lorentz = GlobalCalibrationManager::getInstance().getLorentzShiftHierarchy().getGlobalDerivatives<
VXDAlignment>(getPlaneId(),
36 }
37
39
40
41 auto L1 = [](double x) {return x;};
42 auto L2 = [](double x) {return (3 * x * x - 1) / 2;};
43 auto L3 = [](double x) {return (5 * x * x * x - 3 * x) / 2;};
44 auto L4 = [](double x) {return (35 * x * x * x * x - 30 * x * x + 3) / 8;};
45
46 double du_dw = sop->getState()[1];
47 double dv_dw = sop->getState()[2];
50 double width = geometry.getWidth(v);
51 double length = geometry.getLength();
52 u = u * 2 / width;
53 v = v * 2 / length;
54
55
56
57
58
59
60
61 globals.
add(GlobalLabel::construct<VXDAlignment>(
getSensorID(), 31), std::vector<double> {L2(u)*du_dw, L2(u)*dv_dw});
62 globals.
add(GlobalLabel::construct<VXDAlignment>(
getSensorID(), 32), std::vector<double> {L1(u)*L1(v)*du_dw, L1(u)*L1(v)*dv_dw});
63 globals.
add(GlobalLabel::construct<VXDAlignment>(
getSensorID(), 33), std::vector<double> {L2(v)*du_dw, L2(v)*dv_dw});
64
65 globals.
add(GlobalLabel::construct<VXDAlignment>(
getSensorID(), 41), std::vector<double> {L3(u)*du_dw, L3(u)*dv_dw});
66 globals.
add(GlobalLabel::construct<VXDAlignment>(
getSensorID(), 42), std::vector<double> {L2(u)*L1(v)*du_dw, L2(u)*L1(v)*dv_dw});
67 globals.
add(GlobalLabel::construct<VXDAlignment>(
getSensorID(), 43), std::vector<double> {L1(u)*L2(v)*du_dw, L1(u)*L2(v)*dv_dw});
68 globals.
add(GlobalLabel::construct<VXDAlignment>(
getSensorID(), 44), std::vector<double> {L3(v)*du_dw, L3(v)*dv_dw});
69
70 globals.
add(GlobalLabel::construct<VXDAlignment>(
getSensorID(), 51), std::vector<double> {L4(u)*du_dw, L4(u)*dv_dw});
71 globals.
add(GlobalLabel::construct<VXDAlignment>(
getSensorID(), 52), std::vector<double> {L3(u)*L1(v)*du_dw, L3(u)*L1(v)*dv_dw});
72 globals.
add(GlobalLabel::construct<VXDAlignment>(
getSensorID(), 53), std::vector<double> {L2(u)*L2(v)*du_dw, L2(u)*L2(v)*dv_dw});
73 globals.
add(GlobalLabel::construct<VXDAlignment>(
getSensorID(), 54), std::vector<double> {L1(u)*L3(v)*du_dw, L1(u)*L3(v)*dv_dw});
74 globals.
add(GlobalLabel::construct<VXDAlignment>(
getSensorID(), 55), std::vector<double> {L4(v)*du_dw, L4(v)*dv_dw});
75
76 return globals;
77}
static bool s_enableLorentzGlobalDerivatives
Static enabling(true) or disabling(false) addition of global derivatives for Lorentz shift.
static BFieldManager & getInstance()
Return the instance of the magnetic field manager.
virtual double add(baseType id, baseType param, double value, bool subtractInsteadOfAdd=false)
Add correction to already stored (or to 0. if not set yet) constant value (optionally with minus sign...
float getV() const
Get v coordinate.
VxdID getSensorID() const
Get the compact ID.
float getU() const
Get u coordinate.
VXD alignment (and maybe some calibration) parameters.
static void getField(const double *pos, double *field)
return the magnetic field at a given position.