CMS 3D CMS Logo

All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
SiStripZeroSuppression.cc
Go to the documentation of this file.
2 
12 #include <memory>
13 
15  : algorithms(SiStripRawProcessingFactory::create(conf.getParameter<edm::ParameterSet>("Algorithms"))),
16  produceRawDigis(conf.getParameter<bool>("produceRawDigis")),
17  storeCM(conf.getParameter<bool>("storeCM")),
18  fixCM(conf.getParameter<bool>("fixCM")),
19  produceCalculatedBaseline(conf.getParameter<bool>("produceCalculatedBaseline")),
20  produceBaselinePoints(conf.getParameter<bool>("produceBaselinePoints")),
21  storeInZScollBadAPV(conf.getParameter<bool>("storeInZScollBadAPV")),
22  produceHybridFormat(conf.getParameter<bool>("produceHybridFormat")) {
23  for (const auto& inputTag : conf.getParameter<std::vector<edm::InputTag>>("RawDigiProducersList")) {
24  const auto& tagName = inputTag.instance();
25  produces<edm::DetSetVector<SiStripDigi>>(tagName);
26  if (produceRawDigis)
27  produces<edm::DetSetVector<SiStripRawDigi>>(tagName);
28  if (storeCM)
29  produces<edm::DetSetVector<SiStripProcessedRawDigi>>("APVCM" + tagName);
31  produces<edm::DetSetVector<SiStripProcessedRawDigi>>("BADAPVBASELINE" + tagName);
33  produces<edm::DetSetVector<SiStripDigi>>("BADAPVBASELINEPOINTS" + tagName);
34 
35  RawType inputType = RawType::Unknown;
36  if (tagName == "ProcessedRaw") {
37  inputType = RawType::ProcessedRaw;
39  throw cms::Exception("Processed Raw Cannot be converted in hybrid Format");
40  } else if (tagName == "VirginRaw") {
41  inputType = RawType::VirginRaw;
42  } else if (tagName == "ScopeMode") {
43  inputType = RawType::ScopeMode;
45  throw cms::Exception("Scope Mode cannot be converted in hybrid Format");
46  }
47  if (RawType::Unknown != inputType) {
48  rawInputs.emplace_back(tagName, inputType, consumes<edm::DetSetVector<SiStripRawDigi>>(inputTag));
49  } else if (tagName == "ZeroSuppressed") {
51  } else {
52  throw cms::Exception("Unknown input type")
53  << tagName << " unknown. "
54  << "SiStripZeroZuppression can only process types \"VirginRaw\", \"ProcessedRaw\" and \"ZeroSuppressed\"";
55  }
56  }
57 
58  if (produceHybridFormat &&
59  ("HybridEmulation" !=
60  conf.getParameter<edm::ParameterSet>("Algorithms").getParameter<std::string>("APVInspectMode")))
61  throw cms::Exception("Invalid option") << "When producing data in the hybrid format, the APV restorer must be "
62  "configured with APVInspectMode='HybridEmulation'";
63 
64  if (!(rawInputs.empty() && hybridInputs.empty())) {
65  output_base.reserve(16000);
66  if (produceRawDigis)
67  output_base_raw.reserve(16000);
68  if (storeCM)
69  output_apvcm.reserve(16000);
71  output_baseline.reserve(16000);
73  output_baseline_points.reserve(16000);
74  }
75 }
76 
78  algorithms->initialize(es, e);
79 
80  for (const auto& input : rawInputs) {
81  clearOutputs();
83  e.getByToken(std::get<rawtoken_t>(input), inDigis);
84  if (!inDigis->empty())
85  processRaw(*inDigis, std::get<RawType>(input));
86  putOutputs(e, std::get<std::string>(input));
87  }
88  for (const auto& input : hybridInputs) {
89  clearOutputs();
91  e.getByToken(std::get<zstoken_t>(input), inDigis);
92  if (!inDigis->empty()) {
93  processHybrid(*inDigis);
94  }
95  putOutputs(e, std::get<std::string>(input));
96  }
97 }
98 
100  output_base.clear();
101  output_base_raw.clear();
102  output_baseline.clear();
103  output_baseline_points.clear();
104  output_apvcm.clear();
105 }
107  evt.put(std::make_unique<edm::DetSetVector<SiStripDigi>>(output_base), tagName);
108  if (produceRawDigis)
109  evt.put(std::make_unique<edm::DetSetVector<SiStripRawDigi>>(output_base_raw), tagName);
111  evt.put(std::make_unique<edm::DetSetVector<SiStripProcessedRawDigi>>(output_baseline), "BADAPVBASELINE" + tagName);
113  evt.put(std::make_unique<edm::DetSetVector<SiStripDigi>>(output_baseline_points), "BADAPVBASELINEPOINTS" + tagName);
114  if (storeCM)
115  evt.put(std::make_unique<edm::DetSetVector<SiStripProcessedRawDigi>>(output_apvcm), "APVCM" + tagName);
116 }
117 
119  for (const auto& rawDigis : input) {
120  edm::DetSet<SiStripDigi> suppressedDigis(rawDigis.id);
121 
122  int16_t nAPVflagged = 0;
123  if (RawType::ProcessedRaw == inType) {
124  nAPVflagged = algorithms->suppressProcessedRawData(rawDigis, suppressedDigis);
125  } else if (RawType::ScopeMode == inType) {
126  nAPVflagged = algorithms->suppressVirginRawData(rawDigis, suppressedDigis);
127  } else if (RawType::VirginRaw == inType) {
128  if (produceHybridFormat) {
129  nAPVflagged = algorithms->convertVirginRawToHybrid(rawDigis, suppressedDigis);
130  } else {
131  nAPVflagged = algorithms->suppressVirginRawData(rawDigis, suppressedDigis);
132  }
133  }
134 
135  storeExtraOutput(rawDigis.id, nAPVflagged);
136  if (!suppressedDigis.empty() && (storeInZScollBadAPV || nAPVflagged == 0))
137  output_base.push_back(std::move(suppressedDigis));
138 
139  if (produceRawDigis && nAPVflagged > 0) {
140  output_base_raw.push_back(formatRawDigis(rawDigis));
141  }
142  }
143 }
144 
146  for (const auto& inDigis : input) {
147  edm::DetSet<SiStripDigi> suppressedDigis(inDigis.id);
148 
149  std::vector<int16_t> rawDigis;
150  const auto nAPVflagged = algorithms->suppressHybridData(inDigis, suppressedDigis, rawDigis);
151 
152  storeExtraOutput(inDigis.id, nAPVflagged);
153  if (!suppressedDigis.empty() && (storeInZScollBadAPV || nAPVflagged == 0))
154  output_base.push_back(std::move(suppressedDigis));
155 
156  if (produceRawDigis && nAPVflagged > 0) {
157  output_base_raw.push_back(formatRawDigis(inDigis.id, rawDigis));
158  }
159  }
160 }
161 
163  edm::DetSet<SiStripRawDigi> outRawDigis(rawDigis.id);
164  outRawDigis.reserve(rawDigis.size());
165  const std::vector<bool>& apvf = algorithms->getAPVFlags();
166  uint32_t strip = 0;
167  for (const auto rawDigi : rawDigis) {
168  int16_t apvN = strip / 128;
169  if (apvf[apvN])
170  outRawDigis.push_back(rawDigi);
171  else
172  outRawDigis.push_back(SiStripRawDigi(0));
173  ++strip;
174  }
175  return outRawDigis;
176 }
177 
179  const std::vector<int16_t>& rawDigis) {
180  edm::DetSet<SiStripRawDigi> outRawDigis(detId);
181  outRawDigis.reserve(rawDigis.size());
182  const std::vector<bool>& apvf = algorithms->getAPVFlags();
183  uint32_t strip = 0;
184  for (const auto rawDigi : rawDigis) {
185  int16_t apvN = strip / 128;
186  if (apvf[apvN])
187  outRawDigis.push_back(SiStripRawDigi(rawDigi));
188  else
189  outRawDigis.push_back(SiStripRawDigi(0));
190  ++strip;
191  }
192  return outRawDigis;
193 }
194 
195 inline void SiStripZeroSuppression::storeExtraOutput(uint32_t id, int16_t nAPVflagged) {
196  const auto& vmedians = algorithms->getAPVsCM();
197  if (storeCM)
198  storeCMN(id, vmedians);
199  if (nAPVflagged > 0) {
201  storeBaseline(id, vmedians);
204  }
205 }
206 
207 inline void SiStripZeroSuppression::storeBaseline(uint32_t id, const medians_t& vmedians) {
208  const auto& baselinemap = algorithms->getBaselineMap();
209 
210  edm::DetSet<SiStripProcessedRawDigi> baselineDetSet(id);
211  baselineDetSet.reserve(vmedians.size() * 128);
212  for (const auto& vmed : vmedians) {
213  const uint16_t apvN = vmed.first;
214  const float median = vmed.second;
215  auto itBaselineMap = baselinemap.find(apvN);
216  if (baselinemap.end() == itBaselineMap) {
217  for (size_t strip = 0; strip < 128; ++strip)
218  baselineDetSet.push_back(SiStripProcessedRawDigi(median));
219  } else {
220  for (size_t strip = 0; strip < 128; ++strip)
221  baselineDetSet.push_back(SiStripProcessedRawDigi((itBaselineMap->second)[strip]));
222  }
223  }
224 
225  if (!baselineDetSet.empty())
226  output_baseline.push_back(baselineDetSet);
227 }
228 
230  edm::DetSet<SiStripDigi> baspointDetSet(id);
231  for (const auto& itBaselinePointVect : algorithms->getSmoothedPoints()) {
232  const uint16_t apvN = itBaselinePointVect.first;
233  for (const auto& itBaselinePointMap : itBaselinePointVect.second) {
234  const uint16_t bpstrip = itBaselinePointMap.first + apvN * 128;
235  const int16_t bp = itBaselinePointMap.second;
236  baspointDetSet.push_back(SiStripDigi(bpstrip, bp + 128));
237  }
238  }
239 
240  if (!baspointDetSet.empty())
241  output_baseline_points.push_back(std::move(baspointDetSet));
242 }
243 
244 inline void SiStripZeroSuppression::storeCMN(uint32_t id, const medians_t& vmedians) {
245  std::vector<bool> apvf(6, false);
246  if (fixCM) {
247  const auto& apvFlagged = algorithms->getAPVFlags();
248  std::copy(std::begin(apvFlagged), std::end(apvFlagged), std::begin(apvf));
249  }
250 
252  short apvNb = 0;
253  for (const auto& vmed : vmedians) {
254  if (vmed.first > apvNb) {
255  for (int i{0}; i < vmed.first - apvNb; ++i) {
256  apvDetSet.push_back(SiStripProcessedRawDigi(-999.));
257  apvNb++;
258  }
259  }
260 
261  if (fixCM && apvf[vmed.first]) {
262  apvDetSet.push_back(SiStripProcessedRawDigi(-999.));
263  } else {
264  apvDetSet.push_back(SiStripProcessedRawDigi(vmed.second));
265  }
266  apvNb++;
267  }
268 
269  if (!apvDetSet.empty())
270  output_apvcm.push_back(std::move(apvDetSet));
271 }
T getParameter(std::string const &) const
OrphanHandle< PROD > put(std::unique_ptr< PROD > product)
Put a new product.
Definition: Event.h:131
void push_back(const T &t)
Definition: DetSet.h:67
std::vector< edm::DetSet< SiStripDigi > > output_base
std::vector< edm::DetSet< SiStripProcessedRawDigi > > output_baseline
def create(alignables, pedeDump, additionalData, outputFile, config)
bool getByToken(EDGetToken token, Handle< PROD > &result) const
Definition: Event.h:525
void produce(edm::Event &, const edm::EventSetup &) override
std::vector< std::tuple< std::string, zstoken_t > > hybridInputs
A signed Digi for the silicon strip detector, containing only adc information, and suitable for stori...
void processRaw(const edm::DetSetVector< SiStripRawDigi > &input, RawType inType)
std::vector< edm::DetSet< SiStripProcessedRawDigi > > output_apvcm
static std::string const input
Definition: EdmProvDump.cc:48
size_type size() const
Definition: DetSet.h:62
void reserve(size_t s)
Definition: DetSet.h:66
void storeExtraOutput(uint32_t, int16_t)
std::unique_ptr< SiStripRawProcessingAlgorithms > algorithms
std::vector< edm::DetSet< SiStripDigi > > output_baseline_points
std::vector< std::tuple< std::string, RawType, rawtoken_t > > rawInputs
#define end
Definition: vmac.h:39
A Digi for the silicon strip detector, containing both strip and adc information, and suitable for st...
Definition: SiStripDigi.h:12
void storeBaseline(uint32_t, const medians_t &)
std::vector< edm::DetSet< SiStripRawDigi > > output_base_raw
void storeCMN(uint32_t, const medians_t &)
std::vector< std::pair< short, float >> medians_t
void processHybrid(const edm::DetSetVector< SiStripDigi > &input)
SiStripZeroSuppression(const edm::ParameterSet &)
bool empty() const
Definition: DetSet.h:63
edm::DetSet< SiStripRawDigi > formatRawDigis(const edm::DetSet< SiStripRawDigi > &rawDigis)
#define begin
Definition: vmac.h:32
HLT enums.
det_id_type id
Definition: DetSet.h:80
void putOutputs(edm::Event &evt, const std::string &tagName)
A Digi for the silicon strip detector, containing only adc information, and suitable for storing raw ...
def move(src, dest)
Definition: eostools.py:511