File indexing completed on 2025-08-05 08:16:07
0001 #include "InttBcoDump.h"
0002
0003 #include <fun4all/Fun4AllReturnCodes.h>
0004 #include <fun4all/SubsysReco.h> // for SubsysReco
0005
0006 #include <fun4all/Fun4AllHistoManager.h>
0007
0008 #include <phool/PHCompositeNode.h>
0009 #include <phool/PHDataNode.h>
0010 #include <phool/PHNode.h> // for PHNode
0011 #include <phool/PHNodeIterator.h> // for PHNodeIterator
0012 #include <phool/getClass.h>
0013
0014 #include <Event/Event.h>
0015 #include <Event/EventTypes.h>
0016 #include <Event/packet.h>
0017
0018 #include <TFile.h>
0019 #include <TSystem.h>
0020 #include <TTree.h>
0021
0022 #include <iostream> // for operator<<, endl, basic_ost...
0023 #include <set>
0024 #include <utility> // for pair
0025 #include <vector> // for vector
0026
0027
0028 InttBcoDump::InttBcoDump(const std::string &name)
0029 : SubsysReco(name)
0030 {
0031 }
0032
0033 int InttBcoDump::InitRun(PHCompositeNode * )
0034 {
0035 if (outfilename.empty())
0036 {
0037 std::cout << "no output filename given" << std::endl;
0038 gSystem->Exit(1);
0039 }
0040
0041 outfile = new TFile(outfilename.c_str(), "RECREATE");
0042 outfile->SetCompressionSettings(505);
0043 ttree = new TTree("bco", "bco");
0044 ttree->Branch("id", &m_id);
0045 ttree->Branch("evt", &m_evt);
0046 ttree->Branch("nfees", &m_nfees);
0047 ttree->Branch("bco", &m_bco);
0048 ttree->Branch("bcodiff", &m_bcodiff);
0049 ttree->SetAutoFlush(100000);
0050 return Fun4AllReturnCodes::EVENT_OK;
0051 }
0052
0053
0054 int InttBcoDump::process_event(PHCompositeNode *topNode)
0055 {
0056 Event *evt = findNode::getClass<Event>(topNode, "PRDF");
0057 if (!evt)
0058 {
0059 std::cout << "No Event found" << std::endl;
0060 exit(1);
0061 }
0062 if (evt->getEvtType() == ENDRUNEVENT)
0063 {
0064 std::cout << "End run flag for INTT found, remaining INTT data is corrupted" << std::endl;
0065 delete evt;
0066 return Fun4AllReturnCodes::ABORTRUN;
0067 }
0068
0069 int EventSequence = evt->getEvtSequence();
0070 std::vector<Packet *> pktvec = evt->getPacketVector();
0071 std::map<int, std::set<uint64_t>> bcoset;
0072 for (auto *packet : pktvec)
0073 {
0074 int nbcos = packet->iValue(0, "NR_BCOS");
0075 for (int i = 0; i < nbcos; i++)
0076 {
0077 uint64_t bco = packet->lValue(i, "BCOLIST");
0078 int nfees = packet->iValue(i, "NR_FEES");
0079 bcoTaggedFees[bco] = nfees;
0080 for (int j = 0; j < nfees; j++)
0081 {
0082 int fee = packet->iValue(i, j, "FEELIST");
0083 lastbco.insert(std::make_pair(fee, 0));
0084
0085 bcoset[fee].insert(bco);
0086 }
0087 }
0088
0089 delete packet;
0090 }
0091 pktvec.clear();
0092
0093 for (auto &mapiter : bcoset)
0094 {
0095 if (!mapiter.second.empty())
0096 {
0097 for (const auto &bco : mapiter.second)
0098 {
0099 uint64_t prevbco = lastbco[mapiter.first];
0100 if (prevbco > 0 && prevbco != bco)
0101 {
0102 int64_t diffbco = bco - prevbco;
0103
0104 m_id = mapiter.first;
0105 m_evt = EventSequence;
0106 m_bco = bco;
0107 m_nfees = bcoTaggedFees[bco];
0108 m_bcodiff = diffbco;
0109
0110 ttree->Fill();
0111 }
0112 lastbco[mapiter.first] = bco;
0113 }
0114 mapiter.second.clear();
0115 }
0116 }
0117 bcoset.clear();
0118 bcoTaggedFees.clear();
0119 lastbco.clear();
0120 return Fun4AllReturnCodes::EVENT_OK;
0121 }
0122
0123
0124 int InttBcoDump::End(PHCompositeNode * )
0125 {
0126 outfile->cd();
0127 ttree->Write();
0128 outfile->Close();
0129 delete outfile;
0130 return Fun4AllReturnCodes::EVENT_OK;
0131 }