99// granted to it by virtue of its status as an Intergovernmental Organization
1010// or submit itself to any jurisdiction.
1111
12- /// \file TestCTPScalers .C
12+ /// \file PlotPbLumi .C
1313/// \brief create CTP scalers, test it and add to database
1414/// \author Roman Lietava
15- // root -b -q "GetScalers .C(\" 519499\", 1656286373953 )"
15+ // root "PLotPbLumi .C(519499)"
1616#if !defined(__CLING__ ) || defined(__ROOTCLING__ )
1717
1818#include <fairlogger/Logger.h>
3030#include <iostream>
3131#endif
3232using namespace o2 ::ctp ;
33- void PlotPbLumi (int runNumber , int fillN , std ::string ccdbHost = "http://ccdb-test.cern.ch:8080" )
33+ //
34+ // sum = 0: TCE and TSC separatelly otherwise TCE and (TCE+TSC)
35+ // qc = 0: takes scalers from CCDB (available only for finished runs) otherwise from QCCDB (available for active runs)
36+ // t0-tlast: window in seconds counted from beginning of run
37+ //
38+ void PlotPbLumi (int runNumber = 567905 , bool sum = 0 , bool qc = 0 , Double_t t0 = 0. , Double_t tlast = 0. )
3439{ //
35- // what = 1: znc rate
36- // what = 2: (TCE+TSC)/ZNC
37- // what = 3: TCE/ZNC
38- std ::string mCCDBPathCTPScalers = "CTP/Calib/Scalers" ;
40+ // PLots in one canvas
41+ // znc rate/28
42+ // R = (TCE+TSC)*TVX*B*/ZNC*28
43+ // R = TCE*TVX*B/ZNC*28
44+ // R = VCH*TVX*B/ZNC*28
45+ std ::string ccdbHost = "http://alice-ccdb.cern.ch" ;
46+ std ::string mCCDBPathCTPScalers = "/CTP/Calib/Scalers" ;
47+ std ::string mCCDBPathCTPScalersQC = "qc/CTP/Scalers" ;
3948 std ::string mCCDBPathCTPConfig = "CTP/Config/Config" ;
4049 auto& ccdbMgr = o2 ::ccdb ::BasicCCDBManager ::instance ();
4150 // Timestamp
4251 auto soreor = ccdbMgr .getRunDuration (runNumber );
4352 uint64_t timeStamp = (soreor .second - soreor .first ) / 2 + soreor .first ;
4453 std ::cout << "Timestamp:" << timeStamp << std ::endl ;
4554 // Filling
46- std ::string sfill = std ::to_string (fillN );
47- std ::map < string , string > metadata ;
48- metadata ["fillNumber" ] = sfill ;
49- auto lhcifdata = ccdbMgr .getSpecific < o2 ::parameters ::GRPLHCIFData > ("GLO/Config/GRPLHCIF" , timeStamp , metadata );
55+ auto lhcifdata = ccdbMgr .getForRun < o2 ::parameters ::GRPLHCIFData > ("GLO/Config/GRPLHCIF" , runNumber );
56+ // auto lhcifdata = ccdbMgr.getSpecific<o2::parameters::GRPLHCIFData>("GLO/Config/GRPLHCIF", timeStamp, metadata);
57+ if (!lhcifdata ) {
58+ throw std ::runtime_error ("No GRPLHCIFData for run " + std ::to_string (runNumber ));
59+ }
5060 auto bfilling = lhcifdata -> getBunchFilling ();
5161 std ::vector < int > bcs = bfilling .getFilledBCs ();
5262 int nbc = bcs .size ();
5363 std ::cout << "Number of interacting bc:" << nbc << std ::endl ;
5464 // Scalers
5565 std ::string srun = std ::to_string (runNumber );
56- metadata . clear (); // can be empty
66+ std :: map < string , string > metadata ;
5767 metadata ["runNumber" ] = srun ;
58- ccdbMgr .setURL ("http://ccdb-test.cern.ch:8080" );
59- auto scl = ccdbMgr .getSpecific < CTPRunScalers > (mCCDBPathCTPScalers , timeStamp , metadata );
68+ CTPRunScalers * scl = nullptr ;
69+ if (qc ) {
70+ ccdbMgr .setURL ("http://ali-qcdb-gpn.cern.ch:8083" );
71+ scl = ccdbMgr .getSpecific < CTPRunScalers > (mCCDBPathCTPScalersQC , timeStamp , metadata );
72+ } else {
73+ scl = ccdbMgr .getSpecific < CTPRunScalers > (mCCDBPathCTPScalers , timeStamp , metadata );
74+ }
6075 if (scl == nullptr ) {
6176 LOG (info ) << "CTPRunScalers not in database, timestamp:" << timeStamp ;
6277 return ;
@@ -65,6 +80,7 @@ void PlotPbLumi(int runNumber, int fillN, std::string ccdbHost = "http://ccdb-te
6580 std ::vector < CTPScalerRecordO2 > recs = scl -> getScalerRecordO2 ();
6681 //
6782 // CTPConfiguration ctpcfg;
83+ ccdbMgr .setURL ("http://alice-ccdb.cern.ch" );
6884 auto ctpcfg = ccdbMgr .getSpecific < CTPConfiguration > (mCCDBPathCTPConfig , timeStamp , metadata );
6985 if (ctpcfg == nullptr ) {
7086 LOG (info ) << "CTPRunConfig not in database, timestamp:" << timeStamp ;
@@ -85,6 +101,7 @@ void PlotPbLumi(int runNumber, int fillN, std::string ccdbHost = "http://ccdb-te
85101 int tsc = 255 ;
86102 int tce = 255 ;
87103 int vch = 255 ;
104+ int zncclsi = 255 ;
88105 for (auto const & cls : ctpcls ) {
89106 if (cls .name .find ("CMTVXTSC-B-NOPF" ) != std ::string ::npos && tsc == 255 ) {
90107 int itsc = cls .getIndex ();
@@ -104,6 +121,12 @@ void PlotPbLumi(int runNumber, int fillN, std::string ccdbHost = "http://ccdb-te
104121 // vch = scl->getScalerIndexForClass(ivch);
105122 std ::cout << cls .name << ":" << vch << ":" << ivch << std ::endl ;
106123 }
124+ if (cls .name .find ("C1ZNC-B-NOPF-CRU" ) != std ::string ::npos ) {
125+ int iznc = cls .getIndex ();
126+ zncclsi = clsIndexToScaler [iznc ];
127+ // vch = scl->getScalerIndexForClass(ivch);
128+ std ::cout << cls .name << ":" << zncclsi << ":" << iznc << std ::endl ;
129+ }
107130 }
108131 if (tsc == 255 || tce == 255 || vch == 255 ) {
109132 std ::cout << " One of dcalers not available, check config to find alternative)" << std ::endl ;
@@ -120,11 +143,39 @@ void PlotPbLumi(int runNumber, int fillN, std::string ccdbHost = "http://ccdb-te
120143 double_t orbit0 = recs [0 ].intRecord .orbit ;
121144 int n = recs .size () - 1 ;
122145 std ::cout << " Run duration:" << Trun << " Scalers size:" << n + 1 << std ::endl ;
123- Double_t x [n ], znc [n ], zncpp [n ];
124- Double_t tcetsctoznc [n ], tcetoznc [n ], vchtoznc [n ];
125- for (int i = 0 ; i < n ; i ++ ) {
126- x [i ] = (double_t )(recs [i + 1 ].intRecord .orbit + recs [i ].intRecord .orbit ) / 2. - orbit0 ;
127- x [i ] *= 88e-6 ;
146+ //
147+ int i0 = 0 ;
148+ int ilast = 0 ;
149+ if (t0 != 0. || tlast != 0. ) {
150+ for (int i = 0 ; i < n ; i ++ ) {
151+ double_t ttime = recs [i ].epochTime - time0 ;
152+ if (!i0 && t0 < ttime ) {
153+ i0 = i ;
154+ }
155+ if (!ilast && tlast < ttime ) {
156+ ilast = i ;
157+ }
158+ }
159+ } else {
160+ ilast = n ;
161+ }
162+ n = ilast - i0 ;
163+ std ::cout << "i0:" << i0 << " ilast:" << ilast << std ::endl ;
164+ // Double_t x[n], znc[n], zncpp[n];
165+ std ::vector < Double_t > xvec (n ), zncvec (n ), zncppvec (n ), zncclassvec (n );
166+ Double_t * x = xvec .data ();
167+ Double_t * znc = zncvec .data ();
168+ Double_t * zncpp = zncppvec .data ();
169+ Double_t * zncclass = zncclassvec .data ();
170+ // Double_t tcetsctoznc[n], tcetoznc[n], vchtoznc[n];
171+ std ::vector < Double_t > tcetsctozncvec (n ), tcetozncvec (n ), vchtozncvec (n );
172+ Double_t * tcetsctoznc = tcetsctozncvec .data ();
173+ Double_t * tcetoznc = tcetozncvec .data ();
174+ Double_t * vchtoznc = vchtozncvec .data ();
175+ for (int i = i0 ; i < ilast ; i ++ ) {
176+ int iv = i - i0 ;
177+ x [iv ] = (double_t )(recs [i + 1 ].intRecord .orbit + recs [i ].intRecord .orbit ) / 2. - orbit0 ;
178+ x [iv ] *= 88e-6 ;
128179 // x[i] = (double_t)(recs[i+1].epochTime + recs[i].epochTime)/2.;
129180 double_t tt = (double_t )(recs [i + 1 ].intRecord .orbit - recs [i ].intRecord .orbit );
130181 tt = tt * 88e-6 ;
@@ -133,33 +184,53 @@ void PlotPbLumi(int runNumber, int fillN, std::string ccdbHost = "http://ccdb-te
133184 double_t znci = (double_t )(recs [i + 1 ].scalersInps [25 ] - recs [i ].scalersInps [25 ]);
134185 double_t mu = - TMath ::Log (1. - znci / tt / nbc / frev );
135186 double_t zncipp = mu * nbc * frev ;
136- zncpp [i ] = zncipp / 28. ;
137- znc [i ] = znci / 28. / tt ;
187+ zncpp [iv ] = zncipp / 28. ;
188+ znc [iv ] = znci / 28. / tt ;
189+ // znc class
190+ znci = recs [i + 1 ].scalers [zncclsi ].l1Before - recs [i ].scalers [zncclsi ].l1Before ;
191+ zncclass [iv ] = znci / 28. / tt ;
192+ // std::cout << znc[i]/zncclass[i] << std::endl;
138193 //
139- auto had = recs [i + 1 ].scalers [tce ].lmBefore - recs [i ].scalers [tce ].lmBefore ;
194+ double_t had = 0 ;
195+ if (sum ) {
196+ had += recs [i + 1 ].scalers [tce ].lmBefore - recs [i ].scalers [tce ].lmBefore ;
197+ }
198+ double_t mutce = - TMath ::Log (1. - had / tt / nbc / frev );
140199 // std::cout << recs[i+1].scalers[tce].lmBefore << std::endl;
141200 had += recs [i + 1 ].scalers [tsc ].lmBefore - recs [i ].scalers [tsc ].lmBefore ;
142201 // rat = (double_t)(had)/double_t(recs[i+1].scalersInps[25] - recs[i].scalersInps[25])*28;
143- tcetsctoznc [i ] = (double_t )(had ) / zncpp [i ] / tt ;
202+ tcetsctoznc [iv ] = (double_t )(had ) / zncpp [iv ] / tt ;
144203 had = recs [i + 1 ].scalers [tce ].lmBefore - recs [i ].scalers [tce ].lmBefore ;
145204 // rat = (double_t)(had)/double_t(recs[i+1].scalersInps[25] - recs[i].scalersInps[25])*28;
146- tcetoznc [i ] = (double_t )(had ) / zncpp [i ] / tt ;
205+ tcetoznc [iv ] = (double_t )(had ) / zncpp [iv ] / tt ;
147206 had = recs [i + 1 ].scalers [vch ].lmBefore - recs [i ].scalers [vch ].lmBefore ;
207+ double_t muvch = - TMath ::Log (1. - had / tt / nbc / frev );
208+
148209 // rat = (double_t)(had)/double_t(recs[i+1].scalersInps[25] - recs[i].scalersInps[25])*28;
149- vchtoznc [i ] = (double_t )(had ) / zncpp [i ] / tt ;
210+ vchtoznc [iv ] = (double_t )(had ) / zncpp [iv ] / tt ;
211+ // std::cout << "muzdc:" << mu << " mu tce:" << mutce << " muvch:" << muvch << std::endl;
150212 }
151213 //
152214 gStyle -> SetMarkerSize (0.5 );
153215 TGraph * gr1 = new TGraph (n , x , znc );
216+ TGraph * gr11 = new TGraph (n , x , zncpp ); // PileuP corrected
217+ TGraph * gr12 = new TGraph (n , x , zncclass ); // NOT PileuP corrected
154218 TGraph * gr2 = new TGraph (n , x , tcetsctoznc );
155219 TGraph * gr3 = new TGraph (n , x , tcetoznc );
156220 TGraph * gr4 = new TGraph (n , x , vchtoznc );
157221 gr1 -> SetMarkerStyle (20 );
222+ gr11 -> SetMarkerStyle (20 );
223+ gr12 -> SetMarkerStyle (20 );
224+ gr11 -> SetMarkerColor (kRed );
225+ gr12 -> SetMarkerColor (kBlue );
158226 gr2 -> SetMarkerStyle (21 );
159227 gr3 -> SetMarkerStyle (23 );
160228 gr4 -> SetMarkerStyle (23 );
161- gr1 -> SetTitle ("R=ZNC/28 rate [Hz]; time[sec]; R" );
162- gr2 -> SetTitle ("R=(TSC+TCE)*TVTX*B*28/ZNC; time[sec]; R" );
229+ if (sum ) {
230+ gr2 -> SetTitle ("R=(TSC+TCE)*TVTX*B*28/ZNC; time[sec]; R" );
231+ } else {
232+ gr2 -> SetTitle ("R=(TSC)*TVTX*B*28/ZNC; time[sec]; R" );
233+ }
163234 // gr2->GetHistogram()->SetMaximum(1.1);
164235 // gr2->GetHistogram()->SetMinimum(0.9);
165236 gr3 -> SetTitle ("R=(TCE)*TVTX*B*28/ZNC; time[sec]; R" );
@@ -168,10 +239,17 @@ void PlotPbLumi(int runNumber, int fillN, std::string ccdbHost = "http://ccdb-te
168239 gr4 -> SetTitle ("R=(VCH)*TVTX*B*28/ZNC; time[sec]; R" );
169240 // gr4->GetHistogram()->SetMaximum(0.6);
170241 // gr4->GetHistogram()->SetMinimum(0.4);
242+ TMultiGraph * mg1 = new TMultiGraph ();
243+ mg1 -> SetTitle ("R=ZNC/28 rate [Hz] (red=PilUp Corrected); time[sec]; R" );
244+ mg1 -> Add (gr1 );
245+ mg1 -> Add (gr11 );
246+ mg1 -> Add (gr12 );
171247 TCanvas * c1 = new TCanvas ("c1" , srun .c_str (), 200 , 10 , 800 , 500 );
248+ std ::string title = "RUN " + std ::to_string (runNumber );
249+ c1 -> SetTitle (title .c_str ());
172250 c1 -> Divide (2 , 2 );
173251 c1 -> cd (1 );
174- gr1 -> Draw ("AP" );
252+ mg1 -> Draw ("AP" );
175253 c1 -> cd (2 );
176254 gr2 -> Draw ("AP" );
177255 c1 -> cd (3 );
0 commit comments