CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Groups Pages
GEMRawToDigiModule.cc
Go to the documentation of this file.
1 
31 
32 class GEMRawToDigiModule : public edm::global::EDProducer<edm::RunCache<GEMROMapping> > {
33 public:
36 
37  // global::EDProducer
38  std::shared_ptr<GEMROMapping> globalBeginRun(edm::Run const&, edm::EventSetup const&) const override;
39  void produce(edm::StreamID, edm::Event&, edm::EventSetup const&) const override;
40  void globalEndRun(edm::Run const&, edm::EventSetup const&) const override{};
41 
42  // Fill parameters descriptions
43  static void fillDescriptions(edm::ConfigurationDescriptions& descriptions);
44 
45 private:
49  unsigned int fedIdStart_, fedIdEnd_;
50  std::unique_ptr<GEMRawToDigi> gemRawToDigi_;
51 };
52 
55 
57  : fed_token(consumes<FEDRawDataCollection>(pset.getParameter<edm::InputTag>("InputLabel"))),
58  useDBEMap_(pset.getParameter<bool>("useDBEMap")),
59  keepDAQStatus_(pset.getParameter<bool>("keepDAQStatus")),
60  readMultiBX_(pset.getParameter<bool>("readMultiBX")),
61  fedIdStart_(pset.getParameter<unsigned int>("fedIdStart")),
62  fedIdEnd_(pset.getParameter<unsigned int>("fedIdEnd")),
63  gemRawToDigi_(std::make_unique<GEMRawToDigi>()) {
64  produces<GEMDigiCollection>();
65  if (keepDAQStatus_) {
66  produces<GEMAMC13StatusCollection>("AMC13Status");
67  produces<GEMAMCStatusCollection>("AMCStatus");
68  produces<GEMOHStatusCollection>("OHStatus");
69  produces<GEMVFATStatusCollection>("VFATStatus");
70  }
71  if (useDBEMap_) {
72  gemEMapToken_ = esConsumes<GEMeMap, GEMeMapRcd, edm::Transition::BeginRun>();
73  }
74 }
75 
78  desc.add<edm::InputTag>("InputLabel", edm::InputTag("rawDataCollector"));
79  desc.add<bool>("useDBEMap", false);
80  desc.add<bool>("keepDAQStatus", false);
81  desc.add<bool>("readMultiBX", false);
82  desc.add<unsigned int>("fedIdStart", FEDNumbering::MINGEMFEDID);
83  desc.add<unsigned int>("fedIdEnd", FEDNumbering::MAXGEMFEDID);
84  descriptions.add("muonGEMDigisDefault", desc);
85 }
86 
87 std::shared_ptr<GEMROMapping> GEMRawToDigiModule::globalBeginRun(edm::Run const&, edm::EventSetup const& iSetup) const {
88  auto gemROmap = std::make_shared<GEMROMapping>();
89  if (useDBEMap_) {
90  const auto& eMap = iSetup.getData(gemEMapToken_);
91  auto gemEMap = std::make_unique<GEMeMap>(eMap);
92  gemEMap->convert(*gemROmap);
93  gemEMap.reset();
94  } else {
95  // no EMap in DB, using dummy
96  auto gemEMap = std::make_unique<GEMeMap>();
97  gemEMap->convertDummy(*gemROmap);
98  gemEMap.reset();
99  }
100  return gemROmap;
101 }
102 
104  auto outGEMDigis = std::make_unique<GEMDigiCollection>();
105  auto outAMC13Status = std::make_unique<GEMAMC13StatusCollection>();
106  auto outAMCStatus = std::make_unique<GEMAMCStatusCollection>();
107  auto outOHStatus = std::make_unique<GEMOHStatusCollection>();
108  auto outVFATStatus = std::make_unique<GEMVFATStatusCollection>();
109 
110  // Take raw from the event
112  iEvent.getByToken(fed_token, fed_buffers);
113 
114  auto gemROMap = runCache(iEvent.getRun().index());
115 
116  for (unsigned int fedId = fedIdStart_; fedId <= fedIdEnd_; ++fedId) {
117  const FEDRawData& fedData = fed_buffers->FEDData(fedId);
118 
119  int nWords = fedData.size() / sizeof(uint64_t);
120  LogDebug("GEMRawToDigiModule") << "fedId:" << fedId << " words: " << nWords;
121  GEMAMC13Status st_amc13(fedData);
122  if (st_amc13.isBad()) {
123  LogDebug("GEMRawToDigiModule") << st_amc13;
124  if (keepDAQStatus_) {
125  outAMC13Status.get()->insertDigi(fedId, st_amc13);
126  }
127  continue;
128  }
129 
130  const uint64_t* word = reinterpret_cast<const uint64_t*>(fedData.data());
131  auto amc13 = gemRawToDigi_->convertWordToGEMAMC13(word);
132  LogDebug("GEMRawToDigiModule") << "Event bx:" << iEvent.bunchCrossing() << " lv1Id:" << iEvent.id().event()
133  << " orbitNumber:" << iEvent.orbitNumber();
134  LogDebug("GEMRawToDigiModule") << "AMC13 bx:" << amc13->bunchCrossing() << " lv1Id:" << int(amc13->lv1Id())
135  << " orbitNumber:" << amc13->orbitNumber();
136 
137  // Read AMC data
138  for (const auto& amc : *(amc13->getAMCpayloads())) {
139  uint8_t amcNum = amc.amcNum();
140  GEMROMapping::sectorEC amcEC{fedId, amcNum};
141  if (!gemROMap->isValidAMC(amcEC)) {
142  st_amc13.inValidAMC();
143  continue;
144  }
145 
146  GEMAMCStatus st_amc(amc13.get(), amc);
147  if (st_amc.isBad()) {
148  LogDebug("GEMRawToDigiModule") << st_amc;
149  if (keepDAQStatus_) {
150  outAMCStatus.get()->insertDigi(fedId, st_amc);
151  }
152  continue;
153  }
154 
155  uint16_t amcBx = amc.bunchCrossing();
156  LogDebug("GEMRawToDigiModule") << "AMC no.:" << int(amc.amcNum()) << " bx:" << int(amc.bunchCrossing())
157  << " lv1Id:" << int(amc.lv1Id()) << " orbitNumber:" << int(amc.orbitNumber());
158 
159  // Read GEB data
160  for (const auto& optoHybrid : *amc.gebs()) {
161  uint8_t gebId = optoHybrid.inputID();
162  GEMROMapping::chamEC geb_ec{fedId, amcNum, gebId};
163 
164  bool isValidChamber = gemROMap->isValidChamber(geb_ec);
165  if (!isValidChamber) {
166  st_amc.inValidOH();
167  continue;
168  }
169  GEMROMapping::chamDC geb_dc = gemROMap->chamberPos(geb_ec);
170  GEMDetId gemChId = geb_dc.detId;
171 
172  GEMOHStatus st_oh(optoHybrid);
173  if (st_oh.isBad()) {
174  LogDebug("GEMRawToDigiModule") << st_oh;
175  if (keepDAQStatus_) {
176  outOHStatus.get()->insertDigi(gemChId, st_oh);
177  }
178  }
179 
180  //Read vfat data
181  for (auto vfat : *optoHybrid.vFATs()) {
182  // set vfat fw version
183  vfat.setVersion(geb_dc.vfatVer);
184  uint16_t vfatId = vfat.vfatId();
185  GEMROMapping::vfatEC vfat_ec{vfatId, gemChId};
186 
187  if (!gemROMap->isValidChipID(vfat_ec)) {
188  st_oh.inValidVFAT();
189  continue;
190  }
191 
192  GEMROMapping::vfatDC vfat_dc = gemROMap->vfatPos(vfat_ec);
193  vfat.setPhi(vfat_dc.localPhi);
194  GEMDetId gemId = vfat_dc.detId;
195 
196  GEMVFATStatus st_vfat(amc, vfat, vfat.phi(), readMultiBX_);
197  if (st_vfat.isBad()) {
198  LogDebug("GEMRawToDigiModule") << st_vfat;
199  if (keepDAQStatus_) {
200  outVFATStatus.get()->insertDigi(gemId, st_vfat);
201  }
202  continue;
203  }
204 
205  int bx(vfat.bc() - amcBx);
206 
207  for (int chan = 0; chan < GEMVFAT::nChannels; ++chan) {
208  uint8_t chan0xf = 0;
209  if (chan < 64)
210  chan0xf = ((vfat.lsData() >> chan) & 0x1);
211  else
212  chan0xf = ((vfat.msData() >> (chan - 64)) & 0x1);
213 
214  // no hits
215  if (chan0xf == 0)
216  continue;
217 
218  GEMROMapping::channelNum chMap{vfat_dc.vfatType, chan};
219  GEMROMapping::stripNum stMap = gemROMap->hitPos(chMap);
220 
221  int stripId = stMap.stNum + vfat.phi() * GEMeMap::maxChan_;
222 
223  GEMDigi digi(stripId, bx);
224 
225  LogDebug("GEMRawToDigiModule")
226  << "fed: " << fedId << " amc:" << int(amcNum) << " geb:" << int(gebId) << " vfat id:" << int(vfatId)
227  << ",type:" << vfat_dc.vfatType << " id:" << gemId << " ch:" << chMap.chNum << " st:" << digi.strip()
228  << " bx:" << digi.bx();
229 
230  outGEMDigis.get()->insertDigi(gemId, digi);
231 
232  } // end of channel loop
233 
234  if (keepDAQStatus_) {
235  outVFATStatus.get()->insertDigi(gemId, st_vfat);
236  }
237 
238  } // end of vfat loop
239 
240  if (keepDAQStatus_) {
241  outOHStatus.get()->insertDigi(gemChId, st_oh);
242  }
243 
244  } // end of optohybrid loop
245 
246  if (keepDAQStatus_) {
247  outAMCStatus.get()->insertDigi(fedId, st_amc);
248  }
249 
250  } // end of amc loop
251 
252  if (keepDAQStatus_) {
253  outAMC13Status.get()->insertDigi(fedId, st_amc13);
254  }
255 
256  } // end of amc13
257 
258  iEvent.put(std::move(outGEMDigis));
259 
260  if (keepDAQStatus_) {
261  iEvent.put(std::move(outAMC13Status), "AMC13Status");
262  iEvent.put(std::move(outAMCStatus), "AMCStatus");
263  iEvent.put(std::move(outOHStatus), "OHStatus");
264  iEvent.put(std::move(outVFATStatus), "VFATStatus");
265  }
266 }
EventNumber_t event() const
Definition: EventID.h:40
OrphanHandle< PROD > put(std::unique_ptr< PROD > product)
Put a new product.
Definition: Event.h:133
edm::ESGetToken< GEMeMap, GEMeMapRcd > gemEMapToken_
bool getByToken(EDGetToken token, Handle< PROD > &result) const
Definition: Event.h:539
#define DEFINE_FWK_MODULE(type)
Definition: MakerMacros.h:16
tuple chan
lumi = TPaveText(lowX+0.38, lowY+0.061, lowX+0.45, lowY+0.161, &quot;NDC&quot;) lumi.SetBorderSize( 0 ) lumi...
int16_t bx() const
Definition: GEMDigi.h:27
int bunchCrossing() const
Definition: EventBase.h:64
Run const & getRun() const
Definition: Event.cc:112
static const int maxChan_
Definition: GEMeMap.h:72
void inValidVFAT()
Definition: GEMOHStatus.h:61
size_t size() const
Lenght of the data buffer in bytes.
Definition: FEDRawData.h:45
static const int nChannels
Definition: GEMVFAT.h:116
edm::EDGetTokenT< FEDRawDataCollection > fed_token
void globalEndRun(edm::Run const &, edm::EventSetup const &) const override
bool getData(T &iHolder) const
Definition: EventSetup.h:128
void produce(edm::StreamID, edm::Event &, edm::EventSetup const &) const override
uint64_t word
int iEvent
Definition: GenABIO.cc:224
double amc
Definition: hdecay.h:20
uint16_t strip() const
Definition: GEMDigi.h:26
static void fillDescriptions(edm::ConfigurationDescriptions &descriptions)
def move
Definition: eostools.py:511
bool isBad() const
Definition: GEMOHStatus.h:67
RunIndex index() const
Definition: Run.cc:26
int orbitNumber() const
Definition: EventBase.h:65
ParameterDescriptionBase * add(U const &iLabel, T const &value)
GEMRawToDigiModule(const edm::ParameterSet &pset)
Constructor.
unsigned long long uint64_t
Definition: Time.h:13
void add(std::string const &label, ParameterSetDescription const &psetDescription)
std::unique_ptr< GEMRawToDigi > gemRawToDigi_
edm::EventID id() const
Definition: EventBase.h:59
std::shared_ptr< GEMROMapping > globalBeginRun(edm::Run const &, edm::EventSetup const &) const override
bool isBad() const
const unsigned char * data() const
Return a const pointer to the beginning of the data buffer.
Definition: FEDRawData.cc:24
Definition: Run.h:45
#define LogDebug(id)