Back to home page

sPhenix code displayed by LXR

 
 

    


File indexing completed on 2025-08-06 08:17:20

0001 #include "Fun4AllPrdfInputTriggerManager.h"
0002 
0003 #include "SinglePrdfInput.h"
0004 #include "SingleTriggerInput.h"
0005 
0006 #include <fun4all/Fun4AllInputManager.h>  // for Fun4AllInputManager
0007 #include <fun4all/Fun4AllReturnCodes.h>
0008 #include <fun4all/Fun4AllServer.h>
0009 #include <fun4all/Fun4AllSyncManager.h>
0010 
0011 #include <ffaobjects/SyncObject.h>    // for SyncObject
0012 #include <ffaobjects/SyncObjectv1.h>  // for SyncObject
0013 
0014 #include <ffarawobjects/CaloPacket.h>
0015 #include <ffarawobjects/CaloPacketContainer.h>
0016 #include <ffarawobjects/Gl1Packet.h>
0017 #include <ffarawobjects/LL1Packet.h>
0018 #include <ffarawobjects/LL1PacketContainer.h>
0019 
0020 #include <phool/PHCompositeNode.h>
0021 #include <phool/PHDataNode.h>
0022 #include <phool/PHNode.h>          // for PHNode
0023 #include <phool/PHNodeIterator.h>  // for PHNodeIterator
0024 #include <phool/PHObject.h>        // for PHObject
0025 #include <phool/getClass.h>
0026 #include <phool/phool.h>  // for PHWHERE
0027 
0028 #include <TSystem.h>
0029 
0030 #include <algorithm>  // for std::search
0031 #include <cassert>
0032 #include <climits>
0033 #include <cstdlib>
0034 #include <iostream>  // for operator<<, basic_ostream, endl
0035 #include <utility>   // for pair
0036 
0037 Fun4AllPrdfInputTriggerManager::Fun4AllPrdfInputTriggerManager(const std::string &name, const std::string &prdfnodename, const std::string &topnodename)
0038   : Fun4AllInputManager(name, prdfnodename, topnodename)
0039   , m_SyncObject(new SyncObjectv1())
0040 {
0041   Fun4AllServer *se = Fun4AllServer::instance();
0042   m_topNode = se->topNode(TopNodeName());
0043 }
0044 
0045 Fun4AllPrdfInputTriggerManager::~Fun4AllPrdfInputTriggerManager()
0046 {
0047   if (IsOpen())
0048   {
0049     fileclose();
0050   }
0051   delete m_SyncObject;
0052   for (auto iter : m_TriggerInputVector)
0053   {
0054     if (Verbosity() > 1)
0055     {
0056       std::cout << PHWHERE << " deleting " << iter->Name() << std::endl;
0057     }
0058     delete iter;
0059   }
0060 }
0061 
0062 int Fun4AllPrdfInputTriggerManager::run(const int /*nevents*/)
0063 {
0064 tryagain:
0065   int iret = 0;
0066   if (m_gl1_registered_flag)  // Gl1 first to get the reference
0067   {
0068     iret += FillGl1(m_PoolDepth);
0069   }
0070   if (m_mbd_registered_flag)  // Mbd next to get the reference if Gl1 is missing
0071   {
0072     iret += FillMbd(m_PoolDepth);
0073   }
0074   if (m_hcal_registered_flag)  // Mbd first to get the reference
0075   {
0076     iret += FillHcal(m_PoolDepth);
0077   }
0078   if (m_cemc_registered_flag)  // Mbd first to get the reference
0079   {
0080     iret += FillCemc(m_PoolDepth);
0081   }
0082   if (m_zdc_registered_flag)  // Mbd first to get the reference
0083   {
0084     iret += FillZdc(m_PoolDepth);
0085   }
0086   if (m_ll1_registered_flag)  // LL1 next to get the reference if Gl1 is missing
0087   {
0088     iret += FillLL1(m_PoolDepth);
0089   }
0090   if (iret)
0091   {
0092     return -1;
0093   }
0094   m_PoolDepth = m_DefaultPoolDepth;
0095   DetermineReferenceEventNumber();
0096   if (Verbosity() > 0)
0097   {
0098     std::cout << "new ref event: " << m_RefEventNo << std::endl;
0099   }
0100   if (m_resync_flag)
0101   {
0102     //    Print("CEMCMAP");
0103     ClockDiffFill();
0104     if (ClockDiffCheck())
0105     {
0106       // this is not used yet - ClockDiffCheck() always returns zero
0107       // NOLINTNEXTLINE(hicpp-avoid-goto)
0108       goto tryagain;
0109     }
0110     //    Print("CEMCMAP");
0111   }
0112   MoveGl1ToNodeTree();
0113   MoveMbdToNodeTree();
0114   MoveCemcToNodeTree();
0115   MoveHcalToNodeTree();
0116   MoveLL1ToNodeTree();
0117   // do not switch the order of zdc and sepd, they use a common input manager
0118   // and the cleanup is done in MoveSEpdToNodeTree, if the MoveZdcToNodeTree is
0119   // called after that it will segfault
0120   MoveZdcToNodeTree();
0121   MoveSEpdToNodeTree();
0122   MySyncManager()->CurrentEvent(m_RefEventNo);
0123   return 0;
0124   // readagain:
0125   //   if (!IsOpen())
0126   //   {
0127   //     if (FileListEmpty())
0128   //     {
0129   //       if (Verbosity() > 0)
0130   //       {
0131   //         std::cout << Name() << ": No Input file open" << std::endl;
0132   //       }
0133   //       return -1;
0134   //     }
0135   //     else
0136   //     {
0137   //       if (OpenNextFile())
0138   //       {
0139   //         std::cout << Name() << ": No Input file from filelist opened" << std::endl;
0140   //         return -1;
0141   //       }
0142   //     }
0143   //   }
0144   //   if (Verbosity() > 3)
0145   //   {
0146   //     std::cout << "Getting Event from " << Name() << std::endl;
0147   //   }
0148   // // Fill Event combiner
0149   //   unsigned int watermark = m_EventCombiner.size();
0150   //   if (watermark < m_LowWaterMark)
0151   //   {
0152   //     for (unsigned int i = watermark; i < m_CombinerDepth; i++)
0153   //     {
0154   //       Event *evt = m_EventIterator->getNextEvent();
0155   //       std::cout << "Filling combiner with event " << evt->getEvtSequence() << std::endl;
0156   //       m_EventCombiner.insert(std::make_pair(evt->getEvtSequence(), evt));
0157   //     }
0158   //   }
0159   //   //  std::cout << "running event " << nevents << std::endl;
0160   //   PHNodeIterator iter(m_topNode);
0161   //   PHDataNode<Event> *PrdfNode = dynamic_cast<PHDataNode<Event> *>(iter.findFirst("PHDataNode", m_PrdfNodeName));
0162   //   if (m_SaveEvent)  // if an event was pushed back, copy saved pointer and reset m_SaveEvent pointer
0163   //   {
0164   //     m_Event = m_SaveEvent;
0165   //     m_SaveEvent = nullptr;
0166   //     m_EventsThisFile--;
0167   //     m_EventsTotal--;
0168   //   }
0169   //   else
0170   //   {
0171   //     m_Event = m_EventCombiner.begin()->second;
0172   //   }
0173   //   PrdfNode->setData(m_Event);
0174   //   if (!m_Event)
0175   //   {
0176   //     fileclose();
0177   //     goto readagain;
0178   //   }
0179   //   if (Verbosity() > 1)
0180   //   {
0181   //     std::cout << Name() << " PRDF run " << m_Event->getRunNumber() << ", evt no: " << m_Event->getEvtSequence() << std::endl;
0182   //   }
0183   //   m_EventsTotal++;
0184   //   m_EventsThisFile++;
0185   //   SetRunNumber(m_Event->getRunNumber());
0186   //   MySyncManager()->PrdfEvents(m_EventsThisFile);
0187   //   MySyncManager()->SegmentNumber(m_Segment);
0188   //   MySyncManager()->CurrentEvent(m_Event->getEvtSequence());
0189   //   m_SyncObject->EventCounter(m_EventsThisFile);
0190   //   m_SyncObject->SegmentNumber(m_Segment);
0191   //   m_SyncObject->RunNumber(m_Event->getRunNumber());
0192   //   m_SyncObject->EventNumber(m_Event->getEvtSequence());
0193   //   // check if the local SubsysReco discards this event
0194   //   if (RejectEvent() != Fun4AllReturnCodes::EVENT_OK)
0195   //   {
0196   //     ResetEvent();
0197   //     goto readagain;
0198   //   }
0199   //  return 0;
0200 }
0201 
0202 int Fun4AllPrdfInputTriggerManager::fileclose()
0203 {
0204   for (auto iter : m_TriggerInputVector)
0205   {
0206     delete iter;
0207   }
0208   m_TriggerInputVector.clear();
0209   return 0;
0210 }
0211 
0212 void Fun4AllPrdfInputTriggerManager::Print(const std::string &what) const
0213 {
0214   //  Fun4AllInputManager::Print(what);
0215   if (what == "ALL" || what == "DROPPED")
0216   {
0217     std::cout << "-----------------------------" << std::endl;
0218     std::cout << "dropped packets:" << std::endl;
0219     for (auto iter : m_DroppedPacketMap)
0220     {
0221       std::cout << "Packet " << iter.first << " was dropped " << iter.second << " times" << std::endl;
0222     }
0223   }
0224   if (what == "ALL" || what == "INPUTFILES")
0225   {
0226     std::cout << "-----------------------------" << std::endl;
0227     for (const auto &iter : m_Gl1InputVector)
0228     {
0229       std::cout << "Single Prdf Input Manager " << iter->Name() << " reads run "
0230                 << iter->RunNumber()
0231                 << " from file " << iter->FileName()
0232                 << std::endl;
0233     }
0234     for (const auto &iter : m_MbdInputVector)
0235     {
0236       std::cout << "Single Prdf Input Manager " << iter->Name() << " reads run "
0237                 << iter->RunNumber()
0238                 << " from file " << iter->FileName()
0239                 << std::endl;
0240     }
0241     for (const auto &iter : m_ZdcInputVector)
0242     {
0243       std::cout << "Single Prdf Input Manager " << iter->Name() << " reads run "
0244                 << iter->RunNumber()
0245                 << " from file " << iter->FileName()
0246                 << std::endl;
0247     }
0248     for (const auto &iter : m_CemcInputVector)
0249     {
0250       std::cout << "Single Prdf Input Manager " << iter->Name() << " reads run "
0251                 << iter->RunNumber()
0252                 << " from file " << iter->FileName()
0253                 << std::endl;
0254     }
0255     for (const auto &iter : m_HcalInputVector)
0256     {
0257       std::cout << "Single Prdf Input Manager " << iter->Name() << " reads run "
0258                 << iter->RunNumber()
0259                 << " from file " << iter->FileName()
0260                 << std::endl;
0261     }
0262   }
0263   if (what == "CEMCMAP")
0264   {
0265     std::cout << "Printing CEMCMAP" << std::endl;
0266     for (auto iter : m_CemcPacketMap)
0267     {
0268       std::cout << "event " << iter.first << std::endl;
0269       for (auto packet_iter : iter.second.CaloSinglePacketMap)
0270       {
0271         int packet_id = packet_iter.first;
0272         auto bcoiter = iter.second.BcoDiffMap.find(packet_id);
0273         uint64_t bcodiff = 0x0;
0274         if (bcoiter != iter.second.BcoDiffMap.end())
0275         {
0276           bcodiff = bcoiter->second;
0277           std::cout << "Packet " << packet_id << ", bco: 0x" << std::hex << packet_iter.second->getBCO()
0278                     << " bcodiff: 0x" << bcodiff << std::dec << std::endl;
0279         }
0280         else
0281         {
0282           std::cout << "Packet " << packet_id << ", bco: 0x" << std::hex << packet_iter.second->getBCO()
0283                     << " has no bcodiff" << std::dec << std::endl;
0284         }
0285       }
0286     }
0287   }
0288   return;
0289 }
0290 
0291 int Fun4AllPrdfInputTriggerManager::ResetEvent()
0292 {
0293   m_RefEventNo = std::numeric_limits<int>::min();
0294   return 0;
0295 }
0296 
0297 int Fun4AllPrdfInputTriggerManager::PushBackEvents(const int /*i*/)
0298 {
0299   return 0;
0300   // PushBackEvents is supposedly pushing events back on the stack which works
0301   // easily with root trees (just grab a different entry) but hard in these HepMC ASCII files.
0302   // A special case is when the synchronization fails and we need to only push back a single
0303   // event. In this case we save the m_Event pointer as m_SaveEvent which is used in the run method
0304   // instead of getting the next event.
0305   // if (i > 0)
0306   // {
0307   //   if (i == 1 && m_Event)  // check on m_Event pointer makes sure it is not done from the cmd line
0308   //   {
0309   //     m_SaveEvent = m_Event;
0310   //     return 0;
0311   //   }
0312   //   std::cout << PHWHERE << Name()
0313   //        << " Fun4AllPrdfInputTriggerManager cannot push back " << i << " events into file"
0314   //        << std::endl;
0315   //   return -1;
0316   // }
0317   // if (!m_EventIterator)
0318   // {
0319   //   std::cout << PHWHERE << Name()
0320   //        << " no file open" << std::endl;
0321   //   return -1;
0322   // }
0323   // // Skipping events is implemented as
0324   // // pushing a negative number of events on the stack, so in order to implement
0325   // // the skipping of events we read -i events.
0326   // int nevents = -i;  // negative number of events to push back -> skip num events
0327   // int errorflag = 0;
0328   // while (nevents > 0 && !errorflag)
0329   // {
0330   //   m_Event = m_EventIterator->getNextEvent();
0331   //   if (!m_Event)
0332   //   {
0333   //     std::cout << "Error after skipping " << i - nevents
0334   //          << " file exhausted?" << std::endl;
0335   //     errorflag = -1;
0336   //     fileclose();
0337   //   }
0338   //   else
0339   //   {
0340   //     if (Verbosity() > 3)
0341   //     {
0342   //       std::cout << "Skipping evt no: " << m_Event->getEvtSequence() << std::endl;
0343   //     }
0344   //   }
0345   //   delete m_Event;
0346   //   m_Event = nullptr;
0347   //   nevents--;
0348   // }
0349   // return errorflag;
0350 }
0351 
0352 int Fun4AllPrdfInputTriggerManager::GetSyncObject(SyncObject **mastersync)
0353 {
0354   // here we copy the sync object from the current file to the
0355   // location pointed to by mastersync. If mastersync is a 0 pointer
0356   // the syncobject is cloned. If mastersync allready exists the content
0357   // of syncobject is copied
0358   if (!(*mastersync))
0359   {
0360     if (m_SyncObject)
0361     {
0362       *mastersync = dynamic_cast<SyncObject *>(m_SyncObject->CloneMe());
0363       assert(*mastersync);
0364     }
0365   }
0366   else
0367   {
0368     *(*mastersync) = *m_SyncObject;  // copy syncobject content
0369   }
0370   return Fun4AllReturnCodes::SYNC_OK;
0371 }
0372 
0373 int Fun4AllPrdfInputTriggerManager::SyncIt(const SyncObject *mastersync)
0374 {
0375   if (!mastersync)
0376   {
0377     std::cout << PHWHERE << Name() << " No MasterSync object, cannot perform synchronization" << std::endl;
0378     std::cout << "Most likely your first file does not contain a SyncObject and the file" << std::endl;
0379     std::cout << "opened by the Fun4AllDstInputManager with Name " << Name() << " has one" << std::endl;
0380     std::cout << "Change your macro and use the file opened by this input manager as first input" << std::endl;
0381     std::cout << "and you will be okay. Fun4All will not process the current configuration" << std::endl
0382               << std::endl;
0383     return Fun4AllReturnCodes::SYNC_FAIL;
0384   }
0385   int iret = m_SyncObject->Different(mastersync);
0386   if (iret)
0387   {
0388     std::cout << "big problem" << std::endl;
0389     exit(1);
0390   }
0391   return Fun4AllReturnCodes::SYNC_OK;
0392 }
0393 
0394 std::string Fun4AllPrdfInputTriggerManager::GetString(const std::string &what) const
0395 {
0396   std::cout << PHWHERE << " called with " << what << " , returning empty string" << std::endl;
0397   return "";
0398 }
0399 
0400 void Fun4AllPrdfInputTriggerManager::registerTriggerInput(SingleTriggerInput *prdfin, InputManagerType::enu_subsystem system)
0401 {
0402   prdfin->CreateDSTNode(m_topNode);
0403   prdfin->TriggerInputManager(this);
0404   switch (system)
0405   {
0406   case InputManagerType::GL1:
0407     m_gl1_registered_flag = true;
0408     m_Gl1InputVector.push_back(prdfin);
0409     break;
0410   case InputManagerType::LL1:
0411     m_ll1_registered_flag = true;
0412     m_LL1InputVector.push_back(prdfin);
0413     break;
0414   case InputManagerType::MBD:
0415     m_mbd_registered_flag = true;
0416     m_MbdInputVector.push_back(prdfin);
0417     break;
0418   case InputManagerType::HCAL:
0419     m_hcal_registered_flag = true;
0420     m_HcalInputVector.push_back(prdfin);
0421     break;
0422   case InputManagerType::CEMC:
0423     m_cemc_registered_flag = true;
0424     m_CemcInputVector.push_back(prdfin);
0425     break;
0426   case InputManagerType::ZDC:
0427     m_zdc_registered_flag = true;
0428     m_ZdcInputVector.push_back(prdfin);
0429     break;
0430   default:
0431     std::cout << "invalid subsystem flag " << system << std::endl;
0432     gSystem->Exit(1);
0433     exit(1);
0434   }
0435   m_TriggerInputVector.push_back(prdfin);
0436   // this is for convenience - we need to loop over all input managers except for the GL1
0437   if (system != InputManagerType::GL1)
0438   {
0439     m_NoGl1InputVector.push_back(prdfin);
0440   }
0441   if (Verbosity() > 3)
0442   {
0443     std::cout << "registering " << prdfin->Name()
0444               << " number of registered inputs: "
0445               << m_Gl1InputVector.size() + m_MbdInputVector.size()
0446               << std::endl;
0447   }
0448 
0449   return;
0450 }
0451 
0452 void Fun4AllPrdfInputTriggerManager::AddBeamClock(const int evtno, const int bclk, SinglePrdfInput *prdfin)
0453 {
0454   if (Verbosity() > 1)
0455   {
0456     std::cout << "Adding event " << evtno << ", clock 0x" << std::hex << bclk << std::dec
0457               << " snglinput: " << prdfin->Name() << std::endl;
0458   }
0459   m_ClockCounters[evtno].push_back(std::make_pair(bclk, prdfin));
0460 }
0461 
0462 void Fun4AllPrdfInputTriggerManager::UpdateEventFoundCounter(const int /*evtno*/)
0463 {
0464   //  m_PacketMap[evtno].EventFoundCounter++;
0465 }
0466 
0467 void Fun4AllPrdfInputTriggerManager::UpdateDroppedPacket(const int packetid)
0468 {
0469   m_DroppedPacketMap[packetid]++;
0470 }
0471 
0472 void Fun4AllPrdfInputTriggerManager::SetReferenceClock(const int evtno, const int bclk)
0473 {
0474   m_RefClockCounters[evtno] = bclk;
0475 }
0476 
0477 void Fun4AllPrdfInputTriggerManager::DitchEvent(const int eventno)
0478 {
0479   if (Verbosity() > 1)
0480   {
0481     std::cout << "Killing event " << eventno << std::endl;
0482   }
0483   return;
0484   /*
0485     m_ClockCounters.erase(eventno);
0486     m_RefClockCounters.erase(eventno);
0487     auto pktinfoiter = m_PacketMap.find(eventno);
0488     if (pktinfoiter == m_PacketMap.end())
0489     {
0490       return;
0491     }
0492     for (auto const &pktiter : pktinfoiter->second.PacketVector)
0493     {
0494       delete pktiter;
0495     }
0496     m_PacketMap.erase(pktinfoiter);
0497     return;
0498   */
0499 }
0500 
0501 void Fun4AllPrdfInputTriggerManager::ClearAllEvents(const int eventno)
0502 {
0503   for (auto &mapiter : m_Gl1PacketMap)
0504   {
0505     // for (auto &gl1packet : mapiter.second.Gl1SinglePacketMap)
0506     // {
0507     //   delete gl1packet.second;
0508     // }
0509     mapiter.second.Gl1SinglePacketMap.clear();
0510     mapiter.second.BcoDiffMap.clear();
0511   }
0512   m_Gl1PacketMap.clear();
0513 
0514   for (auto &mapiter : m_MbdPacketMap)
0515   {
0516     // for (auto &mbdpacket : mapiter.second.CaloSinglePacketMap)
0517     // {
0518     //   delete mbdpacket.second;
0519     // }
0520     mapiter.second.CaloSinglePacketMap.clear();
0521     mapiter.second.BcoDiffMap.clear();
0522   }
0523   m_MbdPacketMap.clear();
0524 
0525   for (auto &mapiter : m_SEpdPacketMap)
0526   {
0527     // for (auto &sepdpacket : mapiter.second.CaloSinglePacketMap)
0528     // {
0529     //   delete sepdpacket.second;
0530     // }
0531     mapiter.second.CaloSinglePacketMap.clear();
0532     mapiter.second.BcoDiffMap.clear();
0533   }
0534   m_SEpdPacketMap.clear();
0535 
0536   for (auto &mapiter : m_ZdcPacketMap)
0537   {
0538     // for (auto &zdcpacket : mapiter.second.CaloSinglePacketMap)
0539     // {
0540     //   delete zdcpacket.second;
0541     // }
0542     mapiter.second.CaloSinglePacketMap.clear();
0543     mapiter.second.BcoDiffMap.clear();
0544   }
0545   m_ZdcPacketMap.clear();
0546 
0547   m_ClockCounters.clear();
0548   m_RefClockCounters.clear();
0549 
0550   for (auto iter : m_Gl1InputVector)
0551   {
0552     iter->CleanupUsedPackets(eventno);
0553   }
0554   for (auto iter : m_MbdInputVector)
0555   {
0556     iter->CleanupUsedPackets(eventno);
0557   }
0558   for (auto iter : m_HcalInputVector)
0559   {
0560     iter->CleanupUsedPackets(eventno);
0561   }
0562   for (auto iter : m_CemcInputVector)
0563   {
0564     iter->CleanupUsedPackets(eventno);
0565   }
0566   for (auto iter : m_LL1InputVector)
0567   {
0568     iter->CleanupUsedPackets(eventno);
0569   }
0570   for (auto iter : m_ZdcInputVector)
0571   {
0572     iter->CleanupUsedPackets(eventno);
0573   }
0574 }
0575 
0576 int Fun4AllPrdfInputTriggerManager::FillGl1(const unsigned int nEvents)
0577 {
0578   // unsigned int alldone = 0;
0579   for (auto iter : m_Gl1InputVector)
0580   {
0581     if (Verbosity() > 0)
0582     {
0583       std::cout << "Fun4AllTriggerInputManager::FillGl1 - fill pool for " << iter->Name() << std::endl;
0584     }
0585     iter->FillPool(nEvents);
0586     if (m_RunNumber == 0)
0587     {
0588       m_RunNumber = iter->RunNumber();
0589       SetRunNumber(m_RunNumber);
0590     }
0591     else
0592     {
0593       if (m_RunNumber != iter->RunNumber())
0594       {
0595         std::cout << PHWHERE << " Run Number mismatch, run is "
0596                   << m_RunNumber << ", " << iter->Name() << " reads "
0597                   << iter->RunNumber() << std::endl;
0598         std::cout << "You are likely reading files from different runs, do not do that" << std::endl;
0599         Print("INPUTFILES");
0600         gSystem->Exit(1);
0601         exit(1);
0602       }
0603     }
0604   }
0605   if (m_Gl1PacketMap.empty())
0606   {
0607     std::cout << "GL1 event stack is empty, we are done" << std::endl;
0608     return -1;
0609   }
0610   return 0;
0611 }
0612 
0613 int Fun4AllPrdfInputTriggerManager::MoveGl1ToNodeTree()
0614 {
0615   if (Verbosity() > 1)
0616   {
0617     std::cout << "stashed gl1 Events: " << m_Gl1PacketMap.size() << std::endl;
0618   }
0619   Gl1Packet *gl1packet = findNode::getClass<Gl1Packet>(m_topNode, "GL1Packet");
0620   //  std::cout << "before filling m_Gl1PacketMap size: " <<  m_Gl1PacketMap.size() << std::endl;
0621   if (!gl1packet)
0622   {
0623     return 0;
0624   }
0625 
0626   for (auto &gl1hititer : m_Gl1PacketMap.begin()->second.Gl1SinglePacketMap)
0627   {
0628     if (Verbosity() > 1)
0629     {
0630       gl1hititer.second->identify();
0631     }
0632     gl1packet->FillFrom(gl1hititer.second);
0633     // m_RefEventNo = gl1hititer->getEvtSequence();
0634     // gl1packet->setEvtSequence(m_RefEventNo);
0635   }
0636   for (auto iter : m_Gl1InputVector)
0637   {
0638     if (Verbosity() > 1)
0639     {
0640       std::cout << "GL1: cleaning out unused packets for event " << m_Gl1PacketMap.begin()->first << std::endl;
0641     }
0642     iter->CleanupUsedPackets(m_Gl1PacketMap.begin()->first);
0643   }
0644   m_Gl1PacketMap.begin()->second.Gl1SinglePacketMap.clear();
0645   if (Verbosity() > 1)
0646   {
0647     std::cout << "clearing bco diff map from " << std::endl;
0648     for (auto iter : m_Gl1PacketMap.begin()->second.BcoDiffMap)
0649     {
0650       std::cout << "Packet " << iter.first << " bco: 0x" << std::hex << iter.second << std::dec << std::endl;
0651     }
0652   }
0653   m_Gl1PacketMap.begin()->second.BcoDiffMap.clear();
0654   m_Gl1PacketMap.erase(m_Gl1PacketMap.begin());
0655   // std::cout << "size  m_Gl1PacketMap: " <<  m_Gl1PacketMap.size()
0656   //        << std::endl;
0657   return 0;
0658 }
0659 
0660 void Fun4AllPrdfInputTriggerManager::AddGl1Packet(int eventno, Gl1Packet *pkt)
0661 {
0662   if (Verbosity() > 1)
0663   {
0664     std::cout << "Adding gl1 hit to eventno: "
0665               << eventno << std::endl;
0666   }
0667   auto &iter = m_Gl1PacketMap[eventno];
0668   iter.Gl1SinglePacketMap.insert(std::make_pair(pkt->getIdentifier(), pkt));
0669   return;
0670 }
0671 
0672 int Fun4AllPrdfInputTriggerManager::FillMbd(const unsigned int nEvents)
0673 {
0674   // unsigned int alldone = 0;
0675   for (auto iter : m_MbdInputVector)
0676   {
0677     if (Verbosity() > 0)
0678     {
0679       std::cout << "Fun4AllTriggerInputManager::FillMbd - fill pool for " << iter->Name() << std::endl;
0680     }
0681     iter->FillPool(nEvents);
0682     if (m_RunNumber == 0)
0683     {
0684       m_RunNumber = iter->RunNumber();
0685       SetRunNumber(m_RunNumber);
0686     }
0687     else
0688     {
0689       if (m_RunNumber != iter->RunNumber())
0690       {
0691         std::cout << PHWHERE << " Run Number mismatch, run is "
0692                   << m_RunNumber << ", " << iter->Name() << " reads "
0693                   << iter->RunNumber() << std::endl;
0694         std::cout << "You are likely reading files from different runs, do not do that" << std::endl;
0695         Print("INPUTFILES");
0696         gSystem->Exit(1);
0697         exit(1);
0698       }
0699     }
0700   }
0701   if (m_MbdPacketMap.empty())
0702   {
0703     std::cout << "MBD event stack is empty, we are done" << std::endl;
0704     return -1;
0705   }
0706   return 0;
0707 }
0708 
0709 int Fun4AllPrdfInputTriggerManager::MoveMbdToNodeTree()
0710 {
0711   if (Verbosity() > 1)
0712   {
0713     std::cout << "stashed mbd Events: " << m_MbdPacketMap.size() << std::endl;
0714   }
0715   CaloPacketContainer *mbd = findNode::getClass<CaloPacketContainer>(m_topNode, "MBDPackets");
0716   if (!mbd)
0717   {
0718     return 0;
0719   }
0720   //  std::cout << "before filling m_MbdPacketMap size: " <<  m_MbdPacketMap.size() << std::endl;
0721   mbd->setEvtSequence(m_RefEventNo);
0722   for (auto mbdhititer : m_MbdPacketMap.begin()->second.CaloSinglePacketMap)
0723   {
0724     if (m_MbdPacketMap.begin()->first == m_RefEventNo)
0725     {
0726       if (Verbosity() > 1)
0727       {
0728         mbdhititer.second->identify();
0729       }
0730       mbd->AddPacket(mbdhititer.second);
0731     }
0732   }
0733   for (auto iter : m_MbdInputVector)
0734   {
0735     iter->CleanupUsedPackets(m_MbdPacketMap.begin()->first);
0736   }
0737   m_MbdPacketMap.begin()->second.CaloSinglePacketMap.clear();
0738   m_MbdPacketMap.begin()->second.BcoDiffMap.clear();
0739   m_MbdPacketMap.erase(m_MbdPacketMap.begin());
0740   // std::cout << "size  m_MbdPacketMap: " <<  m_MbdPacketMap.size()
0741   //        << std::endl;
0742   return 0;
0743 }
0744 
0745 void Fun4AllPrdfInputTriggerManager::AddMbdPacket(int eventno, CaloPacket *pkt)
0746 {
0747   if (Verbosity() > 1)
0748   {
0749     std::cout << "Adding mbd hit to eventno: "
0750               << eventno << std::endl;
0751   }
0752   m_MbdPacketMap[eventno].CaloSinglePacketMap.insert(std::make_pair(pkt->getIdentifier(), pkt));
0753   return;
0754 }
0755 
0756 int Fun4AllPrdfInputTriggerManager::FillHcal(const unsigned int nEvents)
0757 {
0758   // unsigned int alldone = 0;
0759   for (auto iter : m_HcalInputVector)
0760   {
0761     if (Verbosity() > 0)
0762     {
0763       std::cout << "Fun4AllTriggerInputManager::FillHcal - fill pool for " << iter->Name() << std::endl;
0764     }
0765     iter->FillPool(nEvents);
0766     if (m_RunNumber == 0)
0767     {
0768       m_RunNumber = iter->RunNumber();
0769       SetRunNumber(m_RunNumber);
0770     }
0771     else
0772     {
0773       if (m_RunNumber != iter->RunNumber())
0774       {
0775         std::cout << PHWHERE << " Run Number mismatch, run is "
0776                   << m_RunNumber << ", " << iter->Name() << " reads "
0777                   << iter->RunNumber() << std::endl;
0778         std::cout << "You are likely reading files from different runs, do not do that" << std::endl;
0779         Print("INPUTFILES");
0780         gSystem->Exit(1);
0781         exit(1);
0782       }
0783     }
0784   }
0785   if (m_HcalPacketMap.empty())
0786   {
0787     std::cout << "Hcal event stack is empty, we are done" << std::endl;
0788     return -1;
0789   }
0790   return 0;
0791 }
0792 
0793 int Fun4AllPrdfInputTriggerManager::MoveHcalToNodeTree()
0794 {
0795   if (Verbosity() > 1)
0796   {
0797     std::cout << "stashed hcal Events: " << m_HcalPacketMap.size() << std::endl;
0798   }
0799   CaloPacketContainer *hcal = findNode::getClass<CaloPacketContainer>(m_topNode, "HCALPackets");
0800   if (!hcal)
0801   {
0802     return 0;
0803   }
0804   //  std::cout << "before filling m_HcalPacketMap size: " <<  m_HcalPacketMap.size() << std::endl;
0805   hcal->setEvtSequence(m_RefEventNo);
0806   for (auto hcalhititer : m_HcalPacketMap.begin()->second.CaloSinglePacketMap)
0807   {
0808     if (m_HcalPacketMap.begin()->first == m_RefEventNo)
0809     {
0810       if (Verbosity() > 1)
0811       {
0812         hcalhititer.second->identify();
0813       }
0814       hcal->AddPacket(hcalhititer.second);
0815     }
0816   }
0817   for (auto iter : m_HcalInputVector)
0818   {
0819     iter->CleanupUsedPackets(m_HcalPacketMap.begin()->first);
0820   }
0821   m_HcalPacketMap.begin()->second.CaloSinglePacketMap.clear();
0822   m_HcalPacketMap.begin()->second.BcoDiffMap.clear();
0823   m_HcalPacketMap.erase(m_HcalPacketMap.begin());
0824   // std::cout << "size  m_HcalPacketMap: " <<  m_HcalPacketMap.size()
0825   //        << std::endl;
0826   return 0;
0827 }
0828 
0829 void Fun4AllPrdfInputTriggerManager::AddHcalPacket(int eventno, CaloPacket *pkt)
0830 {
0831   if (pkt == nullptr)
0832   {
0833     std::cout << PHWHERE << " got null ptr to add packet, not doing this" << std::endl;
0834     return;
0835   }
0836   if (Verbosity() > 1)
0837   {
0838     std::cout << "Adding hcal packet " << pkt->getIdentifier() << " from event " << pkt->getEvtSequence() << " to eventno: "
0839               << eventno << std::endl;
0840   }
0841   auto ret = m_HcalPacketMap[eventno].CaloSinglePacketMap.insert(std::make_pair(pkt->getIdentifier(), pkt));
0842   if (ret.second)
0843   {
0844     if (Verbosity() > 1)
0845     {
0846       std::cout << "inserting packet " << pkt->getIdentifier() << " for event " << pkt->getEvtSequence()
0847                 << " was successful" << std::endl;
0848     }
0849   }
0850   else
0851   {
0852     if (Verbosity() > 3)
0853     {
0854       std::cout << "inserting packet " << pkt->getIdentifier() << " for event " << pkt->getEvtSequence()
0855                 << " failed - duplicate?" << std::endl;
0856     }
0857   }
0858   return;
0859 }
0860 
0861 int Fun4AllPrdfInputTriggerManager::FillCemc(const unsigned int nEvents)
0862 {
0863   // unsigned int alldone = 0;
0864   for (auto iter : m_CemcInputVector)
0865   {
0866     if (Verbosity() > 0)
0867     {
0868       std::cout << "Fun4AllTriggerInputManager::FillCemc - fill pool for " << iter->Name() << std::endl;
0869     }
0870     iter->FillPool(nEvents);
0871     if (m_RunNumber == 0)
0872     {
0873       m_RunNumber = iter->RunNumber();
0874       SetRunNumber(m_RunNumber);
0875     }
0876     else
0877     {
0878       if (m_RunNumber != iter->RunNumber())
0879       {
0880         std::cout << PHWHERE << " Run Number mismatch, run is "
0881                   << m_RunNumber << ", " << iter->Name() << " reads "
0882                   << iter->RunNumber() << std::endl;
0883         std::cout << "You are likely reading files from different runs, do not do that" << std::endl;
0884         Print("INPUTFILES");
0885         gSystem->Exit(1);
0886         exit(1);
0887       }
0888     }
0889   }
0890   if (m_CemcPacketMap.empty())
0891   {
0892     std::cout << "Cemc event stack is empty, we are done" << std::endl;
0893     return -1;
0894   }
0895   return 0;
0896 }
0897 
0898 int Fun4AllPrdfInputTriggerManager::MoveCemcToNodeTree()
0899 {
0900   if (Verbosity() > 1)
0901   {
0902     std::cout << "stashed cemc Events: " << m_CemcPacketMap.size() << std::endl;
0903   }
0904   CaloPacketContainer *cemc = findNode::getClass<CaloPacketContainer>(m_topNode, "CEMCPackets");
0905   if (!cemc)
0906   {
0907     return 0;
0908   }
0909   //  std::cout << "before filling m_CemcPacketMap size: " <<  m_CemcPacketMap.size() << std::endl;
0910   cemc->setEvtSequence(m_RefEventNo);
0911   if (Verbosity() > 1)
0912   {
0913     if (m_CemcPacketMap.begin()->second.CaloSinglePacketMap.empty())
0914     {
0915       std::cout << "Event " << m_RefEventNo << " is missing from CEMC" << std::endl;
0916     }
0917   }
0918   for (auto cemchititer : m_CemcPacketMap.begin()->second.CaloSinglePacketMap)
0919   {
0920     if (m_CemcPacketMap.begin()->first == m_RefEventNo)
0921     {
0922       if (Verbosity() > 21)
0923       {
0924         cemchititer.second->identify();
0925       }
0926       cemc->AddPacket(cemchititer.second);
0927     }
0928   }
0929   for (auto iter : m_CemcInputVector)
0930   {
0931     iter->CleanupUsedPackets(m_CemcPacketMap.begin()->first);
0932   }
0933   m_CemcPacketMap.begin()->second.CaloSinglePacketMap.clear();
0934   m_CemcPacketMap.begin()->second.BcoDiffMap.clear();
0935   m_CemcPacketMap.erase(m_CemcPacketMap.begin());
0936   // std::cout << "size  m_CemcPacketMap: " <<  m_CemcPacketMap.size()
0937   //        << std::endl;
0938   return 0;
0939 }
0940 
0941 void Fun4AllPrdfInputTriggerManager::AddCemcPacket(int eventno, CaloPacket *pkt)
0942 {
0943   if (pkt == nullptr)
0944   {
0945     std::cout << PHWHERE << " got null ptr to add packet, not doing this" << std::endl;
0946     return;
0947   }
0948   if (Verbosity() > 1)
0949   {
0950     std::cout << "Adding cemc packet " << pkt->getIdentifier() << " from event " << pkt->getEvtSequence() << " to eventno: "
0951               << eventno << std::endl;
0952   }
0953   auto ret = m_CemcPacketMap[eventno].CaloSinglePacketMap.insert(std::make_pair(pkt->getIdentifier(), pkt));
0954   if (ret.second)
0955   {
0956     if (Verbosity() > 1)
0957     {
0958       std::cout << "inserting packet " << pkt->getIdentifier() << " for event " << pkt->getEvtSequence()
0959                 << " was successful" << std::endl;
0960     }
0961   }
0962   else
0963   {
0964     if (Verbosity() > 3)
0965     {
0966       std::cout << "inserting packet " << pkt->getIdentifier() << " for event " << pkt->getEvtSequence()
0967                 << " failed - duplicate?" << std::endl;
0968     }
0969   }
0970 
0971   //  std::cout << "Cemc packet map size: " << m_CemcPacketMap.size() << std::endl;
0972   return;
0973 }
0974 
0975 int Fun4AllPrdfInputTriggerManager::FillLL1(const unsigned int nEvents)
0976 {
0977   // unsigned int alldone = 0;
0978   for (auto iter : m_LL1InputVector)
0979   {
0980     if (Verbosity() > 0)
0981     {
0982       std::cout << "Fun4AllTriggerInputManager::FillLL1 - fill pool for " << iter->Name() << std::endl;
0983     }
0984     iter->FillPool(nEvents);
0985     if (m_RunNumber == 0)
0986     {
0987       m_RunNumber = iter->RunNumber();
0988       SetRunNumber(m_RunNumber);
0989     }
0990     else
0991     {
0992       if (m_RunNumber != iter->RunNumber())
0993       {
0994         std::cout << PHWHERE << " Run Number mismatch, run is "
0995                   << m_RunNumber << ", " << iter->Name() << " reads "
0996                   << iter->RunNumber() << std::endl;
0997         std::cout << "You are likely reading files from different runs, do not do that" << std::endl;
0998         Print("INPUTFILES");
0999         gSystem->Exit(1);
1000         exit(1);
1001       }
1002     }
1003   }
1004   if (m_LL1PacketMap.empty())
1005   {
1006     std::cout << "LL1 event stack empty, we are done" << std::endl;
1007     return -1;
1008   }
1009   return 0;
1010 }
1011 
1012 int Fun4AllPrdfInputTriggerManager::MoveLL1ToNodeTree()
1013 {
1014   if (Verbosity() > 1)
1015   {
1016     std::cout << "stashed ll1 Events: " << m_LL1PacketMap.size() << std::endl;
1017   }
1018   LL1PacketContainer *ll1 = findNode::getClass<LL1PacketContainer>(m_topNode, "LL1Packets");
1019   if (!ll1)
1020   {
1021     return 0;
1022   }
1023   //  std::cout << "before filling m_LL1PacketMap size: " <<  m_LL1PacketMap.size() << std::endl;
1024   ll1->setEvtSequence(m_RefEventNo);
1025   for (auto ll1hititer : m_LL1PacketMap.begin()->second.LL1SinglePacketMap)
1026   {
1027     if (m_LL1PacketMap.begin()->first == m_RefEventNo)
1028     {
1029       if (Verbosity() > 1)
1030       {
1031         ll1hititer.second->identify();
1032       }
1033       ll1->AddPacket(ll1hititer.second);
1034     }
1035   }
1036   for (auto iter : m_LL1InputVector)
1037   {
1038     iter->CleanupUsedPackets(m_LL1PacketMap.begin()->first);
1039   }
1040   m_LL1PacketMap.begin()->second.LL1SinglePacketMap.clear();
1041   m_LL1PacketMap.begin()->second.BcoDiffMap.clear();
1042   m_LL1PacketMap.erase(m_LL1PacketMap.begin());
1043   // std::cout << "size  m_LL1PacketMap: " <<  m_LL1PacketMap.size()
1044   //        << std::endl;
1045   return 0;
1046 }
1047 
1048 void Fun4AllPrdfInputTriggerManager::AddLL1Packet(int eventno, LL1Packet *pkt)
1049 {
1050   if (Verbosity() > 1)
1051   {
1052     std::cout << "AddLL1Packet: Adding ll1 packet " << pkt->getIdentifier()
1053               << " for event " << pkt->getEvtSequence() << " to eventno: "
1054               << eventno << std::endl;
1055   }
1056   m_LL1PacketMap[eventno].LL1SinglePacketMap.insert(std::make_pair(pkt->getIdentifier(), pkt));
1057   return;
1058 }
1059 
1060 int Fun4AllPrdfInputTriggerManager::FillZdc(const unsigned int nEvents)
1061 {
1062   // unsigned int alldone = 0;
1063   for (auto iter : m_ZdcInputVector)
1064   {
1065     if (Verbosity() > 0)
1066     {
1067       std::cout << "Fun4AllTriggerInputManager::FillZdc - fill pool for " << iter->Name() << std::endl;
1068     }
1069     iter->FillPool(nEvents);
1070     if (m_RunNumber == 0)
1071     {
1072       m_RunNumber = iter->RunNumber();
1073       SetRunNumber(m_RunNumber);
1074     }
1075     else
1076     {
1077       if (m_RunNumber != iter->RunNumber())
1078       {
1079         std::cout << PHWHERE << " Run Number mismatch, run is "
1080                   << m_RunNumber << ", " << iter->Name() << " reads "
1081                   << iter->RunNumber() << std::endl;
1082         std::cout << "You are likely reading files from different runs, do not do that" << std::endl;
1083         Print("INPUTFILES");
1084         gSystem->Exit(1);
1085         exit(1);
1086       }
1087     }
1088   }
1089   if (m_ZdcPacketMap.empty())
1090   {
1091     std::cout << "Zdc/Sepd event stack is empty, we are done" << std::endl;
1092     return -1;
1093   }
1094   return 0;
1095 }
1096 
1097 int Fun4AllPrdfInputTriggerManager::MoveZdcToNodeTree()
1098 {
1099   if (Verbosity() > 1)
1100   {
1101     std::cout << "stashed zdc Events: " << m_ZdcPacketMap.size() << std::endl;
1102   }
1103   CaloPacketContainer *zdc = findNode::getClass<CaloPacketContainer>(m_topNode, "ZDCPackets");
1104   if (!zdc)
1105   {
1106     return 0;
1107   }
1108   //  std::cout << "before filling m_ZdcPacketMap size: " <<  m_ZdcPacketMap.size() << std::endl;
1109   zdc->setEvtSequence(m_RefEventNo);
1110   for (auto zdchititer : m_ZdcPacketMap.begin()->second.CaloSinglePacketMap)
1111   {
1112     if (m_ZdcPacketMap.begin()->first == m_RefEventNo)
1113     {
1114       if (Verbosity() > 2)
1115       {
1116         std::cout << "event at m_ZdcPacketMap.begin(): " << m_ZdcPacketMap.begin()->first << std::endl;
1117         if (Verbosity() > 10)
1118         {
1119           zdchititer.second->identify();
1120         }
1121       }
1122       zdc->AddPacket(zdchititer.second);
1123     }
1124   }
1125   // Since the ZDC and sEPD are in the same file using the same input manager
1126   // clean up zdc and sepd together in MoveSEpdToNodeTree()
1127 
1128   /*
1129     for (auto iter : m_ZdcInputVector)
1130     {
1131       iter->CleanupUsedPackets(m_ZdcPacketMap.begin()->first);
1132     }
1133     m_ZdcPacketMap.begin()->second.ZdcPacketVector.clear();
1134     m_ZdcPacketMap.erase(m_ZdcPacketMap.begin());
1135   */
1136   // std::cout << "size  m_ZdcPacketMap: " <<  m_ZdcPacketMap.size()
1137   //        << std::endl;
1138   return 0;
1139 }
1140 
1141 void Fun4AllPrdfInputTriggerManager::AddZdcPacket(int eventno, CaloPacket *pkt)
1142 {
1143   if (pkt == nullptr)
1144   {
1145     std::cout << PHWHERE << " got null ptr to add packet, not doing this" << std::endl;
1146     return;
1147   }
1148   if (Verbosity() > 1)
1149   {
1150     std::cout << "AddZdcPacket: Adding zdc packet " << pkt->getIdentifier()
1151               << " from event " << pkt->getEvtSequence() << " to eventno: "
1152               << eventno << std::endl;
1153   }
1154   auto ret = m_ZdcPacketMap[eventno].CaloSinglePacketMap.insert(std::make_pair(pkt->getIdentifier(), pkt));
1155   if (ret.second)
1156   {
1157     if (Verbosity() > 1)
1158     {
1159       std::cout << "inserting packet " << pkt->getIdentifier() << " for event " << pkt->getEvtSequence()
1160                 << " was successful" << std::endl;
1161     }
1162   }
1163   else
1164   {
1165     if (Verbosity() > 3)
1166     {
1167       std::cout << "inserting packet " << pkt->getIdentifier() << " for event " << pkt->getEvtSequence()
1168                 << " failed - duplicate?" << std::endl;
1169     }
1170   }
1171   return;
1172 }
1173 
1174 int Fun4AllPrdfInputTriggerManager::MoveSEpdToNodeTree()
1175 {
1176   if (Verbosity() > 1)
1177   {
1178     std::cout << "stashed sepd Events: " << m_SEpdPacketMap.size() << std::endl;
1179   }
1180   CaloPacketContainer *sepd = findNode::getClass<CaloPacketContainer>(m_topNode, "SEPDPackets");
1181   if (!sepd)
1182   {
1183     return 0;
1184   }
1185   // std::cout << "before filling m_SEpdPacketMap size: " <<  m_SEpdPacketMap.size() << std::endl;
1186   sepd->setEvtSequence(m_RefEventNo);
1187   for (auto sepdhititer : m_SEpdPacketMap.begin()->second.CaloSinglePacketMap)
1188   {
1189     if (m_SEpdPacketMap.begin()->first == m_RefEventNo)
1190     {
1191       if (Verbosity() > 2)
1192       {
1193         std::cout << "event at m_SEpdPacketMap.begin(): " << m_SEpdPacketMap.begin()->first << std::endl;
1194         if (Verbosity() > 10)
1195         {
1196           sepdhititer.second->identify();
1197         }
1198       }
1199       sepd->AddPacket(sepdhititer.second);
1200     }
1201   }
1202   // Since the ZDC and sEPD are in the same file using the same input manager
1203   // clean up zdc and sepd here
1204   for (auto iter : m_ZdcInputVector)
1205   {
1206     if (Verbosity() > 1)
1207     {
1208       std::cout << "Cleaning event no from zdc inputmgr " << m_RefEventNo << std::endl;
1209     }
1210     iter->CleanupUsedPackets(m_RefEventNo);
1211   }
1212   if (m_ZdcPacketMap.begin()->first <= m_RefEventNo)
1213   {
1214     if (Verbosity() > 1)
1215     {
1216       std::cout << "Erasing event no " << m_ZdcPacketMap.begin()->first << " from zdc pktmap" << std::endl;
1217     }
1218     m_ZdcPacketMap.begin()->second.CaloSinglePacketMap.clear();
1219     m_ZdcPacketMap.begin()->second.BcoDiffMap.clear();
1220     m_ZdcPacketMap.erase(m_ZdcPacketMap.begin());
1221   }
1222   if (m_SEpdPacketMap.begin()->first <= m_RefEventNo)
1223   {
1224     if (Verbosity() > 1)
1225     {
1226       std::cout << "Erasing event no " << m_SEpdPacketMap.begin()->first << " from sepd pktmap" << std::endl;
1227     }
1228     m_SEpdPacketMap.begin()->second.CaloSinglePacketMap.clear();
1229     m_SEpdPacketMap.begin()->second.BcoDiffMap.clear();
1230     m_SEpdPacketMap.erase(m_SEpdPacketMap.begin());
1231   }
1232   // std::cout << "size  m_SEpdPacketMap: " <<  m_SEpdPacketMap.size()
1233   //        << std::endl;
1234   return 0;
1235 }
1236 
1237 void Fun4AllPrdfInputTriggerManager::AddSEpdPacket(int eventno, CaloPacket *pkt)
1238 {
1239   if (Verbosity() > 1)
1240   {
1241     std::cout << "AddSEpdPacket: Adding sepd packet " << pkt->getIdentifier()
1242               << " for event " << pkt->getEvtSequence() << " to eventno: "
1243               << eventno << std::endl;
1244   }
1245   //  auto &iter = m_SEpdPacketMap[eventno];
1246   auto ret = m_SEpdPacketMap[eventno].CaloSinglePacketMap.insert(std::make_pair(pkt->getIdentifier(), pkt));
1247   if (ret.second)
1248   {
1249     if (Verbosity() > 1)
1250     {
1251       std::cout << "inserting packet " << pkt->getIdentifier() << " for event " << pkt->getEvtSequence()
1252                 << " was successful" << std::endl;
1253     }
1254   }
1255   else
1256   {
1257     if (Verbosity() > 3)
1258     {
1259       std::cout << "inserting packet " << pkt->getIdentifier() << " for event " << pkt->getEvtSequence()
1260                 << " failed - duplicate?" << std::endl;
1261     }
1262   }
1263   return;
1264 }
1265 
1266 void Fun4AllPrdfInputTriggerManager::DetermineReferenceEventNumber()
1267 {
1268   if (!m_Gl1PacketMap.empty())
1269   {
1270     m_RefEventNo = m_Gl1PacketMap.begin()->first;
1271   }
1272   else if (!m_MbdPacketMap.empty())
1273   {
1274     m_RefEventNo = m_MbdPacketMap.begin()->first;
1275   }
1276   else if (!m_LL1PacketMap.empty())
1277   {
1278     m_RefEventNo = m_LL1PacketMap.begin()->first;
1279   }
1280   else if (!m_HcalPacketMap.empty())
1281   {
1282     m_RefEventNo = m_HcalPacketMap.begin()->first;
1283   }
1284   else if (!m_CemcPacketMap.empty())
1285   {
1286     m_RefEventNo = m_CemcPacketMap.begin()->first;
1287   }
1288   else if (!m_ZdcPacketMap.empty())
1289   {
1290     m_RefEventNo = m_ZdcPacketMap.begin()->first;
1291   }
1292   return;
1293 }
1294 
1295 void Fun4AllPrdfInputTriggerManager::ClockDiffFill()
1296 {
1297   // std::vector<uint64_t> BcoDiffRef;
1298   if (!m_Gl1PacketMap.empty())
1299   {
1300     // This is a more sophisticated way to clean the Haystack but it is sensitive to repeated bco's
1301     // Lets go with the simpler one by just refilling the HayStack with the stored bco diffs
1302     // auto gl1hititer = m_Gl1PacketMap.begin();
1303     // if (! gl1hititer->second.BcoDiffMap.empty()) // the very first event does not have a bco diff
1304     // {
1305     //  auto bcoiter = gl1hititer->second.BcoDiffMap.begin();
1306     //  std::cout << PHWHERE << " Haystack cleanup, bco diff for packet "
1307     //        << bcoiter->first << " is 0x" << std::hex << bcoiter->second << std::dec << std::endl;
1308 
1309     //  auto haystackiter = std::find(m_HayStack.begin(),m_HayStack.end(),bcoiter->second);
1310     //  if (haystackiter !=  m_HayStack.end())
1311     //  {
1312     //    std::cout << PHWHERE << "found " <<  std::hex << bcoiter->second << " in haystack" << std::dec << std::endl;
1313     //  }
1314     //  while(*m_HayStack.begin() != bcoiter->second)
1315     //  {
1316 
1317     //    std::cout << "erasing " << std::hex << *m_HayStack.begin() << std::dec << std::endl;
1318     //    m_HayStack.erase(m_HayStack.begin());
1319     //  }
1320     //  std::cout << "begin of haystack " << std::hex << *m_HayStack.begin() << std::dec << std::endl;
1321     //  std::cout << PHWHERE << "after cleaning haystack size " << m_HayStack.size() << std::endl;
1322     //  for (auto iter : m_HayStack)
1323     //  {
1324     //    std::cout << "after cleaning haystack: 0x" << std::hex << iter << std::dec << std::endl;
1325     //  }
1326     // }
1327 
1328     // Just clear and refill the haystack with the stored bc diffs
1329     // we only have one GL1 packet, so we can just take the first packet
1330     m_HayStack.clear();
1331     for (auto &gl1hititer : m_Gl1PacketMap)
1332     {
1333       if (!gl1hititer.second.BcoDiffMap.empty())  // the very first event does not have a bco diff
1334       {
1335         m_HayStack.push_back(gl1hititer.second.BcoDiffMap.begin()->second);
1336       }
1337     }
1338     for (auto gl1hititer = m_Gl1PacketMap.begin(); gl1hititer != m_Gl1PacketMap.end(); ++gl1hititer)
1339     {
1340       //      std::cout << "current gl1 event: " <<  gl1hititer->first << std::endl;
1341       // this is for the very first event, only then BcoDiffMap is empty
1342       // we need an entry in the haystack for every event - otherwise the counting gets really hard
1343       if (gl1hititer->second.BcoDiffMap.empty())
1344       {
1345         for (auto &pktiter : gl1hititer->second.Gl1SinglePacketMap)
1346         {
1347           m_HayStack.push_back(0x0);
1348           gl1hititer->second.BcoDiffMap[pktiter.first] = 0x0;  // this is likely not needed
1349         }
1350       }
1351       auto nextIt = std::next(gl1hititer);
1352       if (nextIt != m_Gl1PacketMap.end())
1353       {
1354         //  std::cout << "size of bcomap: " << nextIt->second.BcoDiffMap.size() << std::endl;
1355         if (!nextIt->second.BcoDiffMap.empty())
1356         {
1357           continue;
1358         }
1359         //  std::cout << "next gl1 event: " <<  nextIt->first << std::endl;
1360         for (auto &pktiter : gl1hititer->second.Gl1SinglePacketMap)
1361         {
1362           uint64_t prev_bco = pktiter.second->getBCO();
1363           int prev_packetid = pktiter.first;
1364           auto currpkt = nextIt->second.Gl1SinglePacketMap.find(prev_packetid);
1365           if (currpkt != nextIt->second.Gl1SinglePacketMap.end())
1366           {
1367             uint64_t curr_bco = currpkt->second->getBCO();
1368             uint64_t diffbco = curr_bco - prev_bco;
1369             nextIt->second.BcoDiffMap[prev_packetid] = diffbco;
1370             if (Verbosity() > 11)
1371             {
1372               std::cout << "packet " << prev_packetid << ", prev_bco 0x: " << std::hex
1373                         << prev_bco << ", curr_bco: 0x" << curr_bco << ", diff: 0x"
1374                         << diffbco << std::dec << std::endl;
1375               std::cout << "Pushing 0x" << std::hex << diffbco << " into haystack" << std::dec << std::endl;
1376             }
1377             m_HayStack.push_back(diffbco);
1378           }
1379         }
1380       }
1381     }
1382   }
1383   if (Verbosity() > 1)
1384   {
1385     std::cout << PHWHERE << "haystack size " << m_HayStack.size() << std::endl;
1386     for (auto iter : m_HayStack)
1387     {
1388       std::cout << "haystack: 0x" << std::hex << iter << std::dec << std::endl;
1389     }
1390   }
1391   if (!m_MbdPacketMap.empty())
1392   {
1393     FillNeedle(m_MbdPacketMap.begin(), m_MbdPacketMap.end(), "mbd");
1394   }
1395   if (!m_LL1PacketMap.empty())
1396   {
1397     FillNeedleLL1(m_LL1PacketMap.begin(), m_LL1PacketMap.end(), "ll1");
1398   }
1399   if (!m_HcalPacketMap.empty())
1400   {
1401     FillNeedle(m_HcalPacketMap.begin(), m_HcalPacketMap.end(), "hcal");
1402   }
1403   if (!m_CemcPacketMap.empty())
1404   {
1405     FillNeedle(m_CemcPacketMap.begin(), m_CemcPacketMap.end(), "cemc");
1406   }
1407   if (!m_ZdcPacketMap.empty())
1408   {
1409     FillNeedle(m_ZdcPacketMap.begin(), m_ZdcPacketMap.end(), "zdc");
1410   }
1411   if (!m_SEpdPacketMap.empty())
1412   {
1413     FillNeedle(m_SEpdPacketMap.begin(), m_SEpdPacketMap.end(), "sepd");
1414   }
1415   return;
1416 }
1417 
1418 int Fun4AllPrdfInputTriggerManager::ClockDiffCheck()
1419 {
1420   std::map<int, int> eventoffset;
1421   static unsigned int count = 0;
1422   count++;
1423   for (auto &iter : m_NeedleMap)
1424   {
1425     std::vector needle = iter.second;
1426     if (count < 2 && m_FEMClockPackets.find(iter.first) != m_FEMClockPackets.end())
1427     {
1428       if (Verbosity() > 1)
1429       {
1430         std::cout << "Packet with FEM clock issue, not doing needle matching for packet " << iter.first << std::endl;
1431       }
1432       continue;
1433     }
1434     if (Verbosity() > 1)
1435     {
1436       std::cout << PHWHERE << "Initial HayStack/Needle: " << iter.first
1437                 << " HayStack size: " << m_HayStack.size() << " Needle size: " << needle.size() << std::endl;
1438       for (auto &hayiter : m_HayStack)
1439       {
1440         std::cout << "haystack: 0x" << std::hex << hayiter << std::dec << std::endl;
1441       }
1442       for (auto &needleiter : needle)
1443       {
1444         std::cout << "needle: 0x" << std::hex << needleiter << std::dec << std::endl;
1445       }
1446     }
1447   match_again:
1448     // If found, std::search returns an iterator to the first element of the subsequence
1449     auto it = std::search(m_HayStack.begin(), m_HayStack.end(), needle.begin(), needle.end());
1450     if (it != m_HayStack.end())  // haystack and needle have same size - we have a match
1451     {
1452       int position = std::distance(m_HayStack.begin(), it);
1453       if (position > 0)
1454       {
1455         if (Verbosity() > 1)
1456         {
1457           std::cout << "need to change evt offset of packet " << iter.first << " by "
1458                     << position << " counts" << std::endl;
1459         }
1460         eventoffset[iter.first] = position;
1461       }
1462       else
1463       {
1464         if (Verbosity() > 1)
1465         {
1466           std::cout << "position: " << position << " All good for packet " << iter.first << " with bcodiff " << std::hex << *needle.begin()
1467                     << " match with " << *m_HayStack.begin() << std::dec << std::endl;
1468         }
1469       }
1470     }
1471     else
1472     {
1473       std::vector needle_copy = needle;
1474       needle.pop_back();
1475       // handle 0x0 in needle for first event (if we have an off by one right out of the gate)
1476       if (*needle.begin() == 0x0)
1477       {
1478         needle.erase(needle.begin());
1479         auto it2 = std::search(m_HayStack.begin(), m_HayStack.end(), needle.begin(), needle.end());
1480         if (it2 != m_HayStack.end())
1481         {
1482           int position = std::distance(m_HayStack.begin(), it2);
1483           if (Verbosity() > 1)
1484           {
1485             std::cout << "Checking for first event, without first element and popped back last one, position: " << position << std::endl;
1486             for (auto &hayiter : m_HayStack)
1487             {
1488               std::cout << "haystack: 0x" << std::hex << hayiter << std::dec << std::endl;
1489             }
1490             for (auto &needleiter : needle)
1491             {
1492               std::cout << "needle_copy: 0x" << std::hex << needleiter << std::dec << std::endl;
1493             }
1494           }
1495           int shiftby = position - 1;
1496           if (shiftby > 0)
1497           {
1498             eventoffset[iter.first] = shiftby;
1499           }
1500         }
1501       }
1502       else
1503       {
1504         if (needle.size() >= 1)
1505         {
1506           //      needle.pop_back(); already popped back
1507           // NOLINTNEXTLINE(hicpp-avoid-goto)
1508           goto match_again;
1509         }
1510         // here we have an event which doesn't match
1511         // first check if the GL1 dropped an event
1512         // The m_Gl1DroppedEvent set is filled by the GL1 input manager which compares the packet id and the event number
1513         if (m_Gl1DroppedEvent.find(m_Gl1PacketMap.begin()->first) != m_Gl1DroppedEvent.end())  // dropped gl1 event
1514         {
1515           std::cout << "We have a dropped GL1 event" << std::endl;
1516           m_Gl1DroppedEvent.erase(m_Gl1PacketMap.begin()->first);
1517           if (!m_MbdPacketMap.empty())
1518           {
1519             DropFirstEvent(m_MbdPacketMap);
1520           }
1521           if (!m_LL1PacketMap.empty())
1522           {
1523             DropFirstEventLL1(m_LL1PacketMap);
1524           }
1525           if (!m_HcalPacketMap.empty())
1526           {
1527             DropFirstEvent(m_HcalPacketMap);
1528           }
1529           if (!m_CemcPacketMap.empty())
1530           {
1531             DropFirstEvent(m_CemcPacketMap);
1532           }
1533           if (!m_ZdcPacketMap.empty())
1534           {
1535             DropFirstEvent(m_ZdcPacketMap);
1536           }
1537           if (!m_SEpdPacketMap.empty())
1538           {
1539             DropFirstEvent(m_SEpdPacketMap);
1540           }
1541           for (auto inputiter : m_NoGl1InputVector)
1542           {
1543             inputiter->AdjustEventOffset(-1);
1544           }
1545           return -1;
1546         }
1547         // what is left is the event after the skip, let's make a crosscheck if the sum of the clockdiff of the previous 2 events does the trick
1548         if (Verbosity() > 1)
1549         {
1550           std::cout << "hay[0]: 0x" << std::hex << m_HayStack[0] << " hay[1]: 0x" << m_HayStack[1] << " sum: 0x" << (m_HayStack[0] + m_HayStack[1]) << std::dec << std::endl;
1551           std::cout << "needle bdiff: 0x" << std::hex << *needle.begin() << std::dec << std::endl;
1552         }
1553         if (*needle.begin() == ((m_HayStack[0] + m_HayStack[1]) & 0xFFFFFFFFU))
1554         {
1555           //      std::cout << "Skipped event" << std::endl;
1556           eventoffset[iter.first] = 1;
1557           if (!m_MbdPacketMap.empty())
1558           {
1559             AdjustBcoDiff(m_MbdPacketMap, iter.first, m_HayStack[1]);
1560           }
1561           if (!m_CemcPacketMap.empty())
1562           {
1563             AdjustBcoDiff(m_CemcPacketMap, iter.first, m_HayStack[1]);
1564           }
1565           if (!m_HcalPacketMap.empty())
1566           {
1567             AdjustBcoDiff(m_HcalPacketMap, iter.first, m_HayStack[1]);
1568           }
1569 
1570           if (!m_ZdcPacketMap.empty())
1571           {
1572             AdjustBcoDiff(m_ZdcPacketMap, iter.first, m_HayStack[1]);
1573           }
1574           if (!m_SEpdPacketMap.empty())
1575           {
1576             AdjustBcoDiff(m_SEpdPacketMap, iter.first, m_HayStack[1]);
1577           }
1578           if (!m_LL1PacketMap.empty())
1579           {
1580             AdjustBcoDiffLL1(m_LL1PacketMap, iter.first, m_HayStack[1]);
1581           }
1582         }
1583       }
1584     }
1585     //      std::cout << "Sequence found at position: " << position << std::endl;
1586     if (Verbosity() > 5)
1587     {
1588       std::cout << PHWHERE << "haystack size after position check " << m_HayStack.size() << std::endl;
1589       for (auto iter_1 : m_HayStack)
1590       {
1591         std::cout << "haystack: 0x" << std::hex << iter_1 << std::dec << std::endl;
1592       }
1593       std::cout << PHWHERE << "needle size of packet " << iter.first << " after position check " << needle.size() << std::endl;
1594       for (auto &needleiter : needle)
1595       {
1596         std::cout << "needle: 0x" << std::hex << needleiter << std::dec << std::endl;
1597       }
1598     }
1599   }
1600 
1601   if (!eventoffset.empty())
1602   {
1603     // just loop over all input managers, if it has this packet it will adjust the event number offset for it
1604     for (auto iter : m_TriggerInputVector)
1605     {
1606       for (auto &offiter : eventoffset)
1607       {
1608         iter->AdjustEventNumberOffset(offiter.first, offiter.second);
1609         iter->AdjustPacketMap(offiter.first, offiter.second);
1610       }
1611     }
1612     if (!m_MbdPacketMap.empty())
1613     {
1614       ShiftEvents(m_MbdPacketMap, eventoffset, "mbd");
1615     }
1616     if (!m_CemcPacketMap.empty())
1617     {
1618       ShiftEvents(m_CemcPacketMap, eventoffset, "cemc");
1619     }
1620     if (!m_HcalPacketMap.empty())
1621     {
1622       ShiftEvents(m_HcalPacketMap, eventoffset, "hcal");
1623     }
1624 
1625     if (!m_ZdcPacketMap.empty())
1626     {
1627       ShiftEvents(m_ZdcPacketMap, eventoffset, "zdc");
1628     }
1629     if (!m_SEpdPacketMap.empty())
1630     {
1631       ShiftEvents(m_SEpdPacketMap, eventoffset, "zdc");
1632     }
1633     if (!m_LL1PacketMap.empty())
1634     {
1635       ShiftEventsLL1(m_LL1PacketMap, eventoffset, "ll1");
1636     }
1637   }
1638   return 0;
1639 }
1640 
1641 int Fun4AllPrdfInputTriggerManager::FillNeedle(std::map<int, CaloPacketInfo>::iterator begin, std::map<int, CaloPacketInfo>::iterator end, const std::string &name)
1642 {
1643   // here we just reset the needle for each packet
1644   // in principle we only have to remove discarded events but that might be error prone
1645   // (e.g. what do you do if you have two subsequent events with the same clkdiff)
1646   // I leave this for later (if at all)
1647   auto calomapbegin = begin;
1648   for (auto &pktiter : calomapbegin->second.CaloSinglePacketMap)
1649   {
1650     //    std::cout << "Clearing Needle for packet " << pktiter.first << std::endl;
1651     m_NeedleMap[pktiter.first].clear();
1652   }
1653   // this handles the first event where we do not have the bco diff to the previous event
1654   // for subsequent calls we take the bco diff for the first event in the needle from
1655   // the cached bco diffs in the bco diffmap
1656   if (calomapbegin->second.BcoDiffMap.empty())  // This is for the first event, init bco diff to 0x0
1657   {
1658     for (auto &pktiter : calomapbegin->second.CaloSinglePacketMap)
1659     {
1660       calomapbegin->second.BcoDiffMap[pktiter.first] = 0x0;
1661       m_NeedleMap[pktiter.first].push_back(0x0);
1662       // std::cout << "Startup: Pushing 0x0 into packet " << pktiter.first
1663       //        << " for event " << sepdhititer->first << std::endl;
1664     }
1665   }
1666   else
1667   {
1668     for (auto &pktiter : calomapbegin->second.CaloSinglePacketMap)
1669     {
1670       m_NeedleMap[pktiter.first].push_back(calomapbegin->second.BcoDiffMap[pktiter.first]);
1671     }
1672   }
1673   //      std::cout << PHWHERE << name <<" event: " <<  sepdhititer->first << std::endl;
1674   for (auto sepdhititer = begin; sepdhititer != end; ++sepdhititer)
1675   {
1676     auto nextIt = std::next(sepdhititer);
1677     if (nextIt != end)
1678     {
1679       // This was supposed to save cpu cycles by skipping bcos which have already been set
1680       // but this needs more thought - if we have event mixing and a resync the BcoDiffMap is partly filled
1681       // and a simple check if it exists (for any packet) results in further event mixing
1682       //       if (!nextIt->second.BcoDiffMap.empty())  // this event was already handled, BcoDiffMap is already filled
1683       //       {
1684       //         auto pktiter = sepdhititer->second.CaloSinglePacketMap.begin();
1685       //    auto checkiter = sepdhititer->second.BcoDiffMap.find(pktiter->first);
1686       //    if (checkiter != sepdhititer->second.BcoDiffMap.end())
1687       //    {
1688       //      continue;
1689       //    }
1690       //    std::cout << "could not find bco diff for packet " << pktiter->first << " in event "
1691       //          <<  calomapbegin->first << std::endl;
1692       //    // for (auto bcoiter : sepdhititer->second.BcoDiffMap)
1693       //    // {
1694       //    //   std::cout << "Skipping 0x" << std::hex << bcoiter.second << " into packet " << std::dec << bcoiter.first
1695       //    //      << " for event " << calomapbegin->first << std::endl;
1696       //    // }
1697 
1698       //       }
1699       std::set<uint64_t> bcodiffs;
1700       for (auto &pktiter : sepdhititer->second.CaloSinglePacketMap)
1701       {
1702         uint64_t prev_bco = pktiter.second->getBCO();
1703         int prev_packetid = pktiter.first;
1704         // std::cout << "event " << sepdhititer->first << " packet id: " << prev_packetid
1705         //        << " prev_bco: 0x" << std::hex << prev_bco << std::dec << std::endl;
1706         auto currpkt = nextIt->second.CaloSinglePacketMap.find(prev_packetid);  //->find(prev_packetid);
1707         if (currpkt != nextIt->second.CaloSinglePacketMap.end())
1708         {
1709           uint64_t curr_bco = currpkt->second->getBCO();
1710           uint64_t diffbco = curr_bco - prev_bco;
1711           nextIt->second.BcoDiffMap[prev_packetid] = diffbco;
1712           if (Verbosity() > 1)
1713           {
1714             std::cout << PHWHERE << name << " packet " << prev_packetid << ", prev_bco 0x: " << std::hex
1715                       << prev_bco << ", curr_bco: 0x" << curr_bco << ", diff: 0x"
1716                       << diffbco << std::dec << std::endl;
1717             std::cout << "Pushing 0x" << std::hex << diffbco << " into needle for packet " << std::dec << prev_packetid << std::endl;
1718           }
1719           m_NeedleMap[prev_packetid].push_back(diffbco);
1720           if (Verbosity() > 1)
1721           {
1722             std::cout << "Eventnumber " << nextIt->first << ", bco: 0x" << std::hex << pktiter.second->getBCO()
1723                       << ", diff: 0x" << diffbco << std::dec << std::endl;
1724           }
1725           bcodiffs.insert(diffbco);
1726         }
1727         else
1728         {
1729           if (Verbosity() > 1)
1730           {
1731             std::cout << PHWHERE << "Could not find packet " << prev_packetid << " in event " << sepdhititer->first
1732                       << std::endl;
1733           }
1734         }
1735       }
1736       if (bcodiffs.size() > 1)
1737       {
1738         if (Verbosity() > 1)
1739         {
1740           std::cout << PHWHERE << " different bco diffs for " << name << " packets for event " << nextIt->first << std::endl;
1741         }
1742       }
1743     }
1744   }
1745   return 0;
1746 }
1747 
1748 int Fun4AllPrdfInputTriggerManager::FillNeedleLL1(std::map<int, LL1PacketInfo>::iterator begin, std::map<int, LL1PacketInfo>::iterator end, const std::string &name)
1749 {
1750   // here we just reset the needle for each packet
1751   // in principle we only have to remove discarded events but that might be error prone
1752   // (e.g. what do you do if you have two subsequent events with the same clkdiff)
1753   // I leave this for later (if at all)
1754   auto ll1packetbegin = begin;
1755   for (auto &pktiter : ll1packetbegin->second.LL1SinglePacketMap)
1756   {
1757     m_NeedleMap[pktiter.first].clear();
1758   }
1759   // here we refill the needle for every packet with the cached BCO differences
1760   for (auto sepdhititer = begin; sepdhititer != end; ++sepdhititer)
1761   {
1762     for (auto bcoiter : sepdhititer->second.BcoDiffMap)
1763     {
1764       m_NeedleMap[bcoiter.first].push_back(bcoiter.second);
1765     }
1766   }
1767   // here we calculate the bco diff to the previous event and update the cached bco difference
1768   // only for events where we haven't done this yet (check of the bco diff map is empty)
1769   for (auto sepdhititer = begin; sepdhititer != end; ++sepdhititer)
1770   {
1771     if (sepdhititer->second.BcoDiffMap.empty())  // This is for the first event, init bco diff to 0x0
1772     {
1773       for (auto &pktiter : sepdhititer->second.LL1SinglePacketMap)
1774       {
1775         sepdhititer->second.BcoDiffMap[pktiter.first] = 0x0;
1776         m_NeedleMap[pktiter.first].push_back(0x0);
1777         // std::cout << "Startup: Pushing 0x0 into packet " << pktiter.first
1778         //      << " for event " << sepdhititer->first << std::endl;
1779       }
1780     }
1781     auto nextIt = std::next(sepdhititer);
1782     if (nextIt != end)
1783     {
1784       // This was supposed to save cpu cycles by skipping bcos which have already been set
1785       // but this needs more thought - if we have event mixing and a resync the BcoDiffMap is partly filled
1786       // and a simple check if it exists (for any packet) results in further event mixing
1787       // if (!nextIt->second.BcoDiffMap.empty())  // this event was already handled, BcoDiffMap is already filled
1788       // {
1789       //   continue;
1790       // }
1791       std::set<uint64_t> bcodiffs;
1792       for (auto &pktiter : sepdhititer->second.LL1SinglePacketMap)
1793       {
1794         uint64_t prev_bco = pktiter.second->getBCO();
1795         int prev_packetid = pktiter.first;
1796         auto currpkt = nextIt->second.LL1SinglePacketMap.find(prev_packetid);  //->find(prev_packetid);
1797         if (currpkt != nextIt->second.LL1SinglePacketMap.end())
1798         {
1799           uint64_t curr_bco = currpkt->second->getBCO();
1800           uint64_t diffbco = curr_bco - prev_bco;
1801           nextIt->second.BcoDiffMap[prev_packetid] = diffbco;
1802           if (Verbosity() > 11)
1803           {
1804             std::cout << PHWHERE << name << " packet " << prev_packetid << ", prev_bco 0x: " << std::hex
1805                       << prev_bco << ", curr_bco: 0x" << curr_bco << ", diff: 0x"
1806                       << diffbco << std::dec << std::endl;
1807             std::cout << "Pushing 0x" << std::hex << diffbco << " into needle for packet " << std::dec << prev_packetid << std::endl;
1808           }
1809           m_NeedleMap[prev_packetid].push_back(diffbco);
1810           bcodiffs.insert(diffbco);
1811         }
1812       }
1813       if (bcodiffs.size() > 1)
1814       {
1815         std::cout << PHWHERE << " different bco diffs for " << name << " packets for event " << nextIt->first << std::endl;
1816       }
1817     }
1818   }
1819   return 0;
1820 }
1821 
1822 int Fun4AllPrdfInputTriggerManager::ShiftEvents(std::map<int, CaloPacketInfo> &PacketInfoMap, std::map<int, int> &eventoffset, const std::string &name)
1823 {
1824   std::vector<int> eventnumbers;
1825   std::set<int> packet_ids;
1826   for (auto pktid : eventoffset)
1827   {
1828     if (Verbosity() > 1)
1829     {
1830       std::cout << PHWHERE << "inserting packet " << pktid.first << " to bad boys" << std::endl;
1831     }
1832     packet_ids.insert(pktid.first);
1833   }
1834   for (auto sepdhititer = PacketInfoMap.rbegin(); sepdhititer != PacketInfoMap.rend(); ++sepdhititer)
1835   {
1836     eventnumbers.push_back(sepdhititer->first);
1837   }
1838   // we loop over the event numbers instead of the map, since inserting/extracting entries updates the iterators
1839   // which just breaks the general idea of looping over them once
1840   for (auto evtnumiter : eventnumbers)
1841   {
1842     auto &sepdhititer = PacketInfoMap[evtnumiter];
1843     for (auto pktiditer : packet_ids)
1844     {
1845       //      std::cout << PHWHERE <<  "handling pkt no: " << pktiditer << std::endl;
1846       auto offsetiter = eventoffset.find(pktiditer);
1847       if (offsetiter != eventoffset.end())
1848       {
1849         int newevent = evtnumiter + offsetiter->second;
1850         if (Verbosity() > 1)
1851         {
1852           std::cout << PHWHERE << name << " moving packet " << pktiditer << " from event " << evtnumiter << " to " << newevent << std::endl;
1853         }
1854         auto nh = sepdhititer.CaloSinglePacketMap.extract(pktiditer);
1855         auto nhbco = sepdhititer.BcoDiffMap.extract(pktiditer);
1856         //    std::cout <<  PHWHERE << "size of CaloSinglePacketMap: " <<  PacketInfoMap.size() << std::endl;
1857         PacketInfoMap[newevent].CaloSinglePacketMap.insert(std::move(nh));
1858         PacketInfoMap[newevent].BcoDiffMap.insert(std::move(nhbco));
1859       }
1860     }
1861   }
1862   if (Verbosity() > 1)
1863   {
1864     for (auto &sepdeventiter : PacketInfoMap)
1865     {
1866       {
1867         std::cout << "size of map for event " << sepdeventiter.first << " is " << sepdeventiter.second.CaloSinglePacketMap.size() << std::endl;
1868       }
1869     }
1870   }
1871   return 0;
1872 }
1873 
1874 int Fun4AllPrdfInputTriggerManager::ShiftEventsLL1(std::map<int, LL1PacketInfo> &PacketInfoMap, std::map<int, int> &eventoffset, const std::string &name)
1875 {
1876   std::vector<int> eventnumbers;
1877   std::set<int> packet_ids;
1878   for (auto pktid : eventoffset)
1879   {
1880     packet_ids.insert(pktid.first);
1881   }
1882   for (auto sepdhititer = PacketInfoMap.rbegin(); sepdhititer != PacketInfoMap.rend(); ++sepdhititer)
1883   {
1884     eventnumbers.push_back(sepdhititer->first);
1885   }
1886   // we loop over the event numbers instead of the map, since inserting/extracting entries updates the iterators
1887   // which just breaks the general idea of looping over them once
1888   for (auto evtnumiter : eventnumbers)
1889   {
1890     auto &sepdhititer = PacketInfoMap[evtnumiter];
1891     //      std::cout << PHWHERE << " Handling event no: " << evtnumiter << " for " << name << std::endl;
1892     for (auto pktiditer : packet_ids)
1893     {
1894       //    std::cout << PHWHERE <<  "handling pkt no: " << pktiditer << std::endl;
1895       auto offsetiter = eventoffset.find(pktiditer);
1896       if (offsetiter != eventoffset.end())
1897       {
1898         int newevent = evtnumiter + offsetiter->second;
1899         if (Verbosity() > 1)
1900         {
1901           std::cout << PHWHERE << name << " moving packet " << pktiditer << " from event " << evtnumiter << " to " << newevent << std::endl;
1902         }
1903         auto nh = sepdhititer.LL1SinglePacketMap.extract(pktiditer);
1904         auto nhbco = sepdhititer.BcoDiffMap.extract(pktiditer);
1905         //    std::cout <<  PHWHERE << "size of LL1SinglePacketMap: " <<  PacketInfoMap.size() << std::endl;
1906         PacketInfoMap[newevent].LL1SinglePacketMap.insert(std::move(nh));
1907         PacketInfoMap[newevent].BcoDiffMap.insert(std::move(nhbco));
1908       }
1909     }
1910   }
1911   if (Verbosity() > 1)
1912   {
1913     for (auto &sepdeventiter : PacketInfoMap)
1914     {
1915       {
1916         std::cout << "size of map for event " << sepdeventiter.first << " is " << sepdeventiter.second.LL1SinglePacketMap.size() << std::endl;
1917       }
1918     }
1919   }
1920   return 0;
1921 }
1922 
1923 int Fun4AllPrdfInputTriggerManager::DropFirstEvent(std::map<int, CaloPacketInfo> &PacketInfoMap)
1924 {
1925   //  Print("CEMCMAP");
1926   PacketInfoMap.erase(PacketInfoMap.begin());
1927   // std::cout << "deleted first event, cemcmap now: " << std::endl;
1928   // Print("CEMCMAP");
1929 
1930   std::vector<int> events;
1931   events.reserve(PacketInfoMap.size());
1932   for (const auto &packetloop : PacketInfoMap)
1933   {
1934     events.push_back(packetloop.first);
1935   }
1936   for (auto evtiter : events)
1937   {
1938     //    std::cout << "moving event " << evtiter << " to " << (evtiter - 1) << std::endl;
1939     auto nh = PacketInfoMap[evtiter];
1940     //    PacketInfoMap.insert(std::make_pair(evtiter-1,std::move(nh)));
1941     PacketInfoMap[evtiter - 1] = std::move(nh);
1942     PacketInfoMap.erase(evtiter);
1943     //    Print("CEMCMAP");
1944   }
1945   // std::cout << "before killing last entry" << std::endl;
1946   // Print("CEMCMAP");
1947   // std::cout << "That is it" << std::endl;
1948   // Print("CEMCMAP");
1949   return 0;
1950 }
1951 
1952 int Fun4AllPrdfInputTriggerManager::DropFirstEventLL1(std::map<int, LL1PacketInfo> &PacketInfoMap)
1953 {
1954   //  Print("CEMCMAP");
1955   PacketInfoMap.erase(PacketInfoMap.begin());
1956   // std::cout << "deleted first event, cemcmap now: " << std::endl;
1957   // Print("CEMCMAP");
1958 
1959   std::vector<int> events;
1960   events.reserve(PacketInfoMap.size());
1961   for (const auto &packetloop : PacketInfoMap)
1962   {
1963     events.push_back(packetloop.first);
1964   }
1965   for (auto evtiter : events)
1966   {
1967     //    std::cout << "moving event " << evtiter << " to " << (evtiter - 1) << std::endl;
1968     auto nh = PacketInfoMap[evtiter];
1969     //    PacketInfoMap.insert(std::make_pair(evtiter-1,std::move(nh)));
1970     PacketInfoMap[evtiter - 1] = std::move(nh);
1971     PacketInfoMap.erase(evtiter);
1972     //    Print("CEMCMAP");
1973   }
1974   // std::cout << "before killing last entry" << std::endl;
1975   // Print("CEMCMAP");
1976   // std::cout << "That is it" << std::endl;
1977   // Print("CEMCMAP");
1978   return 0;
1979 }
1980 
1981 int Fun4AllPrdfInputTriggerManager::AdjustBcoDiff(std::map<int, CaloPacketInfo> &PacketInfoMap, int packetid, uint64_t bcodiff)
1982 {
1983   auto calomapiter = PacketInfoMap.begin();
1984   auto pkt = calomapiter->second.BcoDiffMap.find(packetid);
1985   if (pkt != calomapiter->second.BcoDiffMap.end())
1986   {
1987     if (Verbosity() > 2)
1988     {
1989       std::cout << PHWHERE << " changing BCO for packet " << packetid << " for event " << calomapiter->first
1990                 << " to 0x" << std::hex << bcodiff << std::dec << std::endl;
1991     }
1992     pkt->second = bcodiff;
1993   }
1994   return 0;
1995 }
1996 
1997 int Fun4AllPrdfInputTriggerManager::AdjustBcoDiffLL1(std::map<int, LL1PacketInfo> &PacketInfoMap, int packetid, uint64_t bcodiff)
1998 {
1999   auto calomapiter = PacketInfoMap.begin();
2000   auto pkt = calomapiter->second.BcoDiffMap.find(packetid);
2001   if (pkt != calomapiter->second.BcoDiffMap.end())
2002   {
2003     if (Verbosity() > 2)
2004     {
2005       std::cout << PHWHERE << " changing BCO for packet " << packetid << " for event " << calomapiter->first
2006                 << " to 0x" << std::hex << bcodiff << std::dec << std::endl;
2007     }
2008     pkt->second = bcodiff;
2009   }
2010   return 0;
2011 }