File indexing completed on 2025-08-06 08:18:37
0001 #include "LL1PacketGetter.h"
0002 #include "LL1Outv1.h"
0003 #include "TriggerPrimitiveContainerv1.h"
0004 #include "TriggerPrimitivev1.h"
0005
0006 #include <fun4all/Fun4AllReturnCodes.h>
0007 #include <fun4all/SubsysReco.h> // for SubsysReco
0008
0009 #include <phool/PHCompositeNode.h>
0010 #include <phool/PHIODataNode.h> // for PHIODataNode
0011 #include <phool/PHNode.h> // for PHNode
0012 #include <phool/PHNodeIterator.h> // for PHNodeIterator
0013 #include <phool/PHObject.h> // for PHObject
0014 #include <phool/getClass.h>
0015
0016 #include <Event/Event.h>
0017 #include <Event/packet.h>
0018
0019 #include <cstdlib>
0020 #include <iostream> // for operator<<, endl, basic...
0021 #include <vector> // for vector
0022
0023
0024 LL1PacketGetter::LL1PacketGetter(const std::string &name, const std::string &trigger, const std::string &ll1)
0025 : SubsysReco(name)
0026 , m_trigger(trigger)
0027 , m_ll1(ll1)
0028 , m_nchannels(60)
0029 {
0030 m_packet_map[TriggerDefs::getTriggerKey(TriggerDefs::TriggerId::noneTId, TriggerDefs::DetectorId::noneDId)] = std::make_pair(0, 0);
0031 m_packet_map[TriggerDefs::getTriggerKey(TriggerDefs::TriggerId::jetTId, TriggerDefs::DetectorId::noneDId)] = std::make_pair(13002, 13002);
0032 m_packet_map[TriggerDefs::getTriggerKey(TriggerDefs::TriggerId::jetTId, TriggerDefs::DetectorId::hcalDId)] = std::make_pair(13002, 13002);
0033 m_packet_map[TriggerDefs::getTriggerKey(TriggerDefs::TriggerId::jetTId, TriggerDefs::DetectorId::hcalinDId)] = std::make_pair(13002, 13002);
0034 m_packet_map[TriggerDefs::getTriggerKey(TriggerDefs::TriggerId::jetTId, TriggerDefs::DetectorId::hcaloutDId)] = std::make_pair(13002, 13002);
0035 m_packet_map[TriggerDefs::getTriggerKey(TriggerDefs::TriggerId::jetTId, TriggerDefs::DetectorId::emcalDId)] = std::make_pair(13002, 13002);
0036 m_packet_map[TriggerDefs::getTriggerKey(TriggerDefs::TriggerId::photonTId, TriggerDefs::DetectorId::noneDId)] = std::make_pair(13002, 13002);
0037 m_packet_map[TriggerDefs::getTriggerKey(TriggerDefs::TriggerId::photonTId, TriggerDefs::DetectorId::emcalDId)] = std::make_pair(13002, 13002);
0038 m_packet_map[TriggerDefs::getTriggerKey(TriggerDefs::TriggerId::photonTId, TriggerDefs::DetectorId::hcalDId)] = std::make_pair(13002, 13002);
0039 m_packet_map[TriggerDefs::getTriggerKey(TriggerDefs::TriggerId::photonTId, TriggerDefs::DetectorId::hcalinDId)] = std::make_pair(13002, 13002);
0040 m_packet_map[TriggerDefs::getTriggerKey(TriggerDefs::TriggerId::photonTId, TriggerDefs::DetectorId::hcaloutDId)] = std::make_pair(13002, 13002);
0041 m_packet_map[TriggerDefs::getTriggerKey(TriggerDefs::TriggerId::noneTId, TriggerDefs::DetectorId::emcalDId)] = std::make_pair(13010, 13025);
0042 m_packet_map[TriggerDefs::getTriggerKey(TriggerDefs::TriggerId::mbdTId, TriggerDefs::DetectorId::mbdDId)] = std::make_pair(13002, 13002);
0043
0044 m_prim_sum_map[TriggerDefs::getTriggerKey(TriggerDefs::TriggerId::noneTId, TriggerDefs::DetectorId::noneDId)] = std::make_pair(0, 0);
0045 m_prim_sum_map[TriggerDefs::getTriggerKey(TriggerDefs::TriggerId::jetTId, TriggerDefs::DetectorId::noneDId)] = std::make_pair(16, 24);
0046 m_prim_sum_map[TriggerDefs::getTriggerKey(TriggerDefs::TriggerId::jetTId, TriggerDefs::DetectorId::hcalDId)] = std::make_pair(16, 24);
0047 m_prim_sum_map[TriggerDefs::getTriggerKey(TriggerDefs::TriggerId::jetTId, TriggerDefs::DetectorId::hcalinDId)] = std::make_pair(16, 24);
0048 m_prim_sum_map[TriggerDefs::getTriggerKey(TriggerDefs::TriggerId::jetTId, TriggerDefs::DetectorId::hcaloutDId)] = std::make_pair(16, 24);
0049 m_prim_sum_map[TriggerDefs::getTriggerKey(TriggerDefs::TriggerId::jetTId, TriggerDefs::DetectorId::emcalDId)] = std::make_pair(16, 24);
0050 m_prim_sum_map[TriggerDefs::getTriggerKey(TriggerDefs::TriggerId::photonTId, TriggerDefs::DetectorId::noneDId)] = std::make_pair(16, 24);
0051 m_prim_sum_map[TriggerDefs::getTriggerKey(TriggerDefs::TriggerId::photonTId, TriggerDefs::DetectorId::emcalDId)] = std::make_pair(16, 24);
0052 m_prim_sum_map[TriggerDefs::getTriggerKey(TriggerDefs::TriggerId::photonTId, TriggerDefs::DetectorId::hcalDId)] = std::make_pair(16, 24);
0053 m_prim_sum_map[TriggerDefs::getTriggerKey(TriggerDefs::TriggerId::photonTId, TriggerDefs::DetectorId::hcalinDId)] = std::make_pair(16, 24);
0054 m_prim_sum_map[TriggerDefs::getTriggerKey(TriggerDefs::TriggerId::photonTId, TriggerDefs::DetectorId::hcaloutDId)] = std::make_pair(16, 24);
0055 m_prim_sum_map[TriggerDefs::getTriggerKey(TriggerDefs::TriggerId::noneTId, TriggerDefs::DetectorId::emcalDId)] = std::make_pair(24, 16);
0056 m_prim_sum_map[TriggerDefs::getTriggerKey(TriggerDefs::TriggerId::mbdTId, TriggerDefs::DetectorId::mbdDId)] = std::make_pair(4, 13);
0057
0058 m_word_map[TriggerDefs::TriggerId::noneTId] = 0;
0059 m_word_map[TriggerDefs::TriggerId::jetTId] = 12 * 32;
0060 m_word_map[TriggerDefs::TriggerId::mbdTId] = 8;
0061 m_word_map[TriggerDefs::TriggerId::pairTId] = 0;
0062 m_word_map[TriggerDefs::TriggerId::photonTId] = 12 * 32;
0063 }
0064
0065
0066 int LL1PacketGetter::InitRun(PHCompositeNode *topNode)
0067 {
0068 m_triggerid = TriggerDefs::GetTriggerId(m_trigger);
0069 m_detectorid = TriggerDefs::GetDetectorId(m_ll1);
0070 m_triggerkey = TriggerDefs::getTriggerKey(m_triggerid, m_detectorid);
0071 m_primitiveid = TriggerDefs::GetPrimitiveId(m_ll1);
0072
0073 if (m_trigger == "NONE")
0074 {
0075 m_triggerprimitive_nodename = "TRIGGERPRIMITIVES_RAW_" + m_ll1;
0076 m_triggerprimitive_ll1_nodename = "TRIGGERPRIMITIVES_RAW_" + m_ll1 + "_LL1";
0077 m_no_ll1out = true;
0078 }
0079 else
0080 {
0081 m_ll1_nodename = "LL1OUT_RAW_" + m_trigger;
0082 m_triggerprimitive_nodename = "TRIGGERPRIMITIVES_RAW_" + m_trigger;
0083 }
0084
0085 m_packet_low = m_packet_map[m_triggerkey].first;
0086 m_packet_high = m_packet_map[m_triggerkey].second;
0087 m_nprimitives = m_prim_sum_map[m_triggerkey].first;
0088 m_nchannels_per_primitive = m_prim_sum_map[m_triggerkey].second;
0089 m_ntriggerwords = m_word_map[m_triggerid];
0090
0091 m_nchannels = m_nchannels_per_primitive * m_nprimitives + m_ntriggerwords;
0092
0093 if (CreateNodeTree(topNode))
0094 {
0095 return Fun4AllReturnCodes::ABORTRUN;
0096 }
0097
0098 topNode->print();
0099 return Fun4AllReturnCodes::EVENT_OK;
0100 }
0101
0102
0103 int LL1PacketGetter::process_event(PHCompositeNode *topNode)
0104 {
0105 m_trigger_primitives = findNode::getClass<TriggerPrimitiveContainer>(topNode, m_triggerprimitive_nodename);
0106 if (!m_trigger_primitives)
0107 {
0108 std::cout << m_triggerprimitive_nodename << " not found - Fatal Error" << std::endl;
0109 exit(1);
0110 }
0111 if (!m_no_ll1out)
0112 {
0113 m_ll1out = findNode::getClass<LL1Out>(topNode, m_ll1_nodename);
0114 if (!m_ll1out)
0115 {
0116 std::cout << m_ll1_nodename << " not found - Fatal Error" << std::endl;
0117 exit(1);
0118 }
0119 }
0120 else
0121 {
0122 m_trigger_primitives_ll1 = findNode::getClass<TriggerPrimitiveContainer>(topNode, m_triggerprimitive_ll1_nodename);
0123 if (!m_trigger_primitives_ll1)
0124 {
0125 std::cout << m_triggerprimitive_ll1_nodename << " not found - Fatal Error" << std::endl;
0126 exit(1);
0127 }
0128 }
0129 TriggerDefs::TriggerSumKey sumkey = 0;
0130 TriggerDefs::TriggerPrimKey primkey;
0131
0132 if (m_isdata)
0133 {
0134 Event *_event = findNode::getClass<Event>(topNode, "PRDF");
0135 if (_event == nullptr)
0136 {
0137 std::cout << "LL1UnpackPRDF::Process_Event - Event not found" << std::endl;
0138 return -1;
0139 }
0140 if (_event->getEvtType() >= 8)
0141 {
0142 return Fun4AllReturnCodes::DISCARDEVENT;
0143 }
0144 unsigned int clk;
0145 unsigned int evt;
0146 int nsamples;
0147
0148 for (int pid = m_packet_low; pid <= m_packet_high; pid++)
0149 {
0150 Packet *packet = _event->getPacket(pid);
0151
0152 if (packet)
0153 {
0154 evt = packet->iValue(0, "EVTNR");
0155 clk = packet->iValue(0, "CLOCK");
0156 nsamples = packet->iValue(0, "SAMPLES");
0157
0158
0159 if (!m_no_ll1out)
0160 {
0161 m_ll1out->set_event_number(evt);
0162 m_ll1out->set_clock_number(clk);
0163 }
0164
0165 int nchannels = packet->iValue(0, "CHANNELS");
0166 int ntriggerwords = packet->iValue(0, "TRIGGERWORDS");
0167
0168 if (nchannels > m_nchannels)
0169 {
0170 return Fun4AllReturnCodes::DISCARDEVENT;
0171 }
0172
0173 TriggerDefs::PrimitiveId primid = TriggerDefs::GetPrimitiveId(m_trigger);
0174 if (primid == TriggerDefs::PrimitiveId::nonePId)
0175 {
0176 primid = TriggerDefs::GetPrimitiveId(m_ll1);
0177 }
0178
0179 for (int iprim = 0; iprim < m_nprimitives; iprim++)
0180 {
0181 primkey = TriggerDefs::getTriggerPrimKey(TriggerDefs::GetTriggerId(m_trigger), TriggerDefs::GetDetectorId(m_ll1), primid, (m_nprimitives * (pid - m_packet_low)) + iprim);
0182
0183 _trigger_primitive = m_trigger_primitives->get_primitive_at_key(primkey);
0184
0185 for (int channel = 0; channel < m_nchannels_per_primitive; channel++)
0186 {
0187 sumkey = TriggerDefs::getTriggerSumKey(TriggerDefs::GetTriggerId(m_trigger), TriggerDefs::GetDetectorId(m_ll1), primid, (m_nprimitives * (pid - m_packet_low)) + iprim, channel);
0188
0189 _sum = _trigger_primitive->get_sum_at_key(sumkey);
0190 for (int samp = 0; samp < nsamples; samp++)
0191 {
0192 if (pid == 13002)
0193 {
0194 _sum->push_back(static_cast<unsigned int>(packet->iValue(samp, (iprim * 2) + (channel / 12) + (32 * (channel % 12)))));
0195 }
0196 else
0197 {
0198 _sum->push_back(static_cast<unsigned int>(packet->iValue(samp, (iprim * m_nchannels_per_primitive) + channel)));
0199 }
0200 }
0201 }
0202 }
0203
0204 if (!m_no_ll1out)
0205 {
0206 for (int channel = 0; channel < ntriggerwords; channel++)
0207 {
0208 std::vector<unsigned int> *sum = m_ll1out->get_word(((unsigned int) (channel % 32) & 0xffffU) + (((unsigned int) (channel / 32) & 0xffffU) << 16U));
0209
0210 for (int samp = 0; samp < nsamples; samp++)
0211 {
0212 sum->push_back(static_cast<unsigned int>(packet->iValue(samp, (m_nprimitives * m_nchannels_per_primitive) + channel)));
0213 }
0214 }
0215 }
0216 else
0217 {
0218 TriggerDefs::TriggerId tid = TriggerDefs::TriggerId::jetTId;
0219 TriggerDefs::PrimitiveId prid = TriggerDefs::PrimitiveId::jetPId;
0220 TriggerDefs::DetectorId did = TriggerDefs::DetectorId::emcalDId;
0221
0222 primkey = TriggerDefs::getTriggerPrimKey(tid, did, prid, pid - m_packet_low);
0223
0224 _trigger_primitive = new TriggerPrimitivev1(primkey);
0225
0226 for (int channel = 0; channel < 24; channel++)
0227 {
0228 sumkey = TriggerDefs::getTriggerSumKey(tid, did, prid, pid - m_packet_low, channel);
0229 _sum = new std::vector<unsigned int>();
0230 _sum->reserve(nsamples);
0231
0232 for (int samp = 0; samp < nsamples; samp++)
0233 {
0234 _sum->push_back(static_cast<unsigned int>(packet->iValue(samp, (m_nprimitives * m_nchannels_per_primitive) + channel)));
0235 }
0236 _trigger_primitive->add_sum(sumkey, _sum);
0237 }
0238 m_trigger_primitives_ll1->add_primitive(primkey, _trigger_primitive);
0239 }
0240
0241 delete packet;
0242 }
0243
0244
0245
0246
0247
0248
0249
0250
0251
0252
0253
0254
0255
0256
0257
0258
0259
0260
0261
0262
0263
0264
0265
0266
0267
0268
0269
0270
0271
0272
0273
0274
0275
0276
0277
0278
0279
0280
0281
0282
0283
0284
0285
0286
0287 }
0288 }
0289
0290 if (Verbosity())
0291 {
0292 if (m_no_ll1out)
0293 {
0294 std::cout << " PRIMITIVES LL1: " << std::endl;
0295 m_trigger_primitives_ll1->identify();
0296 }
0297 else
0298 {
0299 std::cout << " LL1 OUT: " << std::endl;
0300 m_ll1out->identify();
0301 }
0302 }
0303 if (Verbosity())
0304 {
0305 std::cout << "PRIMITIVES: " << std::endl;
0306 m_trigger_primitives->identify();
0307 }
0308
0309 return Fun4AllReturnCodes::EVENT_OK;
0310 }
0311
0312 int LL1PacketGetter::CreateNodeTree(PHCompositeNode *topNode)
0313 {
0314 PHNodeIterator nodeItr(topNode);
0315
0316 PHCompositeNode *dst_node = dynamic_cast<PHCompositeNode *>(
0317 nodeItr.findFirst("PHCompositeNode", "DST"));
0318 if (!dst_node)
0319 {
0320 std::cout << "PHComposite node created: DST" << std::endl;
0321 dst_node = new PHCompositeNode("DST");
0322 topNode->addNode(dst_node);
0323 }
0324
0325 PHNodeIterator dstIter(dst_node);
0326
0327 PHCompositeNode *ll1Node = dynamic_cast<PHCompositeNode *>(dstIter.findFirst("PHCompositeNode", "LL1"));
0328
0329 if (!ll1Node)
0330 {
0331 ll1Node = new PHCompositeNode("LL1");
0332 dst_node->addNode(ll1Node);
0333 }
0334
0335 if (!m_no_ll1out)
0336 {
0337 LL1Out *ll1out = findNode::getClass<LL1Out>(ll1Node, m_ll1_nodename);
0338 if (!ll1out)
0339 {
0340 ll1out = new LL1Outv1(m_trigger, m_ll1);
0341 PHIODataNode<PHObject> *LL1OutNode = new PHIODataNode<PHObject>(ll1out, m_ll1_nodename, "PHObject");
0342 ll1Node->addNode(LL1OutNode);
0343 }
0344 }
0345 else
0346 {
0347 TriggerPrimitiveContainer *primoutll1 = findNode::getClass<TriggerPrimitiveContainer>(ll1Node, m_triggerprimitive_ll1_nodename);
0348 if (!primoutll1)
0349 {
0350 primoutll1 = new TriggerPrimitiveContainerv1(m_triggerid, m_detectorid);
0351 PHIODataNode<PHObject> *LL1OutNode = new PHIODataNode<PHObject>(primoutll1, m_triggerprimitive_ll1_nodename, "PHObject");
0352 ll1Node->addNode(LL1OutNode);
0353 }
0354 }
0355 TriggerPrimitiveContainer *primout = findNode::getClass<TriggerPrimitiveContainer>(ll1Node, m_triggerprimitive_nodename);
0356 if (!primout)
0357 {
0358 primout = new TriggerPrimitiveContainerv1(m_triggerid, TriggerDefs::DetectorId::noneDId);
0359 PHIODataNode<PHObject> *LL1OutNode = new PHIODataNode<PHObject>(primout, m_triggerprimitive_nodename, "PHObject");
0360 ll1Node->addNode(LL1OutNode);
0361 }
0362
0363 return Fun4AllReturnCodes::EVENT_OK;
0364 }