From f79b0a1e9ba90364be9af11f9e2d9397321b852c Mon Sep 17 00:00:00 2001
From: Wouter Deconinck <wdconinc@gmail.com>
Date: Wed, 23 Mar 2022 19:35:30 +0000
Subject: [PATCH] New geometry

---
 .clang-format                       | 112 ++++
 .gitignore                          |  26 +
 .gitlab-ci.yml                      | 140 +++++
 CMakeLists.txt                      |  37 ++
 README.md                           |   6 +-
 bin/dawn_tweak                      | 149 +++++
 bin/generate_prim_file              | 156 +++++
 bin/make_dawn_views                 |  99 ++++
 compact/beamline.xml                |  55 ++
 compact/colors.xml                  |  24 +
 compact/definitions.xml             |   6 +
 compact/display.xml                 |  40 ++
 compact/electron_tracker.xml        | 146 +++++
 compact/elements.xml                | 885 ++++++++++++++++++++++++++++
 compact/fields.xml                  |  18 +
 compact/materials.xml               | 222 +++++++
 compact/photon_calorimeter.xml      |  49 ++
 compton.xml                         |  56 ++
 scripts/checkOverlaps.py            |  45 ++
 src/CylindricalDipoleMagnet_geo.cpp |  99 ++++
 src/Tracker_geo.cpp                 | 263 +++++++++
 views/generate_prim_files.yml       |  40 ++
 views/view50.yml                    |  41 ++
 views/view50/generate_eps           |  75 +++
 24 files changed, 2787 insertions(+), 2 deletions(-)
 create mode 100644 .clang-format
 create mode 100644 .gitignore
 create mode 100644 .gitlab-ci.yml
 create mode 100644 CMakeLists.txt
 create mode 100755 bin/dawn_tweak
 create mode 100755 bin/generate_prim_file
 create mode 100755 bin/make_dawn_views
 create mode 100644 compact/beamline.xml
 create mode 100644 compact/colors.xml
 create mode 100644 compact/definitions.xml
 create mode 100644 compact/display.xml
 create mode 100644 compact/electron_tracker.xml
 create mode 100644 compact/elements.xml
 create mode 100644 compact/fields.xml
 create mode 100644 compact/materials.xml
 create mode 100644 compact/photon_calorimeter.xml
 create mode 100644 compton.xml
 create mode 100755 scripts/checkOverlaps.py
 create mode 100644 src/CylindricalDipoleMagnet_geo.cpp
 create mode 100644 src/Tracker_geo.cpp
 create mode 100644 views/generate_prim_files.yml
 create mode 100644 views/view50.yml
 create mode 100755 views/view50/generate_eps

