Project
Loading...
Searching...
No Matches
ResidualsController.cxx
Go to the documentation of this file.
1// Copyright 2019-2020 CERN and copyright holders of ALICE O2.
2// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders.
3// All rights not expressly granted are reserved.
4//
5// This software is distributed under the terms of the GNU General Public
6// License v3 (GPL Version 3), copied verbatim in the file "COPYING".
7//
8// In applying this license CERN does not waive the privileges and immunities
9// granted to it by virtue of its status as an Intergovernmental Organization
10// or submit itself to any jurisdiction.
11
16
21#include "Framework/Logger.h"
22#include <TString.h>
23#include <TMath.h>
24#include <cstdio>
25
26using namespace TMath;
27
28namespace o2
29{
30namespace align
31{
32
33//________________________________________________
35{
36 // d-tor
37 delete[] mX;
38 delete[] mY;
39 delete[] mZ;
40 delete[] mSnp;
41 delete[] mTgl;
42 delete[] mAlpha;
43 delete[] mDY;
44 delete[] mDZ;
45 delete[] mSigY2;
46 delete[] mSigYZ;
47 delete[] mSigZ2;
48 delete[] mDYK;
49 delete[] mDZK;
50 delete[] mSigY2K;
51 delete[] mSigYZK;
52 delete[] mSigZ2K;
53 delete[] mVolID;
54 delete[] mLabel;
55}
56
57//________________________________________________
59{
60 // resize container
61 if (np > mNBook) {
62 delete[] mX;
63 delete[] mY;
64 delete[] mZ;
65 delete[] mSnp;
66 delete[] mTgl;
67 delete[] mAlpha;
68 delete[] mDY;
69 delete[] mDZ;
70 delete[] mSigY2;
71 delete[] mSigYZ;
72 delete[] mSigZ2;
73 delete[] mDYK;
74 delete[] mDZK;
75 delete[] mSigY2K;
76 delete[] mSigYZK;
77 delete[] mSigZ2K;
78 delete[] mVolID;
79 delete[] mLabel;
80 //
81 mNBook = 100 + np;
82 mX = new float[mNBook];
83 mY = new float[mNBook];
84 mZ = new float[mNBook];
85 mSnp = new float[mNBook];
86 mTgl = new float[mNBook];
87 mAlpha = new float[mNBook];
88 mDY = new float[mNBook];
89 mDZ = new float[mNBook];
90 mSigY2 = new float[mNBook];
91 mSigYZ = new float[mNBook];
92 mSigZ2 = new float[mNBook];
93 mDYK = new float[mNBook];
94 mDZK = new float[mNBook];
95 mSigY2K = new float[mNBook];
96 mSigYZK = new float[mNBook];
97 mSigZ2K = new float[mNBook];
98 mVolID = new int[mNBook];
99 mLabel = new int[mNBook];
100 //
101 memset(mX, 0, mNBook * sizeof(float));
102 memset(mY, 0, mNBook * sizeof(float));
103 memset(mZ, 0, mNBook * sizeof(float));
104 memset(mSnp, 0, mNBook * sizeof(float));
105 memset(mTgl, 0, mNBook * sizeof(float));
106 memset(mAlpha, 0, mNBook * sizeof(float));
107 memset(mDY, 0, mNBook * sizeof(float));
108 memset(mDZ, 0, mNBook * sizeof(float));
109 memset(mSigY2, 0, mNBook * sizeof(float));
110 memset(mSigYZ, 0, mNBook * sizeof(float));
111 memset(mSigZ2, 0, mNBook * sizeof(float));
112 memset(mDYK, 0, mNBook * sizeof(float));
113 memset(mDZK, 0, mNBook * sizeof(float));
114 memset(mSigY2K, 0, mNBook * sizeof(float));
115 memset(mSigYZK, 0, mNBook * sizeof(float));
116 memset(mSigZ2K, 0, mNBook * sizeof(float));
117 memset(mVolID, 0, mNBook * sizeof(int));
118 memset(mLabel, 0, mNBook * sizeof(int));
119 }
120 //
121}
122
123//____________________________________________
125{
126 // reset record
127 mBits = 0;
128 mNPoints = 0;
129 mRunNumber = 0;
130 mFirstTFOrbit = 0;
131 mChi2 = 0;
132 mChi2K = 0;
133 mQ2Pt = 0;
134 //
135}
136
137//____________________________________________
138void ResidualsController::print(const Option_t* opt) const
139{
140 // print info
141 TString opts = opt;
142 opts.ToLower();
143 bool lab = opts.Contains("l");
144 printf("Track %s TForbit:%d Run:%d\n", mTrackID.asString().c_str(), mFirstTFOrbit, mRunNumber);
145 printf("%5sTr.", isCosmic() ? "Cosm." : "Coll.");
146 // in case of cosmic, other leg should be shown
147 printf("Run:%6d Bz:%+4.1f Np: %3d q/Pt:%+.4f | Chi2: Ini: %6.1f LinSol:%6.1f Kalm:%6.1f |Vtx:%3s\n",
148 mRunNumber, mBz, mNPoints, mQ2Pt, mChi2Ini, mChi2, mChi2K, hasVertex() ? "ON" : "OFF");
149 if (opts.Contains("r")) {
150 bool ers = opts.Contains("e");
151 printf("%5s %7s %s %7s %7s %7s %5s %5s %9s %9s",
152 " VID ", " Label ", " Alp ", " X ", " Y ", " Z ", " Snp ", " Tgl ", " DY ", " DZ ");
153 if (ers) {
154 printf(" %8s %8s %8s", " pSgYY ", " pSgYZ ", " pSgZZ ");
155 } // cluster errors
156 if (getKalmanDone()) {
157 printf(" %9s %9s", " DYK ", " DZK ");
158 if (ers) {
159 printf(" %8s %8s %8s", " tSgYY ", " tSgYZ ", " tSgZZ ");
160 } // track errors
161 }
162 printf("\n");
163 for (int i = 0; i < mNPoints; i++) {
164 float x = mX[i], y = mY[i], z = mZ[i];
165 if (lab) {
166 x = getXLab(i);
167 y = getYLab(i);
168 z = getZLab(i);
169 }
170 printf("%5d %7d %+5.2f %+7.2f %+7.2f %+7.2f %+5.2f %+5.2f %+9.2e %+9.2e",
171 mVolID[i], mLabel[i], mAlpha[i], x, y, z, mSnp[i], mTgl[i], mDY[i], mDZ[i]);
172 if (ers) {
173 printf(" %.2e %+.1e %.2e", mSigY2[i], mSigYZ[i], mSigZ2[i]);
174 }
175 if (getKalmanDone()) {
176 printf(" %+9.2e %+9.2e", mDYK[i], mDZK[i]);
177 if (ers) {
178 printf(" %.2e %+.1e %.2e", mSigY2K[i], mSigYZK[i], mSigZ2K[i]);
179 }
180 }
181 printf("\n");
182 }
183 }
184}
185
186//____________________________________________________________
188{
189 // fill tracks residuals info
190 int nps, np = trc.getNPoints();
191 if (trc.getInnerPoint()->containsMeasurement()) {
192 setHasVertex();
193 nps = np;
194 } else {
195 nps = np - 1;
196 } // ref point is dummy?
197 if (nps < 0) {
198 return true;
199 }
200 setCosmic(trc.isCosmic());
201 //
202 setNPoints(nps);
203 mQ2Pt = trc.getQ2Pt();
204 mChi2 = trc.getChi2();
205 mChi2Ini = trc.getChi2Ini();
206 int nfill = 0;
207 for (int i = 0; i < np; i++) {
208 auto pnt = trc.getPoint(i);
209 int inv = pnt->isInvDir() ? -1 : 1; // Flag inversion for cosmic upper leg
210 if (!pnt->containsMeasurement()) {
211 continue;
212 }
213 if (!pnt->isStatOK()) {
214 pnt->incrementStat();
215 }
216 mVolID[nfill] = pnt->getVolID();
217 mLabel[nfill] = pnt->getSensor()->getInternalID();
218 mAlpha[nfill] = pnt->getAlphaSens();
219 mX[nfill] = pnt->getXTracking();
220 mY[nfill] = pnt->getYTracking();
221 mZ[nfill] = pnt->getZTracking();
222 mDY[nfill] = pnt->getResidY();
223 mDZ[nfill] = pnt->getResidZ();
224 mSigY2[nfill] = pnt->getYZErrTracking()[0];
225 mSigYZ[nfill] = pnt->getYZErrTracking()[1];
226 mSigZ2[nfill] = pnt->getYZErrTracking()[2];
227 //
228 mSnp[nfill] = pnt->getTrParamWSA()[AlignmentPoint::kParSnp];
229 mTgl[nfill] = pnt->getTrParamWSA()[AlignmentPoint::kParTgl];
230 //
231 nfill++;
232 }
233 if (nfill != nps) {
234 trc.Print("p");
235 LOG(fatal) << nfill << " residuals were stored instead of " << nps;
236 }
237 //
238 setKalmanDone(false);
239 int nfilk = 0;
240 if (doKalman && trc.residKalman()) {
241 for (int i = 0; i < np; i++) {
242 AlignmentPoint* pnt = trc.getPoint(i);
243 if (!pnt->containsMeasurement()) {
244 continue;
245 }
246 if (mVolID[nfilk] != int(pnt->getVolID())) {
247 LOG(fatal) << "Mismatch in Kalman filling for point " << i << ": filled VID:" << mVolID[nfilk] << ", point VID:" << pnt->getVolID();
248 }
249 const double* wsA = pnt->getTrParamWSA();
250 mDYK[nfilk] = pnt->getResidY();
251 mDZK[nfilk] = pnt->getResidZ();
252 mSigY2K[nfilk] = wsA[2];
253 mSigYZK[nfilk] = wsA[3];
254 mSigZ2K[nfilk] = wsA[4];
255 //
256 nfilk++;
257 }
258 //
259 mChi2K = trc.getChi2();
260 setKalmanDone(true);
261 }
262
263 return true;
264}
265
266//_________________________________________________
268{
269 // cluster lab X
270 return Abs(mX[i]) * Cos(mAlpha[i]) - mY[i] * Sin(mAlpha[i]);
271}
272
273//_________________________________________________
275{
276 // cluster lab Y
277 return Abs(mX[i]) * Sin(mAlpha[i]) + mY[i] * Cos(mAlpha[i]);
278}
279
280//_________________________________________________
282{
283 // cluster lab Z
284 return mZ[i];
285}
286
287} // namespace align
288} // namespace o2
End-chain alignment volume in detector branch, where the actual measurement is done.
Meausered point in the sensor.
Track model for the alignment.
int32_t i
Container for control residuals.
uint32_t getVolID() const
double * getTrParamWSA() const
AlignmentPoint * getPoint(int i)
const AlignmentPoint * getInnerPoint() const
void Print(Option_t *opt="") const final
o2::dataformats::GlobalTrackID mTrackID
void print(const Option_t *opt="re") const
bool fillTrack(AlignmentTrack &trc, bool doKalman=kTRUE)
GLint GLenum GLint x
Definition glcorearb.h:403
GLdouble GLdouble GLdouble z
Definition glcorearb.h:843
void align(gsl::span< ElinkEncoder< BareFormat, CHARGESUM > > elinks)
a couple of static helper functions to create timestamp values for CCDB queries or override obsolete ...
LOG(info)<< "Compressed in "<< sw.CpuTime()<< " s"