From 9044fdc7c83a5bfe22d7b30058c71df9fec2c96a Mon Sep 17 00:00:00 2001
From: Wouter Deconinck <wouter.deconinck@umanitoba.ca>
Date: Sat, 5 Jun 2021 04:54:59 +0000
Subject: [PATCH] Feature: check overlaps with geant4

---
 .gitlab-ci.yml             | 23 +++++++++++++------
 scripts/checkOverlaps.py   | 45 ++++++++++++++++++++++++++++++++++++++
 scripts/convert_to_gdml.py |  4 ++--
 3 files changed, 63 insertions(+), 9 deletions(-)
 create mode 100755 scripts/checkOverlaps.py

diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index a9d600dd..08123f1c 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -136,14 +136,23 @@ dump_constants:
   script:
     - npdet_info dump ${DETECTOR_PATH}/athena.xml  | tee doc/constants.out 
 
-overlap_check:
+overlap_check_tgeo:
   stage: test
   needs: 
     - ["common:detector"]
   script:
-    - checkOverlaps -c ${DETECTOR_PATH}/athena.xml  | tee doc/overlap_check.out 
-    - echo "$(cat doc/overlap_check.out | grep ovlp | wc -l) overlaps..."
-    - if [[ "$(cat doc/overlap_check.out | grep ovlp | wc -l)" -gt "0" ]] ; then echo "Overlaps exist!" && false ; fi
+    - checkOverlaps -c ${DETECTOR_PATH}/athena.xml  | tee doc/overlap_check_tgeo.out 
+    - echo "$(cat doc/overlap_check_tgeo.out | grep ovlp | wc -l) overlaps..."
+    - if [[ "$(cat doc/overlap_check_tgeo.out | grep ovlp | wc -l)" -gt "0" ]] ; then echo "Overlaps exist!" && false ; fi
+
+overlap_check_geant4:
+  stage: test
+  needs: 
+    - ["common:detector"]
+  script:
+    - python scripts/checkOverlaps.py -c ${DETECTOR_PATH}/athena.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
 
 convert_to_gdml:
   stage: test
@@ -177,7 +186,7 @@ benchmarks:detector:
   trigger:
     project: EIC/benchmarks/detector_benchmarks
     strategy: depend
-  needs: ["overlap_check","report"]
+  needs: ["overlap_check_tgeo","overlap_check_geant4","report"]
   allow_failure: true
 
 
@@ -189,7 +198,7 @@ benchmarks:detector:
     #  trigger:
     #    project: EIC/benchmarks/reconstruction_benchmarks
     #    strategy: depend
-    #  needs: ["env","overlap_check","report"]
+    #  needs: ["env","overlap_check_tgeo","overlap_check_geant4","report"]
     #  
     #
     #benchmarks:physics:
@@ -200,5 +209,5 @@ benchmarks:detector:
     #  trigger:
     #    project: EIC/benchmarks/physics_benchmarks
     #    strategy: depend
-    #  needs: ["env","overlap_check","report"]
+    #  needs: ["env","overlap_check_tgeo","overlap_check_geant4","report"]
 
diff --git a/scripts/checkOverlaps.py b/scripts/checkOverlaps.py
new file mode 100755
index 00000000..e093bedb
--- /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='convert_to_gdml.py',
+     description='''Convert DD4Hep description to GDML''',
+     epilog='''
+     This program converts the compact detector file to a single GDML file.
+         ''')
+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/scripts/convert_to_gdml.py b/scripts/convert_to_gdml.py
index ce00df35..c24f73a0 100755
--- a/scripts/convert_to_gdml.py
+++ b/scripts/convert_to_gdml.py
@@ -10,8 +10,8 @@ parser = argparse.ArgumentParser(
      epilog='''
      This program converts the compact detector file to a single GDML file.
          ''')
-parser.add_argument("--compact", help="compact detector file",default="athena.xml")
-parser.add_argument("--output", help="gdml detector file",default="athena.gdml")
+parser.add_argument("-c", "--compact", help="compact detector file",default="athena.xml")
+parser.add_argument("-o", "--output", help="gdml detector file",default="athena.gdml")
 
 args = parser.parse_args()
 
-- 
GitLab