Back to home page

Project CMSSW displayed by LXR

 
 

    


File indexing completed on 2025-01-08 03:36:09

0001 /** \file
0002  * Implementation of class RawDataCollectorByLabel
0003  *
0004  */
0005 
0006 #include "DataFormats/Common/interface/Handle.h"
0007 #include "DataFormats/FEDRawData/interface/FEDNumbering.h"
0008 #include "DataFormats/FEDRawData/interface/FEDRawData.h"
0009 #include "DataFormats/FEDRawData/interface/FEDRawDataCollection.h"
0010 #include "DataFormats/Provenance/interface/ProcessHistory.h"
0011 #include "EventFilter/RawDataCollector/src/RawDataCollectorByLabel.h"
0012 #include "FWCore/Framework/interface/ESHandle.h"
0013 #include "FWCore/Framework/interface/Event.h"
0014 #include "FWCore/Framework/interface/EventSetup.h"
0015 #include "FWCore/MessageLogger/interface/MessageLogger.h"
0016 #include "FWCore/ParameterSet/interface/ConfigurationDescriptions.h"
0017 #include "FWCore/ParameterSet/interface/ParameterSet.h"
0018 #include "FWCore/ParameterSet/interface/ParameterSetDescription.h"
0019 
0020 #include <iostream>
0021 
0022 using namespace edm;
0023 
0024 RawDataCollectorByLabel::RawDataCollectorByLabel(const edm::ParameterSet &pset) {
0025   inputTags_ = pset.getParameter<std::vector<InputTag> >("RawCollectionList");
0026   verbose_ = pset.getUntrackedParameter<int>("verbose", 0);
0027 
0028   inputTokens_.reserve(inputTags_.size());
0029   for (tag_iterator_t inputTag = inputTags_.begin(); inputTag != inputTags_.end(); ++inputTag) {
0030     inputTokens_.push_back(consumes<FEDRawDataCollection>(*inputTag));
0031   }
0032   produces<FEDRawDataCollection>();
0033 }
0034 
0035 void RawDataCollectorByLabel::fillDescriptions(edm::ConfigurationDescriptions &descriptions) {
0036   edm::ParameterSetDescription desc;
0037   desc.add<std::vector<InputTag> >("RawCollectionList",
0038                                    {edm::InputTag("SiStripDigiToZSRaw"), edm::InputTag("rawDataCollector")});
0039   desc.addUntracked<int>("verbose", 0)->setComment("0 = quiet, 1 = collection list, 2 = FED list");
0040   descriptions.add("default_rawDataCollectorByLabel", desc);
0041 }
0042 
0043 void RawDataCollectorByLabel::produce(Event &e, const EventSetup &c) {
0044   /// Get Data from all FEDs
0045   std::vector<Handle<FEDRawDataCollection> > rawData;
0046   rawData.reserve(inputTokens_.size());
0047   for (tok_iterator_t inputTok = inputTokens_.begin(); inputTok != inputTokens_.end(); ++inputTok) {
0048     Handle<FEDRawDataCollection> input;
0049     if (e.getByToken(*inputTok, input)) {
0050       rawData.push_back(input);
0051     }
0052     //else{     //skipping the inputtag requested. but this is a normal operation to bare data & MC. silent warning   }
0053   }
0054 
0055   auto producedData = std::make_unique<FEDRawDataCollection>();
0056 
0057   for (unsigned int i = 0; i < rawData.size(); ++i) {
0058     const FEDRawDataCollection *rdc = rawData[i].product();
0059 
0060     if (verbose_ > 0) {
0061       std::cout << "\nRAW collection #" << i + 1 << std::endl;
0062       std::cout << "branch name = " << rawData[i].provenance()->branchName() << std::endl;
0063       std::cout << "process index = " << rawData[i].provenance()->productID().processIndex() << std::endl;
0064     }
0065 
0066     for (int j = 0; j <= FEDNumbering::MAXFEDID; ++j) {
0067       const FEDRawData &fedData = rdc->FEDData(j);
0068       size_t size = fedData.size();
0069 
0070       if (size > 0) {
0071         // this fed has data -- lets copy it
0072         if (verbose_ > 1)
0073           std::cout << "Copying data from FED #" << j << std::endl;
0074         FEDRawData &fedDataProd = producedData->FEDData(j);
0075         if (fedDataProd.size() != 0) {
0076           if (verbose_ > 1) {
0077             std::cout << " More than one FEDRawDataCollection with data in FED ";
0078             std::cout << j << " Skipping the 2nd\n";
0079           }
0080           continue;
0081         }
0082         fedDataProd.resize(size);
0083         unsigned char *dataProd = fedDataProd.data();
0084         const unsigned char *data = fedData.data();
0085         for (unsigned int k = 0; k < size; ++k) {
0086           dataProd[k] = data[k];
0087         }
0088       }
0089     }
0090   }
0091 
0092   // Insert the new product in the event
0093   e.put(std::move(producedData));
0094 }