diff --git a/.clang-format b/.clang-format
new file mode 100644
index 0000000..05b10dc
--- /dev/null
+++ b/.clang-format
@@ -0,0 +1,112 @@
+---
+Language:        Cpp
+BasedOnStyle:  Chromium
+AccessModifierOffset: -2
+AlignAfterOpenBracket: Align
+AlignConsecutiveAssignments: true
+AlignConsecutiveDeclarations: true
+AlignEscapedNewlines: Right
+AlignOperands:   true
+AlignTrailingComments: true
+AllowAllParametersOfDeclarationOnNextLine: true
+AllowShortBlocksOnASingleLine: false
+AllowShortCaseLabelsOnASingleLine: false
+AllowShortFunctionsOnASingleLine: All
+AllowShortIfStatementsOnASingleLine: false
+AllowShortLoopsOnASingleLine: false
+AlwaysBreakAfterDefinitionReturnType: None
+AlwaysBreakAfterReturnType: None
+AlwaysBreakBeforeMultilineStrings: false
+AlwaysBreakTemplateDeclarations: true
+BinPackArguments: true
+BinPackParameters: true
+BraceWrapping:   
+  AfterClass:      false
+  AfterControlStatement: false
+  AfterEnum:       false
+  AfterFunction:   true
+  AfterNamespace:  false
+  AfterObjCDeclaration: false
+  AfterStruct:     false
+  AfterUnion:      false
+  AfterExternBlock: false
+  BeforeCatch:     false
+  BeforeElse:      false
+  IndentBraces:    false
+  SplitEmptyFunction: true
+  SplitEmptyRecord: true
+  SplitEmptyNamespace: true
+BreakBeforeBinaryOperators: None
+BreakBeforeBraces: Custom
+BreakBeforeInheritanceComma: false
+BreakBeforeTernaryOperators: true
+BreakConstructorInitializersBeforeComma: false
+BreakConstructorInitializers: BeforeColon
+BreakAfterJavaFieldAnnotations: false
+BreakStringLiterals: true
+ColumnLimit:     120
+CommentPragmas:  '^ IWYU pragma:'
+CompactNamespaces: false
+ConstructorInitializerAllOnOneLineOrOnePerLine: false
+ConstructorInitializerIndentWidth: 4
+ContinuationIndentWidth: 4
+Cpp11BracedListStyle: true
+DerivePointerAlignment: false
+DisableFormat:   false
+ExperimentalAutoDetectBinPacking: false
+FixNamespaceComments: true
+ForEachMacros:   
+  - foreach
+  - Q_FOREACH
+  - BOOST_FOREACH
+IncludeBlocks:   Preserve
+IncludeCategories: 
+  - Regex:           '^"(llvm|llvm-c|clang|clang-c)/'
+    Priority:        2
+  - Regex:           '^(<|"(gtest|gmock|isl|json)/)'
+    Priority:        3
+  - Regex:           '.*'
+    Priority:        1
+IncludeIsMainRegex: '(Test)?$'
+IndentCaseLabels: false
+IndentPPDirectives: None
+IndentWidth:     2
+IndentWrappedFunctionNames: false
+JavaScriptQuotes: Leave
+JavaScriptWrapImports: true
+KeepEmptyLinesAtTheStartOfBlocks: true
+MacroBlockBegin: ''
+MacroBlockEnd:   ''
+MaxEmptyLinesToKeep: 1
+NamespaceIndentation: All
+ObjCBlockIndentWidth: 2
+ObjCSpaceAfterProperty: false
+ObjCSpaceBeforeProtocolList: true
+PenaltyBreakAssignment: 2
+PenaltyBreakBeforeFirstCallParameter: 19
+PenaltyBreakComment: 300
+PenaltyBreakFirstLessLess: 120
+PenaltyBreakString: 1000
+PenaltyExcessCharacter: 1000000
+PenaltyReturnTypeOnItsOwnLine: 60
+PointerAlignment: Left
+ReflowComments:  true
+SortIncludes:    true
+SortUsingDeclarations: true
+SpaceAfterCStyleCast: false
+SpaceAfterTemplateKeyword: true
+SpaceBeforeAssignmentOperators: true
+SpaceBeforeParens: ControlStatements
+#SpaceBeforeRangeBasedForLoopColon: true
+SpaceInEmptyParentheses: false
+SpacesBeforeTrailingComments: 1
+SpacesInAngles:  false
+SpacesInContainerLiterals: true
+SpacesInCStyleCastParentheses: false
+SpacesInParentheses: false
+SpacesInSquareBrackets: false
+Standard:        Cpp11
+TabWidth:        8
+UseTab:          Never
+...
+
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..21b41f3
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,26 @@
+!*.png
+
+*.prim
+*/*.eps
+*/*/*.eps
+*/*/*.png
+*/*/*.pdf
+*.root
+build/*
+.DAWN*
+*/*.pyc
+**.pyc
+
+images/*
+doc/*
+
+accelerator
+eic
+
+*.swp
+
+fieldmaps
+
+manifest.txt
+acts.txt
+acts2.txt
diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
new file mode 100644
index 0000000..f8ab71a
--- /dev/null
+++ b/.gitlab-ci.yml
@@ -0,0 +1,140 @@
+image: eicweb.phy.anl.gov:4567/eic/juggler/juggler:latest
+
+workflow:
+  rules:
+    - if: '$CI_PIPELINE_SOURCE == "merge_request_event"'
+    - if: '$CI_PIPELINE_SOURCE == "web"'
+    - if: '$CI_PIPELINE_SOURCE == "webide"'
+    - if: '$CI_COMMIT_BRANCH == "master"'
+    - if: '$CI_COMMIT_TAG'
+
+default:
+  before_script:
+    - source .local/bin/env.sh
+  artifacts:
+    expire_in: 72 hours 
+    paths:
+      - .local/detector
+      - .local/lib
+      - .local/bin
+      - .local/include
+      - .local/share
+      - results
+      - config
+      - images
+      - doc
+      - juggler.env
+      - geo
+    reports:
+      dotenv: juggler.env
+
+stages:
+  - config
+  - initialize
+  - build
+  - test 
+  - docs
+  - collect
+  - finalize 
+  - deploy
+
+common:setup:
+  stage: config
+  rules:
+    - if: '$CI_SERVER_HOST == "eicweb.phy.anl.gov"' 
+  before_script:
+    - git clone https://eicweb.phy.anl.gov/EIC/benchmarks/common_bench.git setup 
+  script:
+    - |
+      source setup/bin/env.sh && ./setup/bin/install_common.sh
+      export BEAMLINE_CONFIG="compton"
+      if [[ -z "${JUGGLER_DETECTOR}" ]]; then 
+        export JUGGLER_DETECTOR="compton"
+      fi
+      if [[ "x${CI_PIPELINE_SOURCE}" == "xmerge_request_event"  || "$CI_COMMIT_BRANCH" == "master" ]]; then
+        export BEAMLINE_CONFIG_VERSION=${CI_COMMIT_REF_NAME}
+        echo "BEAMLINE_CONFIG          = ${BEAMLINE_CONFIG}"
+        echo "BEAMLINE_CONFIG_VERSION  = ${CI_COMMIT_REF_NAME}"
+        echo "JUGGLER_DETECTOR         = ${JUGGLER_DETECTOR}"
+        # add to env file testing
+        echo "BEAMLINE_CONFIG_VERSION=$CI_COMMIT_REF_NAME" >> juggler.env
+        echo "BEAMLINE_CONFIG=$BEAMLINE_CONFIG" >> juggler.env
+        echo "JUGGLER_DETECTOR=$JUGGLER_DETECTOR" >> juggler.env
+        # if specific juggler version is requested
+        if [[ -n "${JUGGLER_DETECTOR_VERSION}" ]]; then
+          echo "JUGGLER_DETECTOR_VERSION = ${CI_COMMIT_REF_NAME}"
+          echo "JUGGLER_DETECTOR_VERSION=$CI_COMMIT_REF_NAME" >> juggler.env
+        fi
+      fi
+    - |
+      source .local/bin/env.sh
+      mkdir -p build && cd build && cmake ../. -DCMAKE_INSTALL_PREFIX=${LOCAL_PREFIX} && make -j20  || exit -1 
+      make install  && cd ..
+      mkdir_local_data_link sim_output
+      ls -lrth
+      print_env.sh
+
+common:detector:
+  stage: initialize
+  needs: ["common:setup"]
+  script:
+    - source .local/bin/env.sh
+    - mkdir_local_data_link sim_output
+    - mkdir -p results
+    - mkdir -p config
+    - mkdir -p doc
+    - mkdir -p geo
+    - print_env.sh
+
+.views:
+  stage: docs
+  before_script:
+    - source .local/bin/env.sh
+    - env
+    - pip3 install psutil
+  needs:
+    - ["common:detector"]
+
+# include:
+#   - local: 'views/generate_prim_files.yml'
+#   - local: 'views/view50.yml'
+
+dump_constants:
+  stage: test
+  needs: 
+    - ["common:detector"]
+  script:
+    - npdet_info dump compton.xml  | tee doc/constants.out 
+
+dump_geometry:
+  stage: test
+  needs:
+    - common:detector
+  script:
+   - echo "dumping geometry"
+   - mkdir -p geo
+   - dd_web_display --output geo/detector_geo_full.root compton.xml
+   - echo "Geometry viewer at https://eic.phy.anl.gov/geoviewer/index.htm?file=https://eicweb.phy.anl.gov/EIC/detectors/compton/-/jobs/${CI_JOB_ID}/artifacts/raw/geo/detector_geo_full.root?job=dump_geometry&item=default;1&opt=transp30;zoom75;ROTY290;ROTZ350;trz0;trr0;ctrl;all&"
+
+xmllint:
+  stage: test
+  needs: 
+    - ["common:detector"]
+  script:
+    - xmllint compact/*.xml compton.xml > /dev/null
+
+overlap_check:
+  stage: test
+  needs: 
+    - ["common:detector"]
+  script:
+    - checkOverlaps -c compton.xml 
+
+overlap_check_geant4:
+  stage: test
+  needs: 
+    - ["common:detector"]
+  script:
+    - python scripts/checkOverlaps.py -c compton.xml | tee doc/overlap_check_geant4.out
+    - echo "$(cat doc/overlap_check_geant4.out | grep GeomVol1002 | wc -l) overlaps..."
+    - if [[ "$(cat doc/overlap_check_geant4.out | grep GeomVol1002 | wc -l)" -gt "0" ]] ; then echo "Overlaps exist!" && false ; fi
diff --git a/CMakeLists.txt b/CMakeLists.txt
new file mode 100644
index 0000000..0f29899
--- /dev/null
+++ b/CMakeLists.txt
@@ -0,0 +1,37 @@
+cmake_minimum_required(VERSION 3.12 FATAL_ERROR)
+
+# CMP0074: find_package() uses <PackageName>_ROOT variables
+cmake_policy(SET CMP0074 NEW)
+
+PROJECT(compton
+  LANGUAGES CXX
+  DESCRIPTION "EIC Compton Detector Description in DD4hep"
+  )
+
+set(CMAKE_CXX_STANDARD 17)
+set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wextra -Werror")
+
+find_package(DD4hep REQUIRED COMPONENTS DDCore DDG4)
+
+#-----------------------------------------------------------------------------------
+set(a_lib_name Compton)
+dd4hep_configure_output()
+
+dd4hep_add_plugin(${a_lib_name}
+  SOURCES
+  src/CylindricalDipoleMagnet_geo.cpp
+  src/Tracker_geo.cpp
+  USES ROOT::Core ROOT::Gdml
+  )
+target_link_libraries(${a_lib_name}
+  PUBLIC DD4hep::DDCore DD4hep::DDRec DD4hep::DDG4
+  )
+
+#-----------------------------------------------------------------------------------
+install(DIRECTORY compact/
+    DESTINATION share/${PROJECT_NAME}/compact
+    FILES_MATCHING PATTERN "*.xml"
+    )
+install(FILES compton.xml
+    DESTINATION share/${PROJECT_NAME}/
+    )
diff --git a/README.md b/README.md
index b674212..da0635c 100644
--- a/README.md
+++ b/README.md
@@ -1,3 +1,5 @@
-# Compton
+# EIC Compton Detector Description in DD4hep
+
+- [Compton geometry](https://eic.phy.anl.gov/geoviewer/index.htm?file=https://eicweb.phy.anl.gov/EIC/detectors/compton/-/jobs/artifacts/master/raw/geo/detector_geo_full.root?job=dump_geometry&item=default;1&opt=clipxyz;transp30;zoom75;ROTY290;ROTZ350;trz0;trr0;ctrl;all&)
+
 
-EIC Compton Detector Description in DD4hep
\ No newline at end of file
diff --git a/bin/dawn_tweak b/bin/dawn_tweak
new file mode 100755
index 0000000..35e6ea0
--- /dev/null
+++ b/bin/dawn_tweak
@@ -0,0 +1,149 @@
+#!/bin/bash
+
+#git clone --depth 1 https://eicweb.phy.anl.gov/EIC/datasets.git
+export DAWN_PS_PREVIEWER="ls"
+
+OUT_FILE=".DAWN_1.history"
+
+function print_the_help {
+  echo "USAGE: ${0} [-s <skip_events>] -d <dawn_run_dir> "
+  echo "  OPTIONS: "
+  echo "            -x         targeted x coordinate position"
+  echo "            -y         targeted x coordinate position"
+  echo "            -z         targeted x coordinate position"
+  echo "            --theta    viewing angle"
+  echo "            --phi      viewing angle"
+  echo "            -m,--mag   magnification"
+  echo "            --draw     draw style "
+  echo "            -d,--dawn-dir <dawn_run_dir>  Directory with the .DAWN files and a generate script "
+  exit 
+}
+
+function yes_or_no {
+  while true; do
+    read -p "$* [y/n]: " yn
+    case $yn in
+      [Yy]*) return 0 ;;
+      [Nn]*) echo "No entered" ; return 1 ;;
+    esac
+  done
+}
+
+if [[ $# -eq 0 ]] ; then
+  print_the_help
+  exit 
+fi
+
+SKIP_EVENTS=0
+DETECTOR_ONLY=0
+FILE_TAG="view"
+DAWN_RUN_DIR="."
+
+
+POSITIONAL=()
+while [[ $# -gt 0 ]]
+do
+  key="$1"
+
+  case $key in
+    -h|--help)
+      shift # past argument
+      print_the_help
+      ;;
+    -x)
+      echo "updating x coordinate to ${2}"
+      sed -i '5d' ${DAWN_RUN_DIR}/${OUT_FILE}
+      sed -i '5i'${2} ${DAWN_RUN_DIR}/${OUT_FILE}
+      shift # past argument
+      shift # past value
+      ;;
+    -y)
+      echo "updating y coordinate to ${2}"
+      sed -i '6d' ${DAWN_RUN_DIR}/${OUT_FILE}
+      sed -i '6i'${2} ${DAWN_RUN_DIR}/${OUT_FILE}
+      shift # past argument
+      shift # past value
+      ;;
+    -z)
+      echo "updating z coordinate to ${2}"
+      sed -i '7d' ${DAWN_RUN_DIR}/${OUT_FILE}
+      sed -i '7i'${2} ${DAWN_RUN_DIR}/${OUT_FILE}
+      shift # past argument
+      shift # past value
+      ;;
+    --theta)
+      echo "updating theta angle to ${2}"
+      sed -i '3d' ${DAWN_RUN_DIR}/${OUT_FILE}
+      sed -i '3i'${2} ${DAWN_RUN_DIR}/${OUT_FILE}
+      shift # past argument
+      shift # past value
+      ;;
+    --phi)
+      echo "updating phi angle to ${2}"
+      sed -i '2d' ${DAWN_RUN_DIR}/${OUT_FILE}
+      sed -i '2i'${2} ${DAWN_RUN_DIR}/${OUT_FILE}
+      shift # past argument
+      shift # past value
+      ;;
+    --mag)
+      echo "updating magnification to ${2}"
+      sed -i '8d' ${DAWN_RUN_DIR}/${OUT_FILE}
+      sed -i '8i'${2} ${DAWN_RUN_DIR}/${OUT_FILE}
+      shift # past argument
+      shift # past value
+      ;;
+    --draw)
+      echo "updating drawing to ${2}"
+      sed -i '9d' ${DAWN_RUN_DIR}/${OUT_FILE}
+      sed -i '9i'${2} ${DAWN_RUN_DIR}/${OUT_FILE}
+      shift # past argument
+      shift # past value
+      ;;
+    --light-theta)
+      echo "updating drawing to ${2}"
+      sed -i '19d' ${DAWN_RUN_DIR}/${OUT_FILE}
+      sed -i '19i'${2} ${DAWN_RUN_DIR}/${OUT_FILE}
+      shift # past argument
+      shift # past value
+      ;;
+    --light-phi)
+      echo "updating drawing to ${2}"
+      sed -i '18d' ${DAWN_RUN_DIR}/${OUT_FILE}
+      sed -i '18i'${2} ${DAWN_RUN_DIR}/${OUT_FILE}
+      shift # past argument
+      shift # past value
+      ;;
+    -i|--input)
+      OUT_FILE="$2"
+      shift # past argument
+      shift # past value
+      ;;
+    -o|--ouput-dir)
+      OUTPUT_DIR="$2"
+      shift # past argument
+      shift # past value
+      ;;
+    -D|--detector-only)
+      DETECTOR_ONLY=1
+      shift # past argument
+      #shift # past value
+      ;;
+    -d|--dawn-dir)
+      DAWN_RUN_DIR=$2
+      shift # past argument
+      shift # past value
+      ;;
+    -t|--tag)
+      FILE_TAG=$2
+      shift # past argument
+      shift # past value
+      ;;
+    *)    # unknown option
+      #POSITIONAL+=("$1") # save it in an array for later
+      echo "unknown option $1"
+      print_the_help
+      shift # past argument
+      ;;
+  esac
+done
+set -- "${POSITIONAL[@]}" # restore positional parameters
diff --git a/bin/generate_prim_file b/bin/generate_prim_file
new file mode 100755
index 0000000..614d1d0
--- /dev/null
+++ b/bin/generate_prim_file
@@ -0,0 +1,156 @@
+#!/usr/bin/env python3
+
+# same as make_dawn_views but stops at generating the prim file.
+# W. Armstrong (ANL), original bash script
+# C. Peng (ANL), translate to python and add flexible run time for simulation
+
+import os
+import signal
+import subprocess
+import argparse
+import atexit
+import time
+from datetime import datetime
+import fcntl
+import psutil
+
+
+def readline_nonblocking(output):
+    fd = output.fileno()
+    fl = fcntl.fcntl(fd, fcntl.F_GETFL)
+    fcntl.fcntl(fd, fcntl.F_SETFL, fl | os.O_NONBLOCK)
+    try:
+        return output.readline()
+    except:
+        return ''
+
+
+# arguments
+parser = argparse.ArgumentParser()
+
+parser.add_argument('-c', '--compact-file', type=str, dest='compact',
+        default=os.path.join(os.environ.get('DETECTOR_PATH', '.'), 'athena.xml'),
+        help='Top level compact file for detectors')
+
+parser.add_argument('-s', '--skip', type=int,
+        default=0,
+        help='Number of events number to skip in the input')
+
+parser.add_argument('-i', '--input', type=str,
+        default='scripts/input_data/few_events.hepmc',
+        help='Input hepmc file')
+
+parser.add_argument('-o', '--output-dir', type=str, dest='out_dir',
+        default='sim_output',
+        help='output directory')
+
+parser.add_argument('-D', '--detector-only', action='store_true', dest='detector_only',
+        help='only generate the prim files for the detector geometry')
+
+parser.add_argument('-t', '--tag', type=str,dest='file_tag',
+        default='view',
+        help='Output file tag')
+
+parser.add_argument('--timeout', type=int,
+        default=60,
+        help='Timeout in seconds')
+        
+parser.add_argument('passthrough', nargs='*')
+
+args = parser.parse_args()
+
+macro = 'macro/dawn_picture.mac' if args.detector_only else 'macro/dawn_picture2.mac'
+
+# raise error if cannot create a temporary working dir
+# os.makedirs('dawn_view_tmp', exist_ok=False)
+os.makedirs(args.out_dir, exist_ok=True)
+
+# use absolute path so the chdir does not affect them
+args.input = os.path.abspath(args.input)
+args.out_dir = os.path.abspath(args.out_dir)
+args.compact = os.path.abspath(args.compact)
+macro = os.path.abspath(macro)
+
+prim_file = 'g4_0000.prim'
+dawn_env = os.environ.copy()
+dawn_env['DAWN_BATCH'] = 'a'
+# sdir = os.path.dirname(os.path.realpath(__file__))
+
+# Using a python warpper such as npsim introduces some problem in managing the subprocess.
+# The process1 managed by subprocess will generate another process with proc2_pid = proc1_pid + 1, which will not
+# be terminated by terminating or killing the process1.
+# In addition, running Geant4 with vis mode will never exit automatically (it waits for input).
+# Thus the created process 2 will occupy the system resources.
+sim_cmd = ['npsim', '--runType', 'vis',
+        '--compact', args.compact,
+        '--inputFiles', args.input,
+        '--outputFile', 'derp.root',
+        '--numberOfEvents', '1',
+        '--skipNEvents', str(args.skip),
+        '--macroFile', macro]
+
+start = datetime.now()
+elapse = datetime.now() - start
+last_update = datetime.now()
+finished = False
+
+# run simulation
+print(' '.join(sim_cmd))
+p = subprocess.Popen(args=sim_cmd, env=dawn_env,
+                     stdout=subprocess.PIPE, stderr=subprocess.PIPE, stdin=subprocess.PIPE)
+__child_pid = p.pid
+while elapse.seconds < args.timeout:
+    line = readline_nonblocking(p.stdout)
+    elapse = datetime.now() - start
+    time_left = args.timeout - elapse.seconds
+    time_str = '[{:02d}:{:02d}]'.format(elapse.seconds // 60, elapse.seconds % 60)
+
+    if time_left < 10:
+        print('{} === TIMEOUT ===: Terminating in {:d} seconds'.format(time_str, time_left))
+
+    if line:
+        decoded_line = line.decode('utf-8').strip()
+        print('{} {}'.format(time_str, decoded_line))
+        # what we are looking for
+        if decoded_line == 'File  {}  is generated.'.format(prim_file):
+            print('{} === FINISHED ===: Got the prim file, terminating.'.format(time_str))
+            finished = True
+            break
+        if decoded_line == 'Idle>':
+            p.stdin.write(b'exit')
+            break
+        # do not sleep
+        continue
+
+    # ended early before file
+    if p.poll() is not None:
+        print(p.poll())
+        break
+
+    time.sleep(1)
+
+p.kill()
+# use to kill the subprocess generated from the python wrapper
+# this is unsafe so maybe more checks required
+for proc in psutil.process_iter():
+    pinfo = proc.as_dict(attrs=['pid', 'name', 'create_time'])
+    if pinfo['pid'] == p.pid + 1 and pinfo['name'] == 'python':
+        print('kill {}, generated from {}'.format(pinfo, p.pid))
+        os.kill(pinfo['pid'], signal.SIGTERM)
+
+line = b'stderr outputs:\n'
+while line:
+    print(line.decode('utf-8'), end='')
+    line = readline_nonblocking(p.stderr)
+
+if finished:
+    print('Simulation finished')
+else:
+    print('Simulation failed')
+    exit(1)
+
+# move the prim files (which can be quite large)
+# to the local pipeline storage path
+os.system('mv g4_0000.prim {}/{}.prim'.format(args.out_dir,args.file_tag))
+
+
diff --git a/bin/make_dawn_views b/bin/make_dawn_views
new file mode 100755
index 0000000..4844cc3
--- /dev/null
+++ b/bin/make_dawn_views
@@ -0,0 +1,99 @@
+#!/usr/bin/env python3
+
+# get dawn view of detectors
+# W. Armstrong (ANL), original bash script
+# C. Peng (ANL), translate to python and add flexible run time for simulation
+
+import os
+import signal
+import subprocess
+import argparse
+import atexit
+import time
+from datetime import datetime
+import fcntl
+import psutil
+
+
+def readline_nonblocking(output):
+    fd = output.fileno()
+    fl = fcntl.fcntl(fd, fcntl.F_GETFL)
+    fcntl.fcntl(fd, fcntl.F_SETFL, fl | os.O_NONBLOCK)
+    try:
+        return output.readline()
+    except:
+        return ''
+
+
+# arguments
+parser = argparse.ArgumentParser()
+
+parser.add_argument('-c', '--compact-file', type=str, dest='compact',
+        default=os.path.join(os.environ.get('DETECTOR_PATH', '.'), 'athena.xml'),
+        help='Top level compact file for detectors')
+
+parser.add_argument('-s', '--skip', type=int,
+        default=0,
+        help='Number of events number to skip in the input')
+
+parser.add_argument('-i', '--input', type=str, dest='input',
+        default='sim_output',
+        help='Input hepmc file')
+
+parser.add_argument('-o', '--output-dir', type=str, dest='out_dir',
+        default='images',
+        help='output directory')
+
+parser.add_argument('-D', '--detector-only', action='store_true', dest='detector_only',
+        help='only generate the prim files for the detector geometry')
+
+parser.add_argument('-d', '--dawn-dir', type=str, dest='dawn_dir',
+        default='scripts/view1',
+        help='Directory to dawn script dir (with .DAWN files and a generate_eps script)')
+
+parser.add_argument('-t', '--tag', type=str,dest='file_tag',
+        default='view',
+        help='Output file tag')
+
+parser.add_argument('--timeout', type=int,
+        default=60,
+        help='Timeout in seconds')
+        
+parser.add_argument('passthrough', nargs='*')
+
+args = parser.parse_args()
+
+macro = 'macro/dawn_picture.mac' if args.detector_only else 'macro/dawn_picture2.mac'
+
+# raise error if cannot create a temporary working dir
+# os.makedirs('dawn_view_tmp', exist_ok=False)
+os.makedirs(args.out_dir, exist_ok=True)
+
+# use absolute path so the chdir does not affect them
+args.input = os.path.abspath(args.input)
+args.out_dir = os.path.abspath(args.out_dir)
+args.compact = os.path.abspath(args.compact)
+macro = os.path.abspath(macro)
+
+prim_file = 'g4_0000.prim'
+dawn_env = os.environ.copy()
+dawn_env['DAWN_BATCH'] = 'a'
+# sdir = os.path.dirname(os.path.realpath(__file__))
+
+
+# generate DAWN images
+out_dir = os.path.abspath(args.out_dir)
+input_file = os.path.abspath(args.input)
+#prim_file = '{}/{}.prim'.format(input_dir,args.file_tag)
+#prim_file = os.path.abspath(prim_file)
+owd = os.getcwd()
+os.chdir(args.dawn_dir)
+subprocess.run(['pwd'])
+subprocess.run(['./generate_eps', '-t', args.file_tag, '-i', input_file] + args.passthrough)
+subprocess.run(['ls', '-lrth'])
+
+# upload the results
+os.system('cp *.pdf {}'.format(out_dir))
+os.system('cp *.png {}'.format(out_dir))
+os.chdir(owd)
+
diff --git a/compact/beamline.xml b/compact/beamline.xml
new file mode 100644
index 0000000..e8a70aa
--- /dev/null
+++ b/compact/beamline.xml
@@ -0,0 +1,55 @@
+<lccdd>
+
+  <define>
+    <comment>
+    name      center_x      center_y center_z            rin(z-in)      rin(z-out)      dout           length      angle                     B             gradient
+##            [m]           [m]      [m]                 [m]            [m]             [m]            [m]         [rad]                     [T]           [T/m]
+QF  Q12EF_5   0.106325      0       -97.391559           0.06           0.06            0.5            0.6        -0.0243670556              0             5.5494223
+DB  D21EF_5   0.151178      0       -95.1303785          0.06           0.06            0.5            2.923301   -0.0173520834             -0.080044540   0
+QF  Q11EF_5   0.184809      0       -92.8690025          0.06           0.06            0.5            0.6        -0.0103371112              0            -5.5555556
+DB  D22EF_5   0.197934      0       -90.6074145          0.06           0.06            0.5            2.923301   -0.00332213905            -0.080044540   0
+QF  Q10EF_5   0.1998355     0       -88.34579            0.06           0.06            0.5            0.6         0.0036928331              0             3.2112834
+QF  Q9EF_5    0.181002      0       -83.245825           0.06           0.06            0.5            0.6         0.0036928331              0            -4.7576278
+QF  Q8EF_5    0.1621685     0       -78.145859           0.06           0.06            0.5            0.6         0.0036928331              0             3.6308806
+QF  Q7EF_5    0.143335      0       -73.045894           0.06           0.06            0.5            0.6         0.0036928331              0            -3.7604250
+QF  Q6EF_5    0.124502      0       -67.945929           0.06           0.06            0.5            0.6         0.0036928331              0             4.9568612
+QF  Q5EF_5    0.1056685     0       -62.845964           0.06           0.06            0.5            0.6  0.0036928331              0      -5.4330528
+QF  Q4EF_5    0.07391       0       -54.246022           0.06           0.06            0.5            0.6  0.0036928331              0       4.8666389
+QF  CRAB_HF   1.3617469     0       -52.730505           0.1            0.1             1.6           15.06 0.0142039188                 0       0          
+QF  Q3PF      1.2423663     0       -44.326352           0.06           0.06            0.5            0.75  0.0142039188              0       -9.21047
+DB  B2PF      1.1657280     0       -40.752284           0.06           0.06            0.5            4.400000  0.025962030           -4.902576321 0
+QF  QF3_PF    1.4907171     0       -61.809831           0.06           0.06            0.5            2.100484  0.0142039188              0      -36.58538
+QF  YO5_TQ5   1.6006513     0       -69.549030           0.06           0.06            0.5            0.75 0.0142039188              0      0
+QF  YO5_QD5   1.6157219     0       -70.609974           0.06           0.06            0.5            1.11 0.0142039188              0      82.97421
+DB  YO5_DH5   1.6430920     0       -78.027114           0.1            0.1             0.5            8.698449 -0.0039              -3.782030724  0
+QF  YO5_TQ4   1.5833771     0       -84.384146           0.06           0.06            0.5            0.75  -0.0216599742            0      0
+QF  Q3EF_5    0.027554847   0       -41.693231           0.06           0.06            0.5            0.6  0.0036928331              0      -1.7423111
+    </comment>
+    <constant name="D21EF_5_XPosition" value="0.151178*m"/>
+    <constant name="D21EF_5_ZPosition" value="-95.1303785*m"/>
+    <constant name="D21EF_5_InnerRadius" value="6.0*cm"/>
+    <constant name="D21EF_5_RotationAngle" value="-0.0173520834*rad"/>
+    <constant name="D21EF_5_Length" value="2.923301*m"/>
+    <constant name="D21EF_5_Bmax" value="-0.080044540*tesla"/>    
+    <constant name="D21EF_5_GradientMax" value="0.0*tesla/m"/>
+  </define>
+
+  <detectors>
+    <detector id="100" name="D21EF_5_BeamlineMagnet" vis="FFMagnetVis" type="compton_CylindricalDipoleMagnet">
+      <placement x="D21EF_5_XPosition" y="0*m" z="D21EF_5_ZPosition" theta="D21EF_5_RotationAngle" />
+      <dimensions x="D21EF_5_InnerRadius*4" y="D21EF_5_InnerRadius*4" z="D21EF_5_Length" r="D21EF_5_InnerRadius*2.0" />
+      <apperture x="D21EF_5_InnerRadius" y="D21EF_5_InnerRadius" r="D21EF_5_InnerRadius" />
+      <coil vis="MagnetCoilVis" dx="2*cm" dy="1.5*cm" />
+    </detector>
+  </detectors>
+
+  <fields>
+    <field name="D21EF_5_Magnet" type="MultipoleMagnet">
+      <position x="D21EF_5_XPosition" y="0" z="D21EF_5_ZPosition"/>
+      <rotation x="0" y="D21EF_5_RotationAngle" z="0"/>
+      <shape type="Tube" rmin="0.0" rmax="D21EF_5_InnerRadius" dz="D21EF_5_Length*0.5"/>
+      <coefficient coefficient="D21EF_5_Bmax" skew="0.0*tesla"/>
+      <coefficient coefficient="D21EF_5_GradientMax" skew="0.0*tesla/cm"/>
+    </field>
+  </fields>
+</lccdd>
diff --git a/compact/colors.xml b/compact/colors.xml
new file mode 100644
index 0000000..402c7bf
--- /dev/null
+++ b/compact/colors.xml
@@ -0,0 +1,24 @@
+<display>
+
+  <comment> 
+    Colors tweaked to be displayable by geoViewer
+  </comment>
+  <vis name="AnlGreen"        alpha="1" r="100/256" g="200/256" b="0/256"/>
+  <vis name="AnlViolet"       alpha="1" r="100/256" g="0/256"   b="150/256"/>
+  <vis name="AnlProcess_Blue" alpha="1" r="0/256"   g="100/256" b="202/256"/>
+  <vis name="AnlOrange"       alpha="1" r="255/256" g="121/256" b="0"/>
+  <vis name="AnlRed"          alpha="1" r="205/256" g="45/256 " b="45/256"/>
+  <vis name="AnlGold"         alpha="1" r="248/256" g="188/256" b="0/256"/>
+  <vis name="AnlBlue"         alpha="1" r="0/256"   g="96/256"  b="156/256"/>
+  <vis name="AnlTeal"         alpha="1" r="0/256"   g="161/256" b="156/256"/>
+  <vis name="AnlGray"         alpha="1" r="102/256" g="102/256" b="102/256"/>
+  <vis name="AnlLight_Gray"   alpha="1" r="209/256" g="209/256" b="209/256"/>
+  <vis name="AnlLightGray"    ref="AnlLight_Gray" />
+  <vis name="AnlDarkRed"      alpha="1" r="161/256" g="45/256"  b="45/256"/>
+  <vis name="AnlDarkGreen"    alpha="1" r="0"       g="110/256" b="50/256"/>
+  <vis name="AnlDarkBlue"     alpha="1" r="45/256"   g="45/256"  b="110/256"/>
+  <vis name="AnlDelta_Red"    ref="AnlDarkRed"/>
+  <vis name="AnlDelta_Green"    ref="AnlDarkGreen"/>
+  <vis name="AnlDelta_Blue"    ref="AnlDarkBlue"/>
+
+</display>
diff --git a/compact/definitions.xml b/compact/definitions.xml
new file mode 100644
index 0000000..f08fccf
--- /dev/null
+++ b/compact/definitions.xml
@@ -0,0 +1,6 @@
+  <define>
+    <constant name="IPBeampipe_rmax" value="2.5*25.4*mm/2.0"/>
+    <constant name="Beampipe_rmax"   value="IPBeampipe_rmax"/>
+    <constant name="BeampipeOD"      value="2.0*IPBeampipe_rmax"/>
+  </define>
+
diff --git a/compact/display.xml b/compact/display.xml
new file mode 100644
index 0000000..daa71d0
--- /dev/null
+++ b/compact/display.xml
@@ -0,0 +1,40 @@
+  <display>
+
+    <comment>
+      See compact/compton_colors.xml for list of colors.
+    </comment>
+    <vis name="InvisibleNoDaughters"      showDaughters="false" visible="false"/>
+    <vis name="InvisibleWithDaughters"    showDaughters="true" visible="false"/>
+
+    <comment>
+      Tracker visualizations
+    </comment>
+    <vis name="TrackerVis"        ref="AnlRed" />
+    <vis name="TrackerSupportVis" ref="AnlBlue"             visible="true"  showDaughters="false"/>
+    <vis name="TrackerShieldingVis" ref="AnlGray"           visible="true"  showDaughters="false"/>
+    <vis name="TrackerServiceVis" ref="AnlGold"             visible="true"  showDaughters="false"/>
+    <vis name="TrackerLayerVis"   ref="TrackerVis"          visible="true"  showDaughters="true"/>
+    <vis name="TrackerModuleVis"  ref="TrackerLayerVis"     visible="true"  showDaughters="true"/>
+    <vis name="TrackerSurfaceVis" ref="TrackerLayerVis"     visible="true"  showDaughters="true"/>
+
+    <comment>
+      Calorimeter visualization
+    </comment>
+
+    <comment>
+      Calorimeter visualizations
+    </comment>
+    <vis name="PreVis"            ref="AnlGold"             showDaughters="true" visible="true"/>
+    <vis name="PreLayerVis"       ref="PreVis"              showDaughters="true" visible="true"/>
+    <vis name="PreModuleVis"      ref="PreLayerVis"         showDaughters="true" visible="true"/>
+    <vis name="PreRadiatorVis"    ref="PreModuleVis"        showDaughters="true" visible="true"/>
+    <vis name="PreReadoutVis"     ref="TrackerSurfaceVis"   showDaughters="true" visible="true"/>
+      
+    <comment>
+      Magnet/beamline visualization
+    </comment>
+    <vis name="MagnetVis"         ref="AnlGreen"            showDaughters="true" visible="true"/>
+    <vis name="MagnetCoilVis"     ref="AnlRed"              showDaughters="true" visible="true"/>
+    <vis name="BeamPipeVis"       ref="AnlLight_Gray"       showDaughters="true" visible="true"/>
+
+  </display>
diff --git a/compact/electron_tracker.xml b/compact/electron_tracker.xml
new file mode 100644
index 0000000..f31add9
--- /dev/null
+++ b/compact/electron_tracker.xml
@@ -0,0 +1,146 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<lccdd>
+  <define>
+    <comment>
+      Compton Electron Tracker
+    </comment>
+
+    <comment>
+      - The detector length based on the 0.2*m step size and 4 layers. 
+    </comment>
+    <constant name="electron_tracker_length"      value="60.0*cm"/>
+    <constant name="electron_tracker_zoffset"     value="10.0*cm"/>
+    <constant name="electron_tracker_center_zpos" value="6.2*m"/>
+    <constant name="electron_tracker_center_xpos" value="-0.16000052*m" />
+    <constant name="electron_tracker_zmin"        value="electron_tracker_center_zpos - electron_tracker_length/2.0 "/>
+    <constant name="electron_tracker_rotation"    value="ionCrossingAngle"/>
+    <comment>
+      average of station 2 and 3 x postions below...
+    </comment>
+    <constant name="electron_trackerSlope_x" value="0.0249974*m" />
+    <constant name="electron_tracker_nlayers"   value="4"/>
+    <constant name="electron_tracker_dz"        value="electron_tracker_length/(electron_tracker_nlayers-1)"/>
+
+    <comment>
+      This angle is the angle subtended in phi for each trap segment.
+    </comment>
+    <constant name="electron_trackerLayer_nModules"          value="36"/>
+    <constant name="electron_trackerLayerSmallMod_nModules"  value="electron_trackerLayer_nModules/6"/>
+    <constant name="electron_trackerModOpeningAngle"         value="360.0*degree/electron_trackerLayer_nModules"/>
+    <constant name="electron_trackerLayerBigMod_nModules"    value="electron_trackerLayer_nModules - electron_trackerLayerSmallMod_nModules"/>
+    <constant name="electron_trackerLayerBigMod_phi0"        value="(electron_trackerLayerSmallMod_nModules/2.0 + 0.5)*electron_trackerModOpeningAngle + Pi"/>
+    <constant name="electron_trackerLayerSmallMod_phi0"        value="(electron_trackerLayerSmallMod_nModules/2.0 - 0.5)*electron_trackerModOpeningAngle + Pi"/>
+
+    <constant name="electron_trackerMod1Inner_z"      value="1.0*cm" />
+    <constant name="electron_trackerMod1Inner_r"      value="3.5*cm" />
+    <constant name="electron_trackerMod1Outer_r"      value="15.0*cm"/>
+    <constant name="electron_trackerMod1_x1"          value="2.0*electron_trackerMod1Inner_r*sin(electron_trackerModOpeningAngle/2.0)"/>
+    <constant name="electron_trackerMod1_x2"          value="2.0*electron_trackerMod1Outer_r*sin(electron_trackerModOpeningAngle/2.0)"/>
+    <constant name="electron_trackerMod1_y"           value="electron_trackerMod1Outer_r*cos(electron_trackerModOpeningAngle/2.0) - electron_trackerMod1Inner_r"/>
+
+    <constant name="electron_trackerMod1SmallOuter_r" value="10.0*cm"/>
+    <constant name="electron_trackerMod1Small_x2"     value="2.0*electron_trackerMod1SmallOuter_r*sin(electron_trackerModOpeningAngle/2.0)"/>
+    <constant name="electron_trackerMod1Small_y"      value="electron_trackerMod1SmallOuter_r*cos(electron_trackerModOpeningAngle/2.0) - electron_trackerMod1Inner_r"/>
+    
+    <constant name="electron_trackerMod2SmallOuter_r" value="11.0*cm"/>
+    <constant name="electron_trackerMod2Small_x2"     value="2.0*electron_trackerMod2SmallOuter_r*sin(electron_trackerModOpeningAngle/2.0)"/>
+    <constant name="electron_trackerMod2Small_y"      value="electron_trackerMod2SmallOuter_r*cos(electron_trackerModOpeningAngle/2.0) - electron_trackerMod1Inner_r"/>
+
+    <constant name="electron_trackerMod3SmallOuter_r" value="11.0*cm"/>
+    <constant name="electron_trackerMod3Small_x2"     value="2.0*electron_trackerMod3SmallOuter_r*sin(electron_trackerModOpeningAngle/2.0)"/>
+    <constant name="electron_trackerMod3Small_y"      value="electron_trackerMod3SmallOuter_r*cos(electron_trackerModOpeningAngle/2.0) - electron_trackerMod1Inner_r"/>
+
+    <constant name="electron_trackerMod4SmallOuter_r" value="12.0*cm"/>
+    <constant name="electron_trackerMod4Small_x2"     value="2.0*electron_trackerMod4SmallOuter_r*sin(electron_trackerModOpeningAngle/2.0)"/>
+    <constant name="electron_trackerMod4Small_y"      value="electron_trackerMod4SmallOuter_r*cos(electron_trackerModOpeningAngle/2.0) - electron_trackerMod1Inner_r"/>
+
+  </define>
+
+  <detectors>
+
+    <detector
+      id="electron_tracker_Station_1_ID"
+      name="electron_tracker"
+      type="electron_tracker"
+      readout="ElectronTrackerHits"
+      vis="TrackerVis">
+      <position x="electron_tracker_center_xpos" y="0" z="electron_tracker_center_zpos"/>
+      <rotation x="0*rad" y="electron_tracker_rotation" z="0*rad"/>
+      <module name="Module1" vis="TrackerModuleVis"> <!-- AnlProcess_Blue-->
+        <trd x1="electron_trackerMod1_x1/2.0" x2="electron_trackerMod1_x2/2.0" z="electron_trackerMod1_y/2"/>
+        <comment> Back-to-front </comment>
+        <module_component thickness="0.12*mm" material="CarbonFiber" vis="TrackerSupportVis" />
+        <module_component thickness="0.3*mm" material="SiliconOxide" vis="TrackerSurfaceVis" sensitive="true"/>
+      </module>
+      <module name="SmallModule1" vis="TrackerModuleVis">
+        <trd x1="electron_trackerMod1_x1/2.0" x2="electron_trackerMod1Small_x2/2.0" z="electron_trackerMod1Small_y/2"/>
+        <module_component thickness="0.12*mm" material="CarbonFiber" vis="TrackerSupportVis" />
+        <module_component thickness="0.3*mm" material="SiliconOxide" vis="TrackerSurfaceVis" sensitive="true"/>
+      </module>
+      <module name="SmallModule2" vis="TrackerModuleVis">
+        <trd x1="electron_trackerMod1_x1/2.0" x2="electron_trackerMod2Small_x2/2.0" z="electron_trackerMod2Small_y/2"/>
+        <module_component thickness="0.12*mm" material="CarbonFiber" vis="TrackerSupportVis" />
+        <module_component thickness="0.3*mm" material="SiliconOxide" vis="TrackerSurfaceVis" sensitive="true"/>
+      </module>
+      <module name="SmallModule3" vis="TrackerModuleVis">
+        <trd x1="electron_trackerMod1_x1/2.0" x2="electron_trackerMod3Small_x2/2.0" z="electron_trackerMod3Small_y/2"/>
+        <module_component thickness="0.12*mm" material="CarbonFiber" vis="TrackerSupportVis" />
+        <module_component thickness="0.3*mm" material="SiliconOxide" vis="TrackerSurfaceVis" sensitive="true"/>
+      </module>
+      <module name="SmallModule4" vis="TrackerModuleVis">
+        <trd x1="electron_trackerMod1_x1/2.0" x2="electron_trackerMod4Small_x2/2.0" z="electron_trackerMod4Small_y/2"/>
+        <module_component thickness="0.12*mm" material="CarbonFiber" vis="TrackerSupportVis" />
+        <module_component thickness="0.3*mm" material="SiliconOxide" vis="TrackerSurfaceVis" sensitive="true"/>
+      </module>
+      <layer id="1">
+        <envelope  vis="TrackerLayerVis" rmin="electron_trackerMod1Inner_r" rmax="electron_trackerMod1Outer_r" length="1.0*cm" 
+          zstart="-electron_tracker_length/2.0" />
+        <ring phi0="electron_trackerLayerBigMod_phi0" dphi="electron_trackerModOpeningAngle" 
+          r="electron_trackerMod1Inner_r+electron_trackerMod1_y/2.0" zstart="0.0*mm" 
+          nmodules="electron_trackerLayerBigMod_nModules" dz="0 * mm" module="Module1" />
+        <ring phi0="-electron_trackerLayerSmallMod_phi0" dphi="electron_trackerModOpeningAngle"
+          r="electron_trackerMod1Inner_r+electron_trackerMod1Small_y/2.0" zstart="0.0*mm" 
+          nmodules="electron_trackerLayerSmallMod_nModules" dz="0 * mm" module="SmallModule1" />
+      </layer>
+      <layer id="2" >
+        <envelope vis="TrackerLayerVis" rmin="electron_trackerMod1Inner_r" rmax="electron_trackerMod1Outer_r" length="1.0*cm" 
+          zstart="-electron_tracker_length/2.0 + 1.0*electron_tracker_dz" />
+        <ring phi0="electron_trackerLayerBigMod_phi0" dphi="electron_trackerModOpeningAngle" 
+          r="electron_trackerMod1Inner_r+electron_trackerMod1_y/2.0" zstart="0.0*mm" 
+          nmodules="electron_trackerLayerBigMod_nModules" dz="0 * mm" module="Module1" />
+        <ring phi0="-electron_trackerLayerSmallMod_phi0" dphi="electron_trackerModOpeningAngle"
+          r="electron_trackerMod1Inner_r+electron_trackerMod2Small_y/2.0" zstart="0.0*mm" 
+          nmodules="electron_trackerLayerSmallMod_nModules" dz="0 * mm" module="SmallModule2" />
+      </layer>
+      <layer id="3" >
+        <envelope vis="TrackerLayerVis" rmin="electron_trackerMod1Inner_r" rmax="electron_trackerMod1Outer_r" length="1.0*cm" 
+          zstart="-electron_tracker_length/2.0 +  2.0*electron_tracker_dz" />
+        <ring phi0="electron_trackerLayerBigMod_phi0" dphi="electron_trackerModOpeningAngle" 
+          r="electron_trackerMod1Inner_r+electron_trackerMod1_y/2.0" zstart="0.0*mm" 
+          nmodules="electron_trackerLayerBigMod_nModules" dz="0 * mm" module="Module1" />
+        <ring phi0="-electron_trackerLayerSmallMod_phi0" dphi="electron_trackerModOpeningAngle"
+          r="electron_trackerMod1Inner_r+electron_trackerMod3Small_y/2.0" zstart="0.0*mm" 
+          nmodules="electron_trackerLayerSmallMod_nModules" dz="0 * mm" module="SmallModule3" />
+      </layer>
+      <layer id="4" >
+        <envelope vis="TrackerLayerVis" rmin="electron_trackerMod1Inner_r" rmax="electron_trackerMod1Outer_r" length="1.0*cm" 
+          zstart="-electron_tracker_length/2.0 + 3.0*electron_tracker_dz" />
+        <ring phi0="electron_trackerLayerBigMod_phi0" dphi="electron_trackerModOpeningAngle" 
+          r="electron_trackerMod1Inner_r+electron_trackerMod1_y/2.0" zstart="0.0*mm" 
+          nmodules="electron_trackerLayerBigMod_nModules" dz="0 * mm" module="Module1" />
+        <ring phi0="-electron_trackerLayerSmallMod_phi0" dphi="electron_trackerModOpeningAngle"
+          r="electron_trackerMod1Inner_r+electron_trackerMod4Small_y/2.0" zstart="0.0*mm" 
+          nmodules="electron_trackerLayerSmallMod_nModules" dz="0 * mm" module="SmallModule4" />
+      </layer>
+    </detector>
+
+  </detectors>
+
+  <readouts>
+    <readout name="ElectronTrackerHits">
+      <segmentation type="CartesianGridXZ" grid_size_x="0.020*mm" grid_size_z="0.020*mm" />
+      <id>system:8,layer:4,module:12,sensor:2,x:32:-16,z:-16</id>
+    </readout>
+  </readouts>
+
+</lccdd>
diff --git a/compact/elements.xml b/compact/elements.xml
new file mode 100644
index 0000000..3fb9b9d
--- /dev/null
+++ b/compact/elements.xml
@@ -0,0 +1,885 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<materials>
+  <element Z="89" formula="Ac" name="Ac">
+    <atom type="A" unit="g/mol" value="227.028"/>
+  </element>
+  <material formula="Ac" name="Actinium" state="solid">
+    <RL type="X0" unit="cm" value="0.601558"/>
+    <NIL type="lambda" unit="cm" value="21.2048"/>
+    <D type="density" unit="g/cm3" value="10.07"/>
+    <composite n="1" ref="Ac"/>
+  </material>
+  <element Z="47" formula="Ag" name="Ag">
+    <atom type="A" unit="g/mol" value="107.868"/>
+  </element>
+  <material formula="Ag" name="Silver" state="solid">
+    <RL type="X0" unit="cm" value="0.854292"/>
+    <NIL type="lambda" unit="cm" value="15.8546"/>
+    <D type="density" unit="g/cm3" value="10.5"/>
+    <composite n="1" ref="Ag"/>
+  </material>
+  <element Z="13" formula="Al" name="Al">
+    <atom type="A" unit="g/mol" value="26.9815"/>
+  </element>
+  <material formula="Al" name="Aluminum" state="solid">
+    <RL type="X0" unit="cm" value="8.89632"/>
+    <NIL type="lambda" unit="cm" value="38.8766"/>
+    <D type="density" unit="g/cm3" value="2.699"/>
+    <composite n="1" ref="Al"/>
+  </material>
+  <element Z="95" formula="Am" name="Am">
+    <atom type="A" unit="g/mol" value="243.061"/>
+  </element>
+  <material formula="Am" name="Americium" state="solid">
+    <RL type="X0" unit="cm" value="0.42431"/>
+    <NIL type="lambda" unit="cm" value="15.9812"/>
+    <D type="density" unit="g/cm3" value="13.67"/>
+    <composite n="1" ref="Am"/>
+  </material>
+  <element Z="18" formula="Ar" name="Ar">
+    <atom type="A" unit="g/mol" value="39.9477"/>
+  </element>
+  <material formula="Ar" name="Argon" state="gas">
+    <RL type="X0" unit="cm" value="11762.1"/>
+    <NIL type="lambda" unit="cm" value="71926"/>
+    <D type="density" unit="g/cm3" value="0.00166201"/>
+    <composite n="1" ref="Ar"/>
+  </material>
+  <element Z="33" formula="As" name="As">
+    <atom type="A" unit="g/mol" value="74.9216"/>
+  </element>
+  <material formula="As" name="Arsenic" state="solid">
+    <RL type="X0" unit="cm" value="2.0838"/>
+    <NIL type="lambda" unit="cm" value="25.7324"/>
+    <D type="density" unit="g/cm3" value="5.73"/>
+    <composite n="1" ref="As"/>
+  </material>
+  <element Z="85" formula="At" name="At">
+    <atom type="A" unit="g/mol" value="209.987"/>
+  </element>
+  <material formula="At" name="Astatine" state="solid">
+    <RL type="X0" unit="cm" value="0.650799"/>
+    <NIL type="lambda" unit="cm" value="22.3202"/>
+    <D type="density" unit="g/cm3" value="9.32"/>
+    <composite n="1" ref="At"/>
+  </material>
+  <element Z="79" formula="Au" name="Au">
+    <atom type="A" unit="g/mol" value="196.967"/>
+  </element>
+  <material formula="Au" name="Gold" state="solid">
+    <RL type="X0" unit="cm" value="0.334436"/>
+    <NIL type="lambda" unit="cm" value="10.5393"/>
+    <D type="density" unit="g/cm3" value="19.32"/>
+    <composite n="1" ref="Au"/>
+  </material>
+  <element Z="5" formula="B" name="B">
+    <atom type="A" unit="g/mol" value="10.811"/>
+  </element>
+  <material formula="B" name="Boron" state="solid">
+    <RL type="X0" unit="cm" value="22.2307"/>
+    <NIL type="lambda" unit="cm" value="32.2793"/>
+    <D type="density" unit="g/cm3" value="2.37"/>
+    <composite n="1" ref="B"/>
+  </material>
+  <element Z="56" formula="Ba" name="Ba">
+    <atom type="A" unit="g/mol" value="137.327"/>
+  </element>
+  <material formula="Ba" name="Barium" state="solid">
+    <RL type="X0" unit="cm" value="2.37332"/>
+    <NIL type="lambda" unit="cm" value="51.6743"/>
+    <D type="density" unit="g/cm3" value="3.5"/>
+    <composite n="1" ref="Ba"/>
+  </material>
+  <element Z="4" formula="Be" name="Be">
+    <atom type="A" unit="g/mol" value="9.01218"/>
+  </element>
+  <material formula="Be" name="Beryllium" state="solid">
+    <RL type="X0" unit="cm" value="35.276"/>
+    <NIL type="lambda" unit="cm" value="39.4488"/>
+    <D type="density" unit="g/cm3" value="1.848"/>
+    <composite n="1" ref="Be"/>
+  </material>
+  <element Z="83" formula="Bi" name="Bi">
+    <atom type="A" unit="g/mol" value="208.98"/>
+  </element>
+  <material formula="Bi" name="Bismuth" state="solid">
+    <RL type="X0" unit="cm" value="0.645388"/>
+    <NIL type="lambda" unit="cm" value="21.3078"/>
+    <D type="density" unit="g/cm3" value="9.747"/>
+    <composite n="1" ref="Bi"/>
+  </material>
+  <element Z="97" formula="Bk" name="Bk">
+    <atom type="A" unit="g/mol" value="247.07"/>
+  </element>
+  <material formula="Bk" name="Berkelium" state="solid">
+    <RL type="X0" unit="cm" value="0.406479"/>
+    <NIL type="lambda" unit="cm" value="15.6902"/>
+    <D type="density" unit="g/cm3" value="14"/>
+    <composite n="1" ref="Bk"/>
+  </material>
+  <element Z="35" formula="Br" name="Br">
+    <atom type="A" unit="g/mol" value="79.9035"/>
+  </element>
+  <material formula="Br" name="Bromine" state="gas">
+    <RL type="X0" unit="cm" value="1615.12"/>
+    <NIL type="lambda" unit="cm" value="21299"/>
+    <D type="density" unit="g/cm3" value="0.0070721"/>
+    <composite n="1" ref="Br"/>
+  </material>
+  <element Z="6" formula="C" name="C">
+    <atom type="A" unit="g/mol" value="12.0107"/>
+  </element>
+  <material formula="C" name="Carbon" state="solid">
+    <RL type="X0" unit="cm" value="21.3485"/>
+    <NIL type="lambda" unit="cm" value="40.1008"/>
+    <D type="density" unit="g/cm3" value="2"/>
+    <composite n="1" ref="C"/>
+  </material>
+  <element Z="20" formula="Ca" name="Ca">
+    <atom type="A" unit="g/mol" value="40.078"/>
+  </element>
+  <material formula="Ca" name="Calcium" state="solid">
+    <RL type="X0" unit="cm" value="10.4151"/>
+    <NIL type="lambda" unit="cm" value="77.3754"/>
+    <D type="density" unit="g/cm3" value="1.55"/>
+    <composite n="1" ref="Ca"/>
+  </material>
+  <element Z="48" formula="Cd" name="Cd">
+    <atom type="A" unit="g/mol" value="112.411"/>
+  </element>
+  <material formula="Cd" name="Cadmium" state="solid">
+    <RL type="X0" unit="cm" value="1.03994"/>
+    <NIL type="lambda" unit="cm" value="19.46"/>
+    <D type="density" unit="g/cm3" value="8.65"/>
+    <composite n="1" ref="Cd"/>
+  </material>
+  <element Z="58" formula="Ce" name="Ce">
+    <atom type="A" unit="g/mol" value="140.115"/>
+  </element>
+  <material formula="Ce" name="Cerium" state="solid">
+    <RL type="X0" unit="cm" value="1.19506"/>
+    <NIL type="lambda" unit="cm" value="27.3227"/>
+    <D type="density" unit="g/cm3" value="6.657"/>
+    <composite n="1" ref="Ce"/>
+  </material>
+  <element Z="98" formula="Cf" name="Cf">
+    <atom type="A" unit="g/mol" value="251.08"/>
+  </element>
+  <material formula="Cf" name="Californium" state="solid">
+    <RL type="X0" unit="cm" value="0.568328"/>
+    <NIL type="lambda" unit="cm" value="22.085"/>
+    <D type="density" unit="g/cm3" value="10"/>
+    <composite n="1" ref="Cf"/>
+  </material>
+  <element Z="17" formula="Cl" name="Cl">
+    <atom type="A" unit="g/mol" value="35.4526"/>
+  </element>
+  <material formula="Cl" name="Chlorine" state="gas">
+    <RL type="X0" unit="cm" value="6437.34"/>
+    <NIL type="lambda" unit="cm" value="38723.9"/>
+    <D type="density" unit="g/cm3" value="0.00299473"/>
+    <composite n="1" ref="Cl"/>
+  </material>
+  <element Z="96" formula="Cm" name="Cm">
+    <atom type="A" unit="g/mol" value="247.07"/>
+  </element>
+  <material formula="Cm" name="Curium" state="solid">
+    <RL type="X0" unit="cm" value="0.428706"/>
+    <NIL type="lambda" unit="cm" value="16.2593"/>
+    <D type="density" unit="g/cm3" value="13.51"/>
+    <composite n="1" ref="Cm"/>
+  </material>
+  <element Z="27" formula="Co" name="Co">
+    <atom type="A" unit="g/mol" value="58.9332"/>
+  </element>
+  <material formula="Co" name="Cobalt" state="solid">
+    <RL type="X0" unit="cm" value="1.53005"/>
+    <NIL type="lambda" unit="cm" value="15.2922"/>
+    <D type="density" unit="g/cm3" value="8.9"/>
+    <composite n="1" ref="Co"/>
+  </material>
+  <element Z="24" formula="Cr" name="Cr">
+    <atom type="A" unit="g/mol" value="51.9961"/>
+  </element>
+  <material formula="Cr" name="Chromium" state="solid">
+    <RL type="X0" unit="cm" value="2.0814"/>
+    <NIL type="lambda" unit="cm" value="18.1933"/>
+    <D type="density" unit="g/cm3" value="7.18"/>
+    <composite n="1" ref="Cr"/>
+  </material>
+  <element Z="55" formula="Cs" name="Cs">
+    <atom type="A" unit="g/mol" value="132.905"/>
+  </element>
+  <material formula="Cs" name="Cesium" state="solid">
+    <RL type="X0" unit="cm" value="4.4342"/>
+    <NIL type="lambda" unit="cm" value="95.317"/>
+    <D type="density" unit="g/cm3" value="1.873"/>
+    <composite n="1" ref="Cs"/>
+  </material>
+  <element Z="29" formula="Cu" name="Cu">
+    <atom type="A" unit="g/mol" value="63.5456"/>
+  </element>
+  <material formula="Cu" name="Copper" state="solid">
+    <RL type="X0" unit="cm" value="1.43558"/>
+    <NIL type="lambda" unit="cm" value="15.5141"/>
+    <D type="density" unit="g/cm3" value="8.96"/>
+    <composite n="1" ref="Cu"/>
+  </material>
+  <element Z="66" formula="Dy" name="Dy">
+    <atom type="A" unit="g/mol" value="162.497"/>
+  </element>
+  <material formula="Dy" name="Dysprosium" state="solid">
+    <RL type="X0" unit="cm" value="0.85614"/>
+    <NIL type="lambda" unit="cm" value="22.2923"/>
+    <D type="density" unit="g/cm3" value="8.55"/>
+    <composite n="1" ref="Dy"/>
+  </material>
+  <element Z="68" formula="Er" name="Er">
+    <atom type="A" unit="g/mol" value="167.256"/>
+  </element>
+  <material formula="Er" name="Erbium" state="solid">
+    <RL type="X0" unit="cm" value="0.788094"/>
+    <NIL type="lambda" unit="cm" value="21.2923"/>
+    <D type="density" unit="g/cm3" value="9.066"/>
+    <composite n="1" ref="Er"/>
+  </material>
+  <element Z="63" formula="Eu" name="Eu">
+    <atom type="A" unit="g/mol" value="151.964"/>
+  </element>
+  <material formula="Eu" name="Europium" state="solid">
+    <RL type="X0" unit="cm" value="1.41868"/>
+    <NIL type="lambda" unit="cm" value="35.6178"/>
+    <D type="density" unit="g/cm3" value="5.243"/>
+    <composite n="1" ref="Eu"/>
+  </material>
+  <element Z="9" formula="F" name="F">
+    <atom type="A" unit="g/mol" value="18.9984"/>
+  </element>
+  <material formula="F" name="Fluorine" state="gas">
+    <RL type="X0" unit="cm" value="20838.2"/>
+    <NIL type="lambda" unit="cm" value="59094.3"/>
+    <D type="density" unit="g/cm3" value="0.00158029"/>
+    <composite n="1" ref="F"/>
+  </material>
+  <element Z="26" formula="Fe" name="Fe">
+    <atom type="A" unit="g/mol" value="55.8451"/>
+  </element>
+  <material formula="Fe" name="Iron" state="solid">
+    <RL type="X0" unit="cm" value="1.75749"/>
+    <NIL type="lambda" unit="cm" value="16.959"/>
+    <D type="density" unit="g/cm3" value="7.874"/>
+    <composite n="1" ref="Fe"/>
+  </material>
+  <element Z="87" formula="Fr" name="Fr">
+    <atom type="A" unit="g/mol" value="223.02"/>
+  </element>
+  <material formula="Fr" name="Francium" state="solid">
+    <RL type="X0" unit="cm" value="6.18826"/>
+    <NIL type="lambda" unit="cm" value="212.263"/>
+    <D type="density" unit="g/cm3" value="1"/>
+    <composite n="1" ref="Fr"/>
+  </material>
+  <element Z="31" formula="Ga" name="Ga">
+    <atom type="A" unit="g/mol" value="69.7231"/>
+  </element>
+  <material formula="Ga" name="Gallium" state="solid">
+    <RL type="X0" unit="cm" value="2.1128"/>
+    <NIL type="lambda" unit="cm" value="24.3351"/>
+    <D type="density" unit="g/cm3" value="5.904"/>
+    <composite n="1" ref="Ga"/>
+  </material>
+  <element Z="64" formula="Gd" name="Gd">
+    <atom type="A" unit="g/mol" value="157.252"/>
+  </element>
+  <material formula="Gd" name="Gadolinium" state="solid">
+    <RL type="X0" unit="cm" value="0.947208"/>
+    <NIL type="lambda" unit="cm" value="23.9377"/>
+    <D type="density" unit="g/cm3" value="7.9004"/>
+    <composite n="1" ref="Gd"/>
+  </material>
+  <element Z="32" formula="Ge" name="Ge">
+    <atom type="A" unit="g/mol" value="72.6128"/>
+  </element>
+  <material formula="Ge" name="Germanium" state="solid">
+    <RL type="X0" unit="cm" value="2.3013"/>
+    <NIL type="lambda" unit="cm" value="27.3344"/>
+    <D type="density" unit="g/cm3" value="5.323"/>
+    <composite n="1" ref="Ge"/>
+  </material>
+  <element Z="1" formula="H" name="H">
+    <atom type="A" unit="g/mol" value="1.00794"/>
+  </element>
+  <material formula="H" name="Hydrogen" state="gas">
+    <RL type="X0" unit="cm" value="752776"/>
+    <NIL type="lambda" unit="cm" value="421239"/>
+    <D type="density" unit="g/cm3" value="8.3748e-05"/>
+    <composite n="1" ref="H"/>
+  </material>
+  <element Z="2" formula="He" name="He">
+    <atom type="A" unit="g/mol" value="4.00264"/>
+  </element>
+  <material formula="He" name="Helium" state="gas">
+    <RL type="X0" unit="cm" value="567113"/>
+    <NIL type="lambda" unit="cm" value="334266"/>
+    <D type="density" unit="g/cm3" value="0.000166322"/>
+    <composite n="1" ref="He"/>
+  </material>
+  <element Z="72" formula="Hf" name="Hf">
+    <atom type="A" unit="g/mol" value="178.485"/>
+  </element>
+  <material formula="Hf" name="Hafnium" state="solid">
+    <RL type="X0" unit="cm" value="0.517717"/>
+    <NIL type="lambda" unit="cm" value="14.7771"/>
+    <D type="density" unit="g/cm3" value="13.31"/>
+    <composite n="1" ref="Hf"/>
+  </material>
+  <element Z="80" formula="Hg" name="Hg">
+    <atom type="A" unit="g/mol" value="200.599"/>
+  </element>
+  <material formula="Hg" name="Mercury" state="solid">
+    <RL type="X0" unit="cm" value="0.475241"/>
+    <NIL type="lambda" unit="cm" value="15.105"/>
+    <D type="density" unit="g/cm3" value="13.546"/>
+    <composite n="1" ref="Hg"/>
+  </material>
+  <element Z="67" formula="Ho" name="Ho">
+    <atom type="A" unit="g/mol" value="164.93"/>
+  </element>
+  <material formula="Ho" name="Holmium" state="solid">
+    <RL type="X0" unit="cm" value="0.822447"/>
+    <NIL type="lambda" unit="cm" value="21.8177"/>
+    <D type="density" unit="g/cm3" value="8.795"/>
+    <composite n="1" ref="Ho"/>
+  </material>
+  <element Z="53" formula="I" name="I">
+    <atom type="A" unit="g/mol" value="126.904"/>
+  </element>
+  <material formula="I" name="Iodine" state="solid">
+    <RL type="X0" unit="cm" value="1.72016"/>
+    <NIL type="lambda" unit="cm" value="35.6583"/>
+    <D type="density" unit="g/cm3" value="4.93"/>
+    <composite n="1" ref="I"/>
+  </material>
+  <element Z="49" formula="In" name="In">
+    <atom type="A" unit="g/mol" value="114.818"/>
+  </element>
+  <material formula="In" name="Indium" state="solid">
+    <RL type="X0" unit="cm" value="1.21055"/>
+    <NIL type="lambda" unit="cm" value="23.2468"/>
+    <D type="density" unit="g/cm3" value="7.31"/>
+    <composite n="1" ref="In"/>
+  </material>
+  <element Z="77" formula="Ir" name="Ir">
+    <atom type="A" unit="g/mol" value="192.216"/>
+  </element>
+  <material formula="Ir" name="Iridium" state="solid">
+    <RL type="X0" unit="cm" value="0.294142"/>
+    <NIL type="lambda" unit="cm" value="9.01616"/>
+    <D type="density" unit="g/cm3" value="22.42"/>
+    <composite n="1" ref="Ir"/>
+  </material>
+  <element Z="19" formula="K" name="K">
+    <atom type="A" unit="g/mol" value="39.0983"/>
+  </element>
+  <material formula="K" name="Potassium" state="solid">
+    <RL type="X0" unit="cm" value="20.0871"/>
+    <NIL type="lambda" unit="cm" value="138.041"/>
+    <D type="density" unit="g/cm3" value="0.862"/>
+    <composite n="1" ref="K"/>
+  </material>
+  <element Z="36" formula="Kr" name="Kr">
+    <atom type="A" unit="g/mol" value="83.7993"/>
+  </element>
+  <material formula="Kr" name="Krypton" state="gas">
+    <RL type="X0" unit="cm" value="3269.44"/>
+    <NIL type="lambda" unit="cm" value="43962.9"/>
+    <D type="density" unit="g/cm3" value="0.00347832"/>
+    <composite n="1" ref="Kr"/>
+  </material>
+  <element Z="57" formula="La" name="La">
+    <atom type="A" unit="g/mol" value="138.905"/>
+  </element>
+  <material formula="La" name="Lanthanum" state="solid">
+    <RL type="X0" unit="cm" value="1.32238"/>
+    <NIL type="lambda" unit="cm" value="29.441"/>
+    <D type="density" unit="g/cm3" value="6.154"/>
+    <composite n="1" ref="La"/>
+  </material>
+  <element Z="3" formula="Li" name="Li">
+    <atom type="A" unit="g/mol" value="6.94003"/>
+  </element>
+  <material formula="Li" name="Lithium" state="solid">
+    <RL type="X0" unit="cm" value="154.997"/>
+    <NIL type="lambda" unit="cm" value="124.305"/>
+    <D type="density" unit="g/cm3" value="0.534"/>
+    <composite n="1" ref="Li"/>
+  </material>
+  <element Z="71" formula="Lu" name="Lu">
+    <atom type="A" unit="g/mol" value="174.967"/>
+  </element>
+  <material formula="Lu" name="Lutetium" state="solid">
+    <RL type="X0" unit="cm" value="0.703651"/>
+    <NIL type="lambda" unit="cm" value="19.8916"/>
+    <D type="density" unit="g/cm3" value="9.84"/>
+    <composite n="1" ref="Lu"/>
+  </material>
+  <element Z="12" formula="Mg" name="Mg">
+    <atom type="A" unit="g/mol" value="24.305"/>
+  </element>
+  <material formula="Mg" name="Magnesium" state="solid">
+    <RL type="X0" unit="cm" value="14.3859"/>
+    <NIL type="lambda" unit="cm" value="58.7589"/>
+    <D type="density" unit="g/cm3" value="1.74"/>
+    <composite n="1" ref="Mg"/>
+  </material>
+  <element Z="25" formula="Mn" name="Mn">
+    <atom type="A" unit="g/mol" value="54.938"/>
+  </element>
+  <material formula="Mn" name="Manganese" state="solid">
+    <RL type="X0" unit="cm" value="1.96772"/>
+    <NIL type="lambda" unit="cm" value="17.8701"/>
+    <D type="density" unit="g/cm3" value="7.44"/>
+    <composite n="1" ref="Mn"/>
+  </material>
+  <element Z="42" formula="Mo" name="Mo">
+    <atom type="A" unit="g/mol" value="95.9313"/>
+  </element>
+  <material formula="Mo" name="Molybdenum" state="solid">
+    <RL type="X0" unit="cm" value="0.959107"/>
+    <NIL type="lambda" unit="cm" value="15.6698"/>
+    <D type="density" unit="g/cm3" value="10.22"/>
+    <composite n="1" ref="Mo"/>
+  </material>
+  <element Z="7" formula="N" name="N">
+    <atom type="A" unit="g/mol" value="14.0068"/>
+  </element>
+  <material formula="N" name="Nitrogen" state="gas">
+    <RL type="X0" unit="cm" value="32602.2"/>
+    <NIL type="lambda" unit="cm" value="72430.3"/>
+    <D type="density" unit="g/cm3" value="0.0011652"/>
+    <composite n="1" ref="N"/>
+  </material>
+  <element Z="11" formula="Na" name="Na">
+    <atom type="A" unit="g/mol" value="22.9898"/>
+  </element>
+  <material formula="Na" name="Sodium" state="solid">
+    <RL type="X0" unit="cm" value="28.5646"/>
+    <NIL type="lambda" unit="cm" value="102.463"/>
+    <D type="density" unit="g/cm3" value="0.971"/>
+    <composite n="1" ref="Na"/>
+  </material>
+  <element Z="41" formula="Nb" name="Nb">
+    <atom type="A" unit="g/mol" value="92.9064"/>
+  </element>
+  <material formula="Nb" name="Niobium" state="solid">
+    <RL type="X0" unit="cm" value="1.15783"/>
+    <NIL type="lambda" unit="cm" value="18.4846"/>
+    <D type="density" unit="g/cm3" value="8.57"/>
+    <composite n="1" ref="Nb"/>
+  </material>
+  <element Z="60" formula="Nd" name="Nd">
+    <atom type="A" unit="g/mol" value="144.236"/>
+  </element>
+  <material formula="Nd" name="Neodymium" state="solid">
+    <RL type="X0" unit="cm" value="1.11667"/>
+    <NIL type="lambda" unit="cm" value="26.6308"/>
+    <D type="density" unit="g/cm3" value="6.9"/>
+    <composite n="1" ref="Nd"/>
+  </material>
+  <element Z="10" formula="Ne" name="Ne">
+    <atom type="A" unit="g/mol" value="20.18"/>
+  </element>
+  <material formula="Ne" name="Neon" state="gas">
+    <RL type="X0" unit="cm" value="34504.8"/>
+    <NIL type="lambda" unit="cm" value="114322"/>
+    <D type="density" unit="g/cm3" value="0.000838505"/>
+    <composite n="1" ref="Ne"/>
+  </material>
+  <element Z="28" formula="Ni" name="Ni">
+    <atom type="A" unit="g/mol" value="58.6933"/>
+  </element>
+  <material formula="Ni" name="Nickel" state="solid">
+    <RL type="X0" unit="cm" value="1.42422"/>
+    <NIL type="lambda" unit="cm" value="15.2265"/>
+    <D type="density" unit="g/cm3" value="8.902"/>
+    <composite n="1" ref="Ni"/>
+  </material>
+  <element Z="93" formula="Np" name="Np">
+    <atom type="A" unit="g/mol" value="237.048"/>
+  </element>
+  <material formula="Np" name="Neptunium" state="solid">
+    <RL type="X0" unit="cm" value="0.289676"/>
+    <NIL type="lambda" unit="cm" value="10.6983"/>
+    <D type="density" unit="g/cm3" value="20.25"/>
+    <composite n="1" ref="Np"/>
+  </material>
+  <element Z="8" formula="O" name="O">
+    <atom type="A" unit="g/mol" value="15.9994"/>
+  </element>
+  <material formula="O" name="Oxygen" state="gas">
+    <RL type="X0" unit="cm" value="25713.8"/>
+    <NIL type="lambda" unit="cm" value="66233.9"/>
+    <D type="density" unit="g/cm3" value="0.00133151"/>
+    <composite n="1" ref="O"/>
+  </material>
+  <element Z="76" formula="Os" name="Os">
+    <atom type="A" unit="g/mol" value="190.225"/>
+  </element>
+  <material formula="Os" name="Osmium" state="solid">
+    <RL type="X0" unit="cm" value="0.295861"/>
+    <NIL type="lambda" unit="cm" value="8.92553"/>
+    <D type="density" unit="g/cm3" value="22.57"/>
+    <composite n="1" ref="Os"/>
+  </material>
+  <element Z="15" formula="P" name="P">
+    <atom type="A" unit="g/mol" value="30.9738"/>
+  </element>
+  <material formula="P" name="Phosphorus" state="solid">
+    <RL type="X0" unit="cm" value="9.63879"/>
+    <NIL type="lambda" unit="cm" value="49.9343"/>
+    <D type="density" unit="g/cm3" value="2.2"/>
+    <composite n="1" ref="P"/>
+  </material>
+  <element Z="91" formula="Pa" name="Pa">
+    <atom type="A" unit="g/mol" value="231.036"/>
+  </element>
+  <material formula="Pa" name="Protactinium" state="solid">
+    <RL type="X0" unit="cm" value="0.38607"/>
+    <NIL type="lambda" unit="cm" value="13.9744"/>
+    <D type="density" unit="g/cm3" value="15.37"/>
+    <composite n="1" ref="Pa"/>
+  </material>
+  <element Z="82" formula="Pb" name="Pb">
+    <atom type="A" unit="g/mol" value="207.217"/>
+  </element>
+  <material formula="Pb" name="Lead" state="solid">
+    <RL type="X0" unit="cm" value="0.561253"/>
+    <NIL type="lambda" unit="cm" value="18.2607"/>
+    <D type="density" unit="g/cm3" value="11.35"/>
+    <composite n="1" ref="Pb"/>
+  </material>
+  <element Z="46" formula="Pd" name="Pd">
+    <atom type="A" unit="g/mol" value="106.415"/>
+  </element>
+  <material formula="Pd" name="Palladium" state="solid">
+    <RL type="X0" unit="cm" value="0.765717"/>
+    <NIL type="lambda" unit="cm" value="13.7482"/>
+    <D type="density" unit="g/cm3" value="12.02"/>
+    <composite n="1" ref="Pd"/>
+  </material>
+  <element Z="61" formula="Pm" name="Pm">
+    <atom type="A" unit="g/mol" value="144.913"/>
+  </element>
+  <material formula="Pm" name="Promethium" state="solid">
+    <RL type="X0" unit="cm" value="1.04085"/>
+    <NIL type="lambda" unit="cm" value="25.4523"/>
+    <D type="density" unit="g/cm3" value="7.22"/>
+    <composite n="1" ref="Pm"/>
+  </material>
+  <element Z="84" formula="Po" name="Po">
+    <atom type="A" unit="g/mol" value="208.982"/>
+  </element>
+  <material formula="Po" name="Polonium" state="solid">
+    <RL type="X0" unit="cm" value="0.661092"/>
+    <NIL type="lambda" unit="cm" value="22.2842"/>
+    <D type="density" unit="g/cm3" value="9.32"/>
+    <composite n="1" ref="Po"/>
+  </material>
+  <element Z="59" formula="Pr" name="Pr">
+    <atom type="A" unit="g/mol" value="140.908"/>
+  </element>
+  <material formula="Pr" name="Praseodymium" state="solid">
+    <RL type="X0" unit="cm" value="1.1562"/>
+    <NIL type="lambda" unit="cm" value="27.1312"/>
+    <D type="density" unit="g/cm3" value="6.71"/>
+    <composite n="1" ref="Pr"/>
+  </material>
+  <element Z="78" formula="Pt" name="Pt">
+    <atom type="A" unit="g/mol" value="195.078"/>
+  </element>
+  <material formula="Pt" name="Platinum" state="solid">
+    <RL type="X0" unit="cm" value="0.305053"/>
+    <NIL type="lambda" unit="cm" value="9.46584"/>
+    <D type="density" unit="g/cm3" value="21.45"/>
+    <composite n="1" ref="Pt"/>
+  </material>
+  <element Z="94" formula="Pu" name="Pu">
+    <atom type="A" unit="g/mol" value="244.064"/>
+  </element>
+  <material formula="Pu" name="Plutonium" state="solid">
+    <RL type="X0" unit="cm" value="0.298905"/>
+    <NIL type="lambda" unit="cm" value="11.0265"/>
+    <D type="density" unit="g/cm3" value="19.84"/>
+    <composite n="1" ref="Pu"/>
+  </material>
+  <element Z="88" formula="Ra" name="Ra">
+    <atom type="A" unit="g/mol" value="226.025"/>
+  </element>
+  <material formula="Ra" name="Radium" state="solid">
+    <RL type="X0" unit="cm" value="1.22987"/>
+    <NIL type="lambda" unit="cm" value="42.6431"/>
+    <D type="density" unit="g/cm3" value="5"/>
+    <composite n="1" ref="Ra"/>
+  </material>
+  <element Z="37" formula="Rb" name="Rb">
+    <atom type="A" unit="g/mol" value="85.4677"/>
+  </element>
+  <material formula="Rb" name="Rubidium" state="solid">
+    <RL type="X0" unit="cm" value="7.19774"/>
+    <NIL type="lambda" unit="cm" value="100.218"/>
+    <D type="density" unit="g/cm3" value="1.532"/>
+    <composite n="1" ref="Rb"/>
+  </material>
+  <element Z="75" formula="Re" name="Re">
+    <atom type="A" unit="g/mol" value="186.207"/>
+  </element>
+  <material formula="Re" name="Rhenium" state="solid">
+    <RL type="X0" unit="cm" value="0.318283"/>
+    <NIL type="lambda" unit="cm" value="9.5153"/>
+    <D type="density" unit="g/cm3" value="21.02"/>
+    <composite n="1" ref="Re"/>
+  </material>
+  <element Z="45" formula="Rh" name="Rh">
+    <atom type="A" unit="g/mol" value="102.906"/>
+  </element>
+  <material formula="Rh" name="Rhodium" state="solid">
+    <RL type="X0" unit="cm" value="0.746619"/>
+    <NIL type="lambda" unit="cm" value="13.2083"/>
+    <D type="density" unit="g/cm3" value="12.41"/>
+    <composite n="1" ref="Rh"/>
+  </material>
+  <element Z="86" formula="Rn" name="Rn">
+    <atom type="A" unit="g/mol" value="222.018"/>
+  </element>
+  <material formula="Rn" name="Radon" state="gas">
+    <RL type="X0" unit="cm" value="697.777"/>
+    <NIL type="lambda" unit="cm" value="23532"/>
+    <D type="density" unit="g/cm3" value="0.00900662"/>
+    <composite n="1" ref="Rn"/>
+  </material>
+  <element Z="44" formula="Ru" name="Ru">
+    <atom type="A" unit="g/mol" value="101.065"/>
+  </element>
+  <material formula="Ru" name="Ruthenium" state="solid">
+    <RL type="X0" unit="cm" value="0.764067"/>
+    <NIL type="lambda" unit="cm" value="13.1426"/>
+    <D type="density" unit="g/cm3" value="12.41"/>
+    <composite n="1" ref="Ru"/>
+  </material>
+  <element Z="16" formula="S" name="S">
+    <atom type="A" unit="g/mol" value="32.0661"/>
+  </element>
+  <material formula="S" name="Sulfur" state="solid">
+    <RL type="X0" unit="cm" value="9.74829"/>
+    <NIL type="lambda" unit="cm" value="55.6738"/>
+    <D type="density" unit="g/cm3" value="2"/>
+    <composite n="1" ref="S"/>
+  </material>
+  <element Z="51" formula="Sb" name="Sb">
+    <atom type="A" unit="g/mol" value="121.76"/>
+  </element>
+  <material formula="Sb" name="Antimony" state="solid">
+    <RL type="X0" unit="cm" value="1.30401"/>
+    <NIL type="lambda" unit="cm" value="25.8925"/>
+    <D type="density" unit="g/cm3" value="6.691"/>
+    <composite n="1" ref="Sb"/>
+  </material>
+  <element Z="21" formula="Sc" name="Sc">
+    <atom type="A" unit="g/mol" value="44.9559"/>
+  </element>
+  <material formula="Sc" name="Scandium" state="solid">
+    <RL type="X0" unit="cm" value="5.53545"/>
+    <NIL type="lambda" unit="cm" value="41.609"/>
+    <D type="density" unit="g/cm3" value="2.989"/>
+    <composite n="1" ref="Sc"/>
+  </material>
+  <element Z="34" formula="Se" name="Se">
+    <atom type="A" unit="g/mol" value="78.9594"/>
+  </element>
+  <material formula="Se" name="Selenium" state="solid">
+    <RL type="X0" unit="cm" value="2.64625"/>
+    <NIL type="lambda" unit="cm" value="33.356"/>
+    <D type="density" unit="g/cm3" value="4.5"/>
+    <composite n="1" ref="Se"/>
+  </material>
+  <element Z="14" formula="Si" name="Si">
+    <atom type="A" unit="g/mol" value="28.0854"/>
+  </element>
+  <material formula="Si" name="Silicon" state="solid">
+    <RL type="X0" unit="cm" value="9.36607"/>
+    <NIL type="lambda" unit="cm" value="45.7531"/>
+    <D type="density" unit="g/cm3" value="2.33"/>
+    <composite n="1" ref="Si"/>
+  </material>
+  <element Z="62" formula="Sm" name="Sm">
+    <atom type="A" unit="g/mol" value="150.366"/>
+  </element>
+  <material formula="Sm" name="Samarium" state="solid">
+    <RL type="X0" unit="cm" value="1.01524"/>
+    <NIL type="lambda" unit="cm" value="24.9892"/>
+    <D type="density" unit="g/cm3" value="7.46"/>
+    <composite n="1" ref="Sm"/>
+  </material>
+  <element Z="50" formula="Sn" name="Sn">
+    <atom type="A" unit="g/mol" value="118.71"/>
+  </element>
+  <material formula="Sn" name="Tin" state="solid">
+    <RL type="X0" unit="cm" value="1.20637"/>
+    <NIL type="lambda" unit="cm" value="23.4931"/>
+    <D type="density" unit="g/cm3" value="7.31"/>
+    <composite n="1" ref="Sn"/>
+  </material>
+  <element Z="38" formula="Sr" name="Sr">
+    <atom type="A" unit="g/mol" value="87.6166"/>
+  </element>
+  <material formula="Sr" name="Strontium" state="solid">
+    <RL type="X0" unit="cm" value="4.237"/>
+    <NIL type="lambda" unit="cm" value="61.0238"/>
+    <D type="density" unit="g/cm3" value="2.54"/>
+    <composite n="1" ref="Sr"/>
+  </material>
+  <element Z="73" formula="Ta" name="Ta">
+    <atom type="A" unit="g/mol" value="180.948"/>
+  </element>
+  <material formula="Ta" name="Tantalum" state="solid">
+    <RL type="X0" unit="cm" value="0.409392"/>
+    <NIL type="lambda" unit="cm" value="11.8846"/>
+    <D type="density" unit="g/cm3" value="16.654"/>
+    <composite n="1" ref="Ta"/>
+  </material>
+  <element Z="65" formula="Tb" name="Tb">
+    <atom type="A" unit="g/mol" value="158.925"/>
+  </element>
+  <material formula="Tb" name="Terbium" state="solid">
+    <RL type="X0" unit="cm" value="0.893977"/>
+    <NIL type="lambda" unit="cm" value="23.0311"/>
+    <D type="density" unit="g/cm3" value="8.229"/>
+    <composite n="1" ref="Tb"/>
+  </material>
+  <element Z="43" formula="Tc" name="Tc">
+    <atom type="A" unit="g/mol" value="97.9072"/>
+  </element>
+  <material formula="Tc" name="Technetium" state="solid">
+    <RL type="X0" unit="cm" value="0.833149"/>
+    <NIL type="lambda" unit="cm" value="14.0185"/>
+    <D type="density" unit="g/cm3" value="11.5"/>
+    <composite n="1" ref="Tc"/>
+  </material>
+  <element Z="52" formula="Te" name="Te">
+    <atom type="A" unit="g/mol" value="127.603"/>
+  </element>
+  <material formula="Te" name="Tellurium" state="solid">
+    <RL type="X0" unit="cm" value="1.41457"/>
+    <NIL type="lambda" unit="cm" value="28.1797"/>
+    <D type="density" unit="g/cm3" value="6.24"/>
+    <composite n="1" ref="Te"/>
+  </material>
+  <element Z="90" formula="Th" name="Th">
+    <atom type="A" unit="g/mol" value="232.038"/>
+  </element>
+  <material formula="Th" name="Thorium" state="solid">
+    <RL type="X0" unit="cm" value="0.51823"/>
+    <NIL type="lambda" unit="cm" value="18.353"/>
+    <D type="density" unit="g/cm3" value="11.72"/>
+    <composite n="1" ref="Th"/>
+  </material>
+  <element Z="22" formula="Ti" name="Ti">
+    <atom type="A" unit="g/mol" value="47.8667"/>
+  </element>
+  <material formula="Ti" name="Titanium" state="solid">
+    <RL type="X0" unit="cm" value="3.5602"/>
+    <NIL type="lambda" unit="cm" value="27.9395"/>
+    <D type="density" unit="g/cm3" value="4.54"/>
+    <composite n="1" ref="Ti"/>
+  </material>
+  <element Z="81" formula="Tl" name="Tl">
+    <atom type="A" unit="g/mol" value="204.383"/>
+  </element>
+  <material formula="Tl" name="Thallium" state="solid">
+    <RL type="X0" unit="cm" value="0.547665"/>
+    <NIL type="lambda" unit="cm" value="17.6129"/>
+    <D type="density" unit="g/cm3" value="11.72"/>
+    <composite n="1" ref="Tl"/>
+  </material>
+  <element Z="69" formula="Tm" name="Tm">
+    <atom type="A" unit="g/mol" value="168.934"/>
+  </element>
+  <material formula="Tm" name="Thulium" state="solid">
+    <RL type="X0" unit="cm" value="0.754428"/>
+    <NIL type="lambda" unit="cm" value="20.7522"/>
+    <D type="density" unit="g/cm3" value="9.321"/>
+    <composite n="1" ref="Tm"/>
+  </material>
+  <element Z="92" formula="U" name="U">
+    <atom type="A" unit="g/mol" value="238.029"/>
+  </element>
+  <material formula="U" name="Uranium" state="solid">
+    <RL type="X0" unit="cm" value="0.31663"/>
+    <NIL type="lambda" unit="cm" value="11.4473"/>
+    <D type="density" unit="g/cm3" value="18.95"/>
+    <composite n="1" ref="U"/>
+  </material>
+  <element Z="23" formula="V" name="V">
+    <atom type="A" unit="g/mol" value="50.9415"/>
+  </element>
+  <material formula="V" name="Vanadium" state="solid">
+    <RL type="X0" unit="cm" value="2.59285"/>
+    <NIL type="lambda" unit="cm" value="21.2187"/>
+    <D type="density" unit="g/cm3" value="6.11"/>
+    <composite n="1" ref="V"/>
+  </material>
+  <element Z="74" formula="W" name="W">
+    <atom type="A" unit="g/mol" value="183.842"/>
+  </element>
+  <material formula="W" name="Tungsten" state="solid">
+    <RL type="X0" unit="cm" value="0.350418"/>
+    <NIL type="lambda" unit="cm" value="10.3057"/>
+    <D type="density" unit="g/cm3" value="19.3"/>
+    <composite n="1" ref="W"/>
+  </material>
+  <element Z="54" formula="Xe" name="Xe">
+    <atom type="A" unit="g/mol" value="131.292"/>
+  </element>
+  <material formula="Xe" name="Xenon" state="gas">
+    <RL type="X0" unit="cm" value="1546.2"/>
+    <NIL type="lambda" unit="cm" value="32477.9"/>
+    <D type="density" unit="g/cm3" value="0.00548536"/>
+    <composite n="1" ref="Xe"/>
+  </material>
+  <element Z="39" formula="Y" name="Y">
+    <atom type="A" unit="g/mol" value="88.9058"/>
+  </element>
+  <material formula="Y" name="Yttrium" state="solid">
+    <RL type="X0" unit="cm" value="2.32943"/>
+    <NIL type="lambda" unit="cm" value="34.9297"/>
+    <D type="density" unit="g/cm3" value="4.469"/>
+    <composite n="1" ref="Y"/>
+  </material>
+  <element Z="70" formula="Yb" name="Yb">
+    <atom type="A" unit="g/mol" value="173.038"/>
+  </element>
+  <material formula="Yb" name="Ytterbium" state="solid">
+    <RL type="X0" unit="cm" value="1.04332"/>
+    <NIL type="lambda" unit="cm" value="28.9843"/>
+    <D type="density" unit="g/cm3" value="6.73"/>
+    <composite n="1" ref="Yb"/>
+  </material>
+  <element Z="30" formula="Zn" name="Zn">
+    <atom type="A" unit="g/mol" value="65.3955"/>
+  </element>
+  <material formula="Zn" name="Zinc" state="solid">
+    <RL type="X0" unit="cm" value="1.74286"/>
+    <NIL type="lambda" unit="cm" value="19.8488"/>
+    <D type="density" unit="g/cm3" value="7.133"/>
+    <composite n="1" ref="Zn"/>
+  </material>
+  <element Z="40" formula="Zr" name="Zr">
+    <atom type="A" unit="g/mol" value="91.2236"/>
+  </element>
+  <material formula="Zr" name="Zirconium" state="solid">
+    <RL type="X0" unit="cm" value="1.56707"/>
+    <NIL type="lambda" unit="cm" value="24.2568"/>
+    <D type="density" unit="g/cm3" value="6.506"/>
+    <composite n="1" ref="Zr"/>
+  </material>
+</materials>
diff --git a/compact/fields.xml b/compact/fields.xml
new file mode 100644
index 0000000..79e195f
--- /dev/null
+++ b/compact/fields.xml
@@ -0,0 +1,18 @@
+<geant4_setup>
+  <properties>
+    <attributes name="geant4_field"
+		id="0"
+		type="Geant4FieldSetup"
+		object="D21EF_5_Magnet"
+		global="true"
+		min_chord_step="0.001*mm"
+		delta_chord="0.025*mm"
+		delta_intersection="1e-06*mm"
+		delta_one_step="0.00001*mm"
+		eps_min="1.0e-6"
+		eps_max="1.0e-5"
+		stepper="HelixSimpleRunge"
+		equation="Mag_UsualEqRhs">
+    </attributes>
+  </properties>
+</geant4_setup>
diff --git a/compact/materials.xml b/compact/materials.xml
new file mode 100644
index 0000000..72961aa
--- /dev/null
+++ b/compact/materials.xml
@@ -0,0 +1,222 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<materials>
+  <!--
+       Air by weight from
+
+       http://www.engineeringtoolbox.com/air-composition-24_212.html
+  -->
+  <material name="Air">
+    <D type="density" unit="g/cm3" value="0.0012"/>
+    <fraction n="0.754" ref="N"/>
+    <fraction n="0.234" ref="O"/>
+    <fraction n="0.012" ref="Ar"/>
+  </material>
+  <!-- We model vakuum just as very thin air -->
+  <material name="Vacuum">
+    <D type="density" unit="g/cm3" value="0.0000000001"/>
+    <fraction n="0.754" ref="N"/>
+    <fraction n="0.234" ref="O"/>
+    <fraction n="0.012" ref="Ar"/>
+  </material>
+  <material name="Epoxy">
+    <D type="density" value="1.3" unit="g/cm3"/>
+    <composite n="44" ref="H"/>
+    <composite n="15" ref="C"/>
+    <composite n="7" ref="O"/>
+  </material>
+  <material name="Quartz">
+    <D type="density" value="2.2" unit="g/cm3"/>
+    <composite n="1" ref="Si"/>
+    <composite n="2" ref="O"/>
+  </material>
+  <material name="G10">
+    <D type="density" value="1.7" unit="g/cm3"/>
+    <fraction n="0.08" ref="Cl"/>
+    <fraction n="0.773" ref="Quartz"/>
+    <fraction n="0.147" ref="Epoxy"/>
+  </material>
+  <material name="Polystyrene">
+    <D value="1.032" unit="g/cm3"/>
+    <composite n="19" ref="C"/>
+    <composite n="21" ref="H"/>
+  </material>
+  <material name="Steel235">
+    <D value="7.85" unit="g/cm3"/>
+    <fraction n="0.998" ref="Fe"/>
+    <fraction n=".002" ref="C"/>
+  </material>
+  <material name="SiliconOxide">
+    <D type="density" value="2.65" unit="g/cm3"/>
+    <composite n="1" ref="Si"/>
+    <composite n="2" ref="O"/>
+  </material>
+  <material name="BoronOxide">
+    <D type="density" value="2.46" unit="g/cm3"/>
+    <composite n="2" ref="B"/>
+    <composite n="3" ref="O"/>
+  </material>
+  <material name="SodiumOxide">
+    <D type="density" value="2.65" unit="g/cm3"/>
+    <composite n="2" ref="Na"/>
+    <composite n="1" ref="O"/>
+  </material>
+  <material name="AluminumOxide">
+    <D type="density" value="3.89" unit="g/cm3"/>
+    <composite n="2" ref="Al"/>
+    <composite n="3" ref="O"/>
+  </material>
+  <material name="SiliconNitride">
+    <D type="density" value="3.17" unit="g/cm3"/>
+    <composite n="3" ref="Si"/>
+    <composite n="4" ref="N"/>
+  </material>
+  <material name="PyrexGlass">
+    <D type="density" value="2.23" unit="g/cm3"/>
+    <fraction n="0.806" ref="SiliconOxide"/>
+    <fraction n="0.130" ref="BoronOxide"/>
+    <fraction n="0.040" ref="SodiumOxide"/>
+    <fraction n="0.023" ref="AluminumOxide"/>
+  </material>
+  <material name="CarbonFiber">
+    <D type="density" value="1.5" unit="g/cm3"/>
+    <fraction n="0.65" ref="C"/>
+    <fraction n="0.35" ref="Epoxy"/>
+  </material>
+  <material name="CarbonFiber_50D">
+    <D type="density" value="0.75" unit="g/cm3"/>
+    <fraction n="0.65" ref="C"/>
+    <fraction n="0.35" ref="Epoxy"/>
+  </material>
+  <material name="Rohacell31">
+    <D type="density" value="0.032" unit="g/cm3"/>
+    <composite n="9" ref="C"/>
+    <composite n="13" ref="H"/>
+    <composite n="2" ref="O"/>
+    <composite n="1" ref="N"/>
+  </material>
+  <material name="Rohacell31_50D">
+    <D type="density" value="0.016" unit="g/cm3"/>
+    <composite n="9" ref="C"/>
+    <composite n="13" ref="H"/>
+    <composite n="2" ref="O"/>
+    <composite n="1" ref="N"/>
+  </material>
+  <material name="RPCGasDefault" state="gas">
+    <D type="density" value="0.0037" unit="g/cm3"/>
+    <composite n="209" ref="C"/>
+    <composite n="239" ref="H"/>
+    <composite n="381" ref="F"/>
+  </material>
+  <material name="PolystyreneFoam">
+    <D type="density" value="0.0056" unit="g/cm3"/>
+    <fraction n="1.0" ref="Polystyrene"/>
+  </material>
+  <material name="Kapton">
+    <D value="1.43" unit="g/cm3"/>
+    <composite n="22" ref="C"/>
+    <composite n="10" ref="H"/>
+    <composite n="2" ref="N"/>
+    <composite n="5" ref="O"/>
+  </material>
+  <material name="PEEK">
+    <D value="1.37" unit="g/cm3"/>
+    <composite n="19" ref="C"/>
+    <composite n="12" ref="H"/>
+    <composite n="3" ref="O"/>
+  </material>
+  <material name="TungstenDens23">
+    <D value="17.7" unit="g / cm3"/>
+    <fraction n="0.925" ref="W"/>
+    <fraction n="0.066" ref="Ni"/>
+    <fraction n="0.009" ref="Fe"/>
+  </material>
+  <material name="TungstenDens24">
+    <D value="17.8" unit="g / cm3"/>
+    <fraction n="0.93" ref="W"/>
+    <fraction n="0.061" ref="Ni"/>
+    <fraction n="0.009" ref="Fe"/>
+  </material>
+  <material name="TungstenDens25">
+    <D value="18.2" unit="g / cm3"/>
+    <fraction n="0.950" ref="W"/>
+    <fraction n="0.044" ref="Ni"/>
+    <fraction n="0.006" ref="Fe"/>
+  </material>
+  <material name="CarbonFiber_25percent">
+    <D type="density" value="0.375" unit="g / cm3"/>
+    <fraction n="1.0" ref="CarbonFiber"/>
+  </material>
+  <material name="CarbonFiber_15percent">
+    <D type="density" value="0.225" unit="g / cm3"/>
+    <fraction n="1.0" ref="CarbonFiber"/>
+  </material>
+  <material name="Rohacell31_50percent">
+    <D type="density" value="0.016" unit="g / cm3"/>
+    <fraction n="1.0" ref="Rohacell31"/>
+  </material>
+  <material name="Rohacell31_15percent">
+    <D type="density" value="0.0048" unit="g / cm3"/>
+    <fraction n="1.0" ref="Rohacell31"/>
+  </material>
+  <material name="BoratedPolyethylene5">
+    <D value="0.93" unit="g / cm3"/>
+    <fraction n="0.612" ref="C"/>
+    <fraction n="0.222" ref="O"/>
+    <fraction n="0.116" ref="H"/>
+    <fraction n="0.050" ref="B"/>
+  </material>
+  <material name="SiliconCarbide">
+    <D value="3.1" unit="g / cm3"/>
+    <composite n="1" ref="Si"/>
+    <composite n="1" ref="C"/>
+  </material>
+  <material name="SiliconCarbide_6percent">
+    <D value="0.186" unit="g / cm3"/>
+    <fraction n="1.0" ref="SiliconCarbide"/>
+  </material>
+  <material name="PlasticScint">
+    <D type="density" unit="g/cm3" value="1.032"/>
+    <composite n="9" ref="C"/>
+    <composite n="10" ref="H"/>
+  </material>
+  <material name="PbWO4">
+    <D type="density" value="8.3" unit="g / cm3"/>
+    <composite n="1" ref="Pb"/>
+    <composite n="1" ref="W"/>
+    <composite n="4" ref="O"/>
+  </material>
+  <material name="StainlessSteel">
+    <D type="density" value="8.3" unit="g / cm3"/>
+    <fraction n="0.74" ref="Fe"/>
+    <fraction n="0.18" ref="Cr"/>
+    <fraction n="0.08" ref="Ni"/>
+  </material>
+  <material name="ZDC_Tungsten">
+    <D type="density" value="18.73" unit="g / cm3"/>
+    <fraction n="0.943" ref="W"/>
+    <fraction n="0.038" ref="Ni"/>
+    <fraction n="0.019" ref="Cu"/>
+  </material>
+  <material name="ZDC_EpoxyGlue">
+    <D type="density" value="1.38" unit="g/cm3"/>
+    <composite n="8"  ref="H"/>
+    <composite n="10" ref="C"/>
+    <composite n="4"  ref="O"/>
+  </material>
+  <material name="ZDC_Scintillator">
+    <D type="density" value="1.032" unit="g/cm3"/>
+    <composite n="8" ref="C"/>
+    <composite n="8" ref="H"/>
+  </material>
+  <material name="ZDC_WSciFiMixture">
+    <D type="density" value="10.17" unit="g/cm3"/>
+    <composite n="0.950"  ref="W"/>
+    <composite n="0.009" ref="H"/>
+    <composite n="0.041"  ref="C"/>
+  </material>
+  <material name="WSciFi_UCLA_Abs">
+    <D type="density" value="12.4" unit="g / cm3"/>
+    <fraction n="0.96" ref="W"/>
+    <fraction n="0.04" ref="Polystyrene"/>
+  </material>  
+</materials>
diff --git a/compact/photon_calorimeter.xml b/compact/photon_calorimeter.xml
new file mode 100644
index 0000000..0374939
--- /dev/null
+++ b/compact/photon_calorimeter.xml
@@ -0,0 +1,49 @@
+<lccdd>
+  <comment>
+    Compton Photon Calorimeter
+  </comment>        
+
+  <detectors>
+    <detector
+        id="photon_calorimeter_ID"
+        name="photon_calorimeter"
+        vis="photon_calorimeter_vis"
+        type="CrystalCalorimeter"
+        readout="PhotonCalorimeterHits">
+      <position
+        x="photon_calorimeter_x_position"
+        y="photon_calorimeter_y_position"
+        z="photon_calorimeter_z_position"
+      />
+      <rotation
+        x="photon_calorimeter_x_angle"
+        y="photon_calorimeter_y_angle"
+        z="photon_calorimeter_z_angle"
+      />
+      <dimensions
+        x="photon_calorimeter_width"
+        z="photon_calorimeter_length"
+      />
+      <layer repeat="ffi_ZDC_SiWSciFi_NRepeat">
+        <slice name="Silicon_1_slice" material="Silicon"       thickness="ffi_ZDC_Silicon_1_Thickness" vis="RedVis"  sensitive="true"/>
+	<slice name="Glue_1_slice"    material="ZDC_EpoxyGlue" thickness="ffi_ZDC_Glue_1_Thickness"    vis="AnlGold"/>
+	<slice name="FPC_slice"       material="ZDC_EpoxyGlue" thickness="ffi_ZDC_FPC_Thickness"       vis="AnlGold"/>
+	<slice name="Air_1_slice"     material="Air"           thickness="ffi_ZDC_Air_1_Thickness"     vis="InvisibleNoDaughters"/>
+        <slice name="WSciFi_slice"    material="ZDC_WSciFiMixture"         thickness="ffi_ZDC_WSciFi_Thickness"     vis="AnlGold" sensitive="true"/> <!-- now this is a WSciFi mixture -->
+	<slice name="Air_2_slice"     material="Air"           thickness="ffi_ZDC_Air_2_Thickness"     vis="InvisibleNoDaughters"/>
+      </layer>
+    </detector>
+  </detectors>
+
+  <readouts>
+    <readout name="PhotonCalorimeterHits">
+      <segmentation
+        name="PbWO4_grid"
+        type="CartesianGridXY"
+        grid_size_x="2.0*cm"
+        grid_size_y="2.0*cm"
+      />
+      <id>system:8,layer:12,slice:12,x:32:-16,y:-16</id>  
+    </readout>
+  </readouts>
+</lccdd>
diff --git a/compton.xml b/compton.xml
new file mode 100644
index 0000000..f28b4df
--- /dev/null
+++ b/compton.xml
@@ -0,0 +1,56 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<lccdd>
+  <define>
+    <constant name="Pi" value="3.14159265359"/>
+    <constant name="world_side" value="30*m"/>
+    <constant name="world_x" value="world_side"/>
+    <constant name="world_y" value="world_side"/>
+    <constant name="world_z" value="100*m"/>
+    <constant name="BeamPipeB0_ID" value="1"/>
+    <constant name="BeamPipe_ID" value="2"/>
+
+    <include ref="compact/definitions.xml" />
+
+    <comment> 
+      
+      =====================================
+      (170-179) Compton Detectors
+      =====================================
+
+      Photon Tracker        ID: 170 - 171
+      Photon Calorimeter    ID: 172 - 173
+      Electron Tracker      ID: 175 - 179
+
+    </comment>
+    <constant name="photon_tracker_ID"      value="170"/>
+    <constant name="photon_calorimeter_ID"  value="172"/>
+    <constant name="electron_tracker_1_ID"  value="175"/>
+    <constant name="electron_tracker_2_ID"  value="176"/>
+    <constant name="electron_tracker_3_ID"  value="177"/>
+    <constant name="electron_tracker_4_ID"  value="178"/>
+
+    <comment> 
+        =====================================
+      (180-189) Forward Beamline Magnets
+        =====================================
+    </comment>
+
+  </define>
+
+  <includes>
+    <gdmlFile ref="compact/elements.xml"/>
+    <gdmlFile ref="compact/materials.xml"/>
+  </includes>
+
+  <display>
+    <include ref="compact/colors.xml" />
+    <include ref="compact/display.xml" />
+  </display>
+
+  <!--include ref="compact/photon_tracker.xml" /-->
+  <!--include ref="compact/photon_calorimeter.xml" /-->
+  <!--include ref="compact/electron_tracker.xml"/-->
+
+  <include ref="compact/beamline.xml" />
+
+</lccdd>
diff --git a/scripts/checkOverlaps.py b/scripts/checkOverlaps.py
new file mode 100755
index 0000000..512ee81
--- /dev/null
+++ b/scripts/checkOverlaps.py
@@ -0,0 +1,45 @@
+from __future__ import absolute_import, unicode_literals
+import os
+import time
+import logging
+
+import argparse
+parser = argparse.ArgumentParser(
+     prog='checkOverlaps.py',
+     description='''Runs geant overlap checking ''',
+     epilog='''
+     This program runs geant4 to find geometry overlaps.
+         ''')
+parser.add_argument("-c", "--compact", help="compact detector file",default="athena.xml")
+parser.add_argument("-r", "--resolution", help="number of points on surface",default="10000")
+parser.add_argument("-t", "--tolerance", help="minimum distance (in mm) to report overlaps",default="0.1")
+parser.add_argument("-v", "--verbose", help="print output", action='store_true')
+
+args = parser.parse_args()
+
+import DDG4
+from g4units import keV, GeV, mm, ns, MeV
+
+def run():
+  kernel = DDG4.Kernel()
+  description = kernel.detectorDescription()
+  kernel.loadGeometry(str("file:" + args.compact))
+
+  DDG4.importConstants(description)
+
+  geant4 = DDG4.Geant4(kernel)
+  ui = geant4.setupCshUI(ui=None)
+  ui.Commands = [
+      '/geometry/test/resolution {}'.format(args.resolution),
+      '/geometry/test/tolerance {}'.format(args.tolerance),
+      '/geometry/test/verbosity {}'.format(1 if args.verbose else 0),
+      '/geometry/test/run'
+      ]
+  kernel.configure()
+  kernel.initialize()
+  kernel.run()
+  kernel.terminate()
+
+
+if __name__ == "__main__":
+  run()
diff --git a/src/CylindricalDipoleMagnet_geo.cpp b/src/CylindricalDipoleMagnet_geo.cpp
new file mode 100644
index 0000000..8d83ddd
--- /dev/null
+++ b/src/CylindricalDipoleMagnet_geo.cpp
@@ -0,0 +1,99 @@
+#include "DD4hep/DetFactoryHelper.h"
+#include "DD4hep/Printout.h"
+#include "DD4hep/Shapes.h"
+#include "TMath.h"
+#include "DDRec/Surface.h"
+#include "DDRec/DetectorData.h"
+#include "XML/Layering.h"
+
+using namespace std;
+using namespace dd4hep;
+using namespace dd4hep::rec;
+using namespace ROOT::Math;
+
+static Ref_t build_magnet(Detector& dtor, xml_h e, SensitiveDetector /* sens */) {
+    xml_det_t x_det     = e;
+    int       det_id    = x_det.id();
+    string    det_name  = x_det.nameStr();
+    xml_dim_t pos       = x_det.child(_U(placement));
+    double    pos_x     = pos.x();
+    double    pos_y     = pos.y();
+    double    pos_z     = pos.z();
+    double    pos_theta = pos.attr<double>(_U(theta));
+    xml_dim_t dims      = x_det.dimensions();
+    double    dim_r     = dims.r();
+    double    dim_z     = dims.z();
+    xml_dim_t apperture = x_det.child(_Unicode(apperture));
+    double    app_r     = apperture.r();
+    xml_dim_t coil      = x_det.child(_Unicode(coil));
+    double    coil_x    = coil.dx();
+    double    coil_y    = coil.dy();
+    Material  iron      = dtor.material("Vacuum");
+    Material  niobium   = dtor.material("Vacuum");
+
+    //std::cout << det_name << " positioned at z=" << pos.z() << ", x=" << pos.x() << "\n"; 
+
+    DetElement sdet(det_name, det_id);
+    Assembly   assembly(det_name + "_assembly");
+
+    const string module_name = "Quad_magnet";
+
+    const string yoke_vis = dd4hep::getAttrOrDefault(x_det, _Unicode(vis), "GreenVis");
+    const string coil_vis = dd4hep::getAttrOrDefault(coil, _Unicode(vis), "RedVis");
+
+    sdet.setAttributes(dtor, assembly, x_det.regionStr(), x_det.limitsStr(), yoke_vis);
+
+    // -- yoke
+    Tube yoke_tube(app_r + coil_y, dim_r, 0.5*dim_z);
+    Volume yoke_vol("yoke_vol", yoke_tube, iron);
+    auto yoke_pv = assembly.placeVolume(yoke_vol);
+    yoke_pv.addPhysVolID("element", 1);
+    DetElement yoke_de(sdet, "yoke_de", 1);
+    yoke_de.setPlacement(yoke_pv);
+    yoke_de.setAttributes(dtor, yoke_vol, x_det.regionStr(), x_det.limitsStr(), yoke_vis);
+
+    // -- coils
+    double offset = 1.5 * coil_x;
+    double appc_r = app_r + 0.5 * coil_y;
+    double offset_angle = atan(offset / appc_r);
+
+    Tube longrod(app_r, app_r + coil_y, 0.5*dim_z, atan(coil_x / app_r));
+    Tube connector(app_r, app_r + coil_y , coil_y, 0.5*M_PI - offset_angle);
+
+    UnionSolid coil1(longrod, longrod, Transform3D(RotationZ(-offset_angle)));
+    UnionSolid coil2(coil1, longrod, Transform3D(RotationZ(0.5*M_PI)));
+    UnionSolid coil3(coil2, longrod, Transform3D(RotationZ(M_PI)));
+    UnionSolid coil4(coil3, longrod, Transform3D(RotationZ(1.5*M_PI)));
+
+    UnionSolid coil5(coil4, longrod, Transform3D(RotationZ(0.5*M_PI - offset_angle)));
+    UnionSolid coil6(coil5, longrod, Transform3D(RotationZ(M_PI - offset_angle)));
+    UnionSolid coil7(coil6, longrod, Transform3D(RotationZ(1.5*M_PI - offset_angle)));
+
+    UnionSolid coil8(coil7, connector, Transform3D(Translation3D(0.0, 0.0, -0.5*dim_z + coil_y)));
+    UnionSolid coil9(coil8, connector, Transform3D(Translation3D(0.0, 0.0, -0.5*dim_z + coil_y) * RotationZ(0.5*M_PI)));
+    UnionSolid coil10(coil9, connector, Transform3D(Translation3D(0.0, 0.0, -0.5*dim_z + coil_y) * RotationZ(M_PI)));
+    UnionSolid coil11(coil10, connector, Transform3D(Translation3D(0.0, 0.0, -0.5*dim_z + coil_y) * RotationZ(1.5*M_PI)));
+    UnionSolid coil12(coil11, connector, Transform3D(Translation3D(0.0, 0.0, 0.5*dim_z - coil_y)));
+    UnionSolid coil13(coil12, connector, Transform3D(Translation3D(0.0, 0.0, 0.5*dim_z - coil_y) * RotationZ(0.5*M_PI)));
+    UnionSolid coil14(coil13, connector, Transform3D(Translation3D(0.0, 0.0, 0.5*dim_z - coil_y) * RotationZ(M_PI)));
+    UnionSolid coil15(coil14, connector, Transform3D(Translation3D(0.0, 0.0, 0.5*dim_z - coil_y) * RotationZ(1.5*M_PI)));
+
+    Volume coil_vol("coil_vol", coil14, niobium);
+
+    auto coil_pos = Transform3D(RotationZ(0.5*M_PI - offset_angle));
+    auto coil_pv = assembly.placeVolume(coil_vol, coil_pos);
+    DetElement coil_de(sdet, "coil_de", 2);
+    coil_de.setAttributes(dtor, coil_vol, x_det.regionStr(), x_det.limitsStr(), coil_vis);
+    coil_de.setPlacement(coil_pv);
+
+    // -- finishing steps
+    auto final_pos = Transform3D(Translation3D(pos_x, pos_y, pos_z) * RotationY(pos_theta));
+    auto pv = dtor.pickMotherVolume(sdet).placeVolume(assembly, final_pos);
+    pv.addPhysVolID("system", det_id);
+    sdet.setPlacement(pv);
+
+    assembly->GetShape()->ComputeBBox();
+    return sdet;
+}
+
+DECLARE_DETELEMENT(compton_CylindricalDipoleMagnet, build_magnet)
diff --git a/src/Tracker_geo.cpp b/src/Tracker_geo.cpp
new file mode 100644
index 0000000..dea1491
--- /dev/null
+++ b/src/Tracker_geo.cpp
@@ -0,0 +1,263 @@
+#include <map>
+#include "DD4hep/DetFactoryHelper.h"
+#include "DD4hep/Printout.h"
+#include "DD4hep/Shapes.h"
+#include "DDRec/Surface.h"
+#include "DDRec/DetectorData.h"
+#include "XML/Layering.h"
+#include "XML/Utilities.h"
+
+
+#include "Acts/Plugins/DD4hep/ActsExtension.hpp"
+#include "Acts/Definitions/Units.hpp"
+
+using namespace std;
+using namespace dd4hep;
+using namespace dd4hep::rec;
+using namespace dd4hep::detail;
+
+/*! Tracker.
+ *
+ * @author Whitney Armstrong
+ *
+ */
+static Ref_t create_tracker(Detector& description, xml_h e, SensitiveDetector sens)
+{
+  typedef vector<PlacedVolume> Placements;
+  xml_det_t                    x_det    = e;
+  Material                     vacuum   = description.vacuum();
+  int                          det_id   = x_det.id();
+  string                       det_name = x_det.nameStr();
+  //bool                         reflect  = false;
+  DetElement                   sdet(det_name, det_id);
+  Assembly                     assembly(det_name);
+  xml::Component pos   = x_det.position();
+  xml::Component rot   = x_det.rotation();
+
+
+  //Material  air  = description.material("Air");
+  // Volume      assembly    (det_name,Box(10000,10000,10000),vacuum);
+  Volume                  motherVol = description.pickMotherVolume(sdet);
+  int                     m_id = 0, c_id = 0, n_sensor = 0;
+  PlacedVolume            pv;
+
+  map<string, Volume>                modules;
+  map<string, Placements>            sensitives;
+  map<string, std::vector<VolPlane>> volplane_surfaces;
+  map<string, std::array<double, 2>> module_thicknesses;
+
+  Acts::ActsExtension* detWorldExt = new Acts::ActsExtension();
+  detWorldExt->addType("endcap", "detector");
+  sdet.addExtension<Acts::ActsExtension>(detWorldExt);
+
+  //assembly.setVisAttributes(description.invisible());
+  sens.setType("tracker");
+
+  for (xml_coll_t mi(x_det, _U(module)); mi; ++mi, ++m_id) {
+    xml_comp_t x_mod = mi;
+    string     m_nam = x_mod.nameStr();
+    xml_comp_t trd   = x_mod.trd();
+
+    double     posY;
+    double     x1 = trd.x1();
+    double     x2 = trd.x2();
+    double     z  = trd.z();
+    double     y1, y2, total_thickness = 0.;
+    xml_coll_t ci(x_mod, _U(module_component));
+    for (ci.reset(), total_thickness = 0.0; ci; ++ci)
+      total_thickness += xml_comp_t(ci).thickness();
+
+    y1 = y2 = total_thickness / 2;
+    Trapezoid m_solid(x1, x2, y1, y2, z);
+    Volume m_volume(m_nam, m_solid, vacuum);
+    m_volume.setVisAttributes(description.visAttributes(x_mod.visStr()));
+
+    Solid  frame_s;
+    if(x_mod.hasChild("frame")){
+      // build frame from trd (assumed to be smaller)
+      xml_comp_t m_frame         = x_mod.child(_U(frame));
+      xml_comp_t f_pos           = m_frame.child(_U(position));
+      xml_comp_t frame_trd       = m_frame.trd();
+      double     frame_thickness = getAttrOrDefault(m_frame, _U(thickness), total_thickness);
+      double     frame_x1        = frame_trd.x1();
+      double     frame_x2        = frame_trd.x2();
+      double     frame_z         = frame_trd.z();
+      // make the frame match the total thickness if thickness attribute is not given
+      Trapezoid        f_solid1(x1, x2,frame_thickness / 2.0, frame_thickness / 2.0, z);
+      Trapezoid        f_solid(frame_x1, frame_x2, frame_thickness / 2.0, frame_thickness / 2.0, frame_z) ;
+      SubtractionSolid frame_shape(f_solid1, f_solid);
+      frame_s = frame_shape;
+
+      Material f_mat  = description.material(m_frame.materialStr());
+      Volume f_vol(m_nam + "_frame", frame_shape, f_mat);
+      //f_vol.setVisAttributes(description.visAttributes(m_frame.visStr()));
+
+      // figure out how to best place
+      pv = m_volume.placeVolume(f_vol, Position(f_pos.x(), f_pos.y(),  f_pos.z()));
+    }
+
+    double thickness_so_far = 0.0;
+    double thickness_sum = -total_thickness/2.0;
+    for (ci.reset(), n_sensor = 1, c_id = 0, posY = -y1; ci; ++ci, ++c_id) {
+      xml_comp_t c           = ci;
+      double     c_thick     = c.thickness();
+      auto       comp_x1     = getAttrOrDefault(c, _Unicode(x1), x1);
+      auto       comp_x2     = getAttrOrDefault(c, _Unicode(x2), x2);
+      auto       comp_height = getAttrOrDefault(c, _Unicode(height), z);
+
+      Material c_mat  = description.material(c.materialStr());
+      string   c_name = _toString(c_id, "component%d");
+
+      Trapezoid comp_s1(comp_x1, comp_x2, c_thick / 2e0, c_thick / 2e0, comp_height);
+      Solid  comp_shape = comp_s1;
+      if(frame_s.isValid()) {
+        comp_shape = SubtractionSolid( comp_s1, frame_s); 
+      }
+      Volume   c_vol(c_name, comp_shape, c_mat);
+
+      c_vol.setVisAttributes(description.visAttributes(c.visStr()));
+      pv = m_volume.placeVolume(c_vol, Position(0, posY + c_thick / 2, 0));
+      if (c.isSensitive()) {
+        //std::cout << " adding sensitive volume" << c_name << "\n";
+        sdet.check(n_sensor > 2, "SiTrackerEndcap2::fromCompact: " + c_name + " Max of 2 modules allowed!");
+        pv.addPhysVolID("sensor", n_sensor);
+        sens.setType("tracker");
+        c_vol.setSensitiveDetector(sens);
+        sensitives[m_nam].push_back(pv);
+        ++n_sensor;
+
+        module_thicknesses[m_nam] = {thickness_so_far + c_thick/2.0, total_thickness-thickness_so_far - c_thick/2.0};
+        // -------- create a measurement plane for the tracking surface attched to the sensitive volume -----
+        Vector3D u(-1., 0., 0.);
+        Vector3D v(0., -1., 0.);
+        Vector3D n(0., 0., 1.);
+        //    Vector3D o( 0. , 0. , 0. ) ;
+
+        // compute the inner and outer thicknesses that need to be assigned to the tracking surface
+        // depending on wether the support is above or below the sensor
+        double inner_thickness = module_thicknesses[m_nam][0];
+        double outer_thickness = module_thicknesses[m_nam][1];
+
+        SurfaceType type(SurfaceType::Sensitive);
+
+        // if( isStripDetector )
+        //  type.setProperty( SurfaceType::Measurement1D , true ) ;
+
+        VolPlane surf(c_vol, type, inner_thickness, outer_thickness, u, v, n); //,o ) ;
+        volplane_surfaces[m_nam].push_back(surf);
+      }
+      posY += c_thick;
+      thickness_sum += c_thick;
+      thickness_so_far += c_thick;
+    }
+    modules[m_nam] = m_volume;
+  }
+
+  for (xml_coll_t li(x_det, _U(layer)); li; ++li) {
+    xml_comp_t x_layer(li);
+    int        l_id    = x_layer.id();
+    int        mod_num = 1;
+
+    xml_comp_t l_env      = x_layer.child(_U(envelope));
+    string     layer_name = det_name + std::string("_layer") + std::to_string(l_id);
+
+    std::string layer_vis    = l_env.attr<std::string>(_Unicode(vis));
+    //double      layer_rmin   = l_env.attr<double>(_Unicode(rmin));
+    //double      layer_rmax   = l_env.attr<double>(_Unicode(rmax));
+    double      layer_length = l_env.attr<double>(_Unicode(length));
+    double      layer_zstart = l_env.attr<double>(_Unicode(zstart));
+    double      layer_center_z =  layer_zstart + layer_length/2.0;
+    //printout(INFO,"ROOTGDMLParse","+++ Read geometry from GDML file file:%s",input.c_str());
+    //std::cout << "SiTracker Endcap layer " << l_id << " zstart = " << layer_zstart/dd4hep::mm << "mm ( " << layer_length/dd4hep::mm << " mm thick )\n";
+
+    Assembly    layer_vol(layer_name);
+    //assembly.placeVolume(layer_assembly);
+    //Tube       layer_tub(layer_rmin, layer_rmax, layer_length / 2);
+    //Volume     layer_vol(layer_name, layer_tub, air); // Create the layer envelope volume.
+    //layer_vol.setVisAttributes(description.visAttributes(layer_vis));
+    //layer_vol.setVisAttributes(description.visAttributes(x_layer.visStr()));
+
+    PlacedVolume layer_pv;
+    //if (reflect) {
+    //  layer_pv =
+    //      assembly.placeVolume(layer_vol, Transform3D(RotationZYX(0.0, -M_PI, 0.0), Position(0, 0, -layer_center_z)));
+    //  layer_pv.addPhysVolID("barrel", 3).addPhysVolID("layer", l_id);
+    //  layer_name += "_N";
+    //} else {
+    layer_pv = assembly.placeVolume(layer_vol, Position(0, 0, layer_center_z));
+    layer_pv.addPhysVolID("layer", l_id);
+    layer_name += "_P";
+    //}
+    DetElement layer_element(sdet, layer_name, l_id);
+    layer_element.setPlacement(layer_pv);
+    Acts::ActsExtension* layerExtension = new Acts::ActsExtension();
+    layerExtension->addType("layer", "layer");
+    //layerExtension->addType("axes", "definitions", "XZY");
+    //layerExtension->addType("sensitive disk", "layer");
+    //layerExtension->addType("axes", "definitions", "XZY");
+    layer_element.addExtension<Acts::ActsExtension>(layerExtension);
+
+    for (xml_coll_t ri(x_layer, _U(ring)); ri; ++ri) {
+      xml_comp_t  x_ring   = ri;
+      double      r        = x_ring.r();
+      double      phi0     = x_ring.phi0(0);
+      double      zstart   = x_ring.zstart();
+      double      dz       = x_ring.dz(0);
+      int         nmodules = x_ring.nmodules();
+      string      m_nam    = x_ring.moduleStr();
+      Volume      m_vol    = modules[m_nam];
+      double      iphi     = 2 * M_PI / nmodules;
+      double      dphi     = dd4hep::getAttrOrDefault(x_ring,_Unicode(dphi),iphi);
+      double      phi      = phi0;
+      Placements& sensVols = sensitives[m_nam];
+
+      for (int k = 0; k < nmodules; ++k) {
+        string     m_base = _toString(l_id, "layer%d") + _toString(mod_num, "_module%d");
+        double     x      = -r * std::cos(phi);
+        double     y      = -r * std::sin(phi);
+
+        //if (!reflect) {
+          DetElement module(layer_element, m_base + "_pos", det_id);
+          pv = layer_vol.placeVolume(
+              m_vol, Transform3D(RotationZYX(0, -M_PI / 2 - phi, -M_PI / 2), Position(x, y, zstart + dz)));
+          pv.addPhysVolID("layer", l_id).addPhysVolID("module", mod_num);
+          module.setPlacement(pv);
+          for (size_t ic = 0; ic < sensVols.size(); ++ic) {
+            PlacedVolume sens_pv = sensVols[ic];
+            DetElement   comp_elt(module, sens_pv.volume().name(), mod_num);
+            comp_elt.setPlacement(sens_pv);
+            //std::cout << " adding ACTS extension" << "\n";
+            Acts::ActsExtension* moduleExtension = new Acts::ActsExtension("XZY");
+            comp_elt.addExtension<Acts::ActsExtension>(moduleExtension);
+            volSurfaceList(comp_elt)->push_back(volplane_surfaces[m_nam][ic]);
+          }
+        //} else {
+        //  pv = layer_vol.placeVolume(
+        //      m_vol, Transform3D(RotationZYX(0, -M_PI / 2 - phi, -M_PI / 2), Position(x, y, -zstart - dz)));
+        //  pv.addPhysVolID("layer", l_id).addPhysVolID("module", mod_num);
+        //  DetElement r_module(layer_element, m_base + "_neg", det_id);
+        //  r_module.setPlacement(pv);
+        //  for (size_t ic = 0; ic < sensVols.size(); ++ic) {
+        //    PlacedVolume sens_pv = sensVols[ic];
+        //    DetElement   comp_elt(r_module, sens_pv.volume().name(), mod_num);
+        //    comp_elt.setPlacement(sens_pv);
+        ////std::cout << " adding ACTS extension" << "\n";
+        //    Acts::ActsExtension* moduleExtension = new Acts::ActsExtension("XZY");
+        //    comp_elt.addExtension<Acts::ActsExtension>(moduleExtension);
+        //  }
+        //}
+        dz = -dz;
+        phi += dphi;
+        ++mod_num;
+      }
+    }
+  }
+  Transform3D posAndRot(RotationZYX(rot.z(), rot.y(), rot.x()), Position(pos.x(), pos.y(), pos.z()));
+  pv = motherVol.placeVolume(assembly,posAndRot );
+  pv.addPhysVolID("system", det_id);
+  sdet.setPlacement(pv);
+  return sdet;
+}
+
+// clang-format off
+DECLARE_DETELEMENT(electron_tracker, create_tracker)
diff --git a/views/generate_prim_files.yml b/views/generate_prim_files.yml
new file mode 100644
index 0000000..3f1c758
--- /dev/null
+++ b/views/generate_prim_files.yml
@@ -0,0 +1,40 @@
+view_prim:detector_only:
+  extends: .views
+  stage: test
+  script:
+    - ./bin/generate_prim_file -o ${LOCAL_DATA_PATH} -D -t detector_view -c compton.xml
+    - ls -lrth && ls -lrth ${LOCAL_DATA_PATH}
+
+view_prim:ev001:
+  extends: .views
+  stage: test
+  rules:
+    - if: '$DETECTOR_EVENT_VIEWS == "ON"'
+  script:
+    - ./bin/generate_prim_file -o ${LOCAL_DATA_PATH} -t view_ev001 -s 1 -c compton.xml
+
+view_prim:ev002:
+  extends: .views
+  stage: test
+  rules:
+    - if: '$DETECTOR_EVENT_VIEWS == "ON"'
+  script:
+    - ./bin/generate_prim_file -o ${LOCAL_DATA_PATH} -t view_ev002 -s 2 -c compton.xml
+
+view_prim:ev003:
+  extends: .views
+  stage: test
+  rules:
+    - if: '$DETECTOR_EVENT_VIEWS == "ON"'
+  script:
+    - ./bin/generate_prim_file -o ${LOCAL_DATA_PATH} -t view_ev003 -s 3 -c compton.xml
+
+view_prim:ev004:
+  extends: .views
+  stage: test
+  rules:
+    - if: '$DETECTOR_EVENT_VIEWS == "ON"'
+  script:
+    - ./bin/generate_prim_file -o ${LOCAL_DATA_PATH} -t view_ev004 -s 4 -c compton.xml
+
+
diff --git a/views/view50.yml b/views/view50.yml
new file mode 100644
index 0000000..e68a799
--- /dev/null
+++ b/views/view50.yml
@@ -0,0 +1,41 @@
+dawn_view_50:detector:
+  extends: .views
+  needs:
+    - job: view_prim:detector_only
+      optional: false
+  script:
+    - ./bin/make_dawn_views -i ${LOCAL_DATA_PATH}/detector_view.prim -t view50 -d views/view50 -D
+
+dawn_view_50:ev001:
+  extends: .views
+  rules:
+    - if: '$DETECTOR_EVENT_VIEWS == "ON"'
+  needs:
+    - job: view_prim:ev001
+      optional: true
+  script:
+    - ./bin/make_dawn_views -i ${LOCAL_DATA_PATH}/view_ev001.prim -t view50_ev001 -d views/view50 -s 1
+
+dawn_view_50:ev002:
+  extends: .views
+  rules:
+    - if: '$DETECTOR_EVENT_VIEWS == "ON"'
+  needs:
+    - job: view_prim:ev002
+      optional: true
+  script:
+    - ./bin/make_dawn_views -i ${LOCAL_DATA_PATH}/view_ev002.prim -t view50_ev002 -d views/view50 -s 2
+
+view_50:
+  stage: collect
+  needs:
+    - job: dawn_view_50:detector
+      optional: false
+    - job: dawn_view_50:ev001
+      optional: true
+    - job: dawn_view_50:ev002
+      optional: true
+  script:
+    - ls -lrth *
+    - ls -lrth images/*
+
diff --git a/views/view50/generate_eps b/views/view50/generate_eps
new file mode 100755
index 0000000..d089567
--- /dev/null
+++ b/views/view50/generate_eps
@@ -0,0 +1,75 @@
+#!/bin/bash
+
+#export DAWN_PS_PREVIEWER="derp"
+
+function print_the_help {
+  echo "USAGE: $0 <PRIM_FILE>  "
+  echo "  OPTIONS: "
+  echo "            -t,--tag           filename tag (default: view1)"
+  exit 
+}
+
+FILE_TAG="view01"
+INPUT_FILE="../../g4_0000.prim"
+
+
+POSITIONAL=()
+while [[ $# -gt 0 ]]
+do
+  key="$1"
+
+  case $key in
+    -h|--help)
+      shift # past argument
+      print_the_help
+      ;;
+    -t|--tag)
+      FILE_TAG="$2"
+      shift # past argument
+      shift # past value
+      ;;
+    -i|--input)
+      INPUT_FILE="$2"
+      shift # past argument
+      shift # past value
+      ;;
+    *)    # unknown option
+      #POSITIONAL+=("$1") # save it in an array for later
+      echo "unknown option $1"
+      print_the_help
+      shift # past argument
+      ;;
+  esac
+done
+set -- "${POSITIONAL[@]}" # restore positional parameters
+
+
+#cp ${INPUT_FILE} ${FILE_TAG}.prim
+dawncut 0 1 0 1 ${INPUT_FILE} ${FILE_TAG}.prim 
+#dawncut 0 -1 0 1 ${FILE_TAG}_temp0.prim  ${FILE_TAG}.prim
+#dawncut -1 0 0 1 ${INPUT_FILE} ${FILE_TAG}.prim
+# dawncut 1 0 0 1 ${INPUT_FILE} ${FILE_TAG}_temp0.prim 
+# dawncut -1 0 0 1 ${FILE_TAG}_temp0.prim  ${FILE_TAG}.prim
+../../bin/dawn_tweak --mag 4 -z 15000 --draw 3 --theta 90 --phi 40 --light-theta 180 --light-phi 90
+
+dawn -d ${FILE_TAG}.prim
+ps2pdf ${FILE_TAG}.eps ${FILE_TAG}_full.pdf
+gs -o ${FILE_TAG}.pdf -sDEVICE=pdfwrite \
+  -c "[/CropBox [51 250 550 590] /PAGES pdfmark" \
+  -f ${FILE_TAG}_full.pdf
+
+pdftoppm ${FILE_TAG}.pdf ${FILE_TAG} -png -singlefile -cropbox -thinlinemode solid -aaVector yes -r 600
+
+# Top view
+#dawncut 0 -1 0 1 ${INPUT_FILE} ${FILE_TAG}.prim 
+dawncut 0 1 0 1 ${INPUT_FILE} ${FILE_TAG}_temp0.prim 
+dawncut 0 -1 0 1 ${FILE_TAG}_temp0.prim  ${FILE_TAG}.prim
+../../bin/dawn_tweak --mag 10 --draw 1 --theta 270 --phi 90
+dawn -d ${FILE_TAG}.prim 
+ps2pdf ${FILE_TAG}.eps ${FILE_TAG}_top_full.pdf
+gs -o ${FILE_TAG}_top.pdf -sDEVICE=pdfwrite \
+  -c "[/CropBox [51 250 550 590] /PAGES pdfmark" \
+  -f ${FILE_TAG}_top_full.pdf
+
+pdftoppm ${FILE_TAG}_top.pdf ${FILE_TAG}_top -png -singlefile -cropbox -thinlinemode solid -aaVector yes
+
-- 
GitLab