File indexing completed on 2025-08-05 08:16:15
0001 #include "SingleGl1TriggerInput.h"
0002
0003 #include "Fun4AllPrdfInputTriggerManager.h"
0004 #include "InputManagerType.h"
0005
0006 #include <ffarawobjects/Gl1Packetv3.h>
0007
0008 #include <phool/PHCompositeNode.h>
0009 #include <phool/PHIODataNode.h> // for PHIODataNode
0010 #include <phool/PHNode.h> // for PHNode
0011 #include <phool/PHNodeIterator.h> // for PHNodeIterator
0012 #include <phool/PHObject.h> // for PHObject
0013 #include <phool/getClass.h>
0014 #include <phool/phool.h>
0015
0016 #include <Event/Event.h>
0017 #include <Event/EventTypes.h>
0018 #include <Event/Eventiterator.h>
0019 #include <Event/packet.h> // for Packet
0020
0021 #include <cstdint> // for uint64_t
0022 #include <iostream> // for operator<<, basic_ostream<...
0023 #include <iterator> // for reverse_iterator
0024 #include <limits> // for numeric_limits
0025 #include <memory>
0026 #include <set>
0027 #include <utility> // for pair
0028
0029 SingleGl1TriggerInput::SingleGl1TriggerInput(const std::string &name)
0030 : SingleTriggerInput(name)
0031 {
0032 SubsystemEnum(InputManagerType::GL1);
0033 }
0034
0035 SingleGl1TriggerInput::~SingleGl1TriggerInput()
0036 {
0037 CleanupUsedPackets(std::numeric_limits<int>::max());
0038
0039
0040 while (m_EventStack.begin() != m_EventStack.end())
0041 {
0042 m_EventStack.erase(m_EventStack.begin());
0043 }
0044 }
0045
0046 void SingleGl1TriggerInput::FillPool(const unsigned int keep)
0047 {
0048 if (AllDone())
0049 {
0050 return;
0051 }
0052 while (GetEventiterator() == nullptr)
0053 {
0054 if (!OpenNextFile())
0055 {
0056 AllDone(1);
0057 return;
0058 }
0059 }
0060 while (GetSomeMoreEvents(keep))
0061 {
0062 std::unique_ptr<Event> evt(GetEventiterator()->getNextEvent());
0063 while (!evt)
0064 {
0065 fileclose();
0066 if (!OpenNextFile())
0067 {
0068 AllDone(1);
0069 return;
0070 }
0071 evt.reset(GetEventiterator()->getNextEvent());
0072 }
0073 if (Verbosity() > 2)
0074 {
0075 std::cout << PHWHERE << "Fetching next Event" << evt->getEvtSequence() << std::endl;
0076 }
0077 RunNumber(evt->getRunNumber());
0078 if (GetVerbosity() > 1)
0079 {
0080 evt->identify();
0081 }
0082 if (evt->getEvtType() != DATAEVENT)
0083 {
0084 m_NumSpecialEvents++;
0085 continue;
0086 }
0087 int EventSequence = evt->getEvtSequence();
0088 if (EventSequence < SkipToEvent())
0089 {
0090 continue;
0091 }
0092 if (EventSequence > LastEvent())
0093 {
0094 std::cout << Name() << ": Last event " << LastEvent() << std::endl;
0095 AllDone(1);
0096 return;
0097 }
0098 Packet *packet = evt->getPacket(14001);
0099 if (!packet)
0100 {
0101 std::cout << PHWHERE << "Packet 14001 is null ptr" << std::endl;
0102 evt->identify();
0103 continue;
0104 }
0105 if (Verbosity() > 1)
0106 {
0107 packet->identify();
0108 }
0109
0110
0111 Gl1Packet *newhit = new Gl1Packetv3();
0112 uint64_t gtm_bco = packet->lValue(0, "BCO");
0113 unsigned int packetnumber = packet->iValue(0);
0114 unsigned int gl1pktdiff = packetnumber - EventSequence;
0115 if (m_Gl1PacketNumberEventNumberDiff == 0)
0116 {
0117 m_Gl1PacketNumberEventNumberDiff = gl1pktdiff;
0118 }
0119 else
0120 {
0121 if (m_Gl1PacketNumberEventNumberDiff != gl1pktdiff)
0122 {
0123 if (TriggerInputManager())
0124 {
0125 TriggerInputManager()->AddGl1DroppedEvent(EventSequence);
0126 }
0127
0128 static int icnt = 0;
0129 if (icnt < 1000)
0130 {
0131 std::cout << Name() << ": Found dropped Event at event " << EventSequence
0132 << " with Packet Number: " << packetnumber << std::endl;
0133 icnt++;
0134 }
0135 m_Gl1PacketNumberEventNumberDiff = gl1pktdiff;
0136 }
0137 }
0138
0139 newhit->setBCO(packet->lValue(0, "BCO"));
0140 newhit->setHitFormat(packet->getHitFormat());
0141 newhit->setIdentifier(packet->getIdentifier());
0142 newhit->setEvtSequence(EventSequence);
0143 newhit->setPacketNumber(packetnumber);
0144
0145 newhit->setBunchNumber(packet->lValue(0, "BunchNumber"));
0146 newhit->setTriggerInput(packet->lValue(0, "TriggerInput"));
0147 newhit->setLiveVector(packet->lValue(0, "LiveVector"));
0148 newhit->setScaledVector(packet->lValue(0, "ScaledVector"));
0149 newhit->setGTMBusyVector(packet->lValue(0, "GTMBusyVector"));
0150 newhit->setGTMAllBusyVector(packet->lValue(0, "GTMAllBusyVector"));
0151 for (int i = 0; i < 64; i++)
0152 {
0153 for (int j = 0; j < 3; j++)
0154 {
0155 newhit->setScaler(i, j, packet->lValue(i, j));
0156 }
0157 }
0158 for (int i = 0; i < 12; i++)
0159 {
0160 newhit->setGl1pScaler(i, 0, packet->lValue(i, "GL1PRAW"));
0161 newhit->setGl1pScaler(i, 1, packet->lValue(i, "GL1PLIVE"));
0162 newhit->setGl1pScaler(i, 2, packet->lValue(i, "GL1PSCALED"));
0163 }
0164 if (Verbosity() > 2)
0165 {
0166 std::cout << PHWHERE << " Packet: " << packet->getIdentifier()
0167 << " evtno: " << EventSequence
0168 << ", bco: 0x" << std::hex << gtm_bco << std::dec
0169 << ", bunch no: " << packet->lValue(0, "BunchNumber")
0170 << std::endl;
0171 std::cout << PHWHERE << " RB Packet: " << newhit->getIdentifier()
0172 << " evtno: " << newhit->getEvtSequence()
0173 << ", bco: 0x" << std::hex << newhit->getBCO() << std::dec
0174 << ", bunch no: " << +newhit->getBunchNumber()
0175 << std::endl;
0176 }
0177 if (TriggerInputManager())
0178 {
0179 TriggerInputManager()->AddGl1Packet(EventSequence, newhit);
0180 }
0181 m_PacketMap[EventSequence].push_back(newhit);
0182 m_EventStack.insert(EventSequence);
0183 if (ddump_enabled())
0184 {
0185 ddumppacket(packet);
0186 }
0187
0188 delete packet;
0189 }
0190 }
0191
0192 void SingleGl1TriggerInput::Print(const std::string &what) const
0193 {
0194 if (what == "ALL" || what == "STORAGE")
0195 {
0196 for (const auto &bcliter : m_PacketMap)
0197 {
0198 std::cout << PHWHERE << "Event: " << bcliter.first << std::endl;
0199 }
0200 }
0201 if (what == "ALL" || what == "STACK")
0202 {
0203 for (auto iter : m_EventStack)
0204 {
0205 std::cout << PHWHERE << "stacked event: " << iter << std::endl;
0206 }
0207 }
0208 }
0209
0210 void SingleGl1TriggerInput::CleanupUsedPackets(const int eventno)
0211 {
0212 std::vector<int> toclearevents;
0213 for (const auto &iter : m_PacketMap)
0214 {
0215 if (iter.first <= eventno)
0216 {
0217 for (auto pktiter : iter.second)
0218 {
0219 delete pktiter;
0220 }
0221 toclearevents.push_back(iter.first);
0222 }
0223 else
0224 {
0225 break;
0226 }
0227 }
0228
0229 for (auto iter : toclearevents)
0230 {
0231 m_EventStack.erase(iter);
0232 m_PacketMap.erase(iter);
0233 }
0234 }
0235
0236 void SingleGl1TriggerInput::ClearCurrentEvent()
0237 {
0238
0239 int currentevent = *m_EventStack.begin();
0240
0241 CleanupUsedPackets(currentevent);
0242 return;
0243 }
0244
0245 void SingleGl1TriggerInput::CreateDSTNode(PHCompositeNode *topNode)
0246 {
0247 PHNodeIterator iter(topNode);
0248 PHCompositeNode *dstNode = dynamic_cast<PHCompositeNode *>(iter.findFirst("PHCompositeNode", "DST"));
0249 if (!dstNode)
0250 {
0251 dstNode = new PHCompositeNode("DST");
0252 topNode->addNode(dstNode);
0253 }
0254 PHNodeIterator iterDst(dstNode);
0255 PHCompositeNode *detNode = dynamic_cast<PHCompositeNode *>(iterDst.findFirst("PHCompositeNode", "GL1"));
0256 if (!detNode)
0257 {
0258 detNode = new PHCompositeNode("GL1");
0259 dstNode->addNode(detNode);
0260 }
0261 OfflinePacket *gl1hitcont = findNode::getClass<OfflinePacket>(detNode, "GL1Packet");
0262 if (!gl1hitcont)
0263 {
0264 gl1hitcont = new Gl1Packetv3();
0265 PHIODataNode<PHObject> *newNode = new PHIODataNode<PHObject>(gl1hitcont, "GL1Packet", "PHObject");
0266 detNode->addNode(newNode);
0267 }
0268 }