CMS 3D CMS Logo

/afs/cern.ch/work/a/aaltunda/public/www/CMSSW_6_2_5/src/EventFilter/DTRawToDigi/plugins/DTDigiToRaw.cc

Go to the documentation of this file.
00001 #include <EventFilter/DTRawToDigi/plugins/DTDigiToRaw.h>
00002 #include <EventFilter/DTRawToDigi/interface/DTDDUWords.h>
00003 
00004 #include <math.h>
00005 #include <iostream>
00006 
00007 using namespace edm;
00008 using namespace std;
00009 
00010 DTDigiToRaw::DTDigiToRaw(const edm::ParameterSet& ps): pset(ps)
00011 {
00012 
00013   debug = pset.getUntrackedParameter<bool>("debugMode", false);
00014   if (debug) cout << "[DTDigiToRaw]: constructor" << endl;
00015 }
00016 
00017 
00018 DTDigiToRaw::~DTDigiToRaw(){
00019   if (debug) cout << "[DTDigiToRaw]: destructor" << endl;
00020 }
00021 
00022 
00023 FEDRawData* DTDigiToRaw::createFedBuffers(const DTDigiCollection& digis,
00024                                    edm::ESHandle<DTReadOutMapping>& map){
00025                                    
00026    int NROS = 12;
00027    int NROB = 25;
00028    
00029    vector<uint32_t> words;
00030    
00031    uint32_t fakeROSHeaderWord =
00032               DTROSWordType::headerControlWord << WORDCONTROLSHIFT |
00033               DTROSWordType::rosTypeWord << WORDTYPESHIFT;
00034             
00035    uint32_t fakeROSTrailerWord =
00036               DTROSWordType::trailerControlWord << WORDCONTROLSHIFT |
00037               DTROSWordType::rosTypeWord << WORDTYPESHIFT;  
00038    
00039    
00040    int NWords = 2;
00041    words.push_back(0);
00042    words.push_back(0);
00043 
00044    
00045    
00046    int NTDCMeaWords = 0;
00047    
00048    
00049    int NLayers = 0;
00050    int NDigis = 0;
00051 
00052    DTDigiCollection::DigiRangeIterator detUnitIt;detUnitIt = digis.begin();
00053    
00054    
00055    bool b_ros[12] = {false, false, false, false, false, false,
00056                      false, false, false, false, false, false};
00057    vector <uint32_t> w_ROBROS[12][25];
00058    
00059    
00060    for (detUnitIt = digis.begin(); detUnitIt != digis.end(); ++detUnitIt) {
00061      
00062      NLayers++;
00063      
00064      const DTLayerId layerId = (*detUnitIt).first;
00065      const DTDigiCollection::Range& digiRange = (*detUnitIt).second;
00066      // Loop over all digis in the given range
00067      
00068      
00069      for(DTDigiCollection::const_iterator digi = digiRange.first;
00070         digi != digiRange.second;
00071         digi++) {
00072        NDigis++;
00073        int dduId = -1, rosId = -1, robId = -1, tdcId = -1, channelId = -1;
00074        
00075        int layer = layerId.layer();
00076        DTSuperLayerId superlayerID = layerId.superlayerId();
00077        int superlayer = superlayerID.superlayer();
00078        DTChamberId chamberID = superlayerID.chamberId();
00079        int station = chamberID.station();
00080        int wheel = chamberID.wheel();
00081        int sector = chamberID.sector();
00082 
00083        int searchstatus = map->
00084               geometryToReadOut(wheel, station, sector, superlayer, layer, (*digi).wire(),//"input"
00085                                 dduId, rosId, robId, tdcId, channelId);//"output"
00086        
00087        if (searchstatus == 1 && debug)
00088          cout << "[DTDigiToRaw]: warning, geometryToReadOut status = 1" << endl;
00089        
00090        //create FED corresponding to current ddu
00091        if (dduID_ != dduId) continue;
00092        
00093 
00094        DTTDCMeasurementWord dttdc_mw;
00095        uint32_t word;
00096        int ntdc = (*digi).countsTDC();
00097        dttdc_mw.set(word, 0, 0, 0, tdcId, channelId, ntdc*4);//FIXME
00098 
00099        //provisional fix
00100        DTTDCMeasurementWord tdcMeasurementWord(word);
00101        int tdcIDCheck = tdcMeasurementWord.tdcID();
00102        int tdcChannelCheck = tdcMeasurementWord.tdcChannel();
00103        int tdcCountsCheck = tdcMeasurementWord.tdcTime();
00104        if (tdcIDCheck == tdcId && channelId ==tdcChannelCheck && ntdc == tdcCountsCheck) {
00105          
00106          if (rosId <= NROS && rosId > 0) b_ros[rosId - 1] = true;
00107          else if (debug) {
00108            cout << "[DTDigiToRaw]: invalid value for rosId" << endl;
00109          }
00110        
00111          NTDCMeaWords++;
00112          w_ROBROS[rosId - 1][robId].push_back(word);
00113       
00114        }
00115      }
00116    }
00117    
00118    uint32_t therosList = 0;
00119    for (int i_ros = 0; i_ros < NROS; i_ros++) {
00120      if (b_ros[i_ros]) therosList += uint32_t(pow(2.0, i_ros)); 
00121    }
00122    
00123    if (debug) cout << "[DTDigiToRaw]: therosList = " << therosList << endl;
00124    
00125    
00126    
00127    
00128    for (int i_ros = 0; i_ros < NROS; i_ros++) {
00129      
00130      if (b_ros[i_ros]) {
00131        words.push_back(fakeROSHeaderWord);
00132        NWords++;
00133      }
00134      
00135      for (int i_rob = 0; i_rob < NROB; i_rob++) {
00136        
00137        vector <uint32_t>::const_iterator i_robros;
00138        if (w_ROBROS[i_ros][i_rob].begin() != w_ROBROS[i_ros][i_rob].end()) {
00139          uint32_t word = 0;
00140          DTROBHeaderWord rob_header;
00141          rob_header.set(word, i_rob, 0, 0);
00142          //static void set(uint32_t &word, int rob_id, int event_id, int bunch_id)
00143          words.push_back(word);
00144          NWords++;
00145          
00146          int n_robros = 0;
00147          for (i_robros = w_ROBROS[i_ros][i_rob].begin(); i_robros !=  w_ROBROS[i_ros][i_rob].end(); i_robros++) {
00148            NWords++;
00149            words.push_back((*i_robros));
00150            n_robros++;
00151          }
00152          
00153          NWords++;
00154          DTROBTrailerWord rob_trailer;
00155          rob_trailer.set(word, i_rob, 0, n_robros +  2);
00156          //static void set(uint32_t &word, int rob_id, int event_id, int word_count)
00157          words.push_back(word);
00158          
00159        }
00160      }
00161      
00162      if (b_ros[i_ros]) {
00163        words.push_back(fakeROSTrailerWord);
00164        NWords++;
00165      }
00166      
00167    }
00168    
00169    if (NWords%2 == 1) {
00170      words.push_back(0);
00171      NWords++;
00172    }
00173    
00174   
00175    
00176    NWords += 6;
00177 
00178    words.push_back(0);
00179    words.push_back(0);   
00180    //include rosList in raw data information
00181    uint32_t secondstatusword = therosList << 16;
00182    words.push_back(secondstatusword);
00183  
00184    words.push_back(0);
00185    words.push_back(0);
00186    words.push_back(0);
00187    
00188    
00189    // Write Raw Data
00190    int dataSize = words.size()*sizeof(Word32);
00191    FEDRawData* rawData = new FEDRawData(dataSize);
00192    Word64 *word64 = reinterpret_cast<Word64*>(rawData->data());
00193    for (unsigned int i = 0; i < words.size(); i += 2) {
00194      *word64 = (Word64(words[i]) << 32) | words[i + 1];
00195      word64++;
00196    }
00197    
00198    return rawData;
00199 
00200 
00201 }
00202 
00203 void DTDigiToRaw::SetdduID(int x) {
00204   dduID_ = x;
00205 }