81 std::vector<double> vMinX(nSt);
82 std::vector<double> vMaxX(nSt);
83 std::vector<double> vMinY(nSt);
84 std::vector<double> vMaxY(nSt);
89 for (
int iSt = 0; iSt < nSt; ++iSt) {
91 vMaxX[iSt] = station.GetXmax<
double>();
92 vMinX[iSt] = station.GetXmin<
double>();
93 vMaxY[iSt] = station.GetYmax<
double>();
94 vMinY[iSt] = station.GetYmin<
double>();
95 double dy = (vMaxY[iSt] - vMinY[iSt]) *
kXYZMargin;
96 double dx = (vMaxX[iSt] - vMinX[iSt]) *
kXYZMargin;
103 double xMinA = *std::min_element(vMinX.begin(), vMinX.end());
104 double xMaxA = *std::max_element(vMaxX.begin(), vMaxX.end());
105 double yMinA = *std::min_element(vMinY.begin(), vMinY.end());
106 double yMaxA = *std::max_element(vMaxY.begin(), vMaxY.end());
107 double zMinA =
fpParameters->GetStation(0).GetZ<
double>();
108 double zMaxA =
fpParameters->GetStation(nSt - 1).GetZ<
double>();
114 for (
int iSt = 0; iSt < nSt; ++iSt) {
116 auto [detID, iStLoc] =
fpParameters->GetGeoToLocalIdMap()[iStGeo];
121 auto name = format(
"hit_{}_occup_xy_sta_{}", setNm, iSt);
122 auto titl = format(
"{} hit occupancy in XY plane for station {} ({}{});x [cm];y [cm]", setTl, iSt,
125 MakeObj<H2D>(name, titl, nBinsXY, vMinX[iSt], vMaxX[iSt], nBinsXY, vMinY[iSt], vMaxY[iSt]);
128 auto name = format(
"hit_{}_occup_zx_sta_{}", setNm, iSt);
129 auto titl = format(
"{} hit occupancy in ZX plane for station {} ({}{});z [cm];x [cm]", setTl, iSt,
134 auto name = format(
"hit_{}_occup_zy_sta_{}", setNm, iSt);
135 auto titl = format(
"{} hit occupancy in ZY plane for station {} ({}{});z [cm];y [cm]", setTl, iSt,
141 auto name = format(
"hit_usage_xy_sta_{}", iSt);
142 auto titl = format(
"Hit usage in XY plane for station {} ({}{});x [cm];y [cm]", iSt,
kDetName[detID], iStLoc);
144 MakeObj<Prof2D>(name, titl, nBinsXY, vMinX[iSt], vMaxX[iSt], nBinsXY, vMinY[iSt], vMaxY[iSt], 0., 1.);
149 constexpr int NBins = 1000000;
153 auto name = format(
"hit_{}_front_key_index", setNm);
154 auto titl = format(
"{} hit front key index;ID_{{key}}/N_{{keys}};Count", setTl);
158 auto name = format(
"hit_{}_back_key_index", setNm);
159 auto titl = format(
"{} hit back key index;ID_{{key}}/N_{{keys}};Count", setTl);
168 for (
int iSt = 0; iSt < nSt + 1; ++iSt) {
169 auto staNm = iSt == nSt ?
"" : format(
"_sta_{}", iSt);
170 auto staTl = iSt == nSt ?
"" : format(
" in station {}", iSt);
174 auto name = format(
"hit_{}_rel_time{}", setNm, staNm);
175 auto titl = format(
"{} hit relative time{}; #delta t_{{hit}};Count", setTl, staTl);
184 std::vector<std::string> vsPointName = {
"first",
"last"};
190 auto sName = format(
"{}_track_{}_theta",
GetTaskName(), vsPointName[i]);
191 auto sTitl = format(
"#theta at {} hit; #theta", vsPointName[i]);
195 auto sName = format(
"{}_track_{}_phi",
GetTaskName(), vsPointName[i]);
196 auto sTitl = format(
"#phi at {} hit; #phi", vsPointName[i]);
200 auto sName = format(
"{}_track_{}_thata_phi",
GetTaskName(), vsPointName[i]);
201 auto sTitl = format(
"#theta vs #phi at {} hit; #phi; #theta", vsPointName[i]);
205 auto sName = format(
"{}_track_{}_chi2_ndf",
GetTaskName(), vsPointName[i]);
206 auto sTitl = format(
"#chi^{{2}}/NDF at {} hit; #chi^{{2}}/NDF", vsPointName[i]);
213 double xMax = double(
knStaMax) - 0.5;
215 auto sName = format(
"{}_track_fst_lst_sta",
GetTaskName());
216 auto sTitl =
"First vs. last station index;ID^{last}_{station};ID^{first}_{station}";
220 auto sName = format(
"{}_track_origin",
GetTaskName());
221 auto sTitl =
"Track origin;x [cm];y [cm]";
235 auto name = format(
"{}_ca_hit_{}_occupancy_xy",
GetTaskName(), setNm);
236 auto titl = format(
"{} hit occupancy in different stations in XY plane", setNm);
238 for (
int iSt = 0; iSt < nSt; ++iSt) {
239 auto pad = PadConfig(
false,
false,
false,
false,
true);
241 canv.AddPadConfig(pad);
246 auto name = format(
"{}_ca_hit_{}_occupancy_zx_zy",
GetTaskName(), setNm);
247 auto titl = format(
"{} hit occupancy in different stations in ZX and ZY planes", setTl);
250 auto pad = PadConfig();
251 for (
int iSt = 0; iSt < nSt; ++iSt) {
252 pad.RegisterHistogram(
fvphHitOccupZX[iSt][hitSet], (iSt == 0 ?
"colz" :
"cols same"));
254 canv.AddPadConfig(pad);
257 auto pad = PadConfig();
258 for (
int iSt = 0; iSt < nSt; ++iSt) {
259 pad.RegisterHistogram(
fvphHitOccupZY[iSt][hitSet], (iSt == 0 ?
"colz" :
"cols same"));
261 canv.AddPadConfig(pad);
267 auto name = format(
"{}_ca_hit_usage_xy",
GetTaskName());
268 auto titl = format(
"Hit usage in different stations in XY plane");
270 for (
int iSt = 0; iSt < nSt; ++iSt) {
271 auto pad = PadConfig();
273 canv.AddPadConfig(pad);
283 auto pad = PadConfig(
true,
true,
false,
false,
true);
285 canv.AddPadConfig(pad);
288 auto pad = PadConfig(
true,
true,
false,
true,
false);
290 canv.AddPadConfig(pad);
293 auto pad = PadConfig(
true,
true,
false,
true,
false);
295 canv.AddPadConfig(pad);
298 auto pad = PadConfig(
true,
true,
false,
false,
true);
300 canv.AddPadConfig(pad);
303 auto pad = PadConfig(
true,
true,
false,
false,
false);
305 canv.AddPadConfig(pad);
321 L_(fatal) <<
"ca::Qa: instance is not initialized";
327 std::vector<unsigned char> vbHitUsed(nHitsInput,
false);
329 vbHitUsed[iH] =
true;
335 auto [minTimeIt, maxTimeIt] =
336 std::minmax_element(
hits.cbegin(),
hits.cend(), [](
const auto& h1,
const auto& h2) { return h1.T() < h2.T(); });
343 for (
int iH = 0; iH < nHitsInput; ++iH) {
350 int iSt = hit.Station();
362 auto& track = *trkIt;
363 int nHits = track.fNofHits;
365 int iFstHit = (*fpvRecoHits)[trkFirstHit];
366 int iLstHit = (*fpvRecoHits)[trkFirstHit + nHits - 1];
375 const auto& trkPar = (ip == 0 ? track.fParFirst : track.fParLast);
377 fvphTrkPhi[ip]->Fill(trkPar.GetPhi() * 180. / Pi);
378 fvphTrkPhiTheta[ip]->Fill(trkPar.GetPhi() * 180. / Pi, trkPar.GetTheta() * 180. / Pi);
385 trkFirstHit += nHits;