8#include <svd/calibration/SVD3SampleCoGTimeCalibrationAlgorithm.h>
10#include <svd/dbobjects/SVDCoGCalibrationFunction.h>
11#include <svd/calibration/SVD3SampleCoGTimeCalibrations.h>
18#include <framework/logging/Logger.h>
21#include <TFitResult.h>
28 setDescription(
"SVD3SampleCoGTimeCalibration calibration algorithm");
34 gROOT->SetBatch(
true);
41 std::unique_ptr<TF1> pol3(
new TF1(
"pol3",
"[0] + [1]*x + [2]*[3]*[3]*x - [2]*[3]*x*x + [2]*x*x*x/3", -10,
45 pol3->SetParLimits(1, 0, 100);
46 pol3->SetParLimits(2, 0, 0.1);
49 pol3->SetParLimits(3, 30, 60);
53 while (gSystem->GetPathInfo(Form(
"algorithm_3SampleCoG_output_rev_%d.root", cal_rev), info) == 0)
55 std::unique_ptr<TFile> f(
new TFile(Form(
"algorithm_3SampleCoG_output_rev_%d.root", cal_rev),
"RECREATE"));
57 auto m_tree =
new TTree(Form(
"rev_%d", cal_rev),
"RECREATE");
58 int layer_num, ladder_num, sensor_num, view, ndf;
59 float a, b, c, d, a_err, b_err, c_err, d_err, chi2, p;
60 m_tree->Branch(
"layer", &layer_num,
"layer/I");
61 m_tree->Branch(
"ladder", &ladder_num,
"ladder/I");
62 m_tree->Branch(
"sensor", &sensor_num,
"sensor/I");
63 m_tree->Branch(
"isU", &view,
"isU/I");
64 m_tree->Branch(
"a", &a,
"a/F");
65 m_tree->Branch(
"b", &b,
"b/F");
66 m_tree->Branch(
"c", &c,
"c/F");
67 m_tree->Branch(
"d", &d,
"d/F");
68 m_tree->Branch(
"a_err", &a_err,
"a_err/F");
69 m_tree->Branch(
"b_err", &b_err,
"b_err/F");
70 m_tree->Branch(
"c_err", &c_err,
"c_err/F");
71 m_tree->Branch(
"d_err", &d_err,
"d_err/F");
72 m_tree->Branch(
"chi2", &chi2,
"chi2/F");
73 m_tree->Branch(
"ndf", &ndf,
"ndf/I");
74 m_tree->Branch(
"p", &p,
"p/F");
77 B2INFO(
"--------- Applyingselection, 2D-region selection parameters: ");
82 auto __hEventT0vsCoG__ = getObjectPtr<TH3F>(
"__hEventT0vsCoG__");
83 auto __hEventT0__ = getObjectPtr<TH2F>(
"__hEventT0__");
84 auto __hEventT0NoSync__ = getObjectPtr<TH2F>(
"__hEventT0NoSync__");
85 auto __hBinToSensorMap__ = getObjectPtr<TH1F>(
"__hBinToSensorMap__");
87 for (
int ij = 0; ij < (__hBinToSensorMap__->GetNbinsX()); ij++) {
92 auto binLabel = __hBinToSensorMap__->GetXaxis()->GetBinLabel(ij + 1);
94 std::sscanf(binLabel,
"L%dL%dS%d%c", &layer_num, &ladder_num, &sensor_num, &side);
99 B2INFO(
"Projecting for Sensor: " << binLabel <<
" with Bin Number: " << ij + 1);
101 __hEventT0vsCoG__->GetZaxis()->SetRange(ij + 1, ij + 1);
102 auto hEventT0vsCoG = (TH2D*)__hEventT0vsCoG__->Project3D(
"yxe");
103 auto hEventT0 = (TH1D*)__hEventT0__->ProjectionX(
"hEventT0_tmp", ij + 1, ij + 1);
104 auto hEventT0nosync = (TH1D*)__hEventT0NoSync__->ProjectionX(
"hEventT0NoSync_tmp", ij + 1, ij + 1);
106 hEventT0vsCoG->SetName(Form(
"eventT0vsCoG__L%dL%dS%d%c", layer_num, ladder_num, sensor_num, side));
107 hEventT0->SetName(Form(
"eventT0__L%dL%dS%d%c", layer_num, ladder_num, sensor_num, side));
108 hEventT0nosync->SetName(Form(
"eventT0nosync__L%dL%dS%d%c", layer_num, ladder_num, sensor_num, side));
110 char sidePN = (side ==
'U' ?
'P' :
'N');
111 hEventT0vsCoG->SetTitle(Form(
"EventT0Sync vs rawTime in %d.%d.%d %c/%c", layer_num, ladder_num, sensor_num, side, sidePN));
112 hEventT0->SetTitle(Form(
"EventT0Sync in %d.%d.%d %c/%c", layer_num, ladder_num, sensor_num, side, sidePN));
113 hEventT0nosync->SetTitle(Form(
"EventT0NoSync in %d.%d.%d %c/%c", layer_num, ladder_num, sensor_num, side, sidePN));
115 hEventT0vsCoG->SetDirectory(0);
116 hEventT0->SetDirectory(0);
117 hEventT0nosync->SetDirectory(0);
119 int nEntriesForFilter = hEventT0vsCoG->GetEntries();
120 B2INFO(
"Histogram: " << hEventT0vsCoG->GetName() <<
121 " Entries (n. clusters): " << hEventT0vsCoG->GetEntries());
122 if (layer_num == 3 && hEventT0vsCoG->GetEntries() <
m_minEntries) {
123 B2INFO(
"Histogram: " << hEventT0vsCoG->GetName() <<
124 " Entries (n. clusters): " << hEventT0vsCoG->GetEntries() <<
126 B2WARNING(
"Not enough data, adding one run to the collector");
128 gSystem->Unlink(Form(
"algorithm_3SampleCoG_output_rev_%d.root", cal_rev));
131 if (layer_num != 3 && hEventT0vsCoG->GetEntries() <
m_minEntries / 10) {
132 B2INFO(
"Histogram: " << hEventT0vsCoG->GetName() <<
133 " Entries (n. clusters): " << hEventT0vsCoG->GetEntries() <<
135 B2WARNING(
"Not enough data, adding one run to the collector");
137 gSystem->Unlink(Form(
"algorithm_3SampleCoG_output_rev_%d.root", cal_rev));
140 TF1* f1 =
new TF1(
"f1",
"[0]+[1]*x", -100, 100);
142 TF1* f2 =
new TF1(
"f1",
"[0]+[1]*x", -100, 100);
144 for (
int i = 1; i <= hEventT0vsCoG->GetNbinsX(); i++) {
145 for (
int j = 1; j <= hEventT0vsCoG->GetNbinsY(); j++) {
146 double bcx = ((TAxis*)hEventT0vsCoG->GetXaxis())->GetBinCenter(i);
147 double bcy = ((TAxis*)hEventT0vsCoG->GetYaxis())->GetBinCenter(j);
149 hEventT0vsCoG->SetBinContent(i, j, 0);
150 }
else if (hEventT0vsCoG->GetBinContent(i, j) > 0
151 && (hEventT0vsCoG->GetBinContent(i, j) < std::max(2,
int(nEntriesForFilter * 0.001)))) {
152 hEventT0vsCoG->SetBinContent(i, j, 0);
157 TProfile* pfx = hEventT0vsCoG->ProfileX();
158 std::string name =
"pfx_" + std::string(hEventT0vsCoG->GetName());
159 pfx->SetName(name.c_str());
162 pol3->SetParameter(1, 1.75);
163 pol3->SetParameter(2, 0.005);
164 pol3->SetParameter(3, 40);
165 TFitResultPtr tfr = pfx->Fit(
"pol3",
"QMRS");
167 pol3->GetParameters(par);
170 timeCal->set_current(1);
171 timeCal->set_pol3parameters(par[0], par[1] + par[2]*par[3]*par[3], -par[2]*par[3], par[2] / 3);
172 payload->set(layer_num, ladder_num, sensor_num,
bool(view), 1, *timeCal);
175 hEventT0vsCoG->Write();
176 hEventT0nosync->Write();
180 delete hEventT0vsCoG;
182 delete hEventT0nosync;
185 if (tfr.Get() ==
nullptr || (tfr->Status() != 0 && tfr->Status() != 4 && tfr->Status() != 4000)) {
187 B2FATAL(
"Fit to the histogram failed in SVD3SampleCoGTimeCalibrationAlgorithm. "
188 <<
"Check the 2-D histogram to clarify the reason.");
190 a = par[0]; b = par[1]; c = par[2]; d = par[3];
191 a_err = tfr->ParError(0); b_err = tfr->ParError(1); c_err = tfr->ParError(2); d_err = tfr->ParError(3);
214 float meanRawTimeL3V = 0;
216 auto rawTimeL3V = getObjectPtr<TH1F>(
"hRawTimeL3V");
223 meanRawTimeL3V = rawTimeL3V->GetMean();
230 B2INFO(
"Setting start payload boundary to be the first run ("
231 << currentRun.first <<
"," << currentRun.second <<
")");
237 <<
" to " << meanRawTimeL3V <<
". We are requesting a new payload boundary for ("
238 << currentRun.first <<
"," << currentRun.second <<
")");
Base class for calibration algorithms.
void saveCalibration(TClonesArray *data, const std::string &name)
Store DBArray payload with given name with default IOV.
void setDescription(const std::string &description)
Set algorithm description (in constructor)
EResult
The result of calibration.
@ c_OK
Finished successfully =0 in Python.
@ c_NotEnoughData
Needs more data =2 in Python.
bool m_applyLinearCutsToRemoveBkg
if true turns on the selection to remove background clusters from CoG3 calibration
std::string m_id
Parameter given to set the UniqueID of the payload.
float m_angularCoefficientUpperLine
Angular coefficient of one of the two lines that define the signal region used in the CoG3 calibratio...
std::optional< float > m_previousRawTimeMeanL3V
Raw CoG of the previous run.
SVD3SampleCoGTimeCalibrationAlgorithm(const std::string &str)
Constructor set the prefix to SVDTimeCalibrationCollector.
float m_interceptUpperLine
Intercept of one of the two lines that define the signal region used in the CoG3 calibration (to remo...
float m_minEntries
Set the minimun number of entries required in the histograms of layer 3.
virtual EResult calibrate() override
Run algo on data.
float m_angularCoefficientLowerLine
Angulat coefficienct of one of the two lines that define the signal region used in the CoG3 calibrati...
virtual bool isBoundaryRequired(const Calibration::ExpRun ¤tRun) override
If the event T0 changes significantly return true.
float m_interceptLowerLine
Intercept of one of the two lines that define the signal region used in the CoG3 calibration (to remo...
float m_allowedTimeShift
Allowed Raw CoGshift.
SVDCalibrationsBase< SVDCalibrationsScalar< SVDCoGCalibrationFunction > > t_payload
typedef for the SVDCoGCalibrationFunction payload of all SVD sensors
class to contain the CoG Time calibrations
Abstract base class for different kinds of events.