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 )
0063 {
0064 tryagain:
0065 int iret = 0;
0066 if (m_gl1_registered_flag)
0067 {
0068 iret += FillGl1(m_PoolDepth);
0069 }
0070 if (m_mbd_registered_flag)
0071 {
0072 iret += FillMbd(m_PoolDepth);
0073 }
0074 if (m_hcal_registered_flag)
0075 {
0076 iret += FillHcal(m_PoolDepth);
0077 }
0078 if (m_cemc_registered_flag)
0079 {
0080 iret += FillCemc(m_PoolDepth);
0081 }
0082 if (m_zdc_registered_flag)
0083 {
0084 iret += FillZdc(m_PoolDepth);
0085 }
0086 if (m_ll1_registered_flag)
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
0103 ClockDiffFill();
0104 if (ClockDiffCheck())
0105 {
0106
0107
0108 goto tryagain;
0109 }
0110
0111 }
0112 MoveGl1ToNodeTree();
0113 MoveMbdToNodeTree();
0114 MoveCemcToNodeTree();
0115 MoveHcalToNodeTree();
0116 MoveLL1ToNodeTree();
0117
0118
0119
0120 MoveZdcToNodeTree();
0121 MoveSEpdToNodeTree();
0122 MySyncManager()->CurrentEvent(m_RefEventNo);
0123 return 0;
0124
0125
0126
0127
0128
0129
0130
0131
0132
0133
0134
0135
0136
0137
0138
0139
0140
0141
0142
0143
0144
0145
0146
0147
0148
0149
0150
0151
0152
0153
0154
0155
0156
0157
0158
0159
0160
0161
0162
0163
0164
0165
0166
0167
0168
0169
0170
0171
0172
0173
0174
0175
0176
0177
0178
0179
0180
0181
0182
0183
0184
0185
0186
0187
0188
0189
0190
0191
0192
0193
0194
0195
0196
0197
0198
0199
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
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 )
0298 {
0299 return 0;
0300
0301
0302
0303
0304
0305
0306
0307
0308
0309
0310
0311
0312
0313
0314
0315
0316
0317
0318
0319
0320
0321
0322
0323
0324
0325
0326
0327
0328
0329
0330
0331
0332
0333
0334
0335
0336
0337
0338
0339
0340
0341
0342
0343
0344
0345
0346
0347
0348
0349
0350 }
0351
0352 int Fun4AllPrdfInputTriggerManager::GetSyncObject(SyncObject **mastersync)
0353 {
0354
0355
0356
0357
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;
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
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 )
0463 {
0464
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
0486
0487
0488
0489
0490
0491
0492
0493
0494
0495
0496
0497
0498
0499 }
0500
0501 void Fun4AllPrdfInputTriggerManager::ClearAllEvents(const int eventno)
0502 {
0503 for (auto &mapiter : m_Gl1PacketMap)
0504 {
0505
0506
0507
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
0517
0518
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
0528
0529
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
0539
0540
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
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
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
0634
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
0656
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
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
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
0741
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
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
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
0825
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
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
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
0937
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
0972 return;
0973 }
0974
0975 int Fun4AllPrdfInputTriggerManager::FillLL1(const unsigned int nEvents)
0976 {
0977
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
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
1044
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
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
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
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
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
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
1203
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
1233
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
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
1298 if (!m_Gl1PacketMap.empty())
1299 {
1300
1301
1302
1303
1304
1305
1306
1307
1308
1309
1310
1311
1312
1313
1314
1315
1316
1317
1318
1319
1320
1321
1322
1323
1324
1325
1326
1327
1328
1329
1330 m_HayStack.clear();
1331 for (auto &gl1hititer : m_Gl1PacketMap)
1332 {
1333 if (!gl1hititer.second.BcoDiffMap.empty())
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
1341
1342
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;
1349 }
1350 }
1351 auto nextIt = std::next(gl1hititer);
1352 if (nextIt != m_Gl1PacketMap.end())
1353 {
1354
1355 if (!nextIt->second.BcoDiffMap.empty())
1356 {
1357 continue;
1358 }
1359
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
1449 auto it = std::search(m_HayStack.begin(), m_HayStack.end(), needle.begin(), needle.end());
1450 if (it != m_HayStack.end())
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
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
1507
1508 goto match_again;
1509 }
1510
1511
1512
1513 if (m_Gl1DroppedEvent.find(m_Gl1PacketMap.begin()->first) != m_Gl1DroppedEvent.end())
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
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
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
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
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
1644
1645
1646
1647 auto calomapbegin = begin;
1648 for (auto &pktiter : calomapbegin->second.CaloSinglePacketMap)
1649 {
1650
1651 m_NeedleMap[pktiter.first].clear();
1652 }
1653
1654
1655
1656 if (calomapbegin->second.BcoDiffMap.empty())
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
1663
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
1674 for (auto sepdhititer = begin; sepdhititer != end; ++sepdhititer)
1675 {
1676 auto nextIt = std::next(sepdhititer);
1677 if (nextIt != end)
1678 {
1679
1680
1681
1682
1683
1684
1685
1686
1687
1688
1689
1690
1691
1692
1693
1694
1695
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
1705
1706 auto currpkt = nextIt->second.CaloSinglePacketMap.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
1751
1752
1753
1754 auto ll1packetbegin = begin;
1755 for (auto &pktiter : ll1packetbegin->second.LL1SinglePacketMap)
1756 {
1757 m_NeedleMap[pktiter.first].clear();
1758 }
1759
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
1768
1769 for (auto sepdhititer = begin; sepdhititer != end; ++sepdhititer)
1770 {
1771 if (sepdhititer->second.BcoDiffMap.empty())
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
1778
1779 }
1780 }
1781 auto nextIt = std::next(sepdhititer);
1782 if (nextIt != end)
1783 {
1784
1785
1786
1787
1788
1789
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);
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
1839
1840 for (auto evtnumiter : eventnumbers)
1841 {
1842 auto &sepdhititer = PacketInfoMap[evtnumiter];
1843 for (auto pktiditer : packet_ids)
1844 {
1845
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
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
1887
1888 for (auto evtnumiter : eventnumbers)
1889 {
1890 auto &sepdhititer = PacketInfoMap[evtnumiter];
1891
1892 for (auto pktiditer : packet_ids)
1893 {
1894
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
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
1926 PacketInfoMap.erase(PacketInfoMap.begin());
1927
1928
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
1939 auto nh = PacketInfoMap[evtiter];
1940
1941 PacketInfoMap[evtiter - 1] = std::move(nh);
1942 PacketInfoMap.erase(evtiter);
1943
1944 }
1945
1946
1947
1948
1949 return 0;
1950 }
1951
1952 int Fun4AllPrdfInputTriggerManager::DropFirstEventLL1(std::map<int, LL1PacketInfo> &PacketInfoMap)
1953 {
1954
1955 PacketInfoMap.erase(PacketInfoMap.begin());
1956
1957
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
1968 auto nh = PacketInfoMap[evtiter];
1969
1970 PacketInfoMap[evtiter - 1] = std::move(nh);
1971 PacketInfoMap.erase(evtiter);
1972
1973 }
1974
1975
1976
1977
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 }