CMS 3D CMS Logo

Public Member Functions | Private Member Functions | Private Attributes

PixelSLinkDataInputSource Class Reference

#include <IORawData/SiPixelInputSources/src/PixelSLinkDataInputSource.cc>

Inheritance diagram for PixelSLinkDataInputSource:
edm::ExternalInputSource edm::ConfigurableInputSource edm::InputSource edm::ProductRegistryHelper

List of all members.

Public Member Functions

 PixelSLinkDataInputSource (const edm::ParameterSet &pset, const edm::InputSourceDescription &desc)
bool produce (edm::Event &event)
virtual ~PixelSLinkDataInputSource ()

Private Member Functions

int getEventNumberFromFillWords (std::vector< uint64_t > data, uint32_t &totword)
uint32_t synchronizeEvents ()

Private Attributes

uint32_t m_currenteventnumber
uint32_t m_currenttriggernumber
uint64_t m_data
int32_t m_eventnumber_shift
int m_fedid
uint32_t m_fileindex
uint32_t m_globaleventnumber
int m_runnumber
std::auto_ptr< Storagestorage

Detailed Description

Description: <one line="" class="" summary>="">

Implementation: <Notes on="" implementation>="">

Definition at line 35 of file PixelSLinkDataInputSource.h.


Constructor & Destructor Documentation

PixelSLinkDataInputSource::PixelSLinkDataInputSource ( const edm::ParameterSet pset,
const edm::InputSourceDescription desc 
) [explicit]

Definition at line 118 of file PixelSLinkDataInputSource.cc.

References CastorDataFrameFilter_impl::check(), edm::ExternalInputSource::fileNames(), StorageFactory::get(), reco::get(), m_currenteventnumber, m_data, m_fileindex, m_runnumber, Storage::read(), edm::InputSource::setRunNumber(), findQualityFiles::size, and storage.

                                                                                            :
  ExternalInputSource(pset,desc),
  m_fedid(pset.getUntrackedParameter<int>("fedid")),
  m_fileindex(0),
  m_runnumber(pset.getUntrackedParameter<int>("runNumber",-1)),
  m_currenteventnumber(0),
  m_currenttriggernumber(0),
  m_eventnumber_shift(0)
{
  produces<FEDRawDataCollection>();

  if (m_fileindex>=fileNames().size()) {
    edm::LogInfo("") << "no more file to read " << std::endl;
    return;// ???
  }
  std::string currentfilename = fileNames()[m_fileindex];
  edm::LogInfo("") << "now examining file "<< currentfilename ;
  m_fileindex++;
  // reading both castor and other ('normal'/dcap) files.
  IOOffset size = -1;
  StorageFactory::get()->enableAccounting(true);
    
  edm::LogInfo("PixelSLinkDataInputSource") << " unsigned long int size = " << sizeof(unsigned long int) <<"\n unsigned long size = " << sizeof(unsigned long)<<"\n unsigned long long size = " << sizeof(unsigned long long) <<  "\n uint32_t size = " << sizeof(uint32_t) << "\n uint64_t size = " << sizeof(uint64_t) << std::endl;

  bool exists = StorageFactory::get() -> check(currentfilename.c_str(), &size);
  
  edm::LogInfo("PixelSLinkDataInputSource") << "file size " << size << std::endl;
  
  if(!exists){
    edm::LogInfo("") << "file " << currentfilename << " cannot be found.";
    return;
  }
  // now open the file stream:
  storage.reset(StorageFactory::get()->open(currentfilename.c_str()));
  // (throw if storage is 0)

  // check run number by opening up data file...
  
  Storage & temp_file = *storage;
  //  IOSize n =
  temp_file.read((char*)&m_data,8);
  //  setRunNumber(m_runnumber);
  if((m_data >> 60) != 0x5){ 
    uint32_t runnum = m_data;
    if(m_runnumber!=-1)
      edm::LogInfo("") << "WARNING: observed run number encoded in S-Link dump. Overwriting run number as defined in .cfg file!!! Run number now set to " << runnum << " (was " << m_runnumber << ")";
    m_runnumber=runnum;
  } 
  if(m_runnumber!=0)
    setRunNumber(m_runnumber); 
  temp_file.read((char*)&m_data,8);
  m_currenteventnumber = (m_data >> 32)&0x00ffffff ;
}
PixelSLinkDataInputSource::~PixelSLinkDataInputSource ( ) [virtual]

Definition at line 174 of file PixelSLinkDataInputSource.cc.

                                                      {


}

Member Function Documentation

int PixelSLinkDataInputSource::getEventNumberFromFillWords ( std::vector< uint64_t >  data,
uint32_t &  totword 
) [private]

Definition at line 34 of file PixelSLinkDataInputSource.cc.

