2020#include "CCDB/BasicCCDBManager.h"
2121#include "DataFormatsCTP/Scalers.h"
2222#include "DataFormatsCTP/Configuration.h"
23+ #include <DataFormatsParameters/GRPLHCIFData.h>
24+ #include "TGraph.h"
25+ #include "TGraphErrors.h"
26+ #include "TCanvas.h"
27+ #include "TMath.h"
28+ #include "TStyle.h"
29+ #include "TF1.h"
2330#include <string>
2431#include <map>
2532#include <iostream>
2633#endif
2734using namespace o2 ::ctp ;
28- void PlotPbLumi (int runNumber , int fillN , std ::string ccdbHost = "http://ccdb-test.cern.ch:8080" )
29- { //
30- // what = 1: znc rate
31- // what = 2: (TCE+TSC)/ZNC
32- // what = 3: TCE/ZNC
35+ using namespace std ::chrono ;
36+ //
37+ // if fillN = 0: pileup correction not done
38+ // QCDB =1 : use for ongoing run
39+ //
40+ void PlotPbLumi (int runNumber , int fillN = 0 , int QCDB = 0 , std ::string ccdbHost = "http://alice-ccdb.cern.ch" )
41+ { // "http://ccdb-test.cern.ch:8080"
3342 std ::string mCCDBPathCTPScalers = "CTP/Calib/Scalers" ;
43+ std ::string mQCDBPathCTPScalers = "qc/CTP/Scalers" ;
3444 std ::string mCCDBPathCTPConfig = "CTP/Config/Config" ;
3545 auto& ccdbMgr = o2 ::ccdb ::BasicCCDBManager ::instance ();
46+ ccdbMgr .setURL (ccdbHost );
3647 // Timestamp
3748 auto soreor = ccdbMgr .getRunDuration (runNumber );
3849 uint64_t timeStamp = (soreor .second - soreor .first ) / 2 + soreor .first ;
3950 std ::cout << "Timestamp:" << timeStamp << std ::endl ;
4051 // Filling
41- std ::string sfill = std ::to_string (fillN );
4252 std ::map < string , string > metadata ;
43- metadata ["fillNumber" ] = sfill ;
44- auto lhcifdata = ccdbMgr .getSpecific < o2 ::parameters ::GRPLHCIFData > ("GLO/Config/GRPLHCIF" , timeStamp , metadata );
45- auto bfilling = lhcifdata -> getBunchFilling ();
46- std ::vector < int > bcs = bfilling .getFilledBCs ();
47- int nbc = bcs .size ();
48- std ::cout << "Number of interacting bc:" << nbc << std ::endl ;
53+ int nbc = 0 ;
54+ if (fillN ) {
55+ std ::string sfill = std ::to_string (fillN );
56+ metadata ["fillNumber" ] = sfill ;
57+ auto lhcifdata = ccdbMgr .getSpecific < o2 ::parameters ::GRPLHCIFData > ("GLO/Config/GRPLHCIF" , timeStamp , metadata );
58+ auto bfilling = lhcifdata -> getBunchFilling ();
59+ std ::vector < int > bcs = bfilling .getFilledBCs ();
60+ nbc = bcs .size ();
61+ std ::cout << "Number of interacting bc:" << nbc << std ::endl ;
62+ }
63+ if (QCDB ) { // use this option for ongoing run
64+ mCCDBPathCTPScalers = mQCDBPathCTPScalers ;
65+ ccdbMgr .setURL ("http://ccdb-test.cern.ch:8080" );
66+ timeStamp = duration_cast < milliseconds > (system_clock ::now ().time_since_epoch ()).count ();
67+ std ::cout << "For scalers using Current time:" << timeStamp << std ::endl ;
68+ }
4969 // Scalers
5070 std ::string srun = std ::to_string (runNumber );
5171 metadata .clear (); // can be empty
5272 metadata ["runNumber" ] = srun ;
53- ccdbMgr .setURL ("http://ccdb-test.cern.ch:8080" );
5473 auto scl = ccdbMgr .getSpecific < CTPRunScalers > (mCCDBPathCTPScalers , timeStamp , metadata );
5574 if (scl == nullptr ) {
5675 LOG (info ) << "CTPRunScalers not in database, timestamp:" << timeStamp ;
@@ -105,48 +124,72 @@ void PlotPbLumi(int runNumber, int fillN, std::string ccdbHost = "http://ccdb-te
105124 return ;
106125 }
107126 //
108- // Anal
109- //
110127 // Times
111128 double_t frev = 11245 ;
112129 double_t time0 = recs [0 ].epochTime ;
113130 double_t timeL = recs [recs .size () - 1 ].epochTime ;
114131 double_t Trun = timeL - time0 ;
115132 double_t orbit0 = recs [0 ].intRecord .orbit ;
116133 int n = recs .size () - 1 ;
134+ if (runNumber == 559143 ) {
135+ n = 400 ;
136+ }
137+ if (runNumber == 559561 ) {
138+ n = n - 3 ; // rate drops at the end
139+ }
140+ if (runNumber == 559575 ){
141+ n = n - 6 ;
142+ }
143+ if (runNumber == 559617 ) {
144+ n = n - 5 ;
145+ }
146+ if (runNumber == 559632 ) {
147+ n = n - 6 ;
148+ }
117149 std ::cout << " Run duration:" << Trun << " Scalers size:" << n + 1 << std ::endl ;
118- Double_t x [n ], znc [n ], zncpp [n ];
150+ Double_t x [n ], znc [n ], zncpp [n ], ex [ n ], eznc [ n ] ;
119151 Double_t tcetsctoznc [n ], tcetoznc [n ], vchtoznc [n ];
152+ Double_t etcetsctoznc [n ], etcetoznc [n ], evchtoznc [n ];
153+
120154 for (int i = 0 ; i < n ; i ++ ) {
155+ ex [i ] = 0 ;
121156 x [i ] = (double_t )(recs [i + 1 ].intRecord .orbit + recs [i ].intRecord .orbit ) / 2. - orbit0 ;
122157 x [i ] *= 88e-6 ;
123158 // x[i] = (double_t)(recs[i+1].epochTime + recs[i].epochTime)/2.;
124159 double_t tt = (double_t )(recs [i + 1 ].intRecord .orbit - recs [i ].intRecord .orbit );
125160 tt = tt * 88e-6 ;
126161 //
127- // std::cout << recs[i+1].scalersInps[25] << std::endl;
128162 double_t znci = (double_t )(recs [i + 1 ].scalersInps [25 ] - recs [i ].scalersInps [25 ]);
129- double_t mu = - TMath ::Log (1. - znci / tt / nbc / frev );
130- double_t zncipp = mu * nbc * frev ;
163+ double_t zncipp = znci ;
164+ double_t mu = 0 ;
165+ if (fillN ) {
166+ mu = - TMath ::Log (1. - znci / tt / nbc / frev );
167+ zncipp = mu * nbc * frev * tt ;
168+ }
131169 zncpp [i ] = zncipp / 28. ;
132- znc [i ] = znci / 28. / tt ;
133- //
134- auto had = recs [i + 1 ].scalers [tce ].lmBefore - recs [i ].scalers [tce ].lmBefore ;
135- // std::cout << recs[i+1].scalers[tce].lmBefore << std::endl;
136- had += recs [i + 1 ].scalers [tsc ].lmBefore - recs [i ].scalers [tsc ].lmBefore ;
137- // rat = (double_t)(had)/double_t(recs[i+1].scalersInps[25] - recs[i].scalersInps[25])*28;
138- tcetsctoznc [i ] = (double_t )(had ) / zncpp [i ] / tt ;
139- had = recs [i + 1 ].scalers [tce ].lmBefore - recs [i ].scalers [tce ].lmBefore ;
140- // rat = (double_t)(had)/double_t(recs[i+1].scalersInps[25] - recs[i].scalersInps[25])*28;
141- tcetoznc [i ] = (double_t )(had ) / zncpp [i ] / tt ;
142- had = recs [i + 1 ].scalers [vch ].lmBefore - recs [i ].scalers [vch ].lmBefore ;
143- // rat = (double_t)(had)/double_t(recs[i+1].scalersInps[25] - recs[i].scalersInps[25])*28;
144- vchtoznc [i ] = (double_t )(had ) / zncpp [i ] / tt ;
170+ znc [i ] = zncipp / 28. / tt ;
171+ eznc [i ] = TMath ::Sqrt (zncipp ) / 28. / tt ;
172+ if (1 ){
173+ //
174+ auto had = recs [i + 1 ].scalers [tsc ].lmBefore - recs [i ].scalers [tsc ].lmBefore ;
175+ had += recs [i + 1 ].scalers [tce ].lmBefore - recs [i ].scalers [tce ].lmBefore ;
176+ tcetsctoznc [i ] = (double_t )(had ) / zncpp [i ];
177+ etcetsctoznc [i ] = TMath ::Sqrt (tcetsctoznc [i ]* (1 - tcetsctoznc [i ])/ zncpp [i ]);
178+ had = recs [i + 1 ].scalers [tce ].lmBefore - recs [i ].scalers [tce ].lmBefore ;
179+ double_t tcec = had ;
180+ tcetoznc [i ] = (double_t )(had ) / zncpp [i ];
181+ had = recs [i + 1 ].scalers [vch ].lmBefore - recs [i ].scalers [vch ].lmBefore ;
182+ vchtoznc [i ] = (double_t )(had ) / zncpp [i ] ;
183+ //std::cout << "mu:" << mu << " zncpp corr:" << zncipp << " zncraw:" << znci << " tce:" << tcec << " tce/had" << tcec/zncpp[i] << std::endl;
184+ }
145185 }
146186 //
187+ TFile myfile ("file.root" ,"RECREATE" );
147188 gStyle -> SetMarkerSize (0.5 );
148- TGraph * gr1 = new TGraph (n , x , znc );
189+ //TGraph* gr1 = new TGraph(n, x, znc);
190+ TGraphErrors * gr1 = new TGraphErrors (n , x , znc , ex , eznc );
149191 TGraph * gr2 = new TGraph (n , x , tcetsctoznc );
192+ //TGraphErrors* gr2 = new TGraphErrors(n, x, tcetsctoznc, ex, etcetsctoznc); // nom and denom are strongly correlated
150193 TGraph * gr3 = new TGraph (n , x , tcetoznc );
151194 TGraph * gr4 = new TGraph (n , x , vchtoznc );
152195 gr1 -> SetMarkerStyle (20 );
@@ -155,6 +198,7 @@ void PlotPbLumi(int runNumber, int fillN, std::string ccdbHost = "http://ccdb-te
155198 gr4 -> SetMarkerStyle (23 );
156199 gr1 -> SetTitle ("R=ZNC/28 rate [Hz]; time[sec]; R" );
157200 gr2 -> SetTitle ("R=(TSC+TCE)*TVTX*B*28/ZNC; time[sec]; R" );
201+ //gr2->SetTitle("R=TSC*TVTX*B*28/ZNC; time[sec]; R");
158202 // gr2->GetHistogram()->SetMaximum(1.1);
159203 // gr2->GetHistogram()->SetMinimum(0.9);
160204 gr3 -> SetTitle ("R=(TCE)*TVTX*B*28/ZNC; time[sec]; R" );
@@ -164,19 +208,29 @@ void PlotPbLumi(int runNumber, int fillN, std::string ccdbHost = "http://ccdb-te
164208 // gr4->GetHistogram()->SetMaximum(0.6);
165209 // gr4->GetHistogram()->SetMinimum(0.4);
166210 TCanvas * c1 = new TCanvas ("c1" , srun .c_str (), 200 , 10 , 800 , 500 );
211+ TF1 * fun = new TF1 ("poly0" ,"[0]+x*[1]" );
167212 c1 -> Divide (2 , 2 );
168213 c1 -> cd (1 );
169214 gr1 -> Draw ("AP" );
170215 c1 -> cd (2 );
216+ fun -> SetParameter (0 ,1 );
217+ gr2 -> Fit ("poly0" ,"FM" );
171218 gr2 -> Draw ("AP" );
172219 c1 -> cd (3 );
220+ fun -> SetParameter (0 ,0.5 );
221+ gr3 -> Fit ("poly0" );
173222 gr3 -> Draw ("AP" );
174223 c1 -> cd (4 );
224+ gr4 -> Fit ("poly0" );
175225 gr4 -> Draw ("AP" );
176226 // getRate test:
177227 double tt = timeStamp / 1000. ;
178228 std ::pair < double , double > r1 = scl -> getRateGivenT (tt , 25 , 7 );
179229 std ::cout << "ZDC input getRateGivetT:" << r1 .first / 28. << " " << r1 .second / 28. << std ::endl ;
180230 std ::pair < double , double > r2 = scl -> getRateGivenT (tt , tce , 1 );
181231 std ::cout << "LM before TCE class getRateGivetT:" << r2 .first << " " << r2 .second << std ::endl ;
232+ gr1 -> Write ();
233+ gr2 -> Write ();
234+ gr3 -> Write ();
235+ gr4 -> Write ();
182236}
0 commit comments