390 const int nSt = fpDetInterface->GetNtrackingStations();
391 const int nHits = fpHits->GetEntriesFast();
392 const int nMCevents = (IsMCUsed()) ? fpMCEventList->GetNofEvents() : -1;
396 std::vector<std::vector<std::vector<int>>>
400 vNofHitsPerMcTrack.resize(nMCevents);
401 for (
int iE = 0; iE < nMCevents; ++iE) {
402 int iFile = fpMCEventList->GetFileIdByIndex(iE);
403 int iEvent = fpMCEventList->GetEventIdByIndex(iE);
404 int nMcTracks = fpMCTracks->Size(iFile, iEvent);
405 vNofHitsPerMcTrack[iE].resize(nSt);
406 for (
int iSt = 0; iSt < nSt; iSt++) {
407 vNofHitsPerMcTrack[iE][iSt].resize(nMcTracks, 0);
412 for (
int iH = 0; iH < nHits; ++iH) {
414 fHitQaData.SetHitIndex(iH);
416 const auto* pHit =
dynamic_cast<const CbmPixelHit*
>(fpHits->At(iH));
418 LOG(error) << fName <<
": hit with iH = " << iH <<
" is not an CbmStsHit (dynamic cast failed)";
422 if constexpr (ca::EDetectorID::kTof == DetID) {
423 auto address = pHit->GetAddress();
429 fMonitor.IncrementCounter(EMonitorKey::kHit);
430 fMonitor.IncrementCounter(EMonitorKey::kHitAccepted);
436 int iSt = fpDetInterface->GetTrackingStationIndex(pHit);
442 LOG(error) << fName <<
": index of station (" << iSt <<
") is out of range for hit with id = " << iH;
446 auto [stPhiU, stPhiV] = fpDetInterface->GetStereoAnglesSensor(pHit->GetAddress());
448 fHitQaData.SetPhiU(stPhiU);
449 fHitQaData.SetPhiV(stPhiV);
450 fHitQaData.SetHitX(pHit->GetX());
451 fHitQaData.SetHitY(pHit->GetY());
452 fHitQaData.SetHitZ(pHit->GetZ());
453 fHitQaData.SetHitTime(pHit->GetTime());
455 fHitQaData.SetHitDx(pHit->GetDx());
456 fHitQaData.SetHitDy(pHit->GetDy());
457 fHitQaData.SetHitDxy(pHit->GetDxy());
458 fHitQaData.SetHitTimeError(pHit->GetTimeError());
459 fHitQaData.SetStationID(iSt);
462 fvph_hit_xy[iSt]->Fill(fHitQaData.GetHitX(), fHitQaData.GetHitY());
463 fvph_hit_zx[iSt]->Fill(fHitQaData.GetHitZ(), fHitQaData.GetHitX());
464 fvph_hit_zy[iSt]->Fill(fHitQaData.GetHitZ(), fHitQaData.GetHitY());
466 fvph_hit_station_delta_z[iSt]->Fill(fHitQaData.GetHitZ() - fpDetInterface->GetZref(iSt));
468 fvph_hit_dx[iSt]->Fill(fHitQaData.GetHitDx());
469 fvph_hit_dy[iSt]->Fill(fHitQaData.GetHitDy());
470 fvph_hit_du[iSt]->Fill(fHitQaData.GetHitDu());
471 fvph_hit_dv[iSt]->Fill(fHitQaData.GetHitDv());
472 fvph_hit_kuv[iSt]->Fill(fHitQaData.GetHitRuv());
473 fvph_hit_dt[iSt]->Fill(fHitQaData.GetHitTimeError());
476 fvph_hit_xy[nSt]->Fill(fHitQaData.GetHitX(), fHitQaData.GetHitY());
477 fvph_hit_zx[nSt]->Fill(fHitQaData.GetHitZ(), fHitQaData.GetHitX());
478 fvph_hit_zy[nSt]->Fill(fHitQaData.GetHitZ(), fHitQaData.GetHitY());
480 fvph_hit_station_delta_z[nSt]->Fill(fHitQaData.GetHitZ() - fpDetInterface->GetZref(iSt));
482 fvph_hit_dx[nSt]->Fill(fHitQaData.GetHitDx());
483 fvph_hit_dy[nSt]->Fill(fHitQaData.GetHitDy());
484 fvph_hit_du[nSt]->Fill(fHitQaData.GetHitDu());
485 fvph_hit_dv[nSt]->Fill(fHitQaData.GetHitDv());
486 fvph_hit_kuv[nSt]->Fill(fHitQaData.GetHitRuv());
487 fvph_hit_dt[nSt]->Fill(fHitQaData.GetHitTimeError());
493 const auto* pHitMatch =
dynamic_cast<CbmMatch*
>(fpHitMatches->At(iH));
498 for (
int iLink = 0; iLink < pHitMatch->GetNofLinks(); ++iLink) {
499 const auto& link = pHitMatch->GetLink(iLink);
501 int iP = link.GetIndex();
510 int iE = fpMCEventList->GetEventIndex(link);
514 if (iE < 0 || iE >= nMCevents) {
515 LOG(error) << fName <<
": id of MC event is out of range (hit id = " << iH <<
", link id = " << iLink
516 <<
", event id = " << iE <<
", mc point ID = " << iP <<
')';
521 const auto* pMCPoint =
dynamic_cast<const Point_t*
>(fpMCPoints->Get(link));
523 LOG(error) << fName <<
": MC point object does not exist for hit " << iH;
527 int iTr = pMCPoint->GetTrackID();
529 if (iTr >=
static_cast<int>(vNofHitsPerMcTrack[iE][iSt].size())) {
530 LOG(error) << fName <<
": index of MC track is out of range (hit id = " << iH <<
", link id = " << iLink
531 <<
", event id = " << iE <<
", track id = " << iTr <<
')';
535 vNofHitsPerMcTrack[iE][iSt][iTr]++;
538 fvph_n_points_per_hit[iSt]->Fill(nMCpoints);
539 fvph_n_points_per_hit[nSt]->Fill(nMCpoints);
546 if (pHitMatch->GetNofLinks() != 1) {
551 assert(pHitMatch->GetNofLinks() > 0);
552 const auto& bestPointLink = pHitMatch->GetMatchedLink();
555 if (bestPointLink.GetIndex() < 0) {
560 const auto* pMCPoint =
dynamic_cast<const Point_t*
>(fpMCPoints->Get(bestPointLink));
561 fHitQaData.SetPointID(bestPointLink.GetIndex(), bestPointLink.GetEntry(), bestPointLink.GetFile());
563 LOG(error) << fName <<
": MC point object does not exist for hit " << iH;
568 CbmLink bestTrackLink = bestPointLink;
569 bestTrackLink.
SetIndex(pMCPoint->GetTrackID());
570 const auto* pMCTrack =
dynamic_cast<const CbmMCTrack*
>(fpMCTracks->Get(bestTrackLink));
572 LOG(error) << fName <<
": MC track object does not exist for hit " << iH <<
" and link: ";
576 double t0MC = fpMCEventList->GetEventTime(bestPointLink);
578 LOG(error) << fName <<
": MC time zero is lower then 0 ns: " << t0MC;
583 if (!IsTrackSelected(pMCTrack, pMCPoint)) {
588 int iE = fpMCEventList->GetEventIndex(bestTrackLink);
589 if (vNofHitsPerMcTrack[iE][iSt][pMCPoint->GetTrackID()] != 1) {
596 double mass = pMCTrack->
GetMass();
603 double xMC = pMCPoint->FairMCPoint::GetX();
604 double yMC = pMCPoint->FairMCPoint::GetY();
605 double zMC = pMCPoint->FairMCPoint::GetZ();
606 double tMC = pMCPoint->GetTime() + t0MC;
611 double pxMC = pMCPoint->GetPx();
612 double pyMC = pMCPoint->GetPy();
613 double pzMC = pMCPoint->GetPz();
614 double pMC =
sqrt(pxMC * pxMC + pyMC * pyMC + pzMC * pzMC);
624 double shiftZ = fHitQaData.GetHitZ() - zMC;
625 double xMCs = xMC + shiftZ * pxMC / pzMC;
626 double yMCs = yMC + shiftZ * pyMC / pzMC;
629 fHitQaData.SetPointTime(tMCs);
630 fHitQaData.SetPointX(xMCs);
631 fHitQaData.SetPointY(yMCs);
632 fHitQaData.SetPointZ(fHitQaData.GetHitZ());
635 if constexpr (ca::EDetectorID::kTof == DetID) {
636 zRes = fHitQaData.GetHitZ() - pMCPoint->GetZ();
639 zRes = fHitQaData.GetHitZ() - 0.5 * (pMCPoint->GetZ() + pMCPoint->GetZOut());
641 fvph_point_hit_delta_z[iSt]->Fill(zRes);
643 double xRes = fHitQaData.GetResidualX();
644 double yRes = fHitQaData.GetResidualY();
645 double uRes = fHitQaData.GetResidualU();
646 double vRes = fHitQaData.GetResidualV();
647 double tRes = fHitQaData.GetResidualTime();
649 double xPull = fHitQaData.GetPullX();
650 double yPull = fHitQaData.GetPullY();
651 double uPull = fHitQaData.GetPullU();
652 double vPull = fHitQaData.GetPullV();
653 double tPull = fHitQaData.GetPullTime();
655 fvph_res_x[iSt]->Fill(xRes);
656 fvph_res_y[iSt]->Fill(yRes);
657 fvph_res_u[iSt]->Fill(uRes);
658 fvph_res_v[iSt]->Fill(vRes);
659 fvph_res_t[iSt]->Fill(tRes);
661 fvph_pull_x[iSt]->Fill(xPull);
662 fvph_pull_y[iSt]->Fill(yPull);
663 fvph_pull_u[iSt]->Fill(uPull);
664 fvph_pull_v[iSt]->Fill(vPull);
665 fvph_pull_t[iSt]->Fill(tPull);
667 fvph_res_x_vs_x[iSt]->Fill(fHitQaData.GetPointX(), xRes);
668 fvph_res_y_vs_y[iSt]->Fill(fHitQaData.GetPointY(), yRes);
669 fvph_res_u_vs_u[iSt]->Fill(fHitQaData.GetPointU(), uRes);
670 fvph_res_v_vs_v[iSt]->Fill(fHitQaData.GetPointV(), vRes);
671 fvph_res_t_vs_t[iSt]->Fill(fHitQaData.GetPointTime(), tRes);
673 fvph_pull_x_vs_x[iSt]->Fill(fHitQaData.GetPointX(), xPull);
674 fvph_pull_y_vs_y[iSt]->Fill(fHitQaData.GetPointY(), yPull);
675 fvph_pull_u_vs_u[iSt]->Fill(fHitQaData.GetPointU(), uPull);
676 fvph_pull_v_vs_v[iSt]->Fill(fHitQaData.GetPointV(), vPull);
677 fvph_pull_t_vs_t[iSt]->Fill(fHitQaData.GetPointTime(), tPull);
681 fvph_point_hit_delta_z[nSt]->Fill(zRes);
683 fvph_res_x[nSt]->Fill(xRes);
684 fvph_res_y[nSt]->Fill(yRes);
685 fvph_res_u[nSt]->Fill(uRes);
686 fvph_res_v[nSt]->Fill(vRes);
687 fvph_res_t[nSt]->Fill(tRes);
689 fvph_pull_x[nSt]->Fill(xPull);
690 fvph_pull_y[nSt]->Fill(yPull);
691 fvph_pull_u[nSt]->Fill(uPull);
692 fvph_pull_v[nSt]->Fill(vPull);
693 fvph_pull_t[nSt]->Fill(tPull);
695 fvph_res_x_vs_x[nSt]->Fill(fHitQaData.GetPointX(), xRes);
696 fvph_res_y_vs_y[nSt]->Fill(fHitQaData.GetPointY(), yRes);
697 fvph_res_u_vs_u[nSt]->Fill(fHitQaData.GetPointU(), uRes);
698 fvph_res_v_vs_v[nSt]->Fill(fHitQaData.GetPointV(), vRes);
699 fvph_res_t_vs_t[nSt]->Fill(fHitQaData.GetPointTime(), tRes);
701 fvph_pull_x_vs_x[nSt]->Fill(fHitQaData.GetPointX(), xPull);
702 fvph_pull_y_vs_y[nSt]->Fill(fHitQaData.GetPointY(), yPull);
703 fvph_pull_u_vs_u[nSt]->Fill(fHitQaData.GetPointU(), uPull);
704 fvph_pull_v_vs_v[nSt]->Fill(fHitQaData.GetPointV(), vPull);
705 fvph_pull_t_vs_t[nSt]->Fill(fHitQaData.GetPointTime(), tPull);
707 FillHistogramsPerHit();
712 for (
int iE = 0; iE < nMCevents; ++iE) {
713 int iFile = fpMCEventList->GetFileIdByIndex(iE);
714 int iEvent = fpMCEventList->GetEventIdByIndex(iE);
715 int nPoints = fpMCPoints->Size(iFile, iEvent);
716 int nTracks = fpMCTracks->Size(iFile, iEvent);
719 std::vector<std::vector<bool>> vIsTrackProcessed(nSt);
720 for (
int iSt = 0; iSt < nSt; iSt++) {
721 vIsTrackProcessed[iSt].resize(nTracks, 0);
724 for (
int iP = 0; iP < nPoints; ++iP) {
726 fHitQaData.SetPointID(iP, iEvent, iFile);
727 fMonitor.IncrementCounter(EMonitorKey::kMcPoint);
729 const auto* pMCPoint =
dynamic_cast<const Point_t*
>(fpMCPoints->Get(iFile, iEvent, iP));
731 LOG(error) << fName <<
": MC point does not exist for iFile = " << iFile <<
", iEvent = " << iEvent
736 int address = pMCPoint->GetDetectorID();
737 int iSt = fpDetInterface->GetTrackingStationIndex(pMCPoint);
743 LOG(error) << fName <<
": MC point for FEI = " << iFile <<
", " << iEvent <<
", " << iP <<
" and address "
744 << address <<
" has wrong station index: iSt = " << iSt;
745 fMonitor.IncrementCounter(EMonitorKey::kMcPointWrongStation);
751 fHitQaData.SetPointX(pMCPoint->FairMCPoint::GetX());
752 fHitQaData.SetPointY(pMCPoint->FairMCPoint::GetY());
753 fHitQaData.SetPointZ(pMCPoint->FairMCPoint::GetZ());
755 fvph_point_xy[iSt]->Fill(fHitQaData.GetPointX(), fHitQaData.GetPointY());
756 fvph_point_zx[iSt]->Fill(fHitQaData.GetPointZ(), fHitQaData.GetPointX());
757 fvph_point_zy[iSt]->Fill(fHitQaData.GetPointZ(), fHitQaData.GetPointY());
759 fvph_point_xy[nSt]->Fill(fHitQaData.GetPointX(), fHitQaData.GetPointY());
760 fvph_point_zx[nSt]->Fill(fHitQaData.GetPointZ(), fHitQaData.GetPointX());
761 fvph_point_zy[nSt]->Fill(fHitQaData.GetPointZ(), fHitQaData.GetPointY());
763 int iTr = pMCPoint->GetTrackID();
765 if (iTr >= nTracks) {
766 LOG(error) << fName <<
": index of MC track is out of range (point id = " << iP <<
", event id = " << iE
767 <<
", track id = " << iTr <<
')';
770 const auto* pMCTrack =
dynamic_cast<const CbmMCTrack*
>(fpMCTracks->Get(iFile, iEvent, iTr));
772 fHitQaData.SetIfTrackHasHits(vNofHitsPerMcTrack[iE][iSt][iTr] > 0);
773 fHitQaData.SetIfTrackSelected(IsTrackSelected(pMCTrack, pMCPoint));
776 LOG(error) << fName <<
": null MC track pointer for file id = " << iFile <<
", event id = " << iEvent
777 <<
", track id = " << iTr;
782 if (vIsTrackProcessed[iSt][iTr]) {
786 vIsTrackProcessed[iSt][iTr] =
true;
789 if (!fHitQaData.GetIfTrackSelected()) {
794 bool ifTrackHasHits = fHitQaData.GetIfTrackHasHits();
796 fvpe_reco_eff_vs_xy[iSt]->Fill(fHitQaData.GetPointX(), fHitQaData.GetPointY(), ifTrackHasHits);
797 fvpe_reco_eff_vs_xy[nSt]->Fill(fHitQaData.GetPointX(), fHitQaData.GetPointY(), ifTrackHasHits);
809 fConfig = ReadSpecificConfig<CbmCaInputQaBase<DetID>::Config>().value_or(
Config{});
812 LOG_IF(fatal, !fpDetInterface) <<
"\033[1;31m" << fName <<
": tracking detector interface is undefined\033[0m";
815 auto* pFairRootManager = FairRootManager::Instance();
816 LOG_IF(fatal, !pFairRootManager) <<
"\033[1;31m" << fName <<
": FairRootManager instance is a null pointer\033[0m";
819 fpTimeSlice =
dynamic_cast<CbmTimeSlice*
>(pFairRootManager->GetObject(
"TimeSlice."));
820 LOG_IF(fatal, !fpTimeSlice) <<
"\033[1;31m" << fName <<
": time-slice branch is not found\033[0m";
825 if constexpr (DetID == EDetectorID::kTof) {
826 fpHits =
dynamic_cast<TClonesArray*
>(pFairRootManager->GetObject(
"TofCalHit"));
828 fpHits =
dynamic_cast<TClonesArray*
>(pFairRootManager->GetObject(
"TofHit"));
835 LOG_IF(fatal, !fpHits) <<
"\033[1;31m" << fName <<
": container of reconstructed hits is not found\033[0m";
840 fpMCDataManager =
dynamic_cast<CbmMCDataManager*
>(pFairRootManager->GetObject(
"MCDataManager"));
841 LOG_IF(fatal, !fpMCDataManager) <<
"\033[1;31m" << fName <<
": MC data manager branch is not found\033[0m";
844 fpMCEventList =
dynamic_cast<CbmMCEventList*
>(pFairRootManager->GetObject(
"MCEventList."));
845 LOG_IF(fatal, !fpMCEventList) <<
"\033[1;31m" << fName <<
": MC event list branch is not found\033[0m";
848 fpMCTracks = fpMCDataManager->InitBranch(
"MCTrack");
849 LOG_IF(fatal, !fpMCTracks) <<
"\033[1;31m" << fName <<
": MC track branch is not found\033[0m";
853 LOG_IF(fatal, !fpMCTracks) <<
"\033[1;31m" << fName <<
": MC point branch is not found\033[0m";
857 fpHitMatches =
dynamic_cast<TClonesArray*
>(pFairRootManager->GetObject(hitMatchName));
858 LOG_IF(fatal, !fpHitMatches) <<
"\033[1;31m]" << fName <<
": hit match branch is not found\033[0m";
862 int nSt = fpDetInterface->GetNtrackingStations();
864 frXmin.resize(nSt + 1, 0.);
865 frXmax.resize(nSt + 1, 0.);
867 frYmin.resize(nSt + 1, 0.);
868 frYmax.resize(nSt + 1, 0.);
870 frZmin.resize(nSt + 1, 0.);
871 frZmax.resize(nSt + 1, 0.);
873 for (
int i = nSt; i >= 0; --i) {
875 int j = (i == nSt ? 0 : i);
877 frXmin[i] = fpDetInterface->GetXmin(j);
878 frXmax[i] = fpDetInterface->GetXmax(j);
880 frYmin[i] = fpDetInterface->GetYmin(j);
881 frYmax[i] = fpDetInterface->GetYmax(j);
883 frZmin[i] = fpDetInterface->GetZmin(j);
884 frZmax[i] = fpDetInterface->GetZmax(j);
889 frXmin[nSt] = std::min(frXmin[nSt], frXmin[i]);
890 frXmax[nSt] = std::max(frXmax[nSt], frXmax[i]);
892 frYmin[nSt] = std::min(frYmin[nSt], frYmin[i]);
893 frYmax[nSt] = std::max(frYmax[nSt], frYmax[i]);
895 frZmin[nSt] = std::min(frZmin[nSt], frZmin[i]);
896 frZmax[nSt] = std::max(frZmax[nSt], frZmax[i]);
901 for (
int i = 0; i <= nSt; ++i) {
902 double dx = 0.05 * fabs(frXmax[i] - frXmin[i]);
906 double dy = 0.05 * fabs(frYmax[i] - frYmin[i]);
910 if constexpr (ca::EDetectorID::kMuch == DetID) {
915 double dz = 0.05 * fabs(frZmax[i] - frZmin[i]);
923 fMonitor.SetName(Form(
"Monitor for %s", fName.Data()));
924 fMonitor.SetCounterName(EMonitorKey::kEvent,
"N events");
925 fMonitor.SetCounterName(EMonitorKey::kHit,
"N hits total");
926 fMonitor.SetCounterName(EMonitorKey::kHitAccepted,
"N hits accepted");
927 fMonitor.SetCounterName(EMonitorKey::kMcPoint,
"N MC points total");
928 fMonitor.SetCounterName(EMonitorKey::kMcPointWrongStation,
"N MC points total");
929 fMonitor.SetRatioKeys({EMonitorKey::kEvent});
935 MakeQaDirectory(
"Summary");
936 MakeQaDirectory(
"Summary/vs Station");
937 if constexpr (ca::EDetectorID::kSts == DetID) {
938 MakeQaDirectory(
"Summary/vs N digi");
940 MakeQaDirectory(
"All stations");
942 fvph_hit_xy.resize(nSt + 1,
nullptr);
943 fvph_hit_zy.resize(nSt + 1,
nullptr);
944 fvph_hit_zx.resize(nSt + 1,
nullptr);
946 fvph_hit_station_delta_z.resize(nSt + 1,
nullptr);
948 fvph_hit_dx.resize(nSt + 1,
nullptr);
949 fvph_hit_dy.resize(nSt + 1,
nullptr);
950 fvph_hit_dt.resize(nSt + 1,
nullptr);
951 fvph_hit_dv.resize(nSt + 1,
nullptr);
952 fvph_hit_kuv.resize(nSt + 1,
nullptr);
953 fvph_hit_du.resize(nSt + 1,
nullptr);
955 std::string detName = fpDetInterface->GetDetectorName();
957 for (
int iSt = 0; iSt <= nSt; ++iSt) {
959 sF += (iSt == nSt) ?
"All stations/" : Form(
"Station %d/", iSt);
960 TString nsuff = (iSt == nSt) ?
"" : Form(
"_st%d", iSt);
961 TString tsuff = (iSt == nSt) ?
"" : Form(
" in %s station %d", detName.c_str(), iSt);
966 MakeQaDirectory(sF +
"occup/");
968 MakeQaDirectory(sF +
"res/");
969 MakeQaDirectory(sF +
"pull/");
970 MakeQaDirectory(sF +
"eff/");
972 MakeQaDirectory(sF +
"err/");
974 int nBinsZ = (iSt < nSt) ? fNbins : fNbinsZ;
977 sN = (TString)
"hit_xy" + nsuff;
978 sT = (TString)
"Hit occupancy in xy-Plane" + tsuff +
";x_{hit} [cm];y_{hit} [cm]";
980 MakeQaObject<TH2F>(sF +
"occup/" + sN, sT, fNbins, frXmin[iSt], frXmax[iSt], fNbins, frYmin[iSt], frYmax[iSt]);
982 sN = (TString)
"hit_zx" + nsuff;
983 sT = (TString)
"Hit occupancy in xz-Plane" + tsuff +
";z_{hit} [cm];x_{hit} [cm]";
985 MakeQaObject<TH2F>(sF +
"occup/" + sN, sT, nBinsZ, frZmin[iSt], frZmax[iSt], fNbins, frXmin[iSt], frXmax[iSt]);
987 sN = (TString)
"hit_zy" + nsuff;
988 sT = (TString)
"Hit occupancy in yz-plane" + tsuff +
";z_{hit} [cm];y_{hit} [cm]";
990 MakeQaObject<TH2F>(sF +
"occup/" + sN, sT, nBinsZ, frZmin[iSt], frZmax[iSt], fNbins, frYmin[iSt], frYmax[iSt]);
993 sN = (TString)
"hit_dx" + nsuff;
994 sT = (TString)
"Hit position error along x-axis" + tsuff +
";dx_{hit} [cm]";
995 fvph_hit_dx[iSt] = MakeQaObject<TH1F>(sF +
"err/" + sN, sT, fNbins, fRHitDx[0], fRHitDx[1]);
997 sN = (TString)
"hit_dy" + nsuff;
998 sT = (TString)
"Hit position error along y-axis" + tsuff +
";dy_{hit} [cm]";
999 fvph_hit_dy[iSt] = MakeQaObject<TH1F>(sF +
"err/" + sN, sT, fNbins, fRHitDy[0], fRHitDy[1]);
1001 sN = (TString)
"hit_du" + nsuff;
1002 sT = (TString)
"Hit position error along the major detector coordinate U" + tsuff +
";du_{hit} [cm]";
1003 fvph_hit_du[iSt] = MakeQaObject<TH1F>(sF +
"err/" + sN, sT, fNbins, fRHitDu[0], fRHitDu[1]);
1005 sN = (TString)
"hit_dv" + nsuff;
1006 sT = (TString)
"Hit position error along the minor detector coordinate V" + tsuff +
";dv_{hit} [cm]";
1007 fvph_hit_dv[iSt] = MakeQaObject<TH1F>(sF +
"err/" + sN, sT, fNbins, fRHitDv[0], fRHitDv[1]);
1009 sN = (TString)
"hit_kuv" + nsuff;
1010 sT = (TString)
"Hit error correlation between the major (U) and the minor detector coordinate Vs" + tsuff
1011 +
";kuv_{hit} [unitless]";
1012 fvph_hit_kuv[iSt] = MakeQaObject<TH1F>(sF +
"err/" + sN, sT, fNbins / 2 * 2 + 1, -1.1, 1.1);
1014 sN = (TString)
"hit_dt" + nsuff;
1015 sT = (TString)
"Hit time error" + tsuff +
";dt_{hit} [ns]";
1016 fvph_hit_dt[iSt] = MakeQaObject<TH1F>(sF +
"err/" + sN, sT, fNbins, fRHitDt[0], fRHitDt[1]);
1018 sN = (TString)
"hit_station_delta_z" + nsuff;
1019 sT = (TString)
"Different between hit and station z-positions" + tsuff +
";z_{hit} - z_{st} [cm]";
1020 fvph_hit_station_delta_z[iSt] = MakeQaObject<TH1F>(sF + sN, sT, fNbins, -5., 5.);
1027 fvph_n_points_per_hit.resize(nSt + 1,
nullptr);
1028 fvph_point_xy.resize(nSt + 1,
nullptr);
1029 fvph_point_zx.resize(nSt + 1,
nullptr);
1030 fvph_point_zy.resize(nSt + 1,
nullptr);
1031 fvph_point_hit_delta_z.resize(nSt + 1,
nullptr);
1032 fvph_res_x.resize(nSt + 1,
nullptr);
1033 fvph_res_y.resize(nSt + 1,
nullptr);
1034 fvph_res_u.resize(nSt + 1,
nullptr);
1035 fvph_res_v.resize(nSt + 1,
nullptr);
1036 fvph_res_t.resize(nSt + 1,
nullptr);
1037 fvph_pull_x.resize(nSt + 1,
nullptr);
1038 fvph_pull_y.resize(nSt + 1,
nullptr);
1039 fvph_pull_u.resize(nSt + 1,
nullptr);
1040 fvph_pull_v.resize(nSt + 1,
nullptr);
1041 fvph_pull_t.resize(nSt + 1,
nullptr);
1042 fvph_res_x_vs_x.resize(nSt + 1,
nullptr);
1043 fvph_res_y_vs_y.resize(nSt + 1,
nullptr);
1044 fvph_res_u_vs_u.resize(nSt + 1,
nullptr);
1045 fvph_res_v_vs_v.resize(nSt + 1,
nullptr);
1046 fvph_res_t_vs_t.resize(nSt + 1,
nullptr);
1047 fvph_pull_x_vs_x.resize(nSt + 1,
nullptr);
1048 fvph_pull_y_vs_y.resize(nSt + 1,
nullptr);
1049 fvph_pull_u_vs_u.resize(nSt + 1,
nullptr);
1050 fvph_pull_v_vs_v.resize(nSt + 1,
nullptr);
1051 fvph_pull_t_vs_t.resize(nSt + 1,
nullptr);
1052 fvpe_reco_eff_vs_xy.resize(nSt + 1,
nullptr);
1053 fvph_reco_eff.resize(nSt + 1,
nullptr);
1055 for (
int iSt = 0; iSt <= nSt; ++iSt) {
1057 sF += (iSt == nSt) ?
"All stations/" : Form(
"Station %d/", iSt);
1058 TString nsuff = (iSt == nSt) ?
"" : Form(
"_st%d", iSt);
1059 TString tsuff = (iSt == nSt) ?
"" : Form(
" in %s station %d", detName.c_str(), iSt);
1063 sN = (TString)
"n_points_per_hit" + nsuff;
1064 sT = (TString)
"Number of points per hit" + tsuff +
";N_{point}/hit";
1065 fvph_n_points_per_hit[iSt] = MakeQaObject<TH1F>(sF + sN, sT, 10, -0.5, 9.5);
1068 sN = (TString)
"point_xy" + nsuff;
1069 sT = (TString)
"Point occupancy in XY plane" + tsuff +
";x_{MC} [cm];y_{MC} [cm]";
1070 fvph_point_xy[iSt] =
1071 MakeQaObject<TH2F>(sF +
"occup/" + sN, sT, fNbins, frXmin[iSt], frXmax[iSt], fNbins, frYmin[iSt], frYmax[iSt]);
1073 sN = (TString)
"point_zx" + nsuff;
1074 sT = (TString)
"Point Occupancy in XZ plane" + tsuff +
";z_{MC} [cm];x_{MC} [cm]";
1075 fvph_point_zx[iSt] =
1076 MakeQaObject<TH2F>(sF +
"occup/" + sN, sT, fNbinsZ, frZmin[iSt], frZmax[iSt], fNbins, frXmin[iSt], frXmax[iSt]);
1078 sN = (TString)
"point_zy" + nsuff;
1079 sT = (TString)
"Point Occupancy in YZ Plane" + tsuff +
";z_{MC} [cm];y_{MC} [cm]";
1080 fvph_point_zy[iSt] =
1081 MakeQaObject<TH2F>(sF +
"occup/" + sN, sT, fNbinsZ, frZmin[iSt], frZmax[iSt], fNbins, frYmin[iSt], frYmax[iSt]);
1084 sN = (TString)
"point_hit_delta_z" + nsuff;
1085 sT = (TString)
"Distance between " + detName +
" point and hit along z axis" + tsuff +
";z_{reco} - z_{MC} [cm]";
1086 fvph_point_hit_delta_z[iSt] = MakeQaObject<TH1F>(sF + sN, sT, fNbins, fRangeDzHitPoint[0], fRangeDzHitPoint[1]);
1088 sN = (TString)
"res_x" + nsuff;
1089 sT = (TString)
"Residuals for X" + tsuff +
";x_{reco} - x_{MC} [cm]";
1090 fvph_res_x[iSt] = MakeQaObject<TH1F>(sF +
"res/" + sN, sT, fNbins, fRResX[0], fRResX[1]);
1092 sN = (TString)
"res_y" + nsuff;
1093 sT = (TString)
"Residuals for Y" + tsuff +
";y_{reco} - y_{MC} [cm]";
1094 fvph_res_y[iSt] = MakeQaObject<TH1F>(sF +
"res/" + sN, sT, fNbins, fRResY[0], fRResY[1]);
1096 sN = (TString)
"res_u" + nsuff;
1097 sT = (TString)
"Residuals for the major detector coordinate U" + tsuff +
";u_{reco} - u_{MC} [cm]";
1098 fvph_res_u[iSt] = MakeQaObject<TH1F>(sF +
"res/" + sN, sT, fNbins, fRResU[0], fRResU[1]);
1100 sN = (TString)
"res_v" + nsuff;
1101 sT = (TString)
"Residuals for the minor detector coordinate V" + tsuff +
";v_{reco} - v_{MC} [cm]";
1102 fvph_res_v[iSt] = MakeQaObject<TH1F>(sF +
"res/" + sN, sT, fNbins, fRResV[0], fRResV[1]);
1104 sN = (TString)
"res_t" + nsuff;
1105 sT = (TString)
"Residuals for Time" + tsuff +
";t_{reco} - t_{MC} [ns]";
1106 fvph_res_t[iSt] = MakeQaObject<TH1F>(sF +
"res/" + sN, sT, fNbins, fRResT[0], fRResT[1]);
1108 sN = (TString)
"pull_x" + nsuff;
1109 sT = (TString)
"Pulls for X" + tsuff +
";(x_{reco} - x_{MC}) / #sigma_{x}^{reco}";
1110 fvph_pull_x[iSt] = MakeQaObject<TH1F>(sF +
"pull/" + sN, sT, kNbinsPull, kRPull[0], kRPull[1]);
1112 sN = (TString)
"pull_y" + nsuff;
1113 sT = (TString)
"Pulls for Y" + tsuff +
";(y_{reco} - y_{MC}) / #sigma_{y}^{reco}";
1114 fvph_pull_y[iSt] = MakeQaObject<TH1F>(sF +
"pull/" + sN, sT, kNbinsPull, kRPull[0], kRPull[1]);
1116 sN = (TString)
"pull_u" + nsuff;
1117 sT = (TString)
"Pulls for the major detector coordinate U" + tsuff +
";(u_{reco} - u_{MC}) / #sigma_{u}^{reco}";
1118 fvph_pull_u[iSt] = MakeQaObject<TH1F>(sF +
"pull/" + sN, sT, kNbinsPull, kRPull[0], kRPull[1]);
1120 sN = (TString)
"pull_v" + nsuff;
1121 sT = (TString)
"Pulls for the minor detector coordinate V" + tsuff +
";(v_{reco} - v_{MC}) / #sigma_{v}^{reco}";
1122 fvph_pull_v[iSt] = MakeQaObject<TH1F>(sF +
"pull/" + sN, sT, kNbinsPull, kRPull[0], kRPull[1]);
1124 sN = (TString)
"pull_t" + nsuff;
1125 sT = (TString)
"Pulls for Time" + tsuff +
";(t_{reco} - t_{MC}) / #sigma_{t}^{reco}";
1126 fvph_pull_t[iSt] = MakeQaObject<TH1F>(sF +
"pull/" + sN, sT, kNbinsPull, kRPull[0], kRPull[1]);
1128 sN = (TString)
"res_x_vs_x" + nsuff;
1129 sT = (TString)
"Residuals for X" + tsuff +
";x_{MC} [cm];x_{reco} - x_{MC} [cm]";
1130 fvph_res_x_vs_x[iSt] =
1131 MakeQaObject<TH2F>(sF +
"res/" + sN, sT, fNbins, frXmin[iSt], frXmax[iSt], fNbins, fRResX[0], fRResX[1]);
1133 sN = (TString)
"res_y_vs_y" + nsuff;
1134 sT = (TString)
"Residuals for Y" + tsuff +
";y_{MC} [cm];y_{reco} - y_{MC} [cm]";
1135 fvph_res_y_vs_y[iSt] =
1136 MakeQaObject<TH2F>(sF +
"res/" + sN, sT, fNbins, frYmin[iSt], frYmax[iSt], fNbins, fRResY[0], fRResY[1]);
1138 sN = (TString)
"res_u_vs_u" + nsuff;
1139 sT = (TString)
"Residuals for the major detector coordinate U" + tsuff +
";u_{MC} [cm];u_{reco} - u_{MC} [cm]";
1140 fvph_res_u_vs_u[iSt] =
1141 MakeQaObject<TH2F>(sF +
"res/" + sN, sT, fNbins, frXmin[iSt], frXmax[iSt], fNbins, fRResU[0], fRResU[1]);
1143 sN = (TString)
"res_v_vs_v" + nsuff;
1144 sT = (TString)
"Residuals for the minor detector coordinate V" + tsuff +
";v_{MC} [cm];v_{reco} - v_{MC} [cm]";
1145 fvph_res_v_vs_v[iSt] =
1146 MakeQaObject<TH2F>(sF +
"res/" + sN, sT, fNbins, frXmin[iSt], frXmax[iSt], fNbins, fRResV[0], fRResV[1]);
1148 sN = (TString)
"res_t_vs_t" + nsuff;
1149 sT = (TString)
"Residuals for Time" + tsuff +
";t_{MC} [ns];t_{reco} - t_{MC} [ns]";
1150 fvph_res_t_vs_t[iSt] = MakeQaObject<TH2F>(sF +
"res/" + sN, sT, fNbins, 0, 0, fNbins, fRResT[0], fRResT[1]);
1152 sN = (TString)
"pull_x_vs_x" + nsuff;
1153 sT = (TString)
"Pulls for X" + tsuff +
";x_{MC} [cm];(x_{reco} - x_{MC}) / #sigma_{x}^{reco}";
1154 fvph_pull_x_vs_x[iSt] =
1155 MakeQaObject<TH2F>(sF +
"pull/" + sN, sT, fNbins, frXmin[iSt], frXmax[iSt], kNbinsPull, kRPull[0], kRPull[1]);
1157 sN = (TString)
"pull_y_vs_y" + nsuff;
1158 sT = (TString)
"Pulls for Y" + tsuff +
";y_{MC} [cm];(y_{reco} - y_{MC}) / #sigma_{y}^{reco}";
1159 fvph_pull_y_vs_y[iSt] =
1160 MakeQaObject<TH2F>(sF +
"pull/" + sN, sT, fNbins, frYmin[iSt], frYmax[iSt], kNbinsPull, kRPull[0], kRPull[1]);
1162 sN = (TString)
"pull_u_vs_u" + nsuff;
1163 sT = (TString)
"Pulls for the major detector coordinate U" + tsuff
1164 +
";u_{MC} [cm];(u_{reco} - u_{MC}) / #sigma_{u}^{reco}";
1165 fvph_pull_u_vs_u[iSt] =
1166 MakeQaObject<TH2F>(sF +
"pull/" + sN, sT, fNbins, frXmin[iSt], frXmax[iSt], kNbinsPull, kRPull[0], kRPull[1]);
1168 sN = (TString)
"pull_v_vs_v" + nsuff;
1169 sT = (TString)
"Pulls for the minor detector coordinate V" + tsuff
1170 +
";v_{MC} [cm];(v_{reco} - v_{MC}) / #sigma_{v}^{reco}";
1171 fvph_pull_v_vs_v[iSt] =
1172 MakeQaObject<TH2F>(sF +
"pull/" + sN, sT, fNbins, frXmin[iSt], frXmax[iSt], kNbinsPull, kRPull[0], kRPull[1]);
1174 sN = (TString)
"pull_t_vs_t" + nsuff;
1175 sT = (TString)
"Pulls for Time" + tsuff +
";t_{MC} [ns];(t_{reco} - t_{MC}) / #sigma_{t}^{reco}";
1176 fvph_pull_t_vs_t[iSt] = MakeQaObject<TH2F>(sF +
"pull/" + sN, sT, fNbins, 0, 0, fNbins, kRPull[0], kRPull[1]);
1178 sN = (TString)
"reco_eff_vs_xy" + nsuff;
1179 sT = (TString)
"Hit rec. efficiency in XY" + tsuff +
";x_{MC} [cm];y_{MC} [cm];#epsilon";
1180 fvpe_reco_eff_vs_xy[iSt] = MakeQaObject<TProfile2D>(sF +
"eff/" + sN, sT, fNbins, frXmin[iSt], frXmax[iSt],
1181 fNbins, frYmin[iSt], frYmax[iSt]);
1183 sN = (TString)
"reco_eff" + nsuff;
1184 sT = (TString)
"Hit rec. efficiency in XY bins" + tsuff +
";eff";
1185 fvph_reco_eff[iSt] = MakeQaObject<TH1F>(sF +
"eff/" + sN, sT, 130, -0.005, 1.30 - 0.005);
1197 gStyle->SetOptFit(1);
1198 int nSt = fpDetInterface->GetNtrackingStations();
1204 constexpr auto contColor = kOrange + 7;
1205 constexpr auto contWidth = 2;
1206 constexpr auto contStyle = 2;
1207 constexpr auto contFill = 0;
1213 auto* canv = MakeQaObject<TCanvas>(
"occ_hit",
"Hit Occupancy", 1600, 800);
1216 fvph_hit_xy[nSt]->DrawCopy(
"colz",
"");
1218 fvph_hit_zx[nSt]->DrawCopy(
"colz",
"");
1220 fvph_hit_zy[nSt]->DrawCopy(
"colz",
"");
1224 auto* canv = MakeQaObject<TCanvas>(
"occ_point",
"Point Occupancy", 1600, 800);
1227 fvph_point_xy[nSt]->DrawCopy(
"colz",
"");
1229 fvph_point_zx[nSt]->DrawCopy(
"colz",
"");
1231 fvph_point_zy[nSt]->DrawCopy(
"colz",
"");
1235 auto* canv = MakeQaObject<TCanvas>(
"residual",
"Hit Residuals", 1600, 800);
1238 fvph_res_x[nSt]->DrawCopy(
"colz",
"");
1240 fvph_res_y[nSt]->DrawCopy(
"colz",
"");
1242 fvph_res_t[nSt]->DrawCopy(
"colz",
"");
1244 fvph_res_u[nSt]->DrawCopy(
"colz",
"");
1246 fvph_res_v[nSt]->DrawCopy(
"colz",
"");
1250 auto* canv = MakeQaObject<TCanvas>(
"pull",
"Hit Pulls", 1600, 800);
1253 fvph_pull_x[nSt]->DrawCopy(
"colz",
"");
1255 fvph_pull_y[nSt]->DrawCopy(
"colz",
"");
1257 fvph_pull_t[nSt]->DrawCopy(
"colz",
"");
1259 fvph_pull_u[nSt]->DrawCopy(
"colz",
"");
1261 fvph_pull_v[nSt]->DrawCopy(
"colz",
"");
1265 auto* canv = MakeQaObject<TCanvas>(
"eff",
"Hit Reconstruction Efficiency", 1600, 800);
1268 fvpe_reco_eff_vs_xy[nSt]->DrawCopy(
"colz",
"");
1270 fvph_reco_eff[nSt]->DrawCopy(
"colz",
"");
1274 auto* canv = MakeQaObject<TCanvas>(
"err",
"Hit Errors", 1600, 800);
1277 fvph_hit_dx[nSt]->DrawCopy();
1279 fvph_hit_dy[nSt]->DrawCopy();
1281 fvph_hit_dt[nSt]->DrawCopy();
1283 fvph_hit_du[nSt]->DrawCopy();
1285 fvph_hit_dv[nSt]->DrawCopy();
1287 fvph_hit_kuv[nSt]->DrawCopy();
1292 auto* canv = MakeQaObject<TCanvas>(
"other",
"Other histograms", 1600, 800);
1295 fvph_n_points_per_hit[nSt]->DrawCopy(
"colz",
"");
1297 fvph_hit_station_delta_z[nSt]->DrawCopy(
"colz",
"");
1299 fvph_point_hit_delta_z[nSt]->DrawCopy(
"colz",
"");
1307 auto* canv = MakeQaObject<TCanvas>(
"vs Station/hit_xy",
"", 1600, 800);
1308 canv->DivideSquare(nSt);
1309 for (
int iSt = 0; iSt < nSt; ++iSt) {
1311 fvph_hit_xy[iSt]->DrawCopy(
"colz",
"");
1314 double stXmin = fpDetInterface->GetXmin(iSt);
1315 double stXmax = fpDetInterface->GetXmax(iSt);
1316 double stYmin = fpDetInterface->GetYmin(iSt);
1317 double stYmax = fpDetInterface->GetYmax(iSt);
1319 auto* pBox =
new TBox(stXmin, stYmin, stXmax, stYmax);
1320 pBox->SetLineWidth(contWidth);
1321 pBox->SetLineStyle(contStyle);
1322 pBox->SetLineColor(contColor);
1323 pBox->SetFillStyle(contFill);
1329 auto* canv = MakeQaObject<TCanvas>(
"vs Station/hit_zx",
"", 1600, 800);
1331 fvph_hit_zx[nSt]->DrawCopy(
"colz",
"");
1332 for (
int iSt = 0; iSt < nSt; ++iSt) {
1334 double stZmin = fpDetInterface->GetZmin(iSt);
1335 double stZmax = fpDetInterface->GetZmax(iSt);
1336 double stHmin = fpDetInterface->GetXmin(iSt);
1337 double stHmax = fpDetInterface->GetXmax(iSt);
1339 auto* pBox =
new TBox(stZmin, stHmin, stZmax, stHmax);
1340 pBox->SetLineWidth(contWidth);
1341 pBox->SetLineStyle(contStyle);
1342 pBox->SetLineColor(contColor);
1343 pBox->SetFillStyle(contFill);
1349 auto* canv = MakeQaObject<TCanvas>(
"vs Station/hit_zy",
"", 1600, 800);
1351 fvph_hit_zy[nSt]->DrawCopy(
"colz",
"");
1352 for (
int iSt = 0; iSt < nSt; ++iSt) {
1354 double stZmin = fpDetInterface->GetZmin(iSt);
1355 double stZmax = fpDetInterface->GetZmax(iSt);
1356 double stHmin = fpDetInterface->GetYmin(iSt);
1357 double stHmax = fpDetInterface->GetYmax(iSt);
1359 auto* pBox =
new TBox(stZmin, stHmin, stZmax, stHmax);
1360 pBox->SetLineWidth(contWidth);
1361 pBox->SetLineStyle(contStyle);
1362 pBox->SetLineColor(contColor);
1363 pBox->SetFillStyle(contFill);
1377 auto* canv = MakeQaObject<TCanvas>(
"vs Station/point_xy",
"", 1600, 800);
1378 canv->DivideSquare(nSt);
1379 for (
int iSt = 0; iSt < nSt; ++iSt) {
1381 fvph_point_xy[iSt]->DrawCopy(
"colz",
"");
1384 double stXmin = fpDetInterface->GetXmin(iSt);
1385 double stXmax = fpDetInterface->GetXmax(iSt);
1386 double stYmin = fpDetInterface->GetYmin(iSt);
1387 double stYmax = fpDetInterface->GetYmax(iSt);
1389 auto* pBox =
new TBox(stXmin, stYmin, stXmax, stYmax);
1390 pBox->SetLineWidth(contWidth);
1391 pBox->SetLineStyle(contStyle);
1392 pBox->SetLineColor(contColor);
1393 pBox->SetFillStyle(contFill);
1399 auto* canv = MakeQaObject<TCanvas>(
"vs Station/point_zx",
"", 1600, 800);
1401 fvph_point_zx[nSt]->DrawCopy(
"colz",
"");
1402 for (
int iSt = 0; iSt < nSt; ++iSt) {
1404 double stZmin = fpDetInterface->GetZmin(iSt);
1405 double stZmax = fpDetInterface->GetZmax(iSt);
1406 double stHmin = fpDetInterface->GetXmin(iSt);
1407 double stHmax = fpDetInterface->GetXmax(iSt);
1409 auto* pBox =
new TBox(stZmin, stHmin, stZmax, stHmax);
1410 pBox->SetLineWidth(contWidth);
1411 pBox->SetLineStyle(contStyle);
1412 pBox->SetLineColor(contColor);
1413 pBox->SetFillStyle(contFill);
1419 auto* canv = MakeQaObject<TCanvas>(
"vs Station/point_zy",
"", 1600, 800);
1421 fvph_point_zy[nSt]->DrawCopy(
"colz",
"");
1422 for (
int iSt = 0; iSt < nSt; ++iSt) {
1424 double stZmin = fpDetInterface->GetZmin(iSt);
1425 double stZmax = fpDetInterface->GetZmax(iSt);
1426 double stHmin = fpDetInterface->GetYmin(iSt);
1427 double stHmax = fpDetInterface->GetYmax(iSt);
1429 auto* pBox =
new TBox(stZmin, stHmin, stZmax, stHmax);
1430 pBox->SetLineWidth(contWidth);
1431 pBox->SetLineStyle(contStyle);
1432 pBox->SetLineColor(contColor);
1433 pBox->SetFillStyle(contFill);
1442 auto* canv = MakeQaObject<TCanvas>(
"vs Station/res_x",
"Residuals for x coordinate", 1600, 800);
1443 canv->DivideSquare(nSt);
1444 for (
int iSt = 0; iSt < nSt; ++iSt) {
1446 fvph_res_x[iSt]->DrawCopy(
"",
"");
1451 auto* canv = MakeQaObject<TCanvas>(
"vs Station/res_y",
"Residuals for y coordinate", 1600, 800);
1452 canv->DivideSquare(nSt);
1453 for (
int iSt = 0; iSt < nSt; ++iSt) {
1455 fvph_res_y[iSt]->DrawCopy(
"",
"");
1460 auto* canv = MakeQaObject<TCanvas>(
"vs Station/res_u",
"Residuals for u coordinate", 1600, 800);
1461 canv->DivideSquare(nSt);
1462 for (
int iSt = 0; iSt < nSt; ++iSt) {
1464 fvph_res_u[iSt]->DrawCopy(
"",
"");
1469 auto* canv = MakeQaObject<TCanvas>(
"vs Station/res_v",
"Residuals for v coordinate", 1600, 800);
1470 canv->DivideSquare(nSt);
1471 for (
int iSt = 0; iSt < nSt; ++iSt) {
1473 fvph_res_v[iSt]->DrawCopy(
"",
"");
1478 auto* canv = MakeQaObject<TCanvas>(
"vs Station/res_t",
"Residuals for time", 1600, 800);
1479 canv->DivideSquare(nSt);
1480 for (
int iSt = 0; iSt < nSt; ++iSt) {
1482 fvph_res_t[iSt]->DrawCopy(
"",
"");
1491 auto* canv = MakeQaObject<TCanvas>(
"vs Station/pull_x",
"Pulls for x coordinate", 1600, 800);
1492 canv->DivideSquare(nSt);
1493 for (
int iSt = 0; iSt < nSt; ++iSt) {
1495 fvph_pull_x[iSt]->DrawCopy(
"",
"");
1500 auto* canv = MakeQaObject<TCanvas>(
"vs Station/pull_y",
"Pulls for y coordinate", 1600, 800);
1501 canv->DivideSquare(nSt);
1502 for (
int iSt = 0; iSt < nSt; ++iSt) {
1504 fvph_pull_y[iSt]->DrawCopy(
"",
"");
1509 auto* canv = MakeQaObject<TCanvas>(
"vs Station/pull_u",
"Pulls for u coordinate", 1600, 800);
1510 canv->DivideSquare(nSt);
1511 for (
int iSt = 0; iSt < nSt; ++iSt) {
1513 fvph_pull_u[iSt]->DrawCopy(
"",
"");
1518 auto* canv = MakeQaObject<TCanvas>(
"vs Station/pull_v",
"Pulls for v coordinate", 1600, 800);
1519 canv->DivideSquare(nSt);
1520 for (
int iSt = 0; iSt < nSt; ++iSt) {
1522 fvph_pull_v[iSt]->DrawCopy(
"",
"");
1527 auto* canv = MakeQaObject<TCanvas>(
"vs Station/pull_t",
"Pulls for time", 1600, 800);
1528 canv->DivideSquare(nSt);
1529 for (
int iSt = 0; iSt < nSt; ++iSt) {
1531 fvph_pull_t[iSt]->DrawCopy(
"",
"");
1539 auto* canv = MakeQaObject<TCanvas>(
"vs Station/reco_eff",
"Hit efficiencies in xy bins", 1600, 800);
1540 canv->DivideSquare(nSt);
1541 for (
int iSt = 0; iSt < nSt; ++iSt) {
1544 fvph_reco_eff[iSt]->DrawCopy();
1549 auto* canv = MakeQaObject<TCanvas>(
"vs Station/reco_eff_vs_xy",
"Hit efficiencies wrt x and y", 1600, 800);
1550 canv->DivideSquare(nSt);
1551 for (
int iSt = 0; iSt < nSt; ++iSt) {
1553 fvpe_reco_eff_vs_xy[iSt]->DrawCopy(
"colz",
"");