175 TRolke::TRolke(Double_t CL, Option_t * )
180 fNumWarningsDeprecated1(0),
181 fNumWarningsDeprecated2(0)
183 SetModelParameters();
201 void TRolke::SetPoissonBkgBinomEff(Int_t x, Int_t y, Int_t z, Double_t tau, Int_t m)
226 void TRolke::SetPoissonBkgGaussEff(Int_t x, Int_t y, Double_t em, Double_t tau, Double_t sde)
252 void TRolke::SetGaussBkgGaussEff(Int_t x, Double_t bm, Double_t em, Double_t sde, Double_t sdb)
277 void TRolke::SetPoissonBkgKnownEff(Int_t x, Int_t y, Double_t tau, Double_t e)
302 void TRolke::SetGaussBkgKnownEff(Int_t x, Double_t bm, Double_t sdb, Double_t e)
327 void TRolke::SetKnownBkgBinomEff(Int_t x, Int_t z, Int_t m, Double_t b)
352 void TRolke::SetKnownBkgGaussEff(Int_t x, Double_t em, Double_t sde, Double_t b)
373 bool TRolke::GetLimits(Double_t& low, Double_t& high)
375 if ((f_mid<1)||(f_mid>7)) {
376 std::cerr <<
"TRolke - Error: Model id "<< f_mid<<std::endl;
378 std::cerr <<
"TRolke - Please specify a model with e.g. 'SetGaussBkgGaussEff' (read the docs in Rolke.cxx )"<<std::endl;
383 ComputeInterval(f_x, f_y, f_z, f_bm, f_em, f_e, f_mid, f_sde, f_sdb, f_tau, f_b, f_m);
389 std::cerr <<
"TRolke - Warning: no limits found" <<std::endl;
397 Double_t TRolke::GetUpperLimit()
399 Double_t low(0), high(0);
407 Double_t TRolke::GetLowerLimit()
409 Double_t low(0), high(0);
417 Double_t TRolke::GetBackground()
419 Double_t background = 0;
424 background = f_y / f_tau;
435 std::cerr <<
"TRolke::GetBackground(): Model NR: " <<
436 f_mid <<
" unknown"<<std::endl;
446 bool TRolke::GetSensitivity(Double_t& low, Double_t& high, Double_t pPrecision)
448 Double_t background = GetBackground();
451 Double_t weightSum = 0;
456 ComputeInterval(loop_x, f_y, f_z, f_bm, f_em, f_e, f_mid, f_sde, f_sdb, f_tau, f_b, f_m);
457 weight = TMath::PoissonI(loop_x, background);
458 low += fLowerLimit * weight;
459 high += fUpperLimit * weight;
461 if (loop_x > (background + 1)) {
462 if ((weightSum > (1 - pPrecision)) || (weight < 1e-12))
break;
481 bool TRolke::GetLimitsQuantile(Double_t& low, Double_t& high, Int_t& out_x, Double_t integral)
483 Double_t background = GetBackground();
485 Double_t weightSum = 0;
489 weight = TMath::PoissonI(loop_x, background);
491 if (weightSum >= integral) {
499 ComputeInterval(loop_x, f_y, f_z, f_bm, f_em, f_e, f_mid, f_sde, f_sdb, f_tau, f_b, f_m);
511 bool TRolke::GetLimitsML(Double_t& low, Double_t& high, Int_t& out_x)
513 Double_t background = GetBackground();
516 Int_t loop_max = 1000 + (Int_t)background;
518 Double_t max = TMath::PoissonI(loop_x, background);
519 while (loop_x <= loop_max) {
520 if (TMath::PoissonI(loop_x + 1, background) < max) {
524 max = TMath::PoissonI(loop_x, background);
526 if (loop_x >= loop_max) {
527 std::cout <<
"internal error finding maximum of distribution" << std::endl;
533 ComputeInterval(loop_x, f_y, f_z, f_bm, f_em, f_e, f_mid, f_sde, f_sdb, f_tau, f_b, f_m);
546 bool TRolke::GetCriticalNumber(Int_t& ncrit, Int_t maxtry)
548 Double_t background = GetBackground();
551 int rolke_ncrit = -1;
554 maxj = 1000 + (Int_t)background;
556 for (j = 0;j < maxj;j++) {
558 ComputeInterval(rolke_x, f_y, f_z, f_bm, f_em, f_e, f_mid, f_sde, f_sdb, f_tau, f_b, f_m);
559 double rolke_ll = fLowerLimit;
566 if (rolke_ncrit == -1) {
567 std::cerr <<
"TRolke GetCriticalNumber : Error: problem finding rolke inverse. Specify a larger maxtry value. maxtry was: " << maxj <<
". highest x considered was j "<< j<< std::endl;
579 void TRolke::SetSwitch(
bool bnd) {
580 if(fNumWarningsDeprecated1<2){
581 std::cerr <<
"*******************************************" <<std::endl;
582 std::cerr <<
"TRolke - Warning: 'SetSwitch' is depricated and may be removed from future releases:" <<std::endl;
583 std::cerr <<
" - Use 'SetBounding' instead "<<std::endl;
584 std::cerr <<
"*******************************************" <<std::endl;
585 fNumWarningsDeprecated1++;
593 void TRolke::Print(Option_t*)
const {
594 std::cout <<
"*******************************************" <<std::endl;
595 std::cout <<
"* TRolke::Print() - dump of internals: " <<std::endl;
596 std::cout <<
"*"<<std::endl;
597 std::cout <<
"* model id, mid = "<<f_mid <<std::endl;
598 std::cout <<
"*"<<std::endl;
599 std::cout <<
"* x = "<<f_x <<std::endl;
600 std::cout <<
"* bm = "<<f_bm <<std::endl;
601 std::cout <<
"* em = "<<f_em <<std::endl;
602 std::cout <<
"* sde = "<<f_sde <<std::endl;
603 std::cout <<
"* sdb = "<<f_sdb <<std::endl;
604 std::cout <<
"* y = "<<f_y <<std::endl;
605 std::cout <<
"* tau = "<<f_tau <<std::endl;
606 std::cout <<
"* e = "<<f_e <<std::endl;
607 std::cout <<
"* b = "<<f_b <<std::endl;
608 std::cout <<
"* m = "<<f_m <<std::endl;
609 std::cout <<
"* z = "<<f_z <<std::endl;
610 std::cout <<
"*"<<std::endl;
611 std::cout <<
"* CL = "<<fCL <<std::endl;
612 std::cout <<
"* Bounding = "<<fBounding <<std::endl;
613 std::cout <<
"*"<<std::endl;
614 std::cout <<
"* calculated on demand only:"<<std::endl;
615 std::cout <<
"* fUpperLimit = "<<fUpperLimit<<std::endl;
616 std::cout <<
"* fLowerLimit = "<<fLowerLimit<<std::endl;
617 std::cout <<
"*******************************************" <<std::endl;
637 Double_t TRolke::CalculateInterval(Int_t x, Int_t y, Int_t z, Double_t bm, Double_t em, Double_t e, Int_t mid, Double_t sde, Double_t sdb, Double_t tau, Double_t b, Int_t m){
638 if (fNumWarningsDeprecated2<2 ) {
639 std::cerr <<
"*******************************************" <<std::endl;
640 std::cerr <<
"TRolke - Warning: 'CalculateInterval' is depricated and may be removed from future releases:" <<std::endl;
641 std::cerr <<
" - Use e.g. 'SetGaussBkgGaussEff' and 'GetLimits' instead (read the docs in Rolke.cxx )"<<std::endl;
642 std::cerr <<
"*******************************************" <<std::endl;
643 fNumWarningsDeprecated2++;
658 return ComputeInterval(f_x, f_y, f_z, f_bm, f_em, f_e, f_mid, f_sde, f_sdb, f_tau, f_b, f_m);
675 void TRolke::SetModelParameters(Int_t x, Int_t y, Int_t z, Double_t bm, Double_t em, Double_t e, Int_t mid, Double_t sde, Double_t sdb, Double_t tau, Double_t b, Int_t m)
691 void TRolke::SetModelParameters()
694 SetModelParameters(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
713 Double_t TRolke::ComputeInterval(Int_t x, Int_t y, Int_t z, Double_t bm, Double_t em, Double_t e, Int_t mid, Double_t sde, Double_t sdb, Double_t tau, Double_t b, Int_t m)
719 limit[1] = Interval(x, y, z, bm, em, e, mid, sde, sdb, tau, b, m);
731 limit[1] = Interval(trial_x, y, z, bm, em, e, mid, sde, sdb, tau, b, m);
732 if (limit[1] > 0) done = 1;
754 Double_t TRolke::Interval(Int_t x, Int_t y, Int_t z, Double_t bm, Double_t em, Double_t e, Int_t mid, Double_t sde, Double_t sdb, Double_t tau, Double_t b, Int_t m)
756 Double_t dchi2 = TMath::ChisquareQuantile(fCL, 1);
757 Double_t tempxy[2], limits[2] = {0, 0};
758 Double_t slope, fmid, low, flow, high, fhigh, test, ftest, mu0, maximum, target, l, f0;
760 Double_t maxiter = 1000, acc = 0.00001;
764 if ((mid != 3) && (mid != 5)) bm = y;
765 if ((mid == 3) || (mid == 5)) {
766 if (bm == 0) bm = 0.00001;
769 if ((mid == 6) || (mid == 7)) {
770 if (bm == 0) bm = 0.00001;
773 if ((mid <= 2) || (mid == 4)) bp = 1;
776 if (bp == 1 && x == 0 && bm > 0) {
777 for (i = 0; i < 2; i++) {
779 tempxy[i] = Interval(x, y, z, bm, em, e, mid, sde, sdb, tau, b, m);
782 slope = tempxy[1] - tempxy[0];
783 limits[1] = tempxy[0] - slope;
785 if (limits[1] < 0) limits[1] = 0.0;
789 if (bp != 1 && x == 0) {
791 for (i = 0; i < 2; i++) {
793 tempxy[i] = Interval(x, y, z, bm, em, e, mid, sde, sdb, tau, b, m);
795 slope = tempxy[1] - tempxy[0];
796 limits[1] = tempxy[0] - slope;
798 if (limits[1] < 0) limits[1] = 0.0;
802 if (bp != 1 && bm == 0) {
803 for (i = 0; i < 2; i++) {
805 limits[1] = Interval(x, y, z, bm, em, e, mid, sde, sdb, tau, b, m);
806 tempxy[i] = limits[1];
808 slope = tempxy[1] - tempxy[0];
809 limits[1] = tempxy[0] - slope;
810 if (limits[1] < 0) limits[1] = 0;
814 if (x == 0 && bm == 0) {
817 limits[1] = Interval(x, y, z, bm, em, e, mid, sde, sdb, tau, b, m);
818 tempxy[0] = limits[1];
821 limits[1] = Interval(x, y, z, bm, em, e, mid, sde, sdb, tau, b, m);
822 tempxy[1] = limits[1];
825 limits[1] = Interval(x, y, z, bm, em, e, mid, sde, sdb, tau, b, m);
826 limits[1] = 3 * tempxy[0] - tempxy[1] - limits[1];
827 if (limits[1] < 0) limits[1] = 0;
831 mu0 = Likelihood(0, x, y, z, bm, em, mid, sde, sdb, tau, b, m, 1);
832 maximum = Likelihood(0, x, y, z, bm, em, mid, sde, sdb, tau, b, m, 2);
834 f0 = Likelihood(test, x, y, z, bm, em, mid, sde, sdb, tau, b, m, 3);
836 if (mu0 < 0) maximum = f0;
839 target = maximum - dchi2;
852 for (i = 0; i < maxiter; i++) {
853 l = (target - fhigh) / (flow - fhigh);
854 if (l < 0.2) l = 0.2;
855 if (l > 0.8) l = 0.8;
856 med = l * low + (1 - l) * high;
861 fmid = Likelihood(med, x, y, z, bm, em, mid, sde, sdb, tau, b, m, 3);
869 if ((high - low) < acc*high)
break;
883 ftest = Likelihood(test, x, y, z, bm, em, mid, sde, sdb, tau, b, m, 3);
884 if (ftest < target) {
888 slope = (ftest - flow) / (test - low);
889 high = test + (target - ftest) / slope;
890 fhigh = Likelihood(high, x, y, z, bm, em, mid, sde, sdb, tau, b, m, 3);
893 for (i = 0; i < maxiter; i++) {
894 l = (target - fhigh) / (flow - fhigh);
895 if (l < 0.2) l = 0.2;
896 if (l > 0.8) l = 0.8;
897 med = l * low + (1. - l) * high;
898 fmid = Likelihood(med, x, y, z, bm, em, mid, sde, sdb, tau, b, m, 3);
908 if (high - low < acc*high)
break;
916 if ((mid == 4) || (mid == 5)) {
921 fUpperLimit = limits[1];
922 fLowerLimit = TMath::Max(limits[0], 0.0);
933 Double_t TRolke::Likelihood(Double_t mu, Int_t x, Int_t y, Int_t z, Double_t bm, Double_t em, Int_t mid, Double_t sde, Double_t sdb, Double_t tau, Double_t b, Int_t m, Int_t what)
937 return EvalLikeMod1(mu, x, y, z, tau, m, what);
939 return EvalLikeMod2(mu, x, y, em, sde, tau, what);
941 return EvalLikeMod3(mu, x, bm, em, sde, sdb, what);
943 return EvalLikeMod4(mu, x, y, tau, what);
945 return EvalLikeMod5(mu, x, bm, sdb, what);
947 return EvalLikeMod6(mu, x, z, b, m, what);
949 return EvalLikeMod7(mu, x, em, sde, b, what);
951 std::cerr <<
"TRolke::Likelihood(...): Model NR: " <<
952 f_mid <<
" unknown"<<std::endl;
967 Double_t TRolke::EvalLikeMod1(Double_t mu, Int_t x, Int_t y, Int_t z, Double_t tau, Int_t m, Int_t what)
970 Double_t zm = Double_t(z) / m;
973 f = (x - y / tau) / zm;
977 mu = (x - y / tau) / zm;
978 Double_t b = y / tau;
980 f = LikeMod1(mu, b, e, x, y, z, tau, m);
985 Double_t b = (x + y) / (1.0 + tau);
987 f = LikeMod1(mu, b, e, x, y, z, tau, m);
991 ProfLikeMod1(mu, b, e, x, y, z, tau, m);
992 f = LikeMod1(mu, b, e, x, y, z, tau, m);
1003 Double_t TRolke::LikeMod1(Double_t mu, Double_t b, Double_t e, Int_t x, Int_t y, Int_t z, Double_t tau, Int_t m)
1007 if (x > 0) lls = x*TMath::Log(s) - s - LogFactorial(x);
1010 if ( y > 0) llb = y*TMath::Log( bg) - bg - LogFactorial(y);
1013 if (z == 0) lle = m * TMath::Log(1-e);
1014 else if ( z == m) lle = m * TMath::Log(e);
1015 else lle = z * TMath::Log(e) + (m - z)*TMath::Log(1 - e) + LogFactorial(m) - LogFactorial(m-z) - LogFactorial(z);
1017 double f = 2*( lls + llb + lle);
1023 struct LikeFunction1 {
1029 void TRolke::ProfLikeMod1(Double_t mu, Double_t &b, Double_t &e, Int_t x, Int_t y, Int_t z, Double_t tau, Int_t m)
1031 Double_t med = 0.0, fmid;
1032 Int_t maxiter = 1000;
1033 Double_t acc = 0.00001;
1034 Double_t emin = ((m + mu * tau) - TMath::Sqrt((m + mu * tau) * (m + mu * tau) - 4 * mu * tau * z)) / 2 / mu / tau;
1036 Double_t low = TMath::Max(1e-10, emin + 1e-10);
1037 Double_t high = 1 - 1e-10;
1039 for (Int_t i = 0; i < maxiter; i++) {
1040 med = (low + high) / 2.;
1042 fmid = LikeGradMod1(med, mu, x, y, z, tau, m);
1044 if (high < 0.5) acc = 0.00001 * high;
1045 else acc = 0.00001 * (1 - high);
1047 if ((high - low) < acc*high)
break;
1049 if (fmid > 0) low = med;
1054 Double_t eta = Double_t(z) / e - Double_t(m - z) / (1 - e);
1056 b = Double_t(y) / (tau - eta / mu);
1062 Double_t TRolke::LikeGradMod1(Double_t e, Double_t mu, Int_t x, Int_t y, Int_t z, Double_t tau, Int_t m)
1064 Double_t eta, etaprime, bprime, f;
1065 eta =
static_cast<double>(z) / e - static_cast<double>(m - z) / (1.0 - e);
1066 etaprime = (-1) * (static_cast<double>(m - z) / ((1.0 - e) * (1.0 - e)) + static_cast<double>(z) / (e * e));
1067 Double_t b = y / (tau - eta / mu);
1068 bprime = (b * b * etaprime) / mu / y;
1069 f = (mu + bprime) * (x / (e * mu + b) - 1) + (y / b - tau) * bprime + eta;
1081 Double_t TRolke::EvalLikeMod2(Double_t mu, Int_t x, Int_t y, Double_t em, Double_t sde, Double_t tau, Int_t what)
1083 Double_t v = sde * sde;
1084 Double_t coef[4], roots[3];
1088 f = (x - y / tau) / em;
1092 mu = (x - y / tau) / em;
1093 Double_t b = y / tau;
1095 f = LikeMod2(mu, b, e, x, y, em, tau, v);
1100 Double_t b = (x + y) / (1 + tau);
1102 f = LikeMod2(mu, b, e, x, y, em, tau, v);
1105 coef[2] = mu * mu * v - 2 * em * mu - mu * mu * v * tau;
1106 coef[1] = (- x) * mu * v - mu * mu * mu * v * v * tau - mu * mu * v * em + em * mu * mu * v * tau + em * em * mu - y * mu * v;
1107 coef[0] = x * mu * mu * v * v * tau + x * em * mu * v - y * mu * mu * v * v + y * em * mu * v;
1109 TMath::RootsCubic(coef, roots[0], roots[1], roots[2]);
1111 Double_t e = roots[1];
1113 if ( v > 0) b = y / (tau + (em - e) / mu / v);
1115 f = LikeMod2(mu, b, e, x, y, em, tau, v);
1126 Double_t TRolke::LikeMod2(Double_t mu, Double_t b, Double_t e, Int_t x, Int_t y, Double_t em, Double_t tau, Double_t v)
1130 if (x > 0) lls = x*TMath::Log(s) - s - LogFactorial(x);
1133 if ( y > 0) llb = y*TMath::Log( bg) - bg - LogFactorial(y);
1135 if ( v > 0) lle = - 0.9189385 - TMath::Log(v) / 2 - (em - e)*(em - e) / v / 2;
1137 return 2*( lls + llb + lle);
1148 Double_t TRolke::EvalLikeMod3(Double_t mu, Int_t x, Double_t bm, Double_t em, Double_t sde, Double_t sdb, Int_t what)
1151 Double_t v = sde * sde;
1152 Double_t u = sdb * sdb;
1163 f = LikeMod3(mu, b, e, x, bm, em, u, v);
1169 Double_t b = ((bm - u) + TMath::Sqrt((bm - u) * (bm - u) + 4 * x * u)) / 2.;
1171 f = LikeMod3(mu, b, e, x, bm, em, u, v);
1177 temp[0] = mu * mu * v + u;
1178 temp[1] = mu * mu * mu * v * v + mu * v * u - mu * mu * v * em + mu * v * bm - 2 * u * em;
1179 temp[2] = mu * mu * v * v * bm - mu * v * u * em - mu * v * bm * em + u * em * em - mu * mu * v * v * x;
1180 e = (-temp[1] + TMath::Sqrt(temp[1] * temp[1] - 4 * temp[0] * temp[2])) / 2 / temp[0];
1181 b = bm - (u * (em - e)) / v / mu;
1183 f = LikeMod3(mu, b, e, x, bm, em, u, v);
1194 Double_t TRolke::LikeMod3(Double_t mu, Double_t b, Double_t e, Int_t x, Double_t bm, Double_t em, Double_t u, Double_t v)
1198 if (x > 0) lls = x*TMath::Log(s) - s - LogFactorial(x);
1200 if ( u > 0) llb = - 0.9189385 - TMath::Log(u) / 2 - (bm - b)*(bm - b) / u / 2;
1202 if ( v > 0) lle = - 0.9189385 - TMath::Log(v) / 2 - (em - e)*(em - e) / v / 2;
1204 return 2*( lls + llb + lle);
1216 Double_t TRolke::EvalLikeMod4(Double_t mu, Int_t x, Int_t y, Double_t tau, Int_t what)
1220 if (what == 1) f = x - y / tau;
1223 Double_t b = y / tau;
1224 f = LikeMod4(mu, b, x, y, tau);
1228 Double_t b = Double_t(x + y) / (1 + tau);
1229 f = LikeMod4(mu, b, x, y, tau);
1231 Double_t b = (x + y - (1 + tau) * mu + sqrt((x + y - (1 + tau) * mu) * (x + y - (1 + tau) * mu) + 4 * (1 + tau) * y * mu)) / 2 / (1 + tau);
1232 f = LikeMod4(mu, b, x, y, tau);
1242 Double_t TRolke::LikeMod4(Double_t mu, Double_t b, Int_t x, Int_t y, Double_t tau)
1246 if (x > 0) lls = x*TMath::Log(s) - s - LogFactorial(x);
1249 if ( y > 0) llb = y*TMath::Log( bg) - bg - LogFactorial(y);
1251 return 2*( lls + llb);
1262 Double_t TRolke::EvalLikeMod5(Double_t mu, Int_t x, Double_t bm, Double_t sdb, Int_t what)
1264 Double_t u = sdb * sdb;
1273 f = LikeMod5(mu, b, x, bm, u);
1277 Double_t b = ((bm - u - mu) + TMath::Sqrt((bm - u - mu) * (bm - u - mu) - 4 * (mu * u - mu * bm - u * x))) / 2;
1278 f = LikeMod5(mu, b, x, bm, u);
1287 Double_t TRolke::LikeMod5(Double_t mu, Double_t b, Int_t x, Double_t bm, Double_t u)
1291 if (x > 0) lls = x*TMath::Log(s) - s - LogFactorial(x);
1293 if ( u > 0) llb = - 0.9189385 - TMath::Log(u) / 2 - (bm - b)*(bm - b) / u / 2;
1295 return 2*( lls + llb);
1306 Double_t TRolke::EvalLikeMod6(Double_t mu, Int_t x, Int_t z, Double_t b, Int_t m, Int_t what)
1308 Double_t coef[4], roots[3];
1310 Double_t zm = Double_t(z) / m;
1319 f = LikeMod6(mu, b, e, x, z, m);
1327 coef[2] = mu * b - mu * x - mu * mu - mu * m;
1328 coef[1] = mu * x - mu * b + mu * z - m * b;
1330 TMath::RootsCubic(coef, roots[0], roots[1], roots[2]);
1333 f = LikeMod6(mu, b, e, x, z, m);
1342 Double_t TRolke::LikeMod6(Double_t mu, Double_t b, Double_t e, Int_t x, Int_t z, Int_t m)
1346 if (x > 0) lls = x*TMath::Log(s) - s - LogFactorial(x);
1349 if (z == 0) lle = m * TMath::Log(1-e);
1350 else if ( z == m) lle = m * TMath::Log(e);
1351 else lle = z * TMath::Log(e) + (m - z)*TMath::Log(1 - e) + LogFactorial(m) - LogFactorial(m-z) - LogFactorial(z);
1353 return 2* (lls + lle);
1365 Double_t TRolke::EvalLikeMod7(Double_t mu, Int_t x, Double_t em, Double_t sde, Double_t b, Int_t what)
1367 Double_t v = sde * sde;
1377 f = LikeMod7(mu, b, e, x, em, v);
1385 e = (-(mu * em - b - mu * mu * v) - TMath::Sqrt((mu * em - b - mu * mu * v) * (mu * em - b - mu * mu * v) + 4 * mu * (x * mu * v - mu * b * v + b * em))) / (- mu) / 2;
1387 f = LikeMod7(mu, b, e, x, em, v);
1397 Double_t TRolke::LikeMod7(Double_t mu, Double_t b, Double_t e, Int_t x, Double_t em, Double_t v)
1401 if (x > 0) lls = x*TMath::Log(s) - s - LogFactorial(x);
1404 if ( v > 0) lle = - 0.9189385 - TMath::Log(v) / 2 - (em - e)*(em - e) / v / 2;
1406 return 2*( lls + lle);
1412 Double_t TRolke::EvalPolynomial(Double_t x,
const Int_t coef[], Int_t N)
1416 Double_t ans = *p++;
1420 ans = ans * x + *p++;
1429 Double_t TRolke::EvalMonomial(Double_t x,
const Int_t coef[], Int_t N)
1439 ans = ans * x + *p++;
1448 Double_t TRolke::LogFactorial(Int_t n)
1450 return TMath::LnGamma(n+1);