File indexing completed on 2025-08-06 08:18:48
0001
0002 #include "TpcNoiseQA.h"
0003
0004 #include <fun4all/Fun4AllHistoManager.h>
0005 #include <fun4all/Fun4AllReturnCodes.h>
0006
0007 #include <phool/PHCompositeNode.h>
0008 #include <phool/getClass.h>
0009
0010 #include <Event/Event.h>
0011 #include <Event/packet.h>
0012
0013 #include <TH2.h>
0014
0015 #include <qautils/QAHistManagerDef.h>
0016
0017 #include <cassert>
0018 #include <cstdint>
0019 #include <format>
0020 #include <iostream>
0021 #include <string>
0022
0023
0024
0025 TpcNoiseQA::TpcNoiseQA(const std::string &name)
0026 : SubsysReco(name)
0027 {
0028
0029 m_adcSamples.resize(1024, 0);
0030
0031 M.setMapNames("AutoPad-R1-RevA.sch.ChannelMapping.csv", "AutoPad-R2-RevA-Pads.sch.ChannelMapping.csv", "AutoPad-R3-RevA.sch.ChannelMapping.csv");
0032 }
0033
0034
0035 int TpcNoiseQA::InitRun(PHCompositeNode * )
0036 {
0037
0038
0039
0040
0041
0042 for (int i = 0; i < r_bins_N + 1; i++)
0043 {
0044 r_bins_new[i] = -1 * r_bins[r_bins_N - i];
0045 r_bins_new[i + r_bins_N + nphi + 1] = r_bins[i];
0046 }
0047 for (int i = 0; i < nphi + 1; i++)
0048 {
0049 r_bins_new[i + r_bins_N] = phi_bins[i];
0050 }
0051
0052 createHistos();
0053
0054 return Fun4AllReturnCodes::EVENT_OK;
0055 }
0056
0057
0058 int TpcNoiseQA::process_event(PHCompositeNode *topNode)
0059 {
0060
0061
0062 Event *_event = findNode::getClass<Event>(topNode, "PRDF");
0063
0064
0065 if (_event == nullptr)
0066 {
0067 std::cout << "TPCRawDataTree::Process_Event - Event not found" << std::endl;
0068 return -1;
0069 }
0070
0071
0072 if (_event->getEvtType() >= 8)
0073 {
0074 return Fun4AllReturnCodes::DISCARDEVENT;
0075 }
0076
0077 for (int fee_no = 0; fee_no < 26; fee_no++)
0078 {
0079 for (int channel_no = 0; channel_no < 256; channel_no++)
0080 {
0081 ave_adc_fee_channel[fee_no][channel_no] = 0.0;
0082 std_adc_fee_channel[fee_no][channel_no] = 0.0;
0083 counts_adc_fee_channel[fee_no][channel_no] = 0.0;
0084 }
0085 }
0086
0087
0088 auto hm = QAHistManagerDef::getHistoManager();
0089 assert(hm);
0090
0091
0092 h_NPol_Ped_Mean = dynamic_cast<TH2F *>(hm->getHisto(std::format("{}NPol_Ped_Mean", getHistoPrefix())));
0093 h_NPol_Ped_RMS = dynamic_cast<TH2F *>(hm->getHisto(std::format("{}NPol_Ped_RMS", getHistoPrefix())));
0094 h_SPol_Ped_Mean = dynamic_cast<TH2F *>(hm->getHisto(std::format("{}SPol_Ped_Mean", getHistoPrefix())));
0095 h_SPol_Ped_RMS = dynamic_cast<TH2F *>(hm->getHisto(std::format("{}SPol_Ped_RMS", getHistoPrefix())));
0096
0097
0098 int sector = 0;
0099
0100 std::vector<Packet *> pktvec = _event->getPacketVector();
0101
0102
0103 for (auto packet : pktvec)
0104 {
0105 if (!packet)
0106 {
0107 if (Verbosity())
0108 {
0109 std::cout << __PRETTY_FUNCTION__ << " : missing packet " << std::endl;
0110 }
0111 continue;
0112 }
0113 int32_t packet_id = packet->getIdentifier();
0114
0115 if (Verbosity())
0116 {
0117 std::cout << __PRETTY_FUNCTION__ << " : decoding packet " << packet_id << std::endl;
0118 }
0119
0120 int ep = (packet_id - 4000) % 10;
0121 sector = (packet_id - 4000 - ep) / 10;
0122 if (sector > 11)
0123 {
0124 side = 1;
0125 }
0126 else
0127 {
0128 side = 0;
0129 }
0130
0131
0132 m_nWaveformInFrame = packet->iValue(0, "NR_WF");
0133
0134 for (int wf = 0; wf < m_nWaveformInFrame; wf++)
0135 {
0136 m_FEE = packet->iValue(wf, "FEE");
0137 m_Channel = packet->iValue(wf, "CHANNEL");
0138 m_nSamples = packet->iValue(wf, "SAMPLES");
0139
0140
0141
0142 if (m_nSamples > (int) m_adcSamples.size())
0143 {
0144 continue;
0145 }
0146
0147 dead = false;
0148
0149 for (int s = 0; s < m_nSamples; s++)
0150 {
0151
0152 m_adcSamples[s] = packet->iValue(wf, s);
0153
0154 if (m_adcSamples[s] == 0 || std::isnan(float(m_adcSamples[s])))
0155 {
0156 dead = true;
0157 break;
0158 }
0159 }
0160
0161 if (dead)
0162 {
0163 continue;
0164 }
0165
0166 for (int adc_sam_no = 0; adc_sam_no < m_nSamples; adc_sam_no++)
0167 {
0168 if (m_adcSamples[adc_sam_no] < 1024)
0169 {
0170 ave_adc_fee_channel[m_FEE][m_Channel] += m_adcSamples[adc_sam_no];
0171 std_adc_fee_channel[m_FEE][m_Channel] += pow(m_adcSamples[adc_sam_no], 2);
0172 counts_adc_fee_channel[m_FEE][m_Channel] += 1.0;
0173 }
0174 }
0175 }
0176 }
0177
0178 for (int fee_no = 0; fee_no < 26; fee_no++)
0179 {
0180 for (int channel_no = 0; channel_no < 256; channel_no++)
0181 {
0182 if (counts_adc_fee_channel[fee_no][channel_no] != 0.0)
0183 {
0184 temp1 = ave_adc_fee_channel[fee_no][channel_no] / counts_adc_fee_channel[fee_no][channel_no];
0185 temp2 = std_adc_fee_channel[fee_no][channel_no] / counts_adc_fee_channel[fee_no][channel_no];
0186 ave_adc_fee_channel[fee_no][channel_no] = temp1;
0187 std_adc_fee_channel[fee_no][channel_no] = temp2;
0188 }
0189 else
0190 {
0191 ave_adc_fee_channel[fee_no][channel_no] = 0.0;
0192 std_adc_fee_channel[fee_no][channel_no] = 0.0;
0193 }
0194
0195
0196 feeM = FEE_map[fee_no];
0197 if (mod_arr[fee_no] == 2)
0198 {
0199 feeM += 6;
0200 }
0201 if (mod_arr[fee_no] == 3)
0202 {
0203 feeM += 14;
0204 }
0205 key = 256 * (feeM) + channel_no;
0206 R = M.getR(feeM, channel_no);
0207 phi = pow(-1, side) * M.getPhi(feeM, channel_no) + (sector - side * 12.0) * M_PI / 6.0;
0208
0209 if (phi < 0.0)
0210 {
0211 phi = phi + 2.0 * M_PI;
0212 }
0213
0214 pedMean = ave_adc_fee_channel[fee_no][channel_no];
0215 pedStdi = sqrt(std_adc_fee_channel[fee_no][channel_no] - pow(ave_adc_fee_channel[fee_no][channel_no], 2));
0216
0217 if (side == 0)
0218 {
0219 h_NPol_Ped_Mean->Fill(phi, R, pedMean);
0220 h_NPol_Ped_RMS->Fill(phi, R, pedStdi);
0221 }
0222
0223 else
0224 {
0225 h_SPol_Ped_Mean->Fill(phi, R, pedMean);
0226 h_SPol_Ped_RMS->Fill(phi, R, pedStdi);
0227 }
0228 }
0229 }
0230
0231 return Fun4AllReturnCodes::EVENT_OK;
0232 }
0233
0234
0235 int TpcNoiseQA::End(PHCompositeNode * )
0236 {
0237
0238
0239
0240
0241
0242
0243
0244
0245
0246
0247
0248
0249
0250
0251
0252
0253
0254
0255
0256
0257 return Fun4AllReturnCodes::EVENT_OK;
0258 }
0259
0260
0261 std::string TpcNoiseQA::getHistoPrefix() const { return std::string("h_") + Name() + std::string("_"); }
0262
0263
0264 void TpcNoiseQA::createHistos()
0265 {
0266
0267 auto hm = QAHistManagerDef::getHistoManager();
0268 assert(hm);
0269
0270
0271 {
0272 auto h = new TH2F(std::format("{}NPol_Ped_Mean", getHistoPrefix()).c_str(), ";x;y", (2 * r_bins_N + nphi + 1), r_bins_new, (2 * r_bins_N + nphi + 1), r_bins_new);
0273 hm->registerHisto(h);
0274 }
0275
0276 {
0277 auto h = new TH2F(std::format("{}NPol_Ped_RMS", getHistoPrefix()).c_str(), ";x;y", (2 * r_bins_N + nphi + 1), r_bins_new, (2 * r_bins_N + nphi + 1), r_bins_new);
0278 hm->registerHisto(h);
0279 }
0280
0281 {
0282 auto h = new TH2F(std::format("{}SPol_Ped_Mean", getHistoPrefix()).c_str(), ";x;y", (2 * r_bins_N + nphi + 1), r_bins_new, (2 * r_bins_N + nphi + 1), r_bins_new);
0283 hm->registerHisto(h);
0284 }
0285
0286 {
0287 auto h = new TH2F(std::format("{}SPol_Ped_RMS", getHistoPrefix()).c_str(), ";x;y", (2 * r_bins_N + nphi + 1), r_bins_new, (2 * r_bins_N + nphi + 1), r_bins_new);
0288 hm->registerHisto(h);
0289 }
0290 }