Back to home page

sPhenix code displayed by LXR

 
 

    


File indexing completed on 2025-08-05 08:12:19

0001 #include "LEDTowerBuilder.h"
0002 //____________________________________________________________________________..
0003 LEDTowerBuilder::LEDTowerBuilder(const std::string &name):
0004   SubsysReco(name)
0005   , m_dettype(LEDTowerBuilder::CEMC)
0006   , m_detector("CEMC")
0007   , m_packet_low(6001) // 6001
0008   , m_packet_high(6128) // 6128
0009   , m_nsamples(32)
0010   , m_nchannels(192)
0011   , m_isdata(true)
0012   , m_event(0)
0013   , m_adc(0)
0014   , m_ped(0)
0015   , m_time(0)
0016   , m_chan(0)
0017   , m_waveforms(0)
0018   , m_outputFilename(name) {
0019   std::cout << "LEDTowerBuilder::LEDTowerBuilder(const std::string &name) Calling ctor" << std::endl;
0020 
0021   tOut = new TTree("W","W");
0022 
0023   tOut -> Branch("time",&m_time);
0024   tOut -> Branch("adc",&m_adc);
0025   tOut -> Branch("ped",&m_ped);
0026   tOut -> Branch("waveforms",&m_waveforms);
0027   tOut -> Branch("chan",&m_chan);
0028 }
0029 
0030 //____________________________________________________________________________..
0031 LEDTowerBuilder::~LEDTowerBuilder() {
0032   std::cout << "LEDTowerBuilder::~LEDTowerBuilder() Calling dtor" << std::endl;
0033 }
0034 
0035 //____________________________________________________________________________..
0036 int LEDTowerBuilder::InitRun(PHCompositeNode *topNode) {
0037   WaveformProcessing = new CaloWaveformProcessing();
0038   WaveformProcessing->set_processing_type(CaloWaveformProcessing::FAST);
0039 
0040   if (m_dettype == LEDTowerBuilder::CEMC) {
0041     m_detector = "CEMC";
0042     m_packet_low = 6001;
0043     m_packet_high = 6128;
0044     m_nchannels = 192;
0045     WaveformProcessing->set_template_file("testbeam_cemc_template.root");
0046   }
0047   else if (m_dettype == LEDTowerBuilder::HCALIN) {
0048     m_detector = "HCALIN";
0049     m_packet_low  = 7001;
0050     m_packet_high = 7008;
0051     m_nchannels = 192;
0052     WaveformProcessing->set_template_file("testbeam_ihcal_template.root");
0053   }
0054   else if (m_dettype == LEDTowerBuilder::HCALOUT) {
0055     m_detector = "HCALOUT";
0056     m_packet_low = 8001;
0057     m_packet_high = 8008;
0058     m_nchannels = 192;
0059     WaveformProcessing->set_template_file("testbeam_ohcal_template.root");
0060   }
0061   else if (m_dettype == LEDTowerBuilder::EPD) {
0062     m_detector = "EPD";
0063     m_packet_low = 9001;
0064     m_packet_high = 9016;
0065     WaveformProcessing->set_template_file("testbeam_cemc_template.root"); // place holder until we have EPD templates
0066   }
0067   WaveformProcessing->initialize_processing();
0068   //CreateNodeTree(topNode);
0069   topNode->print();
0070   return Fun4AllReturnCodes::EVENT_OK;
0071 }
0072 
0073 //____________________________________________________________________________..
0074 int LEDTowerBuilder::process_event(PHCompositeNode *topNode) {
0075   if(m_event % 100 == 0) std::cout << "Event: " << m_event << std::endl;
0076   ++m_event;
0077 
0078   if (m_isdata) {
0079     Event *_event = findNode::getClass<Event>(topNode, "PRDF");
0080     if (_event == 0) {
0081       std::cout << "CaloUnpackPRDF::Process_Event - Event not found" << std::endl;
0082       return -1;
0083     }
0084     // special event where we do not read out the calorimeters
0085     if ( _event->getEvtType() >= 8) {
0086       std::cout << "Event Type >= 8!!" << std::endl;
0087       return Fun4AllReturnCodes::DISCARDEVENT;
0088     }
0089     for (int pid = m_packet_low; pid <= m_packet_high; pid++) {
0090       // there are 192 channels in a packet
0091       // Determine the channel id offset
0092       UInt_t channel_offset = (pid-m_packet_low)*m_nchannels;
0093       Packet* packet = _event->getPacket(pid);
0094       if (!packet) {
0095         // std::cout << "No packet!!, pid: " << pid << std::endl;
0096         continue;
0097       }
0098       int nchannels = packet->iValue(0,"CHANNELS");
0099 
0100       // ensure that there are at most 192 channels in the packet
0101       // packet is corrupted if it reports too many channels
0102       if(nchannels > m_nchannels) {
0103         return Fun4AllReturnCodes::DISCARDEVENT;
0104       }
0105 
0106       for (int channel = 0; channel < nchannels; ++channel) {
0107         std::vector<float> waveform;
0108         waveform.reserve(m_nsamples);
0109 
0110         for (int samp = 0; samp < m_nsamples; samp++) {
0111           waveform.push_back(packet->iValue(samp,channel));
0112         }
0113         m_waveforms.push_back(waveform);
0114         m_chan.push_back(channel_offset+channel);
0115         waveform.clear();
0116       }
0117       delete packet;
0118     }
0119   }
0120   // placeholder for adding simulation
0121   else {
0122     std::cout << "m_isdata: false!!" << std::endl;
0123     return Fun4AllReturnCodes::EVENT_OK;
0124   }
0125   std::vector<std::vector<float>> processed_waveforms =  WaveformProcessing->process_waveform(m_waveforms);
0126 
0127   int n_channels = processed_waveforms.size();
0128   for (int i = 0 ; i < n_channels; i++) {
0129     m_time.push_back(processed_waveforms.at(i).at(1));
0130     m_adc.push_back(processed_waveforms.at(i).at(0));
0131     m_ped.push_back(processed_waveforms.at(i).at(2));
0132   }
0133 
0134   tOut -> Fill();
0135 
0136   m_time.clear();
0137   m_adc.clear();
0138   m_ped.clear();
0139   m_chan.clear();
0140   m_waveforms.clear();
0141 
0142   return Fun4AllReturnCodes::EVENT_OK;
0143 }
0144 
0145 int LEDTowerBuilder::End(PHCompositeNode *topNode) {
0146   std::cout << "LEDTowerBuilder opening output file: " << m_outputFilename << std::endl;
0147   TFile output(m_outputFilename.c_str(),"recreate");
0148   output.cd();
0149   tOut -> Write();
0150   output.Close();
0151 
0152   return Fun4AllReturnCodes::EVENT_OK;
0153 }