#ifndef BRAT_BrUnits
#define BRAT_BrUnits
//  $Id: BrUnits.h,v 1.2 2001/07/27 09:25:26 nbi Exp $
//
//  $Log: BrUnits.h,v $
//  Revision 1.2  2001/07/27 09:25:26  nbi
//  Added inch used in BrDetectorParamsChk
//
//  Revision 1.1.1.1  2001/06/21 14:55:19  hagel
//  Initial revision of brat2
//
//  Revision 1.2  1999/01/21 23:23:20  hagel
//  1. Changed convention for checking includes.  Current convention is:
//     BRAT_Br...... eg BRAT_BrModule ala ROOT.
//  2. Added CVS logs to .h files that didn't have them.
//  3. Moved checking of include definition to first line for easier reading
//  4. Put checks before all includes in the include files as per BRAT specifications
//  5. Added BrGeantHeader to Geant Makefile
//  6. All changes have been checked to compile on NT ala Cygnus
//
//  Revision 1.1  1998/07/21 16:26:32  videbaek
//  Units constants added
//
//

#ifndef ROOT_Rtypes
#include "Rtypes.h"
#endif

#include <math.h>
//
// This could in fact be put in a proper  namespace rather than
// in a class. Do not know how to do this with ROOT and CINT at this
// point
//
class BrUnits {

 public:
  static const Double_t     pi;    // from <math.h>
  static const Double_t  twopi;
  static const Double_t halfpi;
  static const Double_t    pi2;
// 
// Length [L]
//
  static const Double_t millimeter;
  static const Double_t millimeter2;
  static const Double_t millimeter3;
  
  static const Double_t centimeter;
  static const Double_t centimeter2;
  static const Double_t centimeter3;

  static const Double_t meter;
  static const Double_t meter2;
  static const Double_t meter3;
  
  static const Double_t kilometer;
  static const Double_t kilometer2;
  static const Double_t kilometer3;
  
  static const Double_t micrometer;
  static const Double_t nanometer;
  static const Double_t femtometer;
  static const Double_t Fermi;
  
  static const Double_t      barn;
  static const Double_t millibarn;
  static const Double_t microbarn;
  static const Double_t  nanobarn;

  static const Double_t inch;
  
//
// Angle
//
  static const Double_t  radian;
  static const Double_t  milliradian;
  static const Double_t  degree;
  
  static const Double_t   steradian;

//
// Time [T]
//
  static const Double_t  nanosecond;
  static const Double_t      second;
  static const Double_t millisecond;
  
  static const Double_t     Hertz;
  static const Double_t kiloHertz;
  static const Double_t MegaHertz;
  
// but these are also unambiguous and unlikely to be used as variable!
  static const Double_t  Hz;
  static const Double_t kHz;
  static const Double_t MHz;
  
  //
  // Electric charge [Q]
  //
  static const Double_t eplus;   // electron posiitron charge
  static const Double_t e_SI;	// positron charge in coulomb
  static const Double_t Coulomb;

//
// Energy [E]
//
  static const Double_t MegaelectronVolt;
  static const Double_t     electronVolt;
  static const Double_t kiloelectronVolt;
  static const Double_t GigaelectronVolt;
  static const Double_t TeraelectronVolt;

// but these are also unambiguous and unlikely to be used as variables
  static const Double_t MeV;
  static const Double_t  eV;
  static const Double_t keV;
  static const Double_t GeV;
  static const Double_t TeV;
  
  static const Double_t Joule;

//
// Mass [E][T^2][L^-2]
//
  static const Double_t  kilogram;
  static const Double_t      gram;
  static const Double_t milligram;
  
//
// Power [E][T^-1]
//
  static const Double_t Watt;

//
// Force [E][L^-1]
//
  static const Double_t Newton;

//
// Pressure [E][L^-3]
//
// #define Pascal hep_pascal       // a trick to avoid warnings 
  static const Double_t Pascal;
  static const Double_t bar;
  static const Double_t atmosphere;

//
// Electric current [Q][T^-1]
//
  static const Double_t Ampere;

//
// Electric potential [E][Q^-1]
//
  static const Double_t MegaVolt;
  static const Double_t kiloVolt;
  static const Double_t     Volt;

//
// Electric resistance [E][T][Q^-2]
//
  static const Double_t Ohm;

//
// Electric capacitance [Q^2][E^-1]
//
  static const Double_t Farad;
  static const Double_t milliFarad;
  static const Double_t microFarad;
  static const Double_t  nanoFarad;
  static const Double_t  picoFarad;
  
//
// Magnetic Flux [T][E][Q^-1]
//
  static const Double_t Weber;

//
// Magnetic Field [T][E][Q^-1][L^-2]
//
  static const Double_t Tesla;

