"""
# ==================================================================
#  [Geant4] module package
#
#  Welcome to Geant4Py.
#
#  This package contains a set of Python interface with Geant4.
#  Hava A Fun!
# ==================================================================
"""
# $Id: __init__.py,v 1.22 2010/06/04 05:47:44 kmura Exp $
__version__ ='9.4.0 beta'
__date__ = '25/June/2010'
__author__ = 'K.Murakami (Koichi.Murakami@kek.jp)'

# import submodules
from G4interface import *
from G4intercoms import *
from G4global import *
from G4run import *
from G4event import *
from G4tracking import *
from G4track import *
from G4particles import *
from G4processes import *
from G4geometry import *
from G4materials import *
from G4physicslists import *
from G4digits_hits import *
from G4visualization import *
from G4gdml import *
from G4graphics_reps import *
from hepunit import *
from colortable import *

def print_version():
  print """=============================================================
  Welcome to Geant4Py (A Geant4-Python Bridge)
  
  Version : %s
  Date    : %s
  Contact : %s
=============================================================
""" % ( __version__, __date__, __author__)

# ==================================================================
# initialize
# ==================================================================
# set G4cout/G4cerr to Python stdout
SetG4PyCoutDestination()

# ==================================================================
# globals, which start with "g"
# ==================================================================
# gRunManager
if G4RunManager.GetRunManager() == None:
  gRunManager = G4RunManager()
else:
  gRunManager = G4RunManager.GetRunManager()
gRunManagerKernel = G4RunManagerKernel.GetRunManagerKernel()

# gUImanager
gUImanager = G4UImanager.GetUIpointer()

# gEventManager
gEventManager = G4EventManager.GetEventManager()

# gStackManager
gStackManager = gEventManager.GetStackManager()

# gTrackingManager
gTrackingManager = gEventManager.GetTrackingManager()

# gStateManager
gStateManager = G4StateManager.GetStateManager()
gExceptionHandler = G4ExceptionHandler() # automatically registered

# gGeometryManager
gGeometryManager = G4GeometryManager.GetInstance()

# gTransportationManager
gTransportationManager = G4TransportationManager.GetTransportationManager()

# gParticleTable
gParticleTable = G4ParticleTable.GetParticleTable()
gParticleIterator = PyG4ParticleList()

# gProcessTable
gProcessTable = G4ProcessTable.GetProcessTable()

# gLossTableManager
gLossTableManager = G4LossTableManager.Instance()

# gProductionCutsTable
gProductionCutsTable = G4ProductionCutsTable.GetProductionCutsTable()

# gEmCalculator
gEmCalculator = G4EmCalculator()

# gMaterial/ElementTable
gMaterialTable = G4Material.GetMaterialTable()
gElementTable = G4Element.GetElementTable()

# gNistManager (since 7.1)
_material_class_list = dir(G4materials)
_qfind = _material_class_list.count("G4NistManager") > 0
if _qfind:
  gNistManager = G4NistManager.Instance()

# gVisManager
_visdriver_list = dir(G4visualization)
_q_opengl_ix = "G4OpenGLImmediateX" in _visdriver_list
_q_opengl_sx = "G4OpenGLStoredX" in _visdriver_list
_q_opengl_ixm = "G4OpenGLImmediateXm" in _visdriver_list
_q_opengl_sxm = "G4OpenGLStoredXm" in _visdriver_list
_q_raytracer_x = "G4RayTracerX" in _visdriver_list

