From 69b3fd077ce1676698ffae5896af2baeffe49dc7 Mon Sep 17 00:00:00 2001 From: Alexandru Bercuci <abercuci@niham.nipne.ro> Date: Thu, 5 May 2022 15:42:26 +0200 Subject: [PATCH] store digits on the QA structure to complete the history of reconstruction --- reco/detectors/trd/qa/data/CbmTrdHitMC.cxx | 77 +++++++++++++++++++--- reco/detectors/trd/qa/data/CbmTrdHitMC.h | 57 +++++++++++++--- 2 files changed, 114 insertions(+), 20 deletions(-) diff --git a/reco/detectors/trd/qa/data/CbmTrdHitMC.cxx b/reco/detectors/trd/qa/data/CbmTrdHitMC.cxx index f93565e2ad..db3f1ea430 100644 --- a/reco/detectors/trd/qa/data/CbmTrdHitMC.cxx +++ b/reco/detectors/trd/qa/data/CbmTrdHitMC.cxx @@ -4,12 +4,16 @@ #include "CbmTrdHitMC.h" +#include "CbmTrdDigi.h" + #include <TDatabasePDG.h> #include <TParticlePDG.h> #include <TVector3.h> #include <sstream> +// Error parametrization +int CbmTrdHitMC::fSx[5][2] = {{190, 2321}, {147, 1920}, {50, 1461}, {22, 2094}, {21, 4297}}; //_____________________________________________________________________ CbmTrdHitMC::CbmTrdHitMC() : CbmTrdHit() {} @@ -20,10 +24,7 @@ CbmTrdHitMC::CbmTrdHitMC(const CbmTrdHit& h) : CbmTrdHit(h) {} CbmTrdHitMC::~CbmTrdHitMC() {} //_____________________________________________________________________ -void CbmTrdHitMC::AddCluster(const CbmTrdCluster* c) -{ - fCluster = *c; -} +void CbmTrdHitMC::AddCluster(const CbmTrdCluster* c) { fCluster = *c; } //_____________________________________________________________________ size_t CbmTrdHitMC::AddPoint(const CbmTrdPoint* p, double t, int id) @@ -33,10 +34,27 @@ size_t CbmTrdHitMC::AddPoint(const CbmTrdPoint* p, double t, int id) } //_____________________________________________________________________ -size_t CbmTrdHitMC::AddSignal(double s, int t) +size_t CbmTrdHitMC::AddSignal(const CbmTrdDigi* digi, uint64_t t0) +{ + if (GetClassType() == 1) { // TRD2D type + int dt; + double t, r = digi->GetCharge(t, dt); + fTrdSignals.push_back(std::make_pair(t, digi->GetTimeDAQ() - t0)); + fTrdSignals.push_back(std::make_pair(r, digi->GetTimeDAQ() + dt - t0)); + } + else // TRD1D type + fTrdSignals.push_back(std::make_pair(digi->GetCharge(), digi->GetTime() - t0)); + + return fTrdSignals.size(); +} + +//_____________________________________________________________________ +size_t CbmTrdHitMC::PurgeSignals() { - printf("hit%dD : s(%f) t(%d)\n", (GetClassType() ? 2 : 1), s, t); - fTrdSignals.push_back(std::make_pair(s, t)); + if (!GetNSignals()) return 0; + if (fTrdSignals.front().first < 1.e-3) fTrdSignals.erase(fTrdSignals.begin()); + if (fTrdSignals.back().first < 1.e-3) fTrdSignals.pop_back(); + return fTrdSignals.size(); } @@ -47,6 +65,28 @@ const CbmTrdPoint* CbmTrdHitMC::GetPoint(uint idx) const return &std::get<0>(fTrdPoints[idx]); } +//_____________________________________________________________________ +double CbmTrdHitMC::GetSignal(uint idx) const +{ + if (idx >= fTrdSignals.size()) return 0; + return fTrdSignals[idx].first; +} + +//_____________________________________________________________________ +CbmTrdHitMC::eCbmTrdHitMCshape CbmTrdHitMC::GetClShape() const +{ + if (fCluster.HasOpenStart()) { + if (fCluster.HasOpenStop()) return eCbmTrdHitMCshape::kRT; + else + return eCbmTrdHitMCshape::kRR; + } + else { + if (fCluster.HasOpenStop()) return eCbmTrdHitMCshape::kTT; + else + return eCbmTrdHitMCshape::kTR; + } +} + //_____________________________________________________________________ double CbmTrdHitMC::GetDx() const { @@ -56,6 +96,20 @@ double CbmTrdHitMC::GetDx() const return GetX() - x; } +//_____________________________________________________________________ +double CbmTrdHitMC::GetSx() const +{ + const CbmTrdPoint* p(nullptr); + if (!(p = GetPoint())) return 1; + double phi(p->GetPx() / p->GetPz()); + int isz = GetNSignals() - 2; + + if (isz < 0) isz = 0; + if (isz >= 5) isz = 4; + + return 1.e-4 * (fSx[isz][0] + phi * phi * fSx[isz][1]); // error in cm +} + //_____________________________________________________________________ double CbmTrdHitMC::GetDy() const { @@ -65,6 +119,9 @@ double CbmTrdHitMC::GetDy() const return GetY() - y; } +//_____________________________________________________________________ +double CbmTrdHitMC::GetSy() const { return GetDy(); } + //_____________________________________________________________________ double CbmTrdHitMC::GetDt() const { @@ -77,7 +134,7 @@ double CbmTrdHitMC::GetDt() const TParticlePDG* pmc = (TParticlePDG*) TDatabasePDG::Instance()->GetParticle(pdg); if (pdg < 9999999 && pmc) mass = pmc->Mass(); - + TVector3 mom3; p->Momentum(mom3); t += dz / (p->GetPz() * speedOfLight) * sqrt(mass * mass + mom3.Mag2()); @@ -86,10 +143,10 @@ double CbmTrdHitMC::GetDt() const //_____________________________________________________________________ std::string CbmTrdHitMC::ToString() const -{ +{ std::stringstream ss; for (auto mcp : fTrdPoints) { - ss << "Event time(ns)=" << std::get<1>(mcp) << " partId=" << std::get<2>(mcp) << "\n"; + ss << "Event time(ns)=" << std::get<1>(mcp) << " partId=" << std::get<2>(mcp) << "\n"; ss << std::get<0>(mcp).ToString(); } diff --git a/reco/detectors/trd/qa/data/CbmTrdHitMC.h b/reco/detectors/trd/qa/data/CbmTrdHitMC.h index a2cff1f130..1be20cd029 100644 --- a/reco/detectors/trd/qa/data/CbmTrdHitMC.h +++ b/reco/detectors/trd/qa/data/CbmTrdHitMC.h @@ -5,12 +5,12 @@ #ifndef CBMTRDHITMC_H #define CBMTRDHITMC_H +#include "CbmTrdCluster.h" #include "CbmTrdHit.h" #include "CbmTrdPoint.h" -#include "CbmTrdCluster.h" -#include <vector> // for fTrdPoints #include <string> // for ToString +#include <vector> // for fTrdPoints /** \class CbmTrdHitMC * \brief TRD hit to MC point correlation class @@ -24,8 +24,17 @@ * To describe main functionality ... */ +class CbmTrdDigi; class CbmTrdHitMC : public CbmTrdHit { public: + enum eCbmTrdHitMCshape + { + kRT = 0, // open left - open right shape + kRR, // open left - closed right shape + kTT, // closed left - open right shape + kTR // closed left - closed right shape + }; + /** \brief Default constructor.*/ CbmTrdHitMC(); @@ -46,29 +55,55 @@ public: */ size_t AddPoint(const CbmTrdPoint* p, double t, int id); /** \brief Add signal values in the increasing order of pad index - * \param s signal from ch/pad - * \param t relative time in the cluster + * \param d digi from ch/pad + * \param t0 relative time in the cluster * \return the number of signals in the cluster */ - size_t AddSignal(double s, int t); + size_t AddSignal(const CbmTrdDigi* d, uint64_t t0); + + /** \brief return MC pile-up size*/ + std::string GetErrorMsg() const { return fErrMsg; } /** \brief Register a MC point * \param idx index of point being requested. by default the best fit is returned. */ const CbmTrdPoint* GetPoint(uint idx = 0) const; + /** \brief return signal at position + * \param idx index of signal counting from left to right looking upstream (from FEE). + */ + double GetSignal(uint idx = 0) const; + + /** \brief return MC pile-up size*/ + size_t GetNPoints() const { return fTrdPoints.size(); } + + /** \brief return cluster size*/ + size_t GetNSignals() const { return fTrdSignals.size(); } + + /** \brief return cluster shape according to the eCbmTrdHitMCshape definitions*/ + eCbmTrdHitMCshape GetClShape() const; + /** \brief Calculate residuals in the bending plane.*/ double GetDx() const; + /** \brief Calculate error in the bending plane.*/ + double GetSx() const; + /** \brief Calculate residuals for the azimuth direction.*/ double GetDy() const; + /** \brief Calculate error for the azimuth direction.*/ + double GetSy() const; + /** \brief Calculate residuals for time.*/ double GetDt() const; /** \brief Store error message.*/ void SetErrorMsg(std::string msg) { fErrMsg = msg; } - + + /** \brief Applies to TRD2D and remove 0 charges from the boundaries of the cluster.**/ + size_t PurgeSignals(); + /** \brief Verbosity functionality.**/ virtual std::string ToString() const; @@ -78,10 +113,12 @@ private: /** \brief Assignment operator.*/ CbmTrdHitMC& operator=(const CbmTrdHitMC&) = default; - std::string fErrMsg = ""; //< error message from the QA task - std::vector<std::pair<double, int>> fTrdSignals = {}; //< list of signal/time in cluster - std::vector<std::tuple<CbmTrdPoint, double, int>> fTrdPoints = {}; //< list of MC points together with the event time and particle PDG code producing them - CbmTrdCluster fCluster; //< data from the cluster + std::string fErrMsg = ""; //< error message from the QA task + std::vector<std::pair<double, int>> fTrdSignals = {}; //< list of signal/time in cluster + std::vector<std::tuple<CbmTrdPoint, double, int>> fTrdPoints = + {}; //< list of MC points together with the event time and particle PDG code producing them + CbmTrdCluster fCluster; //< data from the cluster + static int fSx[5][2]; //< x error parametrization as function of cluster size and incident direction ClassDef(CbmTrdHitMC, 1) // Hit to MC point data correlation }; -- GitLab