]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - TGeant4/TG4PhysicsConstructorHadron.cxx
Cosmetic
[u/mrichter/AliRoot.git] / TGeant4 / TG4PhysicsConstructorHadron.cxx
index 96aa3bc63905b4afc6c85ffb00654caf9f42acc2..bce1cab7cbde97bd08c776a51e8893f99e7f5082 100644 (file)
 // $Id$
 // Category: physics
 //
-// According to corresponding part of:
-// ExN04PhysicsList.cc,v 1.7 1999/12/15 14:49:26 gunter
-// GEANT4 tag Name: geant4-01-01
+// Author: I. Hrivnacova
+//
+// Class TG4PhysicsConstructorHadron
+// ---------------------------------
+// See the class description in the header file.
+// According to ExN04HadronPhysics.cc,v 1.1.2.1 2001/06/28 19:07:37 gunter Exp
+// GEANT4 tag Name: geant4-03-02
 
 #include "TG4PhysicsConstructorHadron.h"
+#include "TG4ProcessControlMap.h"
+#include "TG4ProcessMCMap.h"
+#include "TG4Globals.h"
 
 #include <G4ParticleDefinition.hh>
 #include <G4ProcessManager.hh>
+#include <G4MesonConstructor.hh>
+#include <G4BaryonConstructor.hh>
+#include <G4ShortLivedConstructor.hh>
 
-// Hadron Processes
-#include <G4HadronElasticProcess.hh>
-#include <G4PionPlusInelasticProcess.hh>
-#include <G4PionMinusInelasticProcess.hh>
-#include <G4KaonPlusInelasticProcess.hh>
-#include <G4KaonZeroSInelasticProcess.hh>
-#include <G4KaonZeroLInelasticProcess.hh>
-#include <G4KaonMinusInelasticProcess.hh>
-#include <G4ProtonInelasticProcess.hh>
-#include <G4AntiProtonInelasticProcess.hh>
-#include <G4NeutronInelasticProcess.hh>
-#include <G4AntiNeutronInelasticProcess.hh>
-#include <G4LambdaInelasticProcess.hh>
-#include <G4AntiLambdaInelasticProcess.hh>
-#include <G4SigmaPlusInelasticProcess.hh>
-#include <G4SigmaMinusInelasticProcess.hh>
-#include <G4AntiSigmaPlusInelasticProcess.hh>
-#include <G4AntiSigmaMinusInelasticProcess.hh>
-#include <G4XiZeroInelasticProcess.hh>
-#include <G4XiMinusInelasticProcess.hh>
-#include <G4AntiXiZeroInelasticProcess.hh>
-#include <G4AntiXiMinusInelasticProcess.hh>
-#include <G4DeuteronInelasticProcess.hh>
-#include <G4TritonInelasticProcess.hh>
-#include <G4AlphaInelasticProcess.hh>
-#include <G4OmegaMinusInelasticProcess.hh>
-#include <G4AntiOmegaMinusInelasticProcess.hh>
-
-// Low-energy Models
-#include <G4LElastic.hh>
-#include <G4LEPionPlusInelastic.hh>
-#include <G4LEPionMinusInelastic.hh>
-#include <G4LEKaonPlusInelastic.hh>
-#include <G4LEKaonZeroSInelastic.hh>
-#include <G4LEKaonZeroLInelastic.hh>
-#include <G4LEKaonMinusInelastic.hh>
-#include <G4LEProtonInelastic.hh>
-#include <G4LEAntiProtonInelastic.hh>
-#include <G4LENeutronInelastic.hh>
-#include <G4LEAntiNeutronInelastic.hh>
-#include <G4LELambdaInelastic.hh>
-#include <G4LEAntiLambdaInelastic.hh>
-#include <G4LESigmaPlusInelastic.hh>
-#include <G4LESigmaMinusInelastic.hh>
-#include <G4LEAntiSigmaPlusInelastic.hh>
-#include <G4LEAntiSigmaMinusInelastic.hh>
-#include <G4LEXiZeroInelastic.hh>
-#include <G4LEXiMinusInelastic.hh>
-#include <G4LEAntiXiZeroInelastic.hh>
-#include <G4LEAntiXiMinusInelastic.hh>
-#include <G4LEDeuteronInelastic.hh>
-#include <G4LETritonInelastic.hh>
-#include <G4LEAlphaInelastic.hh>
-#include <G4LEOmegaMinusInelastic.hh>
-#include <G4LEAntiOmegaMinusInelastic.hh>
-
-// High-energy Models
-#include <G4HEPionPlusInelastic.hh>
-#include <G4HEPionMinusInelastic.hh>
-#include <G4HEKaonPlusInelastic.hh>
-#include <G4HEKaonZeroInelastic.hh>
-#include <G4HEKaonZeroInelastic.hh>
-#include <G4HEKaonMinusInelastic.hh>
-#include <G4HEProtonInelastic.hh>
-#include <G4HEAntiProtonInelastic.hh>
-#include <G4HENeutronInelastic.hh>
-#include <G4HEAntiNeutronInelastic.hh>
-#include <G4HELambdaInelastic.hh>
-#include <G4HEAntiLambdaInelastic.hh>
-#include <G4HESigmaPlusInelastic.hh>
-#include <G4HESigmaMinusInelastic.hh>
-#include <G4HEAntiSigmaPlusInelastic.hh>
-#include <G4HEAntiSigmaMinusInelastic.hh>
-#include <G4HEXiZeroInelastic.hh>
-#include <G4HEXiMinusInelastic.hh>
-#include <G4HEAntiXiZeroInelastic.hh>
-#include <G4HEAntiXiMinusInelastic.hh>
-#include <G4HEOmegaMinusInelastic.hh>
-#include <G4HEAntiOmegaMinusInelastic.hh>
-
-// Stopping processes
-#ifdef TRIUMF_STOP_PIMINUS
-#include <G4PionMinusAbsorptionAtRest.hh>
-#else
-#include <G4PiMinusAbsorptionAtRest.hh>
-#endif
-#ifdef TRIUMF_STOP_KMINUS
-#include <G4KaonMinusAbsorption.hh>
-#else
-#include <G4KaonMinusAbsorptionAtRest.hh>
-#endif
-
+//_____________________________________________________________________________
 TG4PhysicsConstructorHadron::TG4PhysicsConstructorHadron(const G4String& name)
-  : G4VPhysicsConstructor(name)
+  : TG4VPhysicsConstructor(name),
+    fSetEM(true),
+    fSetHadron(true) {
+//
+}
+
+//_____________________________________________________________________________
+TG4PhysicsConstructorHadron::TG4PhysicsConstructorHadron(G4int verboseLevel,
+                                                         G4bool setEM, 
+                                                        G4bool setHadron,
+                                                        const G4String& name)
+  : TG4VPhysicsConstructor(name, verboseLevel),
+    fSetEM(setEM),
+    fSetHadron(setHadron) {
+//
+}
+
+//_____________________________________________________________________________
+TG4PhysicsConstructorHadron::TG4PhysicsConstructorHadron(
+                                     const TG4PhysicsConstructorHadron& right)
+  : TG4VPhysicsConstructor(right)                                   
 {
 //
-  SetVerboseLevel(1);
+  TG4Globals::Exception("TG4PhysicsConstructorHadron is protected from copying.");
 }
 