  static const Double_t Gauss;
  static const Double_t kiloGauss;

//
// Inductance [T^2][E][Q^-2]
//
  static const Double_t Henry;

//
// Temperature
//
  static const Double_t Kelvin; // 1.;

//
// Amount of substance
//
  static const Double_t mole; // 1.;

//
// Activity [T^-1]
//
  static const Double_t Becquerel; // 1./second;
  static const Double_t Curie; // 3.7e+10 * Becquerel;
 
//
// Absorbed dose [L^2][T^-2]
//
  static const Double_t Gray; // Joule/kilogram ;

//
// Miscellaneous
//
  static const Double_t perCent    ; // 0.01 ;
  static const Double_t perThousand; // 0.001;
  static const Double_t perMillion ; // 0.000001;

//
// c   = 299.792458 mm/ns
// c^2 = 898.7404 (mm/ns)^2 
//
static const Double_t c_light   ;  //2.99792458e+8 * m/s;
static const Double_t c_squared ;  //c_light * c_light;

//
// h     ;  //4.13566e-12 MeV*ns
// hbar  ;  //6.58212e-13 MeV*ns
// hbarc ;  //197.32705e-12 MeV*mm
//
static const Double_t h_Planck      ;  //6.6260755e-34 * joule*s;
static const Double_t hbar_Planck   ;  //h_Planck/twopi;
static const Double_t hbarc         ;  //hbar_Planck * c_light;
static const Double_t hbarc_squared ;  //hbarc * hbarc;

//
//
//
static const Double_t electron_charge ;  //- eplus; // see SystemOfUnits.h
static const Double_t e_squared ;  //eplus * eplus;

//
// amu_c2 - atomic equivalent mass unit
// amu    - atomic mass unit
//
static const Double_t electron_mass_c2 ;  //0.51099906 * MeV;
static const Double_t   proton_mass_c2 ;  //938.27231 * MeV;
static const Double_t  neutron_mass_c2 ;  //939.56563 * MeV;
static const Double_t           amu_c2 ;  //931.49432 * MeV;
static const Double_t              amu ;  //amu_c2/c_squared;

//
// permeability of free space mu0    = 2.01334e-16 Mev*(ns*eplus)^2/mm
// permittivity of free space epsil0 = 5.52636e+10 eplus^2/(MeV*mm)
//
static const Double_t mu0      ;  //4*pi*1.e-7 * henry/m;
static const Double_t epsilon0 ;  //1./(c_squared*mu0);

//
// electromagnetic coupling = 1.43996e-12 MeV*mm/(eplus^2)
//
static const Double_t elm_coupling           ;  //e_squared/(4*pi*epsilon0);
static const Double_t fine_structure_const   ;  //elm_coupling/hbarc;
static const Double_t classic_electr_radius  ;  //elm_coupling/electron_mass_c2;
static const Double_t electron_Compton_length ;  //hbarc/electron_mass_c2;
static const Double_t Bohr_radius ;  //electron_Compton_length/fine_structure_const;

static const Double_t alpha_rcl2 ;  //fine_structure_const
                                    //*classic_electr_radius
                                    //*classic_electr_radius;

static const Double_t twopi_mc2_rcl2 ;  //twopi*electron_mass_c2
                                    //*classic_electr_radius
                                    //*classic_electr_radius;
//
//
//
static const Double_t k_Boltzmann ;  //8.617385e-11 * MeV/kelvin;

//
//
//
static const Double_t STP_Temperature ;  //273.15*kelvin;
static const Double_t STP_Pressure    ;  //1.*atmosphere;
static const Double_t kGasThreshold   ;  //1.e-2*g/cm3;

};

#endif