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 
14 
19 
22 
23 class SiStripFedCabling;
24 
34 namespace sistrip {
35 
37  {
38  public:
41  virtual void produce( edm::Event&, const edm::EventSetup& ) override;
42 
43  private:
45  const bool storeAPVAddress_;
49  const uint32_t expectedHeaderBit_;
50 
51  //utilities for cabling etc...
53  };
54 
55 } // end of sistrip namespace.
56 
57 
58 
59 namespace sistrip {
60 
62  productLabel_(pset.getParameter<edm::InputTag>("InputProductLabel")),
63  storeAPVAddress_(pset.getParameter<bool>("StoreAPVAddress")),
64  storePayloadDigis_(pset.getParameter<bool>("StorePayloadDigis")),
65  storeReorderedDigis_(pset.getParameter<bool>("StoreReorderedDigis")),
66  storeModuleDigis_(pset.getParameter<bool>("StoreModuleDigis")),
67  discardDigisWithAPVAddressError_(pset.getParameter<bool>("DiscardDigisWithWrongAPVAddress")),
68  expectedHeaderBit_(pset.getParameter<uint32_t>("ExpectedPositionOfFirstHeaderBit"))
69  {
70  if ( edm::isDebugEnabled() ) {
71  LogTrace("SiStripSpyDigiConverter")
72  << "[sistrip::SpyDigiConverterModule::" << __func__ << "]"
73  << " Constructing object...";
74  }
75 
76  if (storePayloadDigis_) produces< edm::DetSetVector<SiStripRawDigi> >("Payload");
77  if (storeReorderedDigis_) produces< edm::DetSetVector<SiStripRawDigi> >("Reordered");
78  if (storeModuleDigis_) produces< edm::DetSetVector<SiStripRawDigi> >("VirginRaw");
79 
80  if (storeAPVAddress_) {
81  produces< std::vector<uint32_t> >("APVAddress");
82  //produces<uint8_t>("APVAddress");
83  }
84 
85 
86  frameQuality_.minDigiRange = static_cast<uint16_t>(pset.getParameter<uint32_t>("MinDigiRange"));
87  frameQuality_.maxDigiRange = static_cast<uint16_t>(pset.getParameter<uint32_t>("MaxDigiRange"));
88  frameQuality_.minZeroLight = static_cast<uint16_t>(pset.getParameter<uint32_t>("MinZeroLight"));
89  frameQuality_.maxZeroLight = static_cast<uint16_t>(pset.getParameter<uint32_t>("MaxZeroLight"));
90  frameQuality_.minTickHeight = static_cast<uint16_t>(pset.getParameter<uint32_t>("MinTickHeight"));
91  frameQuality_.maxTickHeight = static_cast<uint16_t>(pset.getParameter<uint32_t>("MaxTickHeight"));
92 
93 
94  } // end of constructor.
95 
96 
98  if ( edm::isDebugEnabled() ) {
99  LogTrace("SiStripSpyDigiConverter")
100  << "[sistrip::SpyDigiConverterModule::" << __func__ << "]"
101  << " Destructing object...";
102  }
103  } // end of destructor.
104 
112 
113  static bool lFirstEvent = true;
114 
115  const SiStripFedCabling* lCabling = utility_.getCabling( setup );
116 
118 
119  //retrieve the scope mode digis
121  event.getByLabel(productLabel_, scopeDigisHandle);
122 
123  //32-bit to accomodate known CMSSW container
124  std::auto_ptr< std::vector<uint32_t> > pAPVAddresses(new std::vector<uint32_t>);
125 
126  std::auto_ptr<sistrip::SpyDigiConverter::DSVRawDigis> payloadDigis, reorderedDigis, moduleDigis;
127 
128  //get the majority value for expected position of first header bit
129  //from first event, compare to expected one, else output warning.
130  if (lFirstEvent){
131  uint16_t lFirstHeaderBit;
132  sistrip::SpyUtilities::getMajorityHeader(scopeDigisHandle.product(),lFirstHeaderBit);
133 
134  if (lFirstHeaderBit != static_cast<uint16_t>(expectedHeaderBit_)) {
135  edm::LogWarning("") << " -- Majority position for firstHeaderBit in first event ("
136  << lFirstHeaderBit
137  << ") is not where expected: "
138  << static_cast<uint16_t>(expectedHeaderBit_)
139  << std::endl;
140  }
141 
142  }
143 
144 
145 
146  //extract frame digis and APV addresses
147  payloadDigis = sistrip::SpyDigiConverter::extractPayloadDigis(scopeDigisHandle.product(),
148  pAPVAddresses.get(),
150  frameQuality_,
151  static_cast<uint16_t>(expectedHeaderBit_));
152 
153  // Reorder
155  reorderedDigis = sistrip::SpyDigiConverter::reorderDigis(payloadDigis.get());
156  }
157 
158  // Merge into modules
159  if (storeModuleDigis_) {
160  moduleDigis = sistrip::SpyDigiConverter::mergeModuleChannels(reorderedDigis.get(), *lCabling);
161  }
162 
163  //add to event
164  if (storePayloadDigis_) event.put(payloadDigis,"Payload");
165  if (storeReorderedDigis_) event.put(reorderedDigis,"Reordered");
166  if (storeModuleDigis_) event.put(moduleDigis,"VirginRaw");
167  if (storeAPVAddress_) {
168  event.put(pAPVAddresses, "APVAddress");
169  }
170 
171 
172  lFirstEvent = false;
173 
174  } // end of SpyDigiConverter::produce method.
175 
176 } // end of sistrip namespace.
177 
178 
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)
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:74
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...