25double zncHadronicRatio(
const std::string& sourceName)
27 const bool isZNChadronic = sourceName.find(
"ZNC") != std::string::npos &&
28 sourceName.find(
"hadronic") != std::string::npos;
29 return isZNChadronic ? 28. : 1.;
35 auto triggerRate =
fetchNoPuCorr(ccdb, timeStamp, runNumber, sourceName);
36 if (triggerRate < 0) {
40 const double ratio = zncHadronicRatio(sourceName);
41 return pileUpCorrection(triggerRate * ratio) / ratio;
45 setupRun(runNumber, ccdb, timeStamp, 1);
46 if (sourceName.find(
"ZNC") != std::string::npos) {
47 if (runNumber < 544448) {
48 return fetchCTPratesInputsNoPuCorr(timeStamp, 25) / (sourceName.find(
"hadronic") != std::string::npos ? 28. : 1.);
50 return fetchCTPratesClassesNoPuCorr(timeStamp,
"C1ZNC-B-NOPF-CRU", 6) / (sourceName.find(
"hadronic") != std::string::npos ? 28. : 1.);
52 }
else if (sourceName ==
"T0CE") {
53 return fetchCTPratesClassesNoPuCorr(timeStamp,
"CMTVXTCE-B-NOPF");
54 }
else if (sourceName ==
"T0SC") {
55 return fetchCTPratesClassesNoPuCorr(timeStamp,
"CMTVXTSC-B-NOPF");
56 }
else if (sourceName ==
"T0VTX") {
57 if (runNumber < 534202) {
58 return fetchCTPratesClassesNoPuCorr(timeStamp,
"minbias_TVX_L0", 3);
60 double ret = fetchCTPratesClassesNoPuCorr(timeStamp,
"CMTVX-B-NOPF");
62 LOG(info) <<
"Trying different class";
63 ret = fetchCTPratesClassesNoPuCorr(timeStamp,
"CMTVX-NONE");
65 LOG(error) <<
"None of the classes used for lumi found";
72 LOG(error) <<
"CTP rate for " << sourceName <<
" not available";
88 double rate0 =
fetch(ccdb, orbitlimits.first, mRunNumber, sourceName);
89 double rateLast =
fetch(ccdb, orbitlimits.second, mRunNumber, sourceName);
90 double rateM =
fetch(ccdb, (orbitlimits.first + orbitlimits.second) / 2, mRunNumber, sourceName);
99 if (classname ==
"zncinp") {
102 std::vector<ctp::CTPClass>& ctpcls = mConfig.
getCTPClasses();
105 for (
size_t i = 0;
i < clslist.size();
i++) {
106 if (ctpcls[
i].
name.find(classname) != std::string::npos) {
111 if (classIndex == -1) {
112 LOG(warn) <<
"Trigger class " << classname <<
" not found in CTPConfiguration";
119 std::vector<std::pair<double, double>> scals;
120 if (classname ==
"zncinp") {
123 std::vector<ctp::CTPClass>& ctpcls = mConfig.
getCTPClasses();
126 for (
size_t i = 0;
i < clslist.size();
i++) {
127 if (ctpcls[
i].
name.find(classname) != std::string::npos) {
132 if (classIndex == -1) {
133 LOG(warn) <<
"Trigger class " << classname <<
" not found in CTPConfiguration";
139 for (
auto const& ss : scals) {
141 lumi += pileUpCorrection(ss.first / ss.second) * ss.second;
157 if (sourceName.find(
"ZNC") != std::string::npos) {
158 if (runNumber < 544448) {
159 return getLumi(
"zncinp", 1, puCorr) / (sourceName.find(
"hadronic") != std::string::npos ? 28. : 1.);
161 return getLumi(
"C1ZNC-B-NOPF-CRU", 6, puCorr) / (sourceName.find(
"hadronic") != std::string::npos ? 28. : 1.);
163 }
else if (sourceName ==
"T0CE") {
164 return getLumi(
"CMTVXTCE-B-NOPF", 1, puCorr);
165 }
else if (sourceName ==
"T0SC") {
166 return getLumi(
"CMTVXTSC-B-NOPF", 1, puCorr);
167 }
else if (sourceName ==
"T0VTX") {
168 if (runNumber < 534202) {
169 return getLumi(
"minbias_TVX_L0", 3, puCorr);
171 double ret =
getLumi(
"CMTVX-B-NOPF", 1, puCorr);
173 LOG(info) <<
"Trying different class";
174 ret =
getLumi(
"CMTVX-NONE", 1, puCorr);
176 LOG(fatal) <<
"None of the classes used for lumi found";
182 LOG(error) <<
"CTP Lumi for " << sourceName <<
" not available";
186double CTPRateFetcher::fetchCTPratesClasses(uint64_t timeStamp,
const std::string& className,
int inputType)
188 auto triggerRate = fetchCTPratesClassesNoPuCorr(timeStamp, className, inputType);
189 if (triggerRate >= 0) {
190 return pileUpCorrection(triggerRate);
194double CTPRateFetcher::fetchCTPratesClassesNoPuCorr(uint64_t timeStamp,
const std::string& className,
int inputType)
196 std::vector<ctp::CTPClass>& ctpcls = mConfig.
getCTPClasses();
199 for (
size_t i = 0;
i < clslist.size();
i++) {
200 if (ctpcls[
i].
name.find(className) != std::string::npos) {
205 if (classIndex == -1) {
206 LOG(warn) <<
"Trigger class " << className <<
" not found in CTPConfiguration";
210 auto rate{mScalers.
getRate((uint32_t)timeStamp, classIndex, inputType, mOutsideLimits)};
213 auto rate{mScalers.
getRateGivenT(timeStamp * 1.e-3, classIndex, inputType, mOutsideLimits)};
217double CTPRateFetcher::fetchCTPratesInputs(uint64_t timeStamp,
int input)
220 if (recs[0].scalersInps.size() == 48) {
222 return pileUpCorrection(mScalers.
getRate((uint32_t)timeStamp, input, 7, mOutsideLimits).second);
224 return pileUpCorrection(mScalers.
getRateGivenT(timeStamp * 1.e-3, input, 7, mOutsideLimits).second);
227 LOG(error) <<
"Inputs not available";
231double CTPRateFetcher::fetchCTPratesInputsNoPuCorr(uint64_t timeStamp,
int input)
234 if (recs[0].scalersInps.size() == 48) {
236 return mScalers.
getRate((uint32_t)timeStamp, input, 7, mOutsideLimits).second;
238 return mScalers.
getRateGivenT(timeStamp * 1.e-3, input, 7, mOutsideLimits).second;
241 LOG(error) <<
"Inputs not available";
246double CTPRateFetcher::pileUpCorrection(
double triggerRate)
249 LOG(fatal) <<
"No filling" << std::endl;
253 double mu = -std::log(1 - nTriggersPerFilledBC);
259 if (runNumber == mRunNumber) {
262 mRunNumber = runNumber;
263 LOG(info) <<
"Setting up CTP scalers for run " << mRunNumber <<
" and timestamp : " << timeStamp;
265 if (ptrLHCIFdata ==
nullptr) {
266 LOG(error) <<
"GRPLHCIFData not in database, timestamp:" << timeStamp;
269 mLHCIFdata = *ptrLHCIFdata;
270 std::map<std::string, std::string> metadata;
273 if (ptrConfig ==
nullptr) {
274 LOG(error) <<
"CTPRunConfig not in database, timestamp:" << timeStamp;
277 mConfig = *ptrConfig;
281 mScalers = *ptrScalers;
284 LOG(error) <<
"CTPRunScalers not in database, timestamp:" << timeStamp;
Header to collect LHC related constants.
const auto & getPattern(int dir=-1) const
T * getSpecific(std::string const &path, long timestamp=-1, MD metaData=MD(), std::map< std::string, std::string > *headers=nullptr)
retrieve an object of type T from CCDB as stored under path, timestamp and metaData
std::vector< CTPClass > & getCTPClasses()
std::vector< int > getTriggerClassList() const
int getRates(std::array< double, 3 > &rates, o2::ccdb::BasicCCDBManager *ccdb, int runNumber, const std::string sourceName)
double getLumiWPuCorr(const std::string &classname, int type=1)
double getLumi(o2::ccdb::BasicCCDBManager *ccdb, int runNumber, const std::string sourceName, int puCorr=0)
void setupRun(int runNumber, o2::ccdb::BasicCCDBManager *ccdb, uint64_t timeStamp, bool initScalers)
double fetchNoPuCorr(o2::ccdb::BasicCCDBManager *ccdb, uint64_t timeStamp, int runNumber, const std::string sourceName)
double getLumiNoPuCorr(const std::string &classname, int type=1)
void updateScalers(ctp::CTPRunScalers &scalers)
double fetch(o2::ccdb::BasicCCDBManager *ccdb, uint64_t timeStamp, int runNumber, const std::string sourceName)
uint64_t getLumiNoPuCorr(int classindex, int type) const
retrieves integral - same interface as getRate, no pileup correction
std::pair< double, double > getRate(uint32_t orbit, int classindex, int type, bool qc=0) const
std::pair< double, double > getRateGivenT(double timestamp, int classindex, int type, bool qc=0) const
same with absolute timestamp (not orbit) as argument
std::pair< unsigned long, unsigned long > getOrbitLimit() const
retrieves orbit boundaries of this scaler object from O2
std::vector< CTPScalerRecordO2 > & getScalerRecordO2()
std::vector< std::pair< double_t, double_t > > getRatesForIndex(int classindex, int type) const
retrieves vector of counters - same interface as getRate, needed for
const o2::BunchFilling & getBunchFilling() const
int32_t getFillNumber() const
GLuint const GLchar * name
GLint GLint GLsizei GLint GLenum GLenum type
GLuint GLsizei const GLenum * rates
constexpr double LHCRevFreq
std::string to_string(gsl::span< T, Size > span)
LOG(info)<< "Compressed in "<< sw.CpuTime()<< " s"