CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
SiStripSpyDigiConverterModule.cc
Go to the documentation of this file.
1 #include <string>
2 #include <memory>
3 #include <vector>
4 #include <utility>
5 #include "boost/cstdint.hpp"
6 
15 
20 
23 
24 class SiStripFedCabling;
25 
35 namespace sistrip {
36 
38  {
39  public:
42  virtual void produce( edm::Event&, const edm::EventSetup& ) override;
43 
44  private:
47  const bool storeAPVAddress_;
51  const uint32_t expectedHeaderBit_;
52 
53  //utilities for cabling etc...
55  };
56 
57 } // end of sistrip namespace.
58 
59 
60 
61 namespace sistrip {
62 
64  productLabel_(pset.getParameter<edm::InputTag>("InputProductLabel")),
65  storeAPVAddress_(pset.getParameter<bool>("StoreAPVAddress")),
66  storePayloadDigis_(pset.getParameter<bool>("StorePayloadDigis")),
67  storeReorderedDigis_(pset.getParameter<bool>("StoreReorderedDigis")),
68  storeModuleDigis_(pset.getParameter<bool>("StoreModuleDigis")),
69  discardDigisWithAPVAddressError_(pset.getParameter<bool>("DiscardDigisWithWrongAPVAddress")),
70  expectedHeaderBit_(pset.getParameter<uint32_t>("ExpectedPositionOfFirstHeaderBit"))
71  {
72  productToken_ = consumes<sistrip::SpyDigiConverter::DSVRawDigis>(productLabel_);
73  if ( edm::isDebugEnabled() ) {
74  LogTrace("SiStripSpyDigiConverter")
75  << "[sistrip::SpyDigiConverterModule::" << __func__ << "]"
76  << " Constructing object...";
77  }
78 
79  if (storePayloadDigis_) produces< edm::DetSetVector<SiStripRawDigi> >("Payload");
80  if (storeReorderedDigis_) produces< edm::DetSetVector<SiStripRawDigi> >("Reordered");
81  if (storeModuleDigis_) produces< edm::DetSetVector<SiStripRawDigi> >("VirginRaw");
82 
83  if (storeAPVAddress_) {
84  produces< std::vector<uint32_t> >("APVAddress");
85  //produces<uint8_t>("APVAddress");
86  }
87 
88 
89  frameQuality_.minDigiRange = static_cast<uint16_t>(pset.getParameter<uint32_t>("MinDigiRange"));
90  frameQuality_.maxDigiRange = static_cast<uint16_t>(pset.getParameter<uint32_t>("MaxDigiRange"));
91  frameQuality_.minZeroLight = static_cast<uint16_t>(pset.getParameter<uint32_t>("MinZeroLight"));
92  frameQuality_.maxZeroLight = static_cast<uint16_t>(pset.getParameter<uint32_t>("MaxZeroLight"));
93  frameQuality_.minTickHeight = static_cast<uint16_t>(pset.getParameter<uint32_t>("MinTickHeight"));
94  frameQuality_.maxTickHeight = static_cast<uint16_t>(pset.getParameter<uint32_t>("MaxTickHeight"));
95 
96 
97  } // end of constructor.
98 
99 
101  if ( edm::isDebugEnabled() ) {
102  LogTrace("SiStripSpyDigiConverter")
103  << "[sistrip::SpyDigiConverterModule::" << __func__ << "]"
104  << " Destructing object...";
105  }
106  } // end of destructor.
107 
115 
116  static bool lFirstEvent = true;
117 
118  const SiStripFedCabling* lCabling = utility_.getCabling( setup );
119 
121 
122  //retrieve the scope mode digis
124  // event.getByLabel(productLabel_, scopeDigisHandle);
125  event.getByToken(productToken_, scopeDigisHandle);
126 
127  //32-bit to accomodate known CMSSW container
128  std::auto_ptr< std::vector<uint32_t> > pAPVAddresses(new std::vector<uint32_t>);
129 
130  std::auto_ptr<sistrip::SpyDigiConverter::DSVRawDigis> payloadDigis, reorderedDigis, moduleDigis;
131 
132  //get the majority value for expected position of first header bit
133  //from first event, compare to expected one, else output warning.
134  if (lFirstEvent){
135  uint16_t lFirstHeaderBit;
136  sistrip::SpyUtilities::getMajorityHeader(scopeDigisHandle.product(),lFirstHeaderBit);
137 
138  if (lFirstHeaderBit != static_cast<uint16_t>(expectedHeaderBit_)) {
139  edm::LogWarning("") << " -- Majority position for firstHeaderBit in first event ("
140  << lFirstHeaderBit
141  << ") is not where expected: "
142  << static_cast<uint16_t>(expectedHeaderBit_)
143  << std::endl;
144  }
145 
146  }
147 
148 
149 
150  //extract frame digis and APV addresses
151  payloadDigis = sistrip::SpyDigiConverter::extractPayloadDigis(scopeDigisHandle.product(),
152  pAPVAddresses.get(),
154  frameQuality_,
155  static_cast<uint16_t>(expectedHeaderBit_));
156 
157  // Reorder
159  reorderedDigis = sistrip::SpyDigiConverter::reorderDigis(payloadDigis.get());
160  }
161 
162  // Merge into modules
163  if (storeModuleDigis_) {
164  moduleDigis = sistrip::SpyDigiConverter::mergeModuleChannels(reorderedDigis.get(), *lCabling);
165  }
166 
167  //add to event
168  if (storePayloadDigis_) event.put(payloadDigis,"Payload");
169  if (storeReorderedDigis_) event.put(reorderedDigis,"Reordered");
170  if (storeModuleDigis_) event.put(moduleDigis,"VirginRaw");
171  if (storeAPVAddress_) {
172  event.put(pAPVAddresses, "APVAddress");
173  }
174 
175 
176  lFirstEvent = false;
177 
178  } // end of SpyDigiConverter::produce method.
179 
180 } // end of sistrip namespace.
181 
182 
T getParameter(std::string const &) const
bool isDebugEnabled()
virtual void produce(edm::Event &, const edm::EventSetup &) override
sistrip::SpyDigiConverterModule SiStripSpyDigiConverterModule
#define DEFINE_FWK_MODULE(type)
Definition: MakerMacros.h:17
static std::auto_ptr< DSVRawDigis > mergeModuleChannels(const DSVRawDigis *inputPhysicalOrderChannelDigis, const SiStripFedCabling &cabling)
edm::EDGetTokenT< sistrip::SpyDigiConverter::DSVRawDigis > productToken_
static std::auto_ptr< DSVRawDigis > extractPayloadDigis(const DSVRawDigis *inputScopeDigis, std::vector< uint32_t > *pAPVAddresses, const bool discardDigisWithAPVAddrErr, const sistrip::SpyUtilities::FrameQuality &aQuality, const uint16_t expectedPos)
Extract frames from the scope digis.
static std::auto_ptr< DSVRawDigis > reorderDigis(const DSVRawDigis *inputPayloadDigis)
How EventSelector::AcceptEvent() decides whether to accept an event for output otherwise it is excluding the probing of A single or multiple positive and the trigger will pass if any such matching triggers are PASS or EXCEPTION[A criterion thatmatches no triggers at all is detected and causes a throw.] A single negative with an expectation of appropriate bit checking in the decision and the trigger will pass if any such matching triggers are FAIL or EXCEPTION A wildcarded negative criterion that matches more than one trigger in the trigger but the state exists so we define the behavior If all triggers are the negative crieriion will lead to accepting the event(this again matches the behavior of"!*"before the partial wildcard feature was incorporated).The per-event"cost"of each negative criterion with multiple relevant triggers is about the same as!*was in the past
const bool storeAPVAddress_
True = store APVE address for each channel.
#define LogTrace(id)
const SiStripFedCabling * getCabling(const edm::EventSetup &)
Updates the cabling object from the DB.
T const * product() const
Definition: Handle.h:81
Contains cabling info at the device level, including DetId, APV pair numbers, hardware addresses...
sistrip::SpyUtilities::FrameQuality frameQuality_
static void getMajorityHeader(const edm::DetSetVector< SiStripRawDigi > *aInputDigis, uint16_t &firstHeaderBit, bool printResult=true)
SpyDigiConverterModule(const edm::ParameterSet &)
void setup(std::vector< TH2F > &depth, std::string name, std::string units="")
A plug-in module that takes the spy channel scope mode digis as input from the Event and creates EDPr...