00001 #ifndef XeMath_h
00002 #define XeMath_h
00003 #include <set>
00004 #include "Math/Functor.h"
00005 #include "Math/BrentRootFinder.h"
00006 #include "XeCore.h"
00007 
00008 
00009 
00010 
00011 
00012 class XeMath : virtual public XeCore {
00013   
00014 public:
00015 
00016 
00017 
00018 
00019 
00020  ~XeMath();
00021 
00022 
00023 
00024 
00025   XeMath();
00026 
00027 
00028 
00029 
00030 
00031 
00032   static bool    equalizeVector(double *v, int n);
00033 
00034 
00035 
00036 
00037 
00038   static bool    equalizeVector(vector<double>&v);
00039 
00040 
00041 
00042 
00043 
00044 
00045 
00046   static bool    normalizeVector(double *vin, int n, double *vout=NULL);
00047 
00048 
00049 
00050 
00051 
00052   static bool    normalizeVector(vector<double>&v);
00053 
00054 
00055 
00056 
00057 
00058 
00059   static bool    normalizeVector(vector<double>&vin,vector<double>&vout);
00060 
00061 
00062 
00063 
00064 
00065 
00066   static double  vectorSum(double *v, int n);
00067 
00068 
00069 
00070 
00071   static bool    printVector(double *v, int n, string header="");
00072 
00073 
00074 
00075 
00076   static bool    printVector(vector<double>&v, string header="");
00077 
00078 
00079 
00080 
00081   static bool    printVector(int *v, int n, string header="");
00082 
00083 
00084 
00085 
00086   static bool    printVector(vector<int>&v, string header="");
00087 
00088 
00089 
00090 
00091 
00092 
00093   static double  vectorSum(vector<double>&v);
00094  
00095 
00096 
00097 
00098 
00099 
00100 
00101 
00102 
00103   static int    indexInterval(double v, double vMin, double vMax
00104                              ,int nInter, bool log=false);
00105 
00106 
00107 
00108 
00109 
00110 
00111 
00112   static double computePolynomial(double x, int n, double *coef);
00113 
00114 
00115 
00116 
00117 
00118     static string tValueName(double t);
00119 
00120   ClassDef(XeMath,1)
00121 };
00122 
00123 
00124 
00125 
00126 
00127 class XeTolerance: public XeMath {
00128 
00129   public :
00130 
00131 
00132 
00133 
00134 
00135    ~XeTolerance();
00136 
00137 
00138 
00139 
00140 
00141     XeTolerance(double epsilon);
00142 
00143 
00144 
00145 
00146 
00147 
00148 
00149 
00150     bool check(double d1,double d2,bool print=true);  
00151 
00152 
00153 
00154 
00155 
00156 
00157 
00158 
00159 
00160     bool check(double d1,double d2,double d3,bool print=true);  
00161 
00162 
00163 
00164 
00165 
00166 
00167 
00168 
00169 
00170 
00171     bool check(double d1,double d2,double d3, double d4, bool print=true);  
00172 
00173 
00174 
00175 
00176 
00177 
00178 
00179 
00180     bool check(double* d, int n,bool print=true);
00181 
00182 
00183 
00184 
00185 
00186 
00187     bool check(vector<double> &d, bool print=true);
00188 
00189   protected :
00190    
00191     double epsilon; 
00192 
00193 };
00194 
00195 
00196 
00197 
00198 
00199 class XeInterpolation: public XeMath {
00200 
00201   public : 
00202 
00203 
00204 
00205 
00206 
00207     XeInterpolation();
00208 
00209 
00210 
00211 
00212    ~XeInterpolation();
00213 
00214 
00215 
00216 
00217 
00218 
00219 
00220 
00221 
00222 
00223 
00224     static double interpolate(int mode,double *x,double *y,int n,double value);
00225 
00226 
00227 
00228 
00229 
00230 
00231 
00232 
00233 
00234     static double interpolate(int mode, double fraction, double y0, double y1);
00235  
00236 
00237 
00238 
00239 
00240 
00241 
00242 
00243 
00244     static double linear(double *x, double *y, int n, double value);
00245 
00246 
00247 
00248 
00249 
00250 
00251 
00252 
00253 
00254     static double linear(double *x, double *y, double value);
00255 
00256 
00257 
00258 
00259 
00260 
00261 
00262 
00263     static double linear(double fraction, double y0, double y1);
00264 
00265 
00266 
00267 
00268 
00269 
00270 
00271 
00272 
00273     static double parabolic(double *x, double *y, int n, double value);
00274 
00275 
00276 
00277 
00278 
00279 
00280 
00281 
00282 
00283     static double parabolic(double *x, double *y, double value);
00284 
00285 
00286 
00287 
00288 
00289 
00290 
00291 
00292     static double exponential(double fraction, double y0, double y1);
00293 };
00294 
00295 
00296 
00297 
00298 
00299 
00300 
00301 class XeBins : public XeObject {
00302 
00303   public:
00304 
00305 
00306 
00307 
00308                      XeBins();
00309 
00310 
00311 
00312 
00313 
00314                      XeBins(string name);
00315 
00316 
00317 
00318 
00319 
00320 
00321                      XeBins(string name, vector<double>& edges);
00322     virtual int      getBin(double x);
00323 
00324     int              getNBins();
00325     double           getCenter(int i);
00326     double           getLowerEdge();
00327     double           getUpperEdge();
00328     double           getLowerEdge(int i);
00329     double           getUpperEdge(int i);
00330     double*          getLowerEdges();
00331     double*          getUpperEdges();
00332 
00333     
00334 
00335 
00336 
00337     pair<int,double> getBinAndFraction(double x);
00338 
00339 
00340 
00341 
00342     virtual         ~XeBins();
00343 
00344 
00345 
00346 
00347     bool             printIt(int level=1);
00348     bool             contains(double value);
00349                     
00350     
00351 
00352 
00353                     
00354     void             extend(double xmin, double xmax);
00355     bool             isOk();
00356 
00357   protected:
00358 
00359     int              nBins;
00360     double           vMin;
00361     double           vMax;
00362     bool             ok;
00363     vector<double>   edges;
00364     map<double,int>  bins;   
00365 
00366     void             establishTheMap();
00367 
00368     ClassDef(XeBins,1)
00369 
00370 };
00371 
00372 
00373 
00374 
00375 
00376 class EquidistantBins : public XeBins {
00377 
00378 
00379     
00380 
00381 
00382                     
00383   public: 
00384 
00385 
00386 
00387 
00388    EquidistantBins();
00389    EquidistantBins(string what, int nBins,double a, double b);
00390 
00391 
00392 
00393 
00394    virtual ~EquidistantBins();
00395    int getBin(double value);
00396 
00397   protected :
00398 
00399     double          step;
00400     static string   getEquidistantName(string w,int n, double a, double b);
00401 
00402     ClassDef(EquidistantBins,1)
00403 
00404 };
00405 
00406 
00407 
00408 
00409 
00410 class EquiContentBins :public XeBins {
00411 
00412 
00413     
00414 
00415 
00416                     
00417   public:
00418 
00419 
00420 
00421 
00422 
00423    EquiContentBins();
00424    EquiContentBins(string what, int nBins, vector<double>* data
00425                    ,double vmin=VERY_SMALL, double vmax=VERY_LARGE);
00426 
00427 
00428 
00429 
00430    virtual  ~EquiContentBins();
00431   
00432   protected :
00433 
00434     static string   getEquiContentName(string w,int n);
00435     bool            fillFromMap(map<double,int>* data, int nBins, int n=0);
00436 
00437     ClassDef(EquiContentBins,1)
00438 
00439 };
00440 
00441 
00442 
00443 
00444 
00445 
00446 
00447 
00448 
00449 
00450 class ErRange;
00451 class YRange;
00452 class S1Range;
00453 class tValueRange;
00454 class VEscRange;
00455 class MassRange;
00456 class SigmaRange;
00457 class EventRange;
00458 class LinearRange;
00459 class LogRange;
00460 
00461 
00462 
00463 
00464 
00465 
00466 
00467 
00468 class XeRange : public XeMath, public XeObject {
00469 
00470 
00471  public:
00472 
00473 
00474     
00475 
00476 
00477                     
00478 
00479 
00480 
00481 
00482 
00483 
00484 
00485 
00486    XeRange(string what, int n,double a, double b,int mode);
00487    
00488 
00489 
00490 
00491    XeRange();
00492 
00493 
00494 
00495 
00496    virtual ~XeRange();
00497    
00498 
00499 
00500 
00501 
00502    int getMode();
00503 
00504 
00505 
00506 
00507    int getNPoints();  
00508 
00509 
00510 
00511 
00512    int getNBins();  
00513 
00514 
00515 
00516  
00517    int getReferenceIndex();
00518 
00519 
00520 
00521  
00522    double  getMin();
00523 
00524 
00525 
00526  
00527    double  getMax();
00528 
00529 
00530 
00531  
00532    double getStep();
00533 
00534 
00535 
00536 
00537    double getValue(int index);
00538 
00539 
00540 
00541 
00542 
00543    double* getValues();
00544 
00545 
00546 
00547 
00548 
00549    vector<double>* getTheValues();
00550 
00551 
00552 
00553 
00554    double centerOfBin(int index);
00555 
00556 
00557 
00558 
00559    double getNextValue(int index);
00560 
00561 
00562 
00563 
00564 
00565    pair<double,double> getInterval(int i);
00566 
00567 
00568 
00569 
00570    bool printIt(int level=1);
00571 
00572     
00573 
00574 
00575 
00576 
00577 
00578 
00579    static S1Range*     getDefaultS1Range();
00580 
00581 
00582 
00583 
00584    static ErRange*     getDefaultErRange();
00585 
00586 
00587 
00588 
00589    static YRange*      getDefaultYRange();
00590 
00591 
00592 
00593 
00594    static MassRange*   getDefaultMassRange();
00595 
00596 
00597 
00598 
00599    static tValueRange* getDefaultTValueRange();
00600 
00601 
00602 
00603 
00604    static VEscRange*   getDefaultVEscRange();
00605 
00606 
00607 
00608 
00609    static SigmaRange*  getDefaultSigmaRange();
00610 
00611 
00612 
00613 
00614    static EventRange*  getDefaultEventRange();
00615 
00616 
00617 
00618 
00619 
00620    XeRange* findDefaultRange();
00621 
00622 
00623 
00624  
00625    void  setReferenceIndex(double def);
00626               
00627 
00628 
00629 
00630  
00631    int getClosestIndex(double test);
00632               
00633 
00634 
00635 
00636 
00637    virtual int getIndex(double x)=0;
00638 
00639 
00640 
00641 
00642 
00643    virtual double computeValue(double fractIndex)=0;
00644 
00645 
00646 
00647 
00648 
00649    virtual double computeValue(int index)=0;
00650 
00651 
00652 
00653 
00654    bool           isLinear();
00655 
00656 
00657 
00658 
00659    bool           isLogarithmic();
00660 
00661 
00662 
00663 
00664    bool           isGeneral();
00665 
00666 
00667 
00668 
00669    bool operator==(const XeRange& other);
00670 
00671     
00672 
00673 
00674                     
00675 
00676 
00677 
00678    void           completeRange();
00679 
00680 
00681 
00682 
00683    static string  getTheName(string name,int n,double v0, double v1);
00684 
00685  protected:
00686 
00687    int            mode;           
00688    int            nPoints;        
00689    int            nBins;          
00690    int            referenceIndex; 
00691    double         lowest;         
00692    double         highest;        
00693    double         step;           
00694    vector<double> xs;             
00695 
00696    static S1Range      *defaultS1Range;     
00697    static ErRange      *defaultErRange;     
00698    static YRange       *defaultYRange;       
00699    static MassRange    *defaultMassRange;   
00700    static tValueRange  *defaultTValueRange; 
00701    static VEscRange    *defaultVEscRange;   
00702    static SigmaRange   *defaultSigmaRange;  
00703    static EventRange   *defaultEventRange;  
00704 
00705    ClassDef(XeRange,1)
00706 
00707  };
00708 
00709 
00710 
00711 
00712 class GeneralRange: public XeRange {
00713 
00714  public:
00715     
00716 
00717 
00718                     
00719 
00720 
00721 
00722 
00723 
00724 
00725    GeneralRange(string what, int n,double* values);
00726    
00727 
00728 
00729 
00730    GeneralRange();
00731 
00732 
00733 
00734 
00735    virtual ~GeneralRange();
00736 
00737 
00738 
00739 
00740 
00741    int     getIndex(double x);
00742    double  computeValue(int i);
00743    double  computeValue(double i);
00744    
00745 
00746 
00747 
00748 
00749 
00750    void    setValue(int index, double value);
00751 
00752     
00753 
00754 
00755                     
00756  protected: 
00757 
00758    map<double,int>  bins;   
00759 
00760    ClassDef(GeneralRange,1)
00761 
00762 };
00763 
00764 
00765 
00766 
00767 
00768 class LogRange : public XeRange {
00769 
00770  public:
00771 
00772 
00773 
00774 
00775 
00776 
00777 
00778 
00779    LogRange(string what, int n,double a, double b);
00780 
00781 
00782 
00783 
00784    LogRange();
00785 
00786 
00787 
00788 
00789   ~LogRange();
00790 
00791 
00792 
00793 
00794 
00795    int    getIndex(double x);
00796    double computeValue(int i);
00797    double computeValue(double i);
00798 
00799    ClassDef(LogRange,1)
00800 
00801 };
00802 
00803 
00804 
00805 
00806 
00807 class LinearRange : public XeRange {
00808 
00809  public:
00810 
00811     
00812 
00813 
00814                     
00815 
00816 
00817 
00818 
00819 
00820 
00821 
00822 
00823    LinearRange(string what, int n,double a, double b);
00824 
00825 
00826 
00827 
00828    LinearRange();
00829 
00830 
00831 
00832 
00833    virtual ~LinearRange();
00834 
00835 
00836 
00837 
00838 
00839    int    getIndex(double x);
00840    double computeValue(int i);
00841    double computeValue(double i);
00842  
00843 
00844 
00845 
00846 
00847 
00848 
00849     pair<int,double>    getIndexAndFraction(double x);
00850 
00851 
00852 
00853 
00854 
00855 
00856 
00857     pair<int,double>    getTolerantIndexAndFraction(double x);
00858 
00859    ClassDef(LinearRange,1)
00860 
00861 };
00862 
00863 
00864 
00865 
00866 
00867 
00868 class PRLMassRange : public  GeneralRange {
00869 
00870    public :
00871   
00872      STATIC_CONST  int    N_PRL_MASSES=38;
00873 
00874 
00875 
00876 
00877     ~PRLMassRange();
00878 
00879 
00880 
00881 
00882      PRLMassRange();
00883    
00884    protected:
00885 
00886      static double prlMasses[PRLMassRange::N_PRL_MASSES];
00887 
00888    ClassDef(PRLMassRange,1)
00889 };
00890 
00891 
00892 
00893 
00894 
00895 
00896 class MassRange : public  LogRange {
00897 
00898     
00899 
00900 
00901                     
00902    STATIC_CONST   int    DEFAULT_NM   =   25;
00903    STATIC_CONST   double DEFAULT_MMIN =    6;
00904    STATIC_CONST   double DEFAULT_MASS =   50;
00905    STATIC_CONST   double DEFAULT_MMAX = 1000;
00906    public :
00907      MassRange(int n=DEFAULT_NM,double m0=DEFAULT_MMIN,double m1=DEFAULT_MMAX);
00908 
00909 
00910 
00911 
00912     ~MassRange();
00913 
00914    ClassDef(MassRange,1)
00915 
00916 };
00917 
00918 
00919 
00920 
00921 
00922 class S1Range : public LinearRange {
00923 
00924     
00925 
00926 
00927                     
00928    STATIC_CONST   int    DEFAULT_N_PE   = 201;
00929    STATIC_CONST   double DEFAULT_PE_MIN =  0.;
00930    STATIC_CONST   double DEFAULT_PE_MAX = 50.;
00931    public :
00932      S1Range(int n=DEFAULT_N_PE,double p0=DEFAULT_PE_MIN,double p1=DEFAULT_PE_MAX);
00933 
00934 
00935 
00936 
00937     ~S1Range();
00938 
00939    ClassDef(S1Range,1)
00940 
00941 };
00942 
00943 
00944 
00945 
00946 class VEscRange : public LinearRange {
00947 
00948    STATIC_CONST   int    DEFAULT_NVESC   =  11;
00949    STATIC_CONST   double DEFAULT_VESCMIN = 500.;
00950    STATIC_CONST   double DEFAULT_VESC    = 544.;
00951    STATIC_CONST   double DEFAULT_VESCMAX=  600.;
00952   
00953  public :
00954 
00955      VEscRange(int n=DEFAULT_NVESC,double e0=DEFAULT_VESCMIN
00956               ,double e1=DEFAULT_VESCMAX);
00957 
00958 
00959 
00960 
00961      ~VEscRange();
00962 
00963    ClassDef(VEscRange,1)
00964 
00965 } ;
00966 
00967 
00968 
00969 
00970 class tValueRange : public LinearRange {
00971 
00972    STATIC_CONST   int    DEFAULT_NTVAL   =   9 ;
00973    STATIC_CONST   double DEFAULT_TVALMIN = -2.0;
00974    STATIC_CONST   double DEFAULT_TVAL    =   0.;
00975    STATIC_CONST   double DEFAULT_TVALMAX=   2.0;
00976   
00977  public :
00978 
00979      tValueRange(int n=DEFAULT_NTVAL,double e0=DEFAULT_TVALMIN
00980               ,double e1=DEFAULT_TVALMAX);
00981 
00982 
00983 
00984 
00985      ~tValueRange();
00986 
00987    ClassDef(tValueRange,1)
00988 
00989 } ;
00990 
00991 
00992 
00993 
00994 
00995 
00996 class ErRange : public LinearRange {
00997 
00998     
00999 
01000 
01001                     
01002    STATIC_CONST   int    DEFAULT_NER   =  201;
01003    STATIC_CONST   double DEFAULT_ERMIN =   0.;
01004    STATIC_CONST   double DEFAULT_ERMAX=  100.;
01005    public :
01006      ErRange(int n=DEFAULT_NER,double e0=DEFAULT_ERMIN,double e1=DEFAULT_ERMAX);
01007 
01008 
01009 
01010 
01011     ~ErRange();
01012 
01013    ClassDef(ErRange,1)
01014 
01015 };
01016 
01017 
01018 
01019 
01020 
01021 class SigmaRange : public LogRange {
01022 
01023     
01024 
01025 
01026                     
01027    STATIC_CONST   int    DEFAULT_NS    =     61;
01028    STATIC_CONST   double DEFAULT_SMIN  = 1.E-46;
01029    STATIC_CONST   double DEFAULT_SIGMA = 1.E-45;
01030    STATIC_CONST   double DEFAULT_SMAX  = 1.E-40;
01031    public :
01032      SigmaRange(int n=DEFAULT_NS,double s0=DEFAULT_SMIN,double s1=DEFAULT_SMAX);
01033 
01034 
01035 
01036 
01037     ~SigmaRange();
01038 
01039    ClassDef(SigmaRange,1)
01040 
01041 };
01042 
01043 
01044 
01045 
01046 
01047 class EventRange : public LinearRange {
01048 
01049     
01050 
01051 
01052                     
01053    STATIC_CONST   int    DEFAULT_NS   =   51;
01054    STATIC_CONST   double DEFAULT_SMIN =   0.;
01055    STATIC_CONST   double DEFAULT_SMAX =  10.;
01056    public :
01057      EventRange(int n=DEFAULT_NS,double s0=DEFAULT_SMIN
01058                      ,double s1=DEFAULT_SMAX);
01059 
01060 
01061 
01062 
01063     ~EventRange();
01064 
01065    ClassDef(EventRange,1)
01066 
01067 };
01068 
01069 
01070 
01071 
01072 
01073 
01074 
01075 class YRange : public LinearRange {
01076 
01077     
01078 
01079 
01080                     
01081    STATIC_CONST   int    DEFAULT_NY   =  51;
01082    STATIC_CONST   double DEFAULT_YMIN =  0.;
01083    STATIC_CONST   double DEFAULT_YMAX=  10.;
01084    public :
01085      YRange(int n=DEFAULT_NY,double y0=DEFAULT_YMIN,double y1=DEFAULT_YMAX);
01086 
01087 
01088 
01089 
01090     ~YRange();
01091 
01092    ClassDef(YRange,1)
01093 
01094 };
01095 
01096 
01097 
01098 
01099 
01100 
01101 
01102 class integrable : virtual public XeMath {
01103     
01104 
01105 
01106                     
01107   public:
01108 
01109 
01110 
01111 
01112                    integrable();
01113 
01114 
01115 
01116 
01117     virtual       ~integrable();
01118 
01119 
01120 
01121 
01122 
01123 
01124 
01125     double         integrate(int what ,double x0, double x1) ;
01126 
01127 
01128 
01129 
01130 
01131 
01132     virtual double getValue(int what,double x)=0;
01133 };
01134 
01135 
01136 
01137 
01138 
01139 
01140 
01141 class solvable: virtual public XeMath {
01142 
01143     
01144 
01145 
01146                     
01147   public:
01148 
01149 
01150 
01151 
01152                    solvable();
01153 
01154 
01155 
01156 
01157 
01158 
01159                    solvable(double xmin,double xmax);
01160 
01161 
01162 
01163 
01164     virtual       ~solvable();
01165 
01166 
01167 
01168     virtual double getValue(double x)=0;
01169 
01170 
01171 
01172 
01173 
01174 
01175     double Evaluate(double *x, double *p);
01176 
01177 
01178 
01179 
01180 
01181     double solve(double y);
01182 
01183 
01184 
01185 
01186 
01187   void   setSolverLimits(double xmi,double xma);
01188 
01189 
01190 
01191 
01192 
01193 
01194    void setLimits(double xmi,double xma);
01195 
01196   protected:
01197 
01198    double xmin;                               
01199    double xmax;                               
01200    double range;                                                 
01201    TF1*   theFunction;           
01202          
01203 };
01204 
01205 #endif