SinParameterTransformation.cxx

Go to the documentation of this file.
00001 // @(#)root/minuit2:$Id: SinParameterTransformation.cxx 28280 2009-04-20 14:08:59Z moneta $
00002 // Authors: M. Winkler, F. James, L. Moneta, A. Zsenei   2003-2005  
00003 
00004 /**********************************************************************
00005  *                                                                    *
00006  * Copyright (c) 2005 LCG ROOT Math team,  CERN/PH-SFT                *
00007  *                                                                    *
00008  **********************************************************************/
00009 
00010 #include "Minuit2/SinParameterTransformation.h"
00011 #include "Minuit2/MnMachinePrecision.h"
00012 
00013 #include <math.h>
00014 
00015 namespace ROOT {
00016 
00017    namespace Minuit2 {
00018 
00019 
00020 
00021 double SinParameterTransformation::Int2ext(double Value, double Upper, double Lower) const {
00022    // transformation from  to internal (unlimited) to external values (limited by Lower/Upper )
00023    return Lower + 0.5*(Upper - Lower)*(sin(Value) + 1.);
00024 }
00025 
00026 double SinParameterTransformation::Ext2int(double Value, double Upper, double Lower, const MnMachinePrecision& prec) const {
00027    // transformation from external (limited by Lower/Upper )  to internal (unlimited) values given the lower/upper limits
00028    
00029    double piby2 = 2.*atan(1.);
00030    double distnn = 8.*sqrt(prec.Eps2());
00031    double vlimhi = piby2 - distnn;
00032    double vlimlo = -piby2 + distnn;
00033    
00034    double yy = 2.*(Value - Lower)/(Upper - Lower) - 1.;
00035    double yy2 = yy*yy;
00036    if(yy2 > (1. - prec.Eps2())) {
00037       if(yy < 0.) {
00038          // Lower limit
00039          //       std::cout<<"SinParameterTransformation warning: is at its Lower allowed limit. "<<Value<<std::endl;
00040          return vlimlo;
00041       } else {
00042          // Upper limit
00043          //       std::cout<<"SinParameterTransformation warning: is at its Upper allowed limit."<<std::endl;
00044          return vlimhi;
00045       }
00046       
00047    } else {
00048       return asin(yy); 
00049    }
00050 }
00051 
00052 double SinParameterTransformation::DInt2Ext(double Value, double Upper, double Lower) const {
00053    // return the derivative of the transformation d Ext/ d Int
00054    return 0.5*((Upper - Lower)*cos(Value));
00055 }
00056 
00057    }  // namespace Minuit2
00058 
00059 }  // namespace ROOT

Generated on Tue Jul 5 14:37:11 2011 for ROOT_528-00b_version by  doxygen 1.5.1