+//_____________________________________________________________________________
 TG4PhysicsConstructorHadron::~TG4PhysicsConstructorHadron() {
 //
+  for (G4int i=0; i<fOtherProcesses.size(); i++) delete fOtherProcesses[i];
+}
+
+// operators
+
+//_____________________________________________________________________________
+TG4PhysicsConstructorHadron& 
+TG4PhysicsConstructorHadron::operator=(const TG4PhysicsConstructorHadron &right)
+{
+  // check assignement to self
+  if (this == &right) return *this;
+  
+  TG4Globals::Exception(
+    "TG4PhysicsConstructorHadron is protected from assigning.");
+
+  return *this;
+}
+
+
+// private methods
+
+//_____________________________________________________________________________
+void TG4PhysicsConstructorHadron::ConstructEMProcessForPionPlus()
+{
+// Construct processes for pi+.
+// ---
+
+  // add process
+  G4ProcessManager* pManager = G4PionPlus::PionPlus()->GetProcessManager();
+
+  pManager->AddProcess(&fPionPlusIonisation, ordInActive, 2, 2);
+  pManager->AddProcess(&fPionPlusMult);
+
+  // set ordering
+  pManager->SetProcessOrdering(&fPionPlusMult, idxAlongStep, 1);
+  pManager->SetProcessOrdering(&fPionPlusMult, idxPostStep, 1);
+
+  // map to G3 controls
+  TG4ProcessControlMap* controlMap = TG4ProcessControlMap::Instance();
+  controlMap->Add(&fPionPlusIonisation, kLOSS); 
+  controlMap->Add(&fPionPlusMult, kMULS); 
+
+  // map to G3 ALIMCProcess codes
+  TG4ProcessMCMap* mcMap = TG4ProcessMCMap::Instance();
+  mcMap->Add(&fPionPlusIonisation, kPEnergyLoss); 
+  mcMap->Add(&fPionPlusMult, kPMultipleScattering); 
+}
+
+//_____________________________________________________________________________
+void TG4PhysicsConstructorHadron::ConstructEMProcessForPionMinus()
+{
+// Construct processes for pi-.
+// ---
+
+  // add process & set ordering
+  G4ProcessManager* pManager = G4PionMinus::PionMinus()->GetProcessManager();
+
+  pManager->AddProcess(&fPionMinusIonisation, ordInActive, 2, 2);
+
+  pManager->AddProcess(&fPionMinusMult);
+  pManager->SetProcessOrdering(&fPionMinusMult, idxAlongStep, 1);
+  pManager->SetProcessOrdering(&fPionMinusMult, idxPostStep, 1);
+
+  // map to G3 controls
+  TG4ProcessControlMap* controlMap = TG4ProcessControlMap::Instance();
+  controlMap->Add(&fPionMinusIonisation, kLOSS); 
+  controlMap->Add(&fPionMinusMult, kMULS); 
+
+  // map to G3 ALIMCProcess codes
+  TG4ProcessMCMap* mcMap = TG4ProcessMCMap::Instance();
+  mcMap->Add(&fPionMinusIonisation, kPEnergyLoss); 
+  mcMap->Add(&fPionMinusMult, kPMultipleScattering); 
+}
+
+//_____________________________________________________________________________
+void TG4PhysicsConstructorHadron::ConstructEMProcessForKaonPlus()
+{
+// Construct processes for K+.
+// ---
+
+  // add process
+  G4ProcessManager* pManager = G4KaonPlus::KaonPlus()->GetProcessManager();
+
+  pManager->AddProcess(&fKaonPlusIonisation, ordInActive, 2, 2);
+  pManager->AddProcess(&fKaonPlusMult);
+
+  // set ordering
+  pManager->SetProcessOrdering(&fKaonPlusMult, idxAlongStep, 1);
+  pManager->SetProcessOrdering(&fKaonPlusMult, idxPostStep, 1);
+
+  // map to G3 controls
+  TG4ProcessControlMap* controlMap = TG4ProcessControlMap::Instance();
+  controlMap->Add(&fKaonPlusIonisation, kLOSS); 
+  controlMap->Add(&fKaonPlusMult, kMULS); 
+
+  // map to G3 ALIMCProcess codes
+  TG4ProcessMCMap* mcMap = TG4ProcessMCMap::Instance();
+  mcMap->Add(&fKaonPlusIonisation, kPEnergyLoss); 
+  mcMap->Add(&fKaonPlusMult, kPMultipleScattering); 
+}
+
+//_____________________________________________________________________________
+void TG4PhysicsConstructorHadron::ConstructEMProcessForKaonMinus()
+{
+// Construct processes for K-.
+// ---
+
+  // add process & set ordering
+  G4ProcessManager* pManager = G4KaonMinus::KaonMinus()->GetProcessManager();
+
+  pManager->AddProcess(&fKaonMinusIonisation, ordInActive, 2, 2);
+
+  pManager->AddProcess(&fKaonMinusMult);
+  pManager->SetProcessOrdering(&fKaonMinusMult, idxAlongStep, 1);
+  pManager->SetProcessOrdering(&fKaonMinusMult, idxPostStep, 1);
+
+  // map to G3 controls
+  TG4ProcessControlMap* controlMap = TG4ProcessControlMap::Instance();
+  controlMap->Add(&fKaonMinusIonisation, kLOSS); 
+  controlMap->Add(&fKaonMinusMult, kMULS); 
+
+  // map to G3 ALIMCProcess codes
+  TG4ProcessMCMap* mcMap = TG4ProcessMCMap::Instance();
+  mcMap->Add(&fKaonMinusIonisation, kPEnergyLoss); 
+  mcMap->Add(&fKaonMinusMult, kPMultipleScattering); 
+}
+
+//_____________________________________________________________________________
+void TG4PhysicsConstructorHadron::ConstructEMProcessForProton()
+{
+// Construct processes for proton.
+// ---
+
+  // add process
+  G4ProcessManager* pManager = G4Proton::Proton()->GetProcessManager();
+
+  pManager->AddProcess(&fProtonIonisation, ordInActive, 2, 2);
+  pManager->AddProcess(&fProtonMult);
+
+  // set ordering
+  pManager->SetProcessOrdering(&fProtonMult, idxAlongStep, 1);
+  pManager->SetProcessOrdering(&fProtonMult, idxPostStep, 1);
+
+  // map to G3 controls
+  TG4ProcessControlMap* controlMap = TG4ProcessControlMap::Instance();
+  controlMap->Add(&fProtonIonisation, kLOSS); 
+  controlMap->Add(&fProtonMult, kMULS); 
+
+  // map to G3 ALIMCProcess codes
+  TG4ProcessMCMap* mcMap = TG4ProcessMCMap::Instance();
+  mcMap->Add(&fProtonIonisation, kPEnergyLoss); 
+  mcMap->Add(&fProtonMult, kPMultipleScattering); 
+}
+
+//_____________________________________________________________________________
+void TG4PhysicsConstructorHadron::ConstructEMProcessForAntiProton()
+{
+// Construct processes for anti-proton.
+// ---
+
+  // add process & set ordering
+  G4ProcessManager* pManager = G4AntiProton::AntiProton()->GetProcessManager();
+
+  pManager->AddProcess(&fAntiProtonIonisation, ordInActive, 2, 2);
+
+  pManager->AddProcess(&fAntiProtonMult);
+  pManager->SetProcessOrdering(&fAntiProtonMult, idxAlongStep, 1);
+  pManager->SetProcessOrdering(&fAntiProtonMult, idxPostStep, 1);
+
+  pManager->AddRestProcess(&fAntiProtonAnnihilation);
+
+  // map to G3 controls
+  TG4ProcessControlMap* controlMap = TG4ProcessControlMap::Instance();
+  controlMap->Add(&fAntiProtonIonisation, kLOSS); 
+  controlMap->Add(&fAntiProtonMult, kMULS); 
+
+  // map to G3 ALIMCProcess codes
+  TG4ProcessMCMap* mcMap = TG4ProcessMCMap::Instance();
+  mcMap->Add(&fAntiProtonIonisation, kPEnergyLoss); 
+  mcMap->Add(&fAntiProtonMult, kPMultipleScattering); 
+}
+
+//_____________________________________________________________________________
+void TG4PhysicsConstructorHadron::ConstructEMProcessForSigmaMinus()
+{
+// Construct processes for Sigma-.
+// ---
+
+  // add process & set ordering
+  G4ProcessManager* pManager = G4SigmaMinus::SigmaMinus()->GetProcessManager();
+
+  pManager->AddProcess(&fSigmaMinusIonisation, ordInActive, 2, 2);
+
+  pManager->AddProcess(&fSigmaMinusMult);
+  pManager->SetProcessOrdering(&fSigmaMinusMult, idxAlongStep, 1);
+  pManager->SetProcessOrdering(&fSigmaMinusMult, idxPostStep, 1);
+
+  // map to G3 controls
+  TG4ProcessControlMap* controlMap = TG4ProcessControlMap::Instance();
+  controlMap->Add(&fSigmaMinusIonisation, kLOSS); 
+  controlMap->Add(&fSigmaMinusMult, kMULS); 
+
+  // map to G3 ALIMCProcess codes
+  TG4ProcessMCMap* mcMap = TG4ProcessMCMap::Instance();
+  mcMap->Add(&fSigmaMinusIonisation, kPEnergyLoss); 
+  mcMap->Add(&fSigmaMinusMult, kPMultipleScattering); 
+}
+
+//_____________________________________________________________________________
+void TG4PhysicsConstructorHadron::ConstructEMProcessForAntiSigmaMinus()
+{
+// Construct processes for anti-Sigma-.
+// ---
+
+  // add process & set ordering
+  G4ProcessManager* pManager 
+    = G4AntiSigmaMinus::AntiSigmaMinus()->GetProcessManager();
+
+  pManager->AddProcess(&fAntiSigmaMinusIonisation, ordInActive, 2, 2);
+
+  pManager->AddProcess(&fAntiSigmaMinusMult);
+  pManager->SetProcessOrdering(&fAntiSigmaMinusMult, idxAlongStep, 1);
+  pManager->SetProcessOrdering(&fAntiSigmaMinusMult, idxPostStep, 1);
+
+  // map to G3 controls
+  TG4ProcessControlMap* controlMap = TG4ProcessControlMap::Instance();
+  controlMap->Add(&fAntiSigmaMinusIonisation, kLOSS); 
+  controlMap->Add(&fAntiSigmaMinusMult, kMULS); 
+
+  // map to G3 ALIMCProcess codes
+  TG4ProcessMCMap* mcMap = TG4ProcessMCMap::Instance();
+  mcMap->Add(&fAntiSigmaMinusIonisation, kPEnergyLoss); 
+  mcMap->Add(&fAntiSigmaMinusMult, kPMultipleScattering); 
+}
+
+//_____________________________________________________________________________
+void TG4PhysicsConstructorHadron::ConstructEMProcessForSigmaPlus()
+{
+// Construct processes for Sigma+.
+// ---
+
+  // add process & set ordering
+  G4ProcessManager* pManager = G4SigmaPlus::SigmaPlus()->GetProcessManager();
+
+  pManager->AddProcess(&fSigmaPlusIonisation, ordInActive, 2, 2);
+
+  pManager->AddProcess(&fSigmaPlusMult);
+  pManager->SetProcessOrdering(&fSigmaPlusMult, idxAlongStep, 1);
+  pManager->SetProcessOrdering(&fSigmaPlusMult, idxPostStep, 1);
+
+  // map to G3 controls
+  TG4ProcessControlMap* controlMap = TG4ProcessControlMap::Instance();
+  controlMap->Add(&fSigmaPlusIonisation, kLOSS); 
+  controlMap->Add(&fSigmaPlusMult, kMULS); 
+
+  // map to G3 ALIMCProcess codes
+  TG4ProcessMCMap* mcMap = TG4ProcessMCMap::Instance();
+  mcMap->Add(&fSigmaPlusIonisation, kPEnergyLoss); 
+  mcMap->Add(&fSigmaPlusMult, kPMultipleScattering); 
+}
+
+//_____________________________________________________________________________
+void TG4PhysicsConstructorHadron::ConstructEMProcessForAntiSigmaPlus()
+{
+// Construct processes for anti-Sigma+.
+// ---
+
+  // add process & set ordering
+  G4ProcessManager* pManager 
+    = G4AntiSigmaPlus::AntiSigmaPlus()->GetProcessManager();
+
+  pManager->AddProcess(&fAntiSigmaPlusIonisation, ordInActive, 2, 2);
+
+  pManager->AddProcess(&fAntiSigmaPlusMult);
+  pManager->SetProcessOrdering(&fAntiSigmaPlusMult, idxAlongStep, 1);
+  pManager->SetProcessOrdering(&fAntiSigmaPlusMult, idxPostStep, 1);
+
+  // map to G3 controls
+  TG4ProcessControlMap* controlMap = TG4ProcessControlMap::Instance();
+  controlMap->Add(&fAntiSigmaPlusIonisation, kLOSS); 
+  controlMap->Add(&fAntiSigmaPlusMult, kMULS); 
+
+  // map to G3 ALIMCProcess codes
+  TG4ProcessMCMap* mcMap = TG4ProcessMCMap::Instance();
+  mcMap->Add(&fAntiSigmaPlusIonisation, kPEnergyLoss); 
+  mcMap->Add(&fAntiSigmaPlusMult, kPMultipleScattering); 
+}
+
+//_____________________________________________________________________________
+void TG4PhysicsConstructorHadron::ConstructEMProcessForXiMinus()
+{
+// Construct processes for Xi-.
+// ---
+
+  // add process & set ordering
+  G4ProcessManager* pManager = G4XiMinus::XiMinus()->GetProcessManager();
+
+  pManager->AddProcess(&fXiMinusIonisation, ordInActive, 2, 2);
+
+  pManager->AddProcess(&fXiMinusMult);
+  pManager->SetProcessOrdering(&fXiMinusMult, idxAlongStep, 1);
+  pManager->SetProcessOrdering(&fXiMinusMult, idxPostStep, 1);
+
+  // map to G3 controls
+  TG4ProcessControlMap* controlMap = TG4ProcessControlMap::Instance();
+  controlMap->Add(&fXiMinusIonisation, kLOSS); 
+  controlMap->Add(&fXiMinusMult, kMULS); 
+
+  // map to G3 ALIMCProcess codes
+  TG4ProcessMCMap* mcMap = TG4ProcessMCMap::Instance();
+  mcMap->Add(&fXiMinusIonisation, kPEnergyLoss); 
+  mcMap->Add(&fXiMinusMult, kPMultipleScattering); 
+}
+
+//_____________________________________________________________________________
+void TG4PhysicsConstructorHadron::ConstructEMProcessForAntiXiMinus()
+{
+// Construct processes for anti-Xi-.
+// ---
+
+  // add process & set ordering
+  G4ProcessManager* pManager 
+    = G4AntiXiMinus::AntiXiMinus()->GetProcessManager();
+
+  pManager->AddProcess(&fAntiXiMinusIonisation, ordInActive, 2, 2);
+
+  pManager->AddProcess(&fAntiXiMinusMult);
+  pManager->SetProcessOrdering(&fAntiXiMinusMult, idxAlongStep, 1);
+  pManager->SetProcessOrdering(&fAntiXiMinusMult, idxPostStep, 1);
+
+  // map to G3 controls
+  TG4ProcessControlMap* controlMap = TG4ProcessControlMap::Instance();
+  controlMap->Add(&fAntiXiMinusIonisation, kLOSS); 
+  controlMap->Add(&fAntiXiMinusMult, kMULS); 
+
+  // map to G3 ALIMCProcess codes
+  TG4ProcessMCMap* mcMap = TG4ProcessMCMap::Instance();
+  mcMap->Add(&fAntiXiMinusIonisation, kPEnergyLoss); 
+  mcMap->Add(&fAntiXiMinusMult, kPMultipleScattering); 
+}
+
+//_____________________________________________________________________________
+void TG4PhysicsConstructorHadron::ConstructEMProcessForOmegaMinus()
+{
+// Construct processes for Omega-.
+// ---
+
+  // add process & set ordering
+  G4ProcessManager* pManager = G4OmegaMinus::OmegaMinus()->GetProcessManager();
+
+  pManager->AddProcess(&fOmegaMinusIonisation, ordInActive, 2, 2);
+
+  pManager->AddProcess(&fOmegaMinusMult);
+  pManager->SetProcessOrdering(&fOmegaMinusMult, idxAlongStep, 1);
+  pManager->SetProcessOrdering(&fOmegaMinusMult, idxPostStep, 1);
+
+  // map to G3 controls
+  TG4ProcessControlMap* controlMap = TG4ProcessControlMap::Instance();
+  controlMap->Add(&fOmegaMinusIonisation, kLOSS); 
+  controlMap->Add(&fOmegaMinusMult, kMULS); 
+
+  // map to G3 ALIMCProcess codes
+  TG4ProcessMCMap* mcMap = TG4ProcessMCMap::Instance();
+  mcMap->Add(&fOmegaMinusIonisation, kPEnergyLoss); 
+  mcMap->Add(&fOmegaMinusMult, kPMultipleScattering); 
+}
+
+//_____________________________________________________________________________
+void TG4PhysicsConstructorHadron::ConstructEMProcessForAntiOmegaMinus()
+{
+// Construct processes for pi+.
+// ---
+
+  // add process & set ordering
+  G4ProcessManager* pManager 
+    = G4AntiOmegaMinus::AntiOmegaMinus()->GetProcessManager();
+
+  pManager->AddProcess(&fAntiOmegaMinusIonisation, ordInActive, 2, 2);
+
+  pManager->AddProcess(&fAntiOmegaMinusMult);
+  pManager->SetProcessOrdering(&fAntiOmegaMinusMult, idxAlongStep, 1);
+  pManager->SetProcessOrdering(&fAntiOmegaMinusMult, idxPostStep, 1);
+
+  // map to G3 controls
+  TG4ProcessControlMap* controlMap = TG4ProcessControlMap::Instance();
+  controlMap->Add(&fAntiOmegaMinusIonisation, kLOSS); 
+  controlMap->Add(&fAntiOmegaMinusMult, kMULS); 
+
+  // map to G3 ALIMCProcess codes
+  TG4ProcessMCMap* mcMap = TG4ProcessMCMap::Instance();
+  mcMap->Add(&fAntiOmegaMinusIonisation, kPEnergyLoss); 
+  mcMap->Add(&fAntiOmegaMinusMult, kPMultipleScattering); 
+}
+
+//_____________________________________________________________________________
+void TG4PhysicsConstructorHadron::ConstructEMProcessForOther()
+{
+// Construct processes for other hadrons.
+// ---
+
+  theParticleIterator->reset();
+  while( (*theParticleIterator)() ){
+    G4ParticleDefinition* particle = theParticleIterator->value();
+    G4ProcessManager* pManager = particle->GetProcessManager();
+    G4int nofAlongStepProcesses 
+      = pManager->GetAlongStepProcessVector()->length();
+
+    if ( !particle->IsShortLived()       &&
+         particle->GetPDGCharge() != 0.0 &&
+         nofAlongStepProcesses == 1      && 
+         particle->GetParticleName() != "chargedgeantino") {
+       
+      // create processes
+      G4VProcess* aMultipleScattering = new G4MultipleScattering();
+      G4VProcess* anIonisation = new G4hIonisation();
+
+      // add processes
+      pManager->AddProcess(anIonisation, ordInActive, 2, 2);
+      pManager->AddProcess(aMultipleScattering);
+
+      // set ordering
+      pManager->SetProcessOrdering(aMultipleScattering, idxAlongStep, 1);
+      pManager->SetProcessOrdering(aMultipleScattering, idxPostStep, 1);
+
+      // map to G3 controls
+      TG4ProcessControlMap* controlMap = TG4ProcessControlMap::Instance();
+      controlMap->Add(anIonisation, kLOSS); 
+      controlMap->Add(aMultipleScattering, kMULS); 
+
+      // map to AliMCProcess codes
+      TG4ProcessMCMap* mcMap = TG4ProcessMCMap::Instance();
+      mcMap->Add(anIonisation, kPEnergyLoss); 
+      mcMap->Add(aMultipleScattering, kPMultipleScattering); 
+      
+      // keep for deleting 
+      fOtherProcesses.push_back(aMultipleScattering);
+      fOtherProcesses.push_back(anIonisation);
+    }
+  }    
+}
+
+//_____________________________________________________________________________
+void TG4PhysicsConstructorHadron::ConstructHadProcessForPionPlus()
+{
+// Construct processes for pi+.
+// ---
+
+  // add process
+  G4ProcessManager* pManager = G4PionPlus::PionPlus()->GetProcessManager();
+  pManager->AddDiscreteProcess(&fElasticProcess);
+
+  fLEPionPlusModel = new G4LEPionPlusInelastic();
+  fHEPionPlusModel = new G4HEPionPlusInelastic();
+  fPionPlusInelastic.RegisterMe(fLEPionPlusModel);
+  fPionPlusInelastic.RegisterMe(fHEPionPlusModel);
+  pManager->AddDiscreteProcess(&fPionPlusInelastic);
+
+  // map to G3 controls
+  TG4ProcessControlMap* controlMap = TG4ProcessControlMap::Instance();
+  controlMap->Add(&fElasticProcess, kHADR); 
+  controlMap->Add(&fPionPlusInelastic, kHADR); 
+
+  // map to G3 ALIMCProcess codes
+  TG4ProcessMCMap* mcMap = TG4ProcessMCMap::Instance();
+  mcMap->Add(&fElasticProcess, kPHElastic); 
+  mcMap->Add(&fPionPlusInelastic, kPHInhelastic); 
+}
+
+//_____________________________________________________________________________
+void TG4PhysicsConstructorHadron::ConstructHadProcessForPionMinus()
+{
+// Construct processes for pi-.
+// ---
+
+  // add process & set ordering
+  G4ProcessManager* pManager = G4PionMinus::PionMinus()->GetProcessManager();
+  pManager->AddDiscreteProcess(&fElasticProcess);
+
+  fLEPionMinusModel = new G4LEPionMinusInelastic();
+  fHEPionMinusModel = new G4HEPionMinusInelastic();
+  fPionMinusInelastic.RegisterMe(fLEPionMinusModel);
+  fPionMinusInelastic.RegisterMe(fHEPionMinusModel);
+  pManager->AddDiscreteProcess(&fPionMinusInelastic);
+
+  pManager->AddRestProcess(&fPionMinusAbsorption, ordDefault);
+
+  // map to G3 controls
+  TG4ProcessControlMap* controlMap = TG4ProcessControlMap::Instance();
+  controlMap->Add(&fPionMinusInelastic, kHADR); 
+  controlMap->Add(&fPionMinusAbsorption, kHADR); 
+
+  // map to G3 ALIMCProcess codes
+  TG4ProcessMCMap* mcMap = TG4ProcessMCMap::Instance();
+  mcMap->Add(&fPionMinusInelastic, kPHInhelastic); 
+  mcMap->Add(&fPionMinusAbsorption, kPNuclearAbsorption); 
+}
+
+//_____________________________________________________________________________
+void TG4PhysicsConstructorHadron::ConstructHadProcessForKaonPlus()
+{
+// Construct processes for K+.
+// ---
+
+  // add process
+  G4ProcessManager* pManager = G4KaonPlus::KaonPlus()->GetProcessManager();
+  pManager->AddDiscreteProcess(&fElasticProcess);
+
+  fLEKaonPlusModel = new G4LEKaonPlusInelastic();
+  fHEKaonPlusModel = new G4HEKaonPlusInelastic();
+  fKaonPlusInelastic.RegisterMe(fLEKaonPlusModel);
+  fKaonPlusInelastic.RegisterMe(fHEKaonPlusModel);
+  pManager->AddDiscreteProcess(&fKaonPlusInelastic);
+
+  // map to G3 controls
+  TG4ProcessControlMap* controlMap = TG4ProcessControlMap::Instance();
+  controlMap->Add(&fKaonPlusInelastic, kHADR); 
+
+  // map to G3 ALIMCProcess codes
+  TG4ProcessMCMap* mcMap = TG4ProcessMCMap::Instance();
+  mcMap->Add(&fKaonPlusInelastic, kPHInhelastic); 
+}
+
+//_____________________________________________________________________________
+void TG4PhysicsConstructorHadron::ConstructHadProcessForKaonMinus()
+{
+// Construct processes for K-.
+// ---
+
+  // add process & set ordering
+  G4ProcessManager* pManager = G4KaonMinus::KaonMinus()->GetProcessManager();
+  pManager->AddDiscreteProcess(&fElasticProcess);
+
+  fLEKaonMinusModel = new G4LEKaonMinusInelastic();
+  fHEKaonMinusModel = new G4HEKaonMinusInelastic();
+  fKaonMinusInelastic.RegisterMe(fLEKaonMinusModel);
+  fKaonMinusInelastic.RegisterMe(fHEKaonMinusModel);
+  pManager->AddDiscreteProcess(&fKaonMinusInelastic);
+
+  pManager->AddRestProcess(&fKaonMinusAbsorption, ordDefault);
+
+  // map to G3 controls
+  TG4ProcessControlMap* controlMap = TG4ProcessControlMap::Instance();
+  controlMap->Add(&fKaonMinusInelastic, kHADR); 
+  controlMap->Add(&fKaonMinusAbsorption, kHADR); 
+
+  // map to G3 ALIMCProcess codes
+  TG4ProcessMCMap* mcMap = TG4ProcessMCMap::Instance();
+  mcMap->Add(&fKaonMinusInelastic, kPHInhelastic); 
+  mcMap->Add(&fKaonMinusAbsorption, kPNuclearAbsorption); 
+}
+
+//_____________________________________________________________________________
+void TG4PhysicsConstructorHadron::ConstructHadProcessForKaonZeroLong()
+{
+// Construct processes for K0L.
+// ---
+
+  // add process
+  G4ProcessManager* pManager 
+    = G4KaonZeroLong::KaonZeroLong()->GetProcessManager();
+  pManager->AddDiscreteProcess(&fElasticProcess);
+
+  fLEKaonZeroLModel = new G4LEKaonZeroLInelastic();
+  fHEKaonZeroLModel = new G4HEKaonZeroInelastic();
+  fKaonZeroLInelastic.RegisterMe(fLEKaonZeroLModel);
+  fKaonZeroLInelastic.RegisterMe(fHEKaonZeroLModel);
+  pManager->AddDiscreteProcess(&fKaonZeroLInelastic);
+
+  // map to G3 controls
+  TG4ProcessControlMap* controlMap = TG4ProcessControlMap::Instance();
+  controlMap->Add(&fKaonZeroLInelastic, kHADR); 
+
+  // map to G3 ALIMCProcess codes
+  TG4ProcessMCMap* mcMap = TG4ProcessMCMap::Instance();
+  mcMap->Add(&fKaonZeroLInelastic, kPHInhelastic); 
+}
+
+//_____________________________________________________________________________
+void TG4PhysicsConstructorHadron::ConstructHadProcessForKaonZeroShort()
+{
+// Construct processes for K0S.
+// ---
+
+  // add process
+  G4ProcessManager* pManager 
+    = G4KaonZeroShort::KaonZeroShort()->GetProcessManager();
+  pManager->AddDiscreteProcess(&fElasticProcess);
+
+  fLEKaonZeroSModel = new G4LEKaonZeroSInelastic();
+  fHEKaonZeroSModel = new G4HEKaonZeroInelastic();
+  fKaonZeroSInelastic.RegisterMe(fLEKaonZeroSModel);
+  fKaonZeroSInelastic.RegisterMe(fHEKaonZeroSModel);
+  pManager->AddDiscreteProcess(&fKaonZeroSInelastic);
+
+  // map to G3 controls
+  TG4ProcessControlMap* controlMap = TG4ProcessControlMap::Instance();
+  controlMap->Add(&fKaonZeroSInelastic, kHADR); 
+
+  // map to G3 ALIMCProcess codes
+  TG4ProcessMCMap* mcMap = TG4ProcessMCMap::Instance();
+  mcMap->Add(&fKaonZeroSInelastic, kPHInhelastic); 
+}
+
+//_____________________________________________________________________________
+void TG4PhysicsConstructorHadron::ConstructHadProcessForProton()
+{
+// Construct processes for proton.
+// ---
+
+  // add process
+  G4ProcessManager* pManager = G4Proton::Proton()->GetProcessManager();
+  pManager->AddDiscreteProcess(&fElasticProcess);
+
+  fLEProtonModel = new G4LEProtonInelastic();
+  fHEProtonModel = new G4HEProtonInelastic();
+  fProtonInelastic.RegisterMe(fLEProtonModel);
+  fProtonInelastic.RegisterMe(fHEProtonModel);
+  pManager->AddDiscreteProcess(&fProtonInelastic);
+
+  // map to G3 controls
+  TG4ProcessControlMap* controlMap = TG4ProcessControlMap::Instance();
+  controlMap->Add(&fProtonInelastic, kHADR); 
+
+  // map to G3 ALIMCProcess codes
+  TG4ProcessMCMap* mcMap = TG4ProcessMCMap::Instance();
+  mcMap->Add(&fProtonInelastic, kPHInhelastic); 
+}
+
+//_____________________________________________________________________________
+void TG4PhysicsConstructorHadron::ConstructHadProcessForAntiProton()
+{
+// Construct processes for anti-proton.
+// ---
+
+  // add process & set ordering
+  G4ProcessManager* pManager = G4AntiProton::AntiProton()->GetProcessManager();
+  pManager->AddDiscreteProcess(&fElasticProcess);
+
+  fLEAntiProtonModel = new G4LEAntiProtonInelastic();
+  fHEAntiProtonModel = new G4HEAntiProtonInelastic();
+  fAntiProtonInelastic.RegisterMe(fLEAntiProtonModel);
+  fAntiProtonInelastic.RegisterMe(fHEAntiProtonModel);
+  pManager->AddDiscreteProcess(&fAntiProtonInelastic);
+
+  pManager->AddRestProcess(&fAntiProtonAnnihilation);
+
+  // map to G3 controls
+  TG4ProcessControlMap* controlMap = TG4ProcessControlMap::Instance();
+  controlMap->Add(&fAntiProtonInelastic, kHADR); 
+  controlMap->Add(&fAntiProtonAnnihilation, kHADR); 
+
+  // map to G3 ALIMCProcess codes
+  TG4ProcessMCMap* mcMap = TG4ProcessMCMap::Instance();
+  mcMap->Add(&fAntiProtonInelastic, kPHInhelastic); 
+  mcMap->Add(&fAntiProtonAnnihilation, kPPbarAnnihilation); 
+}
+
+//_____________________________________________________________________________
+void TG4PhysicsConstructorHadron::ConstructHadProcessForNeutron()
+{
+// Construct processes for neutron.
+// ---
+
+  // add process
+  G4ProcessManager* pManager = G4Neutron::Neutron()->GetProcessManager();
+  pManager->AddDiscreteProcess(&fElasticProcess);
+
+  fLENeutronModel = new G4LENeutronInelastic();
+  fHENeutronModel = new G4HENeutronInelastic();
+  fNeutronInelastic.RegisterMe(fLENeutronModel);
+  fNeutronInelastic.RegisterMe(fHENeutronModel);
+  pManager->AddDiscreteProcess(&fNeutronInelastic);
+
+  //fNeutronFissionModel = new G4LFission();
+  //fNeutronFission.RegisterMe(fNeutronFissionModel);
+  //pManager->AddDiscreteProcess(&NeutronFission);
+
+  //fNeutronCaptureModel = new G4LCapture();
+  //fNeutronCapture.RegisterMe(fNeutronCaptureModel);
+  //pManager->AddDiscreteProcess(&fNeutronCapture);
+
+  // map to G3 controls
+  TG4ProcessControlMap* controlMap = TG4ProcessControlMap::Instance();
+  controlMap->Add(&fNeutronInelastic, kHADR); 
+
+  // map to G3 ALIMCProcess codes
+  TG4ProcessMCMap* mcMap = TG4ProcessMCMap::Instance();
+  mcMap->Add(&fNeutronInelastic, kPHInhelastic); 
+}
+
+//_____________________________________________________________________________
+void TG4PhysicsConstructorHadron::ConstructHadProcessForAntiNeutron()
+{
+// Construct processes for anti-neutron.
+// ---
+
+  // add process
+  G4ProcessManager* pManager = G4AntiNeutron::AntiNeutron()->GetProcessManager();
+  pManager->AddDiscreteProcess(&fElasticProcess);
+
+  fLEAntiNeutronModel = new G4LEAntiNeutronInelastic();
+  fHEAntiNeutronModel = new G4HEAntiNeutronInelastic();
+  fAntiNeutronInelastic.RegisterMe(fLEAntiNeutronModel);
+  fAntiNeutronInelastic.RegisterMe(fHEAntiNeutronModel);
+  pManager->AddDiscreteProcess(&fAntiNeutronInelastic);
+
+  pManager->AddRestProcess(&fAntiNeutronAnnihilation);
+
+  // map to G3 controls
+  TG4ProcessControlMap* controlMap = TG4ProcessControlMap::Instance();
+  controlMap->Add(&fAntiNeutronInelastic, kHADR); 
+  controlMap->Add(&fAntiNeutronAnnihilation, kHADR); 
+
+  // map to G3 ALIMCProcess codes
+  TG4ProcessMCMap* mcMap = TG4ProcessMCMap::Instance();
+  mcMap->Add(&fAntiNeutronInelastic, kPHInhelastic); 
+  mcMap->Add(&fAntiNeutronAnnihilation, kPNoProcess);   
+}
+
+//_____________________________________________________________________________
+void TG4PhysicsConstructorHadron::ConstructHadProcessForLambda()
+{
+// Construct processes for Lambda.
+// ---
+
+  // add process
+  G4ProcessManager* pManager = G4Lambda::Lambda()->GetProcessManager();
+  pManager->AddDiscreteProcess(&fElasticProcess);
+
+  fLELambdaModel = new G4LELambdaInelastic();
+  fHELambdaModel = new G4HELambdaInelastic();
+  fLambdaInelastic.RegisterMe(fLELambdaModel);
+  fLambdaInelastic.RegisterMe(fHELambdaModel);
+  pManager->AddDiscreteProcess(&fLambdaInelastic);
+
+  // map to G3 controls
+  TG4ProcessControlMap* controlMap = TG4ProcessControlMap::Instance();
+  controlMap->Add(&fLambdaInelastic, kHADR); 
+
+  // map to G3 ALIMCProcess codes
+  TG4ProcessMCMap* mcMap = TG4ProcessMCMap::Instance();
+  mcMap->Add(&fLambdaInelastic, kPHInhelastic); 
+}
+
+//_____________________________________________________________________________
+void TG4PhysicsConstructorHadron::ConstructHadProcessForAntiLambda()
+{
+// Construct processes for anti-Lambda.
+// ---
+
+  // add process
+  G4ProcessManager* pManager = G4AntiLambda::AntiLambda()->GetProcessManager();
+  pManager->AddDiscreteProcess(&fElasticProcess);
+
+  fLEAntiLambdaModel = new G4LEAntiLambdaInelastic();
+  fHEAntiLambdaModel = new G4HEAntiLambdaInelastic();
+  fAntiLambdaInelastic.RegisterMe(fLEAntiLambdaModel);
+  fAntiLambdaInelastic.RegisterMe(fHEAntiLambdaModel);
+  pManager->AddDiscreteProcess(&fAntiLambdaInelastic);
+
+  // map to G3 controls
+  TG4ProcessControlMap* controlMap = TG4ProcessControlMap::Instance();
+  controlMap->Add(&fAntiLambdaInelastic, kHADR); 
+
+  // map to G3 ALIMCProcess codes
+  TG4ProcessMCMap* mcMap = TG4ProcessMCMap::Instance();
+  mcMap->Add(&fAntiLambdaInelastic, kPHInhelastic); 
+}
+
+//_____________________________________________________________________________
+void TG4PhysicsConstructorHadron::ConstructHadProcessForSigmaMinus()
+{
+// Construct processes for Sigma-.
+// ---
+
+  // add process & set ordering
+  G4ProcessManager* pManager = G4SigmaMinus::SigmaMinus()->GetProcessManager();
+  pManager->AddDiscreteProcess(&fElasticProcess);
+
+  fLESigmaMinusModel = new G4LESigmaMinusInelastic();
+  fHESigmaMinusModel = new G4HESigmaMinusInelastic();
+  fSigmaMinusInelastic.RegisterMe(fLESigmaMinusModel);
+  fSigmaMinusInelastic.RegisterMe(fHESigmaMinusModel);
+  pManager->AddDiscreteProcess(&fSigmaMinusInelastic);
+
+  // map to G3 controls
+  TG4ProcessControlMap* controlMap = TG4ProcessControlMap::Instance();
+  controlMap->Add(&fSigmaMinusInelastic, kHADR); 
+
+  // map to G3 ALIMCProcess codes
+  TG4ProcessMCMap* mcMap = TG4ProcessMCMap::Instance();
+  mcMap->Add(&fSigmaMinusInelastic, kPHInhelastic); 
+}
+
+//_____________________________________________________________________________
+void TG4PhysicsConstructorHadron::ConstructHadProcessForAntiSigmaMinus()
+{
+// Construct processes for anti-Sigma-.
+// ---
+
+  // add process & set ordering
+  G4ProcessManager* pManager 
+    = G4AntiSigmaMinus::AntiSigmaMinus()->GetProcessManager();
+  pManager->AddDiscreteProcess(&fElasticProcess);
+
+  fLEAntiSigmaMinusModel = new G4LEAntiSigmaMinusInelastic();
+  fHEAntiSigmaMinusModel = new G4HEAntiSigmaMinusInelastic();
+  fAntiSigmaMinusInelastic.RegisterMe(fLEAntiSigmaMinusModel);
+  fAntiSigmaMinusInelastic.RegisterMe(fHEAntiSigmaMinusModel);
+  pManager->AddDiscreteProcess(&fAntiSigmaMinusInelastic);
+
+  // map to G3 controls
+  TG4ProcessControlMap* controlMap = TG4ProcessControlMap::Instance();
+  controlMap->Add(&fAntiSigmaMinusInelastic, kHADR); 
+
+  // map to G3 ALIMCProcess codes
+  TG4ProcessMCMap* mcMap = TG4ProcessMCMap::Instance();
+  mcMap->Add(&fAntiSigmaMinusInelastic, kPHInhelastic); 
+}
+
+//_____________________________________________________________________________
+void TG4PhysicsConstructorHadron::ConstructHadProcessForSigmaPlus()
+{
+// Construct processes for Sigma+.
+// ---
+
+  // add process & set ordering
+  G4ProcessManager* pManager = G4SigmaPlus::SigmaPlus()->GetProcessManager();
+  pManager->AddDiscreteProcess(&fElasticProcess);
+
+  fLESigmaPlusModel = new G4LESigmaPlusInelastic();
+  fHESigmaPlusModel = new G4HESigmaPlusInelastic();
+  fSigmaPlusInelastic.RegisterMe(fLESigmaPlusModel);
+  fSigmaPlusInelastic.RegisterMe(fHESigmaPlusModel);
+  pManager->AddDiscreteProcess(&fSigmaPlusInelastic);
+
+  // map to G3 controls
+  TG4ProcessControlMap* controlMap = TG4ProcessControlMap::Instance();
+  controlMap->Add(&fSigmaPlusInelastic, kHADR); 
+
+  // map to G3 ALIMCProcess codes
+  TG4ProcessMCMap* mcMap = TG4ProcessMCMap::Instance();
+  mcMap->Add(&fSigmaPlusInelastic, kPHInhelastic); 
+}
+
+//_____________________________________________________________________________
+void TG4PhysicsConstructorHadron::ConstructHadProcessForAntiSigmaPlus()
+{
+// Construct processes for anti-Sigma+.
+// ---
+
+  // add process & set ordering
+  G4ProcessManager* pManager 
+    = G4AntiSigmaPlus::AntiSigmaPlus()->GetProcessManager();
+  pManager->AddDiscreteProcess(&fElasticProcess);
+
+  fLEAntiSigmaPlusModel = new G4LEAntiSigmaPlusInelastic();
+  fHEAntiSigmaPlusModel = new G4HEAntiSigmaPlusInelastic();
+  fAntiSigmaPlusInelastic.RegisterMe(fLEAntiSigmaPlusModel);
+  fAntiSigmaPlusInelastic.RegisterMe(fHEAntiSigmaPlusModel);
+  pManager->AddDiscreteProcess(&fAntiSigmaPlusInelastic);
+
+  // map to G3 controls
+  TG4ProcessControlMap* controlMap = TG4ProcessControlMap::Instance();
+  controlMap->Add(&fAntiSigmaPlusInelastic, kHADR); 
+
+  // map to G3 ALIMCProcess codes
+  TG4ProcessMCMap* mcMap = TG4ProcessMCMap::Instance();
+  mcMap->Add(&fAntiSigmaPlusInelastic, kPHInhelastic); 
+}
+
+//_____________________________________________________________________________
+void TG4PhysicsConstructorHadron::ConstructHadProcessForXiMinus()
+{
+// Construct processes for Xi-.
+// ---
+
+  // add process & set ordering
+  G4ProcessManager* pManager = G4XiMinus::XiMinus()->GetProcessManager();
+  pManager->AddDiscreteProcess(&fElasticProcess);
+
+  fLEXiMinusModel = new G4LEXiMinusInelastic();
+  fHEXiMinusModel = new G4HEXiMinusInelastic();
+  fXiMinusInelastic.RegisterMe(fLEXiMinusModel);
+  fXiMinusInelastic.RegisterMe(fHEXiMinusModel);
+  pManager->AddDiscreteProcess(&fXiMinusInelastic);
+
+  // map to G3 controls
+  TG4ProcessControlMap* controlMap = TG4ProcessControlMap::Instance();
+  controlMap->Add(&fXiMinusInelastic, kHADR); 
+
+  // map to G3 ALIMCProcess codes
+  TG4ProcessMCMap* mcMap = TG4ProcessMCMap::Instance();
+  mcMap->Add(&fXiMinusInelastic, kPHInhelastic); 
+}
+
+//_____________________________________________________________________________
+void TG4PhysicsConstructorHadron::ConstructHadProcessForAntiXiMinus()
+{
+// Construct processes for anti-Xi-.
+// ---
+
+  // add process & set ordering
+  G4ProcessManager* pManager 
+    = G4AntiXiMinus::AntiXiMinus()->GetProcessManager();
+  pManager->AddDiscreteProcess(&fElasticProcess);
+
+  fLEAntiXiMinusModel = new G4LEAntiXiMinusInelastic();
+  fHEAntiXiMinusModel = new G4HEAntiXiMinusInelastic();
+  fAntiXiMinusInelastic.RegisterMe(fLEAntiXiMinusModel);
+  fAntiXiMinusInelastic.RegisterMe(fHEAntiXiMinusModel);
+  pManager->AddDiscreteProcess(&fAntiXiMinusInelastic);
+
+  // map to G3 controls
+  TG4ProcessControlMap* controlMap = TG4ProcessControlMap::Instance();
+  controlMap->Add(&fAntiXiMinusInelastic, kHADR); 
+
+  // map to G3 ALIMCProcess codes
+  TG4ProcessMCMap* mcMap = TG4ProcessMCMap::Instance();
+  mcMap->Add(&fAntiXiMinusInelastic, kPHInhelastic); 
+}
+
+//_____________________________________________________________________________
+void TG4PhysicsConstructorHadron::ConstructHadProcessForXiZero()
+{
+// Construct processes for Xi0.
+// ---
+
+  // add process
+  G4ProcessManager* pManager = G4XiZero::XiZero()->GetProcessManager();
+  pManager->AddDiscreteProcess(&fElasticProcess);
+
+  fLEXiZeroModel = new G4LEXiZeroInelastic();
+  fHEXiZeroModel = new G4HEXiZeroInelastic();
+  fXiZeroInelastic.RegisterMe(fLEXiZeroModel);
+  fXiZeroInelastic.RegisterMe(fHEXiZeroModel);
+  pManager->AddDiscreteProcess(&fXiZeroInelastic);
+
+  // map to G3 controls
+  TG4ProcessControlMap* controlMap = TG4ProcessControlMap::Instance();
+  controlMap->Add(&fXiZeroInelastic, kHADR); 
+
+  // map to G3 ALIMCProcess codes
+  TG4ProcessMCMap* mcMap = TG4ProcessMCMap::Instance();
+  mcMap->Add(&fXiZeroInelastic, kPHInhelastic); 
+}
+
+//_____________________________________________________________________________
+void TG4PhysicsConstructorHadron::ConstructHadProcessForAntiXiZero()
+{
+// Construct processes for anti-Xi0.
+// ---
+
+  // add process
+  G4ProcessManager* pManager = G4AntiXiZero::AntiXiZero()->GetProcessManager();
+  pManager->AddDiscreteProcess(&fElasticProcess);
+
+  fLEAntiXiZeroModel = new G4LEAntiXiZeroInelastic();
+  fHEAntiXiZeroModel = new G4HEAntiXiZeroInelastic();
+  fAntiXiZeroInelastic.RegisterMe(fLEAntiXiZeroModel);
+  fAntiXiZeroInelastic.RegisterMe(fHEAntiXiZeroModel);
+  pManager->AddDiscreteProcess(&fAntiXiZeroInelastic);
+
+  // map to G3 controls
+  TG4ProcessControlMap* controlMap = TG4ProcessControlMap::Instance();
+  controlMap->Add(&fAntiXiZeroInelastic, kHADR); 
+
+  // map to G3 ALIMCProcess codes
+  TG4ProcessMCMap* mcMap = TG4ProcessMCMap::Instance();
+  mcMap->Add(&fAntiXiZeroInelastic, kPHInhelastic); 
+}
+
+//_____________________________________________________________________________
+void TG4PhysicsConstructorHadron::ConstructHadProcessForOmegaMinus()
+{
+// Construct processes for Omega-.
+// ---
+
+  // add process & set ordering
+  G4ProcessManager* pManager = G4OmegaMinus::OmegaMinus()->GetProcessManager();
+  pManager->AddDiscreteProcess(&fElasticProcess);
+
+  fLEOmegaMinusModel = new G4LEOmegaMinusInelastic();
+  fHEOmegaMinusModel = new G4HEOmegaMinusInelastic();
+  fOmegaMinusInelastic.RegisterMe(fLEOmegaMinusModel);
+  fOmegaMinusInelastic.RegisterMe(fHEOmegaMinusModel);
+  pManager->AddDiscreteProcess(&fOmegaMinusInelastic);
+
+  // map to G3 controls
+  TG4ProcessControlMap* controlMap = TG4ProcessControlMap::Instance();
+  controlMap->Add(&fOmegaMinusInelastic, kHADR); 
+
+  // map to G3 ALIMCProcess codes
+  TG4ProcessMCMap* mcMap = TG4ProcessMCMap::Instance();
+  mcMap->Add(&fOmegaMinusInelastic, kPHInhelastic); 
+}
+
+//_____________________________________________________________________________
+void TG4PhysicsConstructorHadron::ConstructHadProcessForAntiOmegaMinus()
+{
+// Construct processes for pi+.
+// ---
+
+  // add process & set ordering
+  G4ProcessManager* pManager 
+    = G4AntiOmegaMinus::AntiOmegaMinus()->GetProcessManager();
+  pManager->AddDiscreteProcess(&fElasticProcess);
+
+  fLEAntiOmegaMinusModel = new G4LEAntiOmegaMinusInelastic();
+  fHEAntiOmegaMinusModel = new G4HEAntiOmegaMinusInelastic();
+  fAntiOmegaMinusInelastic.RegisterMe(fLEAntiOmegaMinusModel);
+  fAntiOmegaMinusInelastic.RegisterMe(fHEAntiOmegaMinusModel);
+  pManager->AddDiscreteProcess(&fAntiOmegaMinusInelastic);
+
+  // map to G3 controls
+  TG4ProcessControlMap* controlMap = TG4ProcessControlMap::Instance();
+  controlMap->Add(&fAntiOmegaMinusInelastic, kHADR); 
+
+  // map to G3 ALIMCProcess codes
+  TG4ProcessMCMap* mcMap = TG4ProcessMCMap::Instance();
+  mcMap->Add(&fAntiOmegaMinusInelastic, kPHInhelastic); 
+}
+
+//_____________________________________________________________________________
+void TG4PhysicsConstructorHadron::ConstructHadProcessForOther()
+{
+// Construct processes for other hadrons.
+// ---
+
+  theParticleIterator->reset();
+  while( (*theParticleIterator)() ){
+    G4ParticleDefinition* particle = theParticleIterator->value();
+    G4ProcessManager* pManager = particle->GetProcessManager();
+    G4int nofAlongStepProcesses 
+      = pManager->GetAlongStepProcessVector()->length();
+
+    if ( !particle->IsShortLived()       &&
+         particle->GetPDGCharge() != 0.0 &&
+         nofAlongStepProcesses == 1      && 
+         particle->GetParticleName() != "chargedgeantino") {
+       
+      // create processes
+      G4VProcess* aMultipleScattering = new G4MultipleScattering();
+      G4VProcess* anIonisation = new G4hIonisation();
+
+      // add processes
+      pManager->AddProcess(anIonisation, ordInActive, 2, 2);
+      pManager->AddProcess(aMultipleScattering);
+
+      // set ordering
+      pManager->SetProcessOrdering(aMultipleScattering, idxAlongStep, 1);
+      pManager->SetProcessOrdering(aMultipleScattering, idxPostStep, 1);
+
+      // map to G3 controls
+      TG4ProcessControlMap* controlMap = TG4ProcessControlMap::Instance();
+      controlMap->Add(anIonisation, kLOSS); 
+      controlMap->Add(aMultipleScattering, kMULS); 
+
+      // map to AliMCProcess codes
+      TG4ProcessMCMap* mcMap = TG4ProcessMCMap::Instance();
+      mcMap->Add(anIonisation, kPEnergyLoss); 
+      mcMap->Add(aMultipleScattering, kPMultipleScattering); 
+      
+      // keep for deleting 
+      fOtherProcesses.push_back(aMultipleScattering);
+      fOtherProcesses.push_back(anIonisation);
+    }
+  }    
 }
 
