File indexing completed on 2024-09-07 04:36:40
0001 #include "HtrXmlPatternTool.h"
0002 #include "HtrXmlPatternToolParameters.h"
0003 #include "HtrXmlPatternSet.h"
0004 #include "HtrXmlPatternWriter.h"
0005 #include "TFile.h"
0006 #include "TH1.h"
0007 #include <filesystem>
0008 #include <fstream>
0009 #include <iostream>
0010
0011 HtrXmlPatternTool::HtrXmlPatternTool(HtrXmlPatternToolParameters* params) {
0012 m_params = params;
0013
0014
0015 int slotsOn[ChannelPattern::NUM_SLOTS];
0016 int cratesOn[ChannelPattern::NUM_CRATES];
0017
0018
0019 for (int i = 0; i < ChannelPattern::NUM_SLOTS; i++)
0020 slotsOn[i] = 0;
0021
0022 for (int i = 2; i < 9; i++)
0023 slotsOn[i] = 1;
0024
0025 for (int i = 13; i < 19; i++)
0026 slotsOn[i] = 1;
0027
0028
0029 for (int i = 0; i < ChannelPattern::NUM_CRATES; i++)
0030 cratesOn[i] = 1;
0031
0032 cratesOn[8] = 0;
0033 cratesOn[16] = 0;
0034
0035 m_patternSet = new HtrXmlPatternSet(cratesOn, slotsOn);
0036 m_xmlWriter.setTagName(m_params->m_file_tag);
0037 }
0038
0039 HtrXmlPatternTool::~HtrXmlPatternTool() { delete m_patternSet; }
0040
0041 void HtrXmlPatternTool::Fill(const HcalElectronicsId HEID, HBHEDigiCollection::const_iterator data) {
0042 CrateData* cd = m_patternSet->getCrate(HEID.readoutVMECrateId());
0043 HalfHtrData* hd = nullptr;
0044 ChannelPattern* cp = nullptr;
0045
0046 if (cd) {
0047 hd = cd->getHalfHtrData(HEID.htrSlot(), HEID.htrTopBottom());
0048 if (hd) {
0049 hd->setSpigot(HEID.spigot());
0050 hd->setDCC(HEID.dccid());
0051
0052 cp = hd->getPattern(HEID.htrChanId());
0053 if (cp)
0054 cp->Fill(m_params, data);
0055 else if (m_params->m_show_errors)
0056 std::cerr << "Bad (crate,slot,channel): (" << HEID.readoutVMECrateId() << "," << HEID.htrSlot() << ","
0057 << HEID.htrChanId() << ")" << std::endl;
0058 } else if (m_params->m_show_errors)
0059 std::cerr << "Bad (crate,slot): (" << HEID.readoutVMECrateId() << "," << HEID.htrSlot() << ")" << std::endl;
0060 } else if (m_params->m_show_errors)
0061 std::cerr << "Bad (crate): (" << HEID.readoutVMECrateId() << ")" << std::endl;
0062 }
0063
0064 void HtrXmlPatternTool::Fill(const HcalElectronicsId HEID, HFDigiCollection::const_iterator data) {
0065 CrateData* cd = m_patternSet->getCrate(HEID.readoutVMECrateId());
0066 HalfHtrData* hd = nullptr;
0067 ChannelPattern* cp = nullptr;
0068
0069 if (cd) {
0070 hd = cd->getHalfHtrData(HEID.htrSlot(), HEID.htrTopBottom());
0071 if (hd) {
0072 hd->setSpigot(HEID.spigot());
0073 hd->setDCC(HEID.dccid());
0074
0075 cp = hd->getPattern(HEID.htrChanId());
0076 if (cp)
0077 cp->Fill(m_params, data);
0078 else if (m_params->m_show_errors)
0079 std::cerr << "Bad (crate,slot,channel): (" << HEID.readoutVMECrateId() << "," << HEID.htrSlot() << ","
0080 << HEID.htrChanId() << ")" << std::endl;
0081 } else if (m_params->m_show_errors)
0082 std::cerr << "Bad (crate,slot): (" << HEID.readoutVMECrateId() << "," << HEID.htrSlot() << ")" << std::endl;
0083 } else if (m_params->m_show_errors)
0084 std::cerr << "Bad (crate): (" << HEID.readoutVMECrateId() << ")" << std::endl;
0085 }
0086
0087 void HtrXmlPatternTool::Fill(const HcalElectronicsId HEID, HODigiCollection::const_iterator data) {
0088 CrateData* cd = m_patternSet->getCrate(HEID.readoutVMECrateId());
0089 HalfHtrData* hd = nullptr;
0090 ChannelPattern* cp = nullptr;
0091
0092 if (cd) {
0093 hd = cd->getHalfHtrData(HEID.htrSlot(), HEID.htrTopBottom());
0094 if (hd) {
0095 hd->setSpigot(HEID.spigot());
0096 hd->setDCC(HEID.dccid());
0097
0098 cp = hd->getPattern(HEID.htrChanId());
0099 if (cp)
0100 cp->Fill(m_params, data);
0101 else if (m_params->m_show_errors)
0102 std::cerr << "Bad (crate,slot,channel): (" << HEID.readoutVMECrateId() << "," << HEID.htrSlot() << ","
0103 << HEID.htrChanId() << ")" << std::endl;
0104 } else if (m_params->m_show_errors)
0105 std::cerr << "Bad (crate,slot): (" << HEID.readoutVMECrateId() << "," << HEID.htrSlot() << ")" << std::endl;
0106 } else if (m_params->m_show_errors)
0107 std::cerr << "Bad (crate): (" << HEID.readoutVMECrateId() << ")" << std::endl;
0108 }
0109
0110 void HtrXmlPatternTool::prepareDirs() { std::filesystem::create_directory(m_params->m_output_directory); }
0111
0112 void HtrXmlPatternTool::writeXML() {
0113 std::cout << "Writing XML..." << std::endl;
0114 std::ofstream* of = nullptr;
0115
0116 if (m_params->m_XML_file_mode == 1) {
0117 std::string name = m_params->m_output_directory + (m_params->m_file_tag) + "_all.xml";
0118 of = new std::ofstream(name.c_str(), std::ios_base::out | std::ios_base::trunc);
0119 if (!of->good()) {
0120 std::cerr << "XML output file " << name << " is bad." << std::endl;
0121 return;
0122 }
0123 (*of) << "<?xml version='1.0' encoding='UTF-8'?>" << std::endl;
0124 (*of) << "<CFGBrickSet name='" << m_params->m_file_tag << "'>" << std::endl;
0125 }
0126
0127 for (int crate = 0; crate < ChannelPattern::NUM_CRATES; crate++) {
0128 CrateData* cd = m_patternSet->getCrate(crate);
0129 if (cd == nullptr)
0130 continue;
0131
0132 if (m_params->m_XML_file_mode == 2) {
0133 std::string name = m_params->m_output_directory + (m_params->m_file_tag);
0134 char cr_name[256];
0135 snprintf(cr_name, 256, "_crate_%d.xml", crate);
0136 name += cr_name;
0137 of = new std::ofstream(name.c_str(), std::ios_base::out | std::ios_base::trunc);
0138 if (!of->good()) {
0139 std::cerr << "XML output file " << name << " is bad." << std::endl;
0140 delete of;
0141 return;
0142 }
0143 (*of) << "<?xml version='1.0' encoding='UTF-8'?>" << std::endl;
0144 (*of) << "<CFGBrickSet name='" << m_params->m_file_tag << "'>" << std::endl;
0145 }
0146
0147 for (int slot = 0; slot < ChannelPattern::NUM_SLOTS; slot++) {
0148 for (int tb = 0; tb <= 1; tb++) {
0149 HalfHtrData* hd = cd->getHalfHtrData(slot, tb);
0150 if (hd == nullptr)
0151 continue;
0152 for (int fiber = 1; fiber <= 8; fiber++) {
0153 if (m_params->m_XML_file_mode == 3) {
0154 std::string name = m_params->m_output_directory + (m_params->m_file_tag);
0155 char cr_name[256];
0156 snprintf(cr_name, 256, "_crate_%d_slot_%d_tb_%d_fiber_%d.xml", crate, slot, tb, fiber);
0157 name += cr_name;
0158 of = new std::ofstream(name.c_str(), std::ios_base::out | std::ios_base::trunc);
0159 if (!of->good()) {
0160 std::cerr << "XML output file " << name << " is bad." << std::endl;
0161 delete of;
0162 return;
0163 }
0164 (*of) << "<?xml version='1.0' encoding='UTF-8'?>" << std::endl;
0165 }
0166 m_xmlWriter.writePattern(hd, fiber, *of, 1);
0167 if (m_params->m_XML_file_mode == 3) {
0168 of->close();
0169 delete of;
0170 of = nullptr;
0171 }
0172
0173 }
0174 }
0175 }
0176
0177 if (m_params->m_XML_file_mode == 2) {
0178 (*of) << "</CFGBrickSet>" << std::endl;
0179 of->close();
0180 delete of;
0181 of = nullptr;
0182 }
0183
0184 }
0185
0186 if (m_params->m_XML_file_mode == 1) {
0187 (*of) << "</CFGBrickSet>" << std::endl;
0188 of->close();
0189 delete of;
0190 of = nullptr;
0191 }
0192 }
0193
0194 void HtrXmlPatternTool::createHists() {
0195 std::cout << "Writing root file..." << std::endl;
0196 std::string name = m_params->m_output_directory + "/" + (m_params->m_file_tag) + ".root";
0197 TFile of(name.c_str(), "RECREATE");
0198 if (of.IsZombie()) {
0199 std::cerr << "root output file " << name << " is bad." << std::endl;
0200 return;
0201 }
0202
0203 of.mkdir("adc");
0204
0205 for (int crate = 0; crate < ChannelPattern::NUM_CRATES; crate++) {
0206 CrateData* cd = m_patternSet->getCrate(crate);
0207 if (cd == nullptr)
0208 continue;
0209 for (int slot = 0; slot < ChannelPattern::NUM_SLOTS; slot++) {
0210 for (int tb = 0; tb <= 1; tb++) {
0211 HalfHtrData* hd = cd->getHalfHtrData(slot, tb);
0212 if (hd == nullptr)
0213 continue;
0214 for (int chan = 1; chan <= 24; chan++) {
0215 ChannelPattern* cp = hd->getPattern(chan);
0216 char hname[128];
0217 sprintf(hname, "Exact fC Cr%d,%d%s-%d", crate, slot, ((tb == 1) ? ("t") : ("b")), chan);
0218 TH1* hp = new TH1F(hname, hname, ChannelPattern::SAMPLES, -0.5, ChannelPattern::SAMPLES - 0.5);
0219 hp->SetDirectory(nullptr);
0220 sprintf(hname, "Quantized fC Cr%d,%d%s-%d", crate, slot, ((tb == 1) ? ("t") : ("b")), chan);
0221 TH1* hq = new TH1F(hname, hname, ChannelPattern::SAMPLES, -0.5, ChannelPattern::SAMPLES - 0.5);
0222 hp->SetDirectory(nullptr);
0223 sprintf(hname, "Encoded fC Cr%d,%d%s-%d", crate, slot, ((tb == 1) ? ("t") : ("b")), chan);
0224 TH1* ha = new TH1F(hname, hname, ChannelPattern::SAMPLES, -0.5, ChannelPattern::SAMPLES - 0.5);
0225 ha->SetDirectory(nullptr);
0226 for (int i = 0; i < ChannelPattern::SAMPLES; i++) {
0227 hp->Fill(i * 1.0, (*cp)[i]);
0228 hq->Fill(i * 1.0, cp->getQuantized(i));
0229 ha->Fill(i * 1.0, cp->getCoded(i));
0230 }
0231
0232
0233 of.cd("adc");
0234 ha->Write();
0235 delete hp;
0236 delete hq;
0237 delete ha;
0238 }
0239 }
0240 }
0241 }
0242 of.Close();
0243 }