if G4VisManager.GetConcreteInstance() == None:
  gVisManager = G4VisManager()
  if _q_opengl_ix:
    _opengl_ix = G4OpenGLImmediateX()
  if _q_opengl_sx:
    _opengl_sx = G4OpenGLStoredX()
  if _q_opengl_ixm:
    _opengl_ixm = G4OpenGLImmediateXm()
  if _q_opengl_sxm:
    _opengl_sxm = G4OpenGLStoredXm()
  if _q_raytracer_x:
    _raytracer_x = G4RayTracerX()

  _vrml1 = G4VRML1File()
  _vrml2 = G4VRML2File()
  _dawn = G4DAWNFILE()
  _heprep_xml = G4HepRep()
  _heprep_file = G4HepRepFile()
  _atree = G4ASCIITree()
  _raytracer = G4RayTracer()

  if _q_opengl_ix:
    gVisManager.RegisterGraphicsSystem(_opengl_ix)
  if _q_opengl_sx:
    gVisManager.RegisterGraphicsSystem(_opengl_sx)
  if _q_opengl_ixm:
    gVisManager.RegisterGraphicsSystem(_opengl_ixm)
  if _q_opengl_sxm:
    gVisManager.RegisterGraphicsSystem(_opengl_sxm)
  if _q_raytracer_x:
    gVisManager.RegisterGraphicsSystem(_raytracer_x)

  gVisManager.RegisterGraphicsSystem(_vrml1)
  gVisManager.RegisterGraphicsSystem(_vrml2)
  gVisManager.RegisterGraphicsSystem(_dawn)
  gVisManager.RegisterGraphicsSystem(_heprep_xml)
  gVisManager.RegisterGraphicsSystem(_heprep_file)
  gVisManager.RegisterGraphicsSystem(_atree)
  gVisManager.RegisterGraphicsSystem(_raytracer)
    
  gVisManager.Initialize()

# version information
gG4Version = G4Version
gG4Date = G4Date
gG4VERSION_NUMBER = G4VERSION_NUMBER

# ------------------------------------------------------------------
# functions
# ------------------------------------------------------------------
gControlExecute = gUImanager.ExecuteMacroFile
gApplyUICommand = G4intercoms.ApplyUICommand
gGetCurrentValues = gUImanager.GetCurrentValues
gStartUISession = G4interface.StartUISession


# ==================================================================
# extentions
# ==================================================================

# ------------------------------------------------------------------
# generate one event
# ------------------------------------------------------------------
def _one_event(self):
  "generate one event."
  self.BeamOn(1)

G4RunManager.OneEvent = _one_event

# ------------------------------------------------------------------
# list material information
# ------------------------------------------------------------------
def _list_material(self):
  "list materials."
  n_materials = len(gMaterialTable)
  print " +------------------------------------------------------------------"
  print " |       Table of G4Material-s (%d materails defined)" % (n_materials)
  for i in range(0, n_materials) :
    material = gMaterialTable[i]
    print " |--------------------------------------------------------"\
          "----------"
    print " | %s: %s" % (material.GetName(),
                         G4BestUnit(material.GetDensity(),"Volumic Mass"))

    elementVec = material.GetElementVector()
    fractionVec = material.GetFractionVector()
    abundanceVec = material.GetVecNbOfAtomsPerVolume()
    totNAtoms = material.GetTotNbOfAtomsPerVolume()

    n_elements = len(elementVec)
    for j in range(0, n_elements):
      print " | + (%1d) %s(%s): A=%4.1f, N=%5.1f, " \
            "Frac.=(%4.1f%%m,%4.1f%%a)" % \
            (j+1, elementVec[j].GetName(), elementVec[j].GetSymbol(),
             elementVec[j].GetZ(),
             elementVec[j].GetN(),
             fractionVec[j]/hepunit.perCent,
             abundanceVec[j]/totNAtoms/hepunit.perCent)

  print " +------------------------------------------------------------------"

G4MaterialTable.ListMaterial = _list_material


# ------------------------------------------------------------------
# termination
# ------------------------------------------------------------------
def gTerminate():
    gGeometryManager.OpenGeometry()


# ------------------------------------------------------------------
# signal handler
# ------------------------------------------------------------------
import signal
import threading

def _run_abort(signum, frame):
  state = gStateManager.GetCurrentState();

  if(state == G4ApplicationState.G4State_GeomClosed or
     state == G4ApplicationState.G4State_EventProc):
    print "aborting Run ...";
    gRunManager.AbortRun(True);
  else:
    raise KeyboardInterrupt

if (threading.activeCount() == 1):
  signal.signal(signal.SIGINT, _run_abort)


