CMS 3D CMS Logo

List of all members | Public Member Functions | Private Member Functions | Private Attributes
cscdqm::Dispatcher Class Reference

CSCDQM Framework frontend and Histogram Cache controller. More...

#include <CSCDQM_Dispatcher.h>

Public Member Functions

void book ()
 
 Dispatcher (Configuration *const p_config, MonitorObjectProvider *const p_provider)
 Constructor. More...
 
const bool getHisto (const HistoDef &histoD, MonitorObject *&me)
 Global get MO function. If request has reached this function it means that histo is not in cache! More...
 
void init ()
 Initialize Dispatcher: book histograms, init processor, etc. More...
 
unsigned int maskHWElements (std::vector< std::string > &tokens)
 Mask HW elements from the efficiency calculations. Can be applied on runtime! More...
 
void processStandby (HWStandbyType &standby)
 Set HW Standby modes. More...
 
void updateFractionAndEfficiencyHistos ()
 On demand update fraction and efficiency MOs. More...
 
 ~Dispatcher ()
 Destructor. Joins and waits to complete all threads. More...
 

Private Member Functions

void commonConstruct (Configuration *const p_config, MonitorObjectProvider *const p_provider)
 
void updateFractionAndEfficiencyHistosAuto ()
 Automatically called fraction and efficiency MOs update function. More...
 

Private Attributes

Cache cache
 
Collection collection
 
Configurationconfig
 
EventProcessor processor
 
EventProcessorMutex processorFract
 
MonitorObjectProviderprovider
 

Detailed Description

CSCDQM Framework frontend and Histogram Cache controller.

Definition at line 122 of file CSCDQM_Dispatcher.h.

Constructor & Destructor Documentation

cscdqm::Dispatcher::Dispatcher ( Configuration *const  p_config,
MonitorObjectProvider *const  p_provider 
)

Constructor.

Parameters
p_configPointer to Global Configuration
p_providerPointer to MonitorObjectProvider
Returns

Definition at line 29 of file CSCDQM_Dispatcher.cc.

References collection, commonConstruct(), processor, and processorFract.

29  :
30  collection(p_config), processor(p_config), processorFract(p_config) {
31  commonConstruct( p_config, p_provider );
32 }
EventProcessorMutex processorFract
EventProcessor processor
void commonConstruct(Configuration *const p_config, MonitorObjectProvider *const p_provider)
cscdqm::Dispatcher::~Dispatcher ( )
inline

Destructor. Joins and waits to complete all threads.

Definition at line 136 of file CSCDQM_Dispatcher.h.

References StGenEvtProducer_cfi::init, cscdqm::EventProcessorMutex::maskHWElements(), cscdqm::EventProcessorMutex::processStandby(), and cscdqm::EventProcessorMutex::updateFractionAndEfficiencyHistos().

136  {
137 #ifdef DQMMT
138  threads.join_all();
139 #endif
140  }

Member Function Documentation

void cscdqm::Dispatcher::book ( )

For the first FED - book general

For the first DDU - book general

For the first and specific CSCs - book general and specific

No DMB in slot 6

For the Parameters - book parameter histograms

Definition at line 91 of file CSCDQM_Dispatcher.cc.

