77 B2INFO(
"Reading ECLCrystalCalib payload: eclWaveformTemplateCalibrationC1MaxResLimit");
78 DBObjPtr<ECLCrystalCalib> existingeclWaveformTemplateCalibrationC1MaxResLimit(
"eclWaveformTemplateCalibrationC1MaxResLimit");
80 ExpRun chosenRun = runs.front();
87 std::vector<double> cellIDArray;
88 std::vector<double> maxResidualArray;
89 std::vector<double> limitResidualArray;
90 std::vector<double> parLimitFactorArray;
93 TFile* histfile =
new TFile(
m_outputName.c_str(),
"recreate");
96 TFile* f_PhotonTemplateOutput =
new TFile(Form(
"PhotonShapes_Low%d_High%d.root",
m_firstCellID,
m_lastCellID),
"RECREATE");
97 TTree* mtree =
new TTree(
"mtree",
"");
98 std::vector<double> PhotonWaveformArray(100000);
99 mtree->Branch(
"PhotonArray", PhotonWaveformArray.data(),
"PhotonWaveformArray[100000]/D");
104 tree->SetBranchAddress(
"CellID", &CellID);
108 tree->SetBranchAddress(Form(
"ADC%d", i), &Waveform[i]);
112 std::time_t t = std::time(0);
115 int AttemptCounter = 0;
122 double ParMin11t[11];
128 if (CellID_i > 7776 || CellID_i < 1153) {
129 ParMin11t[0] = 20.3216;
130 ParMin11t[1] = -0.0206266;
131 ParMin11t[2] = 0.313928;
132 ParMin11t[3] = 0.589646;
133 ParMin11t[4] = 0.455526;
134 ParMin11t[5] = 1.03656;
135 ParMin11t[6] = 0.000822467;
136 ParMin11t[7] = 45.1574;
137 ParMin11t[8] = 0.716034;
138 ParMin11t[9] = 0.616753;
139 ParMin11t[10] = 0.0851222;
141 ParMin11t[0] = 24.6176;
142 ParMin11t[1] = 0.00725002;
143 ParMin11t[2] = 0.601578;
144 ParMin11t[3] = 0.491976;
145 ParMin11t[4] = 0.601034;
146 ParMin11t[5] = 0.601684;
147 ParMin11t[6] = -0.0103788;
148 ParMin11t[7] = 2.22615;
149 ParMin11t[8] = 0.671294;
150 ParMin11t[9] = 0.529878;
151 ParMin11t[10] = 0.0757927;
154 double resLimit = 2 * existingeclWaveformTemplateCalibrationC1MaxResLimit->getCalibVector()[CellID_i -
156 double resLimitOriginal = resLimit;
159 std::vector<int> EntriesToSkip;
162 double maxResidual = 1000.0;
166 while (PASS ==
false) {
169 std::vector<double> xValuesToFit;
170 std::vector<double> yValuesToFit;
173 std::vector<double> guessBaseline;
174 std::vector<double> guessAmp;
175 std::vector<double> guessTime;
178 std::vector<int> NtupleEntries;
181 int counterWaveforms = 0;
183 for (
int i = 0; i < tree->GetEntries(); i++) {
186 bool skipEvent =
false;
187 for (
int k = 0; k < (int)EntriesToSkip.size(); k++) {
188 if (EntriesToSkip[k] == i) skipEvent =
true;
190 if (skipEvent)
continue;
194 if (CellID != CellID_i)
continue;
199 xValuesToFit.push_back(counter);
200 yValuesToFit.push_back(Waveform[j]);
201 if (Waveform[j] > maxval) {
202 maxval = Waveform[j];
209 guessBaseline.push_back(Waveform[0]);
210 guessAmp.push_back(maxval);
211 guessTime.push_back((maxIndex - 4.5) * 0.5);
213 NtupleEntries.push_back(i);
214 B2INFO(
"Entry: " << i);
223 B2INFO(
"CellID " << CellID_i <<
" counterWaveforms = " << counterWaveforms);
227 B2INFO(
"eclWaveformTemplateCalibrationC2Algorithm: warning total entries for cell ID " << CellID_i <<
" is only: " <<
229 EntriesToSkip.clear();
231 B2INFO(
"eclWaveformTemplateCalibrationC2Algorithm: warning " << CellID_i <<
" resLimit is doubled to" << resLimit <<
" start was "
232 << resLimitOriginal);
237 auto gWaveformToFit =
new TGraph(xValuesToFit.size(), xValuesToFit.data(), yValuesToFit.data());
238 gWaveformToFit->SetName(Form(
"gWaveformToFit_%d",
int(CellID_i)));
243 FitFunctions.clear();
244 for (
int i = 0; i < counterWaveforms; i++) {
245 FitFunctions.push_back(
new TF1(Form(
"Shp_%d", i), Belle2::ECL::WaveFuncTwoComponent, 0, 30.5, 26));
246 FitFunctions[i]->SetNpx(10000);
247 FitFunctions[i]->FixParameter(3, 0);
248 for (
int k = 0; k < 10; k++) {
249 FitFunctions[i]->SetParameter(4 + k, ParMin11t[k + 1]);
250 FitFunctions[i]->FixParameter(10 + 4 + k, ParMin11t[k + 1]);
252 FitFunctions[i]->FixParameter(24, ParMin11t[0]);
253 FitFunctions[i]->FixParameter(25, 1);
257 TF1* TotalFitFunction =
new TF1(
"TotalFitFunction", fitf, 0, counterWaveforms *
m_NumberofADCPoints,
258 (3 * FitFunctions.size()) + 10);
261 int FFsize = FitFunctions.size();
262 for (
int i = 0; i < FFsize; i++) {
263 TotalFitFunction->SetParameter(i, guessTime[i]);
264 TotalFitFunction->SetParameter(FFsize + i, guessBaseline[i]);
265 TotalFitFunction->SetParameter((2 * FFsize) + i, guessAmp[i]);
266 for (
int k = 0; k < 10; k++) {
267 TotalFitFunction->SetParameter((3 * FFsize) + k, ParMin11t[k + 1]);
269 TotalFitFunction->SetParLimits((3 * FFsize) + k, ParMin11t[k + 1] -
m_ParamLimitFactor * fabs(ParMin11t[k + 1]),
272 TotalFitFunction->ReleaseParameter((3 * FFsize) + k);
278 gWaveformToFit->Fit(
"TotalFitFunction",
"Q M W N 0 R",
"", 0, counterWaveforms *
m_NumberofADCPoints);
281 std::vector<int> FitResultY;
282 std::vector<int> FitResultX;
283 int maxResidualWaveformID = 0;
287 double npts = xValuesToFit.size();
288 double maxResidualOld = 0.0;
289 for (
int k = 0; k < npts; k++) {
290 double xVal = xValuesToFit[k];
291 double yVal = TotalFitFunction->Eval(xVal);
292 FitResultX.push_back(xVal);
293 FitResultY.push_back(yVal);
294 double diff = fabs(yValuesToFit[k] - yVal);
295 if (diff > maxResidual) {
298 maxResidualOld = fabs(yValuesToFit[k] / yVal);
303 if (maxResidual > resLimit) {
305 B2INFO(
"FAIL: CellID_i " << CellID_i <<
" maxResidual " << maxResidual <<
" removing entry: " <<
306 NtupleEntries[maxResidualWaveformID] <<
307 " which was waveform number " << maxResidualWaveformID <<
" resLimit was " << resLimit <<
" , resLimit started at " <<
309 B2INFO(
"Old maxResidual of Data/Fit was " << maxResidualOld);
311 B2INFO(
"Iter Time = " << std::time(0) - t << std::endl);
314 std::cout <<
"FAIL: CellID_i " << CellID_i <<
" maxResidual " << maxResidual <<
" removing entry: " <<
315 NtupleEntries[maxResidualWaveformID] <<
316 " which was waveform number " << maxResidualWaveformID <<
" resLimit was " << resLimit <<
" , resLimit started at " <<
317 resLimitOriginal << std::endl;
318 std::cout <<
"wave = [";
319 for (
int k = 0; k < npts; k++) {
320 std::cout << yValuesToFit[k];
321 if (k < (npts - 1)) {
324 std::cout <<
"]" << std::endl;
327 std::cout <<
"fitRes = [";
328 for (
int k = 0; k < npts; k++) {
329 std::cout << TotalFitFunction->Eval(xValuesToFit[k]);
330 if (k < (npts - 1)) {
333 std::cout <<
"]" << std::endl;
338 EntriesToSkip.push_back(NtupleEntries[maxResidualWaveformID]);
350 B2INFO(
"AttemptCounter reach limit: " << AttemptCounter <<
" counterWaveforms: " << counterWaveforms);
354 EntriesToSkip.clear();
360 B2INFO(
"Increasing resLimit to " << resLimit);
367 B2INFO(
"PASS: CellID_i " << CellID_i <<
" maxResidual " << maxResidual <<
" number of waveforms used was " << counterWaveforms <<
368 " resLimit was " << resLimit);
372 limitResidualArray.push_back(resLimit);
379 auto gFitResult =
new TGraph(FitResultX.size(), FitResultX.data(), FitResultY.data());
380 gFitResult->SetName(Form(
"gFitResult_%d",
int(CellID_i)));
383 cellIDArray.push_back(CellID_i);
384 maxResidualArray.push_back(maxResidual);
388 gWaveformToFit->Write();
392 float tempPhotonPar11[11];
393 tempPhotonPar11[0] = ParMin11t[0];
394 for (
unsigned int k = 0; k < 10; k++) tempPhotonPar11[k + 1] = TotalFitFunction->GetParameter((3 * FFsize) + k);
397 FitFunctions[0]->SetParameter(0, 0);
398 FitFunctions[0]->SetParameter(1, 0);
399 FitFunctions[0]->SetParameter(2, 1);
400 for (
int k = 0; k < 10; k++) {
401 FitFunctions[0]->SetParameter(4 + k, tempPhotonPar11[k + 1]);
402 FitFunctions[0]->SetParameter(10 + 4 + k, tempPhotonPar11[k + 1]);
404 FitFunctions[0]->FixParameter(24, ParMin11t[0]);
405 FitFunctions[0]->FixParameter(25, 1);
408 double MaxVal = -1.0;
409 const double cnpts = 2000;
410 for (
int k = 0; k < cnpts; k++) {
412 double yVal = FitFunctions[0]->Eval(xVal);
413 if (yVal > MaxVal) MaxVal = yVal;
415 B2INFO(
"MaxVal " << MaxVal);
416 tempPhotonPar11[0] /= MaxVal;
417 FitFunctions[0]->FixParameter(24, tempPhotonPar11[0]);
420 PhotonParameters->
setTemplateParameters(CellID_i, tempPhotonPar11, tempPhotonPar11, tempPhotonPar11);
423 for (
unsigned int k = 0; k < PhotonWaveformArray.size();
424 k++) PhotonWaveformArray[k] = FitFunctions[0]->Eval(((
double)k) * (1. / 1000.)) ;
428 for (
int w = 0; w < (int)FitFunctions.size(); w++) FitFunctions[w]->Delete();
429 TotalFitFunction->Delete() ;
430 gWaveformToFit->Delete();
436 auto gmaxResidual =
new TGraph(cellIDArray.size(), cellIDArray.data(), maxResidualArray.data());
437 gmaxResidual->SetName(
"gmaxResidual");
438 auto glimitResidualArray =
new TGraph(cellIDArray.size(), cellIDArray.data(), limitResidualArray.data());
439 glimitResidualArray->SetName(
"glimitResidualArray");
440 auto gparLimitFactorArray =
new TGraph(cellIDArray.size(), cellIDArray.data(), parLimitFactorArray.data());
441 gparLimitFactorArray->SetName(
"gparLimitFactorArray");
443 gmaxResidual->Write();
444 glimitResidualArray->Write();
445 gparLimitFactorArray->Write();
450 f_PhotonTemplateOutput->cd();
452 f_PhotonTemplateOutput->Write();
453 f_PhotonTemplateOutput->Close();
454 delete f_PhotonTemplateOutput;
458 B2INFO(
"eclWaveformTemplateCalibrationC2Algorithm: successfully stored " << Form(
"PhotonParameters_CellID%d_CellID%d",