]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - TGeant4/TG4PhysicsManager.cxx
Format() method added; changed Print() - usage of Format()
[u/mrichter/AliRoot.git] / TGeant4 / TG4PhysicsManager.cxx
index fe6e50debb81ca473039831c9ba7786b3056aa45..4a46d2a95a0e4d5b5a3822ebeb0ff01544e7e514 100644 (file)
@@ -1,25 +1,53 @@
 // $Id$
 // Category: physics
 //
+// Author: I. Hrivnacova
+//
+// Class TG4PhysicsManager
+// -----------------------
 // See the class description in the header file.
 
 #include "TG4PhysicsManager.h"
-#include "TG4PhysicsList.h"
-#include "TG4CutVector.h"
-#include "TG4FlagVector.h"
-#include "TG4G3Defaults.h"
+#include "TG4ModularPhysicsList.h"
+#include "TG4ParticlesManager.h"
+#include "TG4G3PhysicsManager.h"
+#include "TG4PhysicsConstructorGeneral.h"
+#include "TG4PhysicsConstructorEM.h"
+#include "TG4PhysicsConstructorMuon.h"
+#include "TG4PhysicsConstructorHadron.h"
+#include "TG4PhysicsConstructorIon.h"
+#include "TG4PhysicsConstructorOptical.h"
+#include "TG4PhysicsConstructorSpecialCuts.h"
+#include "TG4PhysicsConstructorSpecialControls.h"
+#include "TG4GeometryServices.h"
+#include "TG4G3Cut.h"
+#include "TG4G3Control.h"
+#include "TG4G3Units.h"
+#include "TG4Limits.h"
+#include "AliDecayer.h"
 
 #include <G4ParticleDefinition.hh>
+#include <G4OpBoundaryProcess.hh>
+#include <G4VProcess.hh>
+#include <G3MedTable.hh>
 
 #include <TDatabasePDG.h>
 
 TG4PhysicsManager* TG4PhysicsManager::fgInstance = 0;
 
-TG4PhysicsManager::TG4PhysicsManager()
-  : fLock(false),
-    fPhysicsList(0),
-    fCutVector(0),
-    fFlagVector(0) 
+//_____________________________________________________________________________
+TG4PhysicsManager::TG4PhysicsManager(TG4ModularPhysicsList* physicsList)
+  : TG4Verbose("physicsManager"),
+    fMessenger(this),
+    fPhysicsList(physicsList),
+    fDecayer(0),
+    fSetEMPhysics(true),
+    fSetMuonPhysics(true),
+    fSetHadronPhysics(false),
+    fSetOpticalPhysics(false),
+    fSetSpecialCutsPhysics(false),
+    fSetSpecialControlsPhysics(false)
+
 { 
 //
   if (fgInstance) {
@@ -28,59 +56,44 @@ TG4PhysicsManager::TG4PhysicsManager()
   }
       
   fgInstance = this;  
+  
+  // create particles manager
+  fParticlesManager = new TG4ParticlesManager();
       
-  // initialize fIsCutVector 
-  fIsCutVector = new TG4boolVector;
-  G4int i;
-  //for (i=0; i<kNofParticlesWSP; i++) fIsCutVector->insert(false);  
-  for (i=0; i<kNofParticlesWSP; i++) fIsCutVector->push_back(false);
-
-  // initialize fIsFlagVector 
-  fIsFlagVector = new TG4boolVector;
-  //for (i=0; i<kNofParticlesWSP; i++) fIsFlagVector->insert(false);
-  for (i=0; i<kNofParticlesWSP; i++) fIsFlagVector->push_back(false);
-
-  // define fCutNameVector
-  fG3CutNameVector.insert("CUTGAM");
-  fG3CutNameVector.insert("CUTELE");
-  fG3CutNameVector.insert("CUTNEU");
-  fG3CutNameVector.insert("CUTHAD");
-  fG3CutNameVector.insert("CUTMUO");
-  fG3CutNameVector.insert("BCUTE");
-  fG3CutNameVector.insert("BCUTM"); 
-  fG3CutNameVector.insert("DCUTE");
-  fG3CutNameVector.insert("DCUTM");
-  fG3CutNameVector.insert("PPCUTM");
-
-  // define fFlagNameVector
-  fG3FlagNameVector.insert("PAIR");
-  fG3FlagNameVector.insert("COMP");
-  fG3FlagNameVector.insert("PHOT");
-  fG3FlagNameVector.insert("PFIS");
-  fG3FlagNameVector.insert("DRAY");
-  fG3FlagNameVector.insert("ANNI");
-  fG3FlagNameVector.insert("BREM");
-  fG3FlagNameVector.insert("HADR");
-  fG3FlagNameVector.insert("MUNU");
-  fG3FlagNameVector.insert("DCAY");
-  fG3FlagNameVector.insert("LOSS");
-  fG3FlagNameVector.insert("MULS");
+  // create G3 physics manager
+  fG3PhysicsManager = new TG4G3PhysicsManager();
+
+  // fill process name map
+  // FillProcessMap();
 }
 
