Project
Loading...
Searching...
No Matches
CTPRateFetcher.cxx
Go to the documentation of this file.
1// Copyright 2019-2020 CERN and copyright holders of ALICE O2.
2// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders.
3// All rights not expressly granted are reserved.
4//
5// This software is distributed under the terms of the GNU General Public
6// License v3 (GPL Version 3), copied verbatim in the file "COPYING".
7//
8// In applying this license CERN does not waive the privileges and immunities
9// granted to it by virtue of its status as an Intergovernmental Organization
10// or submit itself to any jurisdiction.
11
14
15#include <map>
16#include <vector>
18
19using namespace o2::ctp;
20double CTPRateFetcher::fetch(o2::ccdb::BasicCCDBManager* ccdb, uint64_t timeStamp, int runNumber, std::string sourceName)
21{
22 auto triggerRate = fetchNoPuCorr(ccdb, timeStamp, runNumber, sourceName);
23 if (triggerRate >= 0) {
24 return pileUpCorrection(triggerRate);
25 }
26 return -1;
27}
28double CTPRateFetcher::fetchNoPuCorr(o2::ccdb::BasicCCDBManager* ccdb, uint64_t timeStamp, int runNumber, std::string sourceName)
29{
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.);
34 } else {
35 return fetchCTPratesClassesNoPuCorr(timeStamp, "C1ZNC-B-NOPF-CRU", 6) / (sourceName.find("hadronic") != std::string::npos ? 28. : 1.);
36 }
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); // 2022
44 } else {
45 double ret = fetchCTPratesClassesNoPuCorr(timeStamp, "CMTVX-B-NOPF");
46 if (ret == -2.) {
47 LOG(info) << "Trying different class";
48 ret = fetchCTPratesClassesNoPuCorr(timeStamp, "CMTVX-NONE");
49 if (ret < 0) {
50 LOG(error) << "None of the classes used for lumi found";
51 return -1.;
52 }
53 }
54 return ret;
55 }
56 }
57 LOG(error) << "CTP rate for " << sourceName << " not available";
58 return -1.;
59}
61{
62 mScalers = scalers;
63 mScalers.convertRawToO2();
64}
65//
66int CTPRateFetcher::getRates(std::array<double, 3>& rates, o2::ccdb::BasicCCDBManager* ccdb, int runNumber, const std::string sourceName) // rates at start,stop and middle of the run
67{
68 setupRun(runNumber, ccdb, 0, 1);
69 mOrbit = 1;
70 mOutsideLimits = 1;
71 auto orbitlimits = mScalers.getOrbitLimit();
72 // std::cout << "1st orbit:" << orbitlimits.first << " last:" << orbitlimits.second << " Middle:" << (orbitlimits.first + orbitlimits.second)/2 << std::endl;
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);
76 // std::cout << rate0 << " " << rateLast << " " << rateM << std::endl;
77 rates[0] = rate0;
78 rates[1] = rateLast;
79 rates[2] = rateM;
80 return 0;
81}
82double CTPRateFetcher::getLumiNoPuCorr(const std::string& classname, int type)
83{
84 if (classname == "zncinp") {
85 return mScalers.getLumiNoPuCorr(26, 7);
86 }
87 std::vector<ctp::CTPClass>& ctpcls = mConfig.getCTPClasses();
88 std::vector<int> clslist = mConfig.getTriggerClassList();
89 int classIndex = -1;
90 for (size_t i = 0; i < clslist.size(); i++) {
91 if (ctpcls[i].name.find(classname) != std::string::npos) {
92 classIndex = i;
93 break;
94 }
95 }
96 if (classIndex == -1) {
97 LOG(warn) << "Trigger class " << classname << " not found in CTPConfiguration";
98 return -1;
99 }
100 return mScalers.getLumiNoPuCorr(classIndex, type);
101}
102double CTPRateFetcher::getLumiWPuCorr(const std::string& classname, int type)
103{
104 std::vector<std::pair<double, double>> scals;
105 if (classname == "zncinp") {
106 scals = mScalers.getRatesForIndex(26, 7);
107 } else {
108 std::vector<ctp::CTPClass>& ctpcls = mConfig.getCTPClasses();
109 std::vector<int> clslist = mConfig.getTriggerClassList();
110 int classIndex = -1;
111 for (size_t i = 0; i < clslist.size(); i++) {
112 if (ctpcls[i].name.find(classname) != std::string::npos) {
113 classIndex = i;
114 break;
115 }
116 }
117 if (classIndex == -1) {
118 LOG(warn) << "Trigger class " << classname << " not found in CTPConfiguration";
119 return -1;
120 }
121 scals = mScalers.getRatesForIndex(classIndex, type);
122 }
123 double lumi = 0;
124 for (auto const& ss : scals) {
125 // std::cout << ss.first << " " << ss.second << " " << pileUpCorrection(ss.first/ss.second) << std::endl;
126 lumi += pileUpCorrection(ss.first / ss.second) * ss.second;
127 }
128 return lumi;
129}
130double CTPRateFetcher::getLumi(const std::string& classname, int type, int puCorr)
131{
132 if (puCorr) {
133 return getLumiWPuCorr(classname, type);
134 } else {
135 return getLumiNoPuCorr(classname, type);
136 }
137}
138
139double CTPRateFetcher::getLumi(o2::ccdb::BasicCCDBManager* ccdb, int runNumber, const std::string sourceName, int puCorr)
140{
141 // setupRun(runNumber, ccdb, timeStamp, 1);
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.);
145 } else {
146 return getLumi("C1ZNC-B-NOPF-CRU", 6, puCorr) / (sourceName.find("hadronic") != std::string::npos ? 28. : 1.);
147 }
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); // 2022
155 } else {
156 double ret = getLumi("CMTVX-B-NOPF", 1, puCorr);
157 if (ret == -1.) {
158 LOG(info) << "Trying different class";
159 ret = getLumi("CMTVX-NONE", 1, puCorr);
160 if (ret < 0) {
161 LOG(fatal) << "None of the classes used for lumi found";
162 }
163 }
164 return ret;
165 }
166 }
167 LOG(error) << "CTP Lumi for " << sourceName << " not available";
168 return 0;
169}
170//
171double CTPRateFetcher::fetchCTPratesClasses(uint64_t timeStamp, const std::string& className, int inputType)
172{
173 auto triggerRate = fetchCTPratesClassesNoPuCorr(timeStamp, className, inputType);
174 if (triggerRate >= 0) {
175 return pileUpCorrection(triggerRate);
176 }
177 return -1;
178}
179double CTPRateFetcher::fetchCTPratesClassesNoPuCorr(uint64_t timeStamp, const std::string& className, int inputType)
180{
181 std::vector<ctp::CTPClass>& ctpcls = mConfig.getCTPClasses();
182 std::vector<int> clslist = mConfig.getTriggerClassList();
183 int classIndex = -1;
184 for (size_t i = 0; i < clslist.size(); i++) {
185 if (ctpcls[i].name.find(className) != std::string::npos) {
186 classIndex = i;
187 break;
188 }
189 }
190 if (classIndex == -1) {
191 LOG(warn) << "Trigger class " << className << " not found in CTPConfiguration";
192 return -2.;
193 }
194 if (mOrbit) {
195 auto rate{mScalers.getRate((uint32_t)timeStamp, classIndex, inputType, mOutsideLimits)};
196 return rate.second;
197 } else {
198 auto rate{mScalers.getRateGivenT(timeStamp * 1.e-3, classIndex, inputType, mOutsideLimits)};
199 return rate.second;
200 }
201}
202double CTPRateFetcher::fetchCTPratesInputs(uint64_t timeStamp, int input)
203{
204 std::vector<ctp::CTPScalerRecordO2>& recs = mScalers.getScalerRecordO2();
205 if (recs[0].scalersInps.size() == 48) {
206 if (mOrbit) {
207 return pileUpCorrection(mScalers.getRate((uint32_t)timeStamp, input, 7, mOutsideLimits).second);
208 } else {
209 return pileUpCorrection(mScalers.getRateGivenT(timeStamp * 1.e-3, input, 7, mOutsideLimits).second);
210 }
211 } else {
212 LOG(error) << "Inputs not available";
213 return -1.;
214 }
215}
216double CTPRateFetcher::fetchCTPratesInputsNoPuCorr(uint64_t timeStamp, int input)
217{
218 std::vector<ctp::CTPScalerRecordO2>& recs = mScalers.getScalerRecordO2();
219 if (recs[0].scalersInps.size() == 48) {
220 if (mOrbit) {
221 return mScalers.getRate((uint32_t)timeStamp, input, 7, mOutsideLimits).second;
222 } else {
223 return mScalers.getRateGivenT(timeStamp * 1.e-3, input, 7, mOutsideLimits).second; // qc flag implemented only for time
224 }
225 } else {
226 LOG(error) << "Inputs not available";
227 return -1.;
228 }
229}
230
231double CTPRateFetcher::pileUpCorrection(double triggerRate)
232{
233 if (mLHCIFdata.getFillNumber() == 0) {
234 LOG(fatal) << "No filling" << std::endl;
235 }
236 auto bfilling = mLHCIFdata.getBunchFilling();
237 std::vector<int> bcs = bfilling.getFilledBCs();
238 double nbc = bcs.size();
239 double nTriggersPerFilledBC = triggerRate / nbc / constants::lhc::LHCRevFreq;
240 double mu = -std::log(1 - nTriggersPerFilledBC);
241 return mu * nbc * constants::lhc::LHCRevFreq;
242}
243
244void CTPRateFetcher::setupRun(int runNumber, o2::ccdb::BasicCCDBManager* ccdb, uint64_t timeStamp, bool initScalers)
245{
246 if (runNumber == mRunNumber) {
247 return;
248 }
249 mRunNumber = runNumber;
250 LOG(info) << "Setting up CTP scalers for run " << mRunNumber << " and timestamp : " << timeStamp;
251 auto ptrLHCIFdata = ccdb->getSpecific<parameters::GRPLHCIFData>("GLO/Config/GRPLHCIF", timeStamp);
252 if (ptrLHCIFdata == nullptr) {
253 LOG(error) << "GRPLHCIFData not in database, timestamp:" << timeStamp;
254 return;
255 }
256 mLHCIFdata = *ptrLHCIFdata;
257 std::map<string, string> metadata;
258 metadata["runNumber"] = std::to_string(mRunNumber);
259 auto ptrConfig = ccdb->getSpecific<ctp::CTPConfiguration>("CTP/Config/Config", timeStamp, metadata);
260 if (ptrConfig == nullptr) {
261 LOG(error) << "CTPRunConfig not in database, timestamp:" << timeStamp;
262 return;
263 }
264 mConfig = *ptrConfig;
265 if (initScalers) {
266 auto ptrScalers = ccdb->getSpecific<ctp::CTPRunScalers>("CTP/Calib/Scalers", timeStamp, metadata);
267 if (ptrScalers) {
268 mScalers = *ptrScalers;
269 mScalers.convertRawToO2();
270 } else {
271 LOG(error) << "CTPRunScalers not in database, timestamp:" << timeStamp;
272 }
273 }
274}
int32_t i
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
Definition Scalers.cxx:661
std::pair< double, double > getRate(uint32_t orbit, int classindex, int type, bool qc=0) const
Definition Scalers.cxx:735
std::pair< double, double > getRateGivenT(double timestamp, int classindex, int type, bool qc=0) const
same with absolute timestamp (not orbit) as argument
Definition Scalers.cxx:809
std::pair< unsigned long, unsigned long > getOrbitLimit() const
retrieves orbit boundaries of this scaler object from O2
Definition Scalers.h:161
std::vector< CTPScalerRecordO2 > & getScalerRecordO2()
Definition Scalers.h:106
std::vector< std::pair< double_t, double_t > > getRatesForIndex(int classindex, int type) const
retrieves vector of counters - same interface as getRate, needed for
Definition Scalers.cxx:693
const o2::BunchFilling & getBunchFilling() const
int32_t getFillNumber() const
GLuint GLenum * rate
Definition glcorearb.h:5735
GLuint const GLchar * name
Definition glcorearb.h:781
GLint GLint GLsizei GLint GLenum GLenum type
Definition glcorearb.h:275
GLuint GLsizei const GLenum * rates
Definition glcorearb.h:5738
constexpr double LHCRevFreq
constexpr double mu
Definition SpecsV2.h:32
std::string to_string(gsl::span< T, Size > span)
Definition common.h:52
LOG(info)<< "Compressed in "<< sw.CpuTime()<< " s"
LumiInfo lumi