Back to home page

sPhenix code displayed by LXR

 
 

    


File indexing completed on 2026-04-04 08:16:09

0001 // use #include "" only for your local include and put
0002 // those in the first line(s) before any #include <>
0003 // otherwise you are asking for weird behavior
0004 // (more info - check the difference in include path search when using "" versus <>)
0005 
0006 #include "HcalMon.h"
0007 
0008 #include <onlmon/OnlMon.h>  // for OnlMon
0009 #include <onlmon/OnlMonDB.h>
0010 #include <onlmon/OnlMonServer.h>
0011 #include <onlmon/pseudoRunningMean.h>
0012 #include <onlmon/triggerEnum.h>
0013 
0014 #include <calobase/TowerInfoDefs.h>
0015 #include <caloreco/CaloWaveformFitting.h>
0016 
0017 #include <Event/Event.h>
0018 #include <Event/eventReceiverClient.h>
0019 #include <Event/msg_profile.h>
0020 
0021 #include <TH1.h>
0022 #include <TH2.h>
0023 #include <TProfile.h>
0024 #include <TProfile2D.h>
0025 
0026 #include <cmath>
0027 #include <cstdio>  // for printf
0028 #include <fstream>
0029 #include <iostream>
0030 #include <sstream>
0031 #include <string>  // for allocator, string, char_traits
0032 
0033 enum
0034 {
0035   TRGMESSAGE = 1,
0036   FILLMESSAGE = 2
0037 };
0038 
0039 HcalMon::HcalMon(const std::string& name)
0040   : OnlMon(name)
0041 {
0042   // leave ctor fairly empty, its hard to debug if code crashes already
0043   // during a new HcalMon()
0044   // if name start with O then packetlow = 8001, packethigh = 8008
0045   // if name start with I then packetlow = 7001, packethigh = 7008
0046   if (name[0] == 'O')
0047   {
0048     packetlow = 8001;
0049     packethigh = 8008;
0050   }
0051   else if (name[0] == 'I')
0052   {
0053     packetlow = 7001;
0054     packethigh = 7008;
0055   }
0056   else
0057   {
0058     std::cout << "HcalMon::HcalMon - unknown name(need to be OHCALMON or IHCALMON to know what packet to run) " << name << std::endl;
0059     exit(1);
0060   }
0061   return;
0062 }
0063 
0064 HcalMon::~HcalMon()
0065 {
0066   // you can delete NULL pointers it results in a NOOP (No Operation)
0067   delete WaveformProcessing;
0068   for (auto iter : rm_vector_sectAvg)
0069   {
0070     delete iter;
0071   }
0072   for (auto iter : rm_vector_twr)
0073   {
0074     delete iter;
0075   }
0076   for (auto iter : rm_packet_number)
0077   {
0078     delete iter;
0079   }
0080   for (auto iter : rm_packet_length)
0081   {
0082     delete iter;
0083   }
0084   for (auto iter : rm_packet_chans)
0085   {
0086     delete iter;
0087   }
0088   for (auto iter : rm_vector_twrTime)
0089   {
0090     delete iter;
0091   }
0092   for (auto iter : rm_vector_twrhit)
0093   {
0094     delete iter;
0095   }
0096   for (auto iter : rm_vector_twrhit_alltrig)
0097   {
0098     delete iter;
0099   }
0100 
0101   if (erc)
0102   {
0103     delete erc;
0104   }
0105 
0106   return;
0107 }
0108 
0109 const int depth = 200000;
0110 const int packet_depth = 1000;
0111 const int historyLength = 100;
0112 const int historyScaleDown = 100;
0113 // const int n_channel = 48;
0114 float hit_threshold = 30;
0115 float waveform_hit_threshold = 100;
0116 const int n_samples_show = 31;
0117 
0118 int HcalMon::Init()
0119 {
0120   // read our calibrations from HcalMonData.dat
0121   /*
0122 
0123   const char *hcalcalib = getenv("HCALCALIB");
0124   if (!hcalcalib)
0125   {
0126     std::cout << "HCALCALIB environment variable not set" << std::endl;
0127     exit(1);
0128   }
0129   std::string fullfile = std::string(hcalcalib) + "/" + "HcalMonData.dat";
0130   std::ifstream calib(fullfile);
0131   calib.close();
0132   */
0133   // use printf for stuff which should go the screen but not into the message
0134   // system (all couts are redirected)
0135   printf("doing the Init\n");
0136 
0137   for (int itrig = 0; itrig < 64; itrig++)
0138   {
0139     h2_hcal_hits_trig[itrig] = new TH2F(Form("h2_hcal_hits_trig_%d", itrig), "", 24, 0, 24, 64, 0, 64);
0140   }
0141 
0142   pr_zsFrac_etaphi = new TProfile2D("pr_zsFrac_etaphi", "", 24, 0, 24, 64, 0, 64);
0143   pr_zsFrac_etaphi_all = new TProfile2D("pr_zsFrac_etaphi_all", "", 24, 0, 24, 64, 0, 64);
0144   h_hcal_trig = new TH1F("h_hcal_trig", "", 64, 0, 64);
0145   h2_hcal_rm = new TH2F("h2_hcal_rm", "", 24, 0, 24, 64, 0, 64);
0146   h2_hcal_rm_alltrig = new TH2F("h2_hcal_rm_alltrig", "", 24, 0, 24, 64, 0, 64);
0147   h2_hcal_mean = new TH2F("h2_hcal_mean", "", 24, 0, 24, 64, 0, 64);
0148   h2_hcal_time = new TH2F("h2_hcal_time", "", 24, 0, 24, 64, 0, 64);
0149   h2_hcal_hits = new TH2F("h2_hcal_hits", "", 24, 0, 24, 64, 0, 64);
0150   h2_hcal_waveform = new TH2F("h2_hcal_waveform", "", n_samples_show, 0.5, n_samples_show + 0.5, 1000, 0, 15000);
0151   h2_hcal_correlation = new TH2F("h2_hcal_correlation", "", 200, 0, 100000, 200, 0, 150000);
0152   h_event = new TH1F("h_event", "", 1, 0, 1);
0153   h_waveform_twrAvg = new TH1F("h_waveform_twrAvg", "", n_samples_show, 0.5, n_samples_show + 0.5);
0154   h_waveform_time = new TH1F("h_waveform_time", "", n_samples_show, 0.5, n_samples_show + 0.5);
0155   h_waveform_pedestal = new TH1F("h_waveform_pedestal", "", 5e3, 0, 5e3);
0156   h_sectorAvg_total = new TH1F("h_sectorAvg_total", "", 32, 0.5, 32.5);
0157   // number of towers above threshold per event
0158   h_ntower = new TH1F("h_ntower", "", 100, 0, 800);
0159   // packet stuff
0160   h1_packet_number = new TH1F("h1_packet_number", "", 8, packetlow - 0.5, packethigh + 0.5);
0161   h1_packet_length = new TH1F("h1_packet_length", "", 8, packetlow - 0.5, packethigh + 0.5);
0162   h1_packet_chans = new TH1F("h1_packet_chans", "", 8, packetlow - 0.5, packethigh + 0.5);
0163   h1_packet_event = new TH1F("h1_packet_event", "", 8, packetlow - 0.5, packethigh + 0.5);
0164   h_caloPack_gl1_clock_diff = new TH2F("h_caloPack_gl1_clock_diff", "", 8, packetlow - 0.5, packethigh + 0.5, 65536, 0, 65536);
0165   h_evtRec = new TProfile("h_evtRec", "", 1, 0, 1);
0166 
0167   p2_pre_post = new TProfile2D("p2_pre_post", "", 24, 0, 24, 64, 0, 64, "S");
0168 
0169   for(int i = 0; i < nPacketStatus; i++) h1_packet_status[i] = new TH1F(Form("h1_packet_status_%d",i),"",7,packetlow-0.5, packethigh+0.5);
0170 
0171 
0172   for (int ih = 0; ih < Nsector; ih++)
0173   {
0174     h_rm_sectorAvg[ih] = new TH1F(Form("h_rm_sectorAvg_s%d", ih), "", historyLength, 0, historyLength * historyScaleDown);
0175   }
0176   for (int ieta = 0; ieta < 24; ieta++)
0177   {
0178     for (int iphi = 0; iphi < 64; iphi++)
0179     {
0180       h_rm_tower[ieta][iphi] = new TH1F(Form("h_rm_tower_%d_%d", ieta, iphi), Form("multiplicity running mean of tower ieta=%d, iphi=%d", ieta, iphi), historyLength, 0, historyLength * historyScaleDown);
0181     }
0182   }
0183   // make the per-packet running mean objects
0184   // 32 packets and 48 channels for hcal detectors
0185   for (int i = 0; i < Nsector; i++)
0186   {
0187     rm_vector_sectAvg.push_back(new pseudoRunningMean(1, depth));
0188   }
0189   for (int i = 0; i < Ntower; i++)
0190   {
0191     rm_vector_twr.push_back(new pseudoRunningMean(1, depth));
0192     rm_vector_twrTime.push_back(new pseudoRunningMean(1, depth));
0193     rm_vector_twrhit.push_back(new pseudoRunningMean(1, depth));
0194     rm_vector_twrhit_alltrig.push_back(new pseudoRunningMean(1, depth));
0195   }
0196   for (int i = 0; i < 8; i++)
0197   {
0198     rm_packet_number.push_back(new pseudoRunningMean(1, packet_depth));
0199     rm_packet_length.push_back(new pseudoRunningMean(1, packet_depth));
0200     rm_packet_chans.push_back(new pseudoRunningMean(1, packet_depth));
0201   }
0202 
0203   OnlMonServer* se = OnlMonServer::instance();
0204   // register histograms with server otherwise client won't get them
0205   se->registerHisto(this, h2_hcal_hits);
0206   for (int itrig = 0; itrig < 64; itrig++)
0207   {
0208     se->registerHisto(this, h2_hcal_hits_trig[itrig]);
0209   }
0210 
0211   se->registerHisto(this, pr_zsFrac_etaphi);
0212   se->registerHisto(this, pr_zsFrac_etaphi_all);
0213   se->registerHisto(this, h_hcal_trig);
0214   se->registerHisto(this, h_evtRec);
0215   se->registerHisto(this, h_caloPack_gl1_clock_diff);
0216   se->registerHisto(this, h2_hcal_rm);
0217   se->registerHisto(this, h2_hcal_rm_alltrig);
0218   se->registerHisto(this, h2_hcal_mean);
0219   se->registerHisto(this, h2_hcal_time);
0220   se->registerHisto(this, h2_hcal_waveform);
0221   se->registerHisto(this, h_event);
0222   se->registerHisto(this, h_sectorAvg_total);
0223   se->registerHisto(this, h_waveform_twrAvg);
0224   se->registerHisto(this, h_waveform_time);
0225   se->registerHisto(this, h_waveform_pedestal);
0226   se->registerHisto(this, h_ntower);
0227   se->registerHisto(this, h1_packet_number);
0228   se->registerHisto(this, h1_packet_length);
0229   se->registerHisto(this, h1_packet_chans);
0230   se->registerHisto(this, h1_packet_event);
0231   se->registerHisto(this, h2_hcal_correlation);
0232   se->registerHisto(this, p2_pre_post);
0233   for(int i = 0; i < nPacketStatus; i++) se->registerHisto(this, h1_packet_status[i]);
0234 
0235 
0236   for (auto& ih : h_rm_sectorAvg)
0237   {
0238     se->registerHisto(this, ih);
0239   }
0240 
0241   for (auto& ieta : h_rm_tower)
0242   {
0243     for (auto& iphi : ieta)
0244     {
0245       se->registerHisto(this, iphi);
0246     }
0247   }
0248 
0249   Reset();
0250 
0251   // initialize waveform extraction tool
0252   WaveformProcessing = new CaloWaveformFitting();
0253 
0254   std::string hcaltemplate;
0255   if (getenv("HCALCALIB"))
0256   {
0257     hcaltemplate = getenv("HCALCALIB");
0258   }
0259   else
0260   {
0261     hcaltemplate = ".";
0262   }
0263   hcaltemplate += std::string("/testbeam_ohcal_template.root");
0264   // WaveformProcessing->initialize_processing(hcaltemplate);
0265 
0266   if (anaGL1)
0267   {
0268     erc = new eventReceiverClient(eventReceiverClientHost);
0269   }
0270 
0271   return 0;
0272 }
0273 
0274 std::vector<float> HcalMon::getSignal(Packet* p, const int channel)
0275 {
0276   double baseline = 0;
0277   for (int s = 0; s < 3; s++)
0278   {
0279     baseline += p->iValue(s, channel);
0280   }
0281   baseline /= 3.;
0282 
0283   double signal = 0;
0284   int sample = 0;
0285   for (int s = 3; s < p->iValue(0, "SAMPLES"); s++)
0286   {
0287     if (signal > p->iValue(s, channel))
0288     {
0289       signal = p->iValue(s, channel);
0290       sample = s;
0291     }
0292   }
0293   signal -= baseline;
0294 
0295   std::vector<float> result;
0296   result.push_back(signal);
0297   result.push_back(sample);
0298   result.push_back(baseline);
0299 
0300   return result;
0301 }
0302 
0303 std::vector<float> HcalMon::anaWaveform(Packet* p, const int channel)
0304 {
0305   std::vector<float> waveform;
0306   // waveform.reserve(p->iValue(0, "SAMPLES"));
0307   float supppressed = 1;
0308   if (p->iValue(channel, "SUPPRESSED"))
0309   {
0310     waveform.push_back(p->iValue(channel, "PRE"));
0311     waveform.push_back(p->iValue(channel, "POST"));
0312   }
0313   else
0314   {
0315     supppressed = 0;
0316     for (int s = 0; s < p->iValue(0, "SAMPLES"); s++)
0317     {
0318       waveform.push_back(p->iValue(s, channel));
0319     }
0320   }
0321   std::vector<std::vector<float>> multiple_wfs;
0322   multiple_wfs.push_back(waveform);
0323 
0324   std::vector<std::vector<float>> fitresults_ohcal;
0325   // fitresults_ohcal = WaveformProcessing->process_waveform(multiple_wfs);
0326   fitresults_ohcal = WaveformProcessing->calo_processing_fast(multiple_wfs);
0327 
0328   std::vector<float> result;
0329   result = fitresults_ohcal.at(0);
0330   result.push_back(supppressed);
0331 
0332   return result;
0333 }
0334 
0335 int HcalMon::BeginRun(const int /* runno */)
0336 {
0337   // reset the thresholds
0338   hit_threshold = 30;
0339   waveform_hit_threshold = 100;
0340 
0341   // if you need to read calibrations on a run by run basis
0342   // this is the place to do it
0343 
0344   std::vector<runningMean*>::iterator rm_it;
0345   for (rm_it = rm_vector_sectAvg.begin(); rm_it != rm_vector_sectAvg.end(); ++rm_it)
0346   {
0347     (*rm_it)->Reset();
0348   }
0349   for (rm_it = rm_vector_twr.begin(); rm_it != rm_vector_twr.end(); ++rm_it)
0350   {
0351     (*rm_it)->Reset();
0352   }
0353   for (rm_it = rm_packet_number.begin(); rm_it != rm_packet_number.end(); ++rm_it)
0354   {
0355     (*rm_it)->Reset();
0356   }
0357   for (rm_it = rm_packet_length.begin(); rm_it != rm_packet_length.end(); ++rm_it)
0358   {
0359     (*rm_it)->Reset();
0360   }
0361   for (rm_it = rm_packet_chans.begin(); rm_it != rm_packet_chans.end(); ++rm_it)
0362   {
0363     (*rm_it)->Reset();
0364   }
0365   for (rm_it = rm_vector_twrTime.begin(); rm_it != rm_vector_twrTime.end(); ++rm_it)
0366   {
0367     (*rm_it)->Reset();
0368   }
0369   for (rm_it = rm_vector_twrhit.begin(); rm_it != rm_vector_twrhit.end(); ++rm_it)
0370   {
0371     (*rm_it)->Reset();
0372   }
0373   for (rm_it = rm_vector_twrhit_alltrig.begin(); rm_it != rm_vector_twrhit_alltrig.end(); ++rm_it)
0374   {
0375     (*rm_it)->Reset();
0376   }
0377   if (anaGL1)
0378   {
0379     OnlMonServer* se = OnlMonServer::instance();
0380     se->UseGl1();
0381   }
0382   return 0;
0383 }
0384 
0385 int HcalMon::process_event(Event* e /* evt */)
0386 {
0387   if (e->getEvtType() >= 8)  /// special event where we do not read out the calorimeters
0388   {
0389     return 0;
0390   }
0391   evtcnt++;
0392   h_waveform_twrAvg->Reset();  // only record the latest event waveform
0393   h1_packet_event->Reset();
0394   unsigned int towerNumber = 0;
0395   float sectorAvg[Nsector] = {0};
0396   int npacket1 = 0;
0397   int npacket2 = 0;
0398   float energy1 = 0;
0399   float energy2 = 0;
0400 
0401   bool fillhist = true;
0402   std::vector<bool> trig_bools;
0403   trig_bools.resize(64);
0404   long long int gl1_clock = 0;
0405   bool have_gl1 = false;
0406   if (anaGL1)
0407   {
0408     int evtnr = e->getEvtSequence();
0409     Event* gl1Event = erc->getEvent(evtnr);
0410     if (gl1Event)
0411     {
0412       OnlMonServer* se = OnlMonServer::instance();
0413       se->IncrementGl1FoundCounter();
0414       have_gl1 = true;
0415       Packet* p = gl1Event->getPacket(14001);
0416       h_evtRec->Fill(0.0, 1.0);
0417       if (p)
0418       {
0419         gl1_clock = p->lValue(0, "BCO");
0420         uint64_t triggervec = p->lValue(0, "ScaledVector");
0421         for (int i = 0; i < 64; i++)
0422         {
0423           bool trig_decision = ((triggervec & 0x1U) == 0x1U);
0424           trig_bools[i] = trig_decision;
0425 
0426           if (trig_decision)
0427           {
0428             h_hcal_trig->Fill(i);
0429           }
0430           triggervec = (triggervec >> 1U);
0431         }
0432 
0433         delete p;
0434       }
0435       delete gl1Event;
0436     }
0437     else
0438     {
0439       std::cout << "GL1 event is null" << std::endl;
0440       h_evtRec->Fill(0.0, 0.0);
0441     }
0442     // this is for only fill certain histogram with the MBD>=1 trigger or cosmic single trigger(and they should never run together!!)
0443     if (usetrig4_10)
0444     {
0445       // commenting out until we have a better way to handle cosmic bits -- tanner
0446       if (
0447         trig_bools.at(TriggerEnum::BitCodes::MBD_NS1_ZVRTX10) == 0 
0448         && trig_bools.at(TriggerEnum::BitCodes::MBD_NS1_ZVRTX13) == 0 
0449         && trig_bools.at(TriggerEnum::BitCodes::MBD_NS1_ZVRTX150) == 0 
0450         && trig_bools.at(TriggerEnum::BitCodes::HCAL_SINGLES) == 0
0451       )
0452       {
0453         fillhist = false;
0454       }
0455       // if we have hcal single cosmic trigger we are in cosmic running mode and need to adjust thresholds accordingly
0456       if (trig_bools.at(TriggerEnum::BitCodes::RANDOM) 
0457         || trig_bools.at(TriggerEnum::BitCodes::HCAL_SINGLES) 
0458         || trig_bools.at(TriggerEnum::BitCodes::HCAL_NARROW_VERT) 
0459         || trig_bools.at(TriggerEnum::BitCodes::HCAL_WIDE_VERT) 
0460         || trig_bools.at(TriggerEnum::BitCodes::HCAL_NARROW_HORZ) 
0461         || trig_bools.at(TriggerEnum::BitCodes::HCAL_WIDE_HORZ))
0462       {
0463         hit_threshold = 1000;
0464         waveform_hit_threshold = 1500;
0465       }
0466     }
0467   }
0468 
0469   for (int packet = packetlow; packet <= packethigh; packet++)
0470   {
0471     Packet* p = e->getPacket(packet);
0472     int zero[1] = {0};
0473     int one[1] = {1};
0474     int packet_bin = packet - packetlow + 1;
0475     if (p)
0476     {
0477       rm_packet_number[packet - packetlow]->Add(one);
0478       int packet_length[1] = {p->getLength()};
0479       rm_packet_length[packet - packetlow]->Add(packet_length);
0480       h1_packet_status[(int)p->getStatus()]->Fill(packet);
0481 
0482       h1_packet_length->SetBinContent(packet_bin, rm_packet_length[packet - packetlow]->getMean(0));
0483 
0484       h1_packet_event->SetBinContent(packet - packetlow + 1, p->lValue(0, "CLOCK"));
0485       if (have_gl1)
0486       {
0487         long long int p_clock = p->lValue(0, "CLOCK");
0488         long long int diff = (p_clock - gl1_clock) % 65536;
0489         h_caloPack_gl1_clock_diff->Fill(packet, diff);
0490       }
0491       int nChannels = p->iValue(0, "CHANNELS");
0492       if (nChannels > m_nChannels)
0493       {
0494         return -1;  // packet is corrupted, reports too many channels
0495       }
0496       else
0497       {
0498         npacket1++;
0499         rm_packet_chans[packet - packetlow]->Add(&nChannels);
0500         h1_packet_chans->SetBinContent(packet_bin, rm_packet_chans[packet - packetlow]->getMean(0));
0501       }
0502       for (int c = 0; c < nChannels; c++)
0503       {
0504         towerNumber++;
0505 
0506         // std::vector result =  getSignal(p,c); // simple peak extraction
0507         std::vector<float> result = anaWaveform(p, c);  // full waveform fitting
0508         float signal = result.at(0);
0509         float time = result.at(1);
0510         float pedestal = result.at(2);
0511         float suppressed = result.at(result.size() - 1);
0512         float prepost = p->iValue(c, "PRE") - p->iValue(c, "POST");
0513         if (signal > 15 && signal < 15000)
0514         {
0515           energy1 += signal;
0516         }
0517 
0518         // channel mapping
0519         unsigned int key = TowerInfoDefs::encode_hcal(towerNumber - 1);
0520         unsigned int phi_bin = TowerInfoDefs::getCaloTowerPhiBin(key);
0521         unsigned int eta_bin = TowerInfoDefs::getCaloTowerEtaBin(key);
0522         int sectorNumber = phi_bin / 2 + 1;
0523         int bin = h2_hcal_mean->FindBin(eta_bin + 0.5, phi_bin + 0.5);
0524         //________________________________for this part we only want to deal with the MBD>=1 trigger
0525         if (fillhist)
0526         {
0527           if (signal > hit_threshold)
0528           {
0529             rm_vector_twrTime[towerNumber - 1]->Add(&time);
0530             rm_vector_twrhit[towerNumber - 1]->Add(one);
0531           }
0532           else
0533           {
0534             rm_vector_twrhit[towerNumber - 1]->Add(zero);
0535           }
0536           h_waveform_pedestal->Fill(pedestal);
0537 
0538           if (suppressed == 1)
0539           {
0540             pr_zsFrac_etaphi->Fill(eta_bin, phi_bin, 0);
0541           }
0542           else
0543           {
0544             pr_zsFrac_etaphi->Fill(eta_bin, phi_bin, 1);
0545           }
0546 
0547           sectorAvg[sectorNumber - 1] += signal;
0548 
0549           rm_vector_twr[towerNumber - 1]->Add(&signal);
0550 
0551           h2_hcal_mean->SetBinContent(bin, h2_hcal_mean->GetBinContent(bin) + signal);
0552           h2_hcal_rm->SetBinContent(bin, rm_vector_twrhit[towerNumber - 1]->getMean(0));
0553           h2_hcal_time->SetBinContent(bin, rm_vector_twrTime[towerNumber - 1]->getMean(0));
0554 
0555           // fill tower_rm here
0556           if (evtcnt <= historyLength * historyScaleDown)
0557           {
0558             // only fill every scaledown event
0559             if (evtcnt % historyScaleDown == 0)
0560             {
0561               h_rm_tower[eta_bin][phi_bin]->SetBinContent(evtcnt / historyScaleDown, rm_vector_twrhit[towerNumber - 1]->getMean(0));
0562             }
0563           }
0564           else
0565           {
0566             // only fill every scaledown event
0567             if (evtcnt % historyScaleDown == 0)
0568             {
0569               for (int ib = 1; ib < historyLength; ib++)
0570               {
0571                 h_rm_tower[eta_bin][phi_bin]->SetBinContent(ib, h_rm_tower[eta_bin][phi_bin]->GetBinContent(ib + 1));
0572               }
0573               h_rm_tower[eta_bin][phi_bin]->SetBinContent(historyLength, rm_vector_twrhit[towerNumber - 1]->getMean(0));
0574             }
0575           }
0576         }
0577         //_______________________________________________________end of MBD trigger requirement
0578         if (suppressed == 1)
0579         {
0580           pr_zsFrac_etaphi_all->Fill(eta_bin, phi_bin, 0);
0581         }
0582         else
0583         {
0584           pr_zsFrac_etaphi_all->Fill(eta_bin, phi_bin, 1);
0585         }
0586         // record waveform
0587         for (int s = 0; s < p->iValue(0, "SAMPLES"); s++)
0588         {
0589           h_waveform_twrAvg->Fill(s, p->iValue(s, c));
0590           if (signal > waveform_hit_threshold)
0591           {
0592             h2_hcal_waveform->Fill(s, (p->iValue(s, c) - pedestal));
0593           }
0594         }
0595         if (signal > waveform_hit_threshold)
0596         {
0597           h_waveform_time->Fill(time);
0598         }
0599 
0600         if (signal > hit_threshold)
0601         {
0602           h2_hcal_hits->Fill(eta_bin + 0.5, phi_bin + 0.5);
0603           for (int itrig = 0; itrig < 64; itrig++)
0604           {
0605             if (trig_bools[itrig])
0606             {
0607               h2_hcal_hits_trig[itrig]->Fill(eta_bin + 0.5, phi_bin + 0.5);
0608             }
0609           }
0610           rm_vector_twrhit_alltrig[towerNumber - 1]->Add(one);
0611         }
0612         else
0613         {
0614           rm_vector_twrhit_alltrig[towerNumber - 1]->Add(zero);
0615         }
0616         if (prepost > 0)
0617         {
0618           p2_pre_post->Fill(eta_bin, phi_bin, prepost);
0619           p2_pre_post->Fill(eta_bin, phi_bin, -prepost);
0620         }
0621         h2_hcal_rm_alltrig->SetBinContent(bin, rm_vector_twrhit_alltrig[towerNumber - 1]->getMean(0));
0622 
0623       }  // channel loop
0624 
0625     }  // if packet good
0626     else
0627     {
0628       towerNumber += 192;
0629       rm_packet_number[packet - packetlow]->Add(zero);
0630     }
0631     h1_packet_number->SetBinContent(packet_bin, rm_packet_number[packet - packetlow]->getMean(0));
0632     delete p;
0633   }  // packet loop
0634   // if packetlow == 8001, then packetlowdiff = 7001, if packetlow == 7001, then packetlowdiff = 8001
0635   int packetlowdiff = 15002 - packetlow;
0636   int packethighdiff = 15016 - packethigh;
0637 
0638   if (npacket1 == 4)
0639   {
0640     for (int i = packetlowdiff; i <= packethighdiff; i++)
0641     {
0642       Packet* p = e->getPacket(i);
0643       if (p)
0644       {
0645         int nChannels = p->iValue(0, "CHANNELS");
0646         if (nChannels > m_nChannels)
0647         {
0648           return -1;  // packet is corrupted, reports too many channels
0649         }
0650         else
0651         {
0652           npacket2++;
0653         }
0654         for (int c = 0; c < nChannels; c++)
0655         {
0656           // std::vector result =  getSignal(p,c); // simple peak extraction
0657           std::vector<float> result = anaWaveform(p, c);  // full waveform fitting
0658           float signal = result.at(0);
0659           if (signal > 15 && signal < 15000)
0660           {
0661             energy2 += signal;
0662           }
0663         }
0664       }
0665       delete p;
0666     }
0667   }
0668   if (npacket1 == 4 && npacket2 == 4)
0669   {
0670     if (packetlow == 8001)
0671     {
0672       h2_hcal_correlation->Fill(energy1, energy2);
0673     }
0674     else
0675     {
0676       h2_hcal_correlation->Fill(energy2, energy1);
0677     }
0678   }
0679   // sector loop
0680   for (int isec = 0; isec < Nsector; isec++)
0681   {
0682     sectorAvg[isec] /= 48;
0683     h_sectorAvg_total->Fill(isec + 1, sectorAvg[isec]);
0684     rm_vector_sectAvg[isec]->Add(&sectorAvg[isec]);
0685     if (evtcnt <= historyLength * historyScaleDown)
0686     {
0687       // only fill every scaledown event
0688       if (evtcnt % historyScaleDown == 0)
0689       {
0690         h_rm_sectorAvg[isec]->SetBinContent(evtcnt / historyScaleDown, rm_vector_sectAvg[isec]->getMean(0));
0691       }
0692     }
0693     else
0694     {
0695       // only fill every scaledown event
0696       if (evtcnt % historyScaleDown == 0)
0697       {
0698         for (int ib = 1; ib < historyLength; ib++)
0699         {
0700           h_rm_sectorAvg[isec]->SetBinContent(ib, h_rm_sectorAvg[isec]->GetBinContent(ib + 1));
0701         }
0702         h_rm_sectorAvg[isec]->SetBinContent(historyLength, rm_vector_sectAvg[isec]->getMean(0));
0703       }
0704     }
0705 
0706   }  // sector loop
0707 
0708   //if (fillhist)
0709   h_event->Fill(0);
0710   h_waveform_twrAvg->Scale(1. / 32. / 48.);  // average tower waveform
0711 
0712   return 0;
0713 }
0714 
0715 int HcalMon::Reset()
0716 {
0717   // reset our internal counters
0718   evtcnt = 0;
0719   idummy = 0;
0720   return 0;
0721 }