File indexing completed on 2025-08-06 08:18:50
0001 #include "TrackFittingQA.h"
0002
0003 #include <trackbase_historic/SvtxAlignmentState.h>
0004 #include <trackbase_historic/SvtxTrack.h>
0005 #include <trackbase_historic/SvtxTrackMap.h>
0006 #include <trackbase_historic/SvtxTrackState.h>
0007
0008 #include <qautils/QAHistManagerDef.h>
0009 #include <qautils/QAUtil.h>
0010
0011 #include <fun4all/Fun4AllHistoManager.h>
0012 #include <fun4all/Fun4AllReturnCodes.h>
0013 #include <fun4all/SubsysReco.h>
0014
0015 #include <phool/PHCompositeNode.h>
0016 #include <phool/getClass.h>
0017
0018 #include <Rtypes.h>
0019 #include <TH1F.h>
0020 #include <TH2F.h>
0021
0022 #include <format>
0023
0024 namespace
0025 {
0026 template <class T>
0027 class range_adaptor
0028 {
0029 public:
0030 explicit range_adaptor(
0031 T const& begin,
0032 T const& end)
0033 : m_begin(begin)
0034 , m_end(end)
0035 {
0036 }
0037 T const& begin() { return m_begin; }
0038 T const& end() { return m_end; }
0039
0040 private:
0041 T m_begin;
0042 T m_end;
0043 };
0044 }
0045
0046 TrackFittingQA::TrackFittingQA(const std::string& name)
0047 : SubsysReco(name)
0048 {
0049
0050 }
0051
0052 int TrackFittingQA::Init(PHCompositeNode* )
0053 {
0054 auto* hm = QAHistManagerDef::getHistoManager();
0055 if (!hm)
0056 {
0057 std::cout
0058 << PHWHERE << "\n"
0059 << "\tCould not get QAHistManager\n"
0060 << "\tAborting\n"
0061 << std::endl;
0062 return Fun4AllReturnCodes::ABORTRUN;
0063 }
0064
0065
0066
0067 for (int charge = 0; charge < 2; ++charge)
0068 {
0069 std::string charge_str = charge ? "positively" : "negatively";
0070 EColor color = charge ? kRed : kBlue;
0071
0072 delete m_quality_hist[charge];
0073 m_quality_hist[charge] = new TH1F(
0074 std::format("h_{}_quality_{}_charged_tracks", Name(), charge_str).c_str(),
0075 std::format("quality distribution ({} charged tracks);quality;Counts", charge_str).c_str(),
0076 50, 0.0, 100.0);
0077 hm->registerHisto(m_quality_hist[charge]);
0078 m_quality_hist[charge]->SetMarkerColor(color);
0079 m_quality_hist[charge]->SetLineColor(color);
0080
0081
0082 delete m_p_hist[charge];
0083 m_p_hist[charge] = new TH1F(
0084 std::format("h_{}_p_{}_charged_tracks", Name(), charge_str).c_str(),
0085 std::format("p distribution ({} charged tracks);p (GeV);Counts", charge_str).c_str(),
0086 50, 0.0, 8.0);
0087 hm->registerHisto(m_p_hist[charge]);
0088 m_p_hist[charge]->SetMarkerColor(color);
0089 m_p_hist[charge]->SetLineColor(color);
0090
0091
0092 delete m_pt_hist[charge];
0093 m_pt_hist[charge] = new TH1F(
0094 std::format("h_{}_pt_{}_charged_tracks", Name(), charge_str).c_str(),
0095 std::format("pt distribution ({} charged tracks);pt (GeV);Counts", charge_str).c_str(),
0096 50, 0.0, 8.0);
0097 hm->registerHisto(m_pt_hist[charge]);
0098 m_pt_hist[charge]->SetMarkerColor(color);
0099 m_pt_hist[charge]->SetLineColor(color);
0100
0101
0102 delete m_eta_hist[charge];
0103 m_eta_hist[charge] = new TH1F(
0104 std::format("h_{}_eta_{}_charged_tracks", Name(), charge_str).c_str(),
0105 std::format("eta distribution ({} charged tracks);eta;Counts", charge_str).c_str(),
0106 50, -1.2, 1.2);
0107 hm->registerHisto(m_eta_hist[charge]);
0108 m_eta_hist[charge]->SetMarkerColor(color);
0109 m_eta_hist[charge]->SetLineColor(color);
0110
0111
0112 delete m_phi_eta_hist[charge];
0113 m_phi_eta_hist[charge] = new TH2F(
0114 std::format("h_{}_phi_eta_{}_charged_tracks", Name(), charge_str).c_str(),
0115 std::format("phi-eta distribution ({} charged tracks);phi (radians);eta", charge_str).c_str(),
0116 50, -3.2, 3.2,
0117 50, -1.2, 1.2);
0118 hm->registerHisto(m_phi_eta_hist[charge]);
0119
0120
0121 delete m_mvtx_states_hist[charge];
0122 m_mvtx_states_hist[charge] = new TH1F(
0123 std::format("h_{}_mvtx_states_{}_charged_tracks", Name(), charge_str).c_str(),
0124 std::format("mvtx states distribution ({} charged tracks);number of mvtx states;tracks with that number of mvtx states", charge_str).c_str(),
0125 6, -0.5, 5.5);
0126 hm->registerHisto(m_mvtx_states_hist[charge]);
0127 m_mvtx_states_hist[charge]->SetMarkerColor(color);
0128 m_mvtx_states_hist[charge]->SetLineColor(color);
0129
0130
0131 delete m_intt_states_hist[charge];
0132 m_intt_states_hist[charge] = new TH1F(
0133 std::format("h_{}_intt_states_{}_charged_tracks", Name(), charge_str).c_str(),
0134 std::format("intt states distribution ({} charged tracks);number of intt states;tracks with that number of intt states", charge_str).c_str(),
0135 5, -0.5, 4.5);
0136 hm->registerHisto(m_intt_states_hist[charge]);
0137 m_intt_states_hist[charge]->SetMarkerColor(color);
0138 m_intt_states_hist[charge]->SetLineColor(color);
0139
0140
0141 delete m_tpc_states_hist[charge];
0142 m_tpc_states_hist[charge] = new TH1F(
0143 std::format("h_{}_tpc_states_{}_charged_tracks", Name(), charge_str).c_str(),
0144 std::format("tpc states distribution ({} charged tracks);number of tpc states;tracks with that number of tpc states", charge_str).c_str(),
0145 61, -0.5, 60.5);
0146 hm->registerHisto(m_tpc_states_hist[charge]);
0147 m_tpc_states_hist[charge]->SetMarkerColor(color);
0148 m_tpc_states_hist[charge]->SetLineColor(color);
0149
0150
0151 delete m_tpot_states_hist[charge];
0152 m_tpot_states_hist[charge] = new TH1F(
0153 std::format("h_{}_tpot_states_{}_charged_tracks", Name(), charge_str).c_str(),
0154 std::format("tpot states distribution ({} charged tracks);number of tpot states;tracks with that number of tpot states", charge_str).c_str(),
0155 4, -0.5, 3.5);
0156 hm->registerHisto(m_tpot_states_hist[charge]);
0157 m_tpot_states_hist[charge]->SetMarkerColor(color);
0158 m_tpot_states_hist[charge]->SetLineColor(color);
0159
0160 }
0161
0162 return Fun4AllReturnCodes::EVENT_OK;
0163 }
0164
0165 int TrackFittingQA::InitRun(
0166 PHCompositeNode* top_node)
0167 {
0168
0169 auto* track_map = findNode::getClass<SvtxTrackMap>(top_node, m_track_map_node_name);
0170 if (!track_map)
0171 {
0172 std::cout
0173 << PHWHERE << "\n"
0174 << "\tCould not get track map:\n"
0175 << "\t\"" << m_track_map_node_name << "\"\n"
0176 << "\tAborting\n"
0177 << std::endl;
0178 return Fun4AllReturnCodes::ABORTRUN;
0179 }
0180
0181 return Fun4AllReturnCodes::EVENT_OK;
0182 }
0183
0184 int TrackFittingQA::process_event(
0185 PHCompositeNode* top_node)
0186 {
0187 auto* track_map = findNode::getClass<SvtxTrackMap>(top_node, m_track_map_node_name);
0188 if (!track_map)
0189 {
0190 std::cout
0191 << PHWHERE << "\n"
0192 << "\tCould not get track map:\n"
0193 << "\t\"" << m_track_map_node_name << "\"\n"
0194 << "\tAborting\n"
0195 << std::endl;
0196 return Fun4AllReturnCodes::ABORTRUN;
0197 }
0198
0199 for (auto const& [idkey, track] : *track_map)
0200 {
0201
0202 std::map<TrkrDefs::TrkrId, int> counters = {
0203 {TrkrDefs::mvtxId, 0},
0204 {TrkrDefs::inttId, 0},
0205 {TrkrDefs::tpcId, 0},
0206 {TrkrDefs::micromegasId, 0},
0207 };
0208
0209 for (auto const& [path_length, state] : range_adaptor(track->begin_states(), track->end_states()))
0210 {
0211
0212
0213
0214 if (path_length == 0) continue;
0215
0216 auto trkr_id = static_cast<TrkrDefs::TrkrId>(TrkrDefs::getTrkrId(state->get_cluskey()));
0217 auto itr = counters.find(trkr_id);
0218 if (itr == counters.end()) continue;
0219 ++itr->second;
0220 }
0221
0222
0223 if ( track->get_quality() < m_min_quality ) continue;
0224 if ( m_max_quality < track->get_quality() ) continue;
0225 if ( track->get_p() < m_min_p ) continue;
0226 if ( track->get_pt() < m_min_pt ) continue;
0227 if ( m_max_abs_eta < std::abs(track->get_eta()) ) continue;
0228 if ( counters[TrkrDefs::inttId] < m_min_intt_states ) continue;
0229 if ( counters[TrkrDefs::mvtxId] < m_min_mvtx_states ) continue;
0230 if ( counters[TrkrDefs::tpcId] < m_min_tpc_states ) continue;
0231 if ( counters[TrkrDefs::micromegasId] < m_min_tpot_states ) continue;
0232 if ( track->get_crossing() < m_min_crossing ) continue;
0233 if ( m_max_crossing < track->get_crossing() ) continue;
0234
0235
0236 int charge = (0 < track->get_charge()) ? 1 : 0;
0237
0238 m_quality_hist[charge]->Fill(track->get_quality());
0239 m_p_hist[charge]->Fill(track->get_p());
0240 m_pt_hist[charge]->Fill(track->get_pt());
0241 m_eta_hist[charge]->Fill(track->get_eta());
0242 m_phi_eta_hist[charge]->Fill(track->get_phi(), track->get_eta());
0243
0244 m_mvtx_states_hist[charge]->Fill(counters[TrkrDefs::mvtxId]);
0245 m_intt_states_hist[charge]->Fill(counters[TrkrDefs::inttId]);
0246 m_tpc_states_hist[charge]->Fill(counters[TrkrDefs::tpcId]);
0247 m_tpot_states_hist[charge]->Fill(counters[TrkrDefs::micromegasId]);
0248 }
0249
0250 return Fun4AllReturnCodes::EVENT_OK;
0251 }
0252
0253 int TrackFittingQA::ResetEvent(
0254 PHCompositeNode* )
0255 {
0256 return Fun4AllReturnCodes::EVENT_OK;
0257 }
0258
0259 int TrackFittingQA::EndRun(
0260 int const )
0261 {
0262 return Fun4AllReturnCodes::EVENT_OK;
0263 }
0264
0265 int TrackFittingQA::End(
0266 PHCompositeNode* )
0267 {
0268 return Fun4AllReturnCodes::EVENT_OK;
0269 }
0270
0271 int TrackFittingQA::Reset(
0272 PHCompositeNode* )
0273 {
0274 return Fun4AllReturnCodes::EVENT_OK;
0275 }
0276
0277 void TrackFittingQA::Print(
0278 std::string const& ) const
0279 {
0280
0281 }