250 m_treeTTS->GetEntry(iChannel + 512 * iSlot);
252 double maxpos = h_profile->GetBinCenter(h_profile->GetMaximumBin());
253 h_profile->GetXaxis()->SetRangeUser(maxpos - 1, maxpos + 2.);
256 double integral = h_profile->Integral();
259 TF1 laser = TF1(
"laser", laserPDF, maxpos - 1, maxpos + 2., 16);
262 laser.SetParameter(0, maxpos);
263 laser.SetParLimits(0, maxpos - 0.06, maxpos + 0.06);
266 laser.SetParameter(1, 0.1);
267 laser.SetParLimits(1, 0.05, 0.25);
269 laser.SetParameter(1, 0.02);
270 laser.SetParLimits(1, 0., 0.04);
274 laser.SetParLimits(2, 0.5, 1.);
282 laser.SetParameter(3, -0.3);
283 laser.SetParLimits(3, -0.4, -0.2);
289 laser.FixParameter(5,
m_mean2);
291 laser.FixParameter(6,
m_f1);
293 laser.FixParameter(6, 0);
296 laser.SetParameter(7, integral * 0.005);
297 laser.SetParLimits(7, 0.2 * integral * 0.005, 2.*integral * 0.005);
300 laser.SetParameter(8, 1.);
301 laser.SetParLimits(8, 0.3, 2.);
302 laser.SetParameter(9, 0.2);
303 laser.SetParLimits(9, 0.08, 1.);
304 laser.SetParameter(10, 0.1 * integral * 0.005);
305 laser.SetParLimits(10, 0., 0.2 * integral * 0.005);
307 laser.SetParameter(14, -2.);
308 laser.SetParameter(15, 2.);
309 laser.SetParLimits(15, 1.01, 20.);
312 laser.SetParameter(11, 1.);
313 laser.SetParLimits(11, 0.1, 5.);
314 laser.SetParameter(12, 0.8);
315 laser.SetParLimits(12, 0., 5.);
316 laser.SetParameter(13, 0.01 * integral * 0.005);
317 laser.SetParLimits(13, 0., 0.2 * integral * 0.005);
334 laser.SetParameter(2, 0.8);
335 laser.SetParLimits(2, 0., 1.);
336 laser.SetParameter(3, -0.1);
337 laser.SetParLimits(3, -0.4, -0.);
339 laser.FixParameter(8, 0);
340 laser.FixParameter(9, 0.1);
341 laser.FixParameter(14, -2.);
342 laser.FixParameter(15, 2);
343 laser.FixParameter(11, 1.);
344 laser.FixParameter(12, 0.1);
345 laser.FixParameter(13, 0.);
346 laser.FixParameter(10, 0.);
356 h_profile->Fit(
"laser",
"R L Q");
360 TF1* peak1 =
new TF1(
"peak1", laserPDF, maxpos - 1, maxpos + 2., 16);
361 TF1* peak2 =
new TF1(
"peak2", laserPDF, maxpos - 1, maxpos + 2., 16);
362 TF1* extra =
new TF1(
"extra", laserPDF, maxpos - 1, maxpos + 2., 16);
363 TF1* background =
new TF1(
"background", laserPDF, maxpos - 1, maxpos + 2., 16);
364 for (
int iPar = 0; iPar < 16; iPar++) {
365 peak1->FixParameter(iPar, laser.GetParameter(iPar));
366 peak2->FixParameter(iPar, laser.GetParameter(iPar));
367 extra->FixParameter(iPar, laser.GetParameter(iPar));
368 background->FixParameter(iPar, laser.GetParameter(iPar));
370 peak1->FixParameter(2, 0.);
371 peak1->FixParameter(7, (1 - laser.GetParameter(2))*laser.GetParameter(7));
372 peak1->FixParameter(10, 0.);
373 peak1->FixParameter(13, 0.);
375 peak2->FixParameter(2, 1.);
376 peak2->FixParameter(7, laser.GetParameter(2)*laser.GetParameter(7));
377 peak2->FixParameter(10, 0.);
378 peak2->FixParameter(13, 0.);
380 extra->FixParameter(7, 0.);
381 extra->FixParameter(13, 0.);
383 background->FixParameter(7, 0.);
384 background->FixParameter(10, 0.);
386 h_profile->GetListOfFunctions()->Add(peak1);
387 h_profile->GetListOfFunctions()->Add(peak2);
388 h_profile->GetListOfFunctions()->Add(extra);
389 h_profile->GetListOfFunctions()->Add(background);
401 m_sigma = laser.GetParameter(1);
415 m_chi2 = laser.GetChisquare() / laser.GetNDF();
428 float maxpos = h_profileFirstPulser->GetBinCenter(h_profileFirstPulser->GetMaximumBin());
429 h_profileFirstPulser->GetXaxis()->SetRangeUser(maxpos - 1, maxpos + 1.);
430 if (h_profileFirstPulser->Integral() > 1000) {
431 TF1 pulser1 = TF1(
"pulser1",
"[0]*TMath::Gaus(x, [1], [2], kTRUE)", maxpos - 1, maxpos + 1.);
432 pulser1.SetParameter(0, 1.);
433 pulser1.SetParameter(1, maxpos);
434 pulser1.SetParameter(2, 0.05);
435 h_profileFirstPulser->Fit(
"pulser1",
"R Q");
438 h_profileFirstPulser->Write();
444 maxpos = h_profileSecondPulser->GetBinCenter(h_profileSecondPulser->GetMaximumBin());
445 h_profileSecondPulser->GetXaxis()->SetRangeUser(maxpos - 1, maxpos + 1.);
446 if (h_profileSecondPulser->Integral() > 1000) {
447 TF1 pulser2 = TF1(
"pulser2",
"[0]*TMath::Gaus(x, [1], [2], kTRUE)", maxpos - 1, maxpos + 1.);
448 pulser2.SetParameter(0, 1.);
449 pulser2.SetParameter(1, maxpos);
450 pulser2.SetParameter(2, 0.05);
451 h_profileSecondPulser->Fit(
"pulser2",
"R Q");
454 h_profileSecondPulser->Write();
544 TH2F* h_hitTime =
new TH2F(
"h_hitTime",
" ", 512 * 16, 0., 512 * 16, 22000, -70, 40.);
546 float amplitude, hitTime;
549 hitTree->SetBranchAddress(
"amplitude", &litude);
550 hitTree->SetBranchAddress(
"hitTime", &hitTime);
551 hitTree->SetBranchAddress(
"channel", &channel);
552 hitTree->SetBranchAddress(
"slot", &slot);
553 hitTree->SetBranchAddress(
"refTimeValid", &refTimeValid);
556 std::vector<TH2F*> h_hitTimeLaserHistos = {};
557 for (
int iLowerEdge = 0; iLowerEdge < (int)
m_binEdges.size() - 1; iLowerEdge++) {
558 TH2F* h_hitTimeLaser =
new TH2F((
"h_hitTimeLaser_" + std::to_string(iLowerEdge + 1)).c_str(),
" ", 512 * 16, 0., 512 * 16, 14000,
560 h_hitTimeLaserHistos.push_back(h_hitTimeLaser);
563 for (
unsigned int i = 0; i < hitTree->GetEntries(); i++) {
564 auto onepc = (
unsigned int)(hitTree->GetEntries() / 100);
566 std::cout <<
"processing hit " << i <<
" of " << hitTree->GetEntries() <<
" (" << i / (onepc * 10) <<
" %)" << std::endl;
567 hitTree->GetEntry(i);
569 int iLowerEdge = std::distance(
m_binEdges.cbegin(), it) - 1;
571 if (iLowerEdge >= 0 && iLowerEdge <
static_cast<int>(
m_binEdges.size()) - 1 && refTimeValid)
572 h_hitTimeLaserHistos[iLowerEdge]->Fill(channel + (slot - 1) * 512, hitTime);
573 if (amplitude > 80. && refTimeValid)
574 h_hitTime->Fill(channel + (slot - 1) * 512, hitTime);
580 for (
short iSlot = 0; iSlot < 16; iSlot++) {
581 std::cout <<
"fitting slot " << iSlot + 1 << std::endl;
582 for (
short iChannel = 0; iChannel < 512; iChannel++) {
583 TH1D* h_profile = h_hitTime->ProjectionY((
"profile_" + std::to_string(iSlot + 1) +
"_" + std::to_string(iChannel)).c_str(),
584 iSlot * 512 + iChannel + 1, iSlot * 512 + iChannel + 1);
586 h_profile->GetXaxis()->SetRangeUser(-10, -10);
588 h_profile->GetXaxis()->SetRangeUser(-65,
595 TH1D* h_profileFirstPulser = h_hitTime->ProjectionY((
"profileFirstPulser_" + std::to_string(iSlot + 1) +
"_" + std::to_string(
596 iChannel)).c_str(), iSlot * 512 + iChannel + 1, iSlot * 512 + iChannel + 1);
597 TH1D* h_profileSecondPulser = h_hitTime->ProjectionY((
"profileSecondPulser_" + std::to_string(iSlot + 1) +
"_" + std::to_string(
598 iChannel)).c_str(), iSlot * 512 + iChannel + 1, iSlot * 512 + iChannel + 1);
599 h_profileFirstPulser->GetXaxis()->SetRangeUser(-10, 10);
600 h_profileSecondPulser->GetXaxis()->SetRangeUser(10, 40);
602 fitPulser(h_profileFirstPulser, h_profileSecondPulser);
607 h_profileFirstPulser->Write();
608 h_profileSecondPulser->Write();
620 std::cout <<
"Fitting in bins" << std::endl;
621 for (
int iLowerEdge = 0; iLowerEdge < (int)
m_binEdges.size() - 1; iLowerEdge++) {
626 for (
short iSlot = 0; iSlot < 16; iSlot++) {
627 std::cout <<
" Fitting slot " << iSlot + 1 << std::endl;
628 for (
short iChannel = 0; iChannel < 512; iChannel++) {
629 TH1D* h_profile = h_hitTimeLaserHistos[iLowerEdge]->ProjectionY((
"profile_" + std::to_string(iSlot + 1) +
"_" + std::to_string(
630 iChannel) +
"_" + std::to_string(iLowerEdge)).c_str(),
631 iSlot * 512 + iChannel + 1, iSlot * 512 + iChannel + 1);
633 h_profile->GetXaxis()->SetRangeUser(-10, -10);
635 h_profile->GetXaxis()->SetRangeUser(-65,