@@ -568,6 +568,94 @@ results fitOneGauss(TH1D* hist, bool fitTwice, bool debug) {
568568 return results (value , error , width , werror );
569569}
570570
571+ double DoubleSidedCrystalballFunction (double * x , double * par ) {
572+ double alpha_l = par [0 ];
573+ double alpha_h = par [1 ];
574+ double n_l = par [2 ];
575+ double n_h = par [3 ];
576+ double mean = par [4 ];
577+ double sigma = par [5 ];
578+ double N = par [6 ];
579+ float t = (x [0 ] - mean ) / sigma ;
580+ double result ;
581+ double fact1TLessMinosAlphaL = alpha_l / n_l ;
582+ double fact2TLessMinosAlphaL = (n_l / alpha_l ) - alpha_l - t ;
583+ double fact1THihgerAlphaH = alpha_h / n_h ;
584+ // double fact2THigherAlphaH = (n_h/alpha_h) - alpha_h + t;
585+
586+ if (- alpha_l <= t && alpha_h >= t ) {
587+ result = exp (-0.5 * t * t );
588+ } else if (t < - alpha_l ) {
589+ result = exp (-0.5 * alpha_l * alpha_l ) * pow (fact1TLessMinosAlphaL * fact2TLessMinosAlphaL , - n_l );
590+ } else if (t > alpha_h ) {
591+ result = exp (-0.5 * alpha_l * alpha_l ) * pow (fact1THihgerAlphaH * fact1THihgerAlphaH , - n_h );
592+ }
593+ return N * result ;
594+ }
595+
596+ results fitDoubleSidedCrystalball (TH1D * hist , bool /* fitTwice */ , bool debug ) {
597+ double rms ;
598+ std ::pair < double , double > mrms = GetMean (hist , 0.2 , 2.0 , rms );
599+ double mean = mrms .first ;
600+ double LowEdge = ((mean - fitrangeFactor * rms ) < 0.5 ) ? 0.5 : (mean - fitrangeFactor * rms );
601+ double diff = mean - LowEdge ;
602+ double HighEdge = (diff > fitrangeFactor1 * rms ) ? (mean + fitrangeFactor1 * rms ) : (mean + diff );
603+ if (debug )
604+ std ::cout << hist -> GetName () << " Mean " << mean << " RMS " << rms << " Range " << LowEdge << ":" << HighEdge
605+ << "\n" ;
606+ std ::string option = (hist -> GetEntries () > 100 ) ? "QRS" : "QRWLS" ;
607+ TObject * ob = gROOT -> FindObject ("g1" );
608+ if (ob )
609+ ob -> Delete ();
610+ TF1 * g1 = new TF1 ("g1" , "gaus" , LowEdge , HighEdge );
611+ g1 -> SetLineColor (kGreen );
612+ TFitResultPtr Fit1 = hist -> Fit (g1 , option .c_str (), "" );
613+ double value = Fit1 -> Value (1 );
614+ double error = Fit1 -> FitResult ::Error (1 );
615+ double width = Fit1 -> Value (2 );
616+ double werror = Fit1 -> FitResult ::Error (2 );
617+
618+ LowEdge = Fit1 -> Value (1 ) - fitrangeFactor * Fit1 -> Value (2 );
619+ if (LowEdge < 0.5 )
620+ LowEdge = 0.5 ;
621+ diff = Fit1 -> Value (1 ) - LowEdge ;
622+ HighEdge = (diff > fitrangeFactor1 * rms ) ? (Fit1 -> Value (1 ) + fitrangeFactor1 * Fit1 -> Value (2 ))
623+ : (Fit1 -> Value (1 ) + 1.5 * diff );
624+ if (HighEdge > 5.0 )
625+ HighEdge = 5.0 ;
626+ if (debug )
627+ std ::cout << " Range for second Fit " << LowEdge << ":" << HighEdge << std ::endl ;
628+ TObject * ob2 = gROOT -> FindObject ("fitDSCB" );
629+ if (ob2 != nullptr )
630+ ob2 -> Delete ();
631+ TF1 * fitDSCB = new TF1 ("fitDSCB" , DoubleSidedCrystalballFunction , LowEdge , HighEdge , 7 );
632+ fitDSCB -> SetParameters (1 , 2 , 2 , 1 , value , width , hist -> Integral (LowEdge , HighEdge ));
633+ fitDSCB -> SetParNames ("alpha_{low}" , "alpha_{high}" , "n_{low}" , "n_{high}" , "mean" , "sigma" , "Norm" );
634+ TFitResultPtr Fit = hist -> Fit (fitDSCB , option .c_str (), "" , LowEdge , HighEdge );
635+ value = Fit -> Value (4 );
636+ error = Fit -> FitResult ::Error (4 );
637+ width = Fit -> Value (5 );
638+ werror = Fit -> FitResult ::Error (5 );
639+
640+ std ::pair < double , double > meaner = GetMean (hist , 0.2 , 2.0 , rms );
641+ std ::pair < double , double > rmserr = GetWidth (hist , 0.2 , 2.0 );
642+ if (debug ) {
643+ std ::cout << "FitDSCB " << value << ":" << error << ":" << hist -> GetMeanError () << " Mean " << meaner .first << ":"
644+ << meaner .second << " Width " << rmserr .first << ":" << rmserr .second ;
645+ }
646+ double minvalue (0.30 );
647+ if (value < minvalue || value > 2.0 || error > 0.5 ) {
648+ value = meaner .first ;
649+ error = meaner .second ;
650+ width = rmserr .first ;
651+ werror = rmserr .second ;
652+ }
653+ if (debug ) {
654+ std ::cout << " Final " << value << "+-" << error << ":" << width << "+-" << werror << std ::endl ;
655+ }
656+ return results (value , error , width , werror );
657+ }
658+
571659void readCorrFactors (char * infile ,
572660 double scale ,
573661 std ::map < int , cfactors > & cfacs ,
@@ -640,7 +728,7 @@ void FitHistStandard(std::string infile,
640728 std ::string xname [4 ] = {"i#eta" , "i#eta" , "d_{L1}" , "# Vertex" };
641729 int numb [4 ] = {10 , 8 , 8 , 5 };
642730
643- if (type == 0 ) {
731+ if (( type % 10 ) == 0 ) {
644732 numb [0 ] = 8 ;
645733 for (int i = 0 ; i < 9 ; ++ i )
646734 xbins [i ] = xbin0 [i ];
@@ -683,7 +771,8 @@ void FitHistStandard(std::string infile,
683771 }
684772 if (hist -> GetEntries () > 4 ) {
685773 bool flag = (j == 0 ) ? true : false;
686- results meaner = fitOneGauss (hist , flag , debug );
774+ results meaner = (((type / 10 ) % 10 ) == 0 ) ? fitOneGauss (hist , flag , debug )
775+ : fitDoubleSidedCrystalball (hist , flag , debug );
687776 value = meaner .mean ;
688777 error = meaner .errmean ;
689778 width = meaner .width ;
@@ -756,11 +845,11 @@ void FitHistExtended(const char* infile,
756845 double xbins [99 ];
757846 double xbin [23 ] = {-23.0 , -21.0 , -19.0 , -17.0 , -15.0 , -13.0 , -11.0 , -9.0 , -7.0 , -5.0 , -3.0 , 0.0 ,
758847 3.0 , 5.0 , 7.0 , 9.0 , 11.0 , 13.0 , 15.0 , 17.0 , 19.0 , 21.0 , 23.0 };
759- if (type == 2 ) {
848+ if (( type % 10 ) == 2 ) {
760849 numb = 22 ;
761850 for (int k = 0 ; k <= numb ; ++ k )
762851 xbins [k ] = xbin [k ];
763- } else if (type == 1 ) {
852+ } else if (( type % 10 ) == 1 ) {
764853 numb = 1 ;
765854 xbins [0 ] = -25 ;
766855 xbins [1 ] = 25 ;
@@ -802,7 +891,8 @@ void FitHistExtended(const char* infile,
802891 }
803892 if (hist0 -> GetEntries () > 10 ) {
804893 double rms ;
805- results meaner0 = fitOneGauss (hist0 , true, debug );
894+ results meaner0 =
895+ (((type / 10 ) % 10 ) == 0 ) ? fitOneGauss (hist0 , true, debug ) : fitDoubleSidedCrystalball (hist0 , true, debug );
806896 std ::pair < double , double > meaner1 = GetMean (hist0 , 0.2 , 2.0 , rms );
807897 std ::pair < double , double > meaner2 = GetWidth (hist0 , 0.2 , 2.0 );
808898 if (debug ) {
@@ -846,13 +936,15 @@ void FitHistExtended(const char* infile,
846936 TH1D * hist2 = (TH1D * )hist1 -> Clone (name );
847937 fitOneGauss (hist2 , true, debug );
848938 hists .push_back (hist2 );
849- results meaner = fitOneGauss (hist , true, debug );
939+ results meaner = (((type / 10 ) % 10 ) == 0 ) ? fitOneGauss (hist , true, debug )
940+ : fitDoubleSidedCrystalball (hist , true, debug );
850941 value = meaner .mean ;
851942 error = meaner .errmean ;
852943 width = meaner .width ;
853944 werror = meaner .errwidth ;
854945 } else {
855- results meaner = fitOneGauss (hist , true, debug );
946+ results meaner = (((type / 10 ) % 10 ) == 0 ) ? fitOneGauss (hist , true, debug )
947+ : fitDoubleSidedCrystalball (hist , true, debug );
856948 value = meaner .mean ;
857949 error = meaner .errmean ;
858950 width = meaner .width ;
@@ -923,7 +1015,8 @@ void FitHistExtended(const char* infile,
9231015 if (total > 4 ) {
9241016 sprintf (name , "%sOne" , hist1 -> GetName ());
9251017 TH1D * hist2 = (TH1D * )hist1 -> Clone (name );
926- results meanerr = fitOneGauss (hist2 , true, debug );
1018+ results meanerr = (((type / 10 ) % 10 ) == 0 ) ? fitOneGauss (hist2 , true, debug )
1019+ : fitDoubleSidedCrystalball (hist2 , true, debug );
9271020 value = meanerr .mean ;
9281021 error = meanerr .errmean ;
9291022 width = meanerr .width ;
@@ -940,7 +1033,8 @@ void FitHistExtended(const char* infile,
9401033 hists .push_back (hist3 );
9411034 }
9421035 // results meaner0 = fitTwoGauss(hist, debug);
943- results meaner0 = fitOneGauss (hist , true, debug );
1036+ results meaner0 = (((type / 10 ) % 10 ) == 0 ) ? fitOneGauss (hist , true, debug )
1037+ : fitDoubleSidedCrystalball (hist , true, debug );
9441038 value = meaner0 .mean ;
9451039 error = meaner0 .errmean ;
9461040 double rms ;
@@ -984,6 +1078,7 @@ void FitHistExtended2(const char* infile,
9841078 const char * outfile ,
9851079 std ::string prefix ,
9861080 int numb = 50 ,
1081+ int type = 0 ,
9871082 bool append = true,
9881083 int iname = 3 ,
9891084 bool debug = false) {
@@ -1057,13 +1152,15 @@ void FitHistExtended2(const char* infile,
10571152 TH1D * hist2 = (TH1D * )hist1 -> Clone (name );
10581153 fitOneGauss (hist2 , true, debug );
10591154 hists .push_back (hist2 );
1060- results meaner = fitOneGauss (hist , true, debug );
1155+ results meaner = (((type / 10 ) % 10 ) == 0 ) ? fitOneGauss (hist , true, debug )
1156+ : fitDoubleSidedCrystalball (hist , true, debug );
10611157 value = meaner .mean ;
10621158 error = meaner .errmean ;
10631159 width = meaner .width ;
10641160 werror = meaner .errwidth ;
10651161 } else {
1066- results meaner = fitOneGauss (hist , true, debug );
1162+ results meaner = (((type / 10 ) % 10 ) == 0 ) ? fitOneGauss (hist , true, debug )
1163+ : fitDoubleSidedCrystalball (hist , true, debug );
10671164 value = meaner .mean ;
10681165 error = meaner .errmean ;
10691166 width = meaner .width ;
@@ -1139,7 +1236,8 @@ void FitHistExtended2(const char* infile,
11391236 if (total > 4 ) {
11401237 sprintf (name , "%sOne" , hist1 -> GetName ());
11411238 TH1D * hist2 = (TH1D * )hist1 -> Clone (name );
1142- results meanerr = fitOneGauss (hist2 , true, debug );
1239+ results meanerr = (((type / 10 ) % 10 ) == 0 ) ? fitOneGauss (hist2 , true, debug )
1240+ : fitDoubleSidedCrystalball (hist2 , true, debug );
11431241 value = meanerr .mean ;
11441242 error = meanerr .errmean ;
11451243 width = meanerr .width ;
@@ -1149,7 +1247,8 @@ void FitHistExtended2(const char* infile,
11491247 std ::cout << hist2 -> GetName () << " MPV " << value << " +- " << error << " Width " << width << " +- "
11501248 << werror << " W/M " << wbyv << " +- " << wverr << std ::endl ;
11511249 hists .push_back (hist2 );
1152- results meaner0 = fitOneGauss (hist , true, debug );
1250+ results meaner0 = (((type / 10 ) % 10 ) == 0 ) ? fitOneGauss (hist , true, debug )
1251+ : fitDoubleSidedCrystalball (hist , true, debug );
11531252 value = meaner0 .mean ;
11541253 error = meaner0 .errmean ;
11551254 double rms ;
0 commit comments