References cscdqm::Collection::bookCSCHistos(), cscdqm::Collection::bookDDUHistos(), cscdqm::Collection::bookEMUHistos(), cscdqm::Collection::bookFEDHistos(), cscdqm::MonitorObjectProvider::bookMonitorObject(), cache, collection, mps_fire::i, cscdqm::EventProcessor::init(), cscdqm::Cache::isBookedCSC(), cscdqm::Cache::isBookedDDU(), cscdqm::Cache::isBookedFED(), cscdqm::h::PAR_CSC_SIDEMINUS, cscdqm::h::PAR_CSC_SIDEMINUS_STATION01, cscdqm::h::PAR_CSC_SIDEMINUS_STATION01_RING01, cscdqm::h::PAR_CSC_SIDEMINUS_STATION01_RING02, cscdqm::h::PAR_CSC_SIDEMINUS_STATION01_RING03, cscdqm::h::PAR_CSC_SIDEMINUS_STATION02, cscdqm::h::PAR_CSC_SIDEMINUS_STATION02_RING01, cscdqm::h::PAR_CSC_SIDEMINUS_STATION02_RING02, cscdqm::h::PAR_CSC_SIDEMINUS_STATION03, cscdqm::h::PAR_CSC_SIDEMINUS_STATION03_RING01, cscdqm::h::PAR_CSC_SIDEMINUS_STATION03_RING02, cscdqm::h::PAR_CSC_SIDEMINUS_STATION04, cscdqm::h::PAR_CSC_SIDEMINUS_STATION04_RING01, cscdqm::h::PAR_CSC_SIDEMINUS_STATION04_RING02, cscdqm::h::PAR_CSC_SIDEPLUS, cscdqm::h::PAR_CSC_SIDEPLUS_STATION01, cscdqm::h::PAR_CSC_SIDEPLUS_STATION01_RING01, cscdqm::h::PAR_CSC_SIDEPLUS_STATION01_RING02, cscdqm::h::PAR_CSC_SIDEPLUS_STATION01_RING03, cscdqm::h::PAR_CSC_SIDEPLUS_STATION02, cscdqm::h::PAR_CSC_SIDEPLUS_STATION02_RING01, cscdqm::h::PAR_CSC_SIDEPLUS_STATION02_RING02, cscdqm::h::PAR_CSC_SIDEPLUS_STATION03, cscdqm::h::PAR_CSC_SIDEPLUS_STATION03_RING01, cscdqm::h::PAR_CSC_SIDEPLUS_STATION03_RING02, cscdqm::h::PAR_CSC_SIDEPLUS_STATION04, cscdqm::h::PAR_CSC_SIDEPLUS_STATION04_RING01, cscdqm::h::PAR_CSC_SIDEPLUS_STATION04_RING02, cscdqm::h::PAR_REPORT_SUMMARY, metProducer_cfi::parameters, processor, provider, and cscdqm::Cache::put().

Referenced by CSCMonitorModule::bookHistograms(), and CSCOfflineClient::dqmEndJob().

