Back to home page

sPhenix code displayed by LXR

 
 

    


File indexing completed on 2025-08-02 08:21:01

0001  
0002 
0003 #include <iostream>
0004 
0005 #include <daq_device_random.h>
0006 
0007 using namespace std;
0008 
0009 daq_device_random::daq_device_random(const int eventtype
0010     , const int subeventid
0011     , const int n_words
0012     , const int low
0013     , const int high
0014     , const int trigger_enabled)
0015 {
0016 
0017   m_eventType  = eventtype;
0018   m_subeventid = subeventid;
0019   number_of_words = n_words;
0020   low_range = low;
0021   high_range = high;
0022   rfp = fopen("/dev/urandom","r");
0023   if (trigger_enabled) 
0024     {
0025       th = new pulserTriggerHandler(m_eventType);
0026       registerTriggerHandler(th);
0027     }
0028   else
0029     {
0030       th = 0;
0031     }
0032 }
0033 
0034 daq_device_random::~daq_device_random()
0035 {
0036   if ( rfp) fclose( rfp);
0037   if ( th) 
0038     {
0039       clearTriggerHandler();
0040       delete th;
0041     }
0042 }
0043 
0044 
0045 
0046 // the put_data function
0047 
0048 int daq_device_random::put_data(const int etype, int * adr, const int length )
0049 {
0050 
0051   int len = 0;
0052 
0053   if (etype != m_eventType )  // not our id
0054     {
0055       return 0;
0056     }
0057 
0058   if ( !rfp) return 0;  // if we failed to open the random gen
0059 
0060   if ( daq_getEventFormat() ) // we are writing PRDF
0061     {
0062 
0063       formatPacketHdr(adr);
0064       packetdata_ptr sevt =  (packetdata_ptr) adr;
0065       // update id's etc
0066       sevt->sub_id =  m_subeventid;
0067       sevt->sub_type =  4;
0068       sevt->sub_decoding = 30000+ID4EVT;
0069       
0070       int  *d = (int *) &sevt->data;
0071 
0072       int ia;
0073       int data;
0074 
0075       for ( ia = 0; ia < number_of_words; ia++)
0076     {
0077       int l =  fread ( &data, 4, 1, rfp);
0078       if ( l == 1 )
0079         {
0080           data &= 0x7fffffff; // enforce a posiitive number
0081           double x = data;
0082           x /= ( 1024. * 1024.);
0083           x *= ( high_range - low_range);
0084           x /= ( 2. * 1024.);
0085           *d++  = x + low_range;
0086           len++;
0087         }
0088     }
0089   
0090       int padding = len%2;
0091       sevt->structureinfo += padding;
0092       len = len + padding;
0093       sevt->sub_length += len;
0094       return  sevt->sub_length;
0095     }
0096 
0097   else
0098     {
0099       sevt =  (subevtdata_ptr) adr;
0100       // set the initial subevent length
0101       sevt->sub_length =  SEVTHEADERLENGTH;
0102 
0103       // update id's etc
0104       sevt->sub_id =  m_subeventid;
0105       sevt->sub_type=4;
0106       sevt->sub_decoding = ID4EVT;
0107       sevt->reserved[0] = 0;
0108       sevt->reserved[1] = 0;
0109       
0110       unsigned int data;
0111       
0112       int  *d = (int *) &sevt->data;
0113       
0114       int ia;
0115       
0116       for ( ia = 0; ia < number_of_words; ia++)
0117     {
0118       int l =  fread ( &data, 4, 1, rfp);
0119       if ( l == 1 )
0120         {
0121           data &= 0x7fffffff; // enforce a posiitive number
0122           double x = data;
0123           x /= ( 1024. * 1024.);
0124           x *= ( high_range - low_range);
0125           x /= ( 2. * 1024.);
0126           *d++  = x + low_range;
0127           len++;
0128         }
0129     }
0130       
0131       sevt->sub_padding = len%2;
0132       len = len + (len%2);
0133       sevt->sub_length += len;
0134       return  sevt->sub_length;
0135     }
0136 }
0137 
0138 
0139 void daq_device_random::identify(std::ostream& os) const
0140 {
0141   
0142   os  << "Random Device  Event Type: " << m_eventType << " Subevent id: " << m_subeventid 
0143       << " n_words: " << number_of_words 
0144       << " range: " << low_range << " - " << high_range;
0145 
0146     if (th) 
0147       {
0148     os << " ** Trigger enabled";
0149       }
0150 
0151   os << endl;
0152 
0153 }
0154 
0155 int daq_device_random::max_length(const int etype) const
0156 {
0157   if (etype != m_eventType) return 0;
0158   return  (number_of_words + SEVTHEADERLENGTH);
0159 }
0160 
0161 int  daq_device_random::init()
0162 {
0163 
0164   return 0;
0165 }
0166 
0167 // the rearm() function
0168 int  daq_device_random::rearm(const int etype)
0169 {
0170   if (etype != m_eventType) return 0;
0171   return 0;
0172 }
0173