File indexing completed on 2025-08-06 08:18:49
0001
0002 #include "MvtxClusterQA.h"
0003
0004 #include <mvtx/CylinderGeom_Mvtx.h>
0005
0006 #include <g4detectors/PHG4CylinderGeomContainer.h>
0007
0008 #include <trackbase/ActsGeometry.h>
0009 #include <trackbase/MvtxDefs.h>
0010 #include <trackbase/TrackFitUtils.h>
0011 #include <trackbase/TrkrCluster.h>
0012 #include <trackbase/TrkrClusterContainer.h>
0013 #include <trackbase/TrkrClusterHitAssoc.h>
0014 #include <trackbase/TrkrDefs.h>
0015 #include <trackbase/TrkrHitSet.h>
0016 #include <trackbase/TrkrHitSetContainerv1.h>
0017
0018 #include <qautils/QAHistManagerDef.h>
0019 #include <qautils/QAUtil.h>
0020
0021 #include <fun4all/Fun4AllHistoManager.h>
0022 #include <fun4all/Fun4AllReturnCodes.h>
0023 #include <fun4all/SubsysReco.h>
0024
0025 #include <phool/PHCompositeNode.h>
0026 #include <phool/getClass.h>
0027
0028 #include <TH1.h>
0029 #include <TH2.h>
0030
0031 #include <format>
0032
0033
0034 MvtxClusterQA::MvtxClusterQA(const std::string &name)
0035 : SubsysReco(name)
0036 {
0037 }
0038
0039
0040 int MvtxClusterQA::InitRun(PHCompositeNode *topNode)
0041 {
0042 auto *geomContainer = findNode::getClass<
0043 PHG4CylinderGeomContainer>(topNode, "CYLINDERGEOM_MVTX");
0044 if (!geomContainer)
0045 {
0046 std::cout << PHWHERE
0047 << " CYLINDERGEOM_MVTX node not found on node tree"
0048 << std::endl;
0049 return Fun4AllReturnCodes::ABORTEVENT;
0050 }
0051 for (const auto &layer : {0, 1, 2})
0052 {
0053 auto *layergeom = dynamic_cast<CylinderGeom_Mvtx *>(geomContainer->GetLayerGeom(layer));
0054 if (!layergeom)
0055 {
0056 std::cout << PHWHERE << "Did not get layergeom for layer "
0057 << layer << std::endl;
0058 return Fun4AllReturnCodes::ABORTEVENT;
0059 }
0060 int nstaves = layergeom->get_N_staves();
0061 m_layerStaveMap.insert(std::make_pair(layer, nstaves));
0062 }
0063
0064 createHistos();
0065 return Fun4AllReturnCodes::EVENT_OK;
0066 }
0067
0068
0069 int MvtxClusterQA::process_event(PHCompositeNode *topNode)
0070 {
0071 auto *clusterContainer = findNode::getClass<TrkrClusterContainer>(topNode, "TRKR_CLUSTER");
0072 if (!clusterContainer)
0073 {
0074 std::cout << PHWHERE << "No cluster container, bailing" << std::endl;
0075 return Fun4AllReturnCodes::ABORTEVENT;
0076 }
0077
0078 auto *trkrHitSetContainer = findNode::getClass<TrkrHitSetContainerv1>(topNode, "TRKR_HITSET");
0079 if (!trkrHitSetContainer)
0080 {
0081 std::cout << PHWHERE << "No trkrhitset container, bailing" << std::endl;
0082 return Fun4AllReturnCodes::ABORTEVENT;
0083 }
0084
0085 auto *tGeometry = findNode::getClass<ActsGeometry>(topNode, "ActsGeometry");
0086 if (!tGeometry)
0087 {
0088 std::cout << PHWHERE << "No acts geometry on node tree, bailing" << std::endl;
0089 return Fun4AllReturnCodes::ABORTEVENT;
0090 }
0091
0092 int numclusters = 0;
0093 for (auto &hsk : clusterContainer->getHitSetKeys(TrkrDefs::TrkrId::mvtxId))
0094 {
0095 auto range = clusterContainer->getClusters(hsk);
0096 for (auto iter = range.first; iter != range.second; ++iter)
0097 {
0098 numclusters++;
0099 }
0100 }
0101
0102 for (auto &hsk : clusterContainer->getHitSetKeys(TrkrDefs::TrkrId::mvtxId))
0103 {
0104 int numclusters_chip = 0;
0105 auto range = clusterContainer->getClusters(hsk);
0106 auto layer = TrkrDefs::getLayer(hsk);
0107 auto stave = MvtxDefs::getStaveId(hsk);
0108 auto chip = MvtxDefs::getChipId(hsk);
0109
0110 if (m_chipInfo)
0111 {
0112 for (auto iter = range.first; iter != range.second; ++iter)
0113 {
0114 const auto cluskey = iter->first;
0115 auto *const cluster = iter->second;
0116 auto globalpos = tGeometry->getGlobalPosition(cluskey, cluster);
0117 auto phi = atan2(globalpos(1), globalpos(0));
0118 auto clayer = TrkrDefs::getLayer(cluskey);
0119 h_clusperchip[(int) layer][(int) stave][(int) chip]->Fill(cluster->getLocalY(), cluster->getLocalX());
0120 h_clusSize->Fill(cluster->getSize());
0121 h_clusSize_nClus->Fill(numclusters, cluster->getSize());
0122 h_clusPhi_incl->Fill(phi);
0123 if (clayer == 0)
0124 {
0125 h_clusPhi_l0->Fill(phi);
0126 h_clusZ_clusPhi_l0->Fill(globalpos(2), phi);
0127 }
0128 else if (clayer == 1)
0129 {
0130 h_clusPhi_l1->Fill(phi);
0131 h_clusZ_clusPhi_l1->Fill(globalpos(2), phi);
0132 }
0133 else if (clayer == 2)
0134 {
0135 h_clusPhi_l2->Fill(phi);
0136 h_clusZ_clusPhi_l2->Fill(globalpos(2), phi);
0137 }
0138 m_totalClusters++;
0139 numclusters_chip++;
0140 }
0141
0142 m_nclustersPerChip[(int) layer][(int) stave][(int) chip] += numclusters_chip;
0143 }
0144 else
0145 {
0146 for (auto iter = range.first; iter != range.second; ++iter)
0147 {
0148 const auto cluskey = iter->first;
0149 auto *const cluster = iter->second;
0150 auto globalpos = tGeometry->getGlobalPosition(cluskey, cluster);
0151 auto phi = atan2(globalpos(1), globalpos(0));
0152 auto clayer = TrkrDefs::getLayer(cluskey);
0153 h_clusSize->Fill(cluster->getSize());
0154 h_clusSize_nClus->Fill(numclusters, cluster->getSize());
0155 h_clusPhi_incl->Fill(phi);
0156 if (clayer == 0)
0157 {
0158 h_clusPhi_l0->Fill(phi);
0159 h_clusZ_clusPhi_l0->Fill(globalpos(2), phi);
0160 }
0161 else if (clayer == 1)
0162 {
0163 h_clusPhi_l1->Fill(phi);
0164 h_clusZ_clusPhi_l1->Fill(globalpos(2), phi);
0165 }
0166 else if (clayer == 2)
0167 {
0168 h_clusPhi_l2->Fill(phi);
0169 h_clusZ_clusPhi_l2->Fill(globalpos(2), phi);
0170 }
0171 }
0172 }
0173 }
0174
0175 TrkrHitSetContainer::ConstRange hitsetrange = trkrHitSetContainer->getHitSets(TrkrDefs::TrkrId::mvtxId);
0176
0177 for (TrkrHitSetContainer::ConstIterator hitsetitr = hitsetrange.first; hitsetitr != hitsetrange.second; ++hitsetitr)
0178 {
0179 int chip_hits = hitsetitr->second->size();
0180 float chip_occupancy = (float) chip_hits / (512 * 1024);
0181 chip_occupancy = 100 * chip_occupancy;
0182 h_occupancy->Fill(chip_occupancy);
0183 int strobe = MvtxDefs::getStrobeId(hitsetitr->first);
0184 for (int i = 0; i < chip_hits; i++)
0185 {
0186 h_strobe->Fill(strobe);
0187 }
0188 }
0189
0190 m_event++;
0191 return Fun4AllReturnCodes::EVENT_OK;
0192 }
0193 int MvtxClusterQA::EndRun(const int )
0194 {
0195 return Fun4AllReturnCodes::EVENT_OK;
0196 }
0197
0198
0199 std::string MvtxClusterQA::getHistoPrefix() const
0200 {
0201 return std::string("h_") + Name() + std::string("_");
0202 }
0203
0204 void MvtxClusterQA::createHistos()
0205 {
0206 auto *hm = QAHistManagerDef::getHistoManager();
0207 assert(hm);
0208
0209 h_occupancy = new TH1F(std::format("{}chipOccupancy", getHistoPrefix()).c_str(), "MVTX Chip Occupancy", 60, 0, 0.6);
0210 h_occupancy->GetXaxis()->SetTitle("Chip Occupancy [%]");
0211 h_occupancy->GetYaxis()->SetTitle("Entries");
0212 hm->registerHisto(h_occupancy);
0213 h_clusSize = new TH1F(std::format("{}clusterSize", getHistoPrefix()).c_str(), "MVTX Cluster Size", 50, -0.5, 49.5);
0214 h_clusSize->GetXaxis()->SetTitle("Cluster Size");
0215 h_clusSize->GetYaxis()->SetTitle("Entries");
0216 hm->registerHisto(h_clusSize);
0217 h_clusPhi_incl = new TH1F(std::format("{}clusterPhi_incl", getHistoPrefix()).c_str(), "MVTX Cluster Phi", 320, -3.2, 3.2);
0218 h_clusPhi_incl->GetXaxis()->SetTitle("Cluster (layer 0+1+2) #phi [rad]");
0219 h_clusPhi_incl->GetYaxis()->SetTitle("Entries");
0220 hm->registerHisto(h_clusPhi_incl);
0221 h_clusPhi_l0 = new TH1F(std::format("{}clusterPhi_l0", getHistoPrefix()).c_str(), "MVTX Cluster Phi", 320, -3.2, 3.2);
0222 h_clusPhi_l0->GetXaxis()->SetTitle("Cluster (layer 0) #phi [rad]");
0223 h_clusPhi_l0->GetYaxis()->SetTitle("Entries");
0224 hm->registerHisto(h_clusPhi_l0);
0225 h_clusPhi_l1 = new TH1F(std::format("{}clusterPhi_l1", getHistoPrefix()).c_str(), "MVTX Cluster Phi", 320, -3.2, 3.2);
0226 h_clusPhi_l1->GetXaxis()->SetTitle("Cluster (layer 1) #phi [rad]");
0227 h_clusPhi_l1->GetYaxis()->SetTitle("Entries");
0228 hm->registerHisto(h_clusPhi_l1);
0229 h_clusPhi_l2 = new TH1F(std::format("{}clusterPhi_l2", getHistoPrefix()).c_str(), "MVTX Cluster Phi", 320, -3.2, 3.2);
0230 h_clusPhi_l2->GetXaxis()->SetTitle("Cluster (layer 2) #phi [rad]");
0231 h_clusPhi_l2->GetYaxis()->SetTitle("Entries");
0232 hm->registerHisto(h_clusPhi_l2);
0233 h_clusZ_clusPhi_l0 = new TH2F(std::format("{}clusterZ_clusPhi_l0", getHistoPrefix()).c_str(), "MVTX Cluster Z vs Phi", 300, -15, 15, 350, -3.5, 3.5);
0234 h_clusZ_clusPhi_l0->GetXaxis()->SetTitle("Cluster (layer 2) Z [cm]");
0235 h_clusZ_clusPhi_l0->GetYaxis()->SetTitle("Cluster (layer 0) #phi [rad]");
0236 hm->registerHisto(h_clusZ_clusPhi_l0);
0237 h_clusZ_clusPhi_l1 = new TH2F(std::format("{}clusterZ_clusPhi_l1", getHistoPrefix()).c_str(), "MVTX Cluster Z vs Phi", 300, -15, 15, 350, -3.5, 3.5);
0238 h_clusZ_clusPhi_l1->GetXaxis()->SetTitle("Cluster (layer 2) Z [cm]");
0239 h_clusZ_clusPhi_l1->GetYaxis()->SetTitle("Cluster (layer 1) #phi [rad]");
0240 hm->registerHisto(h_clusZ_clusPhi_l1);
0241 h_clusZ_clusPhi_l2 = new TH2F(std::format("{}clusterZ_clusPhi_l2", getHistoPrefix()).c_str(), "MVTX Cluster Z vs Phi", 300, -15, 15, 350, -3.5, 3.5);
0242 h_clusZ_clusPhi_l2->GetXaxis()->SetTitle("Cluster (layer 2) Z [cm]");
0243 h_clusZ_clusPhi_l2->GetYaxis()->SetTitle("Cluster (layer 2) #phi [rad]");
0244 hm->registerHisto(h_clusZ_clusPhi_l2);
0245 h_strobe = new TH1I(std::format("{}strobeTiming", getHistoPrefix()).c_str(), "MVTX Strobe Timing per Hit", 32, -15, 16);
0246 h_strobe->GetXaxis()->SetTitle("Strobe BCO - GL1 BCO");
0247 h_strobe->GetYaxis()->SetTitle("Entries");
0248 hm->registerHisto(h_strobe);
0249 h_clusSize_nClus = new TH2F(std::format("{}clusSize_nCLus", getHistoPrefix()).c_str(), "MVTX Cluster Size vs Number of Clusters", 800, -0.5, 799.5, 25, -0.5, 24.5);
0250 h_clusSize_nClus->GetXaxis()->SetTitle("Number of Clusters");
0251 h_clusSize_nClus->GetYaxis()->SetTitle("Cluster Size");
0252 hm->registerHisto(h_clusSize_nClus);
0253
0254 if (m_chipInfo)
0255 {
0256 for (const auto &[layer, nstave] : m_layerStaveMap)
0257 {
0258 for (int stave = 0; stave < nstave; stave++)
0259 {
0260
0261 for (int chip = 0; chip < 9; chip++)
0262 {
0263 h_clusperchip[layer][stave][chip] = new TH2F(std::format("{}nclusperchip{}_{}_{}", getHistoPrefix(), layer, stave, chip).c_str(),
0264 "MVTX clusters per chip", 2000, -2, 2, 2000, -1, 1);
0265 h_clusperchip[layer][stave][chip]->GetXaxis()->SetTitle("Local z [cm]");
0266 h_clusperchip[layer][stave][chip]->GetYaxis()->SetTitle("Local rphi [cm]");
0267 hm->registerHisto(h_clusperchip[layer][stave][chip]);
0268 }
0269 }
0270 }
0271 }
0272
0273 return;
0274 }