47 :
name(theName),
n(0), sum(0.), mean(0.), var(0.), sd(0.), r(0.), efficiency(0.),
48 r2eff(0.), r2int(0.), shift(0.), vov(0.), fom(0.), largest(0.),
49 largest_score_happened(0), mean_1(0.), var_1(0.), sd_1(0.), r_1(0.),
50 shift_1(0.), vov_1(0.), fom_1(0.), noBinOfHistory(16), slope(0.),
51 noBinOfPDF(10), minimizer(0), noPass(0), noTotal(8), statsAreUpdated(true)
52 , showHistory(true) , calcSLOPE(true)
94 G4cout <<
"Warning: G4convergenceTester expects zero or positive number as inputs, but received a negative number." <<
G4endl;
106 std::vector< G4double >::iterator it;
146 std::map< G4int , G4double >::iterator it;
151 var += ( xi -
mean ) * ( xi - mean );
153 vov += ( xi -
mean ) * ( xi - mean ) * ( xi -
mean ) * ( xi - mean );
166 sd = std::sqrt (
var );
182 G4double spend_time_of_largest = 0.0;
185 if ( std::abs ( it->second ) >
largest )
219 if (
var_1 != 0.0 ) {
245 G4int j = int ( i * 0.05 );
297 G4int nonzero_till_ith = 0;
300 std::map< G4int , G4double >::iterator it;
304 if ( it->first <= ith )
312 if ( nonzero_till_ith == 0 )
continue;
314 mean_till_ith = mean_till_ith / ( ith+1 );
324 if ( it->first <= ith )
327 sum_x2_till_ith += xi * xi;
328 var_till_ith += ( xi - mean_till_ith ) * ( xi - mean_till_ith );
329 shift_till_ith += ( xi - mean_till_ith ) * ( xi - mean_till_ith ) * ( xi - mean_till_ith );
330 vov_till_ith += ( xi - mean_till_ith ) * ( xi - mean_till_ith ) * ( xi - mean_till_ith ) * ( xi - mean_till_ith );
334 var_till_ith += ( (ith+1) - nonzero_till_ith ) * mean_till_ith * mean_till_ith;
335 vov_till_ith += ( (ith+1) - nonzero_till_ith ) * mean_till_ith * mean_till_ith * mean_till_ith * mean_till_ith ;
338 if ( var_till_ith == 0 )
continue;
339 vov_till_ith = vov_till_ith / ( var_till_ith * var_till_ith ) - 1.0 / (ith+1);
342 var_till_ith = var_till_ith / ( ith+1 - 1 );
345 sd_history [ i-1 ] = std::sqrt( var_till_ith );
346 r_history [ i-1 ] = std::sqrt( var_till_ith ) / mean_till_ith / std::sqrt ( 1.0*(ith+1) );
350 shift_till_ith += ( (ith+1) - nonzero_till_ith ) * mean_till_ith * mean_till_ith * mean_till_ith * ( -1 );
351 shift_till_ith = shift_till_ith / ( 2 * var_till_ith * (ith+1) );
354 e_history [ i-1 ] = 1.0*nonzero_till_ith / (ith+1);
357 G4double sum_till_ith = mean_till_ith * (ith+1);
358 r2int_history [ i-1 ] = ( sum_x2_till_ith ) / ( sum_till_ith * sum_till_ith ) - 1 / (
e_history [ i-1 ] * (ith+1) );
372 out << std::setprecision( 6 );
375 out <<
"G4ConvergenceTester Output Result of " <<
name <<
G4endl;
376 out << std::setw(20) <<
"EFFICIENCY = " << std::setw(13) <<
efficiency <<
G4endl;
377 out << std::setw(20) <<
"MEAN = " << std::setw(13) <<
mean <<
G4endl;
378 out << std::setw(20) <<
"VAR = " << std::setw(13) <<
var <<
G4endl;
379 out << std::setw(20) <<
"SD = " << std::setw(13) <<
sd <<
G4endl;
380 out << std::setw(20) <<
"R = " << std::setw(13) <<
r <<
G4endl;
381 out << std::setw(20) <<
"SHIFT = "<< std::setw(13) <<
shift <<
G4endl;
382 out << std::setw(20) <<
"VOV = "<< std::setw(13) <<
vov <<
G4endl;
383 out << std::setw(20) <<
"FOM = "<< std::setw(13) <<
fom <<
G4endl;
387 out << std::setw(20) <<
"Affected Mean = " << std::setw(13) <<
mean_1 <<
" and its ratio to orignal is " <<
mean_1/
mean <<
G4endl;
389 out << std::setw(20) <<
"Affected Mean = " << std::setw(13) <<
mean_1 <<
G4endl;
392 out << std::setw(20) <<
"Affected VAR = " << std::setw(13) <<
var_1 <<
" and its ratio to orignal is " <<
var_1/
var <<
G4endl;
394 out << std::setw(20) <<
"Affected VAR = " << std::setw(13) <<
var_1 <<
G4endl;
397 out << std::setw(20) <<
"Affected R = " << std::setw(13) <<
r_1 <<
" and its ratio to orignal is " <<
r_1/
r <<
G4endl;
399 out << std::setw(20) <<
"Affected R = " << std::setw(13) <<
r_1 <<
G4endl;
402 out << std::setw(20) <<
"Affected SHIFT = " << std::setw(13) <<
shift_1 <<
" and its ratio to orignal is " <<
shift_1/
shift <<
G4endl;
404 out << std::setw(20) <<
"Affected SHIFT = " << std::setw(13) <<
shift_1 <<
G4endl;
407 out << std::setw(20) <<
"Affected FOM = " << std::setw(13) <<
fom_1 <<
" and its ratio to orignal is " <<
fom_1/
fom <<
G4endl;
409 out << std::setw(20) <<
"Affected FOM = " << std::setw(13) <<
fom_1 <<
G4endl;
413 out <<
"Number of events of this run is too small to do convergence tests." <<
G4endl;
424 out <<
"SLOPE is large enough" <<
G4endl;
428 out <<
"SLOPE is not large enough" <<
G4endl;
431 out <<
"Number of non zero history too small to calculate SLOPE" <<
G4endl;
434 out <<
"This result passes " <<
noPass <<
" / "<<
noTotal <<
" Convergence Test." <<
G4endl;
443 out <<
"Number of events of this run is too small to show history." <<
G4endl;
447 out << std::setprecision( 6 );
450 out <<
"G4ConvergenceTester Output History of " <<
name <<
G4endl;
452 << std::setw(13) <<
"var"
453 << std::setw(13) <<
"sd"
454 << std::setw(13) <<
"r"
455 << std::setw(13) <<
"vov"
456 << std::setw(13) <<
"fom"
457 << std::setw(13) <<
"shift"
458 << std::setw(13) <<
"e"
459 << std::setw(13) <<
"r2eff"
460 << std::setw(13) <<
"r2int"
464 out << std::setw( 4) << i <<
" "
485 std::vector<G4double> first_ally;
486 std::vector<G4double> second_ally;
495 first_ally.resize( N );
496 second_ally.resize( N );
500 if ( sum_of_var == 0.0 ) {
501 out <<
"Variances in all historical grids are zero." <<
G4endl;
502 out <<
"Terminating checking behavior of statistics numbers." <<
G4endl;
508 for ( i = 0 ; i < N ; i++ )
515 t = pearson_r * std::sqrt ( ( N - 2 ) / ( 1 - pearson_r * pearson_r ) );
519 out <<
"MEAN distribution is RANDOM" <<
G4endl;
524 out <<
"MEAN distribution is not RANDOM" <<
G4endl;
530 for ( i = 0 ; i < N ; i++ )
537 t = pearson_r * std::sqrt ( ( N - 2 ) / ( 1 - pearson_r * pearson_r ) );
541 out <<
"r follows 1/std::sqrt(N)" <<
G4endl;
546 out <<
"r does not follow 1/std::sqrt(N)" <<
G4endl;
551 out <<
"r is monotonically decrease " <<
G4endl;
555 out <<
"r is NOT monotonically decrease " <<
G4endl;
570 for ( i = 0 ; i < N ; i++ )
577 t = pearson_r * std::sqrt ( ( N - 2 ) / ( 1 - pearson_r * pearson_r ) );
581 out <<
"VOV follows 1/std::sqrt(N)" <<
G4endl;
586 out <<
"VOV does not follow 1/std::sqrt(N)" <<
G4endl;
591 out <<
"VOV is monotonically decrease " <<
G4endl;
595 out <<
"VOV is NOT monotonically decrease " <<
G4endl;
600 for ( i = 0 ; i < N ; i++ )
607 t = pearson_r * std::sqrt ( ( N - 2 ) / ( 1 - pearson_r * pearson_r ) );
611 out <<
"FOM distribution is RANDOM" <<
G4endl;
616 out <<
"FOM distribution is not RANDOM" <<
G4endl;
629 for ( i = 0 ; i < N ; i++ )
631 first_mean += first_ally [ i ];
632 second_mean += second_ally [ i ];
634 first_mean = first_mean / N;
635 second_mean = second_mean / N;
638 for ( i = 0 ; i < N ; i++ )
640 a += ( first_ally [ i ] - first_mean ) * ( second_ally [ i ] - second_mean );
645 for ( i = 0 ; i < N ; i++ )
647 b1 += ( first_ally [ i ] - first_mean ) * ( first_ally [ i ] - first_mean );
648 b2 += ( second_ally [ i ] - second_mean ) * ( second_ally [ i ] - second_mean );
651 G4double rds = a / std::sqrt ( b1 * b2 );
661 std::vector<G4double>::iterator it;
662 for ( it = ally.begin() ; it != ally.end() - 1 ; it++ )
664 if ( *it < *(it+1) )
return FALSE;
694 if ( max*0.99 < min )
701 std::vector < G4double > pdf_grid;
706 G4double log10_max = std::log10( max );
707 G4double log10_min = std::log10( min );
708 G4double log10_delta = log10_max - log10_min;
711 pdf_grid[i] = std::pow ( 10.0 , log10_max - log10_delta/10.0*(i) );
715 std::vector < G4double > pdf;
716 pdf.resize( noBinOfPDF );
718 for (
G4int j=0 ; j < last ; j ++ )
720 for (
G4int i = 0 ; i < 11 ; i++ )
724 pdf[i] += 1.0 / ( pdf_grid[i] - pdf_grid[i+1] ) /
n;
731 f_xi.resize( noBinOfPDF );
732 f_yi.resize( noBinOfPDF );
736 f_xi[i] = (pdf_grid[i]+pdf_grid[i+1])/2;
772 return 3.402823466e+38;
776 return 3.402823466e+38;
783 for ( i = 0 ; i < int (
f_yi.size() ) ; i++ )
786 if ( ( 1 + k *
f_xi [ i ] / a ) < 0 )
792 y += (
f_yi [ i ] - 1/a*std::pow ( 1 + k *
f_xi [ i ] / a , - 1/k - 1 ) ) * (
f_yi [ i ] - 1/a*std::pow ( 1 + k *
f_xi [ i ] / a , - 1/k - 1 ) );
G4bool is_monotonically_decrease(std::vector< G4double >)
G4double slope_fitting_function(std::vector< G4double >)
G4double GetSystemElapsed() const
std::vector< G4double > largest_scores
std::vector< G4double > sd_history
std::vector< G4double > cpu_time
std::vector< G4double > r2int_history
std::map< G4int, G4double > nonzero_histories
std::vector< G4double > mean_history
std::vector< G4double > f_xi
G4SimplexDownhill< G4ConvergenceTester > * minimizer
void check_stat_history(std::ostream &out=G4cout)
std::vector< G4double > e_history
std::vector< G4int > history_grid
std::vector< G4double > vov_history
G4GLOB_DLL std::ostream G4cout
std::vector< G4double > GetMinimumPoint()
void calc_grid_point_of_history()
G4double GetUserElapsed() const
std::vector< G4double > r2eff_history
void calc_slope_fit(std::vector< G4double >)
std::vector< G4double > shift_history
void ShowHistory(std::ostream &out=G4cout)
T max(const T t1, const T t2)
brief Return the largest of the two arguments
const G4double x[NPOINTSGL]
T min(const T t1, const T t2)
brief Return the smallest of the two arguments
G4int largest_score_happened
std::vector< G4double > var_history
std::vector< G4double > r_history
void ShowResult(std::ostream &out=G4cout)
std::vector< G4double > fom_history
std::vector< G4double > f_yi
G4double calc_Pearson_r(G4int, std::vector< G4double >, std::vector< G4double >)
G4ConvergenceTester(G4String theName="NONAME")