File indexing completed on 2025-08-05 08:16:12
0001 #include "Fun4AllEventOutStream.h"
0002
0003 #include <fun4all/Fun4AllBase.h> // for Fun4AllBase
0004
0005 #include <phool/phool.h>
0006
0007 #include <Event/A_Event.h>
0008 #include <Event/Event.h>
0009 #include <Event/oEvent.h>
0010 #include <Event/packet.h>
0011 #include <Event/phenixTypes.h> // for PHDWORD
0012
0013 #include <algorithm> // for copy, copy_backward, max
0014 #include <cstdlib> // for exit
0015 #include <exception> // for exception
0016 #include <iostream> // for operator<<, basic_ost...
0017 #include <queue>
0018 #include <utility> // for swap, pair
0019
0020 Fun4AllEventOutStream::Fun4AllEventOutStream(const std::string &name)
0021 : Fun4AllBase(name)
0022 {
0023 }
0024
0025 Fun4AllEventOutStream::~Fun4AllEventOutStream()
0026 {
0027 delete[] evtbuf;
0028 delete[] plist;
0029 return;
0030 }
0031
0032 int Fun4AllEventOutStream::resize_evtbuf(const unsigned int newsize)
0033 {
0034 delete[] evtbuf;
0035 evtbuf_size = newsize;
0036 evtbuf = new PHDWORD[evtbuf_size];
0037 for (unsigned int i = 0; i < evtbuf_size; i++)
0038 {
0039 evtbuf[i] = 0;
0040 }
0041 return 0;
0042 }
0043
0044 int Fun4AllEventOutStream::WriteEvent(Event *evt)
0045 {
0046 int iret;
0047 if (!add_or_remove)
0048 {
0049 iret = WriteEventOut(evt);
0050 return iret;
0051 }
0052 std::queue<int> savepacket;
0053 unsigned int size = 0;
0054 if (!plist)
0055 {
0056 plist = new Packet *[max_npackets];
0057 }
0058 while ((npackets = evt->getPacketList(plist, max_npackets)) >= max_npackets)
0059 {
0060 for (int i = 0; i < npackets; i++)
0061 {
0062 delete plist[i];
0063 }
0064 delete[] plist;
0065
0066 max_npackets *= 2;
0067 plist = new Packet *[max_npackets];
0068 }
0069 std::map<int, boost::numeric::interval<int> >::const_iterator dropiter;
0070 int dropIt;
0071 for (int i = 0; i < npackets; i++)
0072 {
0073 int packetid = plist[i]->getIdentifier();
0074 if (default_addall)
0075 {
0076 dropIt = 0;
0077 for (dropiter = droppktrange.begin(); dropiter != droppktrange.end(); ++dropiter)
0078 {
0079 if (packetid < dropiter->first)
0080 {
0081
0082 break;
0083 }
0084 if (boost::numeric::in(packetid, dropiter->second))
0085 {
0086 dropIt = 1;
0087 break;
0088 }
0089 }
0090 }
0091 else
0092 {
0093 dropIt = 1;
0094 }
0095 for (dropiter = addpktrange.begin(); dropiter != addpktrange.end(); ++dropiter)
0096 {
0097 if (packetid < dropiter->first)
0098 {
0099
0100 break;
0101 }
0102 if (boost::numeric::in(packetid, dropiter->second))
0103 {
0104 dropIt = 0;
0105 break;
0106 }
0107 }
0108 if (!dropIt)
0109 {
0110 savepacket.push(i);
0111 size += plist[i]->getLength() + 4;
0112 }
0113 else
0114 {
0115 if (Verbosity() > 0)
0116 {
0117 std::cout << "Fun4AllEventOutStream: dropping packet " << i
0118 << " in list with id " << plist[i]->getIdentifier() << std::endl;
0119 }
0120 }
0121 }
0122 size += 100;
0123 if (size > evtbuf_size)
0124 {
0125
0126 resize_evtbuf(size + 10000);
0127 }
0128
0129 oEvent new_event(evtbuf, size, evt->getRunNumber(), evt->getEvtType(), evt->getEvtSequence());
0130 while (!savepacket.empty())
0131 {
0132 int index = savepacket.front();
0133 new_event.addPacket(plist[index]);
0134 savepacket.pop();
0135 }
0136
0137 Event *newE = new A_Event(evtbuf);
0138 iret = WriteEventOut(newE);
0139 delete newE;
0140 for (int i = 0; i < npackets; i++)
0141 {
0142 delete plist[i];
0143 }
0144 return iret;
0145 }
0146
0147 int Fun4AllEventOutStream::AddPacket(const int ipkt)
0148 {
0149 AddPacketRange(ipkt, ipkt);
0150 return 0;
0151 }
0152
0153 int Fun4AllEventOutStream::DropPacket(const int ipkt)
0154 {
0155 DropPacketRange(ipkt, ipkt);
0156 return 0;
0157 }
0158
0159 int Fun4AllEventOutStream::AddPacketRange(const int minpacket, const int maxpacket)
0160 {
0161 add_or_remove = 1;
0162 boost::numeric::interval<int> newinterval;
0163 try
0164 {
0165 newinterval.assign(minpacket, maxpacket);
0166 }
0167 catch (std::exception &e)
0168 {
0169 std::cout << "Exception thrown: " << e.what() << std::endl;
0170 std::cout << "for interval[" << minpacket << "," << maxpacket << "]" << std::endl;
0171 std::cout << "exiting" << std::endl;
0172 exit(1);
0173 }
0174 addpktrange[minpacket] = newinterval;
0175 if (!boost::numeric::in(minpacket, newinterval))
0176 {
0177 std::cout << PHWHERE << " boost interval does not cover minpacket " << minpacket << std::endl;
0178 std::cout << "that is seriously wrong, exiting" << std::endl;
0179 exit(1);
0180 }
0181 if (!boost::numeric::in(maxpacket, newinterval))
0182 {
0183 std::cout << PHWHERE << " boost interval does not cover maxpacket " << maxpacket << std::endl;
0184 std::cout << "that is seriously wrong, exiting" << std::endl;
0185 exit(1);
0186 }
0187 return 0;
0188 }
0189
0190 int Fun4AllEventOutStream::DropPacketRange(const int minpacket, const int maxpacket)
0191 {
0192 add_or_remove = 1;
0193 default_addall = 1;
0194 boost::numeric::interval<int> newinterval;
0195 try
0196 {
0197 newinterval.assign(minpacket, maxpacket);
0198 }
0199 catch (std::exception &e)
0200 {
0201 std::cout << "Exception thrown: " << e.what() << std::endl;
0202 std::cout << "for interval[" << minpacket << "," << maxpacket << "]" << std::endl;
0203 std::cout << "exiting" << std::endl;
0204 exit(1);
0205 }
0206 droppktrange[minpacket] = newinterval;
0207 if (!boost::numeric::in(minpacket, newinterval))
0208 {
0209 std::cout << PHWHERE << " boost interval does not cover minpacket " << minpacket << std::endl;
0210 std::cout << "that is seriously wrong, exiting" << std::endl;
0211 exit(1);
0212 }
0213 if (!boost::numeric::in(maxpacket, newinterval))
0214 {
0215 std::cout << PHWHERE << " boost interval does not cover maxpacket " << maxpacket << std::endl;
0216 std::cout << "that is seriously wrong, exiting" << std::endl;
0217 exit(1);
0218 }
0219 return 0;
0220 }