Go to the documentation of this file.00001
00010 #include <FWCore/Framework/interface/Event.h>
00011 #include <DataFormats/Common/interface/Handle.h>
00012 #include <FWCore/Framework/interface/ESHandle.h>
00013 #include <FWCore/Framework/interface/EventSetup.h>
00014 #include <FWCore/ParameterSet/interface/ParameterSet.h>
00015
00016 #include <EventFilter/DTRawToDigi/plugins/DTUnpackingModule.h>
00017 #include <DataFormats/FEDRawData/interface/FEDRawData.h>
00018 #include <DataFormats/FEDRawData/interface/FEDNumbering.h>
00019 #include <DataFormats/FEDRawData/interface/FEDRawDataCollection.h>
00020 #include <DataFormats/DTDigi/interface/DTDigiCollection.h>
00021 #include <DataFormats/DTDigi/interface/DTLocalTriggerCollection.h>
00022
00023 #include <CondFormats/DataRecord/interface/DTReadOutMappingRcd.h>
00024
00025 #include <EventFilter/DTRawToDigi/plugins/DTDDUUnpacker.h>
00026 #include <EventFilter/DTRawToDigi/plugins/DTROS25Unpacker.h>
00027 #include <EventFilter/DTRawToDigi/plugins/DTROS8Unpacker.h>
00028
00029
00030 using namespace edm;
00031 using namespace std;
00032
00033
00034
00035 #define SLINK_WORD_SIZE 8
00036
00037
00038 DTUnpackingModule::DTUnpackingModule(const edm::ParameterSet& ps) : unpacker(0) {
00039
00040 const string & dataType = ps.getParameter<string>("dataType");
00041
00042 ParameterSet unpackerParameters = ps.getParameter<ParameterSet>("readOutParameters");
00043
00044
00045 if (dataType == "DDU") {
00046 unpacker = new DTDDUUnpacker(unpackerParameters);
00047 }
00048 else if (dataType == "ROS25") {
00049 unpacker = new DTROS25Unpacker(unpackerParameters.getParameter<ParameterSet>("rosParameters"));
00050 }
00051 else if (dataType == "ROS8") {
00052 unpacker = new DTROS8Unpacker(unpackerParameters);
00053 }
00054 else {
00055 throw cms::Exception("InvalidParameter") << "DTUnpackingModule: dataType "
00056 << dataType << " is unknown";
00057 }
00058
00059 fedbyType_ = ps.getParameter<bool>("fedbyType");
00060 inputLabel = ps.getParameter<InputTag>("inputLabel");
00061 useStandardFEDid_ = ps.getParameter<bool>("useStandardFEDid");
00062 minFEDid_ = ps.getUntrackedParameter<int>("minFEDid",770);
00063 maxFEDid_ = ps.getUntrackedParameter<int>("maxFEDid",779);
00064 dqmOnly = ps.getParameter<bool>("dqmOnly");
00065
00066 if(!dqmOnly) {
00067 produces<DTDigiCollection>();
00068 produces<DTLocalTriggerCollection>();
00069 }
00070 }
00071
00072 DTUnpackingModule::~DTUnpackingModule(){
00073 delete unpacker;
00074 }
00075
00076
00077 void DTUnpackingModule::produce(Event & e, const EventSetup& context){
00078
00079 Handle<FEDRawDataCollection> rawdata;
00080 if (fedbyType_) {
00081 e.getByType(rawdata);
00082 }
00083 else {
00084 e.getByLabel(inputLabel, rawdata);
00085 }
00086
00087
00088 ESHandle<DTReadOutMapping> mapping;
00089 context.get<DTReadOutMappingRcd>().get(mapping);
00090
00091
00092 auto_ptr<DTDigiCollection> detectorProduct(new DTDigiCollection);
00093 auto_ptr<DTLocalTriggerCollection> triggerProduct(new DTLocalTriggerCollection);
00094
00095
00096
00097 int FEDIDmin = 0, FEDIDMax = 0;
00098 if (useStandardFEDid_){
00099 FEDIDmin = FEDNumbering::MINDTFEDID;
00100 FEDIDMax = FEDNumbering::MAXDTFEDID;
00101 }
00102 else {
00103 FEDIDmin = minFEDid_;
00104 FEDIDMax = maxFEDid_;
00105 }
00106
00107 for (int id=FEDIDmin; id<=FEDIDMax; ++id){
00108
00109 const FEDRawData& feddata = rawdata->FEDData(id);
00110
00111 if (feddata.size()){
00112
00113
00114 unpacker->interpretRawData(reinterpret_cast<const unsigned int*>(feddata.data()),
00115 feddata.size(), id, mapping, detectorProduct, triggerProduct);
00116 }
00117 }
00118
00119
00120 if(!dqmOnly) {
00121 e.put(detectorProduct);
00122 e.put(triggerProduct);
00123 }
00124 }
00125