32 mCellAmplitude = std::unique_ptr<TH2>(
new TH2F(
"mCellAmplitude",
"Cell amplitude", 800, 0., 40., 17664, -0.5, 17663.5));
34 mCellTime = std::unique_ptr<TH2>(
new TH2F(
"mCellTime",
"Cell time", 800, -200, 600, 17664, -0.5, 17663.5));
36 mCellTimeLG = std::unique_ptr<TH2>(
new TH2F(
"mCellTimeLG",
"Cell time (low gain)", 800, -200, 600, 17664, -0.5, 17663.5));
38 mCellTimeHG = std::unique_ptr<TH2>(
new TH2F(
"mCellTimeHG",
"Cell time (high gain)", 800, -200, 600, 17664, -0.5, 17663.5));
40 mNevents = std::unique_ptr<TH1>(
new TH1F(
"mNevents",
"Number of events", 1, 0.5, 1.5));
41 if (mMakeCellIDTimeEnergy) {
43 std::array<int, 3> arrNBins = {17664, 100, 100};
44 std::array<double, 3> arrMin = {-0.5, -50, 0};
45 std::array<double, 3> arrMax = {17663.5, 50., 50};
46 mCellTimeEnergy = std::unique_ptr<THnSparseF>(
new THnSparseF(
"CellIDvsTimevsEnergy",
"CellIDvsTimevsEnergy", arrNBins.size(), arrNBins.data(), arrMin.data(), arrMax.data()));
52 LOG(info) <<
"Handling new Calibration objects";
53 mCalibrationHandler->finalizeCCDB(matcher, obj);
56 LOG(info) <<
"EMCal CalibParams updated";
63 mSelectedClassMasks.clear();
65 std::string delimiter =
":";
67 std::vector<std::string> vSelMasks;
68 while ((
pos = strSelClassMasks.find(delimiter)) != std::string::npos) {
69 vSelMasks.push_back(strSelClassMasks.substr(0,
pos));
70 strSelClassMasks.erase(0,
pos + delimiter.length());
72 vSelMasks.push_back(strSelClassMasks);
76 for (
auto& cls : ctpconf->getCTPClasses()) {
77 LOG(
debug) <<
"CTP class: " << cls.name <<
"\t " << cls.classMask;
79 if (std::find(vSelMasks.begin(), vSelMasks.end(), cls.name) != vSelMasks.end()) {
80 mSelectedClassMasks.push_back(cls.classMask);
81 LOG(info) <<
"Setting selected class mask " << cls.name <<
" to bit " << cls.classMask;
98 auto triggerrecords = pc.
inputs().
get<gsl::span<o2::emcal::TriggerRecord>>(
"triggerrecord");
101 if (mRejectL0Triggers) {
106 std::optional<ctpDigitsType> ctpDigits;
107 if (mRejectL0Triggers) {
111 mCalibrationHandler->checkUpdates(pc);
112 updateCalibObjects();
114 LOG(
debug) <<
"[EMCALOfflineCalib - run] received " <<
cells.size() <<
" cells from " << triggerrecords.size() <<
" triggers ...";
115 if (triggerrecords.size()) {
116 for (
const auto& trg : triggerrecords) {
117 if (!trg.getNumberOfObjects()) {
118 LOG(
debug) <<
"[EMCALOfflineCalib - run] Trigger does not contain cells, skipping ...";
123 if (mRejectCalibTriggers) {
126 LOG(
debug) <<
"skipping triggered events due to wrong trigger (no Physics trigger)";
132 uint64_t classMaskCTP = 0;
133 if (mRejectL0Triggers) {
134 bool acceptEvent =
false;
136 int64_t bcEMC = trg.getBCData().toLong();
137 for (
auto& ctpDigit : *ctpDigits) {
138 int64_t bcCTP = ctpDigit.intRecord.toLong();
139 LOG(
debug) <<
"bcEMC " << bcEMC <<
" bcCTP " << bcCTP;
140 if (bcCTP == bcEMC) {
142 classMaskCTP = ctpDigit.CTPClassMask.to_ulong();
144 for (
const uint64_t& selectedClassMask : mSelectedClassMasks) {
145 if ((classMaskCTP & selectedClassMask) != 0) {
146 LOG(
debug) <<
"trigger " << selectedClassMask <<
" found! accepting event";
160 LOG(
debug) <<
"[EMCALOfflineCalib - run] Trigger has " << trg.getNumberOfObjects() <<
" cells ..." << std::endl;
161 gsl::span<const o2::emcal::Cell> objectsTrigger(
cells.data() + trg.getFirstEntry(), trg.getNumberOfObjects());
162 for (
const auto&
c : objectsTrigger) {
163 LOG(
debug) <<
"[EMCALOfflineSpec - run] Channel: " <<
c.getTower();
164 LOG(
debug) <<
"[EMCALOfflineSpec - run] Energy: " <<
c.getEnergy();
165 LOG(
debug) <<
"[EMCALOfflineSpec - run] Time: " <<
c.getTimeStamp();
166 LOG(
debug) <<
"[EMCALOfflineSpec - run] IsLowGain: " <<
c.getLowGain();
167 float cellE =
c.getEnergy();
168 if (mGainCalibFactors && mCalibrationHandler->hasGainCalib()) {
171 LOG(
debug) <<
"[EMCALOfflineSpec - run] corrected Energy: " << cellE;
173 mCellAmplitude->Fill(cellE,
c.getTower());
175 mCellTime->Fill(
c.getTimeStamp(),
c.getTower());
176 if (
c.getLowGain()) {
177 mCellTimeLG->Fill(
c.getTimeStamp(),
c.getTower());
179 mCellTimeHG->Fill(
c.getTimeStamp(),
c.getTower());
181 if (mMakeCellIDTimeEnergy) {
182 mCellTimeEnergy->Fill(
c.getTower(),
c.getTimeStamp(), cellE);
210 std::vector<o2::framework::InputSpec>
214 if (rejectL0Trigger) {
218 auto calibhandler = std::make_shared<o2::emcal::CalibLoader>();
219 calibhandler->enableGainCalib(enableGainCalib);
220 calibhandler->defineInputSpecs(inputs);
225 o2::framework::adaptFromTask<o2::emcal::OfflineCalibSpec>(makeCellIDTimeEnergy, rejectCalibTriggers, rejectL0Trigger, calibhandler)};
InputRecord & inputs()
The inputs associated with this processing context.
o2::framework::DataProcessorSpec getEmcalOfflineCalibSpec(bool makeCellIDTimeEnergy, bool rejectCalibTriggers, bool rejectL0Trigger, uint32_t inputsubspec, bool enableGainCalib, bool ctpcfgperrun)
Creating offline calib spec.