References ntuplemaker::status.

                                                                                                         {
  // buffer validity, should already be pretty clean as this is exactly what goes into the FEDRawDataobject.
  
  // code copied directly from A. Ryd's fill word checker in PixelFEDInterface::PwordSlink64

  int fif2cnt=0;
  int dumcnt=0;
  int gapcnt=0;
  uint32_t gap[9];
  uint32_t dum[9];
  uint32_t word[2]={0,0};
  uint32_t chan=0;
  uint32_t roc=0;

  const uint32_t rocmsk = 0x3e00000;
  const uint32_t chnlmsk = 0xfc000000;
  
  for(int jk=1;jk<9;jk++)gap[jk]=0;
  for(int jk=1;jk<9;jk++)dum[jk]=0;
  
  int fifcnt=1;
  for(size_t kk=0; kk<buffer.size(); ++kk)
    {

      word[0] = (uint32_t) buffer[kk];
      word[1] = (uint32_t) (buffer[kk]>>32);

      for(size_t iw=0; iw<2; iw++)
        {
          chan= ((word[iw]&chnlmsk)>>26);
          roc= ((word[iw]&rocmsk)>>21);

          //count non-error words
          if(roc<25){
            if((chan>4)&&(chan<10)&&(fifcnt!=2)) {fif2cnt=0;fifcnt=2;}
            if((chan>9)&&(chan<14)&&(fifcnt!=3)) {fif2cnt=0;fifcnt=3;}
            if((chan>13)&&(chan<19)&&(fifcnt!=4)){fif2cnt=0;fifcnt=4;}
            if((chan>18)&&(chan<23)&&(fifcnt!=5)){fif2cnt=0;fifcnt=5;}
            if((chan>22)&&(chan<28)&&(fifcnt!=6)){fif2cnt=0;fifcnt=6;}
            if((chan>27)&&(chan<32)&&(fifcnt!=7)){fif2cnt=0;fifcnt=7;}
            if((chan>31)&&(fifcnt!=8)){fif2cnt=0;fifcnt=8;} 
            fif2cnt++;
          }
          if(roc==26){gap[fifcnt]=(0x1000+(word[iw]&0xff));gapcnt++;}
          
          if((roc==27)&&((fif2cnt+dumcnt)<6)){dumcnt++;dum[fifcnt]=(0x1000+(word[iw]&0xff));}
          else if((roc==27)&&((fif2cnt+dumcnt)>6)){dumcnt=1;fif2cnt=0;fifcnt++;}
        }

      //word check complete
      if(((fif2cnt+dumcnt)==6)&&(dumcnt>0)) //done with this fifo
        {dumcnt=0;fif2cnt=0;fifcnt++;}
      if((gapcnt>0)&&((dumcnt+fif2cnt)>5))//done with this fifo
        {gapcnt=0;fifcnt++;fif2cnt=0;dumcnt=0;}
      else if((gapcnt>0)&&((dumcnt+fif2cnt)<6)) gapcnt=0;

    }//end of fifo-3 word loop-see what we got!

  int status=0;

  if(gap[1]>0) {totword=(gap[1]&0xff);status=1;}
  else if(gap[2]>0){totword=(gap[2]&0xff);status=1;}
  else if(dum[1]>0){totword=(dum[1]&0xff);status=1;}
  else if(dum[2]>0){totword=(dum[2]&0xff);status=1;}

  if(gap[3]>0) {totword=totword|((gap[3]&0xff)<<8);status=status|0x2;}
  else if(gap[4]>0){totword=totword|((gap[4]&0xff)<<8);status=status|0x2;}
  else if(dum[3]>0){totword=totword|((dum[3]&0xff)<<8);status=status|0x2;}
  else if(dum[4]>0){totword=totword|((dum[4]&0xff)<<8);status=status|0x2;}

  if(gap[5]>0) {totword=totword|((gap[5]&0xff)<<16);status=status|0x4;}
  else if(gap[6]>0){totword=totword|((gap[6]&0xff)<<16);status=status|0x4;}
  else if(dum[5]>0){totword=totword|((dum[5]&0xff)<<16);status=status|0x4;}
  else if(dum[6]>0){totword=totword|((dum[6]&0xff)<<16);status=status|0x4;}

  if(gap[7]>0){totword=totword|((gap[7]&0xff)<<24);status=status|0x8;}
  else if(gap[8]>0){totword=totword|((gap[8]&0xff)<<24);status=status|0x8;}
  else if(dum[7]>0){totword=totword|((dum[7]&0xff)<<24);status=status|0x8;}
  else if(dum[8]>0){totword=totword|((dum[8]&0xff)<<24);status=status|0x8;}
  return(status);

}
bool PixelSLinkDataInputSource::produce ( edm::Event event) [virtual]

Implements edm::ConfigurableInputSource.

Definition at line 179 of file PixelSLinkDataInputSource.cc.