+
 // protected methods
 
+//_____________________________________________________________________________
 void TG4PhysicsConstructorHadron::ConstructParticle()
 {
-// The particles are constructed in the 
-// TG4ModularPhysicsList.
+// Construct all hadrons.
 // ---
+
+  //  Construct all mesons
+  G4MesonConstructor pMesonConstructor;
+  pMesonConstructor.ConstructParticle();
+
+  //  Construct all barions
+  G4BaryonConstructor pBaryonConstructor;
+  pBaryonConstructor.ConstructParticle();
+
+  //  Construct  resonances and quarks
+  G4ShortLivedConstructor pShortLivedConstructor;
+  pShortLivedConstructor.ConstructParticle();  
 }
 
+//_____________________________________________________________________________
 void TG4PhysicsConstructorHadron::ConstructProcess()
 {
-// Makes discrete physics processes for the hadrons, at present limited
-// to those particles with GHEISHA interactions (INTRC > 0).
-// The processes are: Elastic scattering and Inelastic scattering.
-//
-// F.W.Jones  09-JUL-1998
-// ---
-
-   G4HadronElasticProcess* theElasticProcess = 
-                                    new G4HadronElasticProcess;
-   G4LElastic* theElasticModel = new G4LElastic;
-   theElasticProcess->RegisterMe(theElasticModel);
-
-   theParticleIterator->reset();
-   while ((*theParticleIterator)()) {
-      G4ParticleDefinition* particle = theParticleIterator->value();
-      G4ProcessManager* pmanager = particle->GetProcessManager();
-      G4String particleName = particle->GetParticleName();
-     
-      if (particleName == "pi+") {
-         pmanager->AddDiscreteProcess(theElasticProcess);
-         G4PionPlusInelasticProcess* theInelasticProcess = 
-                                new G4PionPlusInelasticProcess("inelastic");
-         G4LEPionPlusInelastic* theLEInelasticModel = 
-                                new G4LEPionPlusInelastic;
-         theInelasticProcess->RegisterMe(theLEInelasticModel);
-         G4HEPionPlusInelastic* theHEInelasticModel = 
-                                new G4HEPionPlusInelastic;
-         theInelasticProcess->RegisterMe(theHEInelasticModel);
-         pmanager->AddDiscreteProcess(theInelasticProcess);
-      }
-      else if (particleName == "pi-") {
-         pmanager->AddDiscreteProcess(theElasticProcess);
-         G4PionMinusInelasticProcess* theInelasticProcess = 
-                                new G4PionMinusInelasticProcess("inelastic");
-         G4LEPionMinusInelastic* theLEInelasticModel = 
-                                new G4LEPionMinusInelastic;
-         theInelasticProcess->RegisterMe(theLEInelasticModel);
-         G4HEPionMinusInelastic* theHEInelasticModel = 
-                                new G4HEPionMinusInelastic;
-         theInelasticProcess->RegisterMe(theHEInelasticModel);
-         pmanager->AddDiscreteProcess(theInelasticProcess);
-#ifdef TRIUMF_STOP_PIMINUS
-         pmanager->AddRestProcess(new G4PionMinusAbsorptionAtRest, ordDefault);
-#else
-         G4String prcNam;
-         pmanager->AddRestProcess(
-           new G4PiMinusAbsorptionAtRest(
-                prcNam="PiMinusAbsorptionAtRest"), ordDefault);
-#endif
-      }
-      else if (particleName == "kaon+") {
-         pmanager->AddDiscreteProcess(theElasticProcess);
-         G4KaonPlusInelasticProcess* theInelasticProcess = 
-                                  new G4KaonPlusInelasticProcess("inelastic");
-         G4LEKaonPlusInelastic* theLEInelasticModel = 
-                                  new G4LEKaonPlusInelastic;
-         theInelasticProcess->RegisterMe(theLEInelasticModel);
-         G4HEKaonPlusInelastic* theHEInelasticModel = 
-                                  new G4HEKaonPlusInelastic;
-         theInelasticProcess->RegisterMe(theHEInelasticModel);
-         pmanager->AddDiscreteProcess(theInelasticProcess);
-      }
-      else if (particleName == "kaon0S") {
-         pmanager->AddDiscreteProcess(theElasticProcess);
-         G4KaonZeroSInelasticProcess* theInelasticProcess = 
-                             new G4KaonZeroSInelasticProcess("inelastic");
-         G4LEKaonZeroSInelastic* theLEInelasticModel = 
-                             new G4LEKaonZeroSInelastic;
-         theInelasticProcess->RegisterMe(theLEInelasticModel);
-         G4HEKaonZeroInelastic* theHEInelasticModel = 
-                             new G4HEKaonZeroInelastic;
-         theInelasticProcess->RegisterMe(theHEInelasticModel);
-         pmanager->AddDiscreteProcess(theInelasticProcess);
-      }
-      else if (particleName == "kaon0L") {
-         pmanager->AddDiscreteProcess(theElasticProcess);
-         G4KaonZeroLInelasticProcess* theInelasticProcess = 
-                             new G4KaonZeroLInelasticProcess("inelastic");
-         G4LEKaonZeroLInelastic* theLEInelasticModel = 
-                             new G4LEKaonZeroLInelastic;
-         theInelasticProcess->RegisterMe(theLEInelasticModel);
-         G4HEKaonZeroInelastic* theHEInelasticModel = 
-                             new G4HEKaonZeroInelastic;
-         theInelasticProcess->RegisterMe(theHEInelasticModel);
-         pmanager->AddDiscreteProcess(theInelasticProcess);
-      }
-      else if (particleName == "kaon-") {
-         pmanager->AddDiscreteProcess(theElasticProcess);
-         G4KaonMinusInelasticProcess* theInelasticProcess = 
-                                 new G4KaonMinusInelasticProcess("inelastic");
-         G4LEKaonMinusInelastic* theLEInelasticModel = 
-                                 new G4LEKaonMinusInelastic;
-         theInelasticProcess->RegisterMe(theLEInelasticModel);
-         G4HEKaonMinusInelastic* theHEInelasticModel = 
-                                 new G4HEKaonMinusInelastic;
-         theInelasticProcess->RegisterMe(theHEInelasticModel);
-         pmanager->AddDiscreteProcess(theInelasticProcess);
-#ifdef TRIUMF_STOP_KMINUS
-         pmanager->AddRestProcess(new G4KaonMinusAbsorption, ordDefault);
-#else
-         pmanager->AddRestProcess(new G4KaonMinusAbsorptionAtRest, ordDefault);
-#endif
-      }
-      else if (particleName == "proton") {
-         pmanager->AddDiscreteProcess(theElasticProcess);
-         G4ProtonInelasticProcess* theInelasticProcess = 
-                                    new G4ProtonInelasticProcess("inelastic");
-         G4LEProtonInelastic* theLEInelasticModel = new G4LEProtonInelastic;
-         theInelasticProcess->RegisterMe(theLEInelasticModel);
-         G4HEProtonInelastic* theHEInelasticModel = new G4HEProtonInelastic;
-         theInelasticProcess->RegisterMe(theHEInelasticModel);
-         pmanager->AddDiscreteProcess(theInelasticProcess);
-      }
-      else if (particleName == "anti_proton") {
-         pmanager->AddDiscreteProcess(theElasticProcess);
-         G4AntiProtonInelasticProcess* theInelasticProcess = 
-                                new G4AntiProtonInelasticProcess("inelastic");
-         G4LEAntiProtonInelastic* theLEInelasticModel = 
-                                new G4LEAntiProtonInelastic;
-         theInelasticProcess->RegisterMe(theLEInelasticModel);
-         G4HEAntiProtonInelastic* theHEInelasticModel = 
-                                new G4HEAntiProtonInelastic;
-         theInelasticProcess->RegisterMe(theHEInelasticModel);
-         pmanager->AddDiscreteProcess(theInelasticProcess);
-      }
-      else if (particleName == "neutron") {
-         pmanager->AddDiscreteProcess(theElasticProcess);
-         G4NeutronInelasticProcess* theInelasticProcess = 
-                                    new G4NeutronInelasticProcess("inelastic");
-         G4LENeutronInelastic* theLEInelasticModel = 
-                                    new G4LENeutronInelastic;
-         theInelasticProcess->RegisterMe(theLEInelasticModel);
-         G4HENeutronInelastic* theHEInelasticModel = 
-                                    new G4HENeutronInelastic;
-         theInelasticProcess->RegisterMe(theHEInelasticModel);
-         pmanager->AddDiscreteProcess(theInelasticProcess);
-      }  
-      else if (particleName == "anti_neutron") {
-         pmanager->AddDiscreteProcess(theElasticProcess);
-         G4AntiNeutronInelasticProcess* theInelasticProcess = 
-                               new G4AntiNeutronInelasticProcess("inelastic");
-         G4LEAntiNeutronInelastic* theLEInelasticModel = 
-                               new G4LEAntiNeutronInelastic;
-         theInelasticProcess->RegisterMe(theLEInelasticModel);
-         G4HEAntiNeutronInelastic* theHEInelasticModel = 
-                               new G4HEAntiNeutronInelastic;
-         theInelasticProcess->RegisterMe(theHEInelasticModel);
-         pmanager->AddDiscreteProcess(theInelasticProcess);
-      }
-      else if (particleName == "lambda") {
-         pmanager->AddDiscreteProcess(theElasticProcess);
-         G4LambdaInelasticProcess* theInelasticProcess = 
-                                    new G4LambdaInelasticProcess("inelastic");
-         G4LELambdaInelastic* theLEInelasticModel = new G4LELambdaInelastic;
-         theInelasticProcess->RegisterMe(theLEInelasticModel);
-         G4HELambdaInelastic* theHEInelasticModel = new G4HELambdaInelastic;
-         theInelasticProcess->RegisterMe(theHEInelasticModel);
-         pmanager->AddDiscreteProcess(theInelasticProcess);
-      }
-      else if (particleName == "anti_lambda") {
-         pmanager->AddDiscreteProcess(theElasticProcess);
-         G4AntiLambdaInelasticProcess* theInelasticProcess = 
-                                new G4AntiLambdaInelasticProcess("inelastic");
-         G4LEAntiLambdaInelastic* theLEInelasticModel = 
-                                new G4LEAntiLambdaInelastic;
-         theInelasticProcess->RegisterMe(theLEInelasticModel);
-         G4HEAntiLambdaInelastic* theHEInelasticModel = 
-                                new G4HEAntiLambdaInelastic;
-         theInelasticProcess->RegisterMe(theHEInelasticModel);
-         pmanager->AddDiscreteProcess(theInelasticProcess);
-      }
-      else if (particleName == "sigma+") {
-         pmanager->AddDiscreteProcess(theElasticProcess);
-         G4SigmaPlusInelasticProcess* theInelasticProcess = 
-                                 new G4SigmaPlusInelasticProcess("inelastic");
-         G4LESigmaPlusInelastic* theLEInelasticModel = 
-                                 new G4LESigmaPlusInelastic;
-         theInelasticProcess->RegisterMe(theLEInelasticModel);
-         G4HESigmaPlusInelastic* theHEInelasticModel = 
-                                 new G4HESigmaPlusInelastic;
-         theInelasticProcess->RegisterMe(theHEInelasticModel);
-         pmanager->AddDiscreteProcess(theInelasticProcess);
-      }
-      else if (particleName == "sigma-") {
-         pmanager->AddDiscreteProcess(theElasticProcess);
-         G4SigmaMinusInelasticProcess* theInelasticProcess = 
-                                 new G4SigmaMinusInelasticProcess("inelastic");
-         G4LESigmaMinusInelastic* theLEInelasticModel = 
-                                 new G4LESigmaMinusInelastic;
-         theInelasticProcess->RegisterMe(theLEInelasticModel);
-         G4HESigmaMinusInelastic* theHEInelasticModel = 
-                                 new G4HESigmaMinusInelastic;
-         theInelasticProcess->RegisterMe(theHEInelasticModel);
-         pmanager->AddDiscreteProcess(theInelasticProcess);
-      }
-      else if (particleName == "anti_sigma+") {
-         pmanager->AddDiscreteProcess(theElasticProcess);
-         G4AntiSigmaPlusInelasticProcess* theInelasticProcess = 
-                             new G4AntiSigmaPlusInelasticProcess("inelastic");
-         G4LEAntiSigmaPlusInelastic* theLEInelasticModel = 
-                                 new G4LEAntiSigmaPlusInelastic;
-         theInelasticProcess->RegisterMe(theLEInelasticModel);
-         G4HEAntiSigmaPlusInelastic* theHEInelasticModel = 
-                                 new G4HEAntiSigmaPlusInelastic;
-         theInelasticProcess->RegisterMe(theHEInelasticModel);
-         pmanager->AddDiscreteProcess(theInelasticProcess);
-      }
-      else if (particleName == "anti_sigma-") {
-         pmanager->AddDiscreteProcess(theElasticProcess);
-         G4AntiSigmaMinusInelasticProcess* theInelasticProcess = 
-                            new G4AntiSigmaMinusInelasticProcess("inelastic");
-         G4LEAntiSigmaMinusInelastic* theLEInelasticModel = 
-                                 new G4LEAntiSigmaMinusInelastic;
-         theInelasticProcess->RegisterMe(theLEInelasticModel);
-         G4HEAntiSigmaMinusInelastic* theHEInelasticModel = 
-                                 new G4HEAntiSigmaMinusInelastic;
-         theInelasticProcess->RegisterMe(theHEInelasticModel);
-         pmanager->AddDiscreteProcess(theInelasticProcess);
-      }
-      else if (particleName == "xi0") {
-         pmanager->AddDiscreteProcess(theElasticProcess);
-         G4XiZeroInelasticProcess* theInelasticProcess = 
-                            new G4XiZeroInelasticProcess("inelastic");
-         G4LEXiZeroInelastic* theLEInelasticModel = 
-                                 new G4LEXiZeroInelastic;
-         theInelasticProcess->RegisterMe(theLEInelasticModel);
-         G4HEXiZeroInelastic* theHEInelasticModel = 
-                                 new G4HEXiZeroInelastic;
-         theInelasticProcess->RegisterMe(theHEInelasticModel);
-         pmanager->AddDiscreteProcess(theInelasticProcess);
-      }
-      else if (particleName == "xi-") {
-         pmanager->AddDiscreteProcess(theElasticProcess);
-         G4XiMinusInelasticProcess* theInelasticProcess = 
-                            new G4XiMinusInelasticProcess("inelastic");
-         G4LEXiMinusInelastic* theLEInelasticModel = 
-                                 new G4LEXiMinusInelastic;
-         theInelasticProcess->RegisterMe(theLEInelasticModel);
-         G4HEXiMinusInelastic* theHEInelasticModel = 
-                                 new G4HEXiMinusInelastic;
-         theInelasticProcess->RegisterMe(theHEInelasticModel);
-         pmanager->AddDiscreteProcess(theInelasticProcess);
-      }
-      else if (particleName == "anti_xi0") {
-         pmanager->AddDiscreteProcess(theElasticProcess);
-         G4AntiXiZeroInelasticProcess* theInelasticProcess = 
-                            new G4AntiXiZeroInelasticProcess("inelastic");
-         G4LEAntiXiZeroInelastic* theLEInelasticModel = 
-                                 new G4LEAntiXiZeroInelastic;
-         theInelasticProcess->RegisterMe(theLEInelasticModel);
-         G4HEAntiXiZeroInelastic* theHEInelasticModel = 
-                                 new G4HEAntiXiZeroInelastic;
-         theInelasticProcess->RegisterMe(theHEInelasticModel);
-         pmanager->AddDiscreteProcess(theInelasticProcess);
-      }
-      else if (particleName == "anti_xi-") {
-         pmanager->AddDiscreteProcess(theElasticProcess);
-         G4AntiXiMinusInelasticProcess* theInelasticProcess = 
-                            new G4AntiXiMinusInelasticProcess("inelastic");
-         G4LEAntiXiMinusInelastic* theLEInelasticModel = 
-                                 new G4LEAntiXiMinusInelastic;
-         theInelasticProcess->RegisterMe(theLEInelasticModel);
-         G4HEAntiXiMinusInelastic* theHEInelasticModel = 
-                                 new G4HEAntiXiMinusInelastic;
-         theInelasticProcess->RegisterMe(theHEInelasticModel);
-         pmanager->AddDiscreteProcess(theInelasticProcess);
-      }
-      else if (particleName == "deuteron") {
-         pmanager->AddDiscreteProcess(theElasticProcess);
-         G4DeuteronInelasticProcess* theInelasticProcess = 
-                            new G4DeuteronInelasticProcess("inelastic");
-         G4LEDeuteronInelastic* theLEInelasticModel = 
-                                 new G4LEDeuteronInelastic;
-         theInelasticProcess->RegisterMe(theLEInelasticModel);
-         pmanager->AddDiscreteProcess(theInelasticProcess);
-      }
-      else if (particleName == "triton") {
-         pmanager->AddDiscreteProcess(theElasticProcess);
-         G4TritonInelasticProcess* theInelasticProcess = 
-                            new G4TritonInelasticProcess("inelastic");
-         G4LETritonInelastic* theLEInelasticModel = 
-                                 new G4LETritonInelastic;
-         theInelasticProcess->RegisterMe(theLEInelasticModel);
-         pmanager->AddDiscreteProcess(theInelasticProcess);
-      }
-      else if (particleName == "alpha") {
-         pmanager->AddDiscreteProcess(theElasticProcess);
-         G4AlphaInelasticProcess* theInelasticProcess = 
-                            new G4AlphaInelasticProcess("inelastic");
-         G4LEAlphaInelastic* theLEInelasticModel = 
-                                 new G4LEAlphaInelastic;
-         theInelasticProcess->RegisterMe(theLEInelasticModel);
-         pmanager->AddDiscreteProcess(theInelasticProcess);
-      }
-      else if (particleName == "omega-") {
-         pmanager->AddDiscreteProcess(theElasticProcess);
-         G4OmegaMinusInelasticProcess* theInelasticProcess = 
-                            new G4OmegaMinusInelasticProcess("inelastic");
-         G4LEOmegaMinusInelastic* theLEInelasticModel = 
-                                 new G4LEOmegaMinusInelastic;
-         theInelasticProcess->RegisterMe(theLEInelasticModel);
-         G4HEOmegaMinusInelastic* theHEInelasticModel = 
-                                 new G4HEOmegaMinusInelastic;
-         theInelasticProcess->RegisterMe(theHEInelasticModel);
-         pmanager->AddDiscreteProcess(theInelasticProcess);
-      }
-      else if (particleName == "anti_omega-") {
-         pmanager->AddDiscreteProcess(theElasticProcess);
-         G4AntiOmegaMinusInelasticProcess* theInelasticProcess = 
-                            new G4AntiOmegaMinusInelasticProcess("inelastic");
-         G4LEAntiOmegaMinusInelastic* theLEInelasticModel = 
-                                 new G4LEAntiOmegaMinusInelastic;
-         theInelasticProcess->RegisterMe(theLEInelasticModel);
-         G4HEAntiOmegaMinusInelastic* theHEInelasticModel = 
-                                 new G4HEAntiOmegaMinusInelastic;
-         theInelasticProcess->RegisterMe(theHEInelasticModel);
-         pmanager->AddDiscreteProcess(theInelasticProcess);
-      }
-   }
-
-   if (verboseLevel>0)
+// Construct all hadronic processes.
+// ---
+  if (fSetHadron) {
+    // Elastic process
+    fElasticModel = new G4LElastic();
+    fElasticProcess.RegisterMe(fElasticModel);
+  
+    // Hadron processes
+    ConstructHadProcessForPionPlus();
+    ConstructHadProcessForPionMinus();
+    ConstructHadProcessForKaonPlus();
+    ConstructHadProcessForKaonMinus();
+    ConstructHadProcessForKaonZeroLong();
+    ConstructHadProcessForKaonZeroShort();
+    ConstructHadProcessForProton();
+    ConstructHadProcessForAntiProton();
+    ConstructHadProcessForNeutron();
+    ConstructHadProcessForAntiNeutron();
+    ConstructHadProcessForLambda();
+    ConstructHadProcessForAntiLambda();
+    ConstructHadProcessForSigmaMinus();
+    ConstructHadProcessForAntiSigmaMinus();
+    ConstructHadProcessForSigmaPlus();
+    ConstructHadProcessForAntiSigmaPlus();
+    ConstructHadProcessForXiMinus();
+    ConstructHadProcessForAntiXiMinus();
+    ConstructHadProcessForXiZero();
+    ConstructHadProcessForAntiXiZero();
+    ConstructHadProcessForOmegaMinus();
+    ConstructHadProcessForAntiOmegaMinus();
+    ConstructHadProcessForOther();
+  }  
+
+  if (fSetEM) {
+    // EM processes
+    ConstructEMProcessForPionPlus();
+    ConstructEMProcessForPionMinus();
+    ConstructEMProcessForKaonPlus();
+    ConstructEMProcessForKaonMinus();
+    ConstructEMProcessForProton();
+    ConstructEMProcessForAntiProton();
+    ConstructEMProcessForSigmaMinus();
+    ConstructEMProcessForAntiSigmaMinus();
+    ConstructEMProcessForSigmaPlus();
+    ConstructEMProcessForAntiSigmaPlus();
+    ConstructEMProcessForXiMinus();
+    ConstructEMProcessForAntiXiMinus();
+    ConstructEMProcessForOmegaMinus();
+    ConstructEMProcessForAntiOmegaMinus();
+    ConstructEMProcessForOther();
+  }  
+
+  if (VerboseLevel() > 0) {
      G4cout << "### Hadron physics constructed." << G4endl;
+  }   
 }