91  {
92 
94 
95  /*** FOr multi-threading pre-book all FED, DDU, CSC histograms ***/
96  if ( config->getPREBOOK_ALL_HISTOS()) {
97 
99  for (HwId FEDId = 750; FEDId < 758; FEDId++) {
100  if (!cache.isBookedFED(FEDId)) {
101  collection.bookFEDHistos(FEDId);
102  }
103  }
104 
105  if (config->getPROCESS_DDU()) {
107  for (HwId DDUId = 1; DDUId <= 36; DDUId++) {
108  if (!cache.isBookedDDU(DDUId)) {
109  collection.bookDDUHistos(DDUId);
110  }
111  }
112  }
113 
114  if (config->getPROCESS_CSC()) {
116  for (HwId CrateId = 1; CrateId <= 60; CrateId++) {
117  for (HwId DMBId = 1; DMBId <=10; DMBId++) {
118  if (DMBId == 6) continue;
119  if (!cache.isBookedCSC(CrateId, DMBId)) {
120  collection.bookCSCHistos(CrateId, DMBId);
121  }
122  }
123  }
124  }
125 
126  if (config->getPROCESS_EFF_PARAMETERS()) {
129  std::vector<HistoId> parameters;
130  parameters.push_back(h::PAR_CSC_SIDEPLUS_STATION01_RING01);
131  parameters.push_back(h::PAR_CSC_SIDEPLUS_STATION01_RING02);
132  parameters.push_back(h::PAR_CSC_SIDEPLUS_STATION01_RING03);
133  parameters.push_back(h::PAR_CSC_SIDEPLUS_STATION01);
134  parameters.push_back(h::PAR_CSC_SIDEPLUS_STATION02_RING01);
135  parameters.push_back(h::PAR_CSC_SIDEPLUS_STATION02_RING02);
136  parameters.push_back(h::PAR_CSC_SIDEPLUS_STATION02);
137  parameters.push_back(h::PAR_CSC_SIDEPLUS_STATION03_RING01);
138  parameters.push_back(h::PAR_CSC_SIDEPLUS_STATION03_RING02);
139  parameters.push_back(h::PAR_CSC_SIDEPLUS_STATION03);
140  parameters.push_back(h::PAR_CSC_SIDEPLUS_STATION04_RING01);
141  parameters.push_back(h::PAR_CSC_SIDEPLUS_STATION04_RING02);
142  parameters.push_back(h::PAR_CSC_SIDEPLUS_STATION04);
143  parameters.push_back(h::PAR_CSC_SIDEPLUS);
144  parameters.push_back(h::PAR_CSC_SIDEMINUS_STATION01_RING01);
145  parameters.push_back(h::PAR_CSC_SIDEMINUS_STATION01_RING02);
146  parameters.push_back(h::PAR_CSC_SIDEMINUS_STATION01_RING03);
147  parameters.push_back(h::PAR_CSC_SIDEMINUS_STATION01);
148  parameters.push_back(h::PAR_CSC_SIDEMINUS_STATION02_RING01);
149  parameters.push_back(h::PAR_CSC_SIDEMINUS_STATION02_RING02);
150  parameters.push_back(h::PAR_CSC_SIDEMINUS_STATION02);
151  parameters.push_back(h::PAR_CSC_SIDEMINUS_STATION03_RING01);
152  parameters.push_back(h::PAR_CSC_SIDEMINUS_STATION03_RING02);
153  parameters.push_back(h::PAR_CSC_SIDEMINUS_STATION03);
154  parameters.push_back(h::PAR_CSC_SIDEMINUS_STATION04_RING01);
155  parameters.push_back(h::PAR_CSC_SIDEMINUS_STATION04_RING02);
156  parameters.push_back(h::PAR_CSC_SIDEMINUS_STATION04);
157  parameters.push_back(h::PAR_CSC_SIDEMINUS);
158  parameters.push_back(h::PAR_REPORT_SUMMARY);
159 
160 
161  for (size_t i = 0; i < parameters.size(); i++) {
162  ParHistoDef histoD(parameters[i]);
163  HistoBookRequest req(parameters[i], config->getFOLDER_PAR(), -1.0f);
164  MonitorObject* me = provider->bookMonitorObject(req);
165  cache.put(histoD, me);
166  }
167  }
168 
169  }
170 
171  processor.init();
172 
173 }
unsigned int HwId
const bool isBookedDDU(const HwId &dduId) const
Check if DDU was booked on given identifier.
void bookEMUHistos() const
Book EMU histograms.
Definition: config.py:1
void init()
Initialize EventProcessor: reading out config information.
virtual MonitorObject * bookMonitorObject(const HistoBookRequest &p_req)=0
EventProcessor processor
void bookFEDHistos(const HwId fedId) const
Book FED histograms.
void bookDDUHistos(const HwId dduId) const
Book DDU histograms.
void put(const HistoDef &histo, MonitorObject *mo)
Put Monitoring Object into cache.
const bool isBookedCSC(const HwId &crateId, const HwId &dmbId) const
Check if CSC was booked on given identifiers.
void bookCSCHistos(const HwId crateId, const HwId dmbId) const
Book Chamber Histograms.
MonitorObjectProvider * provider
const bool isBookedFED(const HwId &fedId) const
Check if FED was booked on given identifier.
void cscdqm::Dispatcher::commonConstruct ( Configuration *const  p_config,
MonitorObjectProvider *const  p_provider 
)
private

Save pointers to class properties

Link/share Cache methods to function pointers in configuration

Link/share local functions

Link/share getCSCDetId function

Link/share booking function

Definition at line 52 of file CSCDQM_Dispatcher.cc.

References cscdqm::MonitorObjectProvider::bookMonitorObject(), cache, cscdqm::Cache::getCSC(), cscdqm::MonitorObjectProvider::getCSCDetId(), cscdqm::Cache::getDDU(), cscdqm::Cache::getEMU(), cscdqm::Cache::getFED(), getHisto(), cscdqm::Cache::getPar(), cscdqm::Cache::isBookedCSC(), cscdqm::Cache::isBookedDDU(), cscdqm::Cache::isBookedFED(), cscdqm::Cache::nextBookedCSC(), provider, and cscdqm::Cache::put().

Referenced by Dispatcher().

