00001 #ifndef XePhys_h
00002 #define XePhys_h
00003 #include "XeStat.h"
00004 #include "XeMath.h"
00005 
00006 
00007 
00008 
00009 
00010 
00011 
00012    enum  targetType {
00013          XE100_MIXTURE =  -3
00014        , DEPLETED      =  -2  
00015        , NATURAL       =  -1
00016        , NEUTRON       =   0
00017        , PROTON       
00018        , N_NUCLEONS   
00019        , XENON         =  54
00020        } ;
00021     
00022    const int N_XENON_MODES=3;
00023    const int XENON_MODES[N_XENON_MODES]={129,131,XE100_MIXTURE};
00024 
00025 
00026     const double 
00027         unity         = 1.
00028       , GeV           = unity                  
00029       , TeV           = 1.e3 *GeV
00030       , MeV           = 1.e-3*GeV
00031       , KeV           = 1.e-6*GeV           
00032       , eV            = 1.e-9*GeV
00033       , cm            = unity
00034       , fm            = 1.e-13*cm                  
00035       , cm2           = cm*cm               
00036       , barn          = 1.e-24*cm2              
00037       , mbarn         = 1.e-3*barn       
00038       , mubarn        = 1.e-6*barn       
00039       , nbarn         = 1.e-9*barn    
00040       , pbarn         = 1.e-12*barn   
00041       , fbarn         = 1.e-15*barn   
00042       , kg            = unity               
00043       , p_e           = unity               
00044       , day           = unity               
00045       ; 
00046 
00047 
00048     const double  
00049         PI            = 3.141592653589
00050       , C             = 299792.                    
00051       , GF            = 1.16637e-5                 
00052       , HBAR_C_FM     = .197327                    
00053       , HBAR_C_SQ_CM2 = HBAR_C_FM*HBAR_C_FM*fm*fm  
00054       , ATOMIC_MASS   = 0.93149                    
00055       , PROTON_MASS   = 0.93827                    
00056       , NEUTRON_MASS  = 0.93956                    
00057       ;
00058 
00059 
00060     const double 
00061 
00062         DEFAULT_V_0   = 220.                   
00063       , DEFAULT_V_ESC = 544.                   
00064       , DEFAULT_V_E   = 220.                   
00065       , DEFAULT_RHO   = 0.3                    
00066 
00067       , V_0_SCALE     = 230.                   
00068       , RHO_SCALE     = 0.4                    
00069       , SIGMA_0_SCALE = 1.*pbarn               
00070       , RATE_0        = 503.                   
00071       ;
00072 
00073 
00074     const double  
00075         DEFAULT_WIMP_MASS     = 50.            
00076       , DEFAULT_SIGMA_NUCLEON = 1E-45          
00077       ;
00078 
00079 
00080      const int    N_ERS_POINTS          =   1000 ;
00081      const double ERS_STEP              =    0.1 
00082                 , ERS_MAX               =    ERS_STEP * N_ERS_POINTS
00083                 ;
00084 
00085 
00086      const int    N_ER_POINTS      =   200 ;
00087      const double ER_STEP          =   0.5 
00088                 , ER_MAX           =   ER_STEP * N_ER_POINTS
00089                 ;
00090 
00091 
00092      const int    N_PE_POINTS             =  200  ;
00093      const double PE_STEP                 =  0.25  
00094                 , PE_MAX                  =   PE_STEP*N_PE_POINTS
00095                 ;
00096 
00097      const int    UNSMEARED_PE_MAX        =   60  
00098                 , UNSMEARED_PE_MIN        =    1  
00099                 , N_PE_NR_BACKGROUND =   75   
00100                 ;
00101 ;
00102 
00103      const bool     DEFAULT_SMEARING_PMT = true;
00104 
00105 
00106      enum           integrationMode{RATE};
00107  
00108 
00109 
00110 
00111    enum SPIN_CONTENT_MODEL   { RESSELL_BONN_SPIN
00112                              , RESSELL_NIJMEGEN_SPIN
00113                              , SCHWENK_SPIN
00114                              , SUHONEN_SPIN
00115                              , N_SPIN_CONTENT
00116                              } ;
00117 
00118     enum XENON_NUCLEUS       { XENON_129  
00119                              , XENON_131 
00120                              , N_S_NUCLEI 
00121                              } ;
00122 
00123     enum SI_INTERACTION_MODE { ENGEL_SI
00124                              , FRICK_SI
00125                              , SUHONEN_SI
00126                              , EXPONENTIAL_SI
00127                              , N_SI_FF
00128                              , DEFAULT_SI_FF = FRICK_SI
00129                              , N_COMPARE_SI = 3
00130                              } ;
00131 
00132 
00133    enum SD_INTERACTION_MODE { FF_SCHWENK_1BC        
00134                             , FF_SCHWENK_2BC       
00135                             , RESSELL_BONN        
00136                             , RESSELL_NIJMEGEN   
00137                             , SUHONEN_SD        
00138                             , FIRST_SD_SF
00139                             , SF_SCHWENK_1BC        =  FIRST_SD_SF
00140                             , SF_SCHWENK_2BC  
00141                             , N_SD_INTERACTIONS     =  SF_SCHWENK_2BC + 1
00142                             , N_SD_POLFF            =  RESSELL_NIJMEGEN + 1
00143                             , N_SD_FF               =  SUHONEN_SD + 1
00144                             , N_SD_SF               =  N_SD_INTERACTIONS-N_SD_FF
00145                             , N_SF_BANDS_COEFS      =  5 
00146                             , N_SCHWENK_Y           = 54
00147                             , N_SCHWENK_DELTA_A1    = 13 
00148                             , DEFAULT_SD_FF         =  FF_SCHWENK_1BC
00149                             , DEFAULT_SD_SF         =  SF_SCHWENK_2BC
00150                             , DEFAULT_SD_INTERACTION=  DEFAULT_SD_SF
00151                             } ;
00152 
00153       STATIC_CONST  int DEGREES_RESSELL        =  8 + 1 
00154                      , DEGREES_SCHWENK        =  9
00155                      , N_POLSD_COEFS          = 10
00156                      ;
00157  
00158       STATIC_CONST  int S00_SFACT              = 0
00159                      , S01_SFACT              = 1
00160                      , S11_SFACT              = 2
00161                      , N_SFACT                = 3
00162                      , S01_UPP                = 0
00163                      , S01_LOW                = 1
00164                      , S11_UPP                = 2
00165                      , S11_LOW                = 3
00166                      ;
00167 
00168 
00169 
00170 
00171 class XePhysics : virtual public XeMath, public XeObject {
00172   public:
00173    XePhysics();
00174    XePhysics(string name);
00175    virtual ~XePhysics();
00176    ClassDef(XePhysics,1)
00177 };
00178 
00179 
00180 
00181 
00182 
00183 
00184 
00185 
00186 class GalaxyModel : public XePhysics {
00187 
00188    public :
00189 
00190     
00191 
00192 
00193                     
00194      GalaxyModel( double rho=DEFAULT_RHO     , double v_0=DEFAULT_V_0
00195                 , double v_esc=DEFAULT_V_ESC , double v_e=DEFAULT_V_E ) ;
00196 
00197     
00198 
00199 
00200                     
00201      double getRho();
00202      double getV_E();
00203      double getV_0();
00204      double getV_ESC();
00205      double getVMax();
00206      double getRoverR0();
00207      double getK0overK1();
00208      void   setRho(double rho);
00209      void   setV_0(double v_0);
00210      void   setV_E(double v_e);
00211      void   setV_ESC(double v_esc);
00212     ~GalaxyModel();
00213 
00214     
00215 
00216 
00217                     
00218      double rateScale(double vmin);
00219 
00220    protected :
00221 
00222      double V_0;
00223      double V_ESC;
00224      double V_E;
00225      double RHO;
00226 
00227      double K0overK1;
00228      double RoverR0;
00229      void   updateKinematics();
00230 
00231      ClassDef(GalaxyModel,1)
00232 
00233 } ;
00234 
00235 
00236 
00237 
00238 
00239 
00240 
00241 
00242 
00243 class Wimp : public XePhysics {
00244   
00245   public  :
00246     
00247 
00248 
00249                     
00250     Wimp(double m=DEFAULT_WIMP_MASS);
00251 
00252     
00253 
00254 
00255                     
00256     double getMass();
00257     void   setMass(double m);
00258    ~Wimp();
00259 
00260   protected :
00261   
00262     double mass;
00263 
00264      ClassDef(Wimp,1)
00265 };
00266 
00267 
00268 
00269 
00270 
00271 
00272 
00273 
00274 class Nucleus : public XePhysics {
00275   
00276   public :
00277 
00278     
00279 
00280 
00281                     
00282 
00283 
00284 
00285 
00286 
00287     Nucleus(int n, int a=0);
00288 
00289     int    getA();
00290     int    getN();
00291     bool   printIt(int level=1);
00292     double getJ();
00293     double getMass();
00294 
00295     
00296 
00297 
00298                     
00299     double getOscillatorSizeSQ();
00300     double QtoEr(double Q);
00301     double QtoY(double Q);
00302     double ErtoQ(double Er);
00303     double ErtoY(double Er);
00304     static string nucleusName(int n,int a);
00305     static string spinName(double J);
00306     static double oscillatorParameterSQ(int A);
00307    ~Nucleus();
00308 
00309     
00310 
00311 
00312                     
00313     static int    hashCode(int n, int a);
00314     static bool   isValid(int n, int a,bool quiet=false);
00315     static int    nFromHashCode(int hash);
00316     static int    aFromHashCode(int hash);
00317 
00318   protected:
00319     
00320     STATIC_CONST  double B0=  41.467;
00321     STATIC_CONST  double B1=  45.000;
00322     STATIC_CONST  double B2=  25.000; 
00323 
00324     int    A                ;
00325     int    N                ;
00326     double J                ;
00327     double mass             ; 
00328     double oscillatorSizeSQ ; 
00329 
00330      ClassDef(Nucleus,1)
00331 };
00332 
00333 
00334 
00335 
00336 
00337 
00338 
00339 class LedererTable : public XePhysics {
00340 
00341    
00342     
00343 
00344 
00345                     
00346   public :
00347 
00348     static LedererTable* getInstance();
00349 
00350     LedererTable();
00351    ~LedererTable();
00352     Nucleus* getNucleus(int n, int a);
00353     Nucleus* getNucleus(int hash);
00354     bool     printIt(int level=1);
00355   
00356   protected :
00357 
00358     static LedererTable* instance;
00359     map<int,Nucleus*> nuclei;
00360 
00361     ClassDef(LedererTable,1)
00362 };
00363 
00364 
00365 
00366 
00367 class Interaction;
00368 
00369 
00370 
00371 
00372 
00373 
00374 
00375 class Target :public XePhysics, public integrable {
00376 
00377    public :
00378 
00379     
00380 
00381 
00382                     
00383 
00384 
00385 
00386 
00387 
00388 
00389                       Target(int n, int a=NATURAL);
00390 
00391 
00392 
00393 
00394      void             setWimpMass(double mass);
00395 
00396 
00397 
00398 
00399 
00400      void             setInteraction(Interaction* inter);
00401 
00402 
00403 
00404 
00405 
00406      double           ErMax();
00407 
00408 
00409 
00410 
00411      double           dRate(double Er);
00412 
00413 
00414 
00415 
00416      double           rate(double Ermin=0.,double Ermax=0.);
00417 
00418 
00419 
00420 
00421 
00422 
00423      XeGraph*         newGraphOfRate(ErRange* er=NULL);
00424 
00425     
00426 
00427 
00428                     
00429                       Target();
00430 
00431 
00432 
00433 
00434      void             setGalaxyModel(GalaxyModel* gal);
00435      void             setWimp(Wimp *w);
00436      bool             printIt(int level=1);
00437      void             printInteraction();
00438 
00439      void             add(Target* target,double fraction);
00440 
00441 
00442 
00443 
00444 
00445 
00446 
00447      void             add(int n, int a=0, double fraction=1.);
00448      double           getFraction(int n, int a);
00449      double           getWimpMass();
00450      map<int,double>& getFractions();
00451      Interaction*     getInteraction();
00452      GalaxyModel*     getGalaxyModel();
00453      Wimp*            getWimp();
00454 
00455      virtual         ~Target();
00456 
00457     
00458 
00459 
00460                     
00461      bool             checkIt();
00462      double           getValue(int mode, double x);
00463 
00464    protected : 
00465 
00466      map<int,double>  fractions;
00467      Interaction     *interaction;
00468      GalaxyModel     *galaxyModel;
00469      Wimp            *wimp;
00470      void             init();
00471  
00472     ClassDef(Target,1)
00473 }  ;
00474 
00475 
00476 
00477 
00478 
00479 
00480 
00481 
00482  
00483 class SpinContent :public XePhysics  {
00484 
00485   public:
00486 
00487     
00488 
00489 
00490                     
00491     static  string       getTheName(int m);
00492     static  string       getNucleusName(int n);
00493     static  SpinContent* getInstance(int model);
00494     static  int          getNucleus(int A);
00495     double               getProtonSpin(int A);
00496     double               getNeutronSpin(int A);
00497 
00498 
00499 
00500 
00501 
00502 
00503 
00504     double               getSpin(int nucleon, int A);
00505 
00506     
00507 
00508 
00509                     
00510   protected :
00511 
00512     static int           NUCLEI[N_S_NUCLEI];
00513     static double        SPIN_C[N_NUCLEONS][N_SPIN_CONTENT][N_S_NUCLEI];
00514            double        S_PROTON[N_S_NUCLEI];
00515            double        S_NEUTRON[N_S_NUCLEI];
00516            int           model;
00517 
00518     virtual             ~SpinContent();  
00519                          SpinContent(int model);  
00520     static  SpinContent* instances[N_SPIN_CONTENT];  
00521 
00522     ClassDef(SpinContent,1)
00523  
00524 };
00525 
00526 
00527 
00528 
00529 
00530 
00531 
00532 
00533 class StructureFunction :  public XePhysics {
00534 
00535   public :
00536 
00537     
00538 
00539 
00540                     
00541     virtual         ~StructureFunction();
00542                      StructureFunction();
00543 
00544 
00545 
00546                      StructureFunction(int w);
00547     virtual void     printCoefficients();
00548 
00549 
00550 
00551 
00552     virtual void     setBandEdge(int edge);
00553 
00554     
00555 
00556 
00557                     
00558     string           getNameWithEdge();
00559 
00560     virtual XeStyle* getStyle();                             
00561 
00562   protected:
00563 
00564     int              edge;
00565     int              what;
00566 
00567     ClassDef(StructureFunction,1)
00568  
00569 } ;
00570 
00571 
00572 
00573 
00574 
00575 
00576 class SIStructureFunction : public StructureFunction {
00577 
00578    public: 
00579 
00580     
00581 
00582 
00583                     
00584                     SIStructureFunction(int w);
00585      virtual       ~SIStructureFunction();
00586 
00587 
00588     ClassDef(SIStructureFunction,1)
00589  
00590 };
00591 
00592 
00593 
00594 
00595 
00596 
00597 class SDStructureFunction : public StructureFunction {
00598 
00599 
00600    public: 
00601 
00602     
00603 
00604 
00605                     
00606      XeGraph*       newGraphOfSA(Nucleus *nuc, int n, XeRange* yr=NULL);
00607 
00608     
00609 
00610 
00611                     
00612      static  double Coefs[N_SD_SF][N_S_NUCLEI][N_NUCLEONS][N_POLSD_COEFS];
00613      static  SDStructureFunction* getStructureFunction(int p=UNDEFINED_INT);
00614 
00615                     SDStructureFunction(int p);
00616      virtual       ~SDStructureFunction();
00617      virtual void   resetCoefficients();
00618      virtual double SA(Nucleus *nuc, double y, int nucleon, bool print=false)=0;
00619    
00620      double         getYMax();
00621 
00622    protected :
00623 
00624      double         yMax;
00625 
00626     ClassDef(SDStructureFunction,1)
00627 };
00628 
00629 
00630 
00631 
00632 
00633 
00634 class SchwenkSDStructureFunction: public SDStructureFunction{
00635 
00636     
00637 
00638 
00639                     
00640  public:
00641 
00642    static double    Bands[N_S_NUCLEI][N_NUCLEONS][2][N_POLSD_COEFS];
00643 
00644   ~SchwenkSDStructureFunction();
00645 
00646 
00647 
00648 
00649    SchwenkSDStructureFunction(int p);
00650 
00651    void             printCoefficients();
00652 
00653 
00654 
00655 
00656    void             setBandEdge(int edge);
00657    void             resetCoefficients();
00658    double*          getCoefficients(int A, int nucleon);
00659    double           SA(Nucleus *nuc, double y, int nucleon, bool print);
00660    XeStyle*         getStyle();
00661 
00662  protected:
00663   
00664    double           coefs[N_S_NUCLEI][N_NUCLEONS][N_POLSD_COEFS];
00665 
00666     ClassDef(SchwenkSDStructureFunction,1)
00667 };
00668 
00669 
00670 
00671 
00672 
00673 
00674 
00675 class FormFactor :  public XePhysics {
00676 
00677 
00678    public: 
00679 
00680     
00681 
00682 
00683                     
00684 
00685 
00686 
00687 
00688      virtual void     setBandEdge(int edge);
00689      virtual void     printCoefficients();
00690 
00691     
00692 
00693 
00694                     
00695      FormFactor();
00696      FormFactor(int w);
00697      virtual XeStyle* getStyle();                             
00698      virtual         ~FormFactor();
00699      string           getNameWithEdge();
00700 
00701    protected:
00702 
00703      int              edge;
00704      int              which;
00705 
00706     ClassDef(FormFactor,1)
00707  
00708 };
00709 
00710 
00711 
00712 
00713 
00714 class SuhonenTable : virtual public XeMath {
00715 
00716     
00717 
00718 
00719                     
00720    public: 
00721 
00722      STATIC_CONST  int N_POINTS=2001; 
00723      static double    U_TABLE[N_S_NUCLEI][N_POINTS][2+N_SFACT]; 
00724      static double    OMEGA_0[N_S_NUCLEI];
00725      static double    OMEGA_1[N_S_NUCLEI];
00726 
00727      virtual         ~SuhonenTable();
00728                       SuhonenTable();
00729      int              getIndex(double u);
00730      double           interpolate(double u, int n, int index, int coef) ;
00731      ClassDef(SuhonenTable,1)
00732      
00733 };
00734 
00735 
00736 
00737 
00738 
00739 
00740 
00741 class SIFormFactor :public FormFactor {
00742 
00743   
00744 
00745    public: 
00746 
00747     
00748 
00749 
00750                     
00751      static SIFormFactor *getFormFactor(int w=UNDEFINED_INT); 
00752      virtual             ~SIFormFactor();
00753                           SIFormFactor(int w);
00754      virtual double       computeFF(double q,Nucleus *nuc)=0;
00755 
00756     ClassDef(SIFormFactor,1)
00757  
00758 };
00759 
00760 
00761 
00762 
00763 
00764 class ExponentialFormFactor : public SIFormFactor{
00765 
00766     
00767 
00768 
00769                     
00770     protected: 
00771     
00772      STATIC_CONST  double Default_R0 = .3        ;
00773      STATIC_CONST  double Default_R1 = 0.91      ;
00774      STATIC_CONST  double Default_Coherence= 1.5 ;
00775 
00776      double R0       ;
00777      double R1       ;
00778      double Coherence;
00779 
00780    public: 
00781 
00782     ~ExponentialFormFactor();
00783      ExponentialFormFactor(double r0=Default_R0,double r1=Default_R1
00784                           ,double coherence=Default_Coherence); 
00785      void   setTheName();
00786      void   setR0(double r);
00787      void   setR1(double r);
00788      void   setCoherence(double c);
00789      double computeFF(double q, Nucleus* nuc); 
00790 
00791     ClassDef(ExponentialFormFactor,1)
00792  
00793 };
00794 
00795 
00796 
00797 
00798 
00799 class WoodsSaxonFormFactor : public SIFormFactor {
00800 
00801   
00802 
00803    public :
00804  
00805     
00806 
00807 
00808                     
00809       virtual ~WoodsSaxonFormFactor();
00810                WoodsSaxonFormFactor(int w);
00811       void     setThickness(int t);
00812       double   computeFFWell(double q, double r2);
00813 
00814    protected:
00815      
00816       STATIC_CONST  double defaultThickness=1.0 ;
00817       virtual void        setTheName()=0;
00818       double              thickness;
00819 
00820     ClassDef(WoodsSaxonFormFactor,1)
00821  
00822 };
00823 
00824 
00825 
00826 
00827 
00828 class EngelSIFormFactor : public WoodsSaxonFormFactor {
00829 
00830     
00831 
00832 
00833                     
00834    protected :
00835      STATIC_CONST  double defaultR0=1.2;
00836 
00837    public :
00838 
00839     
00840 
00841 
00842                     
00843      EngelSIFormFactor(double r0=defaultR0,double s=defaultThickness);
00844                     
00845     
00846 
00847 
00848                     
00849      void      setR0(double r0);
00850     ~EngelSIFormFactor();
00851 
00852     
00853 
00854 
00855                     
00856      XeStyle*  getStyle();
00857      void      setTheName();
00858      double    computeFF(double q, Nucleus* nuc) ;
00859 
00860 
00861    protected :
00862      double R0;
00863 
00864     ClassDef(EngelSIFormFactor,1)
00865 
00866 };
00867 
00868 
00869 
00870 
00871 
00872 class FrickSIFormFactor : public WoodsSaxonFormFactor {
00873 
00874     
00875 
00876 
00877                     
00878    protected :
00879 
00880      STATIC_CONST  double defaultThicknessF=.9 ;
00881      STATIC_CONST  double defaultThicknessA=.52;
00882      STATIC_CONST  double defaultR0=1.23;
00883      STATIC_CONST  double defaultR1=-0.6;
00884 
00885    public :
00886 
00887     
00888 
00889 
00890                     
00891      FrickSIFormFactor(double r0=defaultR0, double r1=defaultR1
00892                     ,double s=defaultThicknessF, double a=defaultThicknessA);
00893 
00894     
00895 
00896 
00897                     
00898      void      setR0(double r0);
00899      void      setR1(double r1);
00900      void      setThicknessA(double a);
00901 
00902     
00903 
00904 
00905                     
00906      double    computeFF(double q, Nucleus* nuc);
00907      void      setTheName();
00908      XeStyle*  getStyle();
00909      virtual ~FrickSIFormFactor();
00910 
00911    protected :
00912 
00913      double R0;
00914      double R1;  
00915      double thicknessA;  
00916 
00917     ClassDef(FrickSIFormFactor,1)
00918 
00919 };
00920 
00921 
00922 
00923 
00924 
00925 class SuhonenSIFormFactor : virtual public SIFormFactor
00926                           , virtual public SuhonenTable{
00927 
00928    public:
00929      
00930     
00931 
00932 
00933                     
00934      SuhonenSIFormFactor();
00935 
00936     
00937 
00938 
00939 
00940     ~SuhonenSIFormFactor();
00941                     
00942     
00943 
00944 
00945                     
00946      double computeFF(double y,Nucleus *nuc);
00947      XeStyle*  getStyle();
00948 
00949     ClassDef(SuhonenSIFormFactor,1)
00950 
00951 };
00952 
00953 
00954 
00955 
00956 
00957 
00958                                           
00959 class SDFormFactor : public FormFactor {
00960 
00961    public: 
00962 
00963     
00964 
00965 
00966                     
00967      static SDFormFactor* getFormFactor(int p=DEFAULT_SD_FF);
00968                           SDFormFactor(int p);
00969      XeGraph*             newGraphOfSA(Nucleus *nuc, int n, XeRange* yr=NULL);
00970      XeGraph*             newGraphOfFF(Nucleus *nuc, int n, XeRange* yr=NULL);
00971      XeGraph*             newGraphOfStructureFactor( Nucleus *nuc, int fc
00972                                                    , XeRange* yr=NULL);
00973 
00974     
00975 
00976 
00977                     
00978      static void          printStructureFactor(double *s);
00979      virtual             ~SDFormFactor();
00980    
00981      int                  preferredSpinModel(); 
00982      double               getYMax();
00983      void                 printDetailedStructureFactor( Nucleus *nuc
00984                                                       , XeRange* yr=NULL);
00985 
00986     
00987 
00988 
00989                     
00990      virtual void         resetCoefficients();
00991      virtual void         computeStructureFactor(Nucleus *nuc, double y 
00992                                                 , double *s)=0;
00993      double               FF(Nucleus *nuc, double y, double aN, double aP
00994                             , bool print=false);
00995      double               FF(Nucleus *nuc, double y, int nucleon
00996                             , bool print=false);
00997      double               SA(double* s ,double aN, double aP);
00998      double               SA(Nucleus *nuc, double y ,double aN, double aP
00999                             , bool print=false);
01000      double               SA(Nucleus *nuc, double y, int nucleon);
01001      bool                 checkIt();
01002      bool                 checkIt(Nucleus* nuc);
01003      static double        getAn(int mode);
01004      static double        getAp(int mode);
01005      static string        getStructureFactorName(int c);
01006      static string        getStructureFactorLaTeXName(int c);
01007 
01008    protected :
01009 
01010      double               yMax;
01011 
01012     ClassDef(SDFormFactor,1)
01013 
01014 };
01015  
01016 
01017 
01018 
01019 
01020 
01021                                           
01022 
01023 class PolynomialSDFormFactor : public SDFormFactor {
01024 
01025    public:
01026 
01027     
01028 
01029 
01030                     
01031     static double Coefs[N_SD_POLFF][N_S_NUCLEI][N_SFACT][N_POLSD_COEFS];
01032 
01033     virtual ~PolynomialSDFormFactor();
01034              PolynomialSDFormFactor(int p);
01035 
01036     void     resetCoefficients();
01037     void     computeStructureFactor(Nucleus *,double y,double *s);
01038     void     printCoefficients();
01039     double*  getCoefficients(int A, int which);
01040 
01041    protected :
01042 
01043      int    nDegrees;
01044      void   setParameters(string nam, int ncoefs, double yMax);
01045      double coefs[N_S_NUCLEI][N_SFACT][N_POLSD_COEFS];
01046 
01047     ClassDef(PolynomialSDFormFactor,1)
01048 
01049 };
01050                     
01051 
01052 
01053 
01054 
01055 
01056 class RessellBonnSDFormFactor: public PolynomialSDFormFactor{
01057   public:
01058 
01059     
01060 
01061 
01062                     
01063     RessellBonnSDFormFactor();
01064 
01065     
01066 
01067 
01068                     
01069    ~RessellBonnSDFormFactor();
01070 
01071     
01072 
01073 
01074                     
01075     XeStyle* getStyle();
01076 
01077     ClassDef(PolynomialSDFormFactor,1)
01078 
01079 };
01080 
01081 
01082 
01083 
01084 
01085 class RessellNijmegenSDFormFactor: public PolynomialSDFormFactor{
01086 
01087   public:
01088     
01089 
01090 
01091                     
01092     RessellNijmegenSDFormFactor();
01093     
01094 
01095 
01096                     
01097    ~RessellNijmegenSDFormFactor();
01098     
01099 
01100 
01101                     
01102     XeStyle* getStyle();
01103 
01104     ClassDef(RessellNijmegenSDFormFactor,1)
01105 };
01106 
01107 
01108 
01109 
01110 
01111 class Schwenk1bcFormFactor: public PolynomialSDFormFactor{
01112 
01113  public:
01114     
01115 
01116 
01117                     
01118    Schwenk1bcFormFactor();
01119 
01120     
01121 
01122 
01123                     
01124   ~Schwenk1bcFormFactor();
01125 
01126     
01127 
01128 
01129                     
01130    XeStyle* getStyle();
01131 
01132     ClassDef(Schwenk1bcFormFactor,1)
01133 
01134 };
01135 
01136 
01137 
01138 
01139 
01140 class Schwenk2bcFormFactor: public PolynomialSDFormFactor{
01141 
01142  public:
01143     
01144 
01145 
01146                     
01147    Schwenk2bcFormFactor();
01148 
01149 
01150     
01151 
01152 
01153                     
01154   ~Schwenk2bcFormFactor();
01155 
01156 
01157 
01158 
01159    void     setBandEdge(int edge);
01160 
01161     
01162 
01163 
01164                     
01165    XeStyle* getStyle();
01166    static double Bands[N_S_NUCLEI][N_SF_BANDS_COEFS][N_POLSD_COEFS];
01167 
01168     ClassDef(Schwenk2bcFormFactor,1)
01169 
01170 };
01171 
01172 
01173 class SchwenkDeltaA1  : public  XePhysics {
01174 
01175  public :
01176   
01177     
01178 
01179 
01180                     
01181    SchwenkDeltaA1();
01182    static XeGraph* newGraphOfSA( Nucleus*nuc, int nucleon, int delta_a1
01183                         , int normalizeTo=UNDEFINED_INT);
01184 
01185     
01186 
01187 
01188                     
01189   ~SchwenkDeltaA1();
01190    static void     getSA(double *sa, Nucleus* nuc, int nucleon, int delta_a1
01191                         , int normalizeTo=UNDEFINED_INT);
01192 
01193     
01194 
01195 
01196                     
01197    static double yValues[N_SCHWENK_Y];
01198    static double deltaA1Values[N_SCHWENK_DELTA_A1];
01199    static double SA_NP[N_S_NUCLEI][N_NUCLEONS][N_SCHWENK_Y][N_SCHWENK_DELTA_A1];
01200 
01201    static XeStyle* getStyle();
01202 
01203    
01204      ClassDef(SchwenkDeltaA1,1)
01205 
01206 };
01207 
01208 class SchwenkYRange : public GeneralRange {
01209    public :
01210 
01211     
01212 
01213 
01214                     
01215      SchwenkYRange(int nb=N_SCHWENK_Y);
01216     ~SchwenkYRange();
01217 
01218     ClassDef(SchwenkYRange,1)
01219 
01220 };
01221 
01222 
01223 
01224 
01225 
01226 class SuhonenSDFormFactor : virtual public SDFormFactor
01227                          , virtual public SuhonenTable {
01228 
01229    public :
01230 
01231     
01232 
01233 
01234                     
01235      SuhonenSDFormFactor();
01236 
01237     
01238 
01239 
01240                     
01241     ~SuhonenSDFormFactor();
01242 
01243     
01244 
01245 
01246                     
01247      XeStyle* getStyle();
01248      void computeStructureFactor(Nucleus *nuc,double y,double *s);
01249 
01250     ClassDef(SuhonenSDFormFactor,1)
01251 };
01252 
01253 
01254 
01255 
01256 
01257 
01258 
01259 class Interaction :  public XePhysics  {
01260 
01261   
01262    
01263   public :
01264 
01265 
01266     
01267 
01268 
01269                     
01270     virtual           ~Interaction();
01271                        Interaction(double s);
01272 
01273     
01274 
01275 
01276                     
01277     void               setSigmaNucleon(double s);
01278     virtual double     SigmaErNucleus(Wimp* wimp, Nucleus* nuc,double Er)=0;
01279     virtual            SpinContent* getSpinContent();
01280     bool               isSpinDependent();
01281     double             getSigmaNucleon();
01282     double             SigmaEr(Wimp* wimp, Target* target, double Er) ;
01283     double             QMax(Wimp* wimp,double V, Target* target);
01284     double             ErMax(Wimp* wimp, double V, Target* target);
01285     double             YMax(Wimp* wimp, double V, Target* target);
01286     FormFactor        *getFormFactor();
01287     void               setFormFactor(FormFactor* f);
01288     StructureFunction *getStructureFunction();
01289 
01290     
01291 
01292 
01293                     
01294     bool               withStructureFunction();
01295     bool               withFormFactor();
01296     void               updateKinematics(Wimp* wimp, Nucleus* nuc);
01297     string             getNameWithFF();
01298     string             getLegendFromFF();    
01299     XeStyle           *getStyleFromFF();
01300 
01301    protected :
01302   
01303     double             sigmaNucleon;
01304     double             m_D;
01305     int                A;
01306     double             m_A;
01307     double             mu_A;
01308     double             mu_p; 
01309     double             mu_n; 
01310     double             kin_p; 
01311     double             kin_n; 
01312     bool               spinDependent;
01313     FormFactor        *form;
01314     StructureFunction *structure;
01315  
01316     ClassDef(Interaction,1)
01317 
01318 } ;
01319 
01320 
01321 
01322 
01323 
01324 
01325 class SIInteraction : public Interaction {
01326 
01327   public :
01328 
01329     
01330 
01331 
01332                     
01333 
01334 
01335 
01336 
01337 
01338     SIInteraction(double s, SIFormFactor*f);
01339 
01340     
01341 
01342 
01343                     
01344    ~SIInteraction();
01345 
01346 
01347 
01348 
01349 
01350 
01351 
01352     SIInteraction(double s=DEFAULT_SIGMA_NUCLEON, int ff=DEFAULT_SI_FF);
01353 
01354 
01355 
01356 
01357 
01358 
01359 
01360     double               SigmaErNucleus(Wimp* wimp, Nucleus* nuc,double Er);
01361     SIStructureFunction *getSIStructureFunction();
01362     SIFormFactor        *getSIFormFactor();
01363 
01364     
01365 
01366 
01367                     
01368   protected :
01369 
01370     void setParameters(SIFormFactor *f);
01371 
01372     ClassDef(SIInteraction,1)
01373 
01374 };
01375 
01376 
01377 
01378 
01379 
01380 
01381 
01382 class SDInteraction : public Interaction {
01383   
01384   public :
01385 
01386     
01387 
01388 
01389                     
01390 
01391 
01392 
01393 
01394 
01395 
01396 
01397     SDInteraction(double s,double an,double ap,int what=UNDEFINED_INT);
01398 
01399 
01400 
01401 
01402 
01403 
01404     SDInteraction(double s,double an,double ap,SDFormFactor* f);
01405 
01406 
01407 
01408 
01409 
01410 
01411     SDInteraction(double s,double an,double ap,SDStructureFunction* sf);
01412 
01413     
01414 
01415 
01416                     
01417     virtual             ~SDInteraction();
01418 
01419 
01420 
01421 
01422 
01423     void                 setBandEdge(int edge);
01424     void                 setSpinContentModel(int m);
01425     void                 setFormFactor(SDFormFactor *f);
01426     void                 setStructureFunction(SDStructureFunction *sf);
01427     double               SigmaErNucleus(Wimp* wimp,Nucleus* nuc,double Er);
01428     SpinContent         *getSpinContent();
01429     SDFormFactor        *getSDFormFactor();
01430     SDStructureFunction *getSDStructureFunction();
01431 
01432     
01433 
01434 
01435                     
01436   protected :
01437 
01438     SpinContent         *spinContent;
01439     double               aN;
01440     double               aP;
01441     int                  nucleon;
01442     void                 setParameters(double an, double ap,SDFormFactor* f
01443                                       ,SDStructureFunction* sf);
01444 
01445     ClassDef(SDInteraction,1)
01446 
01447 };
01448    
01449 
01450 
01451 
01452 
01453 
01454 class SDPureInteraction: public SDInteraction {
01455 
01456   public  :
01457 
01458     
01459 
01460 
01461                     
01462     static   string getModeName(int m);
01463 
01464     virtual ~SDPureInteraction();
01465              SDPureInteraction(double s, int nucleon, SDFormFactor*f);
01466              SDPureInteraction(double s, int nucleon, SDStructureFunction* sf);
01467              SDPureInteraction(double s, int nucleon, int what);
01468 
01469     
01470 
01471 
01472                     
01473     string   getModeName();
01474 
01475   protected :
01476 
01477     void     setNucleon(int m);
01478 
01479     ClassDef(SDPureInteraction,1)
01480 
01481 }; 
01482 
01483 
01484 
01485 
01486 
01487 class SDPureProtonInteraction: public SDPureInteraction {
01488 
01489    public :
01490 
01491     
01492 
01493 
01494                     
01495     SDPureProtonInteraction(double s,SDFormFactor *f=NULL);
01496     SDPureProtonInteraction(double s,SDStructureFunction* sf);
01497 
01498     
01499 
01500 
01501                     
01502    ~SDPureProtonInteraction();
01503 
01504     ClassDef(SDPureProtonInteraction,1)
01505 
01506 };
01507 
01508 
01509 
01510 
01511 
01512 class SDPureNeutronInteraction: public SDPureInteraction {
01513 
01514    public :
01515 
01516     
01517 
01518 
01519                     
01520     SDPureNeutronInteraction(double s, SDFormFactor *f=NULL);
01521     SDPureNeutronInteraction(double s, SDStructureFunction* sf);
01522 
01523     
01524 
01525 
01526                     
01527    ~SDPureNeutronInteraction();
01528 
01529     ClassDef(SDPureNeutronInteraction,1)
01530 
01531 };
01532  
01533 
01534 #endif