CMS 3D CMS Logo

HcalPatternSource.cc
Go to the documentation of this file.
11 #include <wordexp.h>
12 #include <cstdio>
13 
15  bunches_(pset.getUntrackedParameter<std::vector<int> >("Bunches",std::vector<int>())),
16  presamples_(pset.getUntrackedParameter<int>("Presamples",4)),
17  samples_(pset.getUntrackedParameter<int>("Samples",10))
18 {
20  produces<HBHEDigiCollection>();
21  produces<HODigiCollection>();
22  produces<HFDigiCollection>();
23 }
24 
26  if (e.id().event()>bunches_.size()) return;
27 
29  es.get<HcalElectronicsMapRcd>().get(item);
30  const HcalElectronicsMap *elecmap=item.product();
31 
32  auto hbhe = std::make_unique<HBHEDigiCollection>();
33  auto hf = std::make_unique<HFDigiCollection>();
34  auto ho = std::make_unique<HODigiCollection>();
35 
36  int bc=bunches_[e.id().event()-1];
37  for (std::vector<HcalFiberPattern>::iterator i=patterns_.begin(); i!=patterns_.end(); i++) {
38  std::vector<HcalQIESample> samples;
39  for (int fc=0; fc<3; fc++) {
40  samples=i->getSamples(bc,presamples_, samples_, fc);
41  HcalElectronicsId eid=i->getId(fc);
42 
43  HcalDetId did(elecmap->lookup(eid));
44 
45  if (did.null()) {
46  edm::LogWarning("HCAL") << "No electronics map match for id " << eid;
47  continue;
48  }
49 
50  switch (did.subdet()) {
51  case (HcalBarrel):
52  case (HcalEndcap):
53  hbhe->push_back(HBHEDataFrame(did));
54  hbhe->back().setSize(samples_);
55  hbhe->back().setPresamples(presamples_);
56  for (int i=0; i<samples_; i++) hbhe->back().setSample(i,samples[i]);
57  hbhe->back().setReadoutIds(eid);
58  break;
59  case (HcalForward):
60  hf->push_back(HFDataFrame(did));
61  hf->back().setSize(samples_);
62  hf->back().setPresamples(presamples_);
63  for (int i=0; i<samples_; i++) hf->back().setSample(i,samples[i]);
64  hf->back().setReadoutIds(eid);
65  break;
66  case (HcalOuter) :
67  ho->push_back(HODataFrame(did));
68  ho->back().setSize(samples_);
69  ho->back().setPresamples(presamples_);
70  for (int i=0; i<samples_; i++) ho->back().setSample(i,samples[i]);
71  ho->back().setReadoutIds(eid);
72  break;
73  default: continue;
74  }
75  }
76  }
77  hbhe->sort();
78  ho->sort();
79  hf->sort();
80 
81  e.put(std::move(hbhe));
82  e.put(std::move(ho));
83  e.put(std::move(hf));
84 }
85 
87  wordexp_t p;
88  char** files;
89  wordexp(patspec.c_str(),&p, WRDE_NOCMD); // do not run shell commands!
90  files=p.we_wordv;
91  for (unsigned int i=0; i<p.we_wordc; i++) {
92  LogDebug ("HCAL") << "Reading pattern file '" << files[i] << "'";
93  loadPatternFile(files[i]);
94  LogDebug ("HCAL") << "Fibers so far " << patterns_.size();
95  }
96  wordfree(&p);
97 }
98 
101  std::string buffer, element;
102  std::map<std::string,std::string> params;
103  std::vector<uint32_t> data;
104  FILE* f=fopen(filename.c_str(), "r");
105  if (f==nullptr) return;
106  else {
107  char block[4096];
108  while (!feof(f)) {
109  int read=fread(block,1,4096,f);
110  buffer.append(block,block+read);
111  }
112  fclose(f);
113  }
114  if (buffer.find("<?xml")!=0) {
115  throw cms::Exception("InvalidFormat") << "Not a valid XML file: " << filename;
116  }
118  while (buffer.find("<CFGBrick>",i)!=std::string::npos) {
119  i=buffer.find("<CFGBrick>",i);
120  j=buffer.find("</CFGBrick>",i);
121  element="<?xml version='1.0'?>\n";
122  element.append(buffer,i,j-i);
123  element.append("</CFGBrick>");
124  // LogDebug("HCAL") << element;
125  params.clear();
126  data.clear();
127  parser.parse(element,params,data);
128  patterns_.push_back(HcalFiberPattern(params,data));
129  i=j+5;
130  }
131 
132 
133 }
#define LogDebug(id)
void loadPatternFile(const std::string &filename)
EventNumber_t event() const
Definition: EventID.h:41
T getUntrackedParameter(std::string const &, T const &) const
void parse(const std::string &xmlDocument, std::map< std::string, std::string > &parameters, std::vector< std::string > &items, std::string &encoding)
OrphanHandle< PROD > put(std::unique_ptr< PROD > product)
Put a new product.
Definition: Event.h:137
void produce(edm::Event &e, const edm::EventSetup &c) override
void loadPatterns(const std::string &patspec)
uint16_t size_type
std::vector< int > bunches_
double f[11][100]
std::vector< HcalFiberPattern > patterns_
HcalPatternSource(const edm::ParameterSet &pset)
edm::EventID id() const
Definition: EventBase.h:60
char data[epos_bytes_allocation]
Definition: EPOS_Wrapper.h:82
T get() const
Definition: EventSetup.h:63
T const * product() const
Definition: ESHandle.h:86
Readout chain identification for Hcal.
const DetId lookup(HcalElectronicsId fId) const
lookup the logical detid associated with the given electronics id
def move(src, dest)
Definition: eostools.py:510