References prof2calltree::count, i, m_currenteventnumber, m_currenttriggernumber, m_data, m_eventnumber_shift, m_fedid, n, Storage::read(), edm::ConfigurableInputSource::setEventNumber(), storage, and synchronizeEvents().

                                                       {
  bool lastevent=false;
  Storage & m_file = *storage;

  // create product (raw data)
  std::auto_ptr<FEDRawDataCollection> buffers( new FEDRawDataCollection );
    
  //  uint32_t currenteventnumber = (m_data >> 32)&0x00ffffff;
  uint32_t eventnumber =(m_data >> 32)&0x00ffffff ;
  
  do{
    std::vector<uint64_t> buffer;
  
 
  
    uint16_t count=0;
    eventnumber = (m_data >> 32)&0x00ffffff ;
    if(m_currenteventnumber==0)
      m_currenteventnumber=eventnumber;
    edm::LogInfo("PixelSLinkDataInputSource::produce()") << "**** event number = " << eventnumber << " global event number " << m_currenteventnumber << " data " << std::hex << m_data << std::dec << std::endl;
    while ((m_data >> 60) != 0x5){
      //  std::cout << std::hex << m_data << std::dec << std::endl;
      if (count==0){
        edm::LogWarning("") << "DATA CORRUPTION!" ;
        edm::LogWarning("") << "Expected to find header, but read: 0x"
                            << std::hex<<m_data<<std::dec ;
      }
   
      count++;
      int n=m_file.read((char*)&m_data,8);
      edm::LogWarning("") << "next data " << std::hex << m_data << std::dec << std::endl;
    
      if (n!=8) {
        edm::LogInfo("") << "End of input file" ;
        return false;
      }
    }
 

    if (count>0) {
      edm::LogWarning("")<<"Had to read "<<count<<" words before finding header!"<<std::endl;
    }

    if (m_fedid>-1) {
      m_data=(m_data&0xfffffffffff000ffLL)|((m_fedid&0xfff)<<8);
    }

    uint16_t fed_id=(m_data>>8)&0xfff;
    //   std::cout << "fed id = " << fed_id << std::endl;
    buffer.push_back(m_data);
  
    do{
      m_file.read((char*)&m_data,8);
      buffer.push_back(m_data);
    }
    while((m_data >> 60) != 0xa);
    //  std::cout << "read " <<  buffer.size() << " long words" << std::endl;

    std::auto_ptr<FEDRawData> rawData(new FEDRawData(8*buffer.size()));
    //  FEDRawData * rawData = new FEDRawData(8*buffer.size());
    unsigned char* dataptr=rawData->data();

    for (uint16_t i=0;i<buffer.size();i++){
      ((uint64_t *)dataptr)[i]=buffer[i];
    }
    uint32_t thetriggernumber=0;
    int nfillwords = 0;//getEventNumberFromFillWords(buffer,thetriggernumber);

    if(nfillwords>0){
      LogInfo("") << "n fill words = " << nfillwords <<  ", trigger numbers: " << thetriggernumber << "," << m_currenttriggernumber << std::endl;
      m_eventnumber_shift = thetriggernumber - m_currenttriggernumber;
    }
    m_currenttriggernumber = thetriggernumber;
    FEDRawData& fedRawData = buffers->FEDData( fed_id );
    fedRawData=*rawData;
    
    // read the first data member of the next blob to check on event number
    int n =m_file.read((char*)&m_data,8);
    if (n==0) {
      edm::LogInfo("") << "End of input file" ;
      lastevent=true;
    }
    m_currenteventnumber = (m_data >> 32)&0x00ffffff ;
    if(m_currenteventnumber<eventnumber)
      LogError("PixelSLinkDataInputSource") << " error, the previous event number (" << eventnumber << ") is LARGER than the next event number (" << m_currenteventnumber << ")" << std::endl;

  }
  while( eventnumber == m_currenteventnumber);
  
  uint32_t realeventno = synchronizeEvents();
  setEventNumber(realeventno);
  event.put(buffers);
  //  if(lastevent)
  //    return true;
  return true;
}
uint32_t PixelSLinkDataInputSource::synchronizeEvents ( ) [private]

Definition at line 277 of file PixelSLinkDataInputSource.cc.

References m_currenteventnumber, and query::result.

Referenced by produce().

                                                     {
  int32_t result= m_currenteventnumber -1;
      
  return(uint32_t) result;
}

Member Data Documentation

Definition at line 55 of file PixelSLinkDataInputSource.h.

Referenced by produce().

Definition at line 53 of file PixelSLinkDataInputSource.h.

Referenced by PixelSLinkDataInputSource(), and produce().

Definition at line 57 of file PixelSLinkDataInputSource.h.

Referenced by produce().

Definition at line 49 of file PixelSLinkDataInputSource.h.

Referenced by produce().

Definition at line 50 of file PixelSLinkDataInputSource.h.

Referenced by PixelSLinkDataInputSource().

Definition at line 56 of file PixelSLinkDataInputSource.h.

Definition at line 52 of file PixelSLinkDataInputSource.h.

Referenced by PixelSLinkDataInputSource().

std::auto_ptr<Storage> PixelSLinkDataInputSource::storage [private]

Definition at line 51 of file PixelSLinkDataInputSource.h.

Referenced by PixelSLinkDataInputSource(), and produce().