Back to home page

sPhenix code displayed by LXR

 
 

    


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     //      std::cout << "max_npackets " << max_npackets << " too small, take times 2" << std::endl;
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           // abort loop if packetid is smaller than first packet in range
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         // abort loop if packetid is smaller than first packet in range
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;  // add some size for the event header
0123   if (size > evtbuf_size)
0124   {
0125     // Add 10000 so we do this resize only a few times
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 }