Skip to content

Commit e4efba2

Browse files
committed
dev: decoder: checking only trigger class bits which belongs to run
1 parent f1eaeb2 commit e4efba2

File tree

7 files changed

+125
-49
lines changed

7 files changed

+125
-49
lines changed

Detectors/CTP/macro/PlotPbLumi.C

Lines changed: 87 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -20,37 +20,56 @@
2020
#include "CCDB/BasicCCDBManager.h"
2121
#include "DataFormatsCTP/Scalers.h"
2222
#include "DataFormatsCTP/Configuration.h"
23+
#include <DataFormatsParameters/GRPLHCIFData.h>
24+
#include "TGraph.h"
25+
#include "TGraphErrors.h"
26+
#include "TCanvas.h"
27+
#include "TMath.h"
28+
#include "TStyle.h"
29+
#include "TF1.h"
2330
#include <string>
2431
#include <map>
2532
#include <iostream>
2633
#endif
2734
using namespace o2::ctp;
28-
void PlotPbLumi(int runNumber, int fillN, std::string ccdbHost = "http://ccdb-test.cern.ch:8080")
29-
{ //
30-
// what = 1: znc rate
31-
// what = 2: (TCE+TSC)/ZNC
32-
// what = 3: TCE/ZNC
35+
using namespace std::chrono;
36+
//
37+
// if fillN = 0: pileup correction not done
38+
// QCDB =1 : use for ongoing run
39+
//
40+
void PlotPbLumi(int runNumber, int fillN = 0, int QCDB = 0, std::string ccdbHost = "http://alice-ccdb.cern.ch" )
41+
{ // "http://ccdb-test.cern.ch:8080"
3342
std::string mCCDBPathCTPScalers = "CTP/Calib/Scalers";
43+
std::string mQCDBPathCTPScalers = "qc/CTP/Scalers";
3444
std::string mCCDBPathCTPConfig = "CTP/Config/Config";
3545
auto& ccdbMgr = o2::ccdb::BasicCCDBManager::instance();
46+
ccdbMgr.setURL(ccdbHost);
3647
// Timestamp
3748
auto soreor = ccdbMgr.getRunDuration(runNumber);
3849
uint64_t timeStamp = (soreor.second - soreor.first) / 2 + soreor.first;
3950
std::cout << "Timestamp:" << timeStamp << std::endl;
4051
// Filling
41-
std::string sfill = std::to_string(fillN);
4252
std::map<string, string> metadata;
43-
metadata["fillNumber"] = sfill;
44-
auto lhcifdata = ccdbMgr.getSpecific<o2::parameters::GRPLHCIFData>("GLO/Config/GRPLHCIF", timeStamp, metadata);
45-
auto bfilling = lhcifdata->getBunchFilling();
46-
std::vector<int> bcs = bfilling.getFilledBCs();
47-
int nbc = bcs.size();
48-
std::cout << "Number of interacting bc:" << nbc << std::endl;
53+
int nbc = 0;
54+
if(fillN) {
55+
std::string sfill = std::to_string(fillN);
56+
metadata["fillNumber"] = sfill;
57+
auto lhcifdata = ccdbMgr.getSpecific<o2::parameters::GRPLHCIFData>("GLO/Config/GRPLHCIF", timeStamp, metadata);
58+
auto bfilling = lhcifdata->getBunchFilling();
59+
std::vector<int> bcs = bfilling.getFilledBCs();
60+
nbc = bcs.size();
61+
std::cout << "Number of interacting bc:" << nbc << std::endl;
62+
}
63+
if(QCDB) { // use this option for ongoing run
64+
mCCDBPathCTPScalers = mQCDBPathCTPScalers;
65+
ccdbMgr.setURL("http://ccdb-test.cern.ch:8080");
66+
timeStamp = duration_cast< milliseconds >(system_clock::now().time_since_epoch()).count();
67+
std::cout << "For scalers using Current time:" << timeStamp << std::endl;
68+
}
4969
// Scalers
5070
std::string srun = std::to_string(runNumber);
5171
metadata.clear(); // can be empty
5272
metadata["runNumber"] = srun;
53-
ccdbMgr.setURL("http://ccdb-test.cern.ch:8080");
5473
auto scl = ccdbMgr.getSpecific<CTPRunScalers>(mCCDBPathCTPScalers, timeStamp, metadata);
5574
if (scl == nullptr) {
5675
LOG(info) << "CTPRunScalers not in database, timestamp:" << timeStamp;
@@ -105,48 +124,72 @@ void PlotPbLumi(int runNumber, int fillN, std::string ccdbHost = "http://ccdb-te
105124
return;
106125
}
107126
//
108-
// Anal
109-
//
110127
// Times
111128
double_t frev = 11245;
112129
double_t time0 = recs[0].epochTime;
113130
double_t timeL = recs[recs.size() - 1].epochTime;
114131
double_t Trun = timeL - time0;
115132
double_t orbit0 = recs[0].intRecord.orbit;
116133
int n = recs.size() - 1;
134+
if(runNumber == 559143) {
135+
n = 400;
136+
}
137+
if(runNumber == 559561 ) {
138+
n = n - 3; // rate drops at the end
139+
}
140+
if(runNumber == 559575){
141+
n = n - 6;
142+
}
143+
if(runNumber == 559617) {
144+
n = n - 5;
145+
}
146+
if(runNumber == 559632) {
147+
n = n - 6;
148+
}
117149
std::cout << " Run duration:" << Trun << " Scalers size:" << n + 1 << std::endl;
118-
Double_t x[n], znc[n], zncpp[n];
150+
Double_t x[n], znc[n], zncpp[n], ex[n], eznc[n];
119151
Double_t tcetsctoznc[n], tcetoznc[n], vchtoznc[n];
152+
Double_t etcetsctoznc[n], etcetoznc[n], evchtoznc[n];
153+
120154
for (int i = 0; i < n; i++) {
155+
ex[i] = 0;
121156
x[i] = (double_t)(recs[i + 1].intRecord.orbit + recs[i].intRecord.orbit) / 2. - orbit0;
122157
x[i] *= 88e-6;
123158
// x[i] = (double_t)(recs[i+1].epochTime + recs[i].epochTime)/2.;
124159
double_t tt = (double_t)(recs[i + 1].intRecord.orbit - recs[i].intRecord.orbit);
125160
tt = tt * 88e-6;
126161
//
127-
// std::cout << recs[i+1].scalersInps[25] << std::endl;
128162
double_t znci = (double_t)(recs[i + 1].scalersInps[25] - recs[i].scalersInps[25]);
129-
double_t mu = -TMath::Log(1. - znci / tt / nbc / frev);
130-
double_t zncipp = mu * nbc * frev;
163+
double_t zncipp = znci;
164+
double_t mu = 0;
165+
if(fillN) {
166+
mu = -TMath::Log(1. - znci / tt / nbc / frev);
167+
zncipp = mu * nbc * frev * tt;
168+
}
131169
zncpp[i] = zncipp / 28.;
132-
znc[i] = znci / 28. / tt;
133-
//
134-
auto had = recs[i + 1].scalers[tce].lmBefore - recs[i].scalers[tce].lmBefore;
135-
// std::cout << recs[i+1].scalers[tce].lmBefore << std::endl;
136-
had += recs[i + 1].scalers[tsc].lmBefore - recs[i].scalers[tsc].lmBefore;
137-
// rat = (double_t)(had)/double_t(recs[i+1].scalersInps[25] - recs[i].scalersInps[25])*28;
138-
tcetsctoznc[i] = (double_t)(had) / zncpp[i] / tt;
139-
had = recs[i + 1].scalers[tce].lmBefore - recs[i].scalers[tce].lmBefore;
140-
// rat = (double_t)(had)/double_t(recs[i+1].scalersInps[25] - recs[i].scalersInps[25])*28;
141-
tcetoznc[i] = (double_t)(had) / zncpp[i] / tt;
142-
had = recs[i + 1].scalers[vch].lmBefore - recs[i].scalers[vch].lmBefore;
143-
// rat = (double_t)(had)/double_t(recs[i+1].scalersInps[25] - recs[i].scalersInps[25])*28;
144-
vchtoznc[i] = (double_t)(had) / zncpp[i] / tt;
170+
znc[i] = zncipp / 28. / tt;
171+
eznc[i] = TMath::Sqrt(zncipp) / 28. / tt;
172+
if(1){
173+
//
174+
auto had = recs[i + 1].scalers[tsc].lmBefore - recs[i].scalers[tsc].lmBefore;
175+
had += recs[i + 1].scalers[tce].lmBefore - recs[i].scalers[tce].lmBefore;
176+
tcetsctoznc[i] = (double_t)(had) / zncpp[i];
177+
etcetsctoznc[i] = TMath::Sqrt(tcetsctoznc[i]*(1-tcetsctoznc[i])/ zncpp[i]);
178+
had = recs[i + 1].scalers[tce].lmBefore - recs[i].scalers[tce].lmBefore;
179+
double_t tcec = had;
180+
tcetoznc[i] = (double_t)(had) / zncpp[i];
181+
had = recs[i + 1].scalers[vch].lmBefore - recs[i].scalers[vch].lmBefore;
182+
vchtoznc[i] = (double_t)(had) / zncpp[i] ;
183+
//std::cout << "mu:" << mu << " zncpp corr:" << zncipp << " zncraw:" << znci << " tce:" << tcec << " tce/had" << tcec/zncpp[i] << std::endl;
184+
}
145185
}
146186
//
187+
TFile myfile("file.root","RECREATE");
147188
gStyle->SetMarkerSize(0.5);
148-
TGraph* gr1 = new TGraph(n, x, znc);
189+
//TGraph* gr1 = new TGraph(n, x, znc);
190+
TGraphErrors* gr1 = new TGraphErrors(n, x, znc, ex, eznc);
149191
TGraph* gr2 = new TGraph(n, x, tcetsctoznc);
192+
//TGraphErrors* gr2 = new TGraphErrors(n, x, tcetsctoznc, ex, etcetsctoznc); // nom and denom are strongly correlated
150193
TGraph* gr3 = new TGraph(n, x, tcetoznc);
151194
TGraph* gr4 = new TGraph(n, x, vchtoznc);
152195
gr1->SetMarkerStyle(20);
@@ -155,6 +198,7 @@ void PlotPbLumi(int runNumber, int fillN, std::string ccdbHost = "http://ccdb-te
155198
gr4->SetMarkerStyle(23);
156199
gr1->SetTitle("R=ZNC/28 rate [Hz]; time[sec]; R");
157200
gr2->SetTitle("R=(TSC+TCE)*TVTX*B*28/ZNC; time[sec]; R");
201+
//gr2->SetTitle("R=TSC*TVTX*B*28/ZNC; time[sec]; R");
158202
// gr2->GetHistogram()->SetMaximum(1.1);
159203
// gr2->GetHistogram()->SetMinimum(0.9);
160204
gr3->SetTitle("R=(TCE)*TVTX*B*28/ZNC; time[sec]; R");
@@ -164,19 +208,29 @@ void PlotPbLumi(int runNumber, int fillN, std::string ccdbHost = "http://ccdb-te
164208
// gr4->GetHistogram()->SetMaximum(0.6);
165209
// gr4->GetHistogram()->SetMinimum(0.4);
166210
TCanvas* c1 = new TCanvas("c1", srun.c_str(), 200, 10, 800, 500);
211+
TF1 *fun = new TF1("poly0","[0]+x*[1]");
167212
c1->Divide(2, 2);
168213
c1->cd(1);
169214
gr1->Draw("AP");
170215
c1->cd(2);
216+
fun->SetParameter(0,1);
217+
gr2->Fit("poly0","FM");
171218
gr2->Draw("AP");
172219
c1->cd(3);
220+
fun->SetParameter(0,0.5);
221+
gr3->Fit("poly0");
173222
gr3->Draw("AP");
174223
c1->cd(4);
224+
gr4->Fit("poly0");
175225
gr4->Draw("AP");
176226
// getRate test:
177227
double tt = timeStamp / 1000.;
178228
std::pair<double, double> r1 = scl->getRateGivenT(tt, 25, 7);
179229
std::cout << "ZDC input getRateGivetT:" << r1.first / 28. << " " << r1.second / 28. << std::endl;
180230
std::pair<double, double> r2 = scl->getRateGivenT(tt, tce, 1);
181231
std::cout << "LM before TCE class getRateGivetT:" << r2.first << " " << r2.second << std::endl;
232+
gr1->Write();
233+
gr2->Write();
234+
gr3->Write();
235+
gr4->Write();
182236
}

Detectors/CTP/macro/TestConfig.C

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -16,13 +16,13 @@
1616
#endif
1717
using namespace o2::ctp;
1818

19-
void TestConfig(bool test = 0)
19+
void TestConfig(bool test = 1)
2020
{
2121
if (test == 0) {
2222
return;
2323
}
24-
uint64_t timestamp = 1660196771632;
25-
std::string run = "523148";
24+
uint64_t timestamp = 1660276134898+10000;
25+
std::string run = "523186";
2626
o2::ctp::ctpCCDBManager::setCCDBHost("https://alice-ccdb.cern.ch");
2727
bool ok;
2828
auto ctpcfg = o2::ctp::ctpCCDBManager::getConfigFromCCDB(timestamp, run, ok);
@@ -31,13 +31,17 @@ void TestConfig(bool test = 0)
3131
}
3232
CTPConfiguration ctpconfig;
3333
ctpconfig.loadConfigurationRun3(ctpcfg.getConfigString());
34-
// ctpconfig.printStream(std::cout);
35-
// return;
36-
// ctpconfig.assignDescriptors();
37-
// ctpconfig.createInputsInDecriptorsFromNames();
3834
ctpconfig.printStream(std::cout);
3935
auto& triggerclasses = ctpconfig.getCTPClasses();
4036
std::cout << "Found " << triggerclasses.size() << " trigger classes" << std::endl;
37+
for (const auto& trg : triggerclasses) {
38+
if (trg.cluster->maskCluster[o2::detectors::DetID::EMC]) {
39+
// Class triggering EMCAL cluster
40+
LOG(info) << "Found trigger class for EMCAL cluster: " << trg.name << " with input mask " << std::bitset<64>(trg.descriptor->getInputsMask());
41+
trg.descriptor->getInputsMask();
42+
}
43+
}
44+
return;
4145
int indexInList = 0;
4246
for (const auto& trgclass : triggerclasses) {
4347
uint64_t inputmask = 0;

Detectors/CTP/macro/TestFetcher.C

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616
#endif
1717
using namespace o2::ctp;
1818

19-
void TestFetcher(int runNumber = 557251)
19+
void TestFetcher(int runNumber = 559456)
2020
{
2121
auto& ccdb = o2::ccdb::BasicCCDBManager::instance();
2222
std::pair<int64_t, int64_t> pp = ccdb.getRunDuration(runNumber);
@@ -25,7 +25,9 @@ void TestFetcher(int runNumber = 557251)
2525
// Opening run
2626
CTPRateFetcher fetcher;
2727
fetcher.setupRun(runNumber, &ccdb, ts, 0);
28-
ccdb.setURL("http://ali-qcdb-gpn.cern.ch:8083/");
28+
//ccdb.setURL("http://ali-qcdb-gpn.cern.ch:8083/");
29+
ccdb.setURL("http://ccdb-test.cern.ch:8080/");
30+
2931
std::string QCDBPathCTPScalers = "qc/CTP/Scalers";
3032
map<string, string> metadata; // can be empty
3133
std::string run = std::to_string(runNumber);

Detectors/CTP/reconstruction/include/CTPReconstruction/RawDataDecoder.h

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
#include "Framework/InputRecord.h"
2323
#include "DataFormatsCTP/Digits.h"
2424
#include "DataFormatsCTP/LumiInfo.h"
25+
#include "DataFormatsCTP/Configuration.h"
2526

2627
namespace o2
2728
{
@@ -43,14 +44,15 @@ class RawDataDecoder
4344
void setVerbose(bool v) { mVerbose = v; }
4445
void setMAXErrors(int m) { mErrorMax = m; }
4546
int setLumiInp(int lumiinp, std::string inp);
47+
void setCTPConfig( CTPConfiguration cfg) { mCTPConfig = std::move(cfg); };
4648
uint32_t getIRRejected() const { return mIRRejected; }
4749
uint32_t getTCRRejected() const { return mTCRRejected; }
4850
std::vector<uint32_t>& getTFOrbits() { return mTFOrbits; }
4951
int getErrorIR() { return mErrorIR; }
5052
int getErrorTCR() { return mErrorTCR; }
5153
int init();
5254
static int shiftNew(const o2::InteractionRecord& irin, uint32_t TFOrbit, std::bitset<48>& inpmask, int64_t shift, int level, std::map<o2::InteractionRecord, CTPDigit>& digmap);
53-
static int shiftInputs(std::map<o2::InteractionRecord, CTPDigit>& digitsMap, o2::pmr::vector<CTPDigit>& digits, uint32_t TFOrbit);
55+
static int shiftInputs(std::map<o2::InteractionRecord, CTPDigit>& digitsMap, o2::pmr::vector<CTPDigit>& digits, uint32_t TFOrbit, uint64_t trgclassmask = 0xffffffffffffffff);
5456

5557
private:
5658
static constexpr uint32_t TF_TRIGGERTYPE_MASK = 0x800;
@@ -79,6 +81,7 @@ class RawDataDecoder
7981
int mErrorTCR = 0;
8082
int mErrorMax = 3;
8183
bool mStickyError = false;
84+
CTPConfiguration mCTPConfig;
8285
};
8386
} // namespace ctp
8487
} // namespace o2

Detectors/CTP/reconstruction/src/RawDataDecoder.cxx

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -293,7 +293,9 @@ int RawDataDecoder::decodeRaw(o2::framework::InputRecord& inputs, std::vector<o2
293293
// std::cout << "last lumi:" << nhb << std::endl;
294294
}
295295
if (mDoDigits & mDecodeInps) {
296-
shiftInputs(digitsMap, digits, mTFOrbit);
296+
uint64_t trgclassmask = mCTPConfig.getTriggerClassMask();
297+
std::cout << "trgclassmask:" << std::hex << trgclassmask << std::dec << std::endl;
298+
shiftInputs(digitsMap, digits, mTFOrbit, trgclassmask);
297299
}
298300
if (mDoDigits && !mDecodeInps) {
299301
for (auto const& dig : digitsMap) {
@@ -519,7 +521,7 @@ int RawDataDecoder::shiftNew(const o2::InteractionRecord& irin, uint32_t TFOrbit
519521
}
520522
//
521523

522-
int RawDataDecoder::shiftInputs(std::map<o2::InteractionRecord, CTPDigit>& digitsMap, o2::pmr::vector<CTPDigit>& digits, uint32_t TFOrbit)
524+
int RawDataDecoder::shiftInputs(std::map<o2::InteractionRecord, CTPDigit>& digitsMap, o2::pmr::vector<CTPDigit>& digits, uint32_t TFOrbit, uint64_t trgclassmask)
523525
{
524526
// int nClasswoInp = 0; // counting classes without input which should never happen
525527
int nLM = 0;
@@ -594,7 +596,7 @@ int RawDataDecoder::shiftInputs(std::map<o2::InteractionRecord, CTPDigit>& digit
594596
if ((d.CTPInputMask & L1MASKInputs).count()) {
595597
nL1++;
596598
}
597-
if (d.CTPClassMask.count()) {
599+
if ((d.CTPClassMask).to_ulong() & trgclassmask) {
598600
if (d.CTPInputMask.count()) {
599601
nTwI++;
600602
} else {

Detectors/CTP/workflow/include/CTPWorkflow/RawDecoderSpec.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,7 @@ class RawDecoderSpec : public framework::Task
6868
uint32_t mNTFToIntegrate = 1;
6969
uint32_t mNHBIntegratedT = 0;
7070
uint32_t mNHBIntegratedV = 0;
71+
bool mDecodeinputs = 0;
7172
std::deque<size_t> mHistoryT;
7273
std::deque<size_t> mHistoryV;
7374
RawDataDecoder mDecoder;

Detectors/CTP/workflow/src/RawDecoderSpec.cxx

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,13 +20,15 @@
2020
#include "CommonUtils/VerbosityConfig.h"
2121
#include "Framework/InputRecord.h"
2222
#include "DataFormatsCTP/TriggerOffsetsParam.h"
23+
#include "Framework/CCDBParamSpec.h"
24+
#include "DataFormatsCTP/Configuration.h"
2325

2426
using namespace o2::ctp::reco_workflow;
2527

2628
void RawDecoderSpec::init(framework::InitContext& ctx)
2729
{
28-
bool decodeinps = ctx.options().get<bool>("ctpinputs-decoding");
29-
mDecoder.setDecodeInps(decodeinps);
30+
mDecodeinputs = ctx.options().get<bool>("ctpinputs-decoding");
31+
mDecoder.setDecodeInps(mDecodeinputs);
3032
mNTFToIntegrate = ctx.options().get<int>("ntf-to-average");
3133
mVerbose = ctx.options().get<bool>("use-verbose-mode");
3234
int maxerrors = ctx.options().get<int>("print-errors-num");
@@ -42,7 +44,7 @@ void RawDecoderSpec::init(framework::InitContext& ctx)
4244
mOutputLumiInfo.inp2 = inp2;
4345
mMaxInputSize = ctx.options().get<int>("max-input-size");
4446
mMaxInputSizeFatal = ctx.options().get<bool>("max-input-size-fatal");
45-
LOG(info) << "CTP reco init done. Inputs decoding here:" << decodeinps << " DoLumi:" << mDoLumi << " DoDigits:" << mDoDigits << " NTF:" << mNTFToIntegrate << " Lumi inputs:" << lumiinp1 << ":" << inp1 << " " << lumiinp2 << ":" << inp2 << " Max errors:" << maxerrors << " Max input size:" << mMaxInputSize << " MaxInputSizeFatal:" << mMaxInputSizeFatal;
47+
LOG(info) << "CTP reco init done. Inputs decoding here:" << mDecodeinputs << " DoLumi:" << mDoLumi << " DoDigits:" << mDoDigits << " NTF:" << mNTFToIntegrate << " Lumi inputs:" << lumiinp1 << ":" << inp1 << " " << lumiinp2 << ":" << inp2 << " Max errors:" << maxerrors << " Max input size:" << mMaxInputSize << " MaxInputSizeFatal:" << mMaxInputSizeFatal;
4648
// mOutputLumiInfo.printInputs();
4749
}
4850
void RawDecoderSpec::endOfStream(framework::EndOfStreamContext& ec)
@@ -135,6 +137,11 @@ void RawDecoderSpec::run(framework::ProcessingContext& ctx)
135137
if (fatal_flag) {
136138
ret = mDecoder.decodeRawFatal(inputs, filter);
137139
} else {
140+
if(mDecodeinputs) {
141+
const auto ctpcfg = inputs.get<o2::ctp::CTPConfiguration*>("ctpconfig");
142+
//ctpcfg->printStream(std::cout);
143+
mDecoder.setCTPConfig(*ctpcfg);
144+
}
138145
ret = mDecoder.decodeRaw(inputs, filter, mOutputDigits, lumiPointsHBF1);
139146
}
140147
if (ret == 1) {
@@ -176,6 +183,8 @@ void RawDecoderSpec::run(framework::ProcessingContext& ctx)
176183
mOutputLumiInfo.orbit = lumiPointsHBF1[0].orbit;
177184
}
178185
mOutputLumiInfo.counts = mCountsT;
186+
187+
179188
mOutputLumiInfo.countsFV0 = mCountsV;
180189
mOutputLumiInfo.nHBFCounted = mNHBIntegratedT;
181190
mOutputLumiInfo.nHBFCountedFV0 = mNHBIntegratedV;
@@ -199,6 +208,7 @@ o2::framework::DataProcessorSpec o2::ctp::reco_workflow::getRawDecoderSpec(bool
199208

200209
std::vector<o2::framework::OutputSpec> outputs;
201210
if (digits) {
211+
inputs.emplace_back("ctpconfig", "CTP", "CTPCONFIG", 0, o2::framework::Lifetime::Condition, o2::framework::ccdbParamSpec("CTP/Config/Config", 1));
202212
outputs.emplace_back("CTP", "DIGITS", 0, o2::framework::Lifetime::Timeframe);
203213
}
204214
if (lumi) {

0 commit comments

Comments
 (0)