source: trunk/examples/extended/analysis/N03Con/src/G4ConvergenceTester.cc @ 1292

Last change on this file since 1292 was 807, checked in by garnier, 16 years ago

update

File size: 19.6 KB
Line 
1//
2// ********************************************************************
3// * License and Disclaimer                                           *
4// *                                                                  *
5// * The  Geant4 software  is  copyright of the Copyright Holders  of *
6// * the Geant4 Collaboration.  It is provided  under  the terms  and *
7// * conditions of the Geant4 Software License,  included in the file *
8// * LICENSE and available at  http://cern.ch/geant4/license .  These *
9// * include a list of copyright holders.                             *
10// *                                                                  *
11// * Neither the authors of this software system, nor their employing *
12// * institutes,nor the agencies providing financial support for this *
13// * work  make  any representation or  warranty, express or implied, *
14// * regarding  this  software system or assume any liability for its *
15// * use.  Please see the license in the file  LICENSE  and URL above *
16// * for the full disclaimer and the limitation of liability.         *
17// *                                                                  *
18// * This  code  implementation is the result of  the  scientific and *
19// * technical work of the GEANT4 collaboration.                      *
20// * By using,  copying,  modifying or  distributing the software (or *
21// * any work based  on the software)  you  agree  to acknowledge its *
22// * use  in  resulting  scientific  publications,  and indicate your *
23// * acceptance of all terms of the Geant4 Software license.          *
24// ********************************************************************
25//
26//
27// Convergence Tests for Monte Carlo resut.
28//
29// Reference
30// MCNP(TM) -A General Monte Carlo N-Particle Transport Code
31// Version 4B
32// Judith F. Briesmeister, Editor
33// LA-12625-M, Issued: March 1997, UC 705 and UC 700
34// CHAPTER 2. GEOMETRY, DATA, PHYSICS, AND MATHEMATICS
35//        VI. ESTIMATION OF THE MONTE CARLO PRECISION
36//
37// Positives numbers are assumed for inputs
38//
39// Koi, Tatsumi (SLAC/SCCS)
40//
41
42#include "G4ConvergenceTester.hh"
43
44G4ConvergenceTester::G4ConvergenceTester()
45{
46
47   nonzero_histories.clear();
48   largest_scores.clear();
49   largest_scores.push_back( 0.0 );
50   n=0;
51   sum=0;
52   noBinOfHistory = 16; 
53   history_grid.resize( noBinOfHistory , 0 );
54   mean_history.resize( noBinOfHistory , 0.0 );
55   var_history.resize( noBinOfHistory , 0.0 );
56   sd_history.resize( noBinOfHistory , 0.0 );
57   r_history.resize( noBinOfHistory , 0.0 );
58   vov_history.resize( noBinOfHistory , 0.0 );
59   fom_history.resize( noBinOfHistory , 0.0 );
60   shift_history.resize( noBinOfHistory , 0.0 );
61   e_history.resize( noBinOfHistory , 0.0 );
62   r2eff_history.resize( noBinOfHistory , 0.0 );
63   r2int_history.resize( noBinOfHistory , 0.0 );
64
65   timer = new G4Timer();
66   timer->Start();
67   cpu_time.clear();
68   cpu_time.push_back( 0.0 );
69
70   noBinOfPDF = 10; // this will be used calculating SLOPE
71
72   noPass = 0;
73   noTotal = 8;
74
75}
76
77
78
79G4ConvergenceTester::~G4ConvergenceTester()
80{
81   delete timer;
82}
83
84
85
86void G4ConvergenceTester::AddScore( G4double x )
87{ 
88
89   //G4cout << x << G4endl;
90
91   timer->Stop();
92   cpu_time.push_back( timer->GetSystemElapsed() + timer->GetUserElapsed() );
93
94   if ( x == 0.0 ) 
95   { 
96   }
97   else
98   {
99       nonzero_histories.insert( std::pair< G4int , G4double > ( n , x ) );
100       if ( x > largest_scores.back() ) 
101       { 
102//        Following serch  should become faster if begin from bottom.
103          std::vector< G4double >::iterator it; 
104          for ( it = largest_scores.begin() ; it != largest_scores.end() ; it++ )
105          { 
106             if ( x > *it ) 
107             { 
108                largest_scores.insert( it , x );
109                break;
110             }
111          }
112
113          if ( largest_scores.size() > 201 )
114          {
115             largest_scores.pop_back();
116          } 
117          //G4cout << largest_scores.size() << " " << largest_scores.front() << " " << largest_scores.back() << G4endl;
118       }
119       sum += x; 
120   }
121
122   n++;
123   return; 
124}
125
126
127
128void G4ConvergenceTester::calStat()
129{
130   
131
132   efficiency = double( nonzero_histories.size() ) / n; 
133
134   mean = sum / n;
135   
136   G4double sum_x2 = 0.0; 
137   var = 0.0;
138   shift = 0.0;
139   vov = 0.0;
140
141   G4double xi; 
142   std::map< G4int , G4double >::iterator it;
143   for ( it = nonzero_histories.begin() ; it != nonzero_histories.end() ; it++ )
144   {
145      xi = it->second;
146      sum_x2 += xi * xi;
147      var += ( xi - mean ) * ( xi - mean );
148      shift += ( xi - mean ) * ( xi - mean ) * ( xi - mean );
149      vov += ( xi - mean ) * ( xi - mean ) * ( xi - mean ) * ( xi - mean );
150   }
151
152   var += ( n - nonzero_histories.size() ) * mean * mean;
153   shift += ( n - nonzero_histories.size() ) * mean * mean * mean * ( -1 );
154   vov += ( n - nonzero_histories.size() ) * mean * mean * mean * mean;
155
156   vov = vov / ( var * var ) - 1.0 / n; 
157
158   var = var/(n-1);
159
160   sd = std::sqrt ( var );
161
162   r = sd / mean / std::sqrt ( n ); 
163
164   r2eff = ( 1 - efficiency ) / ( efficiency * n );
165   r2int = sum_x2 / ( sum * sum ) - 1 / ( efficiency * n );
166   
167   shift = shift / ( 2 * var * n );
168   
169   fom =  1 / (r*r) / cpu_time.back(); 
170
171// Find Largest History
172   //G4double largest = 0.0;
173   largest = 0.0;
174   largest_score_happened = 0;
175   G4double spend_time_of_largest = 0.0;
176   for ( it = nonzero_histories.begin() ; it != nonzero_histories.end() ; it++ )
177   {
178      if ( std::abs ( it->second ) > largest )
179      {
180         largest = it->second;
181         largest_score_happened = it->first;
182         spend_time_of_largest = cpu_time [ it->first ] - cpu_time [ it->first - 1 ];
183      }
184   }
185
186   mean_1 = 0.0;
187   var_1 = 0.0;
188   shift_1 = 0.0;
189   vov_1 = 0.0;
190   sd_1 = 0.0;
191   r_1 = 0.0;
192   vov_1 = 0.0;
193
194//   G4cout << "The largest history  = " << largest << G4endl;
195
196   mean_1 = ( sum + largest ) / ( n + 1 );
197
198   sum_x2 = 0.0;
199   for ( it = nonzero_histories.begin() ; it != nonzero_histories.end() ; it++ )
200   {
201      xi = it->second;
202      sum_x2 += xi * xi;
203      var_1 += ( xi - mean_1 ) * ( xi - mean_1 );
204      shift_1 += ( xi - mean_1 ) * ( xi - mean_1 ) * ( xi - mean_1 );
205      vov_1 += ( xi - mean_1 ) * ( xi - mean_1 ) * ( xi - mean_1 ) * ( xi - mean_1 );
206   }
207   xi = largest;
208   sum_x2 += xi * xi;
209   var_1 += ( xi - mean_1 ) * ( xi - mean_1 );
210   shift_1 += ( xi - mean_1 ) * ( xi - mean_1 ) * ( xi - mean_1 );
211   vov_1 += ( xi - mean_1 ) * ( xi - mean_1 ) * ( xi - mean_1 ) * ( xi - mean_1 );
212
213   var_1 += ( n - nonzero_histories.size() ) * mean_1 * mean_1;
214   shift_1 += ( n - nonzero_histories.size() ) * mean_1 * mean_1 * mean_1 * ( -1 );
215   vov_1 += ( n - nonzero_histories.size() ) * mean_1 * mean_1 * mean_1 * mean_1;
216
217   vov_1 = vov_1 / ( var_1 * var_1 ) - 1.0 / ( n + 1 ); 
218
219   var_1 = var_1 / n ;
220
221   sd_1 = std::sqrt ( var_1 );
222
223   r_1 = sd_1 / mean_1 / std::sqrt ( n + 1 ); 
224
225   shift_1 = shift_1 / ( 2 * var_1 * ( n + 1 ) );
226
227   fom_1 = 1 / ( r * r ) / ( cpu_time.back() + spend_time_of_largest );
228
229   if ( nonzero_histories.size() < 500 ) 
230   {
231      G4cout << "Number of non zero history too small to calcuarte SLOPE" << G4endl;
232   }
233   else
234   {
235      G4int i = int ( nonzero_histories.size() );
236
237      // 5% criterion
238      G4int j = int ( i * 0.05 );
239      while ( int( largest_scores.size() ) > j ) 
240      {
241         largest_scores.pop_back();
242      }
243      calc_slope_fit( largest_scores );   
244   }
245
246   calc_grid_point_of_history();
247   calc_stat_history();
248}
249
250
251
252void G4ConvergenceTester::calc_grid_point_of_history()
253{
254
255// histroy_grid [ 0,,,15 ]
256// history_grid [0] 1/16 ,,, history_grid [15] 16/16
257// if number of event is x then history_grid [15] become x-1.
258// 16 -> noBinOfHisotry
259
260   G4int i;
261   for ( i = 1 ; i <= noBinOfHistory ; i++ )
262   { 
263      history_grid [ i-1 ] = int ( n / ( double( noBinOfHistory ) ) * i - 0.1 );
264      //G4cout << "history_grid " << i-1  << " " << history_grid [ i-1 ] << G4endl;
265   }
266
267}
268
269
270
271void G4ConvergenceTester::calc_stat_history()
272{
273//   G4cout << "i/16  till_ith  mean  var  sd  r  vov  fom  shift  e  r2eff  r2int" << G4endl;
274
275   G4int i;
276   for ( i = 1 ; i <=  noBinOfHistory  ; i++ )
277   {
278
279      G4int ith = history_grid [ i-1 ];
280
281      G4int nonzero_till_ith = 0;
282      G4double xi;
283      G4double mean_till_ith = 0.0; 
284      std::map< G4int , G4double >::iterator it;
285
286      for ( it = nonzero_histories.begin() ; it !=nonzero_histories.end() ; it++ )
287      {
288         if ( it->first <= ith )
289         {
290            xi = it->second;
291            mean_till_ith += xi;
292            nonzero_till_ith++; 
293         }
294      }
295
296      mean_till_ith = mean_till_ith / ( ith+1 ); 
297      mean_history [ i-1 ] = mean_till_ith;
298
299      G4double sum_x2_till_ith = 0.0;
300      G4double var_till_ith = 0.0;
301      G4double vov_till_ith = 0.0;
302      G4double shift_till_ith = 0.0;
303 
304      for ( it = nonzero_histories.begin() ; it !=nonzero_histories.end() ; it++ )
305      {
306         if ( it->first <= ith )
307         {
308         xi = it->second;
309         sum_x2_till_ith += xi * xi; 
310         var_till_ith += ( xi - mean_till_ith ) * ( xi - mean_till_ith );
311         shift_till_ith += ( xi - mean_till_ith ) * ( xi - mean_till_ith ) * ( xi - mean_till_ith );
312         vov_till_ith += ( xi - mean_till_ith ) * ( xi - mean_till_ith ) * ( xi - mean_till_ith ) * ( xi - mean_till_ith );
313         }
314      }
315
316      var_till_ith += ( (ith+1) - nonzero_till_ith ) * mean_till_ith * mean_till_ith;
317
318      vov_till_ith += ( (ith+1) - nonzero_till_ith ) * mean_till_ith * mean_till_ith * mean_till_ith * mean_till_ith ;
319      vov_till_ith = vov_till_ith / ( var_till_ith * var_till_ith ) - 1.0 / (ith+1); 
320      vov_history [ i-1 ] = vov_till_ith;
321
322      var_till_ith = var_till_ith / ( ith+1 - 1 );
323      var_history [ i-1 ] = var_till_ith;
324      sd_history [ i-1 ] = std::sqrt( var_till_ith );
325      r_history [ i-1 ] = std::sqrt( var_till_ith ) / mean_till_ith / std::sqrt ( 1.0*(ith+1) );
326
327      fom_history [ i-1 ] = 1 / ( r_history [ i-1 ] *  r_history [ i-1 ] ) / cpu_time [ ith ];
328   
329      shift_till_ith += ( (ith+1) - nonzero_till_ith ) * mean_till_ith * mean_till_ith * mean_till_ith * ( -1 );
330      shift_till_ith = shift_till_ith / ( 2 * var_till_ith * (ith+1) );
331      shift_history [ i-1 ] = shift_till_ith;
332
333      e_history [ i-1 ] = 1.0*nonzero_till_ith / (ith+1);
334      r2eff_history [ i-1 ] = ( 1 - e_history [ i-1 ] ) / (  e_history [ i-1 ] * (ith+1) );
335
336      G4double sum_till_ith =  mean_till_ith * (ith+1); 
337      r2int_history [ i-1 ] = ( sum_x2_till_ith ) / ( sum_till_ith * sum_till_ith ) - 1 / ( e_history [ i-1 ] * (ith+1) );
338
339   }
340
341}
342
343
344
345void G4ConvergenceTester::ShowResult()
346{
347   calStat();
348
349   G4cout << "EFFICIENCY = " << efficiency << G4endl;
350   G4cout << "MEAN = " << mean << G4endl;
351   G4cout << "VAR = " << var << G4endl;
352   G4cout << "SD = " << sd << G4endl;
353   G4cout << "R = "<< r << G4endl;
354   G4cout << "SHIFT = "<< shift << G4endl;
355   G4cout << "VOV = "<< vov << G4endl;
356   G4cout << "FOM = "<< fom << G4endl;
357
358   G4cout << "THE LARGEST SCORE = " << largest << " and it happend at " << largest_score_happened << "th event" << G4endl;
359   G4cout << "Affected Mean = " << mean_1 << " and its ratio to orignal is " << mean_1/mean << G4endl;
360   G4cout << "Affected VAR = " << var_1 << " and its ratio to orignal is " << var_1/var << G4endl;
361   G4cout << "Affected R = " << r_1 << " and its ratio to orignal is " << r_1/r << G4endl;
362   G4cout << "Affected SHIFT = " << shift_1 << " and its ratio to orignal is " << shift_1/shift << G4endl;
363   G4cout << "Affected FOM = " << fom_1 << " and its ratio to orignal is " << fom_1/fom << G4endl;
364
365   check_stat_history();
366
367// check SLOPE and output result
368   if ( slope >= 3 )
369   {   
370      noPass++;
371      G4cout << "SLOPE is large enough" << G4endl; 
372   }
373   else
374   {
375      G4cout << "SLOPE is not large enough" << G4endl; 
376   }
377
378   G4cout << "This result passes " << noPass << " / "<< noTotal << " Convergence Test." << G4endl; 
379   G4cout << G4endl;
380
381}
382
383void G4ConvergenceTester::ShowHistory()
384{
385   G4cout << "i/" << noBinOfHistory << " till_ith  mean  var  sd  r  vov  fom  shift  e  r2eff  r2int" << G4endl;
386   for ( G4int i = 1 ; i <=  noBinOfHistory  ; i++ )
387   {
388      G4cout << i << " " 
389             << history_grid [ i-1 ] << " "
390             << mean_history [ i-1 ] << " " 
391             << var_history [ i-1 ] << " " 
392             << sd_history [ i-1 ] << " " 
393             << r_history [ i-1 ] << " " 
394             << vov_history [ i-1 ] << " " 
395             << fom_history [ i-1 ] << " " 
396             << shift_history [ i-1 ] << " " 
397             << e_history [ i-1 ] << " " 
398             << r2eff_history [ i-1 ] << " " 
399             << r2int_history [ i-1 ] << " " 
400             << G4endl;
401   }
402}
403
404void G4ConvergenceTester::check_stat_history()
405{
406
407// 1 sigma rejection for null hypothesis
408
409   std::vector<G4double> first_ally;
410   std::vector<G4double> second_ally;
411
412// use 2nd half of hisories
413   G4int N = mean_history.size() / 2;
414   G4int i;
415 
416   G4double pearson_r;
417   G4double t;
418
419   first_ally.resize( N );
420   second_ally.resize( N );
421
422// Mean
423
424   for ( i = 0 ; i < N ; i++ ) 
425   {
426      first_ally [ i ] = history_grid [ N + i ];
427      second_ally [ i ] = mean_history [ N + i ];
428   }
429
430   pearson_r = calc_Pearson_r ( N , first_ally , second_ally );
431   t = pearson_r * std::sqrt ( ( N - 2 ) / ( 1 - pearson_r * pearson_r ) );
432
433   if ( t < 0.429318 ) // Student t of (Degree of freedom = N-2 ) 
434   {   
435      G4cout << "MEAN distribution is  RANDOM" << G4endl; 
436      noPass++;
437   }
438   else
439   {
440      G4cout << "MEAN distribution is not RANDOM" << G4endl; 
441   }
442
443
444// R
445
446   for ( i = 0 ; i < N ; i++ ) 
447   {
448      first_ally [ i ] = 1.0 / std::sqrt ( history_grid [ N + i ] );
449      second_ally [ i ] = r_history [ N + i ];
450   }
451
452   pearson_r = calc_Pearson_r ( N , first_ally , second_ally );
453   t = pearson_r * std::sqrt ( ( N - 2 ) / ( 1 - pearson_r * pearson_r ) );
454     
455   if ( t > 1.090546 )
456   {   
457      G4cout << "r follows 1/std::sqrt(N)" << G4endl; 
458      noPass++;
459   }
460   else
461   {
462      G4cout << "r does not follow 1/std::sqrt(N)" << G4endl; 
463   }
464
465   G4cout << "r is monotonically decrease " << is_monotonically_decrease( second_ally ) << G4endl;
466
467   if ( r_history.back() < 0.1 ) 
468   {
469      G4cout << "r is less than 0.1. r = " <<  r_history.back() << G4endl;
470      noPass++;
471   }
472   else
473   {
474      G4cout << "r is NOT less than 0.1. r = " <<  r_history.back() << G4endl;
475   }
476
477
478// VOV
479   for ( i = 0 ; i < N ; i++ ) 
480   {
481      first_ally [ i ] = 1.0 / history_grid [ N + i ];
482      second_ally [ i ] = vov_history [ N + i ];
483   }
484
485   pearson_r = calc_Pearson_r ( N , first_ally , second_ally );
486   t = pearson_r * std::sqrt ( ( N - 2 ) / ( 1 - pearson_r * pearson_r ) );
487     
488   if ( t > 1.090546 )
489   {   
490      G4cout << "VOV follows 1/std::sqrt(N)" << G4endl; 
491      noPass++;
492   }
493   else
494   {
495      G4cout << "VOV does not follow 1/std::sqrt(N)" << G4endl; 
496   }
497   G4cout << "VOV is monotonically decrease " << is_monotonically_decrease( second_ally ) << G4endl;
498
499// FOM
500
501   for ( i = 0 ; i < N ; i++ ) 
502   {
503      first_ally [ i ] = history_grid [ N + i ];
504      second_ally [ i ] = fom_history [ N + i ];
505   }
506
507   pearson_r = calc_Pearson_r ( N , first_ally , second_ally );
508   t = pearson_r * std::sqrt ( ( N - 2 ) / ( 1 - pearson_r * pearson_r ) );
509
510   if ( t < 0.429318 )
511   {   
512      G4cout << "FOM distribution is RANDOM" << G4endl; 
513      noPass++;
514   }
515   else
516   {
517      G4cout << "FOM distribution is not RANDOM" << G4endl; 
518   }
519
520}
521
522
523
524G4double G4ConvergenceTester::calc_Pearson_r ( G4int N , std::vector<G4double> first_ally , std::vector<G4double> second_ally )
525{
526   G4double first_mean = 0.0; 
527   G4double second_mean = 0.0;
528
529   G4int i;
530   for ( i = 0 ; i < N ; i++ )
531   {
532      first_mean += first_ally [ i ]; 
533      second_mean += second_ally [ i ]; 
534   }
535   first_mean = first_mean / N;
536   second_mean = second_mean / N;
537   
538   G4double a = 0.0; 
539   for ( i = 0 ; i < N ; i++ )
540   {
541      a += ( first_ally [ i ] - first_mean ) * ( second_ally [ i ] - second_mean );
542   }
543
544   G4double b1 = 0.0; 
545   G4double b2 = 0.0;
546   for ( i = 0 ; i < N ; i++ )
547   {
548      b1 += ( first_ally [ i ] - first_mean ) * ( first_ally [ i ] - first_mean );
549      b2 += ( second_ally [ i ] - second_mean ) * ( second_ally [ i ] - second_mean );
550   }
551   
552   G4double r = a / std::sqrt ( b1 * b2 ); 
553
554   return r; 
555}
556
557
558
559G4bool G4ConvergenceTester::is_monotonically_decrease ( std::vector<G4double> ally )
560{
561   std::vector<G4double>::iterator it;
562   for ( it = ally.begin() ; it != ally.end() - 1 ; it++ )
563   {
564      if ( *it < *(it+1) ) return FALSE;
565   }
566
567   noPass++;
568   return TRUE;
569}
570
571
572
573//void G4ConvergenceTester::calc_slope_fit ( std::vector<G4double> largest_socres )
574void G4ConvergenceTester::calc_slope_fit ( std::vector<G4double> )
575{
576
577   // create PDF bins
578   G4double max = largest_scores.front();
579   G4int last = int ( largest_scores.size() );
580   G4double min = 0.0;
581   if (  largest_scores.back() !=  0 ) 
582   {
583      min = largest_scores.back();
584   }
585   else
586   {
587      min = largest_scores[ last-1 ];
588      last = last - 1;
589   }
590   
591   //G4cout << "largest " << max << G4endl;
592   //G4cout << "last  " << min << G4endl;
593
594   if ( max*0.99 < min ) 
595   {
596      // upper limit is assumed to have been reached
597      slope = 10.0;
598      return;
599   }
600
601   std::vector < G4double >  pdf_grid;
602
603   pdf_grid.resize( noBinOfPDF+1 );   // no grid  = no bins + 1
604   pdf_grid[ 0 ] = max; 
605   pdf_grid[ noBinOfPDF ] = min; 
606   G4double log10_max = std::log10( max );
607   G4double log10_min = std::log10( min );
608   G4double log10_delta = log10_max - log10_min;
609   for ( G4int i = 1 ; i < noBinOfPDF ; i++ )
610   {
611      pdf_grid[i] = std::pow ( 10.0 , log10_max - log10_delta/10.0*(i) );   
612      //G4cout << "pdf i " << i << " " << pdf_grid[i] << G4endl;
613   }
614   
615   std::vector < G4double >  pdf;
616   pdf.resize( noBinOfPDF ); 
617
618   for ( G4int j=0 ; j < last ; j ++ )
619   {
620      for ( G4int i = 0 ; i < 11 ; i++ )
621      {
622         if ( largest_scores[j] >= pdf_grid[i+1] ) 
623         {
624            pdf[i] += 1.0 / ( pdf_grid[i] - pdf_grid[i+1] ) / n;
625            //G4cout << "pdf " << j << " " << i << " " <<  largest_scores[j]  << " " << G4endl;
626            break;
627         }
628      }
629   }
630
631   f_xi.resize( noBinOfPDF );
632   f_yi.resize( noBinOfPDF );
633   for ( G4int i = 0 ; i < noBinOfPDF ; i++ )
634   {
635      //G4cout << "pdf i " << i << " " <<  (pdf_grid[i]+pdf_grid[i+1])/2 << " " << pdf[i] << G4endl;
636      f_xi[i] = (pdf_grid[i]+pdf_grid[i+1])/2;
637      f_yi[i] = pdf[i];
638   }
639
640   //                                                  number of variables ( a and k ) 
641   minimizer = new G4SimplexDownhill<G4ConvergenceTester> ( this , 2 ); 
642   //G4double minimum =  minimizer->GetMinimum();
643   std::vector<G4double> mp = minimizer->GetMinimumPoint();
644   G4double k = mp[1];
645
646   //G4cout << "SLOPE " << 1/mp[1]+1 << G4endl;
647   //G4cout << "SLOPE  a " << mp[0] << G4endl;
648   //G4cout << "SLOPE  k " << mp[1] << G4endl;
649   //G4cout << "SLOPE  minimum " << minimizer->GetMinimum() << G4endl;
650
651   slope = 1/mp[1]+1;
652   if ( k < 1.0/9 )  // Please look Pareto distribution with "sigma=a" and "k"
653   {
654      slope = 10;
655   } 
656   if ( slope > 10 ) 
657   {
658      slope = 10; 
659   }
660}
661
662
663
664G4double G4ConvergenceTester::slope_fitting_function ( std::vector< G4double > x )
665{
666
667   G4double a = x[0];
668   G4double k = x[1];
669
670   if ( a <= 0 ) 
671   {
672      return 3.402823466e+38;  // FLOAT_MAX
673   } 
674   if ( k == 0 ) 
675   {
676      return 3.402823466e+38;  // FLOAT_MAX
677   }
678
679// f_xi and f_yi is filled at "calc_slope_fit"
680
681   G4double y = 0.0;
682   G4int i;
683   for ( i = 0 ; i < int ( f_yi.size() ) ; i++ )
684   {
685      //if ( 1/a * ( 1 + k * f_xi [ i ] / a ) < 0 )
686      if ( ( 1 + k * f_xi [ i ] / a ) < 0 )
687      {
688         //return 3.402823466e+38;  // FLOAT_MAX
689         y +=3.402823466e+38;  // FLOAT_MAX
690      }
691      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 ) );
692   }
693//   G4cout << "y = " << y << G4endl;
694
695   return y;
696}
Note: See TracBrowser for help on using the repository browser.