52  {
53 
55  config = p_config;
56  provider = p_provider;
57 
59  config->fnGetCacheEMUHisto = boost::bind(&Cache::getEMU, &cache, _1, _2);
60  config->fnGetCacheFEDHisto = boost::bind(&Cache::getFED, &cache, _1, _2, _3);
61  config->fnGetCacheDDUHisto = boost::bind(&Cache::getDDU, &cache, _1, _2, _3);
62  config->fnGetCacheCSCHisto = boost::bind(&Cache::getCSC, &cache, _1, _2, _3, _4, _5);
63  config->fnGetCacheParHisto = boost::bind(&Cache::getPar, &cache, _1, _2);
64  config->fnPutHisto = boost::bind(&Cache::put, &cache, _1, _2);
65  config->fnNextBookedCSC = boost::bind(&Cache::nextBookedCSC, &cache, _1, _2, _3);
66  config->fnIsBookedCSC = boost::bind(&Cache::isBookedCSC, &cache, _1, _2);
67  config->fnIsBookedDDU = boost::bind(&Cache::isBookedDDU, &cache, _1);
68  config->fnIsBookedFED = boost::bind(&Cache::isBookedFED, &cache, _1);
69 
71  config->fnGetHisto = boost::bind(&Dispatcher::getHisto, this, _1, _2);
72 
74  config->fnGetCSCDetId = boost::bind(&MonitorObjectProvider::getCSCDetId, provider, _1, _2, _3);
75 
77  config->fnBook = boost::bind(&MonitorObjectProvider::bookMonitorObject, provider, _1);
78 
79 }
const bool getFED(const HistoId &id, const HwId &fedId, MonitorObject *&mo)
Get FED MO on Histogram Id and FED Id.
Definition: CSCDQM_Cache.cc:71
const bool isBookedDDU(const HwId &dduId) const
Check if DDU was booked on given identifier.
const bool getEMU(const HistoId &id, MonitorObject *&mo)
Get EMU MO on Histogram Id.
Definition: CSCDQM_Cache.cc:56
const bool nextBookedCSC(unsigned int &n, unsigned int &crateId, unsigned int &dmbId) const
Iterator to get booked CSC identifiers on enumerator.
Definition: config.py:1
virtual MonitorObject * bookMonitorObject(const HistoBookRequest &p_req)=0
virtual bool getCSCDetId(const unsigned int crateId, const unsigned int dmbId, CSCDetId &detId) const =0
const bool getPar(const HistoId &id, MonitorObject *&mo)
Get Parameter MO on Histogram Id.
const bool getHisto(const HistoDef &histoD, MonitorObject *&me)
Global get MO function. If request has reached this function it means that histo is not in cache! ...
const bool getDDU(const HistoId &id, const HwId &dduId, MonitorObject *&mo)
Get DDU MO on Histogram Id and DDU Id.
void put(const HistoDef &histo, MonitorObject *mo)
Put Monitoring Object into cache.
const bool isBookedCSC(const HwId &crateId, const HwId &dmbId) const
Check if CSC was booked on given identifiers.
MonitorObjectProvider * provider
const bool getCSC(const HistoId &id, const HwId &crateId, const HwId &dmbId, const HwId &addId, MonitorObject *&mo)
Get CSC MO on Histogram Id and CSC Crate and DMB Ids.
const bool isBookedFED(const HwId &fedId) const
Check if FED was booked on given identifier.
const bool cscdqm::Dispatcher::getHisto ( const HistoDef histoD,
MonitorObject *&  me 
)

Global get MO function. If request has reached this function it means that histo is not in cache!

Parameters
histoDHistogram Definition to get
meMO to return
Returns
true if me found and filled, false - otherwise

For the first FED - book general

For the first DDU - book general

For the first and specific CSCs - book general and specific

cache.printContent();

For the Parameters - book parameter histogram

If not found after booking - mark it as not existent

Definition at line 190 of file CSCDQM_Dispatcher.cc.

References cscdqm::Collection::bookCSCHistos(), cscdqm::Collection::bookDDUHistos(), cscdqm::Collection::bookFEDHistos(), cscdqm::MonitorObjectProvider::bookMonitorObject(), cache, collection, cscdqm::CSCHistoDefT, cscdqm::DDUHistoDefT, cscdqm::FEDHistoDefT, cscdqm::Cache::get(), cscdqm::HistoDef::getAddId(), cscdqm::HistoDef::getCrateId(), cscdqm::HistoDef::getDDUId(), cscdqm::HistoDef::getDMBId(), cscdqm::HistoDef::getFEDId(), cscdqm::HistoDef::getHistoName(), cscdqm::HistoDef::getId(), cscdqm::Cache::isBookedCSC(), cscdqm::Cache::isBookedDDU(), cscdqm::Cache::isBookedFED(), cscdqm::Collection::isOnDemand(), NULL, cscdqm::ParHistoDefT, provider, and cscdqm::Cache::put().

