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
13
14#include <map>
15#include <vector>
17
18using namespace o2::ctp;
19double CTPRateFetcher::fetch(o2::ccdb::BasicCCDBManager* ccdb, uint64_t timeStamp, int runNumber, std::string sourceName)
20{
21 auto triggerRate = fetchNoPuCorr(ccdb, timeStamp, runNumber, sourceName);
22 if (triggerRate >= 0) {
23 return pileUpCorrection(triggerRate);
24 }
25 return -1;
26}
27double CTPRateFetcher::fetchNoPuCorr(o2::ccdb::BasicCCDBManager* ccdb, uint64_t timeStamp, int runNumber, std::string sourceName)
28{
29 setupRun(runNumber, ccdb, timeStamp, 1);
30 if (sourceName.find("ZNC") != std::string::npos) {
31 if (runNumber < 544448) {
32 return fetchCTPratesInputsNoPuCorr(timeStamp, 25) / (sourceName.find("hadronic") != std::string::npos ? 28. : 1.);
33 } else {
34 return fetchCTPratesClassesNoPuCorr(timeStamp, "C1ZNC-B-NOPF-CRU", 6) / (sourceName.find("hadronic") != std::string::npos ? 28. : 1.);
35 }
36 } else if (sourceName == "T0CE") {
37 return fetchCTPratesClassesNoPuCorr(timeStamp, "CMTVXTCE-B-NOPF");
38 } else if (sourceName == "T0SC") {
39 return fetchCTPratesClassesNoPuCorr(timeStamp, "CMTVXTSC-B-NOPF");
40 } else if (sourceName == "T0VTX") {
41 if (runNumber < 534202) {
42 return fetchCTPratesClassesNoPuCorr(timeStamp, "minbias_TVX_L0", 3); // 2022
43 } else {
44 double ret = fetchCTPratesClassesNoPuCorr(timeStamp, "CMTVX-B-NOPF");
45 if (ret == -2.) {
46 LOG(info) << "Trying different class";
47 ret = fetchCTPratesClassesNoPuCorr(timeStamp, "CMTVX-NONE");
48 if (ret < 0) {
49 LOG(fatal) << "None of the classes used for lumi found";
50 }
51 }
52 return ret;
53 }
54 }
55 LOG(error) << "CTP rate for " << sourceName << " not available";
56 return -1.;
57}
59{
60 mScalers = scalers;
61 mScalers.convertRawToO2();
62}
63//
64int 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
65{
66 setupRun(runNumber, ccdb, 0, 1);
67 mOrbit = 1;
68 mOutsideLimits = 1;
69 auto orbitlimits = mScalers.getOrbitLimit();
70 // std::cout << "1st orbit:" << orbitlimits.first << " last:" << orbitlimits.second << " Middle:" << (orbitlimits.first + orbitlimits.second)/2 << std::endl;
71 double rate0 = fetch(ccdb, orbitlimits.first, mRunNumber, sourceName);
72 double rateLast = fetch(ccdb, orbitlimits.second, mRunNumber, sourceName);
73 double rateM = fetch(ccdb, (orbitlimits.first + orbitlimits.second) / 2, mRunNumber, sourceName);
74 // std::cout << rate0 << " " << rateLast << " " << rateM << std::endl;
75 rates[0] = rate0;
76 rates[1] = rateLast;
77 rates[2] = rateM;
78 return 0;
79}
80double CTPRateFetcher::getLumiNoPuCorr(const std::string& classname, int type)
81{
82 if (classname == "zncinp") {
83 return mScalers.getLumiNoPuCorr(26, 7);
84 }
85 std::vector<ctp::CTPClass>& ctpcls = mConfig.getCTPClasses();
86 std::vector<int> clslist = mConfig.getTriggerClassList();
87 int classIndex = -1;
88 for (size_t i = 0; i < clslist.size(); i++) {
89 if (ctpcls[i].name.find(classname) != std::string::npos) {
90 classIndex = i;
91 break;
92 }
93 }
94 if (classIndex == -1) {
95 LOG(warn) << "Trigger class " << classname << " not found in CTPConfiguration";
96 return -1;
97 }
98 return mScalers.getLumiNoPuCorr(classIndex, type);
99}
100double CTPRateFetcher::getLumiWPuCorr(const std::string& classname, int type)
101{
102 std::vector<std::pair<double, double>> scals;
103 if (classname == "zncinp") {
104 scals = mScalers.getRatesForIndex(26, 7);
105 } else {
106 std::vector<ctp::CTPClass>& ctpcls = mConfig.getCTPClasses();
107 std::vector<int> clslist = mConfig.getTriggerClassList();
108 int classIndex = -1;
109 for (size_t i = 0; i < clslist.size(); i++) {
110 if (ctpcls[i].name.find(classname) != std::string::npos) {
111 classIndex = i;
112 break;
113 }
114 }
115 if (classIndex == -1) {
116 LOG(warn) << "Trigger class " << classname << " not found in CTPConfiguration";
117 return -1;
118 }
119 scals = mScalers.getRatesForIndex(classIndex, type);
120 }
121 double lumi = 0;
122 for (auto const& ss : scals) {
123 // std::cout << ss.first << " " << ss.second << " " << pileUpCorrection(ss.first/ss.second) << std::endl;
124 lumi += pileUpCorrection(ss.first / ss.second) * ss.second;
125 }
126 return lumi;
127}
128double CTPRateFetcher::getLumi(const std::string& classname, int type, int puCorr)
129{
130 if (puCorr) {
131 return getLumiWPuCorr(classname, type);
132 } else {
133 return getLumiNoPuCorr(classname, type);
134 }
135}
136
137double CTPRateFetcher::getLumi(o2::ccdb::BasicCCDBManager* ccdb, int runNumber, const std::string sourceName, int puCorr)
138{
139 // setupRun(runNumber, ccdb, timeStamp, 1);
140 if (sourceName.find("ZNC") != std::string::npos) {
141 if (runNumber < 544448) {
142 return getLumi("zncinp", 1, puCorr) / (sourceName.find("hadronic") != std::string::npos ? 28. : 1.);
143 } else {
144 return getLumi("C1ZNC-B-NOPF-CRU", 6, puCorr) / (sourceName.find("hadronic") != std::string::npos ? 28. : 1.);
145 }
146 } else if (sourceName == "T0CE") {
147 return getLumi("CMTVXTCE-B-NOPF", 1, puCorr);
148 } else if (sourceName == "T0SC") {
149 return getLumi("CMTVXTSC-B-NOPF", 1, puCorr);
150 } else if (sourceName == "T0VTX") {
151 if (runNumber < 534202) {
152 return getLumi("minbias_TVX_L0", 3, puCorr); // 2022
153 } else {
154 double ret = getLumi("CMTVX-B-NOPF", 1, puCorr);
155 if (ret == -1.) {
156 LOG(info) << "Trying different class";
157 ret = getLumi("CMTVX-NONE", 1, puCorr);
158 if (ret < 0) {
159 LOG(fatal) << "None of the classes used for lumi found";
160 }
161 }
162 return ret;
163 }
164 }
165 LOG(error) << "CTP Lumi for " << sourceName << " not available";
166 return 0;
167}
168//
169double CTPRateFetcher::fetchCTPratesClasses(uint64_t timeStamp, const std::string& className, int inputType)
170{
171 auto triggerRate = fetchCTPratesClassesNoPuCorr(timeStamp, className, inputType);
172 if (triggerRate >= 0) {
173 return pileUpCorrection(triggerRate);
174 }
175 return -1;
176}
177double CTPRateFetcher::fetchCTPratesClassesNoPuCorr(uint64_t timeStamp, const std::string& className, int inputType)
178{
179 std::vector<ctp::CTPClass>& ctpcls = mConfig.getCTPClasses();
180 std::vector<int> clslist = mConfig.getTriggerClassList();
181 int classIndex = -1;
182 for (size_t i = 0; i < clslist.size(); i++) {
183 if (ctpcls[i].name.find(className) != std::string::npos) {
184 classIndex = i;
185 break;
186 }
187 }
188 if (classIndex == -1) {
189 LOG(warn) << "Trigger class " << className << " not found in CTPConfiguration";
190 return -2.;
191 }
192 if (mOrbit) {
193 auto rate{mScalers.getRate((uint32_t)timeStamp, classIndex, inputType, mOutsideLimits)};
194 return rate.second;
195 } else {
196 auto rate{mScalers.getRateGivenT(timeStamp * 1.e-3, classIndex, inputType, mOutsideLimits)};
197 return rate.second;
198 }
199}
200double CTPRateFetcher::fetchCTPratesInputs(uint64_t timeStamp, int input)
201{
202 std::vector<ctp::CTPScalerRecordO2>& recs = mScalers.getScalerRecordO2();
203 if (recs[0].scalersInps.size() == 48) {
204 if (mOrbit) {
205 return pileUpCorrection(mScalers.getRate((uint32_t)timeStamp, input, 7, mOutsideLimits).second);
206 } else {
207 return pileUpCorrection(mScalers.getRateGivenT(timeStamp * 1.e-3, input, 7, mOutsideLimits).second);
208 }
209 } else {
210 LOG(error) << "Inputs not available";
211 return -1.;
212 }
213}
214double CTPRateFetcher::fetchCTPratesInputsNoPuCorr(uint64_t timeStamp, int input)
215{
216 std::vector<ctp::CTPScalerRecordO2>& recs = mScalers.getScalerRecordO2();
217 if (recs[0].scalersInps.size() == 48) {
218 if (mOrbit) {
219 return mScalers.getRate((uint32_t)timeStamp, input, 7, mOutsideLimits).second;
220 } else {
221 return mScalers.getRateGivenT(timeStamp * 1.e-3, input, 7, mOutsideLimits).second; // qc flag implemented only for time
222 }
223 } else {
224 LOG(error) << "Inputs not available";
225 return -1.;
226 }
227}
228
229double CTPRateFetcher::pileUpCorrection(double triggerRate)
230{
231 if (mLHCIFdata.getFillNumber() == 0) {
232 LOG(fatal) << "No filling" << std::endl;
233 }
234 auto bfilling = mLHCIFdata.getBunchFilling();
235 std::vector<int> bcs = bfilling.getFilledBCs();
236 double nbc = bcs.size();
237 double nTriggersPerFilledBC = triggerRate / nbc / constants::lhc::LHCRevFreq;
238 double mu = -std::log(1 - nTriggersPerFilledBC);
239 return mu * nbc * constants::lhc::LHCRevFreq;
240}
241
242void CTPRateFetcher::setupRun(int runNumber, o2::ccdb::BasicCCDBManager* ccdb, uint64_t timeStamp, bool initScalers)
243{
244 if (runNumber == mRunNumber) {
245 return;
246 }
247 mRunNumber = runNumber;
248 LOG(info) << "Setting up CTP scalers for run " << mRunNumber;
249 auto ptrLHCIFdata = ccdb->getSpecific<parameters::GRPLHCIFData>("GLO/Config/GRPLHCIF", timeStamp);
250 if (ptrLHCIFdata == nullptr) {
251 LOG(fatal) << "GRPLHCIFData not in database, timestamp:" << timeStamp;
252 }
253 mLHCIFdata = *ptrLHCIFdata;
254 std::map<string, string> metadata;
255 metadata["runNumber"] = std::to_string(mRunNumber);
256 auto ptrConfig = ccdb->getSpecific<ctp::CTPConfiguration>("CTP/Config/Config", timeStamp, metadata);
257 if (ptrConfig == nullptr) {
258 LOG(fatal) << "CTPRunConfig not in database, timestamp:" << timeStamp;
259 }
260 mConfig = *ptrConfig;
261 if (initScalers) {
262 auto ptrScalers = ccdb->getSpecific<ctp::CTPRunScalers>("CTP/Calib/Scalers", timeStamp, metadata);
263 if (ptrScalers) {
264 mScalers = *ptrScalers;
265 mScalers.convertRawToO2();
266 } else {
267 LOG(fatal) << "CTPRunScalers not in database, timestamp:" << timeStamp;
268 }
269 }
270}
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 float mu
Definition SpecsV2.h:27
std::string to_string(gsl::span< T, Size > span)
Definition common.h:52
LOG(info)<< "Compressed in "<< sw.CpuTime()<< " s"
LumiInfo lumi