22 auto triggerRate =
fetchNoPuCorr(ccdb, timeStamp, runNumber, sourceName);
23 if (triggerRate >= 0) {
24 return pileUpCorrection(triggerRate);
30 setupRun(runNumber, ccdb, timeStamp, 1);
31 if (sourceName.find(
"ZNC") != std::string::npos) {
32 if (runNumber < 544448) {
33 return fetchCTPratesInputsNoPuCorr(timeStamp, 25) / (sourceName.find(
"hadronic") != std::string::npos ? 28. : 1.);
35 return fetchCTPratesClassesNoPuCorr(timeStamp,
"C1ZNC-B-NOPF-CRU", 6) / (sourceName.find(
"hadronic") != std::string::npos ? 28. : 1.);
37 }
else if (sourceName ==
"T0CE") {
38 return fetchCTPratesClassesNoPuCorr(timeStamp,
"CMTVXTCE-B-NOPF");
39 }
else if (sourceName ==
"T0SC") {
40 return fetchCTPratesClassesNoPuCorr(timeStamp,
"CMTVXTSC-B-NOPF");
41 }
else if (sourceName ==
"T0VTX") {
42 if (runNumber < 534202) {
43 return fetchCTPratesClassesNoPuCorr(timeStamp,
"minbias_TVX_L0", 3);
45 double ret = fetchCTPratesClassesNoPuCorr(timeStamp,
"CMTVX-B-NOPF");
47 LOG(info) <<
"Trying different class";
48 ret = fetchCTPratesClassesNoPuCorr(timeStamp,
"CMTVX-NONE");
50 LOG(error) <<
"None of the classes used for lumi found";
57 LOG(error) <<
"CTP rate for " << sourceName <<
" not available";
73 double rate0 =
fetch(ccdb, orbitlimits.first, mRunNumber, sourceName);
74 double rateLast =
fetch(ccdb, orbitlimits.second, mRunNumber, sourceName);
75 double rateM =
fetch(ccdb, (orbitlimits.first + orbitlimits.second) / 2, mRunNumber, sourceName);
84 if (classname ==
"zncinp") {
90 for (
size_t i = 0;
i < clslist.size();
i++) {
91 if (ctpcls[
i].
name.find(classname) != std::string::npos) {
96 if (classIndex == -1) {
97 LOG(warn) <<
"Trigger class " << classname <<
" not found in CTPConfiguration";
104 std::vector<std::pair<double, double>> scals;
105 if (classname ==
"zncinp") {
108 std::vector<ctp::CTPClass>& ctpcls = mConfig.
getCTPClasses();
111 for (
size_t i = 0;
i < clslist.size();
i++) {
112 if (ctpcls[
i].
name.find(classname) != std::string::npos) {
117 if (classIndex == -1) {
118 LOG(warn) <<
"Trigger class " << classname <<
" not found in CTPConfiguration";
124 for (
auto const& ss : scals) {
126 lumi += pileUpCorrection(ss.first / ss.second) * ss.second;
142 if (sourceName.find(
"ZNC") != std::string::npos) {
143 if (runNumber < 544448) {
144 return getLumi(
"zncinp", 1, puCorr) / (sourceName.find(
"hadronic") != std::string::npos ? 28. : 1.);
146 return getLumi(
"C1ZNC-B-NOPF-CRU", 6, puCorr) / (sourceName.find(
"hadronic") != std::string::npos ? 28. : 1.);
148 }
else if (sourceName ==
"T0CE") {
149 return getLumi(
"CMTVXTCE-B-NOPF", 1, puCorr);
150 }
else if (sourceName ==
"T0SC") {
151 return getLumi(
"CMTVXTSC-B-NOPF", 1, puCorr);
152 }
else if (sourceName ==
"T0VTX") {
153 if (runNumber < 534202) {
154 return getLumi(
"minbias_TVX_L0", 3, puCorr);
156 double ret =
getLumi(
"CMTVX-B-NOPF", 1, puCorr);
158 LOG(info) <<
"Trying different class";
159 ret =
getLumi(
"CMTVX-NONE", 1, puCorr);
161 LOG(fatal) <<
"None of the classes used for lumi found";
167 LOG(error) <<
"CTP Lumi for " << sourceName <<
" not available";
171double CTPRateFetcher::fetchCTPratesClasses(uint64_t timeStamp,
const std::string& className,
int inputType)
173 auto triggerRate = fetchCTPratesClassesNoPuCorr(timeStamp, className, inputType);
174 if (triggerRate >= 0) {
175 return pileUpCorrection(triggerRate);
179double CTPRateFetcher::fetchCTPratesClassesNoPuCorr(uint64_t timeStamp,
const std::string& className,
int inputType)
181 std::vector<ctp::CTPClass>& ctpcls = mConfig.
getCTPClasses();
184 for (
size_t i = 0;
i < clslist.size();
i++) {
185 if (ctpcls[
i].
name.find(className) != std::string::npos) {
190 if (classIndex == -1) {
191 LOG(warn) <<
"Trigger class " << className <<
" not found in CTPConfiguration";
195 auto rate{mScalers.
getRate((uint32_t)timeStamp, classIndex, inputType, mOutsideLimits)};
198 auto rate{mScalers.
getRateGivenT(timeStamp * 1.e-3, classIndex, inputType, mOutsideLimits)};
202double CTPRateFetcher::fetchCTPratesInputs(uint64_t timeStamp,
int input)
205 if (recs[0].scalersInps.size() == 48) {
207 return pileUpCorrection(mScalers.
getRate((uint32_t)timeStamp, input, 7, mOutsideLimits).second);
209 return pileUpCorrection(mScalers.
getRateGivenT(timeStamp * 1.e-3, input, 7, mOutsideLimits).second);
212 LOG(error) <<
"Inputs not available";
216double CTPRateFetcher::fetchCTPratesInputsNoPuCorr(uint64_t timeStamp,
int input)
219 if (recs[0].scalersInps.size() == 48) {
221 return mScalers.
getRate((uint32_t)timeStamp, input, 7, mOutsideLimits).second;
223 return mScalers.
getRateGivenT(timeStamp * 1.e-3, input, 7, mOutsideLimits).second;
226 LOG(error) <<
"Inputs not available";
231double CTPRateFetcher::pileUpCorrection(
double triggerRate)
234 LOG(fatal) <<
"No filling" << std::endl;
238 double nbc = bcs.size();
240 double mu = -std::log(1 - nTriggersPerFilledBC);
246 if (runNumber == mRunNumber) {
249 mRunNumber = runNumber;
250 LOG(info) <<
"Setting up CTP scalers for run " << mRunNumber <<
" and timestamp : " << timeStamp;
252 if (ptrLHCIFdata ==
nullptr) {
253 LOG(error) <<
"GRPLHCIFData not in database, timestamp:" << timeStamp;
256 mLHCIFdata = *ptrLHCIFdata;
257 std::map<string, string> metadata;
260 if (ptrConfig ==
nullptr) {
261 LOG(error) <<
"CTPRunConfig not in database, timestamp:" << timeStamp;
264 mConfig = *ptrConfig;
268 mScalers = *ptrScalers;
271 LOG(error) <<
"CTPRunScalers not in database, timestamp:" << timeStamp;
Header to collect LHC related constants.
std::vector< int > getFilledBCs(int dir=-1) const
T * getSpecific(std::string const &path, long timestamp=-1, MD metaData=MD())
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"