14#include <dqm/analysis/modules/DQMHistAnalysisEventT0TriggerJitter.h>
26REG_MODULE(DQMHistAnalysisEventT0TriggerJitter);
35 setDescription(
"Determining and processing EventT0s from different subdetectors (ECL, CDC, TOP, SVD) for different L1 trigger sources (ECL, CDC, and TOP) to estimate trigger jitter information for different HLT event types (hadron, BhaBha, ยตยต).");
39 addParam(
"prefixCanvas",
m_prefixCanvas,
"Prefix to be added to canvas filename when saved as pdf.", std::string(
"c"));
54 registerEpicsPV(
"EventT0:ECLTRG_Hadron_Delta_CDCEventT0_SVDEventT0",
"ECLTRG_Hadron_Delta_CDCEventT0_SVDEventT0");
55 registerEpicsPV(
"EventT0:ECLTRG_Hadron_Delta_ECLEventT0_SVDEventT0",
"ECLTRG_Hadron_Delta_ECLEventT0_SVDEventT0");
56 registerEpicsPV(
"EventT0:ECLTRG_Hadron_Delta_TOPEventT0_SVDEventT0",
"ECLTRG_Hadron_Delta_TOPEventT0_SVDEventT0");
104 double frac = par[1];
105 double mean = par[2];
106 double sigma = par[3];
107 double mean2 = par[4];
108 double sigma2 = par[5];
110 return N * frac * TMath::Gaus(x[0], mean, sigma) + N * (1 - frac) * TMath::Gaus(x[0], mean2, sigma2);
118 B2DEBUG(20,
"h == nullptr");
126 auto nValidEntries = h->GetEntries() - h->GetBinContent(0) - h->GetBinContent(h->GetNbinsX() + 1);
128 B2DEBUG(20,
"not enough entries");
135 h->Scale(1. / nValidEntries);
136 h->GetXaxis()->SetRangeUser(-50, 50);
140 fitf.SetParNames(
"N",
"f_{1}",
"#mu_{1}",
"#sigma_{1}",
"#mu_{2}",
"#sigma_{2}");
141 fitf.SetParameters(0.1, 0.8, 0, 5, 0, 15);
142 fitf.SetParLimits(1, 0, 1);
143 fitf.SetParLimits(3, 0, 100);
144 fitf.SetParLimits(5, 0, 100);
146 if (h->Fit(&fitf,
"SR+") != 0) {
147 B2DEBUG(20,
"failed fit");
153 fitf.GetParameters(&par[0]);
155 for (
int i = 0; i < 6; i++)
156 parErr[i] = fitf.GetParError(i) ;
160 TF1 gauss1(
"gauss1",
"gaus", -100, 100);
161 TF1 gauss2(
"gauss2",
"gaus", -100, 100);
165 const double mainFrac = par[1] > 0.5 ? par[1] : (1 - par[1]);
166 const double mainMean = par[1] > 0.5 ? par[2] : par[4];
167 const double mainSigma = par[1] > 0.5 ? par[3] : par[5];
168 const double miniMean = par[1] > 0.5 ? par[4] : par[2];
169 const double miniSigma = par[1] > 0.5 ? par[5] : par[3];
170 const double mainMeanErr = par[1] > 0.5 ? parErr[2] : parErr[4];
171 const double mainSigmaErr = par[1] > 0.5 ? parErr[3] : parErr[5];
172 const double miniMeanErr = par[1] > 0.5 ? parErr[4] : parErr[2];
173 const double miniSigmaErr = par[1] > 0.5 ? parErr[5] : parErr[3];
175 gauss1.SetLineColor(kBlue);
176 gauss1.SetLineStyle(kDashed);
177 gauss1.SetParameters(par[0]*mainFrac, mainMean, mainSigma);
179 gauss2.SetLineColor(kRed);
180 gauss2.SetLineStyle(kDashed);
181 gauss2.SetParameters(par[0] * (1 - mainFrac), miniMean, miniSigma);
184 m_monObj->
setVariable(Form(
"N_%s", tag.Data()), nValidEntries, TMath::Sqrt(nValidEntries));
192 gStyle->SetOptFit(1111);
195 fitf.DrawClone(
"same");
196 gauss1.DrawClone(
"same");
197 gauss2.DrawClone(
"same");
199 if (retrieveMeanT0) {
201 return {
true, mainMean};
211 const bool retrieveMeanT0 = retrieveDeltas;
212 bool processingSuccessful =
false;
213 std::optional<double> currentT0;
218 TH1* h =
findHist(
"EventT0/m_histEventT0_ECL_hadron_L1_ECLTRG");
219 TString tag =
"hadronECLTRG_ECLT0";
221 std::tie(processingSuccessful, currentT0) =
processHistogram(h, tag, retrieveMeanT0);
222 if (processingSuccessful) {
230 B2DEBUG(29, Form(
"Histogram ECL EventT0 for %s from EventT0 DQM not processed!", tag.Data()));
237 h =
findHist(
"EventT0/m_histEventT0_ECL_bhabha_L1_ECLTRG");
238 tag =
"bhabhaECLTRG_ECLT0";
245 B2DEBUG(29, Form(
"Histogram ECL EventT0 for %s from EventT0 DQM not processed!", tag.Data()));
252 h =
findHist(
"EventT0/m_histEventT0_ECL_mumu_L1_ECLTRG");
253 tag =
"mumuECLTRG_ECLT0";
260 B2DEBUG(29, Form(
"Histogram ECL EventT0 for %s from EventT0 DQM not processed!", tag.Data()));
270 h =
findHist(
"EventT0/m_histEventT0_CDC_hadron_L1_ECLTRG");
271 tag =
"hadronECLTRG_CDCT0";
273 std::tie(processingSuccessful, currentT0) =
processHistogram(h, tag, retrieveMeanT0);
274 if (processingSuccessful) {
282 B2DEBUG(29, Form(
"Histogram CDC EventT0 for %s from EventT0 DQM not processed!", tag.Data()));
289 h =
findHist(
"EventT0/m_histEventT0_CDC_bhabha_L1_ECLTRG");
290 tag =
"bhabhaECLTRG_CDCT0";
297 B2DEBUG(29, Form(
"Histogram CDC EventT0 for %s from EventT0 DQM not processed!", tag.Data()));
304 h =
findHist(
"EventT0/m_histEventT0_CDC_mumu_L1_ECLTRG");
305 tag =
"mumuECLTRG_CDCT0";
312 B2DEBUG(29, Form(
"Histogram CDC EventT0 for %s from EventT0 DQM not processed!", tag.Data()));
322 h =
findHist(
"EventT0/m_histEventT0_TOP_hadron_L1_ECLTRG");
323 tag =
"hadronECLTRG_TOPT0";
325 std::tie(processingSuccessful, currentT0) =
processHistogram(h, tag, retrieveMeanT0);
326 if (processingSuccessful) {
334 B2DEBUG(29, Form(
"Histogram TOP EventT0 for %s from EventT0 DQM not processed!", tag.Data()));
341 h =
findHist(
"EventT0/m_histEventT0_TOP_bhabha_L1_ECLTRG");
342 tag =
"bhabhaECLTRG_TOPT0";
349 B2DEBUG(29, Form(
"Histogram TOP EventT0 for %s from EventT0 DQM not processed!", tag.Data()));
356 h =
findHist(
"EventT0/m_histEventT0_TOP_mumu_L1_ECLTRG");
357 tag =
"mumuECLTRG_TOPT0";
364 B2DEBUG(29, Form(
"Histogram TOP EventT0 for %s from EventT0 DQM not processed!", tag.Data()));
374 h =
findHist(
"EventT0/m_histEventT0_SVD_hadron_L1_ECLTRG");
375 tag =
"hadronECLTRG_SVDT0";
377 std::tie(processingSuccessful, currentT0) =
processHistogram(h, tag, retrieveMeanT0);
378 if (processingSuccessful) {
386 B2DEBUG(29, Form(
"Histogram SVD EventT0 for %s from EventT0 DQM not processed!", tag.Data()));
393 h =
findHist(
"EventT0/m_histEventT0_SVD_bhabha_L1_ECLTRG");
394 tag =
"bhabhaECLTRG_SVDT0";
401 B2DEBUG(29, Form(
"Histogram SVD EventT0 for %s from EventT0 DQM not processed!", tag.Data()));
408 h =
findHist(
"EventT0/m_histEventT0_SVD_mumu_L1_ECLTRG");
409 tag =
"mumuECLTRG_SVDT0";
416 B2DEBUG(29, Form(
"Histogram SVD EventT0 for %s from EventT0 DQM not processed!", tag.Data()));
430 TH1* h =
findHist(
"EventT0/m_histEventT0_ECL_hadron_L1_CDCTRG");
431 TString tag =
"hadronCDCTRG_ECLT0";
439 B2DEBUG(29, Form(
"Histogram ECL EventT0 for %s from EventT0 DQM not processed!", tag.Data()));
446 h =
findHist(
"EventT0/m_histEventT0_ECL_bhabha_L1_CDCTRG");
447 tag =
"bhabhaCDCTRG_ECLT0";
455 B2DEBUG(29, Form(
"Histogram ECL EventT0 for %s from EventT0 DQM not processed!", tag.Data()));
462 h =
findHist(
"EventT0/m_histEventT0_ECL_mumu_L1_CDCTRG");
463 tag =
"mumuCDCTRG_ECLT0";
470 B2DEBUG(29, Form(
"Histogram ECL EventT0 for %s from EventT0 DQM not processed!", tag.Data()));
480 h =
findHist(
"EventT0/m_histEventT0_CDC_hadron_L1_CDCTRG");
481 tag =
"hadronCDCTRG_CDCT0";
489 B2DEBUG(29, Form(
"Histogram CDC EventT0 for %s from EventT0 DQM not processed!", tag.Data()));
496 h =
findHist(
"EventT0/m_histEventT0_CDC_bhabha_L1_CDCTRG");
497 tag =
"bhabhaCDCTRG_CDCT0";
505 B2DEBUG(29, Form(
"Histogram CDC EventT0 for %s from EventT0 DQM not processed!", tag.Data()));
512 h =
findHist(
"EventT0/m_histEventT0_CDC_mumu_L1_CDCTRG");
513 tag =
"mumuCDCTRG_CDCT0";
520 B2DEBUG(29, Form(
"Histogram CDC EventT0 for %s from EventT0 DQM not processed!", tag.Data()));
530 h =
findHist(
"EventT0/m_histEventT0_TOP_hadron_L1_CDCTRG");
531 tag =
"hadronCDCTRG_TOPT0";
539 B2DEBUG(29, Form(
"Histogram TOP EventT0 for %s from EventT0 DQM not processed!", tag.Data()));
546 h =
findHist(
"EventT0/m_histEventT0_TOP_bhabha_L1_CDCTRG");
547 tag =
"bhabhaCDCTRG_TOPT0";
555 B2DEBUG(29, Form(
"Histogram TOP EventT0 for %s from EventT0 DQM not processed!", tag.Data()));
562 h =
findHist(
"EventT0/m_histEventT0_TOP_mumu_L1_CDCTRG");
563 tag =
"mumuCDCTRG_TOPT0";
570 B2DEBUG(29, Form(
"Histogram TOP EventT0 for %s from EventT0 DQM not processed!", tag.Data()));
580 h =
findHist(
"EventT0/m_histEventT0_SVD_hadron_L1_CDCTRG");
581 tag =
"hadronCDCTRG_SVDT0";
589 B2DEBUG(29, Form(
"Histogram SVD EventT0 for %s from EventT0 DQM not processed!", tag.Data()));
596 h =
findHist(
"EventT0/m_histEventT0_SVD_bhabha_L1_CDCTRG");
597 tag =
"bhabhaCDCTRG_SVDT0";
605 B2DEBUG(29, Form(
"Histogram SVD EventT0 for %s from EventT0 DQM not processed!", tag.Data()));
612 h =
findHist(
"EventT0/m_histEventT0_SVD_mumu_L1_CDCTRG");
613 tag =
"mumuCDCTRG_SVDT0";
620 B2DEBUG(29, Form(
"Histogram SVD EventT0 for %s from EventT0 DQM not processed!", tag.Data()));
632 TH1* h =
findHist(
"EventT0/m_histEventT0_ECL_hadron_L1_TOPTRG");
633 TString tag =
"hadronTOPTRG_ECLT0";
641 B2DEBUG(29, Form(
"Histogram ECL EventT0 for %s from EventT0 DQM not processed!", tag.Data()));
648 h =
findHist(
"EventT0/m_histEventT0_ECL_bhabha_L1_TOPTRG");
649 tag =
"bhabhaTOPTRG_ECLT0";
657 B2DEBUG(29, Form(
"Histogram ECL EventT0 for %s from EventT0 DQM not processed!", tag.Data()));
664 h =
findHist(
"EventT0/m_histEventT0_ECL_mumu_L1_TOPTRG");
665 tag =
"mumuTOPTRG_ECLT0";
672 B2DEBUG(29, Form(
"Histogram ECL EventT0 for %s from EventT0 DQM not processed!", tag.Data()));
682 h =
findHist(
"EventT0/m_histEventT0_CDC_hadron_L1_TOPTRG");
683 tag =
"hadronTOPTRG_CDCT0";
691 B2DEBUG(29, Form(
"Histogram CDC EventT0 for %s from EventT0 DQM not processed!", tag.Data()));
698 h =
findHist(
"EventT0/m_histEventT0_CDC_bhabha_L1_TOPTRG");
699 tag =
"bhabhaTOPTRG_CDCT0";
707 B2DEBUG(29, Form(
"Histogram CDC EventT0 for %s from EventT0 DQM not processed!", tag.Data()));
714 h =
findHist(
"EventT0/m_histEventT0_CDC_mumu_L1_TOPTRG");
715 tag =
"mumuTOPTRG_CDCT0";
722 B2DEBUG(29, Form(
"Histogram CDC EventT0 for %s from EventT0 DQM not processed!", tag.Data()));
732 h =
findHist(
"EventT0/m_histEventT0_TOP_hadron_L1_TOPTRG");
733 tag =
"hadronTOPTRG_TOPT0";
741 B2DEBUG(29, Form(
"Histogram TOP EventT0 for %s from EventT0 DQM not processed!", tag.Data()));
748 h =
findHist(
"EventT0/m_histEventT0_TOP_bhabha_L1_TOPTRG");
749 tag =
"bhabhaTOPTRG_TOPT0";
757 B2DEBUG(29, Form(
"Histogram TOP EventT0 for %s from EventT0 DQM not processed!", tag.Data()));
764 h =
findHist(
"EventT0/m_histEventT0_TOP_mumu_L1_TOPTRG");
765 tag =
"mumuTOPTRG_TOPT0";
772 B2DEBUG(29, Form(
"Histogram TOP EventT0 for %s from EventT0 DQM not processed!", tag.Data()));
782 h =
findHist(
"EventT0/m_histEventT0_SVD_hadron_L1_TOPTRG");
783 tag =
"hadronTOPTRG_SVDT0";
791 B2DEBUG(29, Form(
"Histogram SVD EventT0 for %s from EventT0 DQM not processed!", tag.Data()));
798 h =
findHist(
"EventT0/m_histEventT0_SVD_bhabha_L1_TOPTRG");
799 tag =
"bhabhaTOPTRG_SVDT0";
807 B2DEBUG(29, Form(
"Histogram SVD EventT0 for %s from EventT0 DQM not processed!", tag.Data()));
814 h =
findHist(
"EventT0/m_histEventT0_SVD_mumu_L1_TOPTRG");
815 tag =
"mumuTOPTRG_SVDT0";
822 B2DEBUG(29, Form(
"Histogram SVD EventT0 for %s from EventT0 DQM not processed!", tag.Data()));
void initializeCanvases()
Initialise canvases.
TCanvas * m_cCDCTimeMuMuECLTRG
Canvas for CDC time ECLTRG jitter mumu.
TCanvas * m_cECLTimeHadronsECLTRG
Canvas for ECL time ECLTRG jitter hadrons.
void initialize() override final
create TCanvas and MonitoringObject
TCanvas * m_cTOPTimeHadronsECLTRG
Canvas for TOP time ECLTRG jitter hadrons.
TCanvas * m_cECLTimeHadronsCDCTRG
Canvas for ECL time CDCTRG jitter hadrons.
TCanvas * m_cECLTimeMuMuECLTRG
Canvas for ECL time ECLTRG jitter mumu.
TCanvas * m_cCDCTimeHadronsECLTRG
Canvas for CDC time ECLTRG jitter hadrons.
static double fDoubleGaus(double *x, double *par)
double gaussian fitting function for the jitter distribution
double m_ECLTRGHLThadronCDCT0
CDC T0 for ECLTRG jitter for HLT hadron events.
double m_ECLTRGHLThadronTOPT0
TOP T0 for ECLTRG jitter for HLT hadron events.
TCanvas * m_cCDCTimeBhaBhaECLTRG
Canvas for CDC time ECLTRG jitter bhabhas.
TCanvas * m_cSVDTimeMuMuTOPTRG
Canvas for SVD time TOPTRG jitter mumu.
double m_ECLTRGHLThadronSVDT0
SVD T0 for ECLTRG jitter for HLT hadron events.
void deleteCanvases()
Delete canvases.
TCanvas * m_cCDCTimeHadronsTOPTRG
Canvas for CDC time TOPTRG jitter hadrons.
void setDeltaT0Values()
Set the deltaT0 values in the monObj.
TCanvas * m_cECLTimeBhaBhaECLTRG
Canvas for ECL time ECLTRG jitter bhabhas.
TCanvas * m_cCDCTimeBhaBhaCDCTRG
Canvas for CDC time CDCTRG jitter bhabhas.
std::tuple< bool, std::optional< double > > processHistogram(TH1 *h, TString tag, bool retrieveMeanT0=false)
process the EventT0 distribution fitting with two gaussians filling the MonitoringObject
std::string m_prefixCanvas
prefix to be added to canvas name when saved as pdf
void analyseECLTRGEventT0Distributions(bool retrieveDeltas=true)
Analyse the ECLTRG EventT0 distributions The only function to retrieve deltaT values ECL-SVD,...
double m_ECLTRGHLThadronECLT0
ECL T0 for ECLTRG jitter for HLT hadron events.
TCanvas * m_cCDCTimeMuMuCDCTRG
Canvas for CDC time CDCTRG jitter mumu.
MonitoringObject * m_monObj
MonitoringObject to be produced by this module.
TCanvas * m_cCDCTimeMuMuTOPTRG
Canvas for CDC time TOPTRG jitter mumu.
TCanvas * m_cCDCTimeHadronsCDCTRG
Canvas for CDC time CDCTRG jitter hadrons.
TCanvas * m_cTOPTimeHadronsTOPTRG
Canvas for TOP time TOPTRG jitter hadrons.
void terminate() override final
delete pointers
void clearCanvases()
Initialise canvases.
void analyseTOPTRGEventT0Distributions()
Analyse the TOPTRG EventT0 distributions.
void event() override final
fit the histograms in the event
TCanvas * m_cECLTimeBhaBhaTOPTRG
Canvas for ECL time TOPTRG jitter bhabhas.
bool m_printCanvas
if true print the pdf of the canvases
TCanvas * m_cTOPTimeBhaBhaECLTRG
Canvas for TOP time ECLTRG jitter bhabhas.
TCanvas * m_cSVDTimeHadronsTOPTRG
Canvas for SVD time TOPTRG jitter hadrons.
TCanvas * m_cTOPTimeBhaBhaTOPTRG
Canvas for TOP time TOPTRG jitter bhabhas.
TCanvas * m_cSVDTimeBhaBhaECLTRG
Canvas for SVD time ECLTRG jitter bhabhas.
TCanvas * m_cTOPTimeBhaBhaCDCTRG
Canvas for TOP time CDCTRG jitter bhabhas.
uint m_nEntriesMin
minimum number of entries to process the histogram
TCanvas * m_cECLTimeMuMuCDCTRG
Canvas for ECL time CDCTRG jitter mumu.
TCanvas * m_cSVDTimeMuMuCDCTRG
Canvas for SVD time CDCTRG jitter mumu.
TCanvas * m_cTOPTimeMuMuTOPTRG
Canvas for TOP time TOPTRG jitter mumu.
TCanvas * m_cECLTimeBhaBhaCDCTRG
Canvas for ECL time CDCTRG jitter bhabhas.
void endRun() override final
final fit of T0 distributions
TCanvas * m_cTOPTimeHadronsCDCTRG
Canvas for TOP time CDCTRG jitter hadrons.
TCanvas * m_cECLTimeHadronsTOPTRG
Canvas for ECL time TOPTRG jitter hadrons.
TCanvas * m_cCDCTimeBhaBhaTOPTRG
Canvas for CDC time TOPTRG jitter bhabhas.
void beginRun() override final
clear TCanvas
TCanvas * m_cSVDTimeHadronsECLTRG
Canvas for SVD time ECLTRG jitter hadrons.
TCanvas * m_cECLTimeMuMuTOPTRG
Canvas for ECL time TOPTRG jitter mumu.
TCanvas * m_cTOPTimeMuMuCDCTRG
Canvas for TOP time CDCTRG jitter mumu.
DQMHistAnalysisEventT0TriggerJitterModule()
Constructor.
~DQMHistAnalysisEventT0TriggerJitterModule()
Destructor.
void printCanvases()
Print canvases if required.
TCanvas * m_cSVDTimeMuMuECLTRG
Canvas for SVD time ECLTRG jitter mumu.
TCanvas * m_cSVDTimeHadronsCDCTRG
Canvas for SVD time CDCTRG jitter hadrons.
TCanvas * m_cTOPTimeMuMuECLTRG
Canvas for TOP time ECLTRG jitter mumu.
TCanvas * m_cSVDTimeBhaBhaCDCTRG
Canvas for SVD time CDCTRG jitter bhabhas.
TCanvas * m_cSVDTimeBhaBhaTOPTRG
Canvas for SVD time TOPTRG jitter bhabhas.
void analyseCDCTRGEventT0Distributions()
Analyse the CDCTRG EventT0 distributions.
The base class for the histogram analysis module.
static MonitoringObject * getMonitoringObject(const std::string &name)
Get MonitoringObject with given name (new object is created if non-existing)
static TH1 * findHist(const std::string &histname, bool onlyIfUpdated=false)
Get histogram from list (no other search).
void setEpicsPV(std::string keyname, double value)
Write value to a EPICS PV.
int registerEpicsPV(std::string pvname, std::string keyname="")
EPICS related Functions.
void setDescription(const std::string &description)
Sets the description of the module.
void setVariable(const std::string &var, float val, float upErr=-1., float dwErr=-1)
set value to float variable (new variable is made if not yet existing)
void addParam(const std::string &name, T ¶mVariable, const std::string &description, const T &defaultValue)
Adds a new parameter to the module.
#define REG_MODULE(moduleName)
Register the given module (without 'Module' suffix) with the framework.
Abstract base class for different kinds of events.