//$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
//             LOW ENERGY MUON SPIN RELAXATION, ROTATION, RADIATION 
//
//  ID    : LEMuSRMuonPhysics.hh , v 1.3
//  AUTHOR: Taofiq PARAISO
//  DATE  : 2006-01-19 16:15
//$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
//
//  &           &&&&&&&&&&                            &&&&&&&         &&&&&&&&
//  &           &                                   &&      &&       &       &&
//  &           &                   &      &       &                &       &&
//  &           &&&&&&&            &      &         &&&&&&         &&&&&&&&  
//  &           &                 &      &&                &      &      &&
//  &           &                &&     &  &     &&      &&      &        &
//  &&&&&&&&&&  &&&&&&&&&&      &  &&&&&    &&    &&&&&&&       &        &&   
//                             &
//                            &
//                           &
//                         &  
//                               MuonPhysics   
//$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$


#ifndef LEMuSRMuonPhysics_h
#define LEMuSRMuonPhysics_h 1

#include "globals.hh"
#include "G4ios.hh"

#include "G4VPhysicsConstructor.hh"
#include "G4MultipleScattering.hh"
#include "G4MultipleScattering52.hh"
#include "LEMuSRMSC.hh"
#include "G4MuBremsstrahlung.hh"
#include "G4MuPairProduction.hh"
#include "G4MuIonisation.hh"
#include "G4hIonisation.hh"

#include "G4MuonMinusCaptureAtRest.hh"

#include "G4DecayWithSpin.hh"
#include "G4MuonDecayChannel.hh"
#include "G4MuonDecayChannelWithSpin.hh"

#include "LEMuSRAtRestSpinRotation.hh"
#include "LEMuSRDecay.hh"

#include "LEMuSRMUONIUM.hh"
#include "LEMuSRDepolarize.hh"
#include "LEMuSRMUONIUMScatt.hh"



#include"G4VMuEnergyLoss.hh"
 
/*!
 * This class defines the interations and processes to take into account when
 * simulating muon particles. It is registered by the main LEMuSRPhysicsList
 * class.
 */
class LEMuSRMuonPhysics : public G4VPhysicsConstructor
{
  public: 
  //!\ct
    LEMuSRMuonPhysics(const G4String& name="muon");
  //!\dt
  virtual ~LEMuSRMuonPhysics();

  public: 
  /*! This method will be invoked in the Construct() method. 
    each particle type will be instantiated.*/
  virtual void ConstructParticle();
 
  /*! This method will be invoked in the Construct() method.
    each physics process will be instantiated and
    registered to the process manager of each particle type.*/ 
  virtual void ConstructProcess();

  protected:
  //! Muon physics
  G4MuIonisation        fMuPlusIonisation;
  //! Multiple scattering
  G4MultipleScattering fMuoniumMultipleScattering;
  //! Multiple Scattering including Meyer'Algorithm: LEMuSRMSC
  LEMuSRMSC   fMuPlusMultipleScattering;
  G4MuBremsstrahlung     fMuPlusBremsstrahlung ;
  G4MuPairProduction     fMuPlusPairProduction;
  //! Muonium scattering: LEMuSRMUONIUMScatt
  LEMuSRMUONIUMScatt fMuoniumScatt;
  //! Muonium formation: LEMuSRMUONIUM
  LEMuSRMUONIUM fMuFormation;
  //! Depolarization process (not used yet)
  LEMuSRDepolarize fDepolarization;
  G4MuIonisation         fMuMinusIonisation;
  G4MultipleScattering   fMuMinusMultipleScattering;
  G4MuBremsstrahlung     fMuMinusBremsstrahlung ;
  G4MuPairProduction     fMuMinusPairProduction;
  G4MuonMinusCaptureAtRest fMuMinusCaptureAtRest;


  //! Decay Process from \lemu: LEMuSRDecay
#ifdef ASYM_USE_LEMU
  LEMuSRDecay fDecayProcess;
#else   
  //! Decay Process from \gf
  G4Decay fDecayProcess;
  //! Decay Process with Spin from \gf
  G4DecayWithSpin fSDecayProcess;
#endif  

  //! Spin Precession Process At Rest: LEMuSRAtRestSpinRotation
  LEMuSRAtRestSpinRotation  fMuAtRestSpinRotation;

  //! Tau physics
  G4MultipleScattering   fTauPlusMultipleScattering;
  G4hIonisation          fTauPlusIonisation;
  G4MultipleScattering   fTauMinusMultipleScattering;
  G4hIonisation          fTauMinusIonisation;
 
};


#endif