-TG4PhysicsManager::TG4PhysicsManager(const TG4PhysicsManager& right) {
+//_____________________________________________________________________________
+TG4PhysicsManager::TG4PhysicsManager()
+  : TG4Verbose("physicsManager"),
+    fMessenger(this) {
+//
+}
+
+//_____________________________________________________________________________
+TG4PhysicsManager::TG4PhysicsManager(const TG4PhysicsManager& right) 
+  : TG4Verbose("physicsManager"),
+    fMessenger(this) {
 // 
   TG4Globals::Exception(
     "Attempt to copy TG4PhysicsManager singleton.");
 }
 
+//_____________________________________________________________________________
 TG4PhysicsManager::~TG4PhysicsManager() {
 //
-  delete fIsCutVector;
-  delete fIsFlagVector;
+  delete fDecayer;
+  delete fParticlesManager;
+  delete fG3PhysicsManager;
 }
 
 // operators
 
+//_____________________________________________________________________________
 TG4PhysicsManager& 
 TG4PhysicsManager::operator=(const TG4PhysicsManager& right)
 {
@@ -95,103 +108,361 @@ TG4PhysicsManager::operator=(const TG4PhysicsManager& right)
           
 // private methods
 
-void TG4PhysicsManager::LockException() const
+//_____________________________________________________________________________
+void TG4PhysicsManager::FillProcessMap()
 {
-// Gives exception in case of attempt to modified physics
-// setup after physics manager was locked.
+// Fills fProcessMCMap.
+// The default G4 process names are used in the map.
+// Not used - the map is filled in physics constructors
+// only with processes that are really built.
 // ---
 
-  G4String text = "TG4PhysicsManager: \n";
-  text = text + "    It is too late to change physics setup. \n";
-  text = text + "    PhysicsManager has been already locked.";
-  TG4Globals::Exception(text);
-}
+  // multiple scattering
+  fProcessMCMap.Add("msc",  kPMultipleScattering);
+  fProcessMCMap.Add("Imsc", kPMultipleScattering);
+    
+  // continuous energy loss
+  // !! including delta rays
+  fProcessMCMap.Add("eIoni",  kPEnergyLoss);
+  fProcessMCMap.Add("IeIoni", kPEnergyLoss);
+  fProcessMCMap.Add("LowEnergyIoni", kPEnergyLoss);
+  fProcessMCMap.Add("hIoni",  kPEnergyLoss);
+  fProcessMCMap.Add("IhIoni", kPEnergyLoss);
+  fProcessMCMap.Add("hLowEIoni", kPEnergyLoss);
+  fProcessMCMap.Add("MuIoni", kPEnergyLoss);
+  fProcessMCMap.Add("IMuIonisation", kPEnergyLoss);
+  fProcessMCMap.Add("ionIoni",  kPEnergyLoss);
+  fProcessMCMap.Add("ionLowEIoni",  kPEnergyLoss);
+  fProcessMCMap.Add("PAIonisation",  kPEnergyLoss);
+  
+  // bending in mag. field
+  // kPMagneticFieldL
 
-G4int TG4PhysicsManager::GetPDGEncoding(G4ParticleDefinition* particle)
-{
-// Returns the PDG code of particle;
-// if standard PDG code is not defined the TDatabasePDG
-// is used.
-// ---
+  // particle decay
+  fProcessMCMap.Add("Decay", kPDecay);
+  
+  // photon pair production or
+  // muon direct pair production
+  fProcessMCMap.Add("conv", kPPair);
+  fProcessMCMap.Add("LowEnConversion", kPPair);
+  fProcessMCMap.Add("MuPairProd", kPPair);
+  fProcessMCMap.Add("IMuPairProduction", kPPair);
+
+  // Compton scattering
+  fProcessMCMap.Add("compt", kPCompton);
+  fProcessMCMap.Add("LowEnCompton", kPCompton);
+  fProcessMCMap.Add("polarCompt", kPCompton);
+
+  // photoelectric effect
+  fProcessMCMap.Add("phot", kPPhotoelectric);
+  fProcessMCMap.Add("LowEnPhotoElec", kPPhotoelectric);
+
+  // bremsstrahlung
+  fProcessMCMap.Add("eBrem", kPBrem);
+  fProcessMCMap.Add("IeBrem", kPBrem);
+  fProcessMCMap.Add("MuBrems", kPBrem);
+  fProcessMCMap.Add("IMuBremsstrahlung", kPBrem);
+  fProcessMCMap.Add("LowEnBrem", kPBrem);
+
+  // delta-ray production
+  // kPDeltaRay
+  // has to be distinguished from kPEnergyLoss on flight
+  
+  // positron annihilation
+  fProcessMCMap.Add("annihil", kPAnnihilation);
+  fProcessMCMap.Add("Iannihil", kPAnnihilation);
 
-  // get PDG encoding from G4 particle definition
-  G4int pdgEncoding = particle->GetPDGEncoding();
+  // hadronic interaction
+  // kPHadronic
 
-  if (pdgEncoding == 0) {
-    // get PDG encoding from TDatabasePDG
+  // nuclear evaporation
+  // kPEvaporation
   
-    // get particle name from the name map
-    G4String g4name = particle->GetParticleName();
-    G4String tname = fParticleNameMap.GetSecond(g4name);
-    if (tname == "Undefined") {
-      G4String text = "TG4PhysicsManager::GetPDGEncoding: \n";
-      text = text + "    Particle " + g4name;
-      text = text + " was not found in the name map.";
-      TG4Globals::Exception(text);
-    }  
+  // nuclear fission
+  // kPNuclearFission
+
+  // nuclear absorption
+  fProcessMCMap.Add("PionMinusAbsorptionAtRest", kPNuclearAbsorption);
+  fProcessMCMap.Add("PiMinusAbsorptionAtRest", kPNuclearAbsorption);
+  fProcessMCMap.Add("KaonMinusAbsorption", kPNuclearAbsorption);         
+  fProcessMCMap.Add("KaonMinusAbsorptionAtRest", kPNuclearAbsorption);         
   
-    // get particle from TDatabasePDG
-    TDatabasePDG* pdgDB = TDatabasePDG::Instance();
-    TParticlePDG* particle = pdgDB->GetParticle(tname);
-    if (!particle) {
-      G4String text = "TG4PhysicsManager::GetPDGEncoding: \n";
-      text = text + "    Particle " + tname;
-      text = text + " was not found in TDatabasePDG.";
-      TG4Globals::Exception(text);
-    }  
-    
-    // get PDG encoding
-    pdgEncoding = particle->PdgCode();
-  }
-    
-  return pdgEncoding;  
+  // antiproton annihilation
+  fProcessMCMap.Add("AntiProtonAnnihilationAtRest", kPPbarAnnihilation);
+  // fProcessMCMap.Add("AntiNeutronAnnihilationAtRest", not defined);
+
+  // neutron capture    
+  fProcessMCMap.Add("NeutronCaptureAtRest", kPNCapture);
+  // fProcessMCMap.Add("LCapture", hadron capture not defined);
+
+  // hadronic elastic incoherent scattering
+  fProcessMCMap.Add("LElastic", kPHElastic);
+
+  // hadronic inelastic scattering
+  fProcessMCMap.Add("inelastic", kPHInhelastic);
+
+  // muon nuclear interaction
+  fProcessMCMap.Add("MuNucl", kPMuonNuclear);
+
+  // exceeded time of flight cut
+  // kPTOFlimit
+  
+  // nuclear photofission
+  // kPPhotoFission
+
+  // Rayleigh scattering
+  fProcessMCMap.Add("Rayleigh Scattering", kPRayleigh);
+
+  // no mechanism is active, usually at the entrance of a new volume
+  fProcessMCMap.Add("Transportation", kPNull);
+
+  // particle has fallen below energy threshold and tracking stops
+  // kPStop
+  
+  // Cerenkov photon absorption
+  fProcessMCMap.Add("Absorption", kPLightAbsorption);
+
+  // Cerenkov photon reflection/refraction
+  // kPLightScattering, kPLightReflection, kPLightRefraction
+  // has to be inquired from the G4OpBoundary process
+
+  // synchrotron radiation
+  fProcessMCMap.Add("SynchrotronRadiation", kPSynchrotron);
 }  
-     
-G4int TG4PhysicsManager::GetPDGEncoding(G4String particleName)
+
+//_____________________________________________________________________________
+void TG4PhysicsManager::GstparCut(G4int itmed, TG4G3Cut par, G4double parval)
 {
-// Returns the PDG code of particle sepcified by name.
+// Sets special tracking medium parameter. 
+// It is applied to all logical volumes that use the specified 
+// tracking medium.
 // ---
 
-  G4ParticleTable* particleTable = G4ParticleTable::GetParticleTable();
+  // get medium from table
+  G3MedTableEntry* medium = G3Med.get(itmed);
+  if (!medium) {
+    G4String text = "TG4PhysicsManager::GstparCut: \n";
+    text = text + "    Medium not found."; 
+    G4Exception(text);
+  }  
 
-  G4ParticleDefinition* particle = 0;  
-  particle = particleTable->FindParticle(particleName);
-  if (!particle) {    
-    G4String text = "TG4PhysicsManager::GetPDGEncoding:\n";
-    text = text + "   G4ParticleTable::FindParticle() " + particleName;
-    text = text + " failed.";
-    TG4Globals::Exception(text);
-  }    
+  // get/create user limits
+  TG4Limits* limits 
+    = TG4GeometryServices::Instance()->GetLimits(medium->GetLimits());
+    
+  if (!limits) {
+    limits = new TG4Limits(*fG3PhysicsManager->GetCutVector(),
+                           *fG3PhysicsManager->GetControlVector());
+    medium->SetLimits(limits);
+
+    if (VerboseLevel() > 1) {
+      G4cout << "TG4PhysicsManager::GstparCut: new TG4Limits() for medium " 
+             << itmed << " has been created." << G4endl;  
+    }       
+  }       
+
+  // add units
+  if (par == kTOFMAX) parval *= TG4G3Units::Time();
+  else                parval *= TG4G3Units::Energy();
+
+  // set parameter
+  limits->SetG3Cut(par, parval);
+}
 
-  return GetPDGEncoding(particle);
-}  
+
+//_____________________________________________________________________________
+void TG4PhysicsManager::GstparControl(G4int itmed, TG4G3Control par, 
+                                      TG4G3ControlValue parval)
+{
+// Sets special tracking medium parameter. 
+// It is applied to all logical volumes that use the specified 
+// tracking medium.
+// ---
+
+  // get medium from table
+  G3MedTableEntry* medium = G3Med.get(itmed);
+  if (!medium) {
+    G4String text = "TG4PhysicsManager::GstparControl: \n";
+    text = text + "    Medium not found."; 
+    G4Exception(text);
+  }  
+
+  // get/create user limits
+  TG4Limits* limits 
+    = TG4GeometryServices::Instance()->GetLimits(medium->GetLimits());
+
+  if (!limits) {
+    limits = new TG4Limits(*fG3PhysicsManager->GetCutVector(),
+                           *fG3PhysicsManager->GetControlVector());
+    medium->SetLimits(limits);
+
+    if (VerboseLevel() > 1) {
+      G4cout << "TG4PhysicsManager::GstparControl: new TG4Limits() for medium" 
+             << itmed << " has been created." << G4endl;  
+    }       
+  }       
   
-void TG4PhysicsManager::SetCut(TG3Cut cut, G4double cutValue)
-{  
-// Sets kinetic energy cut (in a G3-like way).
+  // set parameter
+  limits->SetG3Control(par, parval);
+}
+
+// public methods
+
+//_____________________________________________________________________________
+void  TG4PhysicsManager::Gstpar(Int_t itmed, const char *param, Float_t parval) 
+{ 
+// Passes the tracking medium parameter to TG4Limits.
+// The tracking medium parameter is set only in case
+// its value is different from the "global" physics setup.
+// (If: CheckCut/ControlWithG3Defaults is used checking
+//  is performed with respect to G3 default values.)
+// When any cut/control parameter is set in limits
+// the physics manager is locked and the physics setup
+// cannot be changed.
+// Applying this TG4Limits to particles and physical
+// processes is still in development.
+//
+//  Geant3 desription:
+//  ==================
+//  To change the value of cut  or mechanism "CHPAR"
+//  to a new value PARVAL  for tracking medium ITMED
+//  The  data   structure  JTMED   contains  the   standard  tracking
+//  parameters (CUTS and flags to control the physics processes)  which
+//  are used  by default  for all  tracking media.   It is  possible to
+//  redefine individually  with GSTPAR  any of  these parameters  for a
+//  given tracking medium. 
+//  ITMED     tracking medium number 
+//  CHPAR     is a character string (variable name) 
+//  PARVAL    must be given as a floating point.
 // ---
 
-  if (!fCutVector) {
-    // create vector of kinetic energy cut values  
-    fCutVector = new TG4CutVector();
+  G4String name = TG4GeometryServices::Instance()->CutName(param); 
+  TG4G3Cut cut;
+  if (fG3PhysicsManager->CheckCutWithTheVector(name, parval, cut)) {
+      GstparCut(itmed, cut, parval);
+      fG3PhysicsManager->Lock();
   }  
-  fCutVector->SetG3Cut(cut, cutValue);
-  SwitchIsCutVector(cut);
-}  
+  else {
+    TG4G3Control control;
+    TG4G3ControlValue controlValue; 
+    if (fG3PhysicsManager
+         ->CheckControlWithTheVector(name, parval, control, controlValue)) {
+      GstparControl(itmed, control, controlValue);
+      fG3PhysicsManager->Lock();
+    } 
+    else if (cut==kNoG3Cuts && control==kNoG3Controls) { 
+      G4String text = "TG4PhysicsManager::Gstpar:";
+      text = text + name;
+      text = text + " parameter is not yet implemented.";
+      TG4Globals::Warning(text);
+    }  
+  }   
+} 
+//_____________________________________________________________________________
+void TG4PhysicsManager::CreatePhysicsConstructors()
+{
+// Creates the selected physics constructors
+// and registeres them in the modular physics list.
+// ---
 
-void TG4PhysicsManager::SetProcess(TG3Flag flag, G4int flagValue)
+  // general physics
+  fPhysicsList->RegisterPhysics(
+                    new TG4PhysicsConstructorGeneral(VerboseLevel()));
+
+  // electromagnetic physics
+  if (fSetEMPhysics) 
+    fPhysicsList->RegisterPhysics(
+                    new TG4PhysicsConstructorEM(VerboseLevel()));
+
+  // muon physics
+  if (fSetMuonPhysics && fSetEMPhysics)      
+    fPhysicsList->RegisterPhysics(
+                    new TG4PhysicsConstructorMuon(VerboseLevel()));
+
+  // hadron physics
+  if (fSetEMPhysics || fSetHadronPhysics) { 
+    fPhysicsList->RegisterPhysics(
+                    new TG4PhysicsConstructorIon(
+                          VerboseLevel(), fSetEMPhysics, fSetHadronPhysics));
+    fPhysicsList->RegisterPhysics(
+                    new TG4PhysicsConstructorHadron(
+                          VerboseLevel(), fSetEMPhysics, fSetHadronPhysics));
+  }  
+
+  // optical physics
+  if (fSetOpticalPhysics) 
+    fPhysicsList->RegisterPhysics(
+                    new TG4PhysicsConstructorOptical(VerboseLevel()));
+
+  // special processes
+  if (fSetSpecialCutsPhysics) 
+    fPhysicsList->RegisterPhysics(
+                    new TG4PhysicsConstructorSpecialCuts(VerboseLevel()));
+
+  if (fSetSpecialControlsPhysics) 
+    fPhysicsList->RegisterPhysics(
+                    new TG4PhysicsConstructorSpecialControls(VerboseLevel()));
+
+  // warn about not allowed combinations
+  if (fSetMuonPhysics && !fSetEMPhysics) {
+    G4String text = "TG4PhysicsManager::CreatePhysicsConstructors:\n";
+    text = text + "    Muon physics cannot be constructed without EM physics.\n";
+    text = text + "    SetMuon control was ignored.";
+    TG4Globals::Warning(text);     
+  }
+
+         // all created physics constructors are deleted
+        // in the TG4ModularPhysicsList destructor
+}    
+
+//_____________________________________________________________________________
+void TG4PhysicsManager::SetCut(const char* cutName, Float_t cutValue)
 {
-// Sets control process flag (in a G3-like way).
+// Sets the specified cut.
 // ---
 
-  if (!fFlagVector) {
-    // create vector of control process flag values
-    fFlagVector = new TG4FlagVector;
+  fG3PhysicsManager->CheckLock();
+  TG4G3Cut g3Cut = TG4G3CutVector::GetCut(cutName);
+
+  if (g3Cut == kNoG3Cuts) {
+    G4String text = "TG4PhysicsManager::SetCut:\n";
+    text = text + "    Parameter " + cutName;
+    text = text + " is not implemented.";
+    TG4Globals::Warning(text);
+    return;
   }  
-  fFlagVector->SetG3Flag(flag, flagValue);
-} 
+  
+  // add units
+  if (g3Cut == kTOFMAX) cutValue *= TG4G3Units::Time();
+  else                  cutValue *= TG4G3Units::Energy();
+
+  fG3PhysicsManager->SetCut(g3Cut, cutValue);    
+}  
+  
+//_____________________________________________________________________________
+void TG4PhysicsManager::SetProcess(const char* controlName, Int_t value)
+{
+// Sets the specified process control.
+// ---
 
+  fG3PhysicsManager->CheckLock();
+  TG4G3Control control = TG4G3ControlVector::GetControl(controlName);
+  
+  if (control != kNoG3Controls) {
+    TG4G3ControlValue controlValue 
+      = TG4G3ControlVector::GetControlValue(value, control);
+    fG3PhysicsManager->SetProcess(control, controlValue);
+  }  
+  else {   
+    G4String text = "TG4PhysicsManager::SetProcess:\n";
+    text = text + "    Parameter " + controlName;
+    text = text + " is not implemented.";
+    TG4Globals::Warning(text);
+  }  
+}  
 
+//_____________________________________________________________________________
 Float_t TG4PhysicsManager::Xsec(char* ch, Float_t p1, Int_t i1, Int_t i2)
 {
 // Not yet implemented -> gives exception.
@@ -203,6 +474,7 @@ Float_t TG4PhysicsManager::Xsec(char* ch, Float_t p1, Int_t i1, Int_t i2)
   return 0.;
 }    
   
+//_____________________________________________________________________________
 Int_t TG4PhysicsManager::IdFromPDG(Int_t pdgID) const
 {
 // G4 does not use the integer particle identifiers
@@ -212,6 +484,7 @@ Int_t TG4PhysicsManager::IdFromPDG(Int_t pdgID) const
   return pdgID;
 }  
 
+//_____________________________________________________________________________
 Int_t TG4PhysicsManager::PDGFromId(Int_t mcID) const
 {
 // G4 does not use integer particle identifiers
@@ -221,6 +494,7 @@ Int_t TG4PhysicsManager::PDGFromId(Int_t mcID) const
   return mcID;
 }  
 
+//_____________________________________________________________________________
 void  TG4PhysicsManager::DefineParticles()
 {
   // ======
@@ -269,482 +543,79 @@ void  TG4PhysicsManager::DefineParticles()
   // end of "common" implementation
   // ======
 
-  // map G4 particle names to TDatabasePDG names
-  // (the map is built only for particles that have not
-  //  defined standard PDG encoding)
-  
-  fParticleNameMap.Add("deuteron","Deuteron");
-  fParticleNameMap.Add("triton",  "Triton");
-  fParticleNameMap.Add("alpha",   "Alpha");
-  fParticleNameMap.Add("He3",     "HE3");
-  fParticleNameMap.Add("opticalphoton","Cherenkov");
-  // fParticleNameMap.Add("???","FeedbackPhoton");
-  fParticleNameMap.Add("geantino", "Rootino");
-  
-  // map G4 particle names to TDatabasePDG encodings
-  fParticlePDGMap.Add("deuteron", GetPDGEncoding("deuteron"));
-  fParticlePDGMap.Add("triton", GetPDGEncoding("triton"));
-  fParticlePDGMap.Add("alpha", GetPDGEncoding("alpha"));
-  fParticlePDGMap.Add("He3", GetPDGEncoding("He3") );
-  fParticlePDGMap.Add("opticalphoton", GetPDGEncoding("opticalphoton"));
-  // fParticlePDGMap.Add("???","FeedbackPhoton");
-  fParticleNameMap.Add("geantino", GetPDGEncoding("geantino"));
-
-  // add verbose
-  G4cout << "Particle maps have been filled." << G4endl;
-  //fParticleNameMap.PrintAll();
-  //fParticlePDGMap.PrintAll();
-}    
-
-void TG4PhysicsManager::SwitchIsCutVector(TG3Cut cut)
-{
-// Updates the vector of booleans (fIsCutVector) for the specified cut.
-// ---
-
-  switch (cut) {
-    case kCUTGAM: 
-           (*fIsCutVector)[kGamma] = true; 
-           break;
-    case kBCUTE:
-           (*fIsCutVector)[kGamma] = true; 
-           break;
-    case kBCUTM:
-           (*fIsCutVector)[kGamma] = true; 
-           break;
-    case kCUTELE:
-           (*fIsCutVector)[kElectron] = true; 
-           break;
-    case kDCUTE:
-           (*fIsCutVector)[kElectron] = true; 
-           break;
-    case kDCUTM:
-           (*fIsCutVector)[kElectron] = true; 
-           break;
-    case kCUTNEU:
-           (*fIsCutVector)[kNeutralHadron] = true; 
-           break;
-    case kCUTHAD:
-           (*fIsCutVector)[kChargedHadron] = true; 
-           break;
-    case kCUTMUO:
-           (*fIsCutVector)[kMuon] = true; 
-           break;
-    default:
-           break;
-  }
-}
-
-void TG4PhysicsManager::SwitchIsFlagVector(TG3Flag flag)
-{
-// Updates the vector of booleans (fIsFlagVector) for the specified flag.
-// ---
-
-  switch (flag) {
-    case kPAIR: 
-           // gamma
-           (*fIsFlagVector)[kGamma] = true; 
-           break;
-    case kCOMP:
-           // gamma
-           (*fIsFlagVector)[kGamma] = true; 
-          break;
-    case kPHOT:
-           // gamma
-           (*fIsFlagVector)[kGamma] = true; 
-          break;
-    case kPFIS:
-           // gamma
-           (*fIsFlagVector)[kGamma] = true; 
-          break;
-    case kDRAY:        
-           // all charged particles
-           (*fIsFlagVector)[kElectron] = true; 
-           (*fIsFlagVector)[kEplus] = true; 
-           (*fIsFlagVector)[kChargedHadron] = true; 
-           (*fIsFlagVector)[kMuon] = true; 
-          break;
-    case kANNI:
-          // e+ only
-           (*fIsFlagVector)[kEplus] = true; 
-          break;
-    case kBREM:
-          // e-/e+, muons
-           (*fIsFlagVector)[kElectron] = true; 
-           (*fIsFlagVector)[kEplus] = true; 
-           (*fIsFlagVector)[kMuon] = true; 
-          break;
-    case kHADR:
-          // hadrons
-           (*fIsFlagVector)[kNeutralHadron] = true; 
-           (*fIsFlagVector)[kChargedHadron] = true; 
-          break;
-    case kMUNU:
-           // muons
-           (*fIsFlagVector)[kMuon] = true; 
-          break;
-    case kDCAY:
-           // any
-           (*fIsFlagVector)[kAny] = true; 
-          break;
-    case kLOSS:
-           // all charged particles
-           (*fIsFlagVector)[kElectron] = true; 
-           (*fIsFlagVector)[kEplus] = true; 
-           (*fIsFlagVector)[kChargedHadron] = true; 
-           (*fIsFlagVector)[kMuon] = true; 
-          break;
-    case kMULS:
-           // all charged particles
-           (*fIsFlagVector)[kElectron] = true; 
-           (*fIsFlagVector)[kEplus] = true; 
-           (*fIsFlagVector)[kChargedHadron] = true; 
-           (*fIsFlagVector)[kMuon] = true; 
-          break;
-    default:
-          break;
-  }
-}
-
-TG3Cut TG4PhysicsManager::GetG3Cut(G4String cutName)
-{
-// Retrieves corresponding TG3Cut constant from the cutName.
-// ---
-
-  if      (cutName == fG3CutNameVector[kCUTGAM]) return kCUTGAM; 
-  else if (cutName == fG3CutNameVector[kBCUTE])  return kBCUTE; 
-  else if (cutName == fG3CutNameVector[kBCUTM])  return kBCUTM; 
-  else if (cutName == fG3CutNameVector[kCUTELE]) return kCUTELE;
-  else if (cutName == fG3CutNameVector[kDCUTE])  return kDCUTE;
-  else if (cutName == fG3CutNameVector[kDCUTM])  return kDCUTM;
-  else if (cutName == fG3CutNameVector[kCUTNEU]) return kCUTNEU;
-  else if (cutName == fG3CutNameVector[kCUTHAD]) return kCUTHAD;
-  else if (cutName == fG3CutNameVector[kCUTMUO]) return kCUTMUO;
-  else return kNoG3Cuts;
-}
-
-TG3Flag TG4PhysicsManager::GetG3Flag(G4String flagName)
-{
-// Retrieves corresponding TG3Flag constant from the flagName.
-// ---
-
-  if      (flagName == fG3FlagNameVector[kPAIR]) return kPAIR;
-  else if (flagName == fG3FlagNameVector[kCOMP]) return kCOMP;
-  else if (flagName == fG3FlagNameVector[kPHOT]) return kPHOT;
-  else if (flagName == fG3FlagNameVector[kPFIS]) return kPFIS;
-  else if (flagName == fG3FlagNameVector[kDRAY]) return kDRAY;
-  else if (flagName == fG3FlagNameVector[kANNI]) return kANNI;
-  else if (flagName == fG3FlagNameVector[kBREM]) return kBREM;
-  else if (flagName == fG3FlagNameVector[kHADR]) return kHADR;
-  else if (flagName == fG3FlagNameVector[kMUNU]) return kMUNU;
-  else if (flagName == fG3FlagNameVector[kDCAY]) return kDCAY;
-  else if (flagName == fG3FlagNameVector[kLOSS]) return kLOSS;
-  else if (flagName == fG3FlagNameVector[kMULS]) return kMULS;
-  else return kNoG3Flags;
-}
-
-// public methods
-
-void TG4PhysicsManager::BuildPhysics()
-{
-// Empty function - not needed in G4.
-// (Physics is built within /run/initialize.)
-
-  TG4Globals::Warning(
-    "TG4PhysicsManager::BuildPhysics: is empty function in G4 MC.");
+  fParticlesManager->MapParticles();
 }    
 
-void TG4PhysicsManager::SetCut(const char* cutName, Float_t cutValue)
-{
-// Sets the specified cut.
-// ---
-
-  if (fLock) LockException();
-  TG3Cut g3Cut = GetG3Cut(cutName);
-  if (g3Cut != kNoG3Cuts)
-    SetCut(g3Cut, cutValue);
-  else {   
-    G4String text = "TG4PhysicsManager::SetCut:\n";
-    text = text + "    Parameter " + cutName;
-    text = text + " is not implemented.";
-    TG4Globals::Warning(text);
-  }  
-}  
-  
-void TG4PhysicsManager::SetProcess(const char* flagName, Int_t flagValue)
-{
-// Sets the specified process control.
-// ---
-
-  if (fLock) LockException();
-  TG3Flag g3Flag = GetG3Flag(flagName);
-  if (g3Flag != kNoG3Flags)
-    SetProcess(g3Flag, flagValue);
-  else {   
-    G4String text = "TG4PhysicsManager::SetProcess:\n";
-    text = text + "    Parameter " + flagName;
-    text = text + " is not implemented.";
-    TG4Globals::Warning(text);
-  }  
-}  
-
+//_____________________________________________________________________________
 void TG4PhysicsManager::SetProcessActivation()
 {
 // (In)Activates built processes according
-// to the setup in fFlagVector.
+// to the setup in TG4G3PhysicsManager::fControlVector.
 // ---
 
-  if (fPhysicsList) {
-    // temporarily excluded
-    // fPhysicsList->SetProcessActivation();
-  }  
-  else {
-    G4String text = "TG4PhysicsManager::SetProcessActivation:\n";
-    text = text +   "   There is no physics list set.";
-    TG4Globals::Exception(text);
-  }
+  fPhysicsList->SetProcessActivation();
 }       
 
-G4int TG4PhysicsManager::GetPDGEncodingFast(G4ParticleDefinition* particle)
-{
-// Returns the PDG code of particle;
-// if standard PDG code is not defined the preregistred
-// fParticlePDGMap is used.
-// ---
-
-  // get PDG encoding from G4 particle definition
-  G4int pdgEncoding = particle->GetPDGEncoding();
-
-  if (pdgEncoding == 0) {
-    // use FParticlePDGMap if standard PDG code is not defined
-    G4String name = particle->GetParticleName();
-    pdgEncoding = fParticlePDGMap.GetSecond(name);
-  }
-    
-  return pdgEncoding;  
-}  
-     
-G4bool TG4PhysicsManager::CheckCutWithCutVector(G4String name, 
-                             G4double value, TG3Cut& cut)
-{
-// Retrieves corresponding TG3Cut from the name and 
-// in case the value is different from the value in cutVector
-// sets true the value of the fIsCutVector element 
-// corresponding to this cut and returns true; 
-// returns false otherwise.
-// ---
-
-  // convert cut name -> TG3Cut
-  cut = GetG3Cut(name);
-
-  // set switch vector element only if the value
-  // is different from the value in cutVector
-  if (cut !=kNoG3Cuts) {
-    // get tolerance from TG4G3Defaults in GeV
-    G4double tolerance = TG4G3Defaults::CutTolerance()/GeV;
-    if (!(fCutVector) || (abs(value - (*fCutVector)[cut]) > tolerance)) {
-      SwitchIsCutVector(cut);      
-      return true;
-    }  
-    else return false;  
-  }                     
-  return false;
-}
 
-G4bool TG4PhysicsManager::CheckFlagWithFlagVector(G4String name, 
-                              G4double value, TG3Flag& flag)
+//_____________________________________________________________________________
+AliMCProcess TG4PhysicsManager::GetMCProcess(const G4VProcess* process)
 {
-// Retrieves corresponding TG3Flag from the name and 
-// in case the value is different from the value in flagVector
-// sets true the value of the fIsFlagVector element 
-// corresponding to this flag and returns true; 
-// returns false otherwise.
+// Returns the AliMCProcess code of the specified G4 process.
 // ---
+  if (!process) return kPNoProcess;
 
-  // convert flag name -> TG3Flag
-  flag = GetG3Flag(name);
-
-  // set switch vector element only if the value
-  // is different from the value in flagVector
-  if (flag !=kNoG3Flags) {
-    if (!(fFlagVector) || (abs(value - (*fFlagVector)[flag]) > 0.01)) {
-      SwitchIsFlagVector(flag);      
-      return true;
-    }  
-    else return false;  
-  }                     
-  return false;
+  return fProcessMCMap.GetMCProcess(process);
 }
 
-G4bool TG4PhysicsManager::CheckCutWithG3Defaults(G4String name, 
-                              G4double value, TG3Cut& cut)
+//_____________________________________________________________________________
+AliMCProcess TG4PhysicsManager::GetOpBoundaryStatus(const G4VProcess* process)
 {
-// Retrieves corresponding TG3Cut from the name and 
-// in case the value is different from the G3 default value
-// sets true the value of the SwitchCutVector element 
-// corresponding to this cut and returns true; 
-// returns false otherwise.
+// Returns the AliMCProcess code according to the OpBoundary process
+// status.
 // ---
+  if (!process) return kPNoProcess;
 
-  // convert cut name -> TG3Cut
-  cut = GetG3Cut(name);
-
-  // set switch vector element only if the value
-  // is different from G3 default
-  if (cut !=kNoG3Cuts) {
-    if (!TG4G3Defaults::IsDefaultCut(cut, value)) {
-      SwitchIsCutVector(cut);      
-      return true;
-    }  
-    else return false;  
-  }                     
-  return false;
-}
-
-G4bool TG4PhysicsManager::CheckFlagWithG3Defaults(G4String name, 
-                              G4double value, TG3Flag& flag)
-{
-// Retrieves corresponding TG3Flag from the name and 
-// in case the value is different from the G3 default value
-// sets true the value of the SwitchFlagVector element 
-// corresponding to this flag and returns true; 
-// returns false otherwise.
-// ---
-
-  // convert flag name -> TG3Flag
-  flag = GetG3Flag(name);
-
-  // set switch vector element only if the value
-  // is different from G3 default
-  if (flag !=kNoG3Flags) {
-    if (!TG4G3Defaults::IsDefaultFlag(flag, value)) {
-      SwitchIsFlagVector(flag);      
-      return true;
-    }  
-    else return false;  
-  }                     
-  return false;
-}
-
-void TG4PhysicsManager::SetG3DefaultCuts() 
-{
-// Sets G3 default values of kinetic energy cuts.
-// ---
-
-  if (fLock) LockException();
-  if (!fCutVector) {
-    // create vector of kinetic energy cut values  
-    fCutVector = new TG4CutVector();
-  }  
-  fCutVector->SetG3Defaults();
-}
-
-void TG4PhysicsManager::SetG3DefaultProcesses()
-{
-// Sets G3 default values of control process flags.
-// ---
-
-  if (fLock) LockException();
-  if (!fFlagVector) {
-    // create vector of control process flag values
-    fFlagVector = new TG4FlagVector;
-  }  
-  fFlagVector->SetG3Defaults();
-}  
-
-G4bool TG4PhysicsManager::IsSpecialCuts() const
-{
-// Returns true if any special cut value is set.
-// ---
-
-  for (G4int i=0; i<kNofParticlesWSP; i++)
-  {  if ((*fIsCutVector)[i]) return true; }
-
-  return false;
-}
-
-G4bool TG4PhysicsManager::IsSpecialFlags() const
-{
-// Returns true if any special flag value is set.
-// ---
-
-  for (G4int i=0; i<kNofParticlesWSP; i++)
-  {  if ((*fIsFlagVector)[i]) return true; }
-
-  return false;
-}
-
-TG3ParticleWSP TG4PhysicsManager::GetG3ParticleWSP(
-                                  G4ParticleDefinition* particle) const 
-{
-// Returns TG3ParticleWSP constant for the specified particle.
-// (See TG3ParticleWSP.h, too.)
-// ---
-
-  G4String name = particle->GetParticleName();     
-  G4String pType = particle->GetParticleType();
+#ifdef TGEANT4_DEBUG
+  G4OpBoundaryProcess* opBoundary
+    = dynamic_cast<G4OpBoundaryProcess*>(process);
     
-  if (name == "gamma") {
-    return kGamma;
-  }  
-  else if (name == "e-") {    
-    return kElectron;
-  }  
-  else if (name == "e+") {   
-    return kEplus;
-  }  
-  else if (( pType == "baryon" || pType == "meson" || pType == "nucleus" )) {
-    if (particle->GetPDGCharge() == 0) { 
-      return kNeutralHadron;
-    }
-    else  
-      return kChargedHadron;
-  }    
-  else if ( name == "mu-" || name == "mu+" ) {
-    return kMuon;
-  }  
-  else {
-    return kNofParticlesWSP;
-  }    
-}  
-
-void TG4PhysicsManager::GetG3ParticleWSPName(G4int particleWSP,
-                                             G4String& name) const 
-{
-// Fills the passed name with the name/type of particle specified
-// by TG3ParticleWSP constant.
-// (See TG3ParticleWSP.h, too.)
-// ---
-
-  switch (particleWSP) {
-    case kGamma:
-      name = "Gamma";
-      break;
-    case kElectron:
-      name = "Electron";
-      break;
-    case kEplus:
-      name = "Eplus";
-      break;
-    case kNeutralHadron:
-      name = "NeutralHadron";
-      break;
-    case kChargedHadron:
-      name = "ChargedHadron";
-      break;
-    case kMuon:
-      name = "Muon";
-      break;
-    case kAny:
-      name = "Any";
-      break;
-    case kNofParticlesWSP:
-      name = "NoSP";
-      break;
-    default:
-      G4String text = "TG4PhysicsList::GetG3ParticleWSPName:\n";
-      text = text + "   Wrong particleWSP."; 
-      TG4Globals::Exception(text);
-      break;      
+  if (!opBoundary) 
+    TG4Globals::Exception(
+      "TG4PhysicsManager::GetOpBoundaryStatus: Wrong process type.");
+    return kPNoProcess;
   }
-}  
+  
+  return opBoundary;  
+#else
+  G4OpBoundaryProcess* opBoundary = (G4OpBoundaryProcess*)process;
+#endif  
+
+  switch (opBoundary->GetStatus()) {
+    // reflection
+    case FresnelReflection: 
+    case TotalInternalReflection:
+    case LambertianReflection: 
+    case LobeReflection:
+    case SpikeReflection: 
+    case BackScattering:
+       return kPLightReflection;
+       ;;
+
+    // refraction
+    case FresnelRefraction: 
+       return kPLightReflection;
+       ;;
+
+    // absorption
+    case Absorption:
+    case Detection: 
+       return kPLightAbsorption;
+       ;;
+  }
+  
+  // should not happen
+  return kPNoProcess;
+}