555 {
556
557 float rtpars[4];
558
559
561
562 TF1 dtfitfunc("dtfitfunc","gaus(0)");
563
564 gStyle->SetOptFit(1111);
565 gStyle->SetPalette(1);
566
567
568 TF1 *trfunc,*rtfunc,*oldrtfunc;
569 if (m_isdines){
573 trfunc->SetParameters(0.3, 1.0, 0.05, -3.);
574 double rmin0Limits[2]={0.0,2.0};
575 double rhoLimits[2]={0.0,10.};
576 double vLimits[2]={0.0,1.0};
577 trfunc->SetParLimits(0,rmin0Limits[0],rmin0Limits[1]);
578 trfunc->SetParLimits(1,rhoLimits[0],rhoLimits[1]);
579 trfunc->SetParLimits(2,vLimits[0],vLimits[1]);
580 rtg->
trgr->SetTitle(
"Dines' R-t sqrt(..)");
581 }
582 else {
583 trfunc =
new TF1(
"trfunc",
pol3deg,0,3,4);
586 trfunc->SetParameters(0.0, 0.0, 0.0, 0.0);
587 rtg->
trgr->SetTitle(
"Polynomial R-t");
588 }
589
590
591 trfunc->SetRange(0,2);
592 if (
opt.find(
'3')==std::string::npos) trfunc->FixParameter(3,0);
593 trfunc->SetLineColor(4) ;
594 rtg->
trgr->Fit(trfunc,
"QR");
595 if (!bequiet) rtg->
trgr->Write();
596
597
598
599 rtfunc->SetRange(0,45);
600 if (
opt.find(
'3')==std::string::npos) rtfunc->FixParameter(3,0);
601 rtfunc->SetLineColor(4) ;
602 if (m_isdines) {
603 rtfunc->SetParameters(trfunc->GetParameter(0),trfunc->GetParameter(1),trfunc->GetParameter(2),trfunc->GetParameter(3));
604
605 }
606 else {
607 rtfunc->SetParameters(0.000000e+00, 6.269950e-02, -3.370054e-04, -1.244642e-07);
608 if(rtg->
rtgr !=
nullptr) {
609 rtg->
rtgr->Fit(rtfunc,
"QR");
610 for (
int ipnt=0; ipnt<rtg->
rtgr->GetN(); ipnt++){
611 float deriv = rtfunc->Derivative(rtg->
rtgr->GetX()[ipnt]);
612 if(fabs(deriv)<1.0e-24) deriv=0.05;
613 rtg->
rtgr->SetPointError(ipnt , rtg->
rtgr->GetEY()[ipnt]/deriv , rtg->
rtgr->GetEY()[ipnt]);
614 }
615 rtg->
rtgr->Fit(rtfunc,
"R");
616 }
617
618 }
619 if (!bequiet and (rtg->
rtgr !=
nullptr)) rtg->
rtgr->Write();
620
621
622 oldrtfunc->SetRange(0,45);
623 oldrtfunc->SetLineColor(1) ;
624 oldrtfunc->SetLineStyle(2) ;
625 oldrtfunc->SetLineWidth(1) ;
626 oldrtfunc->SetParameters(
data[key].oldrtpar[0],
data[key].oldrtpar[1],
data[key].oldrtpar[2],
data[key].oldrtpar[3]);
627
628 if (!bequiet) oldrtfunc->Write();
629
630 rtpars[0] = rtfunc->GetParameter(0);
631 rtpars[1] = rtfunc->GetParameter(1);
632 rtpars[2] = rtfunc->GetParameter(2);
633 rtpars[3] = rtfunc->GetParameter(3);
634
635
636 float tdrift = 20;
637
638 if (!m_isdines) {
639 float rdrift = 0.0;
640 int ntries = 0;
641 float precision = 0.0001;
642 int maxtries = 500;
643 float drdt;
644 float driftradius = rtpars[0]+tdrift*(rtpars[1]+tdrift*(rtpars[2]));
645 float residual = std::abs(rdrift) - driftradius;
646 while (std::abs(residual) > precision) {
647
648 drdt = rtpars[1]+tdrift*(2*rtpars[2]);
649 if(fabs(drdt)<1.0e-24) drdt=0.05;
651
652 driftradius = rtpars[0]+tdrift*(rtpars[1]+tdrift*(rtpars[2]));
654
655 ntries = ntries + 1;
656 if (ntries>maxtries){
657 break;
658 }
659 }
660 }
661
662 if (
opt.find(
'0')==std::string::npos) {
663 if (m_isdines){
664 data[
key].rtpar[0] = rtpars[0];
665 data[
key].rtpar[1] = rtpars[1];
666 data[
key].rtpar[2] = rtpars[2];
668 } else {
670 data[
key].rtpar[1] = rtpars[1] + 2*tdrift*rtpars[2] + 3*tdrift*tdrift*rtpars[3];
671 data[
key].rtpar[2] = rtpars[2] + 3*tdrift*rtpars[3];
672 data[
key].rtpar[3] = rtpars[3];
673 }
674 }
675 else {
676 data[
key].rtpar[0] = rtpars[0];
677 data[
key].rtpar[1] = rtpars[1];
678 data[
key].rtpar[2] = rtpars[2];
679 data[
key].rtpar[3] = rtpars[3];
680 }
681
683
684 delete rtfunc;
685 delete oldrtfunc;
686 delete trfunc;
687
688 return 0.0;
689}
double trrel_dines(double *x, double *par)
double pol3deg(double *x, double *par)
double rtrel_dines(double *x, double *par)
char data[hepevt_bytes_allocation_ATLAS]
A class for generating a r-t and t-r graphs by binning the 2D histograms in Calibrator::rtHists in r ...
TGraphErrors * trgr
the t(r) graph
TGraphErrors * rtgr
the r(t) graph
float mintime
the minimum t-value