Skip to content

Commit c825d65

Browse files
jokonigsawenzel
authored andcommitted
[EMCAL-565] Add Time information for bad channel calib
- In Run2, the time information for the identification of bad channels could only be used in a second step (analysis-level QA) because the time calibration, including the BC%4 correction, was not done at the stage of the bad channel calibration - In Run3, the BC%4 correction is already performed before the bad channel calibration. Due to that, we can use the width of the cell time distribution to identify bad channels. - The width (std. deviation) is calculated for each cell. The values for all cells are stored and a mean and sigma of this new distribution is calculated using the TRobustEstimator. Cells above mean + nSigmas*sigma are then flagged as bad (the nSigmas can be modified in the EMCalCalibParams) - The calibration can be switched on/off using the EMCALCalibParams - In the offline calibrator and channel-data-producer, the time information can be added via an additional input histogram
1 parent 11e3862 commit c825d65

8 files changed

Lines changed: 173 additions & 17 deletions

File tree

Common/Utils/include/CommonUtils/BoostHistogramUtils.h

Lines changed: 28 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -423,6 +423,32 @@ double getMeanBoost1D(boost::histogram::histogram<axes...>& inHist1D)
423423
return stats.getMean();
424424
}
425425

426+
/// \brief Get the variance of a 1D boost histogram
427+
/// \param inHist1D input boost histogram
428+
/// \param mean mean mean of the histogram, if set to -999999, mean will be caluclated
429+
/// \param weight weight of the entries in the histogram. Per default set to 1
430+
/// \return variance of the distribution with respect to the mean
431+
template <typename... axes>
432+
double getVarianceBoost1D(boost::histogram::histogram<axes...>& inHist1D, double mean = -999999, const double weight = 1)
433+
{
434+
if (std::abs(mean + 999999) < 0.00001) {
435+
mean = getMeanBoost1D(inHist1D);
436+
}
437+
unsigned int nMeas = 0; // counter for the number of data points
438+
auto histiter = inHist1D.begin() + 1;
439+
const auto& axis = inHist1D.axis(0);
440+
double variance = 0;
441+
for (auto bincenter = BinCenterView(axis.begin()); bincenter != BinCenterView(axis.end()); ++bincenter, ++histiter) {
442+
nMeas += *histiter / weight; // to get the number of entries, for weighted histograms we need to divide by the weight to get back to the number of entries
443+
variance += *histiter * (*bincenter - mean) * (*bincenter - mean);
444+
}
445+
if (nMeas <= 1) {
446+
return 0;
447+
}
448+
variance /= (nMeas - 1);
449+
return variance;
450+
}
451+
426452
/// \brief Convert a 2D boost histogram to a root histogram
427453
template <class BoostHist>
428454
TH1F TH1FFromBoost(BoostHist hist, const char* name = "hist")
@@ -468,7 +494,7 @@ TH2F TH2FFromBoost(BoostHist hist, const char* name = "hist")
468494
/// \return result
469495
/// 1d boost histogram from projection of the input 2d boost histogram
470496
template <typename... axes>
471-
auto ProjectBoostHistoX(boost::histogram::histogram<axes...>& hist2d, const int binLow, const int binHigh)
497+
auto ProjectBoostHistoX(const boost::histogram::histogram<axes...>& hist2d, const int binLow, const int binHigh)
472498
{
473499
using namespace boost::histogram::literals; // enables _c suffix needed for projection
474500

@@ -494,7 +520,7 @@ auto ProjectBoostHistoX(boost::histogram::histogram<axes...>& hist2d, const int
494520
/// \return result
495521
/// 1d boost histogram from projection of the input 2d boost histogram
496522
template <typename... axes>
497-
auto ProjectBoostHistoXFast(boost::histogram::histogram<axes...>& hist2d, const int binLow, const int binHigh)
523+
auto ProjectBoostHistoXFast(const boost::histogram::histogram<axes...>& hist2d, const int binLow, const int binHigh)
498524
{
499525
unsigned int nbins = hist2d.axis(0).size();
500526
double binStartX = hist2d.axis(0).bin(0).lower();

Detectors/EMCAL/calibration/include/EMCALCalibration/EMCALCalibExtractor.h

Lines changed: 55 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
#include "EMCALCalib/TimeCalibrationParams.h"
2727
#include "CommonUtils/BoostHistogramUtils.h"
2828
#include "EMCALBase/Geometry.h"
29+
#include "EMCALCalibration/EMCALCalibParams.h"
2930
#include <boost/histogram.hpp>
3031

3132
#include <TRobustEstimator.h>
@@ -53,6 +54,11 @@ class EMCALCalibExtractor
5354
std::map<slice_t, std::pair<double, double>> goodCellWindowNHitsMap; // for each slice, the nHitsMin and the mHitsMax of the good cell window
5455
};
5556

57+
struct BadChannelCalibTimeInfo {
58+
std::array<double, 17664> sigmaCell; // sigma value of time distribution for single cells
59+
double goodCellWindow; // cut value for good cells
60+
};
61+
5662
public:
5763
EMCALCalibExtractor()
5864
{
@@ -81,8 +87,10 @@ class EMCALCalibExtractor
8187
boostHisto buildHitAndEnergyMeanScaled(double emin, double emax, boostHisto mCellAmplitude);
8288

8389
/// \brief Function to perform the calibration of bad channels
90+
/// \param hist histogram cell energy vs. cell ID. Main histogram for the bad channel calibration
91+
/// \param histTime histogram cell time vs. cell ID. If default argument is taken, no calibration based on the timing signal will be performed
8492
template <typename... axes>
85-
o2::emcal::BadChannelMap calibrateBadChannels(boost::histogram::histogram<axes...>& hist)
93+
o2::emcal::BadChannelMap calibrateBadChannels(boost::histogram::histogram<axes...>& hist, const boost::histogram::histogram<axes...>& histTime = boost::histogram::make_histogram(boost::histogram::axis::variable<>{0., 1.}, boost::histogram::axis::variable<>{0., 1.}))
8694
{
8795
double time1 = std::chrono::duration_cast<std::chrono::nanoseconds>(std::chrono::high_resolution_clock::now().time_since_epoch()).count();
8896
std::map<int, std::pair<double, double>> slices = {{0, {0.1, 0.3}}, {1, {0.3, 0.5}}, {2, {0.5, 1.0}}, {3, {1.0, 4.0}}};
@@ -103,6 +111,13 @@ class EMCALCalibExtractor
103111
// get all ofthe calibration information that we need in a struct
104112
BadChannelCalibInfo calibrationInformation = buildHitAndEnergyMean(slices, hist);
105113

114+
// only initialize this if the histo is not the default one
115+
const bool doIncludeTime = (histTime.axis(0).size() > 1 && EMCALCalibParams::Instance().useTimeInfoForCalib_bc) ? true : false;
116+
BadChannelCalibTimeInfo calibrationTimeInfo;
117+
if (doIncludeTime) {
118+
calibrationTimeInfo = buildTimeMeanAndSigma(histTime);
119+
}
120+
106121
o2::emcal::BadChannelMap mOutputBCM;
107122
// now loop through the cells and determine the mask for a given cell
108123

@@ -135,6 +150,14 @@ class EMCALCalibExtractor
135150
failed = true;
136151
break;
137152
}
153+
154+
// check if the cell is bad due to timing signal.
155+
if (!failed && doIncludeTime) {
156+
if (calibrationTimeInfo.sigmaCell[cellID] > calibrationTimeInfo.goodCellWindow) {
157+
LOG(debug) << "Cell " << cellID << " is flagged due to time distribution";
158+
failed = true;
159+
}
160+
}
138161
}
139162
if (failed) {
140163
LOG(debug) << "Cell " << cellID << " is bad.";
@@ -236,6 +259,37 @@ class EMCALCalibExtractor
236259

237260
return outputInfo;
238261
}
262+
263+
//____________________________________________
264+
/// \brief calculate the sigma of the time distribution for all cells and caluclate the mean of the sigmas
265+
/// \param histCellTime input histogram cellID vs cell time
266+
/// \return sigma value for all cells and the upper cut value
267+
template <typename... axes>
268+
BadChannelCalibTimeInfo buildTimeMeanAndSigma(const boost::histogram::histogram<axes...>& histCellTime)
269+
{
270+
std::array<double, 17664> meanSigma;
271+
for (int i = 0; i < mNcells; ++i) {
272+
// calculate sigma per cell
273+
const int indexLow = histCellTime.axis(1).index(i);
274+
const int indexHigh = histCellTime.axis(1).index(i + 1);
275+
auto boostHistCellSlice = o2::utils::ProjectBoostHistoXFast(histCellTime, indexLow, indexHigh);
276+
meanSigma[i] = std::sqrt(o2::utils::getVarianceBoost1D(boostHistCellSlice));
277+
LOG(debug) << "meanSigma[" << i << "] " << meanSigma[i];
278+
}
279+
280+
// get the mean sigma and the std. deviation of the sigma distribution
281+
// those will be the values we cut on
282+
double avMean = 0, avSigma = 0;
283+
TRobustEstimator robustEstimator;
284+
robustEstimator.EvaluateUni(meanSigma.size(), meanSigma.data(), avMean, avSigma, 0);
285+
286+
BadChannelCalibTimeInfo timeInfo;
287+
timeInfo.sigmaCell = meanSigma;
288+
timeInfo.goodCellWindow = avMean + (avSigma * o2::emcal::EMCALCalibParams::Instance().sigmaTime_bc); // only upper limit needed
289+
290+
return timeInfo;
291+
}
292+
239293
//____________________________________________
240294

241295
/// \brief Calibrate time for all cells

Detectors/EMCAL/calibration/include/EMCALCalibration/EMCALCalibParams.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,13 @@ struct EMCALCalibParams : public o2::conf::ConfigurableParamHelper<EMCALCalibPar
3636
bool useScaledHisto_bc = true; ///< use the scaled histogram for the bad channel map
3737
bool enableTestMode_bc = false; ///< enable test mode for calibration
3838
int nBinsEnergyAxis_bc = 1000; ///< number of bins for boost histogram energy axis
39+
bool useTimeInfoForCalib_bc = true; ///< weather to use the timing information as a criterion in the bad channel analysis
3940
float maxValueEnergyAxis_bc = 10; ///< maximum value for boost histogram energy axis (minimum is always 0)
41+
int nBinsTimeAxis_bc = 1000; ///< number of bins for boost histogram time axis
42+
float rangeTimeAxisLow_bc = -500; ///< minimum value of time for histogram range
43+
float rangeTimeAxisHigh_bc = 500; ///< maximum value of time for histogram range
44+
float minCellEnergyTime_bc = 0.1; ///< minimum energy needed to fill the time histogram
45+
float sigmaTime_bc = 5; ///< sigma value for the upper cut on the time-variance distribution
4046
unsigned int slotLength_bc = 0; ///< Lenght of the slot before calibration is triggered. If set to 0 calibration is triggered when hasEnoughData returns true
4147
bool UpdateAtEndOfRunOnly_bc = false; ///< switsch to enable trigger of calibration only at end of run
4248

Detectors/EMCAL/calibration/include/EMCALCalibration/EMCALChannelCalibrator.h

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -125,7 +125,7 @@ void EMCALChannelCalibrator<DataInput, DataOutput>::finalizeSlot(o2::calibration
125125
std::map<std::string, std::string> md;
126126
if constexpr (std::is_same<DataInput, o2::emcal::EMCALChannelData>::value) {
127127
LOG(debug) << "Launching the calibration.";
128-
auto bcm = mCalibrator->calibrateBadChannels(c->getHisto());
128+
auto bcm = mCalibrator->calibrateBadChannels(c->getHisto(), c->getHistoTime());
129129
LOG(debug) << "Done with the calibraiton";
130130
// for the CCDB entry
131131
auto clName = o2::utils::MemFileHelper::getClassName(bcm);
@@ -145,6 +145,11 @@ void EMCALChannelCalibrator<DataInput, DataOutput>::finalizeSlot(o2::calibration
145145
TH2F hCalibHist = o2::utils::TH2FFromBoost(c->getHisto());
146146
std::string nameBCInputHist = "EnergyVsCellID_" + std::to_string(slot.getStartTimeMS());
147147
hCalibHist.Write(nameBCInputHist.c_str(), TObject::kOverwrite);
148+
149+
TH2F hCalibHistTime = o2::utils::TH2FFromBoost(c->getHistoTime());
150+
std::string nameBCInputHistTime = "TimeVsCellID_" + std::to_string(slot.getStartTimeMS());
151+
hCalibHistTime.Write(nameBCInputHistTime.c_str(), TObject::kOverwrite);
152+
148153
fLocalStorage.Close();
149154
}
150155
} else if constexpr (std::is_same<DataInput, o2::emcal::EMCALTimeCalibData>::value) {

Detectors/EMCAL/calibration/include/EMCALCalibration/EMCALChannelData.h

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,10 +58,11 @@ class EMCALChannelData
5858
o2::emcal::Geometry* mGeometry = o2::emcal::Geometry::GetInstanceFromRunNumber(300000);
5959
int NCELLS = mGeometry->GetNCells();
6060

61-
EMCALChannelData() : mNBins(EMCALCalibParams::Instance().nBinsEnergyAxis_bc), mRange(EMCALCalibParams::Instance().maxValueEnergyAxis_bc)
61+
EMCALChannelData() : mNBins(EMCALCalibParams::Instance().nBinsEnergyAxis_bc), mRange(EMCALCalibParams::Instance().maxValueEnergyAxis_bc), mNBinsTime(EMCALCalibParams::Instance().nBinsTimeAxis_bc), mRangeTimeLow(EMCALCalibParams::Instance().rangeTimeAxisLow_bc), mRangeTimeHigh(EMCALCalibParams::Instance().rangeTimeAxisHigh_bc)
6262
{
6363
// boost histogram with amplitude vs. cell ID, specify the range and binning of the amplitude axis
6464
mHisto = boost::histogram::make_histogram(boost::histogram::axis::regular<>(mNBins, 0, mRange, "t-texp"), boost::histogram::axis::integer<>(0, NCELLS, "CELL ID"));
65+
mHistoTime = boost::histogram::make_histogram(boost::histogram::axis::regular<>(mNBinsTime, mRangeTimeLow, mRangeTimeHigh, "t-texp"), boost::histogram::axis::integer<>(0, NCELLS, "CELL ID"));
6566
// NCELLS includes DCal, treat as one calibration
6667
o2::emcal::Geometry* mGeometry = o2::emcal::Geometry::GetInstanceFromRunNumber(300000);
6768
int NCELLS = mGeometry->GetNCells();
@@ -88,6 +89,10 @@ class EMCALChannelData
8889
boostHisto& getHisto() { return mHisto; }
8990
const boostHisto& getHisto() const { return mHisto; }
9091

92+
/// \brief Get current calibration histogram with timing information
93+
boostHisto& getHistoTime() { return mHistoTime; }
94+
const boostHisto& getHistoTime() const { return mHistoTime; }
95+
9196
/// \brief Peform the calibration and flag the bad channel map
9297
/// Average energy per hit histogram is fitted with a gaussian
9398
/// good area is +-mSigma
@@ -110,6 +115,10 @@ class EMCALChannelData
110115
float mRange = 10; ///< Maximum energy range of boost histogram (will be overwritten by values in the EMCALCalibParams)
111116
int mNBins = 1000; ///< Number of bins in the boost histogram (will be overwritten by values in the EMCALCalibParams)
112117
boostHisto mHisto; ///< 2d boost histogram with cellID vs cell energy
118+
int mNBinsTime = 1000; ///< Number of time bins in boost histogram (cell time vs. cell ID)
119+
float mRangeTimeLow = -500; ///< lower bound of time axis of mHistoTime
120+
float mRangeTimeHigh = 500; ///< upper bound of time axis of mHistoTime
121+
boostHisto mHistoTime; ///< 2d boost histogram with cellID vs cell time
113122
int mEvents = 0; ///< event counter
114123
long unsigned int mNEntriesInHisto = 0; ///< Number of entries in the histogram
115124
boostHisto mEsumHisto; ///< contains the average energy per hit for each cell

Detectors/EMCAL/calibration/run/runCalibOffline.cxx

Lines changed: 29 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -46,8 +46,10 @@ int main(int argc, char** argv)
4646
bool debugMode = false;
4747
bool doLocal = false;
4848
bool doScale = false;
49-
std::string nameCalibInputHist; // hCellIdVsTimeAbove300 for time, hCellIdVsEnergy for bad channel
50-
std::string namePathStoreLocal; // name for path + histogram to store the calibration locally in root TH1 format
49+
bool doBCCalibWithTime = false;
50+
std::string nameCalibInputHist; // hCellIdVsTimeAbove300 for time, hCellIdVsEnergy for bad channel
51+
std::string nameCalibInputHistAdd; // additional input histogram for bad channel calibration if time should be considered
52+
std::string namePathStoreLocal; // name for path + histogram to store the calibration locally in root TH1 format
5153

5254
unsigned int nthreads; // number of threads used by openMP
5355

@@ -59,7 +61,7 @@ int main(int argc, char** argv)
5961

6062
try {
6163
bpo::options_description desc("Allowed options");
62-
desc.add_options()("help", "Print this help message")("CalibInputPath", bpo::value<std::string>()->required(), "Set root input histogram")("ccdbServerPath", bpo::value<std::string>()->default_value(o2::base::NameConf::getCCDBServer()), "Set path to ccdb server")("debug", bpo::value<bool>()->default_value(false), "Enable debug statements")("storeCalibLocally", bpo::value<bool>()->default_value(false), "Enable local storage of calib")("scaleBadChannelMap", bpo::value<bool>()->default_value(false), "Enable the application of scale factors")("mode", bpo::value<std::string>()->required(), "Set if time or bad channel calib")("nameInputHisto", bpo::value<std::string>()->default_value("hCellIdVsTimeAbove300"), "Set name of input histogram")("nthreads", bpo::value<unsigned int>()->default_value(1), "Set number of threads for OpenMP")("timestampStart", bpo::value<unsigned long>()->default_value(1635548552000), "Set timestamp from start of run")("timestampEnd", bpo::value<unsigned long>()->default_value(1635553870000), "Set timestamp from end of run")("namePathStoreLocal", bpo::value<std::string>()->default_value(""), "Set path to store histo of time calib locally")("timeRangeLow", bpo::value<double>()->default_value(1), "Set lower boundary of fit interval for time calibration (in ns)")("timeRangeHigh", bpo::value<double>()->default_value(1000), "Set upper boundary of fit interval for time calibration (in ns)");
64+
desc.add_options()("help", "Print this help message")("CalibInputPath", bpo::value<std::string>()->required(), "Set root input histogram")("ccdbServerPath", bpo::value<std::string>()->default_value(o2::base::NameConf::getCCDBServer()), "Set path to ccdb server")("debug", bpo::value<bool>()->default_value(false), "Enable debug statements")("storeCalibLocally", bpo::value<bool>()->default_value(false), "Enable local storage of calib")("scaleBadChannelMap", bpo::value<bool>()->default_value(false), "Enable the application of scale factors")("mode", bpo::value<std::string>()->required(), "Set if time or bad channel calib")("nameInputHisto", bpo::value<std::string>()->default_value("hCellIdVsTimeAbove300"), "Set name of input histogram")("nameInputHistoAdditional", bpo::value<std::string>()->default_value(""), "Set name of additional input histogram")("nthreads", bpo::value<unsigned int>()->default_value(1), "Set number of threads for OpenMP")("timestampStart", bpo::value<unsigned long>()->default_value(1635548552000), "Set timestamp from start of run")("timestampEnd", bpo::value<unsigned long>()->default_value(1635553870000), "Set timestamp from end of run")("namePathStoreLocal", bpo::value<std::string>()->default_value(""), "Set path to store histo of time calib locally")("timeRangeLow", bpo::value<double>()->default_value(1), "Set lower boundary of fit interval for time calibration (in ns)")("timeRangeHigh", bpo::value<double>()->default_value(1000), "Set upper boundary of fit interval for time calibration (in ns)");
6365

6466
bpo::store(bpo::parse_command_line(argc, argv, desc), vm);
6567

@@ -122,6 +124,12 @@ int main(int argc, char** argv)
122124
nameCalibInputHist = vm["nameInputHisto"].as<std::string>();
123125
}
124126

127+
if (vm.count("nameInputHistoAdditional")) {
128+
std::cout << "nameInputHistoAdditional was set to "
129+
<< vm["nameInputHistoAdditional"].as<std::string>() << ".\n";
130+
nameCalibInputHistAdd = vm["nameInputHistoAdditional"].as<std::string>();
131+
}
132+
125133
if (vm.count("nthreads")) {
126134
std::cout << "number of threads was set to "
127135
<< vm["nthreads"].as<unsigned int>() << ".\n";
@@ -180,12 +188,24 @@ int main(int argc, char** argv)
180188
return 0;
181189
}
182190

191+
// load calibration histogram (cellID vs energy for BC calibration, cellID vs time for time calibration)
183192
TH2D* hCalibInputHist_ROOT = (TH2D*)fTimeCalibInput->Get(nameCalibInputHist.c_str());
184193
if (!hCalibInputHist_ROOT) {
185194
printf("%s not there... returning\n", nameCalibInputHist.c_str());
186195
return 0;
187196
}
188197

198+
// load time vs cellID histogram for the bad channel calibration if specified
199+
TH2D* hCalibInputHistAdd_ROOT = nullptr;
200+
if (!nameCalibInputHistAdd.empty()) {
201+
doBCCalibWithTime = true;
202+
hCalibInputHistAdd_ROOT = (TH2D*)fTimeCalibInput->Get(nameCalibInputHistAdd.c_str());
203+
if (!hCalibInputHistAdd_ROOT) {
204+
printf("%s not there... returning\n", nameCalibInputHist.c_str());
205+
return 0;
206+
}
207+
}
208+
189209
// instance of the calib extractor
190210
o2::emcal::EMCALCalibExtractor CalibExtractor;
191211
CalibExtractor.setNThreads(nthreads);
@@ -204,7 +224,12 @@ int main(int argc, char** argv)
204224
printf("perform bad channel analysis\n");
205225
o2::emcal::BadChannelMap BCMap;
206226

207-
BCMap = CalibExtractor.calibrateBadChannels(hCalibInputHist);
227+
if (doBCCalibWithTime) {
228+
auto hCalibInputHistAdd = o2::utils::boostHistoFromRoot_2D(hCalibInputHistAdd_ROOT);
229+
BCMap = CalibExtractor.calibrateBadChannels(hCalibInputHist, hCalibInputHistAdd);
230+
} else {
231+
BCMap = CalibExtractor.calibrateBadChannels(hCalibInputHist);
232+
}
208233
// store bad channel map in ccdb via emcal calibdb
209234
if (doLocal) {
210235
std::unique_ptr<TFile> writer(TFile::Open(Form("bcm_%lu.root", rangestart), "RECREATE"));

Detectors/EMCAL/calibration/src/EMCALChannelData.cxx

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -50,11 +50,17 @@ void EMCALChannelData::fill(const gsl::span<const o2::emcal::Cell> data)
5050
//the fill function is called once per event
5151
mEvents++;
5252
for (auto cell : data) {
53-
Double_t cellEnergy = cell.getEnergy();
54-
Int_t id = cell.getTower();
53+
double cellEnergy = cell.getEnergy();
54+
int id = cell.getTower();
5555
LOG(debug) << "inserting in cell ID " << id << ": energy = " << cellEnergy;
5656
mHisto(cellEnergy, id);
5757
mNEntriesInHisto++;
58+
59+
if (cellEnergy > o2::emcal::EMCALCalibParams::Instance().minCellEnergyTime_bc) {
60+
double cellTime = cell.getTimeStamp();
61+
LOG(debug) << "inserting in cell ID " << id << ": time = " << cellTime;
62+
mHistoTime(cellTime, id);
63+
}
5864
}
5965
}
6066
//_____________________________________________
@@ -68,6 +74,7 @@ void EMCALChannelData::merge(const EMCALChannelData* prev)
6874
mEvents += prev->getNEvents();
6975
mNEntriesInHisto += prev->getNEntriesInHisto();
7076
mHisto += prev->getHisto();
77+
mHistoTime += prev->getHistoTime();
7178
}
7279

7380
//_____________________________________________
@@ -91,7 +98,7 @@ bool EMCALChannelData::hasEnoughData() const
9198
//_____________________________________________
9299
void EMCALChannelData::analyzeSlot()
93100
{
94-
mOutputBCM = mCalibExtractor->calibrateBadChannels(mEsumHisto);
101+
mOutputBCM = mCalibExtractor->calibrateBadChannels(mEsumHisto, mHistoTime);
95102
}
96103
//____________________________________________
97104

0 commit comments

Comments
 (0)