CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
DigiPhase1Task.cc
Go to the documentation of this file.
2 
3 using namespace hcaldqm;
4 using namespace hcaldqm::constants;
5 using namespace hcaldqm::filter;
6 
8  DQTask(ps)
9 {
11  edm::InputTag("hcalDigis"));
13  edm::InputTag("hcalDigis"));
15  edm::InputTag("hcalDigis"));
16 
17  _tokHBHE = consumes<QIE11DigiCollection>(_tagHBHE);
18  _tokHO = consumes<HODigiCollection>(_tagHO);
19  _tokHF = consumes<QIE10DigiCollection>(_tagHF);
20 
21  _cutSumQ_HBHE = ps.getUntrackedParameter<double>("cutSumQ_HBHE", 20);
22  _cutSumQ_HO = ps.getUntrackedParameter<double>("cutSumQ_HO", 20);
23  _cutSumQ_HF = ps.getUntrackedParameter<double>("cutSumQ_HF", 20);
24  _thresh_unihf = ps.getUntrackedParameter<double>("thresh_unihf", 0.2);
25 
26  _vflags.resize(nDigiFlag);
27  _vflags[fUni]=hcaldqm::flag::Flag("UniSlotHF");
31 }
32 
34  edm::Run const& r, edm::EventSetup const& es)
35 {
36  DQTask::bookHistograms(ib,r,es);
37 
38  // GET WHAT YOU NEED
40  es.get<HcalDbRecord>().get(dbs);
41  _emap = dbs->getHcalMapping();
42  std::vector<int> vFEDs = hcaldqm::utilities::getFEDList(_emap);
43  std::vector<int> vFEDsVME = hcaldqm::utilities::getFEDVMEList(_emap);
44  std::vector<int> vFEDsuTCA = hcaldqm::utilities::getFEDuTCAList(_emap);
45  std::vector<uint32_t> vVME;
46  std::vector<uint32_t> vuTCA;
47  std::vector<uint32_t> vFEDHF;
51  FIBER_uTCA_MIN1, FIBERCH_MIN, false).rawId());
53  vVME);
55  vuTCA);
56  vFEDHF.push_back(HcalElectronicsId(22, SLOT_uTCA_MIN,
57  FIBER_uTCA_MIN1, FIBERCH_MIN, false).rawId());
58  vFEDHF.push_back(HcalElectronicsId(29, SLOT_uTCA_MIN,
59  FIBER_uTCA_MIN1, FIBERCH_MIN, false).rawId());
60  vFEDHF.push_back(HcalElectronicsId(32, SLOT_uTCA_MIN,
61  FIBER_uTCA_MIN1, FIBERCH_MIN, false).rawId());
62 
63  // initialize filters
65  vFEDHF);
66 
67  // push the rawIds of each fed into the vector...
68  for (std::vector<int>::const_iterator it=vFEDsVME.begin();
69  it!=vFEDsVME.end(); ++it)
70  _vhashFEDs.push_back(HcalElectronicsId(
72  (*it)-FED_VME_MIN).rawId());
73  for (std::vector<int>::const_iterator it=vFEDsuTCA.begin();
74  it!=vFEDsuTCA.end(); ++it)
75  {
76  std::pair<uint16_t, uint16_t> cspair = hcaldqm::utilities::fed2crate(*it);
77  _vhashFEDs.push_back(HcalElectronicsId(
78  cspair.first, cspair.second, FIBER_uTCA_MIN1,
79  FIBERCH_MIN, false).rawId());
80  }
81 
82  // INITIALIZE FIRST
108  _cTimingCut_FEDVME.initialize(_name, "TimingCut",
113  _cTimingCut_FEDuTCA.initialize(_name, "TimingCut",
120  new hcaldqm::quantity::FEDQuantity(vFEDsVME),
125  new hcaldqm::quantity::FEDQuantity(vFEDsuTCA),
128  _cTimingCutvsLS_FED.initialize(_name, "TimingvsLS",
132  _cTimingCut_depth.initialize(_name, "TimingCut",
137 
138  // Occupancy w/o a cut
139  _cOccupancy_FEDVME.initialize(_name, "Occupancy",
144  _cOccupancy_FEDuTCA.initialize(_name, "Occupancy",
151  new hcaldqm::quantity::FEDQuantity(vFEDsVME),
156  new hcaldqm::quantity::FEDQuantity(vFEDsuTCA),
159  _cOccupancyvsLS_Subdet.initialize(_name, "OccupancyvsLS",
163  _cOccupancy_depth.initialize(_name, "Occupancy",
168 
169  // Occupancy w/ a cut
170  _cOccupancyCut_FEDVME.initialize(_name, "OccupancyCut",
175  _cOccupancyCut_FEDuTCA.initialize(_name, "OccupancyCut",
182  new hcaldqm::quantity::FEDQuantity(vFEDsVME),
187  new hcaldqm::quantity::FEDQuantity(vFEDsuTCA),
190  _cOccupancyCutvsLS_Subdet.initialize(_name, "OccupancyCutvsLS",
194  _cOccupancyCut_depth.initialize(_name, "OccupancyCut",
199 
200  _cDigiSize_FED.initialize(_name, "DigiSize",
204 
205 
206  // BOOK HISTOGRAMS
207  char cutstr[200];
208  sprintf(cutstr, "_SumQHBHE%dHO%dHF%d", int(_cutSumQ_HBHE),
209  int(_cutSumQ_HO), int(_cutSumQ_HF));
210  char cutstr2[200];
211  sprintf(cutstr2, "_SumQHF%d", int(_cutSumQ_HF));
212 
214 
219 
221 
229 
241 
243 
244  // BOOK HISTOGRAMS that are only for Online
247 
248  // MARK THESE HISTOGRAMS AS LUMI BASED FOR OFFLINE PROCESSING
249  if (_ptype==fOffline)
250  {
253  }
254 
255  // book Number of Events vs LS histogram
256  ib.setCurrentFolder(_subsystem+"/RunInfo");
257  meNumEvents1LS = ib.book1D("NumberOfEvents", "NumberOfEvents",
258  1, 0, 1);
260 
261  // book the flag for unknown ids and the online guy as well
263  meUnknownIds1LS = ib.book1D("UnknownIds", "UnknownIds",
264  1, 0, 1);
265  _unknownIdsPresent = false;
267 }
268 
270 {
271  DQTask::_resetMonitors(uf);
272 
273  switch(uf)
274  {
275  case hcaldqm::f1LS:
276  _unknownIdsPresent = false;
277  break;
278  case hcaldqm::f50LS:
279  break;
280  default:
281  break;
282  }
283 }
284 
285 /* virtual */ void DigiPhase1Task::_process(edm::Event const& e,
286  edm::EventSetup const&)
287 {
291 
292  if (!e.getByToken(_tokHBHE, chbhe))
293  _logger.dqmthrow("Collection HBHEDigiCollection isn't available"
294  + _tagHBHE.label() + " " + _tagHBHE.instance());
295  if (!e.getByToken(_tokHO, cho))
296  _logger.dqmthrow("Collection HODigiCollection isn't available"
297  + _tagHO.label() + " " + _tagHO.instance());
298  if (!e.getByToken(_tokHF, chf))
299  _logger.dqmthrow("Collection HFDigiCollection isn't available"
300  + _tagHF.label() + " " + _tagHF.instance());
301 
302  // extract some info per event
303  meNumEvents1LS->Fill(0.5); // just increment
304 
305  // To fill histograms outside of the loop, you need to determine if there were
306  // any valid det ids first
307  uint32_t rawidValid = 0;
308  uint32_t rawidHBValid = 0;
309  uint32_t rawidHEValid = 0;
310 
311  // HB collection
312  int numChs = 0;
313  int numChsCut = 0;
314  int numChsHE = 0;
315  int numChsCutHE = 0;
316  for (QIE11DigiCollection::const_iterator it=chbhe->begin(); it!=chbhe->end();
317  ++it)
318  {
319  QIE11DataFrame const& frame = *it;
320  double sumQ = hcaldqm::utilities::sumQ_v10<QIE11DataFrame>(frame, 2.5, 0, frame.samples()-1);
321 
322  // Explicit check on the DetIds present in the Collection
323  HcalDetId const& did = frame.detid();
324  uint32_t rawid = _ehashmap.lookup(did);
325  if (rawid==0)
326  {meUnknownIds1LS->Fill(1); _unknownIdsPresent=true;continue;}
327  HcalElectronicsId const& eid(rawid);
328  if (did.subdet()==HcalBarrel)
329  rawidHBValid = did.rawId();
330  else if (did.subdet()==HcalEndcap)
331  rawidHEValid = did.rawId();
332 
333  // filter out channels that are masked out
334  if (_xQuality.exists(did))
335  {
336  HcalChannelStatus cs(did.rawId(), _xQuality.get(did));
337  if (
340  continue;
341  }
342 
343  _cSumQ_SubdetPM.fill(did, sumQ);
344  _cOccupancy_depth.fill(did);
345 
346  _cDigiSize_FED.fill(eid, frame.samples());
347  if (eid.isVMEid())
348  {
351  }
352  else
353  {
356  /*
357  if (!it->validate(0, it->size()))
358  {
359  _cCapIdRots_depth.fill(did);
360  _cCapIdRots_FEDuTCA.fill(eid, 1);
361  }*/
362  }
363 
364  for (int i=0; i<frame.samples(); i++)
365  {
366  _cADC_SubdetPM.fill(did, frame[i].adc());
367  _cfC_SubdetPM.fill(did,constants::adc2fC[frame[i].adc()]);
368  if (sumQ>_cutSumQ_HBHE)
369  _cShapeCut_FED.fill(eid, i, constants::adc2fC[frame[i].adc()]);
370  }
371 
372  if (sumQ>_cutSumQ_HBHE)
373  {
374  double timing = hcaldqm::utilities::aveTS_v10<QIE11DataFrame>(frame, 2.5, 0,
375  frame.samples()-1);
376  _cTimingCut_SubdetPM.fill(did, timing);
377  _cTimingCut_depth.fill(did, timing);
379  _cTimingCutvsLS_FED.fill(eid, _currentLS, timing);
380  _cSumQ_depth.fill(did, sumQ);
381  _cSumQvsLS_SubdetPM.fill(did, _currentLS, sumQ);
382 
383  if (eid.isVMEid())
384  {
385  _cTimingCut_FEDVME.fill(eid, timing);
386  _cTimingCut_ElectronicsVME.fill(eid, timing);
389  }
390  else
391  {
392  _cTimingCut_FEDuTCA.fill(eid, timing);
393  _cTimingCut_ElectronicsuTCA.fill(eid, timing);
396  }
397  did.subdet()==HcalBarrel?numChsCut++:numChsCutHE++;
398  }
399  did.subdet()==HcalBarrel?numChs++:numChsHE++;
400  }
401 
402  if (rawidHBValid!=0 && rawidHEValid!=0)
403  {
405  numChs);
407  numChsHE);
408 
409  }
410  numChs=0;
411  numChsCut = 0;
412 
413  // reset
414  rawidValid = 0;
415 
416  // HO collection
417  for (HODigiCollection::const_iterator it=cho->begin(); it!=cho->end();
418  ++it)
419  {
420  double sumQ = hcaldqm::utilities::sumQ<HODataFrame>(*it, 8.5, 0, it->size()-1);
421 
422  // Explicit check on the DetIds present in the Collection
423  HcalDetId const& did = it->id();
424  uint32_t rawid = _ehashmap.lookup(did);
425  if (rawid==0)
426  {meUnknownIds1LS->Fill(1); _unknownIdsPresent=true;continue;}
427  HcalElectronicsId const& eid(rawid);
428  if (did.subdet()==HcalOuter)
429  rawidValid = did.rawId();
430 
431  // filter out channels that are masked out
432  if (_xQuality.exists(did))
433  {
434  HcalChannelStatus cs(did.rawId(), _xQuality.get(did));
435  if (
438  continue;
439  }
440 
441  _cSumQ_SubdetPM.fill(did, sumQ);
442  _cOccupancy_depth.fill(did);
443  _cDigiSize_FED.fill(eid, it->size());
444  if (eid.isVMEid())
445  {
448  /*
449  if (!it->validate(0, it->size()))
450  _cCapIdRots_FEDVME.fill(eid, 1);
451  */
452  }
453  else
454  {
457  /*
458  if (!it->validate(0, it->size()))
459  _cCapIdRots_FEDuTCA.fill(eid, 1);*/
460  }
461 
462  for (int i=0; i<it->size(); i++)
463  {
464  _cADC_SubdetPM.fill(did, it->sample(i).adc());
465  _cfC_SubdetPM.fill(did, it->sample(i).nominal_fC());
466  if (sumQ>_cutSumQ_HO)
467  _cShapeCut_FED.fill(eid, i, it->sample(i).nominal_fC());
468  }
469 
470  if (sumQ>_cutSumQ_HO)
471  {
472  double timing = hcaldqm::utilities::aveTS<HODataFrame>(*it, 8.5, 0,
473  it->size()-1);
474  _cSumQ_depth.fill(did, sumQ);
475  _cSumQvsLS_SubdetPM.fill(did, _currentLS, sumQ);
477  _cTimingCut_SubdetPM.fill(did, timing);
478  _cTimingCut_depth.fill(did, timing);
479  _cTimingCutvsLS_FED.fill(eid, _currentLS, timing);
480 
481  if (eid.isVMEid())
482  {
483  _cTimingCut_FEDVME.fill(eid, timing);
484  _cTimingCut_ElectronicsVME.fill(eid, timing);
487  }
488  else
489  {
490  _cTimingCut_FEDuTCA.fill(eid, timing);
491  _cTimingCut_ElectronicsuTCA.fill(eid, timing);
494  }
495  numChsCut++;
496  }
497  numChs++;
498  }
499 
500  if (rawidValid!=0)
501  {
503  numChs);
504  }
505  numChs=0; numChsCut=0;
506 
507  // reset
508  rawidValid = 0;
509 
510  // HF collection
511  for (QIE10DigiCollection::const_iterator it=chf->begin(); it!=chf->end();
512  ++it)
513  {
514  QIE10DataFrame frame = *it;
515  double sumQ = hcaldqm::utilities::sumQ_v10<QIE10DataFrame>(frame,
516  2.5, 0, frame.samples()-1);
517 
518  // Explicit check on the DetIds present in the Collection
519  HcalDetId const& did = it->id();
520  uint32_t rawid = _ehashmap.lookup(did);
521  if (rawid==0)
522  {meUnknownIds1LS->Fill(1); _unknownIdsPresent=true;continue;}
523  HcalElectronicsId const& eid(rawid);
524  if (did.subdet()==HcalForward)
525  rawidValid = did.rawId();
526 
527  // filter out channels that are masked out
528  if (_xQuality.exists(did))
529  {
530  HcalChannelStatus cs(did.rawId(), _xQuality.get(did));
531  if (
534  continue;
535  }
536 
537  _cSumQ_SubdetPM.fill(did, sumQ);
538  _cOccupancy_depth.fill(did);
539  _cDigiSize_FED.fill(eid, frame.samples());
540  if (eid.isVMEid())
541  {
544  /*
545  if (!it->validate(0, it->size()))
546  _cCapIdRots_FEDVME.fill(eid, 1);*/
547  }
548  else
549  {
552  /*
553  if (!it->validate(0, it->size()))
554  _cCapIdRots_FEDuTCA.fill(eid, 1);*/
555  }
556 
557  for (int i=0; i<frame.samples(); i++)
558  {
559  _cADC_SubdetPM.fill(did, frame[i].adc());
560  _cfC_SubdetPM.fill(did, constants::adc2fC[frame[i].adc()]);
561  if (sumQ>_cutSumQ_HF)
562  _cShapeCut_FED.fill(eid, i, constants::adc2fC[frame[i].adc()]);
563  }
564 
565  if (sumQ>_cutSumQ_HF)
566  {
567  double timing = hcaldqm::utilities::aveTS_v10<QIE10DataFrame>(frame, 2.5, 0,
568  frame.samples()-1);
569 
570  _cSumQ_depth.fill(did, sumQ);
571  _cSumQvsLS_SubdetPM.fill(did, _currentLS, sumQ);
572 
573  _cTimingCut_SubdetPM.fill(did, timing);
574  _cTimingCut_depth.fill(did, timing);
575  _cTimingCutvsLS_FED.fill(eid, _currentLS, timing);
577  if (eid.isVMEid())
578  {
579  _cTimingCut_FEDVME.fill(eid, timing);
580  _cTimingCut_ElectronicsVME.fill(eid, timing);
583  }
584  else
585  {
586  _cTimingCut_FEDuTCA.fill(eid, timing);
587  _cTimingCut_ElectronicsuTCA.fill(eid, timing);
590  }
591  numChsCut++;
592  }
593  numChs++;
594  }
595 
596  if (rawidValid!=0)
597  {
599  numChs);
600 
601  }
602 }
603 
605  edm::LuminosityBlock const& lb, edm::EventSetup const& es)
606 {
607  DQTask::beginLuminosityBlock(lb, es);
608 }
609 
611  edm::EventSetup const& es)
612 {
613  DQTask::endLuminosityBlock(lb, es);
614 }
615 
617 
int adc(sample_type sample)
get the ADC sample (12 bits)
int samples() const
total number of samples in the digi
hcaldqm::ContainerProf2D _cTimingCut_FEDVME
T getUntrackedParameter(std::string const &, T const &) const
int i
Definition: DBlmapReader.cc:9
virtual void bookHistograms(DQMStore::IBooker &, edm::Run const &, edm::EventSetup const &)
hcaldqm::Container1D _cADC_SubdetPM
virtual void initialize(std::string const &folder, hashfunctions::HashType, Quantity *, Quantity *qy=new ValueQuantity(quantity::fN), int debug=0)
Definition: Container1D.cc:40
auto_ptr< ClusterSequence > cs
virtual bool exists(HcalDetId const &)
Definition: ContainerXXX.h:267
hcaldqm::ContainerProf2D _cSumQ_depth
int const CRATE_VME_MIN
Definition: Constants.h:60
virtual void beginLuminosityBlock(edm::LuminosityBlock const &, edm::EventSetup const &)
int ib
Definition: cuy.py:660
edm::InputTag _tagHF
boost::transform_iterator< IterHelp, boost::counting_iterator< int > > const_iterator
hcaldqm::ContainerProf1D _cTimingCutvsLS_FED
std::pair< uint16_t, uint16_t > fed2crate(int fed)
Definition: Utilities.cc:13
uint32_t rawId() const
virtual void endLuminosityBlock(edm::LuminosityBlock const &, edm::EventSetup const &)
bool getByToken(EDGetToken token, Handle< PROD > &result) const
Definition: Event.h:457
void initialize(HcalElectronicsMap const *, ElectronicsMapType etype=fHcalElectronicsMap)
DigiPhase1Task(edm::ParameterSet const &)
#define DEFINE_FWK_MODULE(type)
Definition: MakerMacros.h:17
hcaldqm::ContainerProf1D _cOccupancyCutvsLS_Subdet
edm::EDGetTokenT< HODigiCollection > _tokHO
UpdateFreq
Definition: DQTask.h:17
std::vector< HODataFrame >::const_iterator const_iterator
virtual void _process(edm::Event const &, edm::EventSetup const &)
virtual void _resetMonitors(hcaldqm::UpdateFreq)
int const SPIGOT_MIN
Definition: Constants.h:85
hcaldqm::Container1D _cTimingCut_SubdetPM
MonitorElement * meNumEvents1LS
hcaldqm::Container2D _cOccupancyCut_depth
std::vector< uint32_t > _vhashFEDs
int const FIBER_VME_MIN
Definition: Constants.h:90
hcaldqm::ContainerProf2D _cTimingCut_ElectronicsVME
void bookHistograms(fwlite::EventContainer &eventCont)
std::vector< hcaldqm::flag::Flag > _vflags
int const FIBERCH_MIN
Definition: Constants.h:100
hcaldqm::Container1D _cShapeCut_FED
void Fill(long long x)
std::vector< int > getFEDVMEList(HcalElectronicsMap const *)
Definition: Utilities.cc:78
hcaldqm::filter::HashFilter _filter_VME
double _cutSumQ_HBHE
MonitorElement * meUnknownIds1LS
hcaldqm::ContainerProf2D _cTimingCut_depth
ProcessingType _ptype
Definition: DQModule.h:59
virtual void fill(uint32_t)
Definition: Container1D.cc:82
virtual void initialize(std::string const &folder, hashfunctions::HashType, Quantity *, Quantity *, int debug=0)
hcaldqm::electronicsmap::ElectronicsMap _dhashmap
void dqmthrow(std::string const &msg) const
Definition: Logger.h:15
ContainerXXX< uint32_t > _xQuality
Definition: DQTask.h:62
int const FED_VME_MIN
Definition: Constants.h:47
hcaldqm::ContainerProf2D _cTimingCut_ElectronicsuTCA
virtual void initialize(std::string const &folder, hashfunctions::HashType, Quantity *, Quantity *, Quantity *qz=new ValueQuantity(quantity::fEnergy), int debug=0)
MonitorElement * book1D(Args &&...args)
Definition: DQMStore.h:115
virtual void initialize(std::string const &folder, hashfunctions::HashType, Quantity *, Quantity *, Quantity *qz=new ValueQuantity(quantity::fN), int debug=0)
Definition: Container2D.cc:32
int const FIBER_uTCA_MIN1
Definition: Constants.h:93
HcalElectronicsMap const * _emap
Logger _logger
Definition: DQModule.h:70
hcaldqm::Container2D _cOccupancyCut_FEDVME
hcaldqm::filter::HashFilter _filter_uTCA
std::string _name
Definition: DQModule.h:57
virtual void book(DQMStore::IBooker &, HcalElectronicsMap const *, std::string subsystem="Hcal", std::string aux="")
int const CRATE_uTCA_MIN
Definition: Constants.h:65
double const adc2fC[256]
Definition: Constants.h:221
bool isVMEid() const
hcaldqm::Container1D _cDigiSize_FED
void setCurrentFolder(const std::string &fullpath)
Definition: DQMStore.cc:277
hcaldqm::electronicsmap::ElectronicsMap _ehashmap
edm::EDGetTokenT< QIE10DigiCollection > _tokHF
virtual void book(DQMStore::IBooker &, HcalElectronicsMap const *, std::string subsystem="Hcal", std::string aux="")
Definition: Container1D.cc:957
hcaldqm::ContainerProf2D _cTimingCut_FEDuTCA
const T & get() const
Definition: EventSetup.h:56
double _thresh_unihf
edm::InputTag _tagHO
hcaldqm::Container2D _cOccupancy_FEDVME
hcaldqm::Container2D _cOccupancy_ElectronicsVME
hcaldqm::ContainerProf1D _cSumQvsLS_SubdetPM
std::string const & label() const
Definition: InputTag.h:36
hcaldqm::Container2D _cOccupancy_ElectronicsuTCA
virtual STDTYPE & get(HcalDetId const &)
Definition: ContainerXXX.h:249
virtual void setLumiFlag()
hcaldqm::Container2D _cOccupancyCut_FEDuTCA
std::vector< int > getFEDList(HcalElectronicsMap const *)
Definition: Utilities.cc:54
edm::InputTag _tagHBHE
hcaldqm::Container2D _cOccupancyCut_ElectronicsuTCA
std::vector< int > getFEDuTCAList(HcalElectronicsMap const *)
Definition: Utilities.cc:104
virtual void fill(HcalDetId const &) override
Definition: Container2D.cc:59
std::string _subsystem
Definition: DQModule.h:64
hcaldqm::Container1D _cSumQ_SubdetPM
hcaldqm::filter::HashFilter _filter_FEDHF
virtual void initialize(FilterType ftype, HashType htype, std::vector< uint32_t > const &)
Definition: HashFilter.cc:26
void setLumiFlag(void)
this ME is meant to be stored for each luminosity section
virtual void book(DQMStore::IBooker &, HcalElectronicsMap const *, std::string subsystem="Hcal", std::string aux="") override
Definition: Container2D.cc:895
hcaldqm::Container2D _cOccupancyCut_ElectronicsVME
virtual void book(DQMStore::IBooker &, HcalElectronicsMap const *, std::string subsystem="Hcal", std::string aux="")
int samples() const
total number of samples in the digi
hcaldqm::Container2D _cOccupancy_depth
Readout chain identification for Hcal.
std::string const & instance() const
Definition: InputTag.h:37
hcaldqm::Container1D _cfC_SubdetPM
edm::EDGetTokenT< QIE11DigiCollection > _tokHBHE
int const SLOT_uTCA_MIN
Definition: Constants.h:72
Definition: Run.h:42
double sumQ(DIGI const &digi, double ped, int i=0, int j=3)
Definition: Utilities.h:79
hcaldqm::ContainerProf1D _cOccupancyvsLS_Subdet
hcaldqm::Container2D _cOccupancy_FEDuTCA