Referenced by commonConstruct().

190  {
191 
193  if (typeid(histoD) == FEDHistoDefT && !cache.isBookedFED(histoD.getFEDId())) {
194  collection.bookFEDHistos(histoD.getFEDId());
195  if (cache.get(histoD, me)) return true;
196  }
197 
199  if (typeid(histoD) == DDUHistoDefT && !cache.isBookedDDU(histoD.getDDUId())) {
200  collection.bookDDUHistos(histoD.getDDUId());
201  if (cache.get(histoD, me)) return true;
202  }
203 
205  if (typeid(histoD) == CSCHistoDefT) {
206  if (!cache.isBookedCSC(histoD.getCrateId(), histoD.getDMBId())) {
207  collection.bookCSCHistos(histoD.getCrateId(), histoD.getDMBId());
209  }
210  if (collection.isOnDemand(histoD.getHistoName())) {
211  collection.bookCSCHistos(histoD.getId(), histoD.getCrateId(), histoD.getDMBId(), histoD.getAddId());
212  }
213  if (cache.get(histoD, me)) return true;
214  }
215 
217  if (typeid(histoD) == ParHistoDefT) {
218  HistoBookRequest req(histoD, config->getFOLDER_PAR(), -1.0f);
219  me = provider->bookMonitorObject(req);
220  cache.put(histoD, me);
221  return true;
222  }
223 
225  cache.put(histoD, NULL);
226 
227  return false;
228 }
static const std::type_info & FEDHistoDefT
const bool isBookedDDU(const HwId &dduId) const
Check if DDU was booked on given identifier.
#define NULL
Definition: scimark2.h:8
const bool isOnDemand(const HistoName &name) const
Check if the histogram is on demand (by histogram name)
Definition: config.py:1
virtual MonitorObject * bookMonitorObject(const HistoBookRequest &p_req)=0
static const std::type_info & CSCHistoDefT
static const std::type_info & ParHistoDefT
void bookFEDHistos(const HwId fedId) const
Book FED histograms.
static const std::type_info & DDUHistoDefT
void bookDDUHistos(const HwId dduId) const
Book DDU histograms.
void put(const HistoDef &histo, MonitorObject *mo)
Put Monitoring Object into cache.
const bool isBookedCSC(const HwId &crateId, const HwId &dmbId) const
Check if CSC was booked on given identifiers.
void bookCSCHistos(const HwId crateId, const HwId dmbId) const
Book Chamber Histograms.
const bool get(const HistoDef &histo, MonitorObject *&mo)
Get Monitoring Object on Histogram Definition.
Definition: CSCDQM_Cache.cc:29
MonitorObjectProvider * provider
const bool isBookedFED(const HwId &fedId) const
Check if FED was booked on given identifier.
void cscdqm::Dispatcher::init ( void  )

Initialize Dispatcher: book histograms, init processor, etc.

Returns

Definition at line 85 of file CSCDQM_Dispatcher.cc.

References collection, and cscdqm::Collection::load().

Referenced by CSCMonitorModule::CSCMonitorModule(), and CSCOfflineClient::CSCOfflineClient().

85  {
86  collection.load();
87  // collection.bookEMUHistos();
88  // processor.init();
89 }
void load()
Load XML file and fill definition map(s)
unsigned int cscdqm::Dispatcher::maskHWElements ( std::vector< std::string > &  tokens)

Mask HW elements from the efficiency calculations. Can be applied on runtime!

Parameters
tokensString tokens of the HW elements
Returns
elements masked

Definition at line 180 of file CSCDQM_Dispatcher.cc.

References cscdqm::EventProcessorMutex::maskHWElements(), and processorFract.

Referenced by CSCMonitorModule::bookHistograms(), and CSCOfflineClient::dqmEndJob().

180  {
181  return processorFract.maskHWElements(tokens);
182 }
EventProcessorMutex processorFract
unsigned int maskHWElements(std::vector< std::string > &tokens)
Mask HW elements from the efficiency calculations. Can be applied on runtime!
void cscdqm::Dispatcher::processStandby ( HWStandbyType standby)

Set HW Standby modes.

Returns

Definition at line 264 of file CSCDQM_Dispatcher.cc.

References data, MillePedeFileConverter_cfg::e, cscdqm::HWStandbyType::fullStandby(), HiClusterCompatibility_cfi::inputTag, CommonMethods::lock(), cscdqm::Lock::mutex, cscdqm::HWStandbyType::process, processEvent(), processor, processorFract, cscdqm::EventProcessorMutex::processStandby(), and updateFractionAndEfficiencyHistosAuto().

264  {
265  LockType lock(processorFract.mutex);
266  if (config->getFRAEFF_SEPARATE_THREAD()) {
267  boost::function<void (HWStandbyType&)> fnUpdate = boost::bind(&EventProcessorMutex::processStandby, &processorFract, _1);
268 #ifdef DQMMT
269  threads.create_thread(boost::ref(fnUpdate));
270 #else
271  fnUpdate(standby);
272 #endif
273  } else {
275  }
276 }
EventProcessorMutex processorFract
Definition: config.py:1
void processStandby(HWStandbyType &standby)
Process standby information.
void cscdqm::Dispatcher::updateFractionAndEfficiencyHistos ( )

On demand update fraction and efficiency MOs.

Returns

Definition at line 246 of file CSCDQM_Dispatcher.cc.

References CommonMethods::lock(), cscdqm::Lock::mutex, processorFract, and cscdqm::EventProcessorMutex::updateFractionAndEfficiencyHistos().

Referenced by CSCMonitorModule::bookHistograms(), CSCOfflineClient::dqmEndJob(), and updateFractionAndEfficiencyHistosAuto().

246  {
247  LockType lock(processorFract.mutex);
248  if (config->getFRAEFF_SEPARATE_THREAD()) {
249  boost::function<void ()> fnUpdate = boost::bind(&EventProcessorMutex::updateFractionAndEfficiencyHistos, &processorFract);
250 #ifdef DQMMT
251  threads.create_thread(boost::ref(fnUpdate));
252 #else
253  fnUpdate();
254 #endif
255  } else {
257  }
258 }
EventProcessorMutex processorFract
Definition: config.py:1
void updateFractionAndEfficiencyHistos()
Update Fraction and Efficiency histograms.
void cscdqm::Dispatcher::updateFractionAndEfficiencyHistosAuto ( )
private

Automatically called fraction and efficiency MOs update function.

Returns

Definition at line 234 of file CSCDQM_Dispatcher.cc.

References updateFractionAndEfficiencyHistos().

Referenced by processStandby().

234  {
235  if ( config->getFRAEFF_AUTO_UPDATE() &&
236  (config->getNEventsCSC() >= config->getFRAEFF_AUTO_UPDATE_START()) &&
237  (config->getNEventsCSC() % config->getFRAEFF_AUTO_UPDATE_FREQ()) == 0) {
239  }
240 }
void updateFractionAndEfficiencyHistos()
On demand update fraction and efficiency MOs.
Definition: config.py:1

Member Data Documentation

Cache cscdqm::Dispatcher::cache
private

MO Cache object

Definition at line 169 of file CSCDQM_Dispatcher.h.

Referenced by book(), commonConstruct(), and getHisto().

Collection cscdqm::Dispatcher::collection
private

MO Collection object

Definition at line 163 of file CSCDQM_Dispatcher.h.

Referenced by book(), Dispatcher(), getHisto(), and init().

Configuration* cscdqm::Dispatcher::config
private

Pointer to Global Configuration

Definition at line 157 of file CSCDQM_Dispatcher.h.

EventProcessor cscdqm::Dispatcher::processor
private

Event Processor object

Definition at line 166 of file CSCDQM_Dispatcher.h.

Referenced by book(), Dispatcher(), and processStandby().

EventProcessorMutex cscdqm::Dispatcher::processorFract
private

Lockable Fractional and Efficiency MO update object

Definition at line 172 of file CSCDQM_Dispatcher.h.

Referenced by Dispatcher(), maskHWElements(), processStandby(), and updateFractionAndEfficiencyHistos().

MonitorObjectProvider* cscdqm::Dispatcher::provider
private

Pointer to MO provider

Definition at line 160 of file CSCDQM_Dispatcher.h.

Referenced by book(), commonConstruct(), and getHisto().