From ccbfa865fd1ec66867d9ea7f994547cdc3cc378c Mon Sep 17 00:00:00 2001
From: Corentin Allaire <corentin.allaire@cern.ch>
Date: Thu, 6 Feb 2020 12:50:16 +0100
Subject: [PATCH] Added conversion from athena MaterialStep to Acts
 MaterialTrack.

---
 .../MaterialStepToActsMaterialTrack.h         |  94 +++++++++++
 Tracking/Acts/ActsGeometry/CMakeLists.txt     |   1 +
 ...terialStepToActsMaterialTrack_jobOption.py |  63 ++++++++
 .../src/MaterialStepToActsMaterialTrack.cxx   | 151 ++++++++++++++++++
 .../src/components/ActsGeometry_entries.cxx   |   3 +
 5 files changed, 312 insertions(+)
 create mode 100644 Tracking/Acts/ActsGeometry/ActsGeometry/MaterialStepToActsMaterialTrack.h
 create mode 100644 Tracking/Acts/ActsGeometry/share/MaterialStepToActsMaterialTrack_jobOption.py
 create mode 100755 Tracking/Acts/ActsGeometry/src/MaterialStepToActsMaterialTrack.cxx

diff --git a/Tracking/Acts/ActsGeometry/ActsGeometry/MaterialStepToActsMaterialTrack.h b/Tracking/Acts/ActsGeometry/ActsGeometry/MaterialStepToActsMaterialTrack.h
new file mode 100644
index 000000000000..cc9fa33c4df6
--- /dev/null
+++ b/Tracking/Acts/ActsGeometry/ActsGeometry/MaterialStepToActsMaterialTrack.h
@@ -0,0 +1,94 @@
+/*
+  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+*/
+
+//////////////////////////////////////////////////////////////////
+// MaterialMapping.h, (c) ATLAS Detector software
+///////////////////////////////////////////////////////////////////
+
+#ifndef MATERIALSTEPTOACTSMATRERIALTRACK_H
+#define MATERIALSTEPTOACTSMATRERIALTRACK_H
+
+// Athena & Gaudi includes
+#include "AthenaBaseComps/AthAlgorithm.h"
+#include "GaudiKernel/ToolHandle.h"
+#include "GaudiKernel/ServiceHandle.h"
+#include "TString.h"
+#include <fstream>
+#include <iostream>
+#include <string>
+#include <map>
+#include "GeoPrimitives/GeoPrimitives.h"
+#include "StoreGate/ReadHandleKey.h"
+#include "TrkGeometry/MaterialStepCollection.h"
+
+#ifdef TRKDETDESCR_MEMUSAGE
+#include "TrkDetDescrUtils/MemoryLogger.h"
+#endif
+
+class TTree;
+class ITHistSvc;
+
+/** @class MaterialStepToActsMaterialTrack
+
+A simple algorithm that throws random points through detector and associates them with
+the given/found layer.
+
+@author Andreas.Salzburger@cern.ch
+
+*/
+
+class MaterialStepToActsMaterialTrack : public AthAlgorithm {
+
+public:
+
+  /** Standard Athena-Algorithm Constructor */
+  MaterialStepToActsMaterialTrack(const std::string& name, ISvcLocator* pSvcLocator);
+
+  /** Default Destructor */
+  ~MaterialStepToActsMaterialTrack();
+
+  /** standard Athena-Algorithm method */
+  StatusCode          initialize();
+
+  /** standard Athena-Algorithm method */
+  StatusCode          execute();
+
+  /** standard Athena-Algorithm method */
+  StatusCode          finalize();
+
+private:
+
+  TTree* m_outputTree;
+
+  float m_v_x;    ///< start global x
+  float m_v_y;    ///< start global y
+  float m_v_z;    ///< start global z
+  float m_v_px;   ///< start global momentum x
+  float m_v_py;   ///< start global momentum y
+  float m_v_pz;   ///< start global momentum z
+  float m_v_phi;  ///< start phi direction
+  float m_v_eta;  ///< start eta direction
+  float m_tX0;    ///< thickness in X0/L0
+  float m_tL0;    ///< thickness in X0/L0
+
+  std::vector<float> m_step_x;       ///< step x position
+  std::vector<float> m_step_y;       ///< step y position
+  std::vector<float> m_step_z;       ///< step z position
+  std::vector<float> m_step_length;  ///< step length
+  std::vector<float> m_step_X0;      ///< step material x0
+  std::vector<float> m_step_L0;      ///< step material l0
+  std::vector<float> m_step_A;       ///< step material A
+  std::vector<float> m_step_Z;       ///< step material Z
+  std::vector<float> m_step_rho;     ///< step material rho
+
+  /** output / input steering */
+  SG::ReadHandleKey<Trk::MaterialStepCollection>  m_inputMaterialStepCollection;
+  std::string                                m_ActsFileName;
+  std::string                                m_ActsDirName;
+  std::string                                m_ActsTreeName;
+  ITHistSvc *                                m_thistSvc;
+
+};
+
+#endif
diff --git a/Tracking/Acts/ActsGeometry/CMakeLists.txt b/Tracking/Acts/ActsGeometry/CMakeLists.txt
index 2ff9ea8d7051..2550019cab94 100755
--- a/Tracking/Acts/ActsGeometry/CMakeLists.txt
+++ b/Tracking/Acts/ActsGeometry/CMakeLists.txt
@@ -64,6 +64,7 @@ atlas_add_component( ActsGeometry
                      src/ActsTrackingGeometryTool.cxx
                      src/ActsPropStepRootWriterSvc.cxx
                      src/ActsCaloTrackingVolumeBuilder.cxx
+                     src/MaterialStepToActsMaterialTrack.cxx
                      src/components/*.cxx
                      PUBLIC_HEADERS ActsGeometry
                      INCLUDE_DIRS ${CLHEP_INCLUDE_DIRS} ${EIGEN_INCLUDE_DIRS} ${BOOST_INCLUDE_DIRS}
diff --git a/Tracking/Acts/ActsGeometry/share/MaterialStepToActsMaterialTrack_jobOption.py b/Tracking/Acts/ActsGeometry/share/MaterialStepToActsMaterialTrack_jobOption.py
new file mode 100644
index 000000000000..4502073e9c7d
--- /dev/null
+++ b/Tracking/Acts/ActsGeometry/share/MaterialStepToActsMaterialTrack_jobOption.py
@@ -0,0 +1,63 @@
+# This job options creates database files of Geantino/MaterialMapping.
+# Mofifled version of Tracking/TrkDetDescr/TrkDetDescrExample/share/MaterialMapping_jobOptions.py. (TrkDetDescrExample-01-00-04)
+# See https://twiki.cern.ch/twiki/bin/view/Atlas/UpgradeSimulationInnerTrackerMigrationRel20p3p3#Creation_of_database_files
+
+# necessity to create a new PoolFileCatalog
+import os
+if os.path.exists('./PoolFileCatalog.xml') :
+   print '[!] PoolFileCatalog exists in the run directory (may use old PFN!)'
+   print '[>] Deleting it now !'
+   os.remove('./PoolFileCatalog.xml')
+
+###############################################################
+#
+# Job options
+#
+#==============================================================
+
+#--------------------------------------------------------------
+# ATLAS default Application Configuration options
+#--------------------------------------------------------------
+
+# Use McEventSelector so we can run with AthenaMP
+import AthenaCommon.AtlasUnixStandardJob
+
+#--------------------------------------------------------------
+# Private Application Configuration options
+#--------------------------------------------------------------
+
+# Full job is a list of algorithms
+from AthenaCommon.AlgSequence import AlgSequence
+job = AlgSequence()
+
+from AthenaCommon.AppMgr import ServiceMgr as svcMgr
+from GaudiSvc.GaudiSvcConf import THistSvc
+svcMgr += THistSvc()
+svcMgr.THistSvc.Output += ["Acts DATAFILE='material-tracks.root' OPT='RECREATE'" ]
+
+
+import glob
+FileList = glob.glob("MaterialStepCollection*.root*")
+
+import AthenaPoolCnvSvc.ReadAthenaPool
+ServiceMgr.EventSelector.InputCollections = FileList
+if not hasattr(svcMgr, theApp.EventLoop):
+     svcMgr += getattr(CfgMgr, theApp.EventLoop)()
+evtloop = getattr(svcMgr, theApp.EventLoop)
+try:
+  evtloop.EventPrintoutInterval = 1000 
+except Exception, err:
+  msg.info('failed suppressing event loop heartbeat. performances might be sub-par... sorry.')
+  pass
+
+print "FileList = ", FileList
+
+# Number of events to be processed
+theApp.EvtMax = -1
+
+
+# set up the Material Mapping
+from ActsGeometry.ActsGeometryConf import MaterialStepToActsMaterialTrack
+alg = MaterialStepToActsMaterialTrack(name ='MaterialStepToActsMaterialTrack')
+
+job += alg
diff --git a/Tracking/Acts/ActsGeometry/src/MaterialStepToActsMaterialTrack.cxx b/Tracking/Acts/ActsGeometry/src/MaterialStepToActsMaterialTrack.cxx
new file mode 100755
index 000000000000..b654c4977006
--- /dev/null
+++ b/Tracking/Acts/ActsGeometry/src/MaterialStepToActsMaterialTrack.cxx
@@ -0,0 +1,151 @@
+/*
+  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+*/
+
+///////////////////////////////////////////////////////////////////
+// MaterialMapping.cxx, (c) ATLAS Detector software
+//////////////////////////////////////////////////////////////////
+
+// Gaudi Units
+#include "GaudiKernel/SystemOfUnits.h"
+#include "GaudiKernel/ITHistSvc.h"
+
+#include "ActsGeometry//MaterialStepToActsMaterialTrack.h"
+#include "TrkGeometry/MaterialStep.h"
+#include "TrkGeometry/MaterialStepCollection.h"
+#include "TrkGeometry/MaterialProperties.h"
+// TrkEvent
+#include "TrkNeutralParameters/NeutralParameters.h"
+// Amg
+#include "GeoPrimitives/GeoPrimitivesToStringConverter.h"
+
+#include "TTree.h"
+
+MaterialStepToActsMaterialTrack::MaterialStepToActsMaterialTrack(const std::string& name, ISvcLocator* pSvcLocator)
+: AthAlgorithm(name,pSvcLocator),
+  m_ActsFileName("material-tracks"),
+  m_ActsDirName("tracks"),
+  m_ActsTreeName("mat-tracks"),
+  m_inputMaterialStepCollection("MaterialStepRecords"),
+  m_thistSvc(0)
+{
+  declareProperty("ActsMaterialTrackFileName", m_ActsFileName);
+
+}
+
+MaterialStepToActsMaterialTrack::~MaterialStepToActsMaterialTrack()
+{}
+
+StatusCode MaterialStepToActsMaterialTrack::initialize()
+{
+
+    ATH_MSG_INFO("initialize()");
+
+    ATH_CHECK( m_inputMaterialStepCollection.initialize() );
+    ATH_CHECK( service("THistSvc", m_thistSvc) );
+
+    m_outputTree = new TTree( TString(m_ActsTreeName), "ACTS" );
+    std::string fullName =  "/Acts/"+m_ActsTreeName;
+    ATH_CHECK( m_thistSvc->regTree(fullName, m_outputTree) );
+
+    /** now add branches and leaves to the tree */
+    // event tree : one entry per event
+    m_outputTree->Branch("v_x", &m_v_x);
+    m_outputTree->Branch("v_y", &m_v_y);
+    m_outputTree->Branch("v_z", &m_v_z);
+    m_outputTree->Branch("v_px", &m_v_px);
+    m_outputTree->Branch("v_py", &m_v_py);
+    m_outputTree->Branch("v_pz", &m_v_pz);
+    m_outputTree->Branch("v_phi", &m_v_phi);
+    m_outputTree->Branch("v_eta", &m_v_eta);
+    m_outputTree->Branch("t_X0", &m_tX0);
+    m_outputTree->Branch("t_L0", &m_tL0);
+    m_outputTree->Branch("mat_x", &m_step_x);
+    m_outputTree->Branch("mat_y", &m_step_y);
+    m_outputTree->Branch("mat_z", &m_step_z);
+    m_outputTree->Branch("mat_step_length", &m_step_length);
+    m_outputTree->Branch("mat_X0", &m_step_X0);
+    m_outputTree->Branch("mat_L0", &m_step_L0);
+    m_outputTree->Branch("mat_A", &m_step_A);
+    m_outputTree->Branch("mat_Z", &m_step_Z);
+    m_outputTree->Branch("mat_rho", &m_step_rho);
+
+    return StatusCode::SUCCESS;
+}
+
+
+StatusCode MaterialStepToActsMaterialTrack::execute()
+{
+  ATH_MSG_VERBOSE("MaterialMapping execute() start");
+
+  SG::ReadHandle<Trk::MaterialStepCollection> materialStepCollection(m_inputMaterialStepCollection);
+
+   m_v_x = 0;
+   m_v_y = 0;
+   m_v_z = 0;
+
+   m_v_px = 0;
+   m_v_py = 0;
+   m_v_pz = 0;
+
+   m_v_phi = 0;
+   m_v_eta = 0;
+
+   m_tX0 = 0;
+   m_tL0 = 0;
+
+   m_step_x.clear();
+   m_step_y.clear();
+   m_step_z.clear();
+   m_step_length.clear();
+   m_step_X0.clear();
+   m_step_L0.clear();
+   m_step_A.clear();
+   m_step_Z.clear();
+   m_step_rho.clear();
+
+  // clearing the recorded layers per event
+  if (materialStepCollection.isValid() && materialStepCollection->size()){
+
+    // get the number of material steps
+    size_t materialSteps = materialStepCollection->size();
+    ATH_MSG_DEBUG("[+] Successfully read  "<<  materialSteps << " geantino steps");
+
+    // create a direction out of the last material step
+    m_v_px = (*materialStepCollection)[materialSteps-1]->hitX();
+    m_v_py = (*materialStepCollection)[materialSteps-1]->hitY();
+    m_v_pz = (*materialStepCollection)[materialSteps-1]->hitZ();
+
+    Amg::Vector3D direction = Amg::Vector3D(m_v_px,m_v_py,m_v_pz).unit();
+
+    m_v_px = direction.x();
+    m_v_py = direction.y();
+    m_v_pz = direction.z();
+
+    m_v_eta = direction.eta();
+    m_v_phi = direction.phi();
+
+    for ( const Trk::MaterialStep* step : *materialStepCollection ) {
+      m_step_x.push_back(step->hitX());
+      m_step_y.push_back(step->hitY());
+      m_step_z.push_back(step->hitZ());
+      m_step_length.push_back(step->steplength());
+      m_step_X0.push_back(step->x0());
+      m_step_L0.push_back(step->l0());
+      m_step_A.push_back(step->A());
+      m_step_Z.push_back(step->Z());
+      m_step_rho.push_back(step->rho());
+
+      m_tX0 +=step->steplength()/step->x0();
+      m_tL0 +=step->steplength()/step->l0();
+    }
+    m_outputTree->Fill();
+  }
+  return StatusCode::SUCCESS;
+}
+
+StatusCode MaterialStepToActsMaterialTrack::finalize()
+{
+  std::cout << "Fin" << std::endl;
+  return StatusCode::SUCCESS;
+}
diff --git a/Tracking/Acts/ActsGeometry/src/components/ActsGeometry_entries.cxx b/Tracking/Acts/ActsGeometry/src/components/ActsGeometry_entries.cxx
index 986b62a5d7ce..d58ec73b87a3 100755
--- a/Tracking/Acts/ActsGeometry/src/components/ActsGeometry_entries.cxx
+++ b/Tracking/Acts/ActsGeometry/src/components/ActsGeometry_entries.cxx
@@ -24,6 +24,7 @@
 #include "ActsGeometry/ActsMaterialStepConverterTool.h"
 // #include "ActsGeometry/ActsMaterialJsonWriterTool.h"
 
+#include "ActsGeometry/MaterialStepToActsMaterialTrack.h"
 
 DECLARE_COMPONENT( ActsExtrapolationAlg )
 DECLARE_COMPONENT( ActsWriteTrackingGeometry )
@@ -46,3 +47,5 @@ DECLARE_COMPONENT( ActsTrackingGeometryTool )
 DECLARE_COMPONENT( ActsPropStepRootWriterSvc )
 DECLARE_COMPONENT( ActsAlignmentCondAlg )
 DECLARE_COMPONENT( ActsCaloTrackingVolumeBuilder )
+
+DECLARE_COMPONENT( MaterialStepToActsMaterialTrack )
-- 
GitLab