diff --git a/.build.ci.sh b/.build.ci.sh index 011fd6aec2830f401761aa721d7f205ada99e475..6e4c3265fe63ab5c6d4acf1c9d01e13c5e44658d 100644 --- a/.build.ci.sh +++ b/.build.ci.sh @@ -8,7 +8,6 @@ logfile=mylog.txt if [ "$LCG_RELEASE" = "KEY4HEP_STACK" ]; then logfile=mylog-k4.sh - source /cvmfs/sw.hsf.org/key4hep/setup.sh ./build-k4.sh >& ${logfile} & buildpid=$! else diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 395f4809ac5cacd349c54807300ffd09065033a4..a5d7c37b8a2a534afbe8f9d7fdac37fa0d1c8031 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -21,7 +21,7 @@ jobs: runs-on: self-hosted strategy: matrix: - LCG_RELEASE: [LCG_101, KEY4HEP_STACK] + LCG_RELEASE: [LCG_EXTERNAL, KEY4HEP_STACK] # CEPCSW_BLDTOOL: [make, ninja] CEPCSW_BLDTOOL: [ninja] diff --git a/Analysis/CMakeLists.txt b/Analysis/CMakeLists.txt index 7e666e5bb77e848d9218a4ee66b5018fcd871a94..58590ac4f319bc8f4bc40f2fd0f093d97927a4a4 100644 --- a/Analysis/CMakeLists.txt +++ b/Analysis/CMakeLists.txt @@ -1,3 +1,4 @@ add_subdirectory(TotalInvMass) add_subdirectory(TrackInspect) +add_subdirectory(DumpEvent) diff --git a/Analysis/DumpEvent/CMakeLists.txt b/Analysis/DumpEvent/CMakeLists.txt index 3c5f697d2e4355b72a6ee88c16e271edba076353..d432b646a874c1a640a2459ccbbec64d92f53527 100644 --- a/Analysis/DumpEvent/CMakeLists.txt +++ b/Analysis/DumpEvent/CMakeLists.txt @@ -1,5 +1,6 @@ gaudi_add_module(DumpEvent SOURCES src/DumpMCParticleAlg.cpp + src/DumpSimHitAlg.cpp #src/DumpHitAlg.cpp src/DumpTrackAlg.cpp #src/DumpCalorimeterAlg.cpp @@ -10,6 +11,7 @@ gaudi_add_module(DumpEvent ${CLHEP_LIBRARIES} ${DD4hep_COMPONENT_LIBRARIES} DetInterface + k4FWCore::k4FWCore ) install(TARGETS DumpEvent diff --git a/Analysis/DumpEvent/src/DumpMCParticleAlg.cpp b/Analysis/DumpEvent/src/DumpMCParticleAlg.cpp index 56d68151489b3515c6089b9947b7a1ab7a78301a..33c730123ab45553783e328b91197387c31b794e 100644 --- a/Analysis/DumpEvent/src/DumpMCParticleAlg.cpp +++ b/Analysis/DumpEvent/src/DumpMCParticleAlg.cpp @@ -93,11 +93,11 @@ StatusCode DumpMCParticleAlg::execute(){ m_charge[m_nParticles] = particle.getCharge(); m_time[m_nParticles] = particle.getTime(); m_mass[m_nParticles] = particle.getMass(); - const edm4hep::Vector3d& vertex = particle.getVertex(); + const auto& vertex = particle.getVertex(); m_vx[m_nParticles] = vertex.x; m_vy[m_nParticles] = vertex.y; m_vz[m_nParticles] = vertex.z; - const edm4hep::Vector3f& momentum = particle.getMomentum(); + const auto& momentum = particle.getMomentum(); m_px[m_nParticles] = momentum.x; m_py[m_nParticles] = momentum.y; m_pz[m_nParticles] = momentum.z; diff --git a/Analysis/DumpEvent/src/DumpSimHitAlg.cpp b/Analysis/DumpEvent/src/DumpSimHitAlg.cpp new file mode 100644 index 0000000000000000000000000000000000000000..9ea53b5fb0e6f0596a3215a4433f3f623001b11d --- /dev/null +++ b/Analysis/DumpEvent/src/DumpSimHitAlg.cpp @@ -0,0 +1,83 @@ +/* + * Description: + * Dump the simulated information. + * + * Author: + * Tao Lin <lintao AT ihep.ac.cn> + */ + +#include "k4FWCore/DataHandle.h" +#include "GaudiKernel/Algorithm.h" + +#include "edm4hep/MCParticleCollection.h" +#include "edm4hep/SimTrackerHitCollection.h" +#include "edm4hep/SimCalorimeterHitCollection.h" +#include "edm4hep/CaloHitContributionCollection.h" + +#include "GaudiKernel/NTuple.h" + +class DumpSimHitAlg: public Algorithm { +public: + + DumpSimHitAlg(const std::string& name, ISvcLocator* pSvcLocator); + + // Three mandatory member functions of any algorithm + StatusCode initialize() override; + StatusCode execute() override; + StatusCode finalize() override; + +private: + // - collection MCParticleG4: the simulated particles in Geant4 + DataHandle<edm4hep::MCParticleCollection> m_mcParCol{"MCParticle", + Gaudi::DataHandle::Reader, this}; + + // Dedicated collections for CEPC + DataHandle<edm4hep::SimTrackerHitCollection> m_VXDCol{"VXDCollection", + Gaudi::DataHandle::Reader, this}; + +}; + +DECLARE_COMPONENT( DumpSimHitAlg ) + +DumpSimHitAlg::DumpSimHitAlg(const std::string& name, ISvcLocator* pSvcLocator) +: Algorithm(name, pSvcLocator) { + +} + +StatusCode DumpSimHitAlg::initialize() { + return StatusCode::SUCCESS; +} + +StatusCode DumpSimHitAlg::execute() { + auto mcCol = m_mcParCol.get(); + + for (auto particle: *mcCol) { + info() << "mc particle -> " + << " (ID: " << particle.getObjectID().index << ") " + << " (simulator status: " << particle.getSimulatorStatus() << ") " + << endmsg; + } + + auto vxdCol = m_VXDCol.get(); + + for (auto hit: *vxdCol) { + auto mcparticle = hit.getMCParticle(); + + if (mcparticle.getGeneratorStatus() != 1) { + error() << "Found generator status is not 1 for hit. " << endmsg; + } + + info() << "hit -> " + << " mcparticle (" + << " ID: " << mcparticle.getObjectID().index << "; " + << " generator status: " << mcparticle.getGeneratorStatus() << "; " + << " simulator status: " << mcparticle.getSimulatorStatus() << ") " + << endmsg; + } + + return StatusCode::SUCCESS; +} + +StatusCode DumpSimHitAlg::finalize() { + return StatusCode::SUCCESS; +} diff --git a/Analysis/DumpEvent/src/DumpTrackAlg.cpp b/Analysis/DumpEvent/src/DumpTrackAlg.cpp index 6a284e256481cc50a9c59a9060f6335695e86823..9bb18af06d7199528b2ee0f318ec80e3541b67af 100644 --- a/Analysis/DumpEvent/src/DumpTrackAlg.cpp +++ b/Analysis/DumpEvent/src/DumpTrackAlg.cpp @@ -1,5 +1,15 @@ #include "DumpTrackAlg.h" +#if __has_include("edm4hep/EDM4hepVersion.h") +#include "edm4hep/EDM4hepVersion.h" +#else +// Copy the necessary parts from the header above to make whatever we need to work here +#define EDM4HEP_VERSION(major, minor, patch) ((UINT64_C(major) << 32) | (UINT64_C(minor) << 16) | (UINT64_C(patch))) +// v00-09 is the last version without the capitalization change of the track vector members +#define EDM4HEP_BUILD_VERSION EDM4HEP_VERSION(0, 9, 0) +#endif + + #include "GaudiKernel/DataObject.h" #include "GaudiKernel/IHistogramSvc.h" #include "GaudiKernel/MsgStream.h" @@ -119,6 +129,15 @@ StatusCode DumpTrackAlg::execute(){ // std::cout << track.getSubDetectorHitNumbers(ii) << " "; //} //std::cout << std::endl; +#if EDM4HEP_BUILD_VERSION > EDM4HEP_VERSION(0, 9, 0) + if(track.subdetectorHitNumbers_size()>=5){ + m_nHitsVXD[m_nTracks] = track.getSubdetectorHitNumbers(0); + m_nHitsFTD[m_nTracks] = track.getSubdetectorHitNumbers(1); + m_nHitsSIT[m_nTracks] = track.getSubdetectorHitNumbers(2); + m_nHitsGAS[m_nTracks] = track.getSubdetectorHitNumbers(3); + m_nHitsSET[m_nTracks] = track.getSubdetectorHitNumbers(4); + } +#else if(track.subDetectorHitNumbers_size()>=5){ m_nHitsVXD[m_nTracks] = track.getSubDetectorHitNumbers(0); m_nHitsFTD[m_nTracks] = track.getSubDetectorHitNumbers(1); @@ -126,6 +145,7 @@ StatusCode DumpTrackAlg::execute(){ m_nHitsGAS[m_nTracks] = track.getSubDetectorHitNumbers(3); m_nHitsSET[m_nTracks] = track.getSubDetectorHitNumbers(4); } +#endif else{ m_nHitsVXD[m_nTracks] = 0; m_nHitsSIT[m_nTracks] = 0; diff --git a/Analysis/TrackInspect/src/TrackInspectAlg.cpp b/Analysis/TrackInspect/src/TrackInspectAlg.cpp index 281df767c6590c627909fc4661ffe108b2664b02..2c41f2a98e42bbfd2ef1bd329fe557cbd7682b50 100644 --- a/Analysis/TrackInspect/src/TrackInspectAlg.cpp +++ b/Analysis/TrackInspect/src/TrackInspectAlg.cpp @@ -39,6 +39,8 @@ #include "DataHelper/HelixClass.h" +#include "podio/podioVersion.h" + #include "CLHEP/Units/SystemOfUnits.h" #include <math.h> #include <TTree.h> @@ -179,7 +181,11 @@ StatusCode TrackInspectAlg::execute(){ if (theTracks.size() == 0) { totalCandidates[m_nParticles] = 0; nCandidate[m_nParticles] = -1; +#if PODIO_BUILD_VERSION < PODIO_VERSION(0, 17, 4) Fill(particle, edm4hep::Track(nullptr)); +#else + Fill(particle, edm4hep::Track::makeEmpty()); +#endif m_nParticles++; } else { diff --git a/CMakeLists.txt b/CMakeLists.txt index 19b583c3dd5311abb45124333a2a536763535b67..8c8290cc67623cac361969d73a5ed9f365aa4f9a 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -23,7 +23,7 @@ endif() # ``-DCMAKE_CXX_STANDARD=<standard>`` when invoking CMake set(CMAKE_CXX_STANDARD 17 CACHE STRING "") -if(NOT CMAKE_CXX_STANDARD MATCHES "14|17") +if(NOT CMAKE_CXX_STANDARD MATCHES "17|20") message(FATAL_ERROR "Unsupported C++ standard: ${CMAKE_CXX_STANDARD}") endif() @@ -52,3 +52,15 @@ install(EXPORT ${PROJECT_NAME}Targets ) gaudi_install(CMAKE cmake/${PROJECT_NAME}Config.cmake) + +file(WRITE ${CMAKE_BINARY_DIR}/setup.sh.in + "#!/bin/bash\n" + "# Generated by cmake \n" + "# Following is the extra envvar:\n" + "@RUN_SCRIPT_EXTRA_COMMANDS@" +) +configure_file("${CMAKE_BINARY_DIR}/setup.sh.in" "${CMAKE_BINARY_DIR}/setup.sh" + @ONLY) + +install(FILES "${CMAKE_BINARY_DIR}/setup.sh" + DESTINATION ${CMAKE_INSTALL_PREFIX}) diff --git a/Detector/DetCEPCv4/compact/CepCBeamPipe_v01_01.xml b/Detector/DetCEPCv4/compact/CepCBeamPipe_v01_01.xml index 16cc9b5eb3d10cbb0149ae79152a3ef3a0345fed..b29393b660f1966209aecdca9f5bf9ce720fe7d6 100644 --- a/Detector/DetCEPCv4/compact/CepCBeamPipe_v01_01.xml +++ b/Detector/DetCEPCv4/compact/CepCBeamPipe_v01_01.xml @@ -10,6 +10,7 @@ <constant name="BeamPipe_Be_total_thickness" value="BeamPipe_Be_inner_thickness+BeamPipe_Cooling_thickness+BeamPipe_Be_outer_thickness"/> <constant name="BeamPipe_Al_thickness" value="BeamPipe_Be_total_thickness"/> <constant name="BeamPipe_Cu_thickness" value="2.0*mm"/> + <constant name="BeamPipe_Iron_thickness" value="2.5*mm"/> <constant name="BeamPipe_CentralBe_zmax" value="120*mm"/> <constant name="BeamPipe_CentralAl_zmax" value="205*mm"/> @@ -20,12 +21,16 @@ <constant name="BeamPipe_Crotch_zmax" value="855*mm"/> <constant name="BeamPipe_FirstSeparated_zmax" value="1110*mm"/> <constant name="BeamPipe_SecondSeparated_zmax" value="2200*mm"/> - <constant name="BeamPipe_end_z" value="12*m"/> + <constant name="BeamPipe_QD0_zmax" value="3950*mm"/> + <constant name="BeamPipe_QF1_zmin" value="4450*mm"/> + <constant name="BeamPipe_QF1_zmax" value="5910*mm"/> + <constant name="BeamPipe_end_z" value="7050*mm"/> <constant name="BeamPipe_Central_inner_radius" value="14*mm"/> <constant name="BeamPipe_Expanded_inner_radius" value="20*mm"/> <constant name="BeamPipe_Upstream_inner_radius" value="6*mm"/> <constant name="BeamPipe_Dnstream_inner_radius" value="10*mm"/> + <constant name="BeamPipe_QF1_inner_radius" value="20.5*mm"/> <constant name="BeamPipe_Crotch_hole_height" value="30.67*mm"/> <constant name="BeamPipe_VertexRegion_rmax" value="BeamPipe_Central_inner_radius+BeamPipe_Al_thickness"/> <constant name="BeamPipe_ForwardRegion_rmax" value="BeamPipe_Expanded_inner_radius+BeamPipe_Cu_thickness"/> @@ -34,53 +39,182 @@ </define> <detectors> - <detector name="BeamPipe" type="DD4hep_CRDBeamPipe_v01" vis="BeamPipeVis"> + <detector name="BeamPipe" type="CRDBeamPipe_v01" vis="BeamPipeVis"> <parameter crossingangle="CepC_Main_Crossing_Angle" /> - <envelope vis="BlueVis"> + <envelope> <shape type="Assembly"/> </envelope> <section type ="Center" name="IPInnerTube" zStart="0" zEnd="BeamPipe_CentralBe_zmax" rStart="0"> - <layer material="beam" thickness="BeamPipe_Central_inner_radius"/> - <layer material="G4_Be" thickness="BeamPipe_Be_inner_thickness"/> + <layer material="beam" thickness="BeamPipe_Central_inner_radius" vis="VacVis"/> + <layer material="G4_Be" thickness="BeamPipe_Be_inner_thickness" vis="BeamPipeVis"/> <layer material="G4_PARAFFIN" thickness="BeamPipe_Cooling_thickness"/> - <layer material="G4_Be" thickness="BeamPipe_Be_outer_thickness"/> + <layer material="G4_Be" thickness="BeamPipe_Be_outer_thickness" vis="BeamPipeVis"/> </section> <section type="Center" name="IPAl" zStart="BeamPipe_CentralBe_zmax" zEnd="BeamPipe_CentralAl_zmax" rStart="0"> - <layer material="beam" thickness="BeamPipe_Central_inner_radius"/> - <layer material="G4_Al" thickness="BeamPipe_Al_thickness"/> + <layer material="beam" thickness="BeamPipe_Central_inner_radius" vis="VacVis"/> + <layer material="G4_Al" thickness="BeamPipe_Al_thickness" vis="BeamPipeVis"/> </section> <section type="Center" name="ExpandPipe" zStart="BeamPipe_CentralAl_zmax" zEnd="BeamPipe_ConeAl_zmax" rStart="0"> - <layer material="beam" thickness="BeamPipe_Central_inner_radius" thicknessEnd="BeamPipe_Expanded_inner_radius"/> - <layer material="G4_Al" thickness="BeamPipe_Al_thickness" thicknessEnd="BeamPipe_Al_thickness"/> + <layer material="beam" thickness="BeamPipe_Central_inner_radius" thicknessEnd="BeamPipe_Expanded_inner_radius" vis="VacVis"/> + <layer material="G4_Al" thickness="BeamPipe_Al_thickness" thicknessEnd="BeamPipe_Al_thickness" vis="BeamPipeVis"/> </section> <section type="Center" name="ThickPipe" zStart="BeamPipe_ConeAl_zmax" zEnd="BeamPipe_LinkerAl_zmax" rStart="0"> - <layer material="beam" thickness="BeamPipe_Expanded_inner_radius"/> - <layer material="G4_Al" thickness="BeamPipe_Al_thickness"/> + <layer material="beam" thickness="BeamPipe_Expanded_inner_radius" vis="VacVis"/> + <layer material="G4_Al" thickness="BeamPipe_Al_thickness" vis="BeamPipeVis"/> </section> <section type="CenterSide" name="OutsideLink" zStart="BeamPipe_LinkerAl_zmax" zEnd="BeamPipe_LinkerCu_zmax" rStart="0"> - <layer material="beam" thickness="BeamPipe_Expanded_inner_radius"/> - <layer material="G4_Cu" thickness="BeamPipe_Cu_thickness"/> + <layer material="beam" thickness="BeamPipe_Expanded_inner_radius" vis="VacVis"/> + <layer material="G4_Cu" thickness="BeamPipe_Cu_thickness" vis="BeamPipeVis"/> </section> <section type="FatWaist" name="Waist" zStart="BeamPipe_LinkerCu_zmax" zEnd="BeamPipe_Waist_zmax" rStart="BeamPipe_Expanded_inner_radius" size="BeamPipe_Crotch_hole_height"> - <layer material="G4_Cu" thickness="BeamPipe_Cu_thickness"/> + <layer material="G4_Cu" thickness="BeamPipe_Cu_thickness" vis="BeamPipeVis"/> </section> - <!--CrotchAsymUp&CrotchAsymDn not work to fix, because of problem on convert from TGeo to Geant4--> - <!--section type="CrotchAsymUp" name="Fork" zStart="BeamPipe_Waist_zmax" zEnd="BeamPipe_Crotch_zmax" + <section type="CrotchAsymUp" name="Fork" zStart="BeamPipe_Waist_zmax" zEnd="BeamPipe_Crotch_zmax" rStart="BeamPipe_Expanded_inner_radius" rEnd="BeamPipe_Upstream_inner_radius" size="BeamPipe_Crotch_hole_height"> - <layer material="G4_Cu" thickness="BeamPipe_Cu_thickness" thicknessEnd="ForkAsymThickness"/> + <layer material="G4_Cu" thickness="BeamPipe_Cu_thickness" thicknessEnd="ForkAsymThickness" vis="BeamPipeVis"/> </section> <section type="CrotchAsymDn" name="Fork" zStart="BeamPipe_Waist_zmax" zEnd="BeamPipe_Crotch_zmax" rStart="BeamPipe_Expanded_inner_radius" rEnd="BeamPipe_Dnstream_inner_radius" size="BeamPipe_Crotch_hole_height"> - <layer material="G4_Cu" thickness="BeamPipe_Cu_thickness"/> - </section--> + <layer material="G4_Cu" thickness="BeamPipe_Cu_thickness" vis="BeamPipeVis"/> + </section> <section type="FlareLegUp" name="FirstDoublePipe" zStart="BeamPipe_Crotch_zmax" zEnd="BeamPipe_FirstSeparated_zmax" rStart="0"> - <layer material="beam" thickness="BeamPipe_Upstream_inner_radius" thicknessEnd="BeamPipe_Dnstream_inner_radius"/> - <layer material="G4_Cu" thickness="ForkAsymThickness" thicknessEnd="BeamPipe_Cu_thickness"/> + <layer material="beam" thickness="BeamPipe_Upstream_inner_radius" thicknessEnd="BeamPipe_Dnstream_inner_radius" vis="VacVis"/> + <layer material="G4_Cu" thickness="ForkAsymThickness" thicknessEnd="BeamPipe_Cu_thickness" vis="BeamPipeVis"/> </section> <section type="FlareLegDn" name="FirstDoublePipe" zStart="BeamPipe_Crotch_zmax" zEnd="BeamPipe_FirstSeparated_zmax" rStart="0"> - <layer material="beam" thickness="BeamPipe_Dnstream_inner_radius"/> - <layer material="G4_Cu" thickness="BeamPipe_Cu_thickness"/> + <layer material="beam" thickness="BeamPipe_Dnstream_inner_radius" vis="VacVis"/> + <layer material="G4_Cu" thickness="BeamPipe_Cu_thickness" vis="BeamPipeVis"/> + </section> + <section type="Legs" name="QD0Link" zStart="BeamPipe_FirstSeparated_zmax" zEnd="BeamPipe_SecondSeparated_zmax" rStart="0"> + <layer material="beam" thickness="BeamPipe_Dnstream_inner_radius" vis="VacVis"/> + <layer material="stainless_steel" thickness="BeamPipe_Iron_thickness" vis="BeamPipeVis"/> + </section> + <section type="Legs" name="QD0" zStart="BeamPipe_SecondSeparated_zmax" zEnd="BeamPipe_QD0_zmax" rStart="0"> + <layer material="beam" thickness="BeamPipe_Dnstream_inner_radius" vis="VacVis"/> + <layer material="stainless_steel" thickness="BeamPipe_Iron_thickness" vis="BeamPipeVis"/> + <layer material="G4_Cu" thickness="3.5*mm" vis="BeamPipeVis"/> + <layer material="superconductor" thickness="6.0*mm" vis="BeamPipeVis"/> + <layer material="stainless_steel" thickness="8.0*mm" vis="BeamPipeVis"/> + </section> + <section type="Legs" name="QF1Link" zStart="BeamPipe_QD0_zmax" zEnd="BeamPipe_QF1_zmin" rStart="0"> + <layer material="beam" thickness="BeamPipe_Dnstream_inner_radius" thicknessEnd="BeamPipe_QF1_inner_radius" vis="VacVis"/> + <layer material="stainless_steel" thickness="BeamPipe_Iron_thickness" vis="BeamPipeVis"/> + </section> + <section type="Legs" name="QF1" zStart="BeamPipe_QF1_zmin" zEnd="BeamPipe_QF1_zmax" rStart="0"> + <layer material="beam" thickness="BeamPipe_QF1_inner_radius" vis="VacVis"/> + <layer material="stainless_steel" thickness="BeamPipe_Iron_thickness" vis="BeamPipeVis"/> + <layer material="G4_Cu" thickness="3.0*mm" vis="BeamPipeVis"/> + <layer material="superconductor" thickness="6.0*mm" vis="BeamPipeVis"/> + <layer material="stainless_steel" thickness="8.0*mm" vis="BeamPipeVis"/> + </section> + <section type="Legs" name="Farest" zStart="BeamPipe_QF1_zmax" zEnd="BeamPipe_end_z" rStart="0"> + <layer material="beam" thickness="BeamPipe_QF1_inner_radius" vis="VacVis"/> + <layer material="stainless_steel" thickness="BeamPipe_Iron_thickness" vis="BeamPipeVis"/> + </section> + + <!-- Magnets and their cooling, support --> + <section type="CenterSide" name="Magnet_1" zStart="1160*mm" zEnd="1900*mm" rStart="90*mm"> + <layer material="superconductor" thickness="20*mm" vis="BeamPipeVis"/> + </section> + <section type="CenterSide" name="Magnet_2" zStart="1930*mm" zEnd="3964*mm" rStart="120*mm"> + <layer material="superconductor" thickness="10*mm" vis="BeamPipeVis"/> + </section> + <section type="CenterSide" name="Magnet_3" zStart="3970*mm" zEnd="7000*mm" rStart="185*mm"> + <layer material="superconductor" thickness="10*mm" vis="BeamPipeVis"/> + </section> + <section type="CenterSide" name="MagnetShell_1" zStart="970*mm" zEnd="1110*mm" rStart="31*mm"> + <layer material="stainless_steel" thickness="1.5*mm" vis="BeamPipeVis"/> + </section> + <section type="CenterSide" name="MagnetShell_2" zStart="1110*mm" zEnd="1115*mm" rStart="50.0*mm"> + <layer material="stainless_steel" thickness="91.25*mm" vis="BeamPipeVis"/> + </section> + <section type="CenterSide" name="MagnetShell_3" zStart="1115*mm" zEnd="1900*mm" rStart="130.75*mm" rEnd="175*mm"> + <layer material="stainless_steel" thickness="10.5*mm" thicknessEnd="65*mm" vis="BeamPipeVis"/> + </section> + <section type="CenterSide" name="MagnetShell_4" zStart="1900*mm" zEnd="3800*mm" rStart="175*mm"> + <layer material="stainless_steel" thickness="65*mm" vis="BeamPipeVis"/> + </section> + <section type="CenterSide" name="MagnetShell_5" zStart="3800*mm" zEnd="3910*mm" rStart="175*mm"> + <layer material="stainless_steel" thickness="135*mm" vis="BeamPipeVis"/> + </section> + <section type="CenterSide" name="MagnetShell_6" zStart="3910*mm" zEnd="7160*mm" rStart="240*mm"> + <layer material="stainless_steel" thickness="70*mm" vis="BeamPipeVis"/> + </section> + <section type="CenterSide" name="MagnetSupport_1" zStart="1130*mm" zEnd="1135*mm" rStart="75*mm"> + <layer material="stainless_steel" thickness="50*mm" vis="BeamPipeVis"/> + </section> + <section type="CenterSide" name="MagnetSupport_2i" zStart="1135*mm" zEnd="1925*mm" rStart="75*mm"> + <layer material="stainless_steel" thickness="5*mm" vis="BeamPipeVis"/> + </section> + <section type="CenterSide" name="MagnetSupport_2o" zStart="1135*mm" zEnd="1900*mm" rStart="120*mm"> + <layer material="stainless_steel" thickness="5*mm" vis="BeamPipeVis"/> + </section> + <section type="CenterSide" name="MagnetSupport_3l" zStart="1900*mm" zEnd="1905*mm" rStart="120*mm"> + <layer material="stainless_steel" thickness="25*mm" vis="BeamPipeVis"/> + </section> + <section type="CenterSide" name="MagnetSupport_3r" zStart="1925*mm" zEnd="1930*mm" rStart="75*mm"> + <layer material="stainless_steel" thickness="35*mm" vis="BeamPipeVis"/> + </section> + <section type="CenterSide" name="MagnetSupport_4i" zStart="1930*mm" zEnd="4000*mm" rStart="105*mm"> + <layer material="stainless_steel" thickness="5*mm" vis="BeamPipeVis"/> + </section> + <section type="CenterSide" name="MagnetSupport_4o" zStart="1905*mm" zEnd="3940*mm" rStart="140*mm"> + <layer material="stainless_steel" thickness="5*mm" vis="BeamPipeVis"/> + </section> + <section type="CenterSide" name="MagnetSupport_5l" zStart="3940*mm" zEnd="3945*mm" rStart="140*mm"> + <layer material="stainless_steel" thickness="70*mm" vis="BeamPipeVis"/> + </section> + <section type="CenterSide" name="MagnetSupport_5r" zStart="4000*mm" zEnd="4005*mm" rStart="105*mm"> + <layer material="stainless_steel" thickness="70*mm" vis="BeamPipeVis"/> + </section> + <section type="CenterSide" name="MagnetSupport_6i" zStart="4005*mm" zEnd="7050*mm" rStart="170*mm"> + <layer material="stainless_steel" thickness="5*mm" vis="BeamPipeVis"/> + </section> + <section type="CenterSide" name="MagnetSupport_6o" zStart="3945*mm" zEnd="7050*mm" rStart="205*mm"> + <layer material="stainless_steel" thickness="5*mm" vis="BeamPipeVis"/> + </section> + <section type="CenterSide" name="MagnetSupport_7" zStart="7050*mm" zEnd="7055*mm" rStart="170*mm"> + <layer material="stainless_steel" thickness="40*mm" vis="BeamPipeVis"/> + </section> + <section type="CenterSide" name="MagnetCooling_1l" zStart="1135*mm" zEnd="1160*mm" rStart="80*mm"> + <layer material="lN2" thickness="40*mm" vis="BeamPipeVis"/> + </section> + <section type="CenterSide" name="MagnetCooling_1i" zStart="1160*mm" zEnd="1900*mm" rStart="80*mm"> + <layer material="lN2" thickness="10*mm" vis="BeamPipeVis"/> + </section> + <section type="CenterSide" name="MagnetCooling_1o" zStart="1160*mm" zEnd="1900*mm" rStart="110*mm"> + <layer material="lN2" thickness="10*mm" vis="BeamPipeVis"/> + </section> + <section type="CenterSide" name="MagnetCooling_1r" zStart="1900*mm" zEnd="1925*mm" rStart="80*mm"> + <layer material="lN2" thickness="40*mm" vis="BeamPipeVis"/> + </section> + <section type="CenterSide" name="MagnetCooling_2l" zStart="1905*mm" zEnd="1930*mm" rStart="120*mm"> + <layer material="lN2" thickness="20*mm" vis="BeamPipeVis"/> + </section> + <section type="CenterSide" name="MagnetCooling_2i" zStart="1925*mm" zEnd="3964*mm" rStart="110*mm"> + <layer material="lN2" thickness="10*mm" vis="BeamPipeVis"/> + </section> + <section type="CenterSide" name="MagnetCooling_2o" zStart="1930*mm" zEnd="3945*mm" rStart="130*mm"> + <layer material="lN2" thickness="10*mm" vis="BeamPipeVis"/> + </section> + <section type="CenterSide" name="MagnetCooling_2r1" zStart="3964*mm" zEnd="4000*mm" rStart="110*mm"> + <layer material="lN2" thickness="65*mm" vis="BeamPipeVis"/> + </section> + <section type="CenterSide" name="MagnetCooling_2r2" zStart="3945*mm" zEnd="3964*mm" rStart="130*mm"> + <layer material="lN2" thickness="45*mm" vis="BeamPipeVis"/> + </section> + <section type="CenterSide" name="MagnetCooling_3l" zStart="3945*mm" zEnd="3970*mm" rStart="175*mm"> + <layer material="lN2" thickness="30*mm" vis="BeamPipeVis"/> + </section> + <section type="CenterSide" name="MagnetCooling_3i" zStart="3970*mm" zEnd="7000*mm" rStart="175*mm"> + <layer material="lN2" thickness="10*mm" vis="BeamPipeVis"/> + </section> + <section type="CenterSide" name="MagnetCooling_3o" zStart="3970*mm" zEnd="7000*mm" rStart="195*mm"> + <layer material="lN2" thickness="10*mm" vis="BeamPipeVis"/> + </section> + <section type="CenterSide" name="MagnetCooling_3r" zStart="7000*mm" zEnd="7050*mm" rStart="175*mm"> + <layer material="lN2" thickness="30*mm" vis="BeamPipeVis"/> </section> </detector> </detectors> diff --git a/Detector/DetCEPCv4/compact/SEcal05_siw_ECRing_02.xml b/Detector/DetCEPCv4/compact/SEcal05_siw_ECRing_02.xml index 7ddaac0420405195b2cd851f17c7d9b0a4d6b740..9b74840eaf166d14574be4cf718325d5b52cb77c 100644 --- a/Detector/DetCEPCv4/compact/SEcal05_siw_ECRing_02.xml +++ b/Detector/DetCEPCv4/compact/SEcal05_siw_ECRing_02.xml @@ -9,7 +9,7 @@ <shape type="BooleanShape" operation="Subtraction" material="Air"> <shape type="Box" dx="Ecal_endcap_center_box_size/2.0" dy="Ecal_endcap_center_box_size/2.0" dz="EcalEndcapRing_max_z"/> - <shape type="Tube" rmin="0" rmax="EcalEndcapRing_inner_radius - env_safety" dz="2.0*EcalEndcapRing_max_z + env_safety"/> + <shape type="Tube" rmin="0" rmax="EcalEndcapRing_inner_radius" dz="2.0*EcalEndcapRing_max_z + env_safety"/> <position x="0.5*(EcalEndcapRing_min_z + EcalEndcapRing_max_z)*tan(Ecal_ECRing_Crossing_Angle/2)" y="0" z="0"/> <!-- position x="0" y="0" z="0"/ --> diff --git a/Detector/DetCEPCv4/compact/ftd_cepc_02.xml b/Detector/DetCEPCv4/compact/ftd_cepc_02.xml index 66e75c1dbbd95cc5155904feb069016bac32471d..498b2f214c3b86e033dc75850afbd8d1e3614fb4 100644 --- a/Detector/DetCEPCv4/compact/ftd_cepc_02.xml +++ b/Detector/DetCEPCv4/compact/ftd_cepc_02.xml @@ -9,7 +9,8 @@ <detector name="FTD" type="FTD_cepc" vis="FTDVis" id="ILDDetID_FTD" limits="Tracker_limits" readout="FTDCollection" insideTrackingVolume="true"> <envelope vis="ILD_FTDVis"> - <shape type="BooleanShape" operation="Subtraction" material="Air" > + <shape type="Assembly"/> + <!--shape type="BooleanShape" operation="Subtraction" material="Air" > <shape type="BooleanShape" operation="Subtraction" material="Air" > <shape type="BooleanShape" operation="Subtraction" material="Air" > <shape type="BooleanShape" operation="Subtraction" material="Air" > @@ -29,7 +30,7 @@ z="(FTD_half_length-BeamPipe_CentralAl_zmax)/2. + env_safety "/> <position x="0" y="0" z="-BeamPipe_CentralAl_zmax-(FTD_half_length-BeamPipe_CentralAl_zmax)/2."/> <rotation x="0" y="180.*deg" z="0" /> - </shape> + </shape--> </envelope> <type_flags type="DetType_TRACKER + DetType_ENDCAP + DetType_PIXEL + DetType_STRIP "/> diff --git a/Detector/DetCEPCv4/compact/materials.xml b/Detector/DetCEPCv4/compact/materials.xml index 5e0ba2345541a067e10e04f76df2babf39331c6b..aa77249fab9f39cb728716ae16d88858679def02 100644 --- a/Detector/DetCEPCv4/compact/materials.xml +++ b/Detector/DetCEPCv4/compact/materials.xml @@ -548,5 +548,20 @@ <fraction n="0.194" ref="Cu" /> </material> + <material name="G4_PARAFFIN"> + <D type="density" value="0.93" unit="g/cm3" /> + <fraction n="0.148605" ref="H" /> + <fraction n="0.851395" ref="C" /> + </material> + + <material name="superconductor"> + <D type="density" value="6.78" unit="g/cm3" /> + <fraction n="0.56" ref="Ni" /> + <fraction n="0.44" ref="Ti" /> + </material> + <material name="lN2"> + <D type="density" value="0.807" unit="g/cm3" /> + <fraction n="1" ref="N" /> + </material> </materials> diff --git a/Detector/DetCEPCv4/compact/top_defs.xml b/Detector/DetCEPCv4/compact/top_defs.xml index 021f80a852b9e20e8cd3fa1aad6b8a04f1882f2c..cfe69006fac01d14ae44a3d3a91277957783c18f 100644 --- a/Detector/DetCEPCv4/compact/top_defs.xml +++ b/Detector/DetCEPCv4/compact/top_defs.xml @@ -14,7 +14,7 @@ <constant name="Field_outer_thickness" value="2550*mm"/> <!-- VXD --> - <constant name="top_VXD_inner_radius" value="15*mm "/> + <constant name="top_VXD_inner_radius" value="15.5*mm "/> <constant name="top_VXD_outer_radius" value="101*mm "/> <constant name="top_VXD_half_length" value="200*mm "/> diff --git a/Detector/DetCEPCv4/compact/vxd07_01.xml b/Detector/DetCEPCv4/compact/vxd07_01.xml index 77374a30526776c53a80bc8a3888c64388237228..e13de6c885b9262b54214308a8ce492ed46e38ce 100644 --- a/Detector/DetCEPCv4/compact/vxd07_01.xml +++ b/Detector/DetCEPCv4/compact/vxd07_01.xml @@ -61,7 +61,7 @@ external_metal_thickness="0.009*mm" /> <!-- SQL command: "SELECT * FROM cryostat;" --> <cryostat id="1" alu_skin_inner_radious="100*mm" alu_skin_tickness="0.5*mm" foam_inner_radious="90*mm" foam_tickness="10*mm" foam_half_z="166.6*mm" - endplate_inner_radious="VXD_inner_radius_1+5.6*mm" + endplate_inner_radious="VXD_inner_radius_1" cryostat_option="1" cryostat_apperture="30*mm" cryostat_apperture_radius="1.5*mm" /> <!-- SQL command: "select * from support_shell;" --> <support_shell id="0" inner_radious="65*mm" half_z="145*mm" thickess="0.49392*mm" endplate_inner_radious="30*mm" endplate_inner_radius_L1="15.7*mm" endplate_outer_radius_L1="20*mm" diff --git a/Detector/DetCEPCv4/src/calorimeter/SHcalSc04_Barrel_v04.cpp b/Detector/DetCEPCv4/src/calorimeter/SHcalSc04_Barrel_v04.cpp index 334af303d765b12f008d7eccad8a8f4c02e036ee..d72739195fd9e32cd13594aa5f7d94581977331e 100644 --- a/Detector/DetCEPCv4/src/calorimeter/SHcalSc04_Barrel_v04.cpp +++ b/Detector/DetCEPCv4/src/calorimeter/SHcalSc04_Barrel_v04.cpp @@ -46,11 +46,11 @@ using dd4hep::rec::LayeredCalorimeterData; // After reading in all the necessary parameters. // To check the radius range and the space for placing the total layers -static bool validateEnvelope(double rInner, double rOuter, double radiatorThickness, double layerThickness, int layerNumber){ +static bool validateEnvelope(double rInner, double rOuter, double radiatorThickness, double layerThickness, int layerNumber, int nsymmetry){ bool Error = false; bool Warning = false; - double spaceAllowed = rOuter*cos(M_PI/16.) - rInner; + double spaceAllowed = rOuter*cos(M_PI/nsymmetry) - rInner; double spaceNeeded = (radiatorThickness + layerThickness)* layerNumber; double spaceToleranted = (radiatorThickness + layerThickness)* (layerNumber+1); double rOuterRecommaned = ( rInner + spaceNeeded )/cos(M_PI/16.); @@ -59,17 +59,17 @@ static bool validateEnvelope(double rInner, double rOuter, double radiatorThickn if( spaceNeeded > spaceAllowed ) { - printout( dd4hep::ERROR, "SHcalSc04_Barrel_v01", " Layer number is more than it can be built! " ) ; + printout( dd4hep::ERROR, "SHcalSc04_Barrel_v04", " Layer number is more than it can be built! " ) ; Error = true; } else if ( spaceToleranted < spaceAllowed ) { - printout( dd4hep::WARNING, "SHcalSc04_Barrel_v01", " Layer number is less than it is able to build!" ) ; + printout( dd4hep::WARNING, "SHcalSc04_Barrel_v04", " Layer number is less than it is able to build!" ) ; Warning = true; } else { - printout( dd4hep::DEBUG, "SHcalSc04_Barrel_v01"," has been validated and start to build it." ) ; + printout( dd4hep::DEBUG, "SHcalSc04_Barrel_v04"," has been validated and start to build it." ) ; Error = false; Warning = false; } @@ -179,13 +179,8 @@ static Ref_t create_detector(Detector& theDetector, xml_h element, SensitiveDete int Hcal_nlayers = theDetector.constant<int>("Hcal_nlayers"); - double TPC_outer_radius = theDetector.constant<double>("TPC_outer_radius"); - - double Ecal_outer_radius = theDetector.constant<double>("Ecal_outer_radius"); - - printout( dd4hep::DEBUG, "SHcalSc04_Barrel_v04", "TPC_outer_radius : %e - Ecal_outer_radius: %e ", TPC_outer_radius , Ecal_outer_radius) ; - - validateEnvelope(Hcal_inner_radius, Hcal_outer_radius, Hcal_radiator_thickness, Hcal_chamber_thickness, Hcal_nlayers); + printout( dd4hep::INFO, "SHcalSc04_Barrel_v04", "Hcal_inner_radius : %e - Hcal_outer_radius %e ", Hcal_inner_radius , Hcal_outer_radius); + validateEnvelope(Hcal_inner_radius, Hcal_outer_radius, Hcal_radiator_thickness, Hcal_chamber_thickness, Hcal_nlayers, Hcal_inner_symmetry); Readout readout = sens.readout(); dd4hep::Segmentation seg = readout.segmentation(); diff --git a/Detector/DetCEPCv4/src/tracker/FTD_Simple_Staggered_geo.cpp b/Detector/DetCEPCv4/src/tracker/FTD_Simple_Staggered_geo.cpp index 52049c85e44281d4b77e0cd64c6c88f8980ff6db..648cc222a61c1d0a22468ce4308f90773f24a04e 100644 --- a/Detector/DetCEPCv4/src/tracker/FTD_Simple_Staggered_geo.cpp +++ b/Detector/DetCEPCv4/src/tracker/FTD_Simple_Staggered_geo.cpp @@ -1274,7 +1274,9 @@ static Ref_t create_element(Detector& theDetector, xml_h e, SensitiveDetector se ftd.addExtension< ZDiskPetalsData >( zDiskPetalsData ) ; //-------------------------------------- - + if ( x_det.hasAttr(_U(combineHits)) ) { + ftd.setCombineHits(x_det.attr<bool>(_U(combineHits)),sens); + } return ftd; } diff --git a/Detector/DetCEPCv4/src/tracker/FTD_cepc_geo.cpp b/Detector/DetCEPCv4/src/tracker/FTD_cepc_geo.cpp index 0b5aef7dbae2a1798e7805b4e3321c984fa763f3..053371aacf430406f2412e579648971f1d610d50 100644 --- a/Detector/DetCEPCv4/src/tracker/FTD_cepc_geo.cpp +++ b/Detector/DetCEPCv4/src/tracker/FTD_cepc_geo.cpp @@ -563,6 +563,9 @@ static Ref_t create_element(Detector& theDetector, xml_h e, SensitiveDetector se { _dbParDisk.ZStartOuterCylinder = _z_position; } + + _dbParDisk.ZStopOuterCylinder = _zEnd; + _dbParDisk.ZStopInnerCylinder = _zEnd; break; case 7: @@ -1273,7 +1276,9 @@ static Ref_t create_element(Detector& theDetector, xml_h e, SensitiveDetector se ftd.addExtension< ZDiskPetalsData >( zDiskPetalsData ) ; //-------------------------------------- - + if ( x_det.hasAttr(_U(combineHits)) ) { + ftd.setCombineHits(x_det.attr<bool>(_U(combineHits)),sens); + } return ftd; } diff --git a/Detector/DetCEPCv4/src/tracker/SET_Simple_Planar_geo.cpp b/Detector/DetCEPCv4/src/tracker/SET_Simple_Planar_geo.cpp index 91e906c81c82af1ec6e9c5c785562599c046b68f..e311fcc923d3470be157a1caf69716dbda8a05b0 100644 --- a/Detector/DetCEPCv4/src/tracker/SET_Simple_Planar_geo.cpp +++ b/Detector/DetCEPCv4/src/tracker/SET_Simple_Planar_geo.cpp @@ -456,6 +456,10 @@ static dd4hep::Ref_t create_element(dd4hep::Detector& theDetector, xml_h e, dd4h set.setVisAttributes( theDetector, x_det.visStr(), envelope ); + + if ( x_det.hasAttr(_U(combineHits)) ) { + set.setCombineHits(x_det.attr<bool>(_U(combineHits)),sens); + } return set; } diff --git a/Detector/DetCEPCv4/src/tracker/SIT_Simple_Planar_geo.cpp b/Detector/DetCEPCv4/src/tracker/SIT_Simple_Planar_geo.cpp index e6a93e80c637876fdfc867725787d9c034973c7a..f76791463b748f9ddc7eeb4db177f8564569af0f 100644 --- a/Detector/DetCEPCv4/src/tracker/SIT_Simple_Planar_geo.cpp +++ b/Detector/DetCEPCv4/src/tracker/SIT_Simple_Planar_geo.cpp @@ -473,6 +473,10 @@ static dd4hep::Ref_t create_element(dd4hep::Detector& theDetector, xml_h e, dd4h //-------------------------------------- sit.setVisAttributes( theDetector, x_det.visStr(), envelope ); + + if ( x_det.hasAttr(_U(combineHits)) ) { + sit.setCombineHits(x_det.attr<bool>(_U(combineHits)),sens); + } return sit; } diff --git a/Detector/DetCEPCv4/src/tracker/VXD04_geo.cpp b/Detector/DetCEPCv4/src/tracker/VXD04_geo.cpp index 1ed9e3a7c6ce0fc7ad2561e4e6178311fa4f365a..ae2d4d83c77c14e4552d00c9e0f03bb03c8826f5 100644 --- a/Detector/DetCEPCv4/src/tracker/VXD04_geo.cpp +++ b/Detector/DetCEPCv4/src/tracker/VXD04_geo.cpp @@ -1582,10 +1582,12 @@ static Ref_t create_element(Detector& theDetector, xml_h e, SensitiveDetector se //-------------------------------------- - - vxd.setVisAttributes( theDetector, x_det.visStr(), envelope ); + if ( x_det.hasAttr(_U(combineHits)) ) { + vxd.setCombineHits(x_det.attr<bool>(_U(combineHits)),sens); + } + return vxd; } DECLARE_DETELEMENT(VXD04,create_element) diff --git a/Detector/DetCRD/compact/CRD_common_v01/Beampipe_v01_01.xml b/Detector/DetCRD/compact/CRD_common_v01/Beampipe_v01_01.xml index 1ef2c4b96676946979cddee80bb62df06356e012..1d57df45b51dfe153cdb02dc2e3f9ec4753392b9 100644 --- a/Detector/DetCRD/compact/CRD_common_v01/Beampipe_v01_01.xml +++ b/Detector/DetCRD/compact/CRD_common_v01/Beampipe_v01_01.xml @@ -10,6 +10,11 @@ <define> <constant name="ForkAsymThickness" value="BeamPipe_Dnstream_inner_radius+BeamPipe_Cu_thickness-BeamPipe_Upstream_inner_radius"/> + <constant name="BeamPipe_QD0_zmax" value="3950*mm"/> + <constant name="BeamPipe_QF1_zmin" value="4450*mm"/> + <constant name="BeamPipe_QF1_zmax" value="5910*mm"/> + <constant name="BeamPipe_QF1_inner_radius" value="20.5*mm"/> + <constant name="BeamPipe_Iron_thickness" value="2.5*mm"/> </define> <detectors> @@ -44,8 +49,6 @@ <section type="FatWaist" name="Waist" zStart="BeamPipe_LinkerCu_zmax" zEnd="BeamPipe_Waist_zmax" rStart="BeamPipe_Expanded_inner_radius" size="BeamPipe_Crotch_hole_height"> <layer material="G4_Cu" thickness="BeamPipe_Cu_thickness" vis="TubeVis"/> </section> - <!--CrotchAsymUp&CrotchAsymDn not work to fix, because of problem on convert from TGeo to Geant4--> - <!--Since lcg101, they work--> <section type="CrotchAsymUp" name="Fork" zStart="BeamPipe_Waist_zmax" zEnd="BeamPipe_Crotch_zmax" rStart="BeamPipe_Expanded_inner_radius" rEnd="BeamPipe_Upstream_inner_radius" size="BeamPipe_Crotch_hole_height"> <layer material="G4_Cu" thickness="BeamPipe_Cu_thickness" thicknessEnd="ForkAsymThickness" vis="TubeVis"/> @@ -62,6 +65,136 @@ <layer material="beam" thickness="BeamPipe_Dnstream_inner_radius" vis="VacVis"/> <layer material="G4_Cu" thickness="BeamPipe_Cu_thickness" vis="TubeVis"/> </section> + <section type="Legs" name="QD0Link" zStart="BeamPipe_FirstSeparated_zmax" zEnd="BeamPipe_SecondSeparated_zmax" rStart="0"> + <layer material="beam" thickness="BeamPipe_Dnstream_inner_radius" vis="VacVis"/> + <layer material="stainless_steel" thickness="BeamPipe_Iron_thickness" vis="TubeVis"/> + </section> + <section type="Legs" name="QD0" zStart="BeamPipe_SecondSeparated_zmax" zEnd="BeamPipe_QD0_zmax" rStart="0"> + <layer material="beam" thickness="BeamPipe_Dnstream_inner_radius" vis="VacVis"/> + <layer material="stainless_steel" thickness="BeamPipe_Iron_thickness" vis="TubeVis"/> + <layer material="G4_Cu" thickness="3.5*mm" vis="TubeVis"/> + <layer material="superconductor" thickness="6.0*mm" vis="MagentaVis"/> + <layer material="stainless_steel" thickness="8.0*mm" vis="ShellVis"/> + </section> + <section type="Legs" name="QF1Link" zStart="BeamPipe_QD0_zmax" zEnd="BeamPipe_QF1_zmin" rStart="0"> + <layer material="beam" thickness="BeamPipe_Dnstream_inner_radius" thicknessEnd="BeamPipe_QF1_inner_radius" vis="VacVis"/> + <layer material="stainless_steel" thickness="BeamPipe_Iron_thickness" vis="TubeVis"/> + </section> + <section type="Legs" name="QF1" zStart="BeamPipe_QF1_zmin" zEnd="BeamPipe_QF1_zmax" rStart="0"> + <layer material="beam" thickness="BeamPipe_QF1_inner_radius" vis="VacVis"/> + <layer material="stainless_steel" thickness="BeamPipe_Iron_thickness" vis="TubeVis"/> + <layer material="G4_Cu" thickness="3.0*mm" vis="TubeVis"/> + <layer material="superconductor" thickness="6.0*mm" vis="MagentaVis"/> + <layer material="stainless_steel" thickness="8.0*mm" vis="ShellVis"/> + </section> + <section type="Legs" name="Farest" zStart="BeamPipe_QF1_zmax" zEnd="BeamPipe_end_z" rStart="0"> + <layer material="beam" thickness="BeamPipe_QF1_inner_radius" vis="VacVis"/> + <layer material="stainless_steel" thickness="BeamPipe_Iron_thickness" vis="TubeVis"/> + </section> + + <!-- Magnets and their cooling, support --> + <section type="CenterSide" name="Magnet_1" zStart="1160*mm" zEnd="1900*mm" rStart="90*mm"> + <layer material="superconductor" thickness="20*mm" vis="MagentaVis"/> + </section> + <section type="CenterSide" name="Magnet_2" zStart="1930*mm" zEnd="3964*mm" rStart="120*mm"> + <layer material="superconductor" thickness="10*mm" vis="MagentaVis"/> + </section> + <section type="CenterSide" name="Magnet_3" zStart="3970*mm" zEnd="7000*mm" rStart="185*mm"> + <layer material="superconductor" thickness="10*mm" vis="MagentaVis"/> + </section> + <section type="CenterSide" name="MagnetShell_1" zStart="970*mm" zEnd="1110*mm" rStart="31*mm"> + <layer material="stainless_steel" thickness="1.5*mm" vis="ShellVis"/> + </section> + <section type="CenterSide" name="MagnetShell_2" zStart="1110*mm" zEnd="1115*mm" rStart="50.0*mm"> + <layer material="stainless_steel" thickness="91.25*mm" vis="ShellVis"/> + </section> + <section type="CenterSide" name="MagnetShell_3" zStart="1115*mm" zEnd="1900*mm" rStart="130.75*mm" rEnd="175*mm"> + <layer material="stainless_steel" thickness="10.5*mm" thicknessEnd="65*mm" vis="ShellVis"/> + </section> + <section type="CenterSide" name="MagnetShell_4" zStart="1900*mm" zEnd="3800*mm" rStart="175*mm"> + <layer material="stainless_steel" thickness="65*mm" vis="ShellVis"/> + </section> + <section type="CenterSide" name="MagnetShell_5" zStart="3800*mm" zEnd="3910*mm" rStart="175*mm"> + <layer material="stainless_steel" thickness="135*mm" vis="ShellVis"/> + </section> + <section type="CenterSide" name="MagnetShell_6" zStart="3910*mm" zEnd="7160*mm" rStart="240*mm"> + <layer material="stainless_steel" thickness="70*mm" vis="ShellVis"/> + </section> + <section type="CenterSide" name="MagnetSupport_1" zStart="1130*mm" zEnd="1135*mm" rStart="75*mm"> + <layer material="stainless_steel" thickness="50*mm" vis="ShellVis"/> + </section> + <section type="CenterSide" name="MagnetSupport_2i" zStart="1135*mm" zEnd="1925*mm" rStart="75*mm"> + <layer material="stainless_steel" thickness="5*mm" vis="ShellVis"/> + </section> + <section type="CenterSide" name="MagnetSupport_2o" zStart="1135*mm" zEnd="1900*mm" rStart="120*mm"> + <layer material="stainless_steel" thickness="5*mm" vis="ShellVis"/> + </section> + <section type="CenterSide" name="MagnetSupport_3l" zStart="1900*mm" zEnd="1905*mm" rStart="120*mm"> + <layer material="stainless_steel" thickness="25*mm" vis="ShellVis"/> + </section> + <section type="CenterSide" name="MagnetSupport_3r" zStart="1925*mm" zEnd="1930*mm" rStart="75*mm"> + <layer material="stainless_steel" thickness="35*mm" vis="ShellVis"/> + </section> + <section type="CenterSide" name="MagnetSupport_4i" zStart="1930*mm" zEnd="4000*mm" rStart="105*mm"> + <layer material="stainless_steel" thickness="5*mm" vis="ShellVis"/> + </section> + <section type="CenterSide" name="MagnetSupport_4o" zStart="1905*mm" zEnd="3940*mm" rStart="140*mm"> + <layer material="stainless_steel" thickness="5*mm" vis="ShellVis"/> + </section> + <section type="CenterSide" name="MagnetSupport_5l" zStart="3940*mm" zEnd="3945*mm" rStart="140*mm"> + <layer material="stainless_steel" thickness="70*mm" vis="ShellVis"/> + </section> + <section type="CenterSide" name="MagnetSupport_5r" zStart="4000*mm" zEnd="4005*mm" rStart="105*mm"> + <layer material="stainless_steel" thickness="70*mm" vis="ShellVis"/> + </section> + <section type="CenterSide" name="MagnetSupport_6i" zStart="4005*mm" zEnd="7050*mm" rStart="170*mm"> + <layer material="stainless_steel" thickness="5*mm" vis="ShellVis"/> + </section> + <section type="CenterSide" name="MagnetSupport_6o" zStart="3945*mm" zEnd="7050*mm" rStart="205*mm"> + <layer material="stainless_steel" thickness="5*mm" vis="ShellVis"/> + </section> + <section type="CenterSide" name="MagnetSupport_7" zStart="7050*mm" zEnd="7055*mm" rStart="170*mm"> + <layer material="stainless_steel" thickness="40*mm" vis="ShellVis"/> + </section> + <section type="CenterSide" name="MagnetCooling_1l" zStart="1135*mm" zEnd="1160*mm" rStart="80*mm"> + <layer material="lN2" thickness="40*mm" vis="BlueVis"/> + </section> + <section type="CenterSide" name="MagnetCooling_1i" zStart="1160*mm" zEnd="1900*mm" rStart="80*mm"> + <layer material="lN2" thickness="10*mm" vis="BlueVis"/> + </section> + <section type="CenterSide" name="MagnetCooling_1o" zStart="1160*mm" zEnd="1900*mm" rStart="110*mm"> + <layer material="lN2" thickness="10*mm" vis="BlueVis"/> + </section> + <section type="CenterSide" name="MagnetCooling_1r" zStart="1900*mm" zEnd="1925*mm" rStart="80*mm"> + <layer material="lN2" thickness="40*mm" vis="BlueVis"/> + </section> + <section type="CenterSide" name="MagnetCooling_2l" zStart="1905*mm" zEnd="1930*mm" rStart="120*mm"> + <layer material="lN2" thickness="20*mm" vis="BlueVis"/> + </section> + <section type="CenterSide" name="MagnetCooling_2i" zStart="1925*mm" zEnd="3964*mm" rStart="110*mm"> + <layer material="lN2" thickness="10*mm" vis="BlueVis"/> + </section> + <section type="CenterSide" name="MagnetCooling_2o" zStart="1930*mm" zEnd="3945*mm" rStart="130*mm"> + <layer material="lN2" thickness="10*mm" vis="BlueVis"/> + </section> + <section type="CenterSide" name="MagnetCooling_2r1" zStart="3964*mm" zEnd="4000*mm" rStart="110*mm"> + <layer material="lN2" thickness="65*mm" vis="BlueVis"/> + </section> + <section type="CenterSide" name="MagnetCooling_2r2" zStart="3945*mm" zEnd="3964*mm" rStart="130*mm"> + <layer material="lN2" thickness="45*mm" vis="BlueVis"/> + </section> + <section type="CenterSide" name="MagnetCooling_3l" zStart="3945*mm" zEnd="3970*mm" rStart="175*mm"> + <layer material="lN2" thickness="30*mm" vis="BlueVis"/> + </section> + <section type="CenterSide" name="MagnetCooling_3i" zStart="3970*mm" zEnd="7000*mm" rStart="175*mm"> + <layer material="lN2" thickness="10*mm" vis="BlueVis"/> + </section> + <section type="CenterSide" name="MagnetCooling_3o" zStart="3970*mm" zEnd="7000*mm" rStart="195*mm"> + <layer material="lN2" thickness="10*mm" vis="BlueVis"/> + </section> + <section type="CenterSide" name="MagnetCooling_3r" zStart="7000*mm" zEnd="7050*mm" rStart="175*mm"> + <layer material="lN2" thickness="30*mm" vis="BlueVis"/> + </section> </detector> </detectors> </lccdd> diff --git a/Detector/DetCRD/compact/CRD_common_v01/Beampipe_v01_02.xml b/Detector/DetCRD/compact/CRD_common_v01/Beampipe_v01_02.xml index ef58b72abe1e9d6e836043f4b03a7cfb0d2316bc..24f79c29b5ed686aa1c95c4e0656bf63a37da58d 100644 --- a/Detector/DetCRD/compact/CRD_common_v01/Beampipe_v01_02.xml +++ b/Detector/DetCRD/compact/CRD_common_v01/Beampipe_v01_02.xml @@ -11,6 +11,11 @@ <define> <!--only needed for asymetry double pipe--> <!--constant name="ForkAsymThickness" value="BeamPipe_Dnstream_inner_radius+BeamPipe_Cu_thickness-BeamPipe_Upstream_inner_radius"/--> + <constant name="BeamPipe_QD0_zmax" value="3950*mm"/> + <constant name="BeamPipe_QF1_zmin" value="4450*mm"/> + <constant name="BeamPipe_QF1_zmax" value="5910*mm"/> + <constant name="BeamPipe_QF1_inner_radius" value="20.5*mm"/> + <constant name="BeamPipe_Iron_thickness" value="2.5*mm"/> </define> <detectors> @@ -63,6 +68,132 @@ <layer material="beam" thickness="BeamPipe_Fork_inner_radius" vis="VacVis"/> <layer material="G4_Cu" thickness="BeamPipe_Cu_thickness" vis="TubeVis"/> </section> + <section type="Legs" name="QD0" zStart="BeamPipe_SecondSeparated_zmax" zEnd="BeamPipe_QD0_zmax" rStart="0"> + <layer material="beam" thickness="BeamPipe_Fork_inner_radius" vis="VacVis"/> + <layer material="stainless_steel" thickness="BeamPipe_Iron_thickness" vis="TubeVis"/> + <layer material="G4_Cu" thickness="3.5*mm" vis="TubeVis"/> + <layer material="superconductor" thickness="6.0*mm" vis="MagentaVis"/> + <layer material="stainless_steel" thickness="8.0*mm" vis="ShellVis"/> + </section> + <section type="Legs" name="QF1Linker" zStart="BeamPipe_QD0_zmax" zEnd="BeamPipe_QF1_zmin" rStart="0"> + <layer material="beam" thickness="BeamPipe_Fork_inner_radius" thicknessEnd="BeamPipe_QF1_inner_radius" vis="VacVis"/> + <layer material="stainless_steel" thickness="BeamPipe_Iron_thickness" vis="TubeVis"/> + </section> + <section type="Legs" name="QF1" zStart="BeamPipe_QF1_zmin" zEnd="BeamPipe_QF1_zmax" rStart="0"> + <layer material="beam" thickness="BeamPipe_QF1_inner_radius" vis="VacVis"/> + <layer material="stainless_steel" thickness="BeamPipe_Iron_thickness" vis="TubeVis"/> + <layer material="G4_Cu" thickness="3.0*mm" vis="TubeVis"/> + <layer material="superconductor" thickness="6.0*mm" vis="MagentaVis"/> + <layer material="stainless_steel" thickness="8.0*mm" vis="ShellVis"/> + </section> + <section type="Legs" name="Farest" zStart="BeamPipe_QF1_zmax" zEnd="BeamPipe_end_z" rStart="0"> + <layer material="beam" thickness="BeamPipe_QF1_inner_radius" vis="VacVis"/> + <layer material="stainless_steel" thickness="BeamPipe_Iron_thickness" vis="TubeVis"/> + </section> + + <!-- Magnets and their cooling, support --> + <section type="CenterSide" name="Magnet_1" zStart="1160*mm" zEnd="1900*mm" rStart="90*mm"> + <layer material="superconductor" thickness="20*mm" vis="MagentaVis"/> + </section> + <section type="CenterSide" name="Magnet_2" zStart="1930*mm" zEnd="3964*mm" rStart="120*mm"> + <layer material="superconductor" thickness="10*mm" vis="MagentaVis"/> + </section> + <section type="CenterSide" name="Magnet_3" zStart="3970*mm" zEnd="7000*mm" rStart="185*mm"> + <layer material="superconductor" thickness="10*mm" vis="MagentaVis"/> + </section> + <section type="CenterSide" name="MagnetShell_1" zStart="970*mm" zEnd="1110*mm" rStart="33*mm"> + <layer material="stainless_steel" thickness="1.5*mm" vis="ShellVis"/> + </section> + <section type="CenterSide" name="MagnetShell_2" zStart="1110*mm" zEnd="1115*mm" rStart="50.0*mm"> + <layer material="stainless_steel" thickness="91.25*mm" vis="ShellVis"/> + </section> + <section type="CenterSide" name="MagnetShell_3" zStart="1115*mm" zEnd="1900*mm" rStart="130.75*mm" rEnd="175*mm"> + <layer material="stainless_steel" thickness="10.5*mm" thicknessEnd="65*mm" vis="ShellVis"/> + </section> + <section type="CenterSide" name="MagnetShell_4" zStart="1900*mm" zEnd="3800*mm" rStart="175*mm"> + <layer material="stainless_steel" thickness="65*mm" vis="ShellVis"/> + </section> + <section type="CenterSide" name="MagnetShell_5" zStart="3800*mm" zEnd="3910*mm" rStart="175*mm"> + <layer material="stainless_steel" thickness="135*mm" vis="ShellVis"/> + </section> + <section type="CenterSide" name="MagnetShell_6" zStart="3910*mm" zEnd="7160*mm" rStart="240*mm"> + <layer material="stainless_steel" thickness="70*mm" vis="ShellVis"/> + </section> + <section type="CenterSide" name="MagnetSupport_1" zStart="1130*mm" zEnd="1135*mm" rStart="75*mm"> + <layer material="stainless_steel" thickness="50*mm" vis="ShellVis"/> + </section> + <section type="CenterSide" name="MagnetSupport_2i" zStart="1135*mm" zEnd="1925*mm" rStart="75*mm"> + <layer material="stainless_steel" thickness="5*mm" vis="ShellVis"/> + </section> + <section type="CenterSide" name="MagnetSupport_2o" zStart="1135*mm" zEnd="1900*mm" rStart="120*mm"> + <layer material="stainless_steel" thickness="5*mm" vis="ShellVis"/> + </section> + <section type="CenterSide" name="MagnetSupport_3l" zStart="1900*mm" zEnd="1905*mm" rStart="120*mm"> + <layer material="stainless_steel" thickness="25*mm" vis="ShellVis"/> + </section> + <section type="CenterSide" name="MagnetSupport_3r" zStart="1925*mm" zEnd="1930*mm" rStart="75*mm"> + <layer material="stainless_steel" thickness="35*mm" vis="ShellVis"/> + </section> + <section type="CenterSide" name="MagnetSupport_4i" zStart="1930*mm" zEnd="4000*mm" rStart="105*mm"> + <layer material="stainless_steel" thickness="5*mm" vis="ShellVis"/> + </section> + <section type="CenterSide" name="MagnetSupport_4o" zStart="1905*mm" zEnd="3940*mm" rStart="140*mm"> + <layer material="stainless_steel" thickness="5*mm" vis="ShellVis"/> + </section> + <section type="CenterSide" name="MagnetSupport_5l" zStart="3940*mm" zEnd="3945*mm" rStart="140*mm"> + <layer material="stainless_steel" thickness="70*mm" vis="ShellVis"/> + </section> + <section type="CenterSide" name="MagnetSupport_5r" zStart="4000*mm" zEnd="4005*mm" rStart="105*mm"> + <layer material="stainless_steel" thickness="70*mm" vis="ShellVis"/> + </section> + <section type="CenterSide" name="MagnetSupport_6i" zStart="4005*mm" zEnd="7050*mm" rStart="170*mm"> + <layer material="stainless_steel" thickness="5*mm" vis="ShellVis"/> + </section> + <section type="CenterSide" name="MagnetSupport_6o" zStart="3945*mm" zEnd="7050*mm" rStart="205*mm"> + <layer material="stainless_steel" thickness="5*mm" vis="ShellVis"/> + </section> + <section type="CenterSide" name="MagnetSupport_7" zStart="7050*mm" zEnd="7055*mm" rStart="170*mm"> + <layer material="stainless_steel" thickness="40*mm" vis="ShellVis"/> + </section> + <section type="CenterSide" name="MagnetCooling_1l" zStart="1135*mm" zEnd="1160*mm" rStart="80*mm"> + <layer material="lN2" thickness="40*mm" vis="BlueVis"/> + </section> + <section type="CenterSide" name="MagnetCooling_1i" zStart="1160*mm" zEnd="1900*mm" rStart="80*mm"> + <layer material="lN2" thickness="10*mm" vis="BlueVis"/> + </section> + <section type="CenterSide" name="MagnetCooling_1o" zStart="1160*mm" zEnd="1900*mm" rStart="110*mm"> + <layer material="lN2" thickness="10*mm" vis="BlueVis"/> + </section> + <section type="CenterSide" name="MagnetCooling_1r" zStart="1900*mm" zEnd="1925*mm" rStart="80*mm"> + <layer material="lN2" thickness="40*mm" vis="BlueVis"/> + </section> + <section type="CenterSide" name="MagnetCooling_2l" zStart="1905*mm" zEnd="1930*mm" rStart="120*mm"> + <layer material="lN2" thickness="20*mm" vis="BlueVis"/> + </section> + <section type="CenterSide" name="MagnetCooling_2i" zStart="1925*mm" zEnd="3964*mm" rStart="110*mm"> + <layer material="lN2" thickness="10*mm" vis="BlueVis"/> + </section> + <section type="CenterSide" name="MagnetCooling_2o" zStart="1930*mm" zEnd="3945*mm" rStart="130*mm"> + <layer material="lN2" thickness="10*mm" vis="BlueVis"/> + </section> + <section type="CenterSide" name="MagnetCooling_2r1" zStart="3964*mm" zEnd="4000*mm" rStart="110*mm"> + <layer material="lN2" thickness="65*mm" vis="BlueVis"/> + </section> + <section type="CenterSide" name="MagnetCooling_2r2" zStart="3945*mm" zEnd="3964*mm" rStart="130*mm"> + <layer material="lN2" thickness="45*mm" vis="BlueVis"/> + </section> + <section type="CenterSide" name="MagnetCooling_3l" zStart="3945*mm" zEnd="3970*mm" rStart="175*mm"> + <layer material="lN2" thickness="30*mm" vis="BlueVis"/> + </section> + <section type="CenterSide" name="MagnetCooling_3i" zStart="3970*mm" zEnd="7000*mm" rStart="175*mm"> + <layer material="lN2" thickness="10*mm" vis="BlueVis"/> + </section> + <section type="CenterSide" name="MagnetCooling_3o" zStart="3970*mm" zEnd="7000*mm" rStart="195*mm"> + <layer material="lN2" thickness="10*mm" vis="BlueVis"/> + </section> + <section type="CenterSide" name="MagnetCooling_3r" zStart="7000*mm" zEnd="7050*mm" rStart="175*mm"> + <layer material="lN2" thickness="30*mm" vis="BlueVis"/> + </section> </detector> </detectors> </lccdd> diff --git a/Detector/DetCRD/compact/CRD_common_v01/Ecal_Crystal_Barrel_v01_01.xml b/Detector/DetCRD/compact/CRD_common_v01/Ecal_Crystal_Barrel_v01_01.xml index e439461d9ca5f824e321e0e43b2fc833232f88bd..eaf59929b25cdf92662baa9c612f7d0d7d625543 100644 --- a/Detector/DetCRD/compact/CRD_common_v01/Ecal_Crystal_Barrel_v01_01.xml +++ b/Detector/DetCRD/compact/CRD_common_v01/Ecal_Crystal_Barrel_v01_01.xml @@ -2,10 +2,13 @@ <lccdd> <define> <constant name="ecalbarrel_inner_radius" value="Ecal_barrel_inner_radius"/> - <constant name="ecalbarrel_thickness" value="Ecal_barrel_thickness"/> <!--Must be n*10*mm! --> - <constant name="ecalbarrel_zlength" value="Ecal_barrel_half_length*2"/> <!--Must be n*10*mm! --> - <constant name="bar_x" value="1*cm"/> - <constant name="bar_y" value="1*cm"/> + <constant name="ecalbarrel_thickness" value="Ecal_barrel_thickness"/> <!--Must be n*10*mm! --> + <constant name="ecalbarrel_zlength" value="Ecal_barrel_half_length*2"/> <!--Must be n*10*mm n*Nblock_z! --> + <constant name="n_symm" value="Ecal_barrel_symmetry" /> <!--Only support 8 and 12 now --> + <constant name="Nblock_z" value="11" /> + <constant name="Nblock_phi" value="4" /> + <constant name="bar_x" value="1*cm"/> + <constant name="bar_y" value="1*cm"/> </define> <regions> @@ -21,7 +24,7 @@ <readouts> <readout name="EcalBarrelCollection"> - <!-- <segmentation type="NoSegmentation"/> --> + <!--segmentation type="NoSegmentation"/--> <!--segmentation type="CartesianGridXYZ" grid_size_x="1*cm" diff --git a/Detector/DetCRD/compact/CRD_common_v01/FTD_SkewRing_v01_03.xml b/Detector/DetCRD/compact/CRD_common_v01/FTD_SkewRing_v01_03.xml new file mode 100644 index 0000000000000000000000000000000000000000..1e79e9de9e349722c1a0ea93573e09c1f37093ee --- /dev/null +++ b/Detector/DetCRD/compact/CRD_common_v01/FTD_SkewRing_v01_03.xml @@ -0,0 +1,64 @@ +<lccdd> + <define> + <constant name="SiliconThickness" value="0.2*mm"/> + <constant name="SupportThickness" value="1.0*mm"/> + <constant name="ModuleZGap" value="1.0*mm"/> + <constant name="ModuleRPhiGap" value="-10*mm"/> + </define> + + <detectors> + <detector id="DetID_FTD" name="FTD" type="SiTrackerSkewRing_v01" vis="FTDVis" readout="FTDCollection" insideTrackingVolume="true" reflect="true"> + <envelope> + <shape type="Assembly"/> + </envelope> + + <type_flags type="DetType_TRACKER + DetType_ENDCAP + DetType_PIXEL "/> + + <reconstruction strip_width="0.05*mm" strip_length="92*mm" strip_pitch="0" strip_angle="0"/> + + <layer id="0" z="SiTracker_endcap_z1" dz="0.5*ModuleZGap" inner_r="SiTracker_endcap_z1*tan(acos(Global_endcap_costheta))*cos(pi/16)" outer_r="SiTracker_endcap_outer_radius1" + phi0="0" gap="ModuleRPhiGap" is_pixel="true" nmodules="16" vis="SeeThrough"> + <component material="G4_Si" thickness="SiliconThickness" vis="FTDSensitiveVis" sensitive="yes"/> + <component material="CarbonFiber" thickness="SupportThickness" vis="FTDSupportVis"/> + </layer> + <layer id="1" z="SiTracker_endcap_z2" dz="0.5*ModuleZGap" inner_r="SiTracker_endcap_z2*tan(acos(Global_endcap_costheta))*cos(pi/16)" outer_r="SiTracker_endcap_outer_radius2" + phi0="0" gap="ModuleRPhiGap" is_pixel="true" nmodules="16" vis="SeeThrough"> + <component material="G4_Si" thickness="SiliconThickness" vis="FTDSensitiveVis" sensitive="yes"/> + <component material="CarbonFiber" thickness="SupportThickness" vis="FTDSupportVis"/> + </layer> + <layer id="2" z="SiTracker_endcap_z3" dz="0.5*ModuleZGap" inner_r="SiTracker_endcap_z3*tan(acos(Global_endcap_costheta))*cos(pi/16)" outer_r="SiTracker_endcap_outer_radius3" + phi0="0" gap="ModuleRPhiGap" is_pixel="true" nmodules="16" vis="SeeThrough"> + <component material="G4_Si" thickness="SiliconThickness" vis="FTDSensitiveVis" sensitive="yes"/> + <component material="CarbonFiber" thickness="SupportThickness" vis="FTDSupportVis"/> + </layer> + <layer id="3" z="SiTracker_endcap_z4" dz="0.5*ModuleZGap" inner_r="SiTracker_endcap_z4*tan(acos(Global_endcap_costheta))*cos(pi/16)" outer_r="SiTracker_endcap_outer_radius4" + phi0="0" gap="ModuleRPhiGap" is_pixel="true" nmodules="16" vis="SeeThrough"> + <component material="G4_Si" thickness="SiliconThickness" vis="FTDSensitiveVis" sensitive="yes"/> + <component material="CarbonFiber" thickness="SupportThickness" vis="FTDSupportVis"/> + </layer> + <layer id="4" z="SiTracker_endcap_z5" dz="0.5*ModuleZGap" inner_r="SiTracker_endcap_z5*tan(acos(Global_endcap_costheta))*cos(pi/16)" outer_r="SiTracker_endcap_outer_radius5" + phi0="0" gap="ModuleRPhiGap" is_pixel="true" nmodules="16" vis="SeeThrough"> + <component material="G4_Si" thickness="SiliconThickness" vis="FTDSensitiveVis" sensitive="yes"/> + <component material="CarbonFiber" thickness="SupportThickness" vis="FTDSupportVis"/> + </layer> + <layer id="5" z="SiTracker_endcap_z6" dz="0.5*ModuleZGap" inner_r="SiTracker_endcap_z6*tan(acos(Global_endcap_costheta))*cos(pi/16)" outer_r="SiTracker_endcap_outer_radius6" + phi0="0" gap="ModuleRPhiGap" is_pixel="true" nmodules="16" vis="SeeThrough"> + <component material="G4_Si" thickness="SiliconThickness" vis="FTDSensitiveVis" sensitive="yes"/> + <component material="CarbonFiber" thickness="SupportThickness" vis="FTDSupportVis"/> + </layer> + <layer id="6" z="SiTracker_endcap_z7" dz="0.5*ModuleZGap" inner_r="SiTracker_endcap_z7*tan(acos(Global_endcap_costheta))*cos(pi/16)" outer_r="SiTracker_endcap_outer_radius7" + phi0="0" gap="ModuleRPhiGap" is_pixel="true" nmodules="16" vis="SeeThrough"> + <component material="G4_Si" thickness="SiliconThickness" vis="FTDSensitiveVis" sensitive="yes"/> + <component material="CarbonFiber" thickness="SupportThickness" vis="FTDSupportVis"/> + </layer> + + </detector> + </detectors> + + <readouts> + <readout name="FTDCollection"> + <id>system:5,side:-2,layer:9,module:8,sensor:8</id> + </readout> + </readouts> + +</lccdd> diff --git a/Detector/DetCRD/compact/CRD_common_v01/VXD_StaggeredLadder_v01_01.xml b/Detector/DetCRD/compact/CRD_common_v01/VXD_StaggeredLadder_v01_01.xml index 2c3c63d33dfebfe092b71deddd759918a9a39228..9c7ab8b8e95a98f25c5667d814965ee63f922f74 100644 --- a/Detector/DetCRD/compact/CRD_common_v01/VXD_StaggeredLadder_v01_01.xml +++ b/Detector/DetCRD/compact/CRD_common_v01/VXD_StaggeredLadder_v01_01.xml @@ -22,7 +22,7 @@ <envelope> <shape type="BooleanShape" operation="Subtraction" material="Air" > <shape type="BooleanShape" operation="Subtraction" material="Air" > - <shape type="Tube" rmin="VXD_inner_radius+1*mm" rmax="VXD_outer_radius" dz="VXD_half_length" /> + <shape type="Tube" rmin="VXD_inner_radius" rmax="VXD_outer_radius" dz="VXD_half_length" /> <shape type="Cone" rmin1="0" rmax1="BeamPipe_VertexRegion_rmax" rmin2="0" rmax2="Vertex_Side_rmin" z="(VXD_half_length-BeamPipe_CentralAl_zmax)/2." /> <position x="0" y="0" z="VXD_half_length-(VXD_half_length-BeamPipe_CentralAl_zmax)/2."/> </shape> diff --git a/Detector/DetCRD/compact/CRD_common_v01/VXD_v01_01.xml b/Detector/DetCRD/compact/CRD_common_v01/VXD_v01_01.xml index d5bf5a5e8e3ec510077cb7796d13568b8db24585..ce0a8a50b7a35da791a675216f0cf086567f27e3 100644 --- a/Detector/DetCRD/compact/CRD_common_v01/VXD_v01_01.xml +++ b/Detector/DetCRD/compact/CRD_common_v01/VXD_v01_01.xml @@ -3,7 +3,7 @@ <constant name="VXD_inner_radius" value="Vertex_inner_radius"/> <constant name="VXD_outer_radius" value="Vertex_outer_radius"/> <constant name="VXD_half_length" value="Vertex_half_length"/> - <constant name="VXD_inner_radius_1" value="BeamPipe_VertexRegion_rmax"/> + <constant name="VXD_inner_radius_1" value="Vertex_Side_rmin"/><!--BeamPipe_VertexRegion_rmax"/--> <constant name="VXD_radius_r1" value="16*mm"/> <constant name="VXD_radius_r3" value="37*mm"/> <constant name="VXD_radius_r5" value="58*mm"/> @@ -22,10 +22,10 @@ <shape type="BooleanShape" operation="Subtraction" material="Air" > <shape type="BooleanShape" operation="Subtraction" material="Air" > <shape type="Tube" rmin="VXD_inner_radius" rmax="VXD_outer_radius" dz="VXD_half_length" /> - <shape type="Tube" rmin="0." rmax="VXD_inner_radius_1" dz="(VXD_half_length - VXD_cone_max_z)/2. + env_safety " /> + <shape type="Tube" rmin="0" rmax="VXD_inner_radius_1" dz="(VXD_half_length - VXD_cone_max_z)/2. + env_safety " /> <position x="0" y="0" z="VXD_half_length-(VXD_half_length - VXD_cone_max_z)/2.+ env_safety"/> </shape> - <shape type="Tube" rmin="0." rmax="VXD_inner_radius_1" dz="(VXD_half_length - VXD_cone_max_z)/2. + env_safety " /> + <shape type="Tube" rmin="0" rmax="VXD_inner_radius_1" dz="(VXD_half_length - VXD_cone_max_z)/2. + env_safety " /> <position x="0" y="0" z="- ( VXD_half_length-(VXD_half_length - VXD_cone_max_z)/2.+ env_safety ) "/> <rotation x="0" y="180.*deg" z="0" /> </shape> diff --git a/Detector/DetCRD/compact/CRD_common_v01/VXD_v01_02.xml b/Detector/DetCRD/compact/CRD_common_v01/VXD_v01_02.xml new file mode 100644 index 0000000000000000000000000000000000000000..57a6014c2f70c1feccfef1f8cd802c41bbb16052 --- /dev/null +++ b/Detector/DetCRD/compact/CRD_common_v01/VXD_v01_02.xml @@ -0,0 +1,87 @@ +<lccdd> + <define> + <constant name="VXD_inner_radius" value="Vertex_inner_radius"/> + <constant name="VXD_outer_radius" value="Vertex_outer_radius"/> + <constant name="VXD_half_length" value="Vertex_half_length"/> + <constant name="VXD_inner_radius_1" value="Vertex_Side_rmin"/> + <constant name="VXD_radius_r1" value="16*mm"/> + <constant name="VXD_radius_r3" value="37*mm"/> + <constant name="VXD_radius_r5" value="58*mm"/> + <constant name="VXD_length_r1" value="113*mm"/> + <constant name="VXD_length_r3" value="408*mm"/> + <constant name="VXD_length_r5" value="408*mm"/> + <constant name="VXD_cone_max_z" value="Vertex_half_length-10*mm"/> + <constant name="VXD_cone_min_z" value="VXD_length_r5+10*mm"/> + </define> + + <detectors> + <detector id="DetID_VXD" name="VXD" type="VXD04" vis="SeeThrough" readout="VXDCollection" insideTrackingVolume="true"> + <envelope> + <shape type="Assembly"/> + </envelope> + + <!-- set the detecor type flag - note: using the '+' operator here as the evaluator does not understand '|' + -> be carefull not to add any flags twice !!! --> + <type_flags type=" DetType_TRACKER + DetType_PIXEL + DetType_VERTEX "/> + + <!-- database : TMP_DB10 --> + <!-- SQL command: "select * from layers_common_parameters;" --> + <layers_common_parameters id="1" + electronics_structure_thickness="0.1*mm" + active_silicon_thickness="0.05*mm" + support_structure_radial_thickness="0.49392*mm" + end_electronics_half_z="5*mm" + strip_final_beampipe_radious="VXD_inner_radius_1" + side_band_electronics_option="1" + end_ladd_electronics_option="1" + side_band_electronics_width="0.5*mm" + side_band_electronics_thickness="0.05*mm" + active_side_band_electronics_option="0" + layer_gap="2*mm" + flex_cable_material="G4_KAPTON" + flex_cable_thickness="0.05*mm" + foam_spacer_material="SiC_foam" + foam_spacer_thickness="0.94*mm" + metal_traces_material="G4_Al" + metal_traces_thickness="0.01*mm" + cool_pipe_material="titanium" + cool_pipe_inner_radius="0.75*mm" + cool_pipe_outer_radius="1*mm" + external_kapton_thickness="0.05*mm" + external_metal_thickness="0.009*mm" /> + <!-- SQL command: "SELECT * FROM cryostat;" --> + <cryostat id="1" alu_skin_inner_radious="85*mm" alu_skin_tickness="0.5*mm" foam_inner_radious="80*mm" foam_tickness="10*mm" foam_half_z="466*mm" + endplate_inner_radious="VXD_inner_radius_1" + cryostat_option="0" cryostat_apperture="30*mm" cryostat_apperture_radius="1.5*mm" /> + <!-- SQL command: "select * from support_shell;" --> + <support_shell id="0" inner_radious="65*mm" half_z="435*mm" thickess="0.49392*mm" endplate_inner_radious="30*mm" endplate_inner_radius_L1="15.7*mm" endplate_outer_radius_L1="20*mm" + offset_ladder_block="0.28224*mm" beryllium_ladder_block_length="5*mm" beryllium_ladder_block_thickness="0.25*mm" shell_endplate_thickness="2*mm" forward_shell_half_z="6.5*mm" /> + <!-- SQL command: "select * from layer;" --> + <layer id="0" layer_radius="VXD_radius_r1" ladder_length="VXD_length_r1" ladder_width="5.5*mm" nb_ladder="10" ladder_gap="0*mm" end_electronics_width="5.5*mm" + initial_kapton_striplines_thickness="0.04566*mm" final_kapton_striplines_thickness="0.02435*mm" initial_metal_striplines_thickness="0.00806*mm" + final_metal_striplines_thickness="0.0043*mm" support_width="4.5*mm" /> + <layer id="1" layer_radius="VXD_radius_r1" ladder_length="VXD_length_r1" ladder_width="5.5*mm" nb_ladder="10" ladder_gap="0*mm" end_electronics_width="5.5*mm" + initial_kapton_striplines_thickness="0.04566*mm" final_kapton_striplines_thickness="0.02435*mm" initial_metal_striplines_thickness="0.00806*mm" + final_metal_striplines_thickness="0.0043*mm" support_width="4.5*mm" /> + <layer id="2" layer_radius="VXD_radius_r3" ladder_length="VXD_length_r3" ladder_width="11*mm" nb_ladder="11" ladder_gap="0*mm" end_electronics_width="11*mm" + initial_kapton_striplines_thickness="0.04102*mm" final_kapton_striplines_thickness="0.05059*mm" initial_metal_striplines_thickness="0.00724*mm" + final_metal_striplines_thickness="0.00893*mm" support_width="10*mm" /> + <layer id="3" layer_radius="VXD_radius_r3" ladder_length="VXD_length_r3" ladder_width="11*mm" nb_ladder="11" ladder_gap="0*mm" end_electronics_width="11*mm" + initial_kapton_striplines_thickness="0.04102*mm" final_kapton_striplines_thickness="0.05059*mm" initial_metal_striplines_thickness="0.00724*mm" + final_metal_striplines_thickness="0.00893*mm" support_width="10*mm" /> + <layer id="4" layer_radius="VXD_radius_r5" ladder_length="VXD_length_r5" ladder_width="11*mm" nb_ladder="17" ladder_gap="0*mm" end_electronics_width="11*mm" + initial_kapton_striplines_thickness="0.04044*mm" final_kapton_striplines_thickness="0.07819*mm" initial_metal_striplines_thickness="0.00714*mm" + final_metal_striplines_thickness="0.0138*mm" support_width="10*mm" /> + <layer id="5" layer_radius="VXD_radius_r5" ladder_length="VXD_length_r5" ladder_width="11*mm" nb_ladder="17" ladder_gap="0*mm" end_electronics_width="11*mm" + initial_kapton_striplines_thickness="0.04044*mm" final_kapton_striplines_thickness="0.07819*mm" initial_metal_striplines_thickness="0.00714*mm" + final_metal_striplines_thickness="0.0138*mm" support_width="10*mm" /> + </detector> + + </detectors> + + <readouts> + <readout name="VXDCollection"> + <id>system:5,side:-2,layer:9,module:8,sensor:8,barrelside:-2</id> + </readout> + </readouts> +</lccdd> diff --git a/Detector/DetCRD/compact/CRD_common_v01/VXD_v01_03.xml b/Detector/DetCRD/compact/CRD_common_v01/VXD_v01_03.xml new file mode 100644 index 0000000000000000000000000000000000000000..5de5bfea1767444929757bb1e8270392afee8b34 --- /dev/null +++ b/Detector/DetCRD/compact/CRD_common_v01/VXD_v01_03.xml @@ -0,0 +1,107 @@ +<lccdd> + <define> + <constant name="VXD_inner_radius" value="Vertex_inner_radius"/> + <constant name="VXD_outer_radius" value="Vertex_outer_radius"/> + <constant name="VXD_half_length" value="Vertex_half_length"/> + <constant name="VXD_inner_radius_1" value="Vertex_Side_rmin"/> + <constant name="VXD_radius_r1" value="12*mm"/> + <constant name="VXD_radius_r3" value="34*mm"/> + <constant name="VXD_radius_r5" value="58*mm"/> + <constant name="VXD_length_r1" value="62.5*mm"/> + <constant name="VXD_length_r3" value="125*mm"/> + <constant name="VXD_length_r5" value="125*mm"/> + <constant name="VXD_cone_max_z" value="Vertex_half_length-10*mm"/> + <constant name="VXD_cone_min_z" value="VXD_length_r5+10*mm"/> + </define> + + <detectors> + <detector id="DetID_VXD" name="VXD" type="VXD04" vis="VXDVis" readout="VXDCollection" insideTrackingVolume="true" combineHits="true"> + <envelope> + <shape type="BooleanShape" operation="Subtraction" material="Air" > + <shape type="BooleanShape" operation="Subtraction" material="Air" > + <shape type="BooleanShape" operation="Subtraction" material="Air" > + <shape type="BooleanShape" operation="Subtraction" material="Air" > + <shape type="Tube" rmin="VXD_inner_radius" rmax="VXD_outer_radius" dz="VXD_half_length" /> + <shape type="Tube" rmin="0." rmax="VXD_inner_radius_1" dz="(VXD_half_length - VXD_cone_max_z)/2. + env_safety " /> + <position x="0" y="0" z="VXD_half_length-(VXD_half_length - VXD_cone_max_z)/2.+ env_safety"/> + </shape> + <shape type="Tube" rmin="0." rmax="VXD_inner_radius_1" dz="(VXD_half_length - VXD_cone_max_z)/2. + env_safety " /> + <position x="0" y="0" z="- ( VXD_half_length-(VXD_half_length - VXD_cone_max_z)/2.+ env_safety ) "/> + <rotation x="0" y="180.*deg" z="0" /> + </shape> + <shape type="Cone" rmin1="0" rmax1="VXD_inner_radius" rmin2="0" rmax2="VXD_inner_radius_1" + z="(VXD_cone_max_z-VXD_cone_min_z)/2. + env_safety "/> + <position x="0" y="0" z="VXD_cone_min_z+(VXD_cone_max_z-VXD_cone_min_z)/2."/> + </shape> + <shape type="Cone" rmin1="0" rmax1="VXD_inner_radius" rmin2="0" rmax2="VXD_inner_radius_1" + z="(VXD_cone_max_z-VXD_cone_min_z)/2. + env_safety "/> + <position x="0" y="0" z="-(VXD_cone_min_z+(VXD_cone_max_z-VXD_cone_min_z)/2.)"/> + <rotation x="0" y="180.*deg" z="0" /> + </shape> + </envelope> + + <!-- set the detecor type flag - note: using the '+' operator here as the evaluator does not understand '|' + -> be carefull not to add any flags twice !!! --> + <type_flags type=" DetType_TRACKER + DetType_PIXEL + DetType_VERTEX "/> + + <!-- database : TMP_DB10 --> + <!-- SQL command: "select * from layers_common_parameters;" --> + <layers_common_parameters id="1" + electronics_structure_thickness="0.1*mm" + active_silicon_thickness="0.05*mm" + support_structure_radial_thickness="0.49392*mm" + end_electronics_half_z="5*mm" + strip_final_beampipe_radious="VXD_inner_radius_1" + side_band_electronics_option="1" + end_ladd_electronics_option="1" + side_band_electronics_width="0.5*mm" + side_band_electronics_thickness="0.05*mm" + active_side_band_electronics_option="0" + layer_gap="2*mm" + flex_cable_material="G4_KAPTON" + flex_cable_thickness="0.05*mm" + foam_spacer_material="SiC_foam" + foam_spacer_thickness="0.94*mm" + metal_traces_material="G4_Al" + metal_traces_thickness="0.01*mm" + cool_pipe_material="titanium" + cool_pipe_inner_radius="0.75*mm" + cool_pipe_outer_radius="1*mm" + external_kapton_thickness="0.05*mm" + external_metal_thickness="0.009*mm" /> + <!-- SQL command: "SELECT * FROM cryostat;" --> + <cryostat id="1" alu_skin_inner_radious="100*mm" alu_skin_tickness="0.5*mm" foam_inner_radious="90*mm" foam_tickness="10*mm" foam_half_z="166.6*mm" + endplate_inner_radious="VXD_inner_radius_1" + cryostat_option="0" cryostat_apperture="30*mm" cryostat_apperture_radius="1.5*mm" /> + <!-- SQL command: "select * from support_shell;" --> + <support_shell id="0" inner_radious="65*mm" half_z="145*mm" thickess="0.49392*mm" endplate_inner_radious="30*mm" endplate_inner_radius_L1="15.7*mm" endplate_outer_radius_L1="20*mm" + offset_ladder_block="0.28224*mm" beryllium_ladder_block_length="5*mm" beryllium_ladder_block_thickness="0.25*mm" shell_endplate_thickness="2*mm" forward_shell_half_z="6.5*mm" /> + <!-- SQL command: "select * from layer;" --> + <layer id="0" layer_radius="VXD_radius_r1" ladder_length="VXD_length_r1" ladder_width="5.2*mm" nb_ladder="8" ladder_gap="0" strip_line_final_z="150*mm" end_electronics_width="5.2*mm" + initial_kapton_striplines_thickness="0.04566*mm" final_kapton_striplines_thickness="0.02435*mm" initial_metal_striplines_thickness="0.00806*mm" + final_metal_striplines_thickness="0.0043*mm" support_width="4.5*mm" /> + <layer id="1" layer_radius="VXD_radius_r1" ladder_length="VXD_length_r1" ladder_width="5.2*mm" nb_ladder="8" ladder_gap="0" strip_line_final_z="150*mm" end_electronics_width="5.2*mm" + initial_kapton_striplines_thickness="0.04566*mm" final_kapton_striplines_thickness="0.02435*mm" initial_metal_striplines_thickness="0.00806*mm" + final_metal_striplines_thickness="0.0043*mm" support_width="4.5*mm" /> + <layer id="2" layer_radius="VXD_radius_r3" ladder_length="VXD_length_r3" ladder_width="10.2*mm" nb_ladder="11" ladder_gap="0*mm" strip_line_final_z="150*mm" end_electronics_width="10.2*mm" + initial_kapton_striplines_thickness="0.04102*mm" final_kapton_striplines_thickness="0.05059*mm" initial_metal_striplines_thickness="0.00724*mm" + final_metal_striplines_thickness="0.00893*mm" support_width="9.2*mm" /> + <layer id="3" layer_radius="VXD_radius_r3" ladder_length="VXD_length_r3" ladder_width="10.2*mm" nb_ladder="11" ladder_gap="0*mm" strip_line_final_z="150*mm" end_electronics_width="10.2*mm" + initial_kapton_striplines_thickness="0.04102*mm" final_kapton_striplines_thickness="0.05059*mm" initial_metal_striplines_thickness="0.00724*mm" + final_metal_striplines_thickness="0.00893*mm" support_width="9.2*mm" /> + <layer id="4" layer_radius="VXD_radius_r5" ladder_length="VXD_length_r3" ladder_width="11*mm" nb_ladder="17" ladder_gap="0*mm" strip_line_final_z="150*mm" end_electronics_width="11*mm" + initial_kapton_striplines_thickness="0.04044*mm" final_kapton_striplines_thickness="0.07819*mm" initial_metal_striplines_thickness="0.00714*mm" + final_metal_striplines_thickness="0.0138*mm" support_width="10*mm" /> + <layer id="5" layer_radius="VXD_radius_r5" ladder_length="VXD_length_r3" ladder_width="11*mm" nb_ladder="17" ladder_gap="0*mm" strip_line_final_z="150*mm" end_electronics_width="11*mm" + initial_kapton_striplines_thickness="0.04044*mm" final_kapton_striplines_thickness="0.07819*mm" initial_metal_striplines_thickness="0.00714*mm" + final_metal_striplines_thickness="0.0138*mm" support_width="10*mm" /> + </detector> + + </detectors> + + <readouts> + <readout name="VXDCollection"> + <id>system:5,side:-2,layer:9,module:8,sensor:8,barrelside:-2</id> + </readout> + </readouts> +</lccdd> diff --git a/Detector/DetCRD/compact/CRD_common_v01/materials.xml b/Detector/DetCRD/compact/CRD_common_v01/materials.xml index 1636e38fac798925712717c082a54819c05eacb5..ee48236f87579faa19bdfac3ccd926b583c39094 100644 --- a/Detector/DetCRD/compact/CRD_common_v01/materials.xml +++ b/Detector/DetCRD/compact/CRD_common_v01/materials.xml @@ -570,4 +570,15 @@ <fraction n="0.5103012386298891" ref="C" /> </material> + <material name="superconductor"> + <D type="density" value="6.78" unit="g/cm3" /> + <fraction n="0.56" ref="Ni" /> + <fraction n="0.44" ref="Ti" /> + </material> + + <material name="lN2"> + <D type="density" value="0.807" unit="g/cm3" /> + <fraction n="1" ref="N" /> + </material> + </materials> diff --git a/Detector/DetCRD/compact/CRD_o1_v01/Br.csv b/Detector/DetCRD/compact/CRD_o1_v01/Br.csv new file mode 100644 index 0000000000000000000000000000000000000000..093e9af359158fdaca67e469b41eb7761fcc7c13 --- /dev/null +++ b/Detector/DetCRD/compact/CRD_o1_v01/Br.csv @@ -0,0 +1,25 @@ +,0,0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,1,1.1,1.2,1.3,1.4,1.5,1.6,1.7,1.8 +0,0,0.00072238,0.00141836,0.00207148,0.00267135,0.00321527,0.00370693,0.00415367,0.00456403,0.00494571,0.00530457,0.00564426,0.00596631,0.0062705,0.00655513,0.00681818,0.00705771,0.00732861,0.00810929 +0.1,0,0.00146197,0.00286741,0.00418194,0.00538432,0.00647049,0.00744939,0.00833756,0.00915321,0.00991255,0.01062748,0.01130531,0.01194895,0.01255775,0.01312817,0.01365485,0.0141346,0.01459255,0.01554511 +0.2,0,0.00299748,0.00586624,0.00852836,0.01094282,0.01310558,0.01504385,0.01679673,0.01840687,0.0199088,0.02132748,0.02267685,0.02396242,0.02518188,0.02632737,0.02738665,0.02834344,0.02917975,0.0297083 +0.3,0,0.00470406,0.00916282,0.01324734,0.01687741,0.02009235,0.02293873,0.02550271,0.02785864,0.03007062,0.03216839,0.03417707,0.03610186,0.03793614,0.03966636,0.04127328,0.0427277,0.0439612,0.04473902 +0.4,-0.00000647,0.00664673,0.01294727,0.01853694,0.02342833,0.02766724,0.03135658,0.0346236,0.03762847,0.04046865,0.04320808,0.0458611,0.04842299,0.05087912,0.05320893,0.05538617,0.05738196,0.05915243,0.06079397 +0.5,-0.00000753,0.0093127,0.01763368,0.02493902,0.03105909,0.03608541,0.04029972,0.04410349,0.04768399,0.05113054,0.05449101,0.05777605,0.06097232,0.0640623,0.06701241,0.06978611,0.07235239,0.07473295,0.0768376 +0.6,-0.00000589,0.01285906,0.02432863,0.03345808,0.04053062,0.04591404,0.05036601,0.05437551,0.05823045,0.06212425,0.06603374,0.06993371,0.07378217,0.07753199,0.0811289,0.08452695,0.08768658,0.09055379,0.09345266 +0.7,-0.00001818,0.01897127,0.03418009,0.04560011,0.05281641,0.05740905,0.06123209,0.06509765,0.06921145,0.07346395,0.07789282,0.08238071,0.0868928,0.09132841,0.09560674,0.0996668,0.10344551,0.10688772,0.1094982 +0.8,0.00017943,0.02721068,0.05488351,0.06640383,0.06919675,0.07087947,0.07329664,0.07650002,0.08044778,0.08499199,0.0898992,0.09508866,0.10031511,0.1054739,0.11049698,0.11526844,0.1197168,0.12378965,0.12742038 +0.9,0.01131628,0.09964188,0.10956434,0.09523256,0.08783426,0.08543011,0.08570056,0.08801099,0.09185151,0.09665147,0.10215635,0.1080128,0.11402253,0.12001919,0.12585215,0.13140119,0.13657321,0.14130417,0.14599683 +1,0.0123671,0.30322555,0.21825395,0.13134489,0.11117667,0.10138317,0.09856821,0.09950552,0.10304793,0.1082858,0.11448423,0.12115218,0.12806483,0.13499432,0.14172577,0.14814184,0.15410985,0.15952363,0.16392705 +1.1,-0.0130006,0.81867829,0.31323294,0.17470945,0.14281412,0.1172797,0.11038319,0.11012807,0.11366068,0.11965809,0.12674095,0.13453239,0.1424621,0.15041161,0.15816834,0.16556992,0.17246392,0.17863443,0.18396849 +1.2,-0.0229895,0.93538797,0.46957454,0.23912773,0.16118861,0.12885932,0.11926629,0.11930251,0.12397495,0.13088178,0.13917771,0.14794117,0.15714058,0.1663046,0.17522892,0.18375358,0.19173635,0.19902265,0.20514923 +1.3,-0.01855092,0.48878047,0.39570774,0.21783572,0.14628804,0.12719277,0.1244525,0.12673939,0.13266682,0.14132752,0.1509941,0.16155572,0.17221989,0.18271251,0.19296685,0.20274364,0.21194262,0.22056561,0.22852649 +1.4,0.0001534,0.61056539,0.22481189,0.15686994,0.12208722,0.12103158,0.12341572,0.1312666,0.14044614,0.15121053,0.16330192,0.17541998,0.18760352,0.19975484,0.211436,0.22260322,0.23308339,0.24285057,0.25312152 +1.5,0.00007495,0.22857647,0.11926743,0.12824678,0.10299139,0.1138839,0.12406379,0.13519351,0.14790416,0.16150443,0.17522457,0.1894441,0.20354108,0.21735608,0.23071957,0.24344031,0.25529341,0.26606367,0.27585775 +1.6,-0.00010149,-0.02566563,0.13180144,0.09216303,0.09393796,0.10978737,0.12344628,0.13875879,0.15454946,0.17083052,0.18742221,0.20381937,0.2201136,0.23576992,0.25099247,0.26534345,0.27884519,0.2909712,0.30117348 +1.7,-0.00023463,0.03542866,0.00826892,0.0293468,0.07075312,0.10064326,0.12197606,0.14230222,0.16183629,0.18109952,0.20002048,0.21870015,0.23677882,0.25481145,0.27194845,0.28851309,0.3038795,0.3181035,0.33064435 +1.8,0.00266113,-0.1083805,-0.04846637,-0.00185282,0.05428142,0.09184384,0.12142219,0.14631224,0.16958781,0.1915702,0.21306046,0.23400751,0.25476344,0.27460806,0.29417531,0.31269297,0.33038118,0.34699276,0.36319102 +1.9,0.00866707,-0.75826116,-0.16385417,-0.02638878,0.03737719,0.08554504,0.12285399,0.15138835,0.17764276,0.20246647,0.22648528,0.24987969,0.27268593,0.29528103,0.31704459,0.33821854,0.35836124,0.37715912,0.39453256 +2,-0.01028629,-0.84166325,-0.27516465,-0.04932607,0.03169354,0.09161905,0.12744717,0.15835233,0.18706874,0.21441486,0.24039237,0.26605301,0.29141355,0.31634381,0.34090269,0.36472764,0.38763394,0.40901008,0.42806931 +2.1,-0.02345212,-0.71040417,-0.12480799,-0.01011505,0.04757865,0.10347055,0.13577915,0.16723645,0.19733806,0.22620832,0.25454209,0.28241604,0.31023706,0.33793591,0.36537642,0.39210751,0.41815286,0.44323329,0.46554539 +2.2,0.04080456,0.04226858,-0.00078258,0.01048593,0.05762617,0.11188833,0.14459982,0.17659737,0.20787331,0.23848516,0.26902316,0.29876896,0.32841727,0.36007475,0.39038007,0.42062969,0.44952508,0.47982482,0.51122804 +2.3,-0.00060695,0.00780579,0.03477412,0.03449414,0.04893474,0.10802297,0.14912835,0.18036347,0.21372361,0.24592588,0.27777672,0.31122163,0.34693402,0.37919576,0.41359103,0.44954674,0.48620949,0.516638,0.55516713 diff --git a/Detector/DetCRD/compact/CRD_o1_v01/Bz.csv b/Detector/DetCRD/compact/CRD_o1_v01/Bz.csv new file mode 100644 index 0000000000000000000000000000000000000000..3bcbdca0c9c212075ef7617e929717a4fdb854ae --- /dev/null +++ b/Detector/DetCRD/compact/CRD_o1_v01/Bz.csv @@ -0,0 +1,25 @@ +,0,0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,1,1.1,1.2,1.3,1.4,1.5,1.6,1.7,1.8 +0,2.98254375,2.98318937,2.98547167,2.98899442,2.99374132,2.99961886,3.00652732,3.01437409,3.02307982,3.03257973,3.0428217,3.05376278,3.06536515,3.07759241,3.09040663,3.10376663,3.11764635,3.1322132,3.14750674 +0.1,2.98109899,2.98175883,2.9840892,2.98767855,2.99250257,2.99845884,3.00544098,3.01335272,3.02211376,3.0316603,3.04194227,3.05291904,3.06455505,3.07681584,3.08966473,3.10306094,3.11695014,3.13125837,3.14695687 +0.2,2.97669588,2.97740238,2.97988968,2.98369431,2.98876474,2.99496905,3.00217997,3.01029042,3.0192184,3.02890417,3.03930467,3.05038681,3.06212207,3.07448198,3.08743474,3.10094015,3.11494236,3.12912079,3.14515215 +0.3,2.96910905,2.96990752,2.97270436,2.97692716,2.98246308,2.98912314,2.99674135,3.00519553,3.01440385,3.02431862,3.03491123,3.0461631,3.05805801,3.07057825,3.08370024,3.09739453,3.11161525,3.12652478,3.14114769 +0.4,2.95790006,2.95886479,2.96221313,2.96717546,2.97349577,2.98087865,2.98913349,2.99809283,3.00769228,3.01791665,3.02876844,3.04024247,3.05234864,3.06508339,3.07843296,3.09237751,3.1069152,3.12198926,3.1366115 +0.5,2.94243158,2.94347691,2.94786359,2.95411488,2.96176669,2.97015463,2.97940277,2.98902944,2.99913374,3.00971108,3.02088486,3.03261413,3.04497303,3.05796775,3.07159454,3.08583906,3.10067846,3.1161207,3.13094287 +0.6,2.92094761,2.92246038,2.92872698,2.9372441,2.94699778,2.95714022,2.96764351,2.97814264,2.98880074,2.99976326,3.01127211,3.02326221,3.0359063,3.04919134,3.06313922,3.07773566,3.09292699,3.10868421,3.1244398 +0.7,2.89064164,2.89309777,2.9030216,2.91587173,2.92916445,2.94201055,2.95415218,2.96563002,2.9767351,2.98808544,2.9999004,3.01215538,3.02512561,3.03869621,3.05301365,3.06801461,3.083694,3.09974359,3.11559875 +0.8,2.84359314,2.84976659,2.86839028,2.88886517,2.90865565,2.92572711,2.93949461,2.95160087,2.96318284,2.97471894,2.98673052,2.99929833,3.0125135,3.02643358,3.04114725,3.05661202,3.0727791,3.09005281,3.10558271 +0.9,2.79377195,2.79484734,2.81169347,2.8555578,2.88918856,2.90960141,2.9241453,2.93657548,2.94802672,2.95977126,2.97171818,2.98454606,2.99799764,3.01233191,3.02743736,3.04343022,3.06021239,3.07737665,3.09574487 +1,2.0535586,2.54472074,2.74173407,2.84947422,2.876516,2.89449246,2.90861048,2.92050954,2.9315521,2.94296308,2.95492102,2.96770859,2.98154662,2.99619258,3.01179073,3.02837584,3.04580913,3.06404436,3.08274544 +1.1,-0.03347429,2.28387737,2.78580819,2.85570683,2.87165377,2.8817725,2.89303944,2.90344406,2.91357043,2.92442137,2.93585694,2.94880619,2.96290759,2.97791834,2.99404928,3.01129936,3.029572,3.04881589,3.06767787 +1.2,-2.83937519,2.87734798,3.02485748,2.86942174,2.86874145,2.87052332,2.87716174,2.88513562,2.89372698,2.90345868,2.91473407,2.9275138,2.94197698,2.95729219,2.97404537,2.99201004,3.01119216,3.03151131,3.05153552 +1.3,-3.69765888,2.58057627,3.02821863,2.88738109,2.86932003,2.86205042,2.86000272,2.86499069,2.87163865,2.87983486,2.89089361,2.90376024,2.91837852,2.93421113,2.95157652,2.97029736,2.99034153,3.01198579,3.03418575 +1.4,-3.79899166,-0.47892673,3.13566838,2.91113876,2.88664502,2.84969876,2.84019214,2.83916989,2.84528126,2.85343453,2.86393496,2.87724142,2.89200306,2.90843409,2.92645823,2.94600774,2.966883,2.98897154,3.01568605 +1.5,-3.81052656,-0.60812881,2.98139683,2.91195237,2.87195812,2.82828197,2.8136639,2.81063727,2.81562642,2.82350832,2.83437979,2.84756355,2.86266308,2.87963631,2.89854369,2.91897372,2.94096453,2.96348955,2.99259771 +1.6,-3.96050739,-0.7731603,3.12235101,2.8808503,2.84101603,2.80294502,2.78022688,2.77826142,2.78243026,2.79018237,2.80103121,2.81463616,2.83007497,2.84771231,2.86750718,2.88898777,2.91235399,2.93780291,2.96061481 +1.7,-4.02599445,-0.93592331,2.89647078,2.82089094,2.76282035,2.75353776,2.74261542,2.74084514,2.74476447,2.75288815,2.76418066,2.77796882,2.79422958,2.81248555,2.83298022,2.8557321,2.88049262,2.90786297,2.93134384 +1.8,-3.87968428,-0.83325284,2.86203808,2.75420373,2.70226483,2.70221165,2.69862684,2.6982541,2.70294435,2.71170193,2.72341528,2.73781958,2.75460121,2.77361869,2.79494731,2.8186598,2.84476997,2.87308853,2.9021298 +1.9,-3.14971335,-0.35968446,2.82790469,2.67604145,2.64888583,2.6528447,2.64851541,2.6516181,2.65730121,2.66681706,2.67899248,2.69393163,2.71110006,2.73084567,2.75300787,2.7776393,2.80500933,2.83419274,2.86793361 +2,-2.3023104,-0.22353596,2.61967494,2.5937405,2.59182482,2.59859145,2.59510427,2.60018043,2.60797762,2.61842573,2.63083054,2.64615837,2.66375681,2.68386971,2.70678236,2.73242961,2.76091048,2.79267313,2.82456839 +2.1,0.32933266,0.44186465,2.46969787,2.50079108,2.52435322,2.54190753,2.53942484,2.54601671,2.55516344,2.56649507,2.57916145,2.59453011,2.61225552,2.63264638,2.65596904,2.68241859,2.71217202,2.74579311,2.77807088 +2.2,0.19143149,0.203763,2.4800973,2.4492233,2.46665427,2.48551649,2.4810036,2.48932808,2.49926241,2.51088011,2.52425068,2.53911646,2.55651669,2.5767344,2.60032566,2.62728555,2.65755481,2.69306386,2.73026936 +2.3,0.02797829,0.28282052,2.44391037,2.41509089,2.41246836,2.41538895,2.42029371,2.42996001,2.44075216,2.45197615,2.46501328,2.48036927,2.49567035,2.51567342,2.53957983,2.56657511,2.59683019,2.6306168,2.67158842 diff --git a/Detector/DetCRD/compact/CRD_o1_v01/CRD_Dimensions_v01_01.xml b/Detector/DetCRD/compact/CRD_o1_v01/CRD_Dimensions_v01_01.xml index 5c0950c2a4d448764e77c7635e42ce7679631a9e..9a79f6fb8bd2883dfb4dc599a1ca1d4f49bf901e 100644 --- a/Detector/DetCRD/compact/CRD_o1_v01/CRD_Dimensions_v01_01.xml +++ b/Detector/DetCRD/compact/CRD_o1_v01/CRD_Dimensions_v01_01.xml @@ -69,7 +69,7 @@ <constant name="BeamPipe_Crotch_zmax" value="855*mm"/> <constant name="BeamPipe_FirstSeparated_zmax" value="1110*mm"/> <constant name="BeamPipe_SecondSeparated_zmax" value="2200*mm"/> - <constant name="BeamPipe_end_z" value="12*m"/> + <constant name="BeamPipe_end_z" value="7050*mm"/> <constant name="BeamPipe_Central_inner_radius" value="14*mm"/> <constant name="BeamPipe_Expanded_inner_radius" value="20*mm"/> @@ -82,6 +82,7 @@ <constant name="Vertex_inner_radius" value="BeamPipe_Central_inner_radius+BeamPipe_Be_total_thickness"/> <constant name="Vertex_outer_radius" value="101*mm"/> <constant name="Vertex_half_length" value="200*mm"/> + <constant name="Vertex_Side_rmin" value="BeamPipe_VertexRegion_rmax"/> <!-- Parameters of single drift chamber --> <constant name="DC_rbegin" value="800*mm"/> @@ -147,7 +148,7 @@ <constant name="Ecal_barrel_inner_radius" value="1860*mm"/><!--1900->1860, since 1900-2180 is range for symmetry=12, but now fixed as 8 in constructor code--> <constant name="Ecal_barrel_thickness" value="280*mm"/> <constant name="Ecal_barrel_outer_radius" value="(Ecal_barrel_inner_radius+Ecal_barrel_thickness)/cos(pi/8)"/> - <constant name="Ecal_barrel_half_length" value="3350*mm"/> + <constant name="Ecal_barrel_half_length" value="3300*mm"/> <constant name="Ecal_barrel_symmetry" value="8"/> <constant name="Ecal_endcap_inner_radius" value="350*mm"/> diff --git a/Detector/DetCRD/compact/CRD_o1_v01/CRD_o1_v01-onlyTracker-non.xml b/Detector/DetCRD/compact/CRD_o1_v01/CRD_o1_v01-onlyTracker-non.xml new file mode 100644 index 0000000000000000000000000000000000000000..11c283c6aca6b24a23d5c360a150b39d511c806f --- /dev/null +++ b/Detector/DetCRD/compact/CRD_o1_v01/CRD_o1_v01-onlyTracker-non.xml @@ -0,0 +1,46 @@ +<?xml version="1.0" encoding="UTF-8"?> +<lccdd xmlns:compact="http://www.lcsim.org/schemas/compact/1.0" + xmlns:xs="http://www.w3.org/2001/XMLSchema" + xs:noNamespaceSchemaLocation="http://www.lcsim.org/schemas/compact/1.0/compact.xsd"> + <info name="CRD_o1_v01" + title="CepC reference detctor with coil inside Hcal, pixel SIT/SET" + author="C.D.Fu, " + url="http://cepc.ihep.ac.cn" + status="developing" + version="v01"> + <comment>CepC reference detector simulation models used for detector study </comment> + </info> + + <includes> + <gdmlFile ref="${DD4hepINSTALL}/DDDetectors/compact/elements.xml"/> + <gdmlFile ref="../CRD_common_v01/materials.xml"/> + </includes> + + <define> + <constant name="world_size" value="25*m"/> + <constant name="world_x" value="world_size"/> + <constant name="world_y" value="world_size"/> + <constant name="world_z" value="world_size"/> + + <include ref="${DD4hepINSTALL}/DDDetectors/compact/detector_types.xml"/> + </define> + + <include ref="./CRD_Dimensions_v01_01.xml"/> + + <include ref="../CRD_common_v01/Beampipe_v01_01.xml"/> + <include ref="../CRD_common_v01/VXD_v01_01.xml"/> + <include ref="../CRD_common_v01/FTD_SkewRing_v01_01.xml"/> + <include ref="../CRD_common_v01/SIT_SimplePixel_v01_01.xml"/> + <include ref="../CRD_common_v01/DC_Simple_v01_02.xml"/> + <include ref="../CRD_common_v01/SET_SimplePixel_v01_01.xml"/> + + <fields> + <field name="Non-uniformFieldMap" type="GenericBFieldMapBrBz" lunit="m" bunit="tesla" + provider="file"> + <!--source url="Br=/tmp/lint/CEPCSW/Br.csv;Bz=/tmp/lint/CEPCSW/fieldmap.csv"/--> + <!--must include absolute path or relative to path to run job--> + <source url="Br=Detector/DetCRD/compact/CRD_o1_v01/Br1.csv;Bz=Detector/DetCRD/compact/CRD_o1_v01/Bz.csv"/> + </field> + </fields> + +</lccdd> diff --git a/Detector/DetCRD/compact/CRD_o1_v01/CRD_o1_v01-onlyTracker.xml b/Detector/DetCRD/compact/CRD_o1_v01/CRD_o1_v01-onlyTracker.xml index b4d34f857cad6ceb7b5de918c031c15f10a80de0..3ac63dc4b86b225ce8fbfe75d19e05f64eda90e3 100644 --- a/Detector/DetCRD/compact/CRD_o1_v01/CRD_o1_v01-onlyTracker.xml +++ b/Detector/DetCRD/compact/CRD_o1_v01/CRD_o1_v01-onlyTracker.xml @@ -13,7 +13,6 @@ <includes> <gdmlFile ref="${DD4hepINSTALL}/DDDetectors/compact/elements.xml"/> - <!--gdmlFile ref="../CRD_common_v01/materials-woIsotope.xml"/--> <gdmlFile ref="../CRD_common_v01/materials.xml"/> </includes> diff --git a/Detector/DetCRD/compact/CRD_o1_v02/CRD_Dimensions_v01_02.xml b/Detector/DetCRD/compact/CRD_o1_v02/CRD_Dimensions_v01_02.xml index 5c0950c2a4d448764e77c7635e42ce7679631a9e..9a79f6fb8bd2883dfb4dc599a1ca1d4f49bf901e 100644 --- a/Detector/DetCRD/compact/CRD_o1_v02/CRD_Dimensions_v01_02.xml +++ b/Detector/DetCRD/compact/CRD_o1_v02/CRD_Dimensions_v01_02.xml @@ -69,7 +69,7 @@ <constant name="BeamPipe_Crotch_zmax" value="855*mm"/> <constant name="BeamPipe_FirstSeparated_zmax" value="1110*mm"/> <constant name="BeamPipe_SecondSeparated_zmax" value="2200*mm"/> - <constant name="BeamPipe_end_z" value="12*m"/> + <constant name="BeamPipe_end_z" value="7050*mm"/> <constant name="BeamPipe_Central_inner_radius" value="14*mm"/> <constant name="BeamPipe_Expanded_inner_radius" value="20*mm"/> @@ -82,6 +82,7 @@ <constant name="Vertex_inner_radius" value="BeamPipe_Central_inner_radius+BeamPipe_Be_total_thickness"/> <constant name="Vertex_outer_radius" value="101*mm"/> <constant name="Vertex_half_length" value="200*mm"/> + <constant name="Vertex_Side_rmin" value="BeamPipe_VertexRegion_rmax"/> <!-- Parameters of single drift chamber --> <constant name="DC_rbegin" value="800*mm"/> @@ -147,7 +148,7 @@ <constant name="Ecal_barrel_inner_radius" value="1860*mm"/><!--1900->1860, since 1900-2180 is range for symmetry=12, but now fixed as 8 in constructor code--> <constant name="Ecal_barrel_thickness" value="280*mm"/> <constant name="Ecal_barrel_outer_radius" value="(Ecal_barrel_inner_radius+Ecal_barrel_thickness)/cos(pi/8)"/> - <constant name="Ecal_barrel_half_length" value="3350*mm"/> + <constant name="Ecal_barrel_half_length" value="3300*mm"/> <constant name="Ecal_barrel_symmetry" value="8"/> <constant name="Ecal_endcap_inner_radius" value="350*mm"/> diff --git a/Detector/DetCRD/compact/CRD_o1_v02/CRD_o1_v02-onlyEcalB.xml b/Detector/DetCRD/compact/CRD_o1_v02/CRD_o1_v02-onlyEcalB.xml new file mode 100644 index 0000000000000000000000000000000000000000..a2a65e6c52df05a938069bccfc9dd9038d590747 --- /dev/null +++ b/Detector/DetCRD/compact/CRD_o1_v02/CRD_o1_v02-onlyEcalB.xml @@ -0,0 +1,62 @@ +<?xml version="1.0" encoding="UTF-8"?> +<lccdd xmlns:compact="http://www.lcsim.org/schemas/compact/1.0" + xmlns:xs="http://www.w3.org/2001/XMLSchema" + xs:noNamespaceSchemaLocation="http://www.lcsim.org/schemas/compact/1.0/compact.xsd"> + <info name="CRD_o1_v02" + title="CepC reference detctor with coil inside Hcal, pixel SIT and strip SET" + author="C.D.Fu, " + url="http://cepc.ihep.ac.cn" + status="developing" + version="v02"> + <comment>CepC reference detector simulation models used for detector study </comment> + </info> + + <includes> + <gdmlFile ref="${DD4hepINSTALL}/DDDetectors/compact/elements.xml"/> + <gdmlFile ref="../CRD_common_v01/materials.xml"/> + </includes> + + <define> + <constant name="world_size" value="25*m"/> + <constant name="world_x" value="world_size"/> + <constant name="world_y" value="world_size"/> + <constant name="world_z" value="world_size"/> + + <include ref="${DD4hepINSTALL}/DDDetectors/compact/detector_types.xml"/> + </define> + + <include ref="./CRD_Dimensions_v01_02.xml"/> + + <!--include ref="../CRD_common_v01/Beampipe_v01_01.xml"/> + <include ref="../CRD_common_v01/VXD_v01_01.xml"/> + <include ref="../CRD_common_v01/FTD_SkewRing_v01_01.xml"/> + <include ref="../CRD_common_v01/SIT_SimplePixel_v01_01.xml"/> + <include ref="../CRD_common_v01/DC_Simple_v01_02.xml"/> + <include ref="../CRD_common_v01/SET_SimplePlanar_v01_01.xml"/--> + <include ref="../CRD_common_v01/Ecal_Crystal_Barrel_v01_01.xml"/> + <!--include ref="../CRD_common_v01/Ecal_Crystal_Endcap_v01_01.xml"/--> + <!--include ref="../CRD_common_v01/Coil_Simple_v01_01.xml"/> + <include ref="../CRD_common_v01/Hcal_Rpc_Barrel_v01_01.xml"/> + <include ref="../CRD_common_v01/Hcal_Rpc_Endcaps_v01_01.xml"/> + <include ref="../CRD_common_v01/Yoke_Barrel_v01_01.xml"/> + <include ref="../CRD_common_v01/Yoke_Endcaps_v01_01.xml"/--> + <!--include ref="../CRD_common_v01/Lcal_v01_01.xml"/--> + + <fields> + <field name="InnerSolenoid" type="solenoid" + inner_field="Field_nominal_value" + outer_field="0" + zmax="SolenoidCoil_half_length" + inner_radius="SolenoidCoil_center_radius" + outer_radius="Solenoid_outer_radius"> + </field> + <field name="OuterSolenoid" type="solenoid" + inner_field="0" + outer_field="Field_outer_nominal_value" + zmax="SolenoidCoil_half_length" + inner_radius="Solenoid_outer_radius" + outer_radius="Yoke_barrel_inner_radius"> + </field> + </fields> + +</lccdd> diff --git a/Detector/DetCRD/compact/CRD_o1_v03/CRD_Dimensions_v01_03.xml b/Detector/DetCRD/compact/CRD_o1_v03/CRD_Dimensions_v01_03.xml new file mode 100644 index 0000000000000000000000000000000000000000..ed08613cb930c93d9a67bdd0365dbe7fb3a1b57e --- /dev/null +++ b/Detector/DetCRD/compact/CRD_o1_v03/CRD_Dimensions_v01_03.xml @@ -0,0 +1,273 @@ +<?xml version="1.0" encoding="UTF-8"?> +<lccdd xmlns:compact="http://www.lcsim.org/schemas/compact/1.0" + xmlns:xs="http://www.w3.org/2001/XMLSchema" + xs:noNamespaceSchemaLocation="http://www.lcsim.org/schemas/compact/1.0/compact.xsd"> + + <info name="CRDDimensions" + title="master file with includes and world dimension" + author="C.D.Fu, Mengyao Liu" + url="no" + status="development" + version="1.0"> + <comment> + undeterminded parameters + </comment> + </info> + + <define> + <constant name="CrossingAngle" value="0.033*rad"/> + + <constant name="Global_endcap_costheta" value="0.99"/> + + <constant name="GlobalTrackerReadoutID_DCH" type="string" value="system:8,chamber:1,layer:7,phi:16"/> + <constant name="GlobalTrackerReadoutID" type="string" value="system:5,side:-2,layer:9,module:8,sensor:8,barrelside:-2"/> + + <constant name="Field_nominal_value" value="3*tesla"/> + <constant name="Field_outer_nominal_value" value="-1.3*tesla"/> + + <constant name="env_safety" value="0.1*mm"/> + + <constant name="DetID_NOTUSED" value=" 0"/> + <constant name="DetID_VXD" value=" 1"/> + <constant name="DetID_SIT" value=" 2"/> + <constant name="DetID_FTD" value=" 3"/> + <constant name="DetID_TPC" value=" 4"/> + <constant name="DetID_SET" value=" 5"/> + <constant name="DetID_ETD" value=" 6"/> + <constant name="DetID_DC" value=" 4"/> <!--in order to cheat Clupatra, same as TPC--> + + <constant name="DetID_ECAL" value=" 20"/> + <constant name="DetID_ECAL_PLUG" value=" 21"/> + <constant name="DetID_HCAL" value=" 22"/> + <constant name="DetID_HCAL_RING" value=" 23"/> + <constant name="DetID_LCAL" value=" 24"/> + <constant name="DetID_BCAL" value=" 25"/> + <constant name="DetID_LHCAL" value=" 26"/> + <constant name="DetID_YOKE" value=" 27"/> + <constant name="DetID_COIL" value=" 28"/> + <constant name="DetID_ECAL_ENDCAP" value=" 29"/> + <constant name="DetID_HCAL_ENDCAP" value=" 30"/> + <constant name="DetID_YOKE_ENDCAP" value=" 31"/> + + <constant name="DetID_bwd" value="-1"/> + <constant name="DetID_barrel" value=" 0"/> + <constant name="DetID_fwd" value="+1"/> + + <constant name="BeamPipe_Be_inner_thickness" value="0.5*mm"/> + <constant name="BeamPipe_Cooling_thickness" value="0.5*mm"/> + <constant name="BeamPipe_Be_outer_thickness" value="0.3*mm"/> + <constant name="BeamPipe_Be_total_thickness" value="BeamPipe_Be_inner_thickness+BeamPipe_Cooling_thickness+BeamPipe_Be_outer_thickness"/> + <constant name="BeamPipe_Al_thickness" value="BeamPipe_Be_total_thickness"/> + <constant name="BeamPipe_Cu_thickness" value="2.0*mm"/> + + <constant name="BeamPipe_CentralBe_zmax" value="120*mm"/> + <constant name="BeamPipe_CentralAl_zmax" value="205*mm"/> + <constant name="BeamPipe_ConeAl_zmax" value="655*mm"/> + <constant name="BeamPipe_LinkerAl_zmax" value="700*mm"/> + <constant name="BeamPipe_LinkerCu_zmax" value="780*mm"/> + <constant name="BeamPipe_Waist_zmax" value="805*mm"/> + <constant name="BeamPipe_Crotch_zmax" value="855*mm"/> + <constant name="BeamPipe_FirstSeparated_zmax" value="1110*mm"/> + <constant name="BeamPipe_SecondSeparated_zmax" value="2200*mm"/> + <constant name="BeamPipe_end_z" value="7050*mm"/> + + <constant name="BeamPipe_Central_inner_radius" value="14*mm"/> + <constant name="BeamPipe_Expanded_inner_radius" value="20*mm"/> + <constant name="BeamPipe_Upstream_inner_radius" value="6*mm"/> + <constant name="BeamPipe_Dnstream_inner_radius" value="10*mm"/> + <constant name="BeamPipe_Crotch_hole_height" value="30.67*mm"/> + <constant name="BeamPipe_VertexRegion_rmax" value="BeamPipe_Central_inner_radius+BeamPipe_Al_thickness"/> + <constant name="BeamPipe_ForwardRegion_rmax" value="BeamPipe_Expanded_inner_radius+BeamPipe_Cu_thickness"/> + + <constant name="Vertex_inner_radius" value="BeamPipe_Central_inner_radius+BeamPipe_Be_total_thickness"/> + <constant name="Vertex_outer_radius" value="101*mm"/> + <constant name="Vertex_half_length" value="205*mm"/> + <constant name="Vertex_Side_rmin" value="BeamPipe_VertexRegion_rmax"/> + + <constant name="DC_Endcap_dz" value="0.1*mm"/> + <constant name="DC_half_length" value="2980*mm" /> + <constant name="DC_safe_distance" value="0.02*mm"/> + <constant name="SDT_inner_wall_thickness" value="0.2*mm"/> + <constant name="SDT_outer_wall_thickness" value="2.8*mm"/> + <constant name="MainTracker_half_length" value="DC_half_length+DC_Endcap_dz" /> + + <!--obselete for single drift chamber--> + <constant name="InnerTracker_half_length" value="DC_half_length" /> + <constant name="InnerTracker_inner_radius" value="234*mm"/> + <constant name="InnerTracker_outer_radius" value="909*mm"/> + <constant name="OuterTracker_half_length" value="DC_half_length"/> + <constant name="OuterTracker_inner_radius" value="1082.18*mm"/> + <constant name="OuterTracker_outer_radius" value="1723*mm"/> + + <!-- Parameters of single drift chamber --> + <constant name="DC_chamber_layer_rbegin" value="800*mm"/> + <constant name="DC_chamber_layer_rend" value="1800*mm"/> + + <constant name="DC_inner_radius" value="DC_chamber_layer_rbegin-SDT_inner_wall_thickness-DC_safe_distance"/> + <constant name="DC_outer_radius" value="DC_chamber_layer_rend+SDT_outer_wall_thickness+DC_safe_distance"/> + + <constant name="SIT1_inner_radius" value="230*mm"/> + <constant name="SIT2_inner_radius" value="410*mm"/> + <constant name="SIT3_inner_radius" value="590*mm"/> + <constant name="SIT4_inner_radius" value="770*mm"/> + <constant name="SIT1_half_length" value="461*mm"/> + <constant name="SIT2_half_length" value="691*mm"/> + <constant name="SIT3_half_length" value="1013*mm"/> + <constant name="SIT4_half_length" value="1335*mm"/> + + <constant name="SET_inner_radius" value="1815*mm"/> + + <constant name="SiTracker_barrel_endcap_gap" value="5*mm"/> + <constant name="SiTracker_DC_endcap_gap" value="10*mm"/> + <constant name="SiTracker_endcap_z1" value="SIT1_half_length+SiTracker_barrel_endcap_gap"/> + <constant name="SiTracker_endcap_z2" value="SIT2_half_length+SiTracker_barrel_endcap_gap"/> + <constant name="SiTracker_endcap_z3" value="SIT3_half_length+SiTracker_barrel_endcap_gap"/> + <constant name="SiTracker_endcap_z4" value="SIT4_half_length+SiTracker_barrel_endcap_gap"/> + <constant name="SiTracker_endcap_z5" value="MainTracker_half_length+SiTracker_DC_endcap_gap"/> + <constant name="SiTracker_endcap_outer_radius1" value="SIT1_inner_radius+SiTracker_barrel_endcap_gap"/> + <constant name="SiTracker_endcap_outer_radius2" value="SIT2_inner_radius+SiTracker_barrel_endcap_gap"/> + <constant name="SiTracker_endcap_outer_radius3" value="SIT3_inner_radius+SiTracker_barrel_endcap_gap"/> + <constant name="SiTracker_endcap_outer_radius4" value="SIT4_inner_radius+SiTracker_barrel_endcap_gap"/> + <constant name="SiTracker_endcap_outer_radius5" value="SET_inner_radius+SiTracker_barrel_endcap_gap"/> + <!--obseleted --> + <constant name="FTD_BeamPipe_cable_clearance" value="10*mm"/> + <constant name="FTD_BeamPipe_gap" value="15*mm"/> + <constant name="FTD_InnerTracker_gap" value="5*mm"/> + + <!--obseleted constance, used by old construct, should be removed while creating new constrcut--> + <constant name="TPC_Ecal_Hcal_barrel_halfZ" value="MainTracker_half_length"/> + <constant name="TPC_inner_radius" value="InnerTracker_inner_radius"/> + <constant name="TPC_outer_radius" value="OuterTracker_outer_radius"/> + <constant name="SIT1_Radius" value="SIT1_inner_radius"/> + <constant name="SIT1_Half_Length_Z" value="SIT1_half_length"/> + <constant name="SIT2_Radius" value="InnerTracker_inner_radius"/> <!--fake, used by FTD_Simple_Staggered and FTD_cepc, now should be determined by inner tracker--> + <constant name="SIT2_Half_Length_Z" value="SIT2_half_length"/> + <constant name="TUBE_IPOuterTube_end_z" value="BeamPipe_CentralAl_zmax"/> + <constant name="TUBE_IPOuterTube_end_radius" value="BeamPipe_Central_inner_radius+BeamPipe_Al_thickness"/> + <constant name="TUBE_IPOuterBulge_end_z" value="BeamPipe_Crotch_zmax"/><!--"BeamPipe_ConeAl_zmax"/--> + <constant name="TUBE_IPOuterBulge_end_radius" value="BeamPipe_Crotch_zmax*tan(CrossingAngle/2)+BeamPipe_Dnstream_inner_radius+BeamPipe_Cu_thickness"/> + <!--"BeamPipe_Expanded_inner_radius+BeamPipe_Al_thickness+5*mm"/--> + + <constant name="Ecal_barrel_inner_radius" value="1860*mm"/><!--1900->1860, since 1900-2180 is range for symmetry=12, but now fixed as 8 in constructor code--> + <constant name="Ecal_barrel_thickness" value="280*mm"/> + <constant name="Ecal_barrel_outer_radius" value="(Ecal_barrel_inner_radius+Ecal_barrel_thickness)/cos(pi/8)"/> + <constant name="Ecal_barrel_half_length" value="3300*mm"/> + <constant name="Ecal_barrel_symmetry" value="8"/> + + <constant name="Ecal_endcap_inner_radius" value="350*mm"/> + <constant name="Ecal_endcap_outer_radius" value="Ecal_barrel_inner_radius+Ecal_barrel_thickness"/> + <constant name="Ecal_endcap_zmin" value="3050*mm"/> + <constant name="Ecal_endcap_zmax" value="3350*mm"/> + <constant name="Ecal_endcap_symmetry" value="8"/> + <!--obseleted constance, used by old construct, should be removed while creating new constrcut--> + <constant name="EcalEndcap_outer_radius" value="Ecal_barrel_outer_radius"/> + + <constant name="Solenoid_inner_radius" value="2330*mm"/> + <constant name="Solenoid_outer_radius" value="2480*mm"/> + <constant name="Solenoid_half_length" value="3830*mm"/> + <constant name="SolenoidCoil_half_length" value="3800*mm"/> + <constant name="SolenoidCoil_radius" value="2351*mm"/> + <constant name="SolenoidCoil_center_radius" value="(Solenoid_inner_radius+Solenoid_outer_radius)/2"/> + + <constant name="Hcal_barrel_inner_radius" value="2530*mm"/> + <constant name="Hcal_barrel_outer_radius" value="3610*mm"/> + <constant name="Hcal_barrel_half_length" value="4480*mm"/> + <constant name="Hcal_barrel_symmetry" value="12"/> + + <constant name="Hcal_endcap_inner_radius" value="400*mm"/> + <constant name="Hcal_endcap_outer_radius" value="Ecal_barrel_outer_radius"/> + <constant name="Hcal_endcap_zmin" value="3400*mm"/> + <constant name="Hcal_endcap_zmax" value="4480*mm"/> + <constant name="Hcal_endcap_symmetry" value="12"/> + <!--obseleted constance, used by old construct, should be removed while creating new constrcut--> + <constant name="HcalEndcap_max_z" value="Hcal_endcap_zmax"/> + <constant name="Hcal_endcap_outer_symmetry" value="Hcal_endcap_symmetry"/> + <constant name="Hcal_outer_radius" value="Hcal_endcap_outer_radius"/> + + <!--constant name="Hcal_ring_inner_radius" value="Hcal_endcap_inner_radius"/> + <constant name="Hcal_ring_outer_radius" value="Solenoid_inner_radius"/> + <constant name="Hcal_ring_zmin" value="2600*mm"/> + <constant name="Hcal_ring_zmax" value="Hcal_endcap_zmin-10*mm"/> + <constant name="Hcal_ring_symmetry" value="8"/--> + + <constant name="Yoke_barrel_inner_radius" value="3660*mm"/> + <constant name="Yoke_barrel_outer_radius" value="4260*mm"/> + <constant name="Yoke_barrel_half_length" value="Hcal_endcap_zmax"/> + <constant name="Yoke_barrel_symmetry" value="12"/> + + <constant name="Yoke_endcap_inner_radius" value="400*mm"/> + <constant name="Yoke_endcap_outer_radius" value="Yoke_barrel_outer_radius"/> + <constant name="Yoke_endcap_zmin" value="4660*mm"/> + <constant name="Yoke_endcap_zmax" value="5460*mm"/> + <constant name="Yoke_endcap_outer_symmetry" value="Yoke_barrel_symmetry"/> + <constant name="Yoke_endcap_inner_symmetry" value="0"/> + <!--obseleted constance, used by old construct, should be removed while creating new constrcut--> + <constant name="Yoke_Z_start_endcaps" value="Yoke_endcap_zmin"/> + + <!--constant name="LumiCal_zmax" value="805*mm" /> + <constant name="LumiCal_zmin" value="700*mm"/> + <constant name="LumiCal_thickness" value="(LumiCal_zmax-LumiCal_zmin)/2.0"/> + <constant name="LumiCal_inner_radius" value="35.0*mm"/> + <constant name="LumiCal_outer_radius" value="100.0*mm- env_safety"/--> + + <constant name="tracker_region_zmax" value="OuterTracker_half_length"/> + <constant name="tracker_region_rmax" value="OuterTracker_outer_radius"/> + + </define> + + <limits> + <limitset name="cal_limits"> + <limit name="step_length_max" particles="*" value="5.0" unit="mm" /> + </limitset> + <limitset name="dc_limits"> + <limit name="step_length_max" particles="*" value="10.0" unit="mm" /> + </limitset> + <limitset name="tracker_limits"> + <limit name="step_length_max" particles="*" value="5.0" unit="mm" /> + </limitset> + </limits> + + <regions> + <region name="BeampipeRegion"/> + <region name="VertexRegion"/> + <region name="ForwardRegion"/> + </regions> + + <display> + <vis name="VXDVis" alpha="0.1" r="0.1" g=".5" b=".5" showDaughters="true" visible="true"/> + <vis name="VXDLayerVis" alpha="1.0" r="0.1" g=".5" b=".5" showDaughters="true" visible="true"/> + <vis name="VXDSupportVis" alpha="1.0" r="0.0" g="1.0" b="0.0" showDaughters="true" visible="true"/> + <vis name="FTDVis" alpha="1.0" r="0.5" g="0.87" b="0.11" showDaughters="true" visible="true"/> + <vis name="FTDSupportVis" alpha="1.0" r="0.3" g="0.3" b="1.0" showDaughters="true" visible="true"/> + <vis name="FTDSensitiveVis" alpha="1.0" r="0.3" g="0.5" b="1.0" showDaughters="true" visible="true"/> + <vis name="DCVis" alpha="1.0" r="0.96" g="0.64" b="0.90" showDaughters="true" visible="true"/> + <vis name="DCLayerVis" alpha="1.0" r="0.96" g="0.64" b="0.90" showDaughters="false" visible="true"/> + <vis name="SITVis" alpha="0.0" r="0.54" g="0.59" b="0.93" showDaughters="true" visible="false"/> + <vis name="SITSupportVis" alpha="1.0" r="0.0" g="0.0" b="1.0" showDaughters="false" visible="true"/> + <vis name="SITSensitiveVis" alpha="1.0" r="0.67" g="0.99" b="0.78" showDaughters="false" visible="true"/> + <vis name="SETVis" alpha="0.0" r="0.8" g="0.8" b="0.4" showDaughters="true" visible="false"/> + <vis name="SETSupportVis" alpha="1.0" r="1.0" g="0.0" b="0.0" showDaughters="true" visible="true"/> + <vis name="SETSensitiveVis" alpha="1.0" r="0.0" g="0.0" b="1.0" showDaughters="true" visible="true"/> + <vis name="ECALVis" alpha="1.0" r="0.2" g="0.6" b="0" showDaughters="true" visible="true"/> + <vis name="HCALVis" alpha="1.0" r="0.95" g="0.78" b="0.69" showDaughters="true" visible="true"/> + <vis name="SOLVis" alpha="1.0" r="0.4" g="0.4" b="0.4" showDaughters="true" visible="true"/> + <vis name="YOKEVis" alpha="1.0" r="0.64" g="0.75" b="0.99" showDaughters="false" visible="true"/> + <vis name="LCALVis" alpha="1.0" r="0.25" g="0.88" b="0.81" showDaughters="true" visible="true"/> + <vis name="SupportVis" alpha="1.0" r="0.2" g="0.2" b="0.2" showDaughters="true" visible="true"/> + <vis name="ShellVis" alpha="1.0" r="0.83" g="0.55" b="0.89" showDaughters="false" visible="true"/> + + <vis name="WhiteVis" alpha="0.0" r=".96" g=".96" b=".96" showDaughters="true" visible="true"/> + <vis name="LightGrayVis" alpha="0.0" r=".75" g=".75" b=".75" showDaughters="true" visible="true"/> + <vis name="Invisible" alpha="0.0" r="0.0" g="0.0" b="0.0" showDaughters="false" visible="false"/> + <vis name="SeeThrough" alpha="0.0" r="0.0" g="0.0" b="0.0" showDaughters="true" visible="false"/> + <vis name="RedVis" alpha="1.0" r="1.0" g="0.0" b="0.0" showDaughters="true" visible="true"/> + <vis name="GreenVis" alpha="1.0" r="0.0" g="1.0" b="0.0" showDaughters="true" visible="true"/> + <vis name="BlueVis" alpha="1.0" r="0.0" g="0.0" b="1.0" showDaughters="true" visible="true"/> + <vis name="CyanVis" alpha="1.0" r="0.0" g="1.0" b="1.0" showDaughters="true" visible="true"/> + <vis name="MagentaVis" alpha="1.0" r="1.0" g="0.0" b="1.0" showDaughters="true" visible="true"/> + <vis name="YellowVis" alpha="1.0" r="1.0" g="1.0" b="0.0" showDaughters="true" visible="true"/> + <vis name="BlackVis" alpha="1.0" r="0.0" g="0.0" b="0.0" showDaughters="true" visible="true"/> + <vis name="GrayVis" alpha="1.0" r="0.5" g="0.5" b="0.5" showDaughters="true" visible="true"/> + </display> + +</lccdd> diff --git a/Detector/DetCRD/compact/CRD_o1_v03/CRD_o1_v03-onlyTracker.xml b/Detector/DetCRD/compact/CRD_o1_v03/CRD_o1_v03-onlyTracker.xml new file mode 100644 index 0000000000000000000000000000000000000000..cc30d11b38cb9b01e91cee5245c89220b80a0f7f --- /dev/null +++ b/Detector/DetCRD/compact/CRD_o1_v03/CRD_o1_v03-onlyTracker.xml @@ -0,0 +1,55 @@ +<?xml version="1.0" encoding="UTF-8"?> +<lccdd xmlns:compact="http://www.lcsim.org/schemas/compact/1.0" + xmlns:xs="http://www.w3.org/2001/XMLSchema" + xs:noNamespaceSchemaLocation="http://www.lcsim.org/schemas/compact/1.0/compact.xsd"> + <info name="CRD_o1_v03" + title="CepC reference detctor with coil inside Hcal, pixel SIT/SET" + author="C.D.Fu, " + url="http://cepc.ihep.ac.cn" + status="developing" + version="v03"> + <comment>CepC reference detector simulation models used for detector study </comment> + </info> + + <includes> + <gdmlFile ref="${DD4hepINSTALL}/DDDetectors/compact/elements.xml"/> + <gdmlFile ref="../CRD_common_v01/materials.xml"/> + <gdmlFile ref="../materials.xml"/> + </includes> + + <define> + <constant name="world_size" value="25*m"/> + <constant name="world_x" value="world_size"/> + <constant name="world_y" value="world_size"/> + <constant name="world_z" value="world_size"/> + + <include ref="${DD4hepINSTALL}/DDDetectors/compact/detector_types.xml"/> + </define> + + <include ref="./CRD_Dimensions_v01_03.xml"/> + + <include ref="../CRD_common_v01/Beampipe_v01_01.xml"/> + <include ref="../CRD_common_v01/VXD_StaggeredLadder_v01_01.xml"/> + <include ref="../CRD_common_v01/FTD_SkewRing_v01_01.xml"/> + <include ref="../CRD_common_v01/SIT_SimplePixel_v01_01.xml"/> + <include ref="../CRD_common_v01/DC_Simple_v01_02.xml"/> + <include ref="../CRD_common_v01/SET_SimplePixel_v01_01.xml"/> + + <fields> + <field name="InnerSolenoid" type="solenoid" + inner_field="Field_nominal_value" + outer_field="0" + zmax="SolenoidCoil_half_length" + inner_radius="SolenoidCoil_center_radius" + outer_radius="Solenoid_outer_radius"> + </field> + <field name="OuterSolenoid" type="solenoid" + inner_field="0" + outer_field="Field_outer_nominal_value" + zmax="SolenoidCoil_half_length" + inner_radius="Solenoid_outer_radius" + outer_radius="Yoke_barrel_inner_radius"> + </field> + </fields> + +</lccdd> diff --git a/Detector/DetCRD/compact/CRD_o1_v03/CRD_o1_v03-onlyVXD.xml b/Detector/DetCRD/compact/CRD_o1_v03/CRD_o1_v03-onlyVXD.xml index 44eb691c033035b07cf8d0a435fe8defdeac4014..5ccc266975b9a577a4d902f89a022081c6225e8d 100644 --- a/Detector/DetCRD/compact/CRD_o1_v03/CRD_o1_v03-onlyVXD.xml +++ b/Detector/DetCRD/compact/CRD_o1_v03/CRD_o1_v03-onlyVXD.xml @@ -2,12 +2,12 @@ <lccdd xmlns:compact="http://www.lcsim.org/schemas/compact/1.0" xmlns:xs="http://www.w3.org/2001/XMLSchema" xs:noNamespaceSchemaLocation="http://www.lcsim.org/schemas/compact/1.0/compact.xsd"> - <info name="CRD_o1_v02" + <info name="CRD_o1_v03" title="CepC reference detctor with coil inside Hcal, pixel SIT and strip SET" author="Hao Zeng" url="http://cepc.ihep.ac.cn" status="developing" - version="v01"> + version="v03"> <comment>CepC reference detector simulation models used for detector study </comment> </info> @@ -26,7 +26,7 @@ <include ref="${DD4hepINSTALL}/DDDetectors/compact/detector_types.xml"/> </define> - <include ref="../CRD_o1_v02/CRD_Dimensions_v01_02.xml"/> + <include ref="./CRD_Dimensions_v01_03.xml"/> <include ref="../CRD_common_v01/VXD_StaggeredLadder_v01_01.xml"/> diff --git a/Detector/DetCRD/compact/CRD_o1_v03/CRD_o1_v03.xml b/Detector/DetCRD/compact/CRD_o1_v03/CRD_o1_v03.xml new file mode 100644 index 0000000000000000000000000000000000000000..79eea6dcf5d048ace369f3bd3c300d5b8ce04340 --- /dev/null +++ b/Detector/DetCRD/compact/CRD_o1_v03/CRD_o1_v03.xml @@ -0,0 +1,62 @@ +<?xml version="1.0" encoding="UTF-8"?> +<lccdd xmlns:compact="http://www.lcsim.org/schemas/compact/1.0" + xmlns:xs="http://www.w3.org/2001/XMLSchema" + xs:noNamespaceSchemaLocation="http://www.lcsim.org/schemas/compact/1.0/compact.xsd"> + <info name="CRD_o1_v03" + title="CepC reference detctor with coil inside Hcal, pixel SIT/SET" + author="C.D.Fu, " + url="http://cepc.ihep.ac.cn" + status="developing" + version="v03"> + <comment>CepC reference detector simulation models used for detector study </comment> + </info> + + <includes> + <gdmlFile ref="${DD4hepINSTALL}/DDDetectors/compact/elements.xml"/> + <gdmlFile ref="../CRD_common_v01/materials.xml"/> + </includes> + + <define> + <constant name="world_size" value="25*m"/> + <constant name="world_x" value="world_size"/> + <constant name="world_y" value="world_size"/> + <constant name="world_z" value="world_size"/> + + <include ref="${DD4hepINSTALL}/DDDetectors/compact/detector_types.xml"/> + </define> + + <include ref="./CRD_Dimensions_v01_03.xml"/> + + <include ref="../CRD_common_v01/Beampipe_v01_01.xml"/> + <include ref="../CRD_common_v01/VXD_StaggeredLadder_v01_01.xml"/> + <include ref="../CRD_common_v01/FTD_SkewRing_v01_01.xml"/> + <include ref="../CRD_common_v01/SIT_SimplePixel_v01_01.xml"/> + <include ref="../CRD_common_v01/DC_Simple_v01_02.xml"/> + <include ref="../CRD_common_v01/SET_SimplePixel_v01_01.xml"/> + <include ref="../CRD_common_v01/Ecal_Crystal_Barrel_v01_01.xml"/> + <!--include ref="../CRD_common_v01/Ecal_Crystal_Endcap_v01_01.xml"/--> + <include ref="../CRD_common_v01/Coil_Simple_v01_01.xml"/> + <include ref="../CRD_common_v01/Hcal_Rpc_Barrel_v01_01.xml"/> + <include ref="../CRD_common_v01/Hcal_Rpc_Endcaps_v01_01.xml"/> + <include ref="../CRD_common_v01/Yoke_Barrel_v01_01.xml"/> + <include ref="../CRD_common_v01/Yoke_Endcaps_v01_01.xml"/> + <!--include ref="../CRD_common_v01/Lcal_v01_01.xml"/--> + + <fields> + <field name="InnerSolenoid" type="solenoid" + inner_field="Field_nominal_value" + outer_field="0" + zmax="SolenoidCoil_half_length" + inner_radius="SolenoidCoil_center_radius" + outer_radius="Solenoid_outer_radius"> + </field> + <field name="OuterSolenoid" type="solenoid" + inner_field="0" + outer_field="Field_outer_nominal_value" + zmax="SolenoidCoil_half_length" + inner_radius="Solenoid_outer_radius" + outer_radius="Yoke_barrel_inner_radius"> + </field> + </fields> + +</lccdd> diff --git a/Detector/DetCRD/compact/CRD_o1_v04/CRD_Dimensions_v01_04.xml b/Detector/DetCRD/compact/CRD_o1_v04/CRD_Dimensions_v01_04.xml new file mode 100644 index 0000000000000000000000000000000000000000..d1e188653170c137c04f42f68457dfd7eb00c219 --- /dev/null +++ b/Detector/DetCRD/compact/CRD_o1_v04/CRD_Dimensions_v01_04.xml @@ -0,0 +1,281 @@ +<?xml version="1.0" encoding="UTF-8"?> +<lccdd xmlns:compact="http://www.lcsim.org/schemas/compact/1.0" + xmlns:xs="http://www.w3.org/2001/XMLSchema" + xs:noNamespaceSchemaLocation="http://www.lcsim.org/schemas/compact/1.0/compact.xsd"> + + <info name="CRDDimensions" + title="master file with includes and world dimension" + author="C.D.Fu, Mengyao Liu" + url="no" + status="development" + version="1.0"> + <comment> + undeterminded parameters + </comment> + </info> + + <define> + <constant name="CrossingAngle" value="0.033*rad"/> + + <constant name="Global_endcap_costheta" value="0.99"/> + + <constant name="GlobalTrackerReadoutID_DCH" type="string" value="system:8,chamber:1,layer:7,phi:16"/> + <constant name="GlobalTrackerReadoutID" type="string" value="system:5,side:-2,layer:9,module:8,sensor:8,barrelside:-2"/> + + <constant name="Field_nominal_value" value="3*tesla"/> + <constant name="Field_outer_nominal_value" value="-1.3*tesla"/> + + <constant name="env_safety" value="0.1*mm"/> + + <constant name="DetID_NOTUSED" value=" 0"/> + <constant name="DetID_VXD" value=" 1"/> + <constant name="DetID_SIT" value=" 2"/> + <constant name="DetID_FTD" value=" 3"/> + <constant name="DetID_TPC" value=" 4"/> + <constant name="DetID_SET" value=" 5"/> + <constant name="DetID_ETD" value=" 6"/> + <constant name="DetID_DC" value=" 4"/> <!--in order to cheat Clupatra, same as TPC--> + + <constant name="DetID_ECAL" value=" 20"/> + <constant name="DetID_ECAL_PLUG" value=" 21"/> + <constant name="DetID_HCAL" value=" 22"/> + <constant name="DetID_HCAL_RING" value=" 23"/> + <constant name="DetID_LCAL" value=" 24"/> + <constant name="DetID_BCAL" value=" 25"/> + <constant name="DetID_LHCAL" value=" 26"/> + <constant name="DetID_YOKE" value=" 27"/> + <constant name="DetID_COIL" value=" 28"/> + <constant name="DetID_ECAL_ENDCAP" value=" 29"/> + <constant name="DetID_HCAL_ENDCAP" value=" 30"/> + <constant name="DetID_YOKE_ENDCAP" value=" 31"/> + + <constant name="DetID_bwd" value="-1"/> + <constant name="DetID_barrel" value=" 0"/> + <constant name="DetID_fwd" value="+1"/> + + <constant name="BeamPipe_Be_inner_thickness" value="0.2*mm"/> + <constant name="BeamPipe_Cooling_thickness" value="0.35*mm"/> + <constant name="BeamPipe_Be_outer_thickness" value="0.15*mm"/> + <constant name="BeamPipe_Be_total_thickness" value="BeamPipe_Be_inner_thickness+BeamPipe_Cooling_thickness+BeamPipe_Be_outer_thickness"/> + <constant name="BeamPipe_Al_thickness" value="BeamPipe_Be_total_thickness"/> + <constant name="BeamPipe_Cu_thickness" value="4.0*mm"/> + + <constant name="BeamPipe_CentralBe_zmax" value="85*mm"/> + <constant name="BeamPipe_CentralAl_zmax" value="180*mm"/> + <constant name="BeamPipe_ExpandAl_zmax" value="655*mm"/> + <constant name="BeamPipe_Linker_zmin" value="700*mm"/> + <constant name="BeamPipe_Linker_zmax" value="780*mm"/> + <constant name="BeamPipe_Waist_zmax" value="805*mm"/> + <constant name="BeamPipe_Crotch_zmax" value="855*mm"/> + <constant name="BeamPipe_FirstSeparated_zmax" value="1110*mm"/> + <constant name="BeamPipe_Mask_zmin" value="1210*mm"/> + <constant name="BeamPipe_Mask_zmax" value="1230*mm"/> + <constant name="BeamPipe_SecondSeparated_zmax" value="2200*mm"/> + <constant name="BeamPipe_end_z" value="7050*mm"/> + + <constant name="BeamPipe_Central_inner_radius" value="10*mm"/> + <constant name="BeamPipe_Fork_inner_radius" value="10*mm"/> + <constant name="BeamPipe_FirstExpand_width" value="35*mm"/> + <constant name="BeamPipe_SecondExpand_width" value="39*mm"/> + <constant name="BeamPipe_Mask_inner_radius" value="6*mm"/> + <constant name="BeamPipe_VertexRegion_rmax" value="BeamPipe_Central_inner_radius+BeamPipe_Al_thickness"/> + <constant name="BeamPipe_FrontLinker_rmax" value="BeamPipe_FirstExpand_width/2+BeamPipe_Al_thickness"/> + <constant name="BeamPipe_ForwardRegion_rmax" value="BeamPipe_SecondExpand_width/2+BeamPipe_Cu_thickness"/> + + <constant name="Vertex_inner_radius" value="BeamPipe_Central_inner_radius+BeamPipe_Be_total_thickness"/> + <constant name="Vertex_outer_radius" value="70*mm"/> + <constant name="Vertex_half_length" value="200*mm"/> + <constant name="Vertex_Side_rmin" value="BeamPipe_VertexRegion_rmax+(BeamPipe_FrontLinker_rmax-BeamPipe_VertexRegion_rmax)/(BeamPipe_ExpandAl_zmax-BeamPipe_CentralAl_zmax) + *(Vertex_half_length-BeamPipe_CentralAl_zmax)"/> + + <constant name="DC_Endcap_dz" value="0.1*mm"/> + <constant name="DC_half_length" value="2980*mm" /> + <constant name="DC_safe_distance" value="0.02*mm"/> + <constant name="SDT_inner_wall_thickness" value="0.2*mm"/> + <constant name="SDT_outer_wall_thickness" value="2.8*mm"/> + <constant name="MainTracker_half_length" value="DC_half_length+DC_Endcap_dz" /> + + <!--obselete for single drift chamber--> + <constant name="InnerTracker_half_length" value="DC_half_length" /> + <constant name="InnerTracker_inner_radius" value="234*mm"/> + <constant name="InnerTracker_outer_radius" value="909*mm"/> + <constant name="OuterTracker_half_length" value="DC_half_length"/> + <constant name="OuterTracker_inner_radius" value="1082.18*mm"/> + <constant name="OuterTracker_outer_radius" value="1723*mm"/> + + <!-- Parameters of single drift chamber --> + <constant name="DC_chamber_layer_rbegin" value="1000*mm"/> + <constant name="DC_chamber_layer_rend" value="1800*mm"/> + + <constant name="DC_inner_radius" value="DC_chamber_layer_rbegin-SDT_inner_wall_thickness-DC_safe_distance"/> + <constant name="DC_outer_radius" value="DC_chamber_layer_rend+SDT_outer_wall_thickness+DC_safe_distance"/> + + <constant name="SIT1_inner_radius" value="150*mm"/> + <constant name="SIT2_inner_radius" value="350*mm"/> + <constant name="SIT4_inner_radius" value="DC_chamber_layer_rbegin-30*mm"/> + <constant name="SIT3_inner_radius" value="0.5*(SIT2_inner_radius+SIT4_inner_radius)"/> + <constant name="SIT1_half_length" value="461*mm"/> + <constant name="SIT2_half_length" value="691*mm"/> + <constant name="SIT3_half_length" value="1013*mm"/> + <constant name="SIT4_half_length" value="1335*mm"/> + + <constant name="SET_inner_radius" value="1815*mm"/> + + <constant name="SiTracker_barrel_endcap_gap" value="5*mm"/> + <constant name="SiTracker_DC_endcap_gap" value="10*mm"/> + <constant name="SiTracker_endcap_z1" value="Vertex_half_length+SiTracker_barrel_endcap_gap"/> + <constant name="SiTracker_endcap_z2" value="SiTracker_endcap_z1+100*mm"/> + <constant name="SiTracker_endcap_z3" value="SIT1_half_length+SiTracker_barrel_endcap_gap"/> + <constant name="SiTracker_endcap_z4" value="SIT2_half_length+SiTracker_barrel_endcap_gap"/> + <constant name="SiTracker_endcap_z5" value="SIT3_half_length+SiTracker_barrel_endcap_gap"/> + <constant name="SiTracker_endcap_z6" value="SIT4_half_length+SiTracker_barrel_endcap_gap"/> + <constant name="SiTracker_endcap_z7" value="MainTracker_half_length+SiTracker_DC_endcap_gap"/> + <constant name="SiTracker_endcap_outer_radius1" value="SIT1_inner_radius"/> + <constant name="SiTracker_endcap_outer_radius2" value="SIT1_inner_radius"/> + <constant name="SiTracker_endcap_outer_radius3" value="SIT1_inner_radius+SiTracker_barrel_endcap_gap"/> + <constant name="SiTracker_endcap_outer_radius4" value="SIT2_inner_radius+SiTracker_barrel_endcap_gap"/> + <constant name="SiTracker_endcap_outer_radius5" value="SIT3_inner_radius+SiTracker_barrel_endcap_gap"/> + <constant name="SiTracker_endcap_outer_radius6" value="SIT4_inner_radius+SiTracker_barrel_endcap_gap"/> + <constant name="SiTracker_endcap_outer_radius7" value="SET_inner_radius+SiTracker_barrel_endcap_gap"/> + <!--obseleted --> + <constant name="FTD_BeamPipe_cable_clearance" value="10*mm"/> + <constant name="FTD_BeamPipe_gap" value="15*mm"/> + <constant name="FTD_InnerTracker_gap" value="5*mm"/> + + <!--obseleted constance, used by old construct, should be removed while creating new constrcut--> + <constant name="TPC_Ecal_Hcal_barrel_halfZ" value="MainTracker_half_length"/> + <constant name="TPC_inner_radius" value="InnerTracker_inner_radius"/> + <constant name="TPC_outer_radius" value="OuterTracker_outer_radius"/> + <constant name="SIT1_Radius" value="SIT1_inner_radius"/> + <constant name="SIT1_Half_Length_Z" value="SIT1_half_length"/> + <constant name="SIT2_Radius" value="InnerTracker_inner_radius"/> <!--fake, used by FTD_Simple_Staggered and FTD_cepc, now should be determined by inner tracker--> + <constant name="SIT2_Half_Length_Z" value="SIT2_half_length"/> + <constant name="TUBE_IPOuterTube_end_z" value="BeamPipe_CentralAl_zmax"/> + <constant name="TUBE_IPOuterTube_end_radius" value="BeamPipe_Central_inner_radius+BeamPipe_Al_thickness"/> + <constant name="TUBE_IPOuterBulge_end_z" value="BeamPipe_Crotch_zmax"/><!--"BeamPipe_ConeAl_zmax"/--> + <!--constant name="TUBE_IPOuterBulge_end_radius" value="BeamPipe_Crotch_zmax*tan(CrossingAngle/2)+BeamPipe_Dnstream_inner_radius+BeamPipe_Cu_thickness"/--> + <!--"BeamPipe_Expanded_inner_radius+BeamPipe_Al_thickness+5*mm"/--> + + <constant name="Ecal_barrel_inner_radius" value="1860*mm"/><!--1900->1860, since 1900-2180 is range for symmetry=12, but now fixed as 8 in constructor code--> + <constant name="Ecal_barrel_thickness" value="280*mm"/> + <constant name="Ecal_barrel_outer_radius" value="(Ecal_barrel_inner_radius+Ecal_barrel_thickness)/cos(pi/8)"/> + <constant name="Ecal_barrel_half_length" value="3300*mm"/> + <constant name="Ecal_barrel_symmetry" value="8"/> + + <constant name="Ecal_endcap_inner_radius" value="350*mm"/> + <constant name="Ecal_endcap_outer_radius" value="Ecal_barrel_inner_radius+Ecal_barrel_thickness"/> + <constant name="Ecal_endcap_zmin" value="3050*mm"/> + <constant name="Ecal_endcap_zmax" value="3350*mm"/> + <constant name="Ecal_endcap_symmetry" value="8"/> + <!--obseleted constance, used by old construct, should be removed while creating new constrcut--> + <constant name="EcalEndcap_outer_radius" value="Ecal_barrel_outer_radius"/> + + <constant name="Solenoid_inner_radius" value="2330*mm"/> + <constant name="Solenoid_outer_radius" value="2480*mm"/> + <constant name="Solenoid_half_length" value="3830*mm"/> + <constant name="SolenoidCoil_half_length" value="3800*mm"/> + <constant name="SolenoidCoil_radius" value="2351*mm"/> + <constant name="SolenoidCoil_center_radius" value="(Solenoid_inner_radius+Solenoid_outer_radius)/2"/> + + <constant name="Hcal_barrel_inner_radius" value="2530*mm"/> + <constant name="Hcal_barrel_outer_radius" value="3610*mm"/> + <constant name="Hcal_barrel_half_length" value="4480*mm"/> + <constant name="Hcal_barrel_symmetry" value="12"/> + + <constant name="Hcal_endcap_inner_radius" value="400*mm"/> + <constant name="Hcal_endcap_outer_radius" value="Ecal_barrel_outer_radius"/> + <constant name="Hcal_endcap_zmin" value="3400*mm"/> + <constant name="Hcal_endcap_zmax" value="4480*mm"/> + <constant name="Hcal_endcap_symmetry" value="12"/> + <!--obseleted constance, used by old construct, should be removed while creating new constrcut--> + <constant name="HcalEndcap_max_z" value="Hcal_endcap_zmax"/> + <constant name="Hcal_endcap_outer_symmetry" value="Hcal_endcap_symmetry"/> + <constant name="Hcal_outer_radius" value="Hcal_endcap_outer_radius"/> + + <!--constant name="Hcal_ring_inner_radius" value="Hcal_endcap_inner_radius"/> + <constant name="Hcal_ring_outer_radius" value="Solenoid_inner_radius"/> + <constant name="Hcal_ring_zmin" value="2600*mm"/> + <constant name="Hcal_ring_zmax" value="Hcal_endcap_zmin-10*mm"/> + <constant name="Hcal_ring_symmetry" value="8"/--> + + <constant name="Yoke_barrel_inner_radius" value="3660*mm"/> + <constant name="Yoke_barrel_outer_radius" value="4260*mm"/> + <constant name="Yoke_barrel_half_length" value="Hcal_endcap_zmax"/> + <constant name="Yoke_barrel_symmetry" value="12"/> + + <constant name="Yoke_endcap_inner_radius" value="400*mm"/> + <constant name="Yoke_endcap_outer_radius" value="Yoke_barrel_outer_radius"/> + <constant name="Yoke_endcap_zmin" value="4660*mm"/> + <constant name="Yoke_endcap_zmax" value="5460*mm"/> + <constant name="Yoke_endcap_outer_symmetry" value="Yoke_barrel_symmetry"/> + <constant name="Yoke_endcap_inner_symmetry" value="0"/> + <!--obseleted constance, used by old construct, should be removed while creating new constrcut--> + <constant name="Yoke_Z_start_endcaps" value="Yoke_endcap_zmin"/> + + <!--constant name="LumiCal_zmax" value="805*mm" /> + <constant name="LumiCal_zmin" value="700*mm"/> + <constant name="LumiCal_thickness" value="(LumiCal_zmax-LumiCal_zmin)/2.0"/> + <constant name="LumiCal_inner_radius" value="35.0*mm"/> + <constant name="LumiCal_outer_radius" value="100.0*mm- env_safety"/--> + + <constant name="tracker_region_zmax" value="OuterTracker_half_length"/> + <constant name="tracker_region_rmax" value="OuterTracker_outer_radius"/> + + </define> + + <limits> + <limitset name="cal_limits"> + <limit name="step_length_max" particles="*" value="5.0" unit="mm" /> + </limitset> + <limitset name="dc_limits"> + <limit name="step_length_max" particles="*" value="10.0" unit="mm" /> + </limitset> + <limitset name="tracker_limits"> + <limit name="step_length_max" particles="*" value="5.0" unit="mm" /> + </limitset> + </limits> + + <regions> + <region name="BeampipeRegion"/> + <region name="VertexRegion"/> + <region name="ForwardRegion"/> + </regions> + + <display> + <vis name="VXDVis" alpha="0.1" r="0.1" g=".5" b=".5" showDaughters="true" visible="true"/> + <vis name="VXDLayerVis" alpha="1.0" r="0.1" g=".5" b=".5" showDaughters="true" visible="true"/> + <vis name="VXDSupportVis" alpha="1.0" r="0.0" g="1.0" b="0.0" showDaughters="true" visible="true"/> + <vis name="FTDVis" alpha="1.0" r="0.5" g="0.87" b="0.11" showDaughters="true" visible="true"/> + <vis name="FTDSupportVis" alpha="1.0" r="0.3" g="0.3" b="1.0" showDaughters="true" visible="true"/> + <vis name="FTDSensitiveVis" alpha="1.0" r="0.3" g="0.5" b="1.0" showDaughters="true" visible="true"/> + <vis name="DCVis" alpha="1.0" r="0.96" g="0.64" b="0.90" showDaughters="true" visible="true"/> + <vis name="DCLayerVis" alpha="1.0" r="0.96" g="0.64" b="0.90" showDaughters="false" visible="true"/> + <vis name="SITVis" alpha="0.0" r="0.54" g="0.59" b="0.93" showDaughters="true" visible="false"/> + <vis name="SITSupportVis" alpha="1.0" r="0.0" g="0.0" b="1.0" showDaughters="false" visible="true"/> + <vis name="SITSensitiveVis" alpha="1.0" r="0.67" g="0.99" b="0.78" showDaughters="false" visible="true"/> + <vis name="SETVis" alpha="0.0" r="0.8" g="0.8" b="0.4" showDaughters="true" visible="false"/> + <vis name="SETSupportVis" alpha="1.0" r="1.0" g="0.0" b="0.0" showDaughters="true" visible="true"/> + <vis name="SETSensitiveVis" alpha="1.0" r="0.0" g="0.0" b="1.0" showDaughters="true" visible="true"/> + <vis name="ECALVis" alpha="1.0" r="0.2" g="0.6" b="0" showDaughters="true" visible="true"/> + <vis name="HCALVis" alpha="1.0" r="0.95" g="0.78" b="0.69" showDaughters="true" visible="true"/> + <vis name="SOLVis" alpha="1.0" r="0.4" g="0.4" b="0.4" showDaughters="true" visible="true"/> + <vis name="YOKEVis" alpha="1.0" r="0.64" g="0.75" b="0.99" showDaughters="false" visible="true"/> + <vis name="LCALVis" alpha="1.0" r="0.25" g="0.88" b="0.81" showDaughters="true" visible="true"/> + <vis name="SupportVis" alpha="1.0" r="0.2" g="0.2" b="0.2" showDaughters="true" visible="true"/> + <vis name="ShellVis" alpha="1.0" r="0.82" g="0.59" b="0.36" showDaughters="false" visible="true"/> + + <vis name="WhiteVis" alpha="0.0" r=".96" g=".96" b=".96" showDaughters="true" visible="true"/> + <vis name="LightGrayVis" alpha="0.0" r=".75" g=".75" b=".75" showDaughters="true" visible="true"/> + <vis name="Invisible" alpha="0.0" r="0.0" g="0.0" b="0.0" showDaughters="false" visible="false"/> + <vis name="SeeThrough" alpha="0.0" r="0.0" g="0.0" b="0.0" showDaughters="true" visible="false"/> + <vis name="RedVis" alpha="1.0" r="1.0" g="0.0" b="0.0" showDaughters="true" visible="true"/> + <vis name="GreenVis" alpha="1.0" r="0.0" g="1.0" b="0.0" showDaughters="true" visible="true"/> + <vis name="BlueVis" alpha="1.0" r="0.0" g="0.0" b="1.0" showDaughters="true" visible="true"/> + <vis name="CyanVis" alpha="1.0" r="0.0" g="1.0" b="1.0" showDaughters="true" visible="true"/> + <vis name="MagentaVis" alpha="1.0" r="1.0" g="0.0" b="1.0" showDaughters="true" visible="true"/> + <vis name="YellowVis" alpha="1.0" r="1.0" g="1.0" b="0.0" showDaughters="true" visible="true"/> + <vis name="BlackVis" alpha="1.0" r="0.0" g="0.0" b="0.0" showDaughters="true" visible="true"/> + <vis name="GrayVis" alpha="1.0" r="0.5" g="0.5" b="0.5" showDaughters="true" visible="true"/> + </display> + +</lccdd> diff --git a/Detector/DetCRD/compact/CRD_o1_v04/CRD_o1_v04-onlyTracker.xml b/Detector/DetCRD/compact/CRD_o1_v04/CRD_o1_v04-onlyTracker.xml new file mode 100644 index 0000000000000000000000000000000000000000..ececd6165bbf2b9217bd005dc0bba4f980da37e2 --- /dev/null +++ b/Detector/DetCRD/compact/CRD_o1_v04/CRD_o1_v04-onlyTracker.xml @@ -0,0 +1,54 @@ +<?xml version="1.0" encoding="UTF-8"?> +<lccdd xmlns:compact="http://www.lcsim.org/schemas/compact/1.0" + xmlns:xs="http://www.w3.org/2001/XMLSchema" + xs:noNamespaceSchemaLocation="http://www.lcsim.org/schemas/compact/1.0/compact.xsd"> + <info name="CRD_o1_v04" + title="CepC reference detctor with coil inside Hcal, pixel SIT/SET" + author="C.D.Fu, " + url="http://cepc.ihep.ac.cn" + status="developing" + version="v04"> + <comment>CepC reference detector simulation models used for detector study </comment> + </info> + + <includes> + <gdmlFile ref="${DD4hepINSTALL}/DDDetectors/compact/elements.xml"/> + <gdmlFile ref="../CRD_common_v01/materials.xml"/> + </includes> + + <define> + <constant name="world_size" value="25*m"/> + <constant name="world_x" value="world_size"/> + <constant name="world_y" value="world_size"/> + <constant name="world_z" value="world_size"/> + + <include ref="${DD4hepINSTALL}/DDDetectors/compact/detector_types.xml"/> + </define> + + <include ref="./CRD_Dimensions_v01_04.xml"/> + + <include ref="../CRD_common_v01/Beampipe_v01_02.xml"/> + <include ref="../CRD_common_v01/VXD_v01_03.xml"/> + <include ref="../CRD_common_v01/FTD_SkewRing_v01_03.xml"/> + <include ref="../CRD_common_v01/SIT_SimplePixel_v01_01.xml"/> + <include ref="../CRD_common_v01/DC_Simple_v01_02.xml"/> + <include ref="../CRD_common_v01/SET_SimplePixel_v01_01.xml"/> + + <fields> + <field name="InnerSolenoid" type="solenoid" + inner_field="Field_nominal_value" + outer_field="0" + zmax="SolenoidCoil_half_length" + inner_radius="SolenoidCoil_center_radius" + outer_radius="Solenoid_outer_radius"> + </field> + <field name="OuterSolenoid" type="solenoid" + inner_field="0" + outer_field="Field_outer_nominal_value" + zmax="SolenoidCoil_half_length" + inner_radius="Solenoid_outer_radius" + outer_radius="Yoke_barrel_inner_radius"> + </field> + </fields> + +</lccdd> diff --git a/Detector/DetCRD/compact/CRD_o1_v04/CRD_o1_v04.xml b/Detector/DetCRD/compact/CRD_o1_v04/CRD_o1_v04.xml new file mode 100644 index 0000000000000000000000000000000000000000..1804d93a39d5f90048721b6fb21f83fcd6e82c84 --- /dev/null +++ b/Detector/DetCRD/compact/CRD_o1_v04/CRD_o1_v04.xml @@ -0,0 +1,61 @@ +<?xml version="1.0" encoding="UTF-8"?> +<lccdd xmlns:compact="http://www.lcsim.org/schemas/compact/1.0" + xmlns:xs="http://www.w3.org/2001/XMLSchema" + xs:noNamespaceSchemaLocation="http://www.lcsim.org/schemas/compact/1.0/compact.xsd"> + <info name="CRD_o1_v04" + title="CepC reference detctor with coil inside Hcal, pixel SIT/SET" + author="C.D.Fu, " + url="http://cepc.ihep.ac.cn" + status="developing" + version="v04"> + <comment>CepC reference detector simulation models used for detector study </comment> + </info> + + <includes> + <gdmlFile ref="${DD4hepINSTALL}/DDDetectors/compact/elements.xml"/> + <gdmlFile ref="../CRD_common_v01/materials.xml"/> + </includes> + + <define> + <constant name="world_size" value="25*m"/> + <constant name="world_x" value="world_size"/> + <constant name="world_y" value="world_size"/> + <constant name="world_z" value="world_size"/> + + <include ref="${DD4hepINSTALL}/DDDetectors/compact/detector_types.xml"/> + </define> + + <include ref="./CRD_Dimensions_v01_04.xml"/> + + <include ref="../CRD_common_v01/Beampipe_v01_02.xml"/> + <include ref="../CRD_common_v01/VXD_v01_03.xml"/> + <include ref="../CRD_common_v01/FTD_SkewRing_v01_03.xml"/> + <include ref="../CRD_common_v01/SIT_SimplePixel_v01_01.xml"/> + <include ref="../CRD_common_v01/DC_Simple_v01_02.xml"/> + <include ref="../CRD_common_v01/SET_SimplePixel_v01_01.xml"/> + <include ref="../CRD_common_v01/Ecal_Crystal_Barrel_v01_01.xml"/> + <!--include ref="../CRD_common_v01/Ecal_Crystal_Endcap_v01_01.xml"/--> + <include ref="../CRD_common_v01/Coil_Simple_v01_01.xml"/> + <include ref="../CRD_common_v01/Hcal_Rpc_Barrel_v01_01.xml"/> + <include ref="../CRD_common_v01/Hcal_Rpc_Endcaps_v01_01.xml"/> + <include ref="../CRD_common_v01/Yoke_Barrel_v01_01.xml"/> + <include ref="../CRD_common_v01/Yoke_Endcaps_v01_01.xml"/> + + <fields> + <field name="InnerSolenoid" type="solenoid" + inner_field="Field_nominal_value" + outer_field="0" + zmax="SolenoidCoil_half_length" + inner_radius="SolenoidCoil_center_radius" + outer_radius="Solenoid_outer_radius"> + </field> + <field name="OuterSolenoid" type="solenoid" + inner_field="0" + outer_field="Field_outer_nominal_value" + zmax="SolenoidCoil_half_length" + inner_radius="Solenoid_outer_radius" + outer_radius="Yoke_barrel_inner_radius"> + </field> + </fields> + +</lccdd> diff --git a/Detector/DetCRD/compact/README.md b/Detector/DetCRD/compact/README.md index f4a0aefb6796ed3cdeafb1b7aeb84d24cf32ed3a..0ef4c00fa60d35c805202947751e8a82338f343c 100644 --- a/Detector/DetCRD/compact/README.md +++ b/Detector/DetCRD/compact/README.md @@ -5,7 +5,9 @@ The following CRD detector models are available in CEPCSW | Model | Description | MainTracker | Ecal | Hcal | Status | | ------------- | -----------------------------|------------ |---------|------|----------------| | CRD_o1_v01 | coil inside simulation model | SIT+DC+SET | crystal | RPC | developing | -| CRD_o1_v02 | pixel SET | SIT+DC+SET | crystal | RPC | developing | +| CRD_o1_v02 | strip SET | SIT+DC+SET | crystal | RPC | developing | +| CRD_o1_v03 | MOST2 vertex | SIT+DC+SET | crystal | RPC | developing | +| CRD_o1_v04 | smaller center beam pipe | SIT+DC+SET | crystal | RPC | developing | | ------------- | -----------------------------|-------------|---------|------|----------------| ## Details @@ -47,3 +49,15 @@ The following CRD detector models are available in CEPCSW - strip SET: double layers - compact files: - [./CRD_o1_v02/CRD_o1_v02.xml](./CRD_o1_v02/CRD_o1_v02.xml) + +### CRD_o1_v03 (to update) + - based on CRD_o1_v01 + - MOST2 vertex + - compact files: + - [./CRD_o1_v03/CRD_o1_v03.xml](./CRD_o1_v03/CRD_o1_v03.xml) + +### CRD_o1_v04 (to update) + - based on CRD_o1_v01 + - smaller center beam pipe & new MDI: inner radius = 10mm, flat at y direction + - compact files: + - [./CRD_o1_v04/CRD_o1_v04.xml](./CRD_o1_v04/CRD_o1_v04.xml) diff --git a/Detector/DetCRD/scripts/CRD-Sim.py b/Detector/DetCRD/scripts/CRD-Sim.py index 0e734b785f0c6442b320bc75e43c3d10472bc8a5..e658c12772b0d2a8e304055eafae7ad1e5c7a56f 100644 --- a/Detector/DetCRD/scripts/CRD-Sim.py +++ b/Detector/DetCRD/scripts/CRD-Sim.py @@ -1,4 +1,6 @@ #!/usr/bin/env python +import os + from Gaudi.Configuration import * from Configurables import k4DataSvc diff --git a/Detector/DetCRD/scripts/CRD_VXD_MOST2-sim.py b/Detector/DetCRD/scripts/CRD_VXD_MOST2-sim.py index 5d595621af36d9284d9ac4e1f78adf85c0838f5d..cb3ceeb761e542e1cf6e43c2a469db62a0feac3f 100644 --- a/Detector/DetCRD/scripts/CRD_VXD_MOST2-sim.py +++ b/Detector/DetCRD/scripts/CRD_VXD_MOST2-sim.py @@ -1,4 +1,6 @@ #!/usr/bin/env python +import os + from Gaudi.Configuration import * from Configurables import k4DataSvc diff --git a/Detector/DetCRD/scripts/CRD_o1_v01-SimRec.py b/Detector/DetCRD/scripts/CRD_o1_v01-SimRec.py index 19836013be8fcc3b1dcbcd6993473de64b1a0ba5..52a6209da65917bb7ced0acacc15d198fee15973 100644 --- a/Detector/DetCRD/scripts/CRD_o1_v01-SimRec.py +++ b/Detector/DetCRD/scripts/CRD_o1_v01-SimRec.py @@ -1,6 +1,10 @@ #!/usr/bin/env python +import os + from Gaudi.Configuration import * +NTupleSvc().Output = ["MyTuples DATAFILE='test.root' OPT='NEW' TYP='ROOT'"] + from Configurables import k4DataSvc dsvc = k4DataSvc("EventDataSvc") @@ -125,6 +129,10 @@ digiVXD.TrackerHitCollection = vxdhitname digiVXD.ResolutionU = [0.0028, 0.006, 0.004, 0.004, 0.004, 0.004] digiVXD.ResolutionV = [0.0028, 0.006, 0.004, 0.004, 0.004, 0.004] digiVXD.UsePlanarTag = True +# if Parameterized spatial resolution, set ParameterizeResolution to True +digiVXD.ParameterizeResolution = False +digiVXD.ParametersU = [5.60959e-03, 5.74913e-03, 7.03433e-03, 1.99516, -663.952, 3.752e-03, 0, -0.0704734, 0.0454867e-03, 1.07359] +digiVXD.ParametersV = [5.60959e-03, 5.74913e-03, 7.03433e-03, 1.99516, -663.952, 3.752e-03, 0, -0.0704734, 0.0454867e-03, 1.07359] #digiVXD.OutputLevel = DEBUG digiSIT = PlanarDigiAlg("SITDigi") @@ -135,6 +143,10 @@ digiSIT.TrackerHitAssociationCollection = "SITTrackerHitAssociation" digiSIT.ResolutionU = [0.0072] digiSIT.ResolutionV = [0.086] digiSIT.UsePlanarTag = True +# if Parameterized spatial resolution, set ParameterizeResolution to True +digiSIT.ParameterizeResolution = False +digiSIT.ParametersU = [2.29655e-03, 0.965899e-03, 0.584699e-03, 17.0856, 84.566, 12.4695e-03, -0.0643059, 0.168662, 1.87998e-03, 0.514452] +digiSIT.ParametersV = [1.44629e-02, 2.20108e-03, 1.03044e-02, 4.39195e+00, 3.29641e+00, 1.55167e+18, -5.41954e+01, 5.72986e+00, -6.80699e-03, 5.04095e-01] #digiSIT.OutputLevel = DEBUG digiSET = PlanarDigiAlg("SETDigi") @@ -145,6 +157,10 @@ digiSET.TrackerHitAssociationCollection = "SETTrackerHitAssociation" digiSET.ResolutionU = [0.0072] digiSET.ResolutionV = [0.086] digiSET.UsePlanarTag = True +# if Parameterized spatial resolution, set ParameterizeResolution to True +digiSET.ParameterizeResolution = False +digiSET.ParametersU = [2.29655e-03, 0.965899e-03, 0.584699e-03, 17.0856, 84.566, 12.4695e-03, -0.0643059, 0.168662, 1.87998e-03, 0.514452] +digiSET.ParametersV = [1.44629e-02, 2.20108e-03, 1.03044e-02, 4.39195e+00, 3.29641e+00, 1.55167e+18, -5.41954e+01, 5.72986e+00, -6.80699e-03, 5.04095e-01] #digiSET.OutputLevel = DEBUG digiFTD = PlanarDigiAlg("FTDDigi") @@ -155,11 +171,17 @@ digiFTD.TrackerHitAssociationCollection = "FTDTrackerHitAssociation" digiFTD.ResolutionU = [0.003, 0.003, 0.0072, 0.0072, 0.0072, 0.0072, 0.0072] digiFTD.ResolutionV = [0.003, 0.003, 0.0072, 0.0072, 0.0072, 0.0072, 0.0072] digiFTD.UsePlanarTag = True +# if Parameterized spatial resolution, set ParameterizeResolution to True +digiFTD.ParameterizeResolution = False +digiFTD.ParametersU = [2.29655e-03, 0.965899e-03, 0.584699e-03, 17.0856, 84.566, 12.4695e-03, -0.0643059, 0.168662, 1.87998e-03, 0.514452] +digiFTD.ParametersV = [1.44629e-02, 2.20108e-03, 1.03044e-02, 4.39195e+00, 3.29641e+00, 1.55167e+18, -5.41954e+01, 5.72986e+00, -6.80699e-03, 5.04095e-01] #digiFTD.OutputLevel = DEBUG from Configurables import DCHDigiAlg digiDC = DCHDigiAlg("DCHDigi") digiDC.DigiDCHitCollection = dchitname +# TODO: DCHDigiAlg need fixed, only WriteAna = True can run +digiDC.WriteAna = True #digiDC.OutputLevel = DEBUG # two strip tracker hits -> one space point diff --git a/Detector/DetCRD/scripts/CRD_o1_v02-SimRec.py b/Detector/DetCRD/scripts/CRD_o1_v02-SimRec.py index 253ea21a71125f20f9216094dd2071e2fdd950e4..05844c9f8d5e2a2e94ae13349a12dda57d0cfcc2 100644 --- a/Detector/DetCRD/scripts/CRD_o1_v02-SimRec.py +++ b/Detector/DetCRD/scripts/CRD_o1_v02-SimRec.py @@ -1,6 +1,10 @@ #!/usr/bin/env python +import os + from Gaudi.Configuration import * +NTupleSvc().Output = ["MyTuples DATAFILE='test.root' OPT='NEW' TYP='ROOT'"] + from Configurables import k4DataSvc dsvc = k4DataSvc("EventDataSvc") @@ -160,6 +164,8 @@ digiFTD.UsePlanarTag = True from Configurables import DCHDigiAlg digiDC = DCHDigiAlg("DCHDigi") digiDC.DigiDCHitCollection = dchitname +# TODO: DCHDigiAlg need fixed, only WriteAna = True can run +digiDC.WriteAna = True #digiDC.OutputLevel = DEBUG # two strip tracker hits -> one space point diff --git a/Detector/DetCRD/scripts/Standalone-Sim-RotCrystal.py b/Detector/DetCRD/scripts/Standalone-Sim-RotCrystal.py index 1386affd7623cda211e7d1d8f983fa749b26b9f3..c2d88fdebb76f8b3a70d029979009f2bc2212365 100644 --- a/Detector/DetCRD/scripts/Standalone-Sim-RotCrystal.py +++ b/Detector/DetCRD/scripts/Standalone-Sim-RotCrystal.py @@ -1,4 +1,6 @@ #!/usr/bin/env python +import os + from Gaudi.Configuration import * from Configurables import k4DataSvc diff --git a/Detector/DetCRD/src/Calorimeter/CRDEcal_v01.cpp b/Detector/DetCRD/src/Calorimeter/CRDEcal_v01.cpp index 4ba45b249f46c9bd815ac60b21f3a32f385a51cf..e161fedfafc3c2c98902508b69bdea1b0deae759 100644 --- a/Detector/DetCRD/src/Calorimeter/CRDEcal_v01.cpp +++ b/Detector/DetCRD/src/Calorimeter/CRDEcal_v01.cpp @@ -46,29 +46,33 @@ static dd4hep::Ref_t create_detector(dd4hep::Detector& theDetector, double Z0 = theDetector.constant<double>("ecalbarrel_zlength"); double barx = theDetector.constant<double>("bar_x"); //Crystal size in R direction. double bary = theDetector.constant<double>("bar_y"); //Crystal size in z/phi direction (z for odd layer, phi for even layer). - - double dim_x1 = R0*tan(22.5*degree) + sqrt(2)*h0/2.; - double dim_x2 = dim_x1 - h0; + //int Nsymm = theDetector.constant<int>("n_symm"); //Only support 8 and 12 now. + //double rotAngle = 360./Nsymm; + int Nsymm = 8; //Only support 8 and 12 now. + double rotAngle = 45.; + + double dim_x1 = R0*tan(rotAngle*degree/2.) + h0/(2.*sin(rotAngle*degree)); + double dim_x2 = dim_x1 - h0/tan(rotAngle*degree); double dim_y = Z0/2.; double dim_z = h0/2.; - double dx = dim_x1 - R0*tan(22.5*degree); //transport distance in x-axis - double r0 = R0+h0/2.; //rotation radius + double dx = dim_x1 - R0*tan(rotAngle*degree/2.); //transport distance in x-axis + double r0 = R0+h0/2.; //rotation radius //Crystal bar size - int Nlayers = (int)h0/(2*barx); //14 double-layers. - int Nblock_z = 11; //block number in z direction - int Nblock_phi = 4; //block number in phi direction - double barz_s0; //Crystal bar lenghth in sub-layer 0(phi direction). Depends on layer number. - double barz_s1 = Z0/Nblock_z; //Crystal bar lenghth in sub-layer 1(z direction, 46cm). - int Nbar_phi; //Crystal bar number in each block, in phi direction. - int Nbar_z = (int)barz_s1/bary; //Crystal bar number in each block, in z direction. + int Nlayers = (int)h0/(2*barx); //14 double-layers. + int Nblock_z = theDetector.constant<int>("Nblock_z"); //block number in z direction + int Nblock_phi = theDetector.constant<int>("Nblock_phi"); //block number in phi direction + double barz_s0; //Crystal bar lenghth in sub-layer 0(phi direction). Depends on layer number. + double barz_s1 = Z0/Nblock_z; //Crystal bar lenghth in sub-layer 1(z direction, ~60cm). + int Nbar_phi; //Crystal bar number in each block, in phi direction. + int Nbar_z = (int)barz_s1/bary; //Crystal bar number in each block, in z direction. //Define detector and motherVolume(world) dd4hep::DetElement ECAL(det_name, detid); dd4hep::Volume motherVol = theDetector.pickMotherVolume(ECAL); // Create a Tube-like envelope representing the whole detector volume - dd4hep::PolyhedraRegular envelope(8, 22.5*degree, R0, (R0+h0), Z0); + dd4hep::PolyhedraRegular envelope(Nsymm, rotAngle/2.*degree, R0, (R0+h0), Z0); dd4hep::Material air(theDetector.material("Air")); dd4hep::Volume envelopeVol(det_name, envelope, air); dd4hep::PlacedVolume envelopePlv = motherVol.placeVolume(envelopeVol, Position(0,0,0)); @@ -107,8 +111,8 @@ static dd4hep::Ref_t create_detector(dd4hep::Detector& theDetector, } caloData->layoutType = LayeredCalorimeterData::BarrelLayout ; - caloData->inner_symmetry = 8 ; - caloData->outer_symmetry = 8 ; + caloData->inner_symmetry = Nsymm ; + caloData->outer_symmetry = Nsymm ; caloData->phi0 = 0 ; // hardcoded // extent of the calorimeter in the r-z-plane [ rmin, rmax, zmin, zmax ] in mm. @@ -141,7 +145,7 @@ static dd4hep::Ref_t create_detector(dd4hep::Detector& theDetector, //sub-layer 0: bars along phi. length=barz_s0. Bar num=Nbar_z for(int ibar0=1;ibar0<=Nbar_z;ibar0++){ - dd4hep::PlacedVolume plv_bar0 = block.placeVolume(bar_s0, Position(0,(2*ibar0-1)*bary/2-barz_s1/2, -barx/2)); + dd4hep::PlacedVolume plv_bar0 = block.placeVolume(bar_s0, Position(0, barz_s1/2-(2*ibar0-1)*bary/2, -barx/2)); plv_bar0.addPhysVolID("slayer",0).addPhysVolID("bar",ibar0); std::string barname0 = "CrystalBar_s0_"+std::to_string(ibar0); dd4hep::DetElement bardet0(sd, barname0, detid); @@ -150,7 +154,7 @@ static dd4hep::Ref_t create_detector(dd4hep::Detector& theDetector, //sub-layer1 for(int ibar1=1;ibar1<=Nbar_phi;ibar1++){ - dd4hep::PlacedVolume plv_bar1 = block.placeVolume(bar_s1, Position((2*ibar1-1)*bary/2-barz_s0/2, 0, barx/2)); + dd4hep::PlacedVolume plv_bar1 = block.placeVolume(bar_s1, Position( barz_s0/2-(2*ibar1-1)*bary/2, 0, barx/2)); plv_bar1.addPhysVolID("slayer",1).addPhysVolID("bar",ibar1); std::string barname1 = "CrystalBar_s1_"+std::to_string(ibar1); dd4hep::DetElement bardet1(sd, barname1, detid); @@ -166,21 +170,21 @@ static dd4hep::Ref_t create_detector(dd4hep::Detector& theDetector, } for(int iz=1; iz<=Nblock_z; iz++){ - dd4hep::PlacedVolume plv = det_vol.placeVolume(det_stave, Position(0, (2*iz-1)*barz_s1/2-dim_y, 0) ); + dd4hep::PlacedVolume plv = det_vol.placeVolume(det_stave, Position(0, dim_y-(2*iz-1)*barz_s1/2, 0) ); plv.addPhysVolID("stave", iz); DetElement sd(stavedet, _toString(iz,"stave%3d"), detid); sd.setPlacement(plv); } - for(int i=0;i<8;i++){ - double rotAngle = 45*i*degree; - double posx = -r0*sin(rotAngle) - dx*cos(rotAngle); - double posy = r0*cos(rotAngle) - dx*sin(rotAngle); - dd4hep::Transform3D transform(dd4hep::RotationZ(rotAngle)*dd4hep::RotationX(-90*degree), dd4hep::Position(posx, posy, 0.)); - dd4hep::PlacedVolume plv = envelopeVol.placeVolume(det_vol, transform); - plv.addPhysVolID("module", i); - DetElement sd(ECAL, _toString(i,"trap%3d"), detid); - sd.setPlacement(plv); + for(int i=0;i<Nsymm;i++){ + double m_rot = rotAngle*i*degree; + double posx = -r0*sin(m_rot) - dx*cos(m_rot); + double posy = r0*cos(m_rot) - dx*sin(m_rot); + dd4hep::Transform3D transform(dd4hep::RotationZ(m_rot)*dd4hep::RotationX(-90*degree), dd4hep::Position(posx, posy, 0.)); + dd4hep::PlacedVolume plv = envelopeVol.placeVolume(det_vol, transform); + plv.addPhysVolID("module", i); + DetElement sd(ECAL, _toString(i,"trap%3d"), detid); + sd.setPlacement(plv); } sens.setType("calorimeter"); diff --git a/Detector/DetCRD/src/Other/CRDBeamPipe_v01_geo.cpp b/Detector/DetCRD/src/Other/CRDBeamPipe_v01_geo.cpp index 1b1b2a813e716632189dd6b2d54e7df3ade4ad54..d3e09afff32fe074fea7af05240d0d4f3315bab7 100644 --- a/Detector/DetCRD/src/Other/CRDBeamPipe_v01_geo.cpp +++ b/Detector/DetCRD/src/Other/CRDBeamPipe_v01_geo.cpp @@ -160,7 +160,7 @@ static Ref_t create_detector(Detector& theDetector, envelope.placeVolume(subLayerLog, transformer); envelope.placeVolume(subLayerLog, transmirror); - if(material.radLength()<10000*dd4hep::mm){ + if(type==CEPC::kCenter && material.radLength()<10000*dd4hep::mm){ double tEff = thickness/material.radLength()*theDetector.material("G4_Be").radLength(); double tEffEnd = thicknessEnd/material.radLength()*theDetector.material("G4_Be").radLength(); if(pipeRadius==0) pipeRadius = radius; diff --git a/Detector/DetDriftChamber/compact/det.xml b/Detector/DetDriftChamber/compact/det.xml index 3c86627d3bde171386776eb74904f81129f0fe51..407378ece108abf1c3d582fd4973e28f9d4f001a 100644 --- a/Detector/DetDriftChamber/compact/det.xml +++ b/Detector/DetDriftChamber/compact/det.xml @@ -16,7 +16,10 @@ </includes> <define> - <constant name="world_size" value="2990*mm"/> + <constant name="tracker_region_rmax" value="1723*mm" /> + <constant name="tracker_region_zmax" value="3050*mm" /> + <constant name="world_size" value="2226*mm"/> + <constant name="world_x" value="world_size"/> <constant name="world_y" value="world_size"/> <constant name="world_z" value="world_size"/> diff --git a/Detector/GeomSvc/src/GeomSvc.cpp b/Detector/GeomSvc/src/GeomSvc.cpp index f7ae4a2bd6c04f6f728e51a8c251e1cd9a31575e..31443757ef16cb43bd2115d1de4c28929b7bb836 100644 --- a/Detector/GeomSvc/src/GeomSvc.cpp +++ b/Detector/GeomSvc/src/GeomSvc.cpp @@ -44,6 +44,9 @@ GeomSvc::initialize() { StatusCode GeomSvc::finalize() { StatusCode sc; + + dd4hep::Detector::destroyInstance(); + return sc; } diff --git a/Detector/MagneticFieldMap/src/FieldMapFileProvider.cpp b/Detector/MagneticFieldMap/src/FieldMapFileProvider.cpp index 2eb352e4912a7d63eb797104beab25f59ec706ec..35bd036f4055cbc3a7264c25cd569bb680236254 100644 --- a/Detector/MagneticFieldMap/src/FieldMapFileProvider.cpp +++ b/Detector/MagneticFieldMap/src/FieldMapFileProvider.cpp @@ -209,6 +209,13 @@ bool FieldMapFileProvider::loadCSV(const std::string& fn, std::ifstream input(fn); std::string tmpline; + if (!input) { + std::cout << "Open file failure: please check file name and path! " << std::endl; + std::cout << "Notice: need absolute path or relative to path to run job!" << std::endl; + std::string error_msg = "[ERROR] FieldMapFileProvider: Cannot open " + fn; + throw std::runtime_error(error_msg); + } + ncol = 0; nrow = 0; diff --git a/Detector/MagneticFieldMap/src/GenericBFieldMapBrBz.cpp b/Detector/MagneticFieldMap/src/GenericBFieldMapBrBz.cpp index 9b3218b3c2f47521c892e854e2732728cb7e7a72..4d6a9306b215de904c996ba134325fa114377e84 100644 --- a/Detector/MagneticFieldMap/src/GenericBFieldMapBrBz.cpp +++ b/Detector/MagneticFieldMap/src/GenericBFieldMapBrBz.cpp @@ -19,10 +19,14 @@ void GenericBFieldMapBrBz::fieldComponents(const double* pos, double* field) { throw std::runtime_error(error_msg); } + if (m_length_unit<=0||m_bfield_unit<=0) { + std::string error_msg = "[ERROR] GenericBFieldMapBrBz: Not set units or error (<0)! "; + throw std::runtime_error(error_msg); + } // convert pos to r/z - double x = pos[0] / dd4hep::m; // convert to meter - double y = pos[1] / dd4hep::m; - double z = pos[2] / dd4hep::m; + double x = pos[0] / m_length_unit; // convert to length unit from input + double y = pos[1] / m_length_unit; + double z = pos[2] / m_length_unit; double r = sqrt(x*x+y*y); double phi = atan2(y, x); @@ -98,9 +102,9 @@ void GenericBFieldMapBrBz::fieldComponents(const double* pos, double* field) { + rn * zn * Bz_r1z1; // update the global field - field[0] += Br*cos(phi); - field[1] += Br*sin(phi); - field[2] += Bz; + field[0] += Br*cos(phi)*m_bfield_unit; // convert to input unit + field[1] += Br*sin(phi)*m_bfield_unit; + field[2] += Bz*m_bfield_unit; return; } @@ -116,3 +120,9 @@ void GenericBFieldMapBrBz::init_provider(const std::string& provider, const std: throw std::runtime_error(error_msg); } } + +void GenericBFieldMapBrBz::init_unit(double l, double b) { + m_length_unit = l; + m_bfield_unit = b; + std::cout << "Initialize units to l = " << m_length_unit/dd4hep::m << " m" << ", b = " << m_bfield_unit/dd4hep::tesla << " tesla" << std::endl; +} diff --git a/Detector/MagneticFieldMap/src/GenericBFieldMapBrBz.h b/Detector/MagneticFieldMap/src/GenericBFieldMapBrBz.h index 93abfcfbbb5650d5e5945b774280e6586b1c17c3..1907b0ae154733c6caf6ece78967416d745f8b4c 100644 --- a/Detector/MagneticFieldMap/src/GenericBFieldMapBrBz.h +++ b/Detector/MagneticFieldMap/src/GenericBFieldMapBrBz.h @@ -26,9 +26,15 @@ public: // following are interfaces to configure this field map void init_provider(const std::string& provider, const std::string& url); + // set unit + void init_unit(double l, double b); + private: IFieldMapProvider* m_provider; + + double m_length_unit = 0; + double m_bfield_unit = 0; }; #endif diff --git a/Detector/MagneticFieldMap/src/GenericBFieldMapBrBzFactory.cpp b/Detector/MagneticFieldMap/src/GenericBFieldMapBrBzFactory.cpp index d7d9fe302d75e214e290f52ebf2382441df305c0..28d6fe24f04e3ff631722b59ae630a1dfa608808 100644 --- a/Detector/MagneticFieldMap/src/GenericBFieldMapBrBzFactory.cpp +++ b/Detector/MagneticFieldMap/src/GenericBFieldMapBrBzFactory.cpp @@ -70,6 +70,19 @@ static dd4hep::Ref_t create_GenericBFieldMapBrBz(dd4hep::Detector& , ptr->init_provider(provider, url); + // set unit, default values will be m and tesla + double lunit = dd4hep::m; + double bunit = dd4hep::tesla; + bool hasLunit = xmlParameter.hasAttr(_Unicode(lunit)); + if (hasLunit) { + lunit = xmlParameter.attr<double>(_Unicode(lunit)); + } + bool hasBunit = xmlParameter.hasAttr(_Unicode(bunit)); + if (hasBunit) { + bunit = xmlParameter.attr<double>(_Unicode(bunit)); + } + ptr->init_unit(lunit, bunit); + obj.assign(ptr, xmlParameter.nameStr(), xmlParameter.typeStr()); return obj; diff --git a/Digitisers/SimpleDigi/CMakeLists.txt b/Digitisers/SimpleDigi/CMakeLists.txt index 4e2687bc123eeb14f5b013af3cf0461ec48605db..28c8ea89d61d17c7d123b9d1366e94f49ac7aa29 100644 --- a/Digitisers/SimpleDigi/CMakeLists.txt +++ b/Digitisers/SimpleDigi/CMakeLists.txt @@ -3,6 +3,7 @@ gaudi_add_module(SimpleDigi SOURCES src/PlanarDigiAlg.cpp src/TPCDigiAlg.cpp src/voxel.cpp + src/CylinderDigiAlg.cpp LINK GearSvc EventSeeder TrackSystemSvcLib diff --git a/Digitisers/SimpleDigi/src/CylinderDigiAlg.cpp b/Digitisers/SimpleDigi/src/CylinderDigiAlg.cpp new file mode 100644 index 0000000000000000000000000000000000000000..d3c67e60c89c427ce12a7c4bc27561b1b971f120 --- /dev/null +++ b/Digitisers/SimpleDigi/src/CylinderDigiAlg.cpp @@ -0,0 +1,119 @@ +#include "CylinderDigiAlg.h" + +#include "edm4hep/Vector3f.h" + +#include "DD4hep/Detector.h" +#include <DD4hep/Objects.h> +#include "DD4hep/DD4hepUnits.h" +#include "DDRec/Vector3D.h" + +#include "GaudiKernel/INTupleSvc.h" +#include "GaudiKernel/MsgStream.h" +#include "GaudiKernel/IRndmGen.h" +#include "GaudiKernel/IRndmGenSvc.h" +#include "GaudiKernel/RndmGenerators.h" + +DECLARE_COMPONENT( CylinderDigiAlg ) + +CylinderDigiAlg::CylinderDigiAlg(const std::string& name, ISvcLocator* svcLoc) +: GaudiAlgorithm(name, svcLoc){ + // Input collections + declareProperty("InputSimTrackerHitCollection", m_inputColHdls, "Handle of the Input SimTrackerHit collection"); + + // Output collections + declareProperty("OutputTrackerHitCollection", m_outputColHdls, "Handle of the output TrackerHit collection"); + declareProperty("TrackerHitAssociationCollection", m_assColHdls, "Handle of the Association collection between SimTrackerHit and TrackerHit"); +} + +StatusCode CylinderDigiAlg::initialize(){ + m_geosvc = service<IGeomSvc>("GeomSvc"); + if(!m_geosvc){ + error() << "Failed to get the GeomSvc" << endmsg; + return StatusCode::FAILURE; + } + auto detector = m_geosvc->lcdd(); + if(!detector){ + error() << "Failed to get the Detector from GeomSvc" << endmsg; + return StatusCode::FAILURE; + } + std::string name = m_inputColHdls.objKey(); + debug() << "Readout name: " << name << endmsg; + m_decoder = m_geosvc->getDecoder(name); + if(!m_decoder){ + error() << "Failed to get the decoder. " << endmsg; + return StatusCode::FAILURE; + } + + info() << "CylinderDigiAlg::initialized" << endmsg; + return GaudiAlgorithm::initialize(); +} + + +StatusCode CylinderDigiAlg::execute(){ + auto trkhitVec = m_outputColHdls.createAndPut(); + auto assVec = m_assColHdls.createAndPut(); + + const edm4hep::SimTrackerHitCollection* STHCol = nullptr; + try { + STHCol = m_inputColHdls.get(); + } + catch(GaudiException &e){ + debug() << "Collection " << m_inputColHdls.fullKey() << " is unavailable in event " << m_nEvt << endmsg; + return StatusCode::SUCCESS; + } + if(STHCol->size()==0) return StatusCode::SUCCESS; + debug() << m_inputColHdls.fullKey() << " has SimTrackerHit "<< STHCol->size() << endmsg; + + for(auto simhit : *STHCol){ + auto particle = simhit.getMCParticle(); + if(!particle.isAvailable()) continue; + + auto& mom0 = particle.getMomentum(); + double pt = sqrt(mom0.x*mom0.x+mom0.y*mom0.y); + if(particle.isCreatedInSimulation()&&pt<0.01&&particle.isStopped()) continue; + + auto cellId = simhit.getCellID(); + int system = m_decoder->get(cellId, "system"); + int chamber = m_decoder->get(cellId, "chamber"); + int layer = m_decoder->get(cellId, "layer" ); + auto& pos = simhit.getPosition(); + auto& mom = simhit.getMomentum(); + + double phi = atan2(pos[1], pos[0]); + double r = sqrt(pos[0]*pos[0]+pos[1]*pos[1]); + double dphi = m_resRPhi/r; + phi += randSvc()->generator(Rndm::Gauss(0, dphi))->shoot(); + double smearedX = r*cos(phi); + double smearedY = r*sin(phi); + double smearedZ = pos[2] + randSvc()->generator(Rndm::Gauss(0, m_resZ))->shoot(); + + auto trkHit = trkhitVec->create(); + trkHit.setCellID(cellId); + trkHit.setTime(simhit.getTime()); + trkHit.setEDep(simhit.getEDep()); + trkHit.setPosition (edm4hep::Vector3d(smearedX, smearedY, smearedZ)); + trkHit.setCovMatrix(std::array<float, 6>{m_resRPhi*m_resRPhi/2, 0, m_resRPhi*m_resRPhi/2, 0, 0, m_resZ*m_resZ}); + //trkHit.setType(CEPC::CYLINDER); + trkHit.addToRawHits(simhit.getObjectID()); + debug() << "Hit " << simhit.id() << ": " << pos << " -> " << trkHit.getPosition() << "s:" << system << " c:" << chamber << " l:" << layer + << " pt = " << pt << " " << mom.x << " " << mom.y << " " << mom.z << endmsg; + + auto ass = assVec->create(); + + float weight = 1.0; + + debug() <<" Set relation between " << " sim hit " << simhit.id() << " to tracker hit " << trkHit.id() << " with a weight of " << weight << endmsg; + ass.setSim(simhit); + ass.setRec(trkHit); + ass.setWeight(weight); + } + + m_nEvt++; + + return StatusCode::SUCCESS; +} + +StatusCode CylinderDigiAlg::finalize(){ + info() << "Processed " << m_nEvt << " events " << endmsg; + return GaudiAlgorithm::finalize(); +} diff --git a/Digitisers/SimpleDigi/src/CylinderDigiAlg.h b/Digitisers/SimpleDigi/src/CylinderDigiAlg.h new file mode 100644 index 0000000000000000000000000000000000000000..af3ffe2100f8151e0076c7ff4643f369f9f836ab --- /dev/null +++ b/Digitisers/SimpleDigi/src/CylinderDigiAlg.h @@ -0,0 +1,39 @@ +#ifndef CylinderDigiAlg_H +#define CylinderDigiAlg_H + +#include "k4FWCore/DataHandle.h" +#include "GaudiKernel/NTuple.h" +#include "GaudiAlg/GaudiAlgorithm.h" +#include "edm4hep/SimTrackerHitCollection.h" +#include "edm4hep/TrackerHitCollection.h" +#include "edm4hep/MCRecoTrackerAssociationCollection.h" + +#include <DDRec/DetectorData.h> +#include "DetInterface/IGeomSvc.h" + +class CylinderDigiAlg : public GaudiAlgorithm{ + public: + + CylinderDigiAlg(const std::string& name, ISvcLocator* svcLoc); + + virtual StatusCode initialize() ; + virtual StatusCode execute() ; + virtual StatusCode finalize() ; + +protected: + + SmartIF<IGeomSvc> m_geosvc; + dd4hep::DDSegmentation::BitFieldCoder* m_decoder; + + // Input collections + DataHandle<edm4hep::SimTrackerHitCollection> m_inputColHdls{"DriftChamberHitsCollection", Gaudi::DataHandle::Reader, this}; + // Output collections + DataHandle<edm4hep::TrackerHitCollection> m_outputColHdls{"DCTrackerHits", Gaudi::DataHandle::Writer, this}; + DataHandle<edm4hep::MCRecoTrackerAssociationCollection> m_assColHdls{"DCTrackerHitAssociationCollection", Gaudi::DataHandle::Writer, this}; + + Gaudi::Property<float> m_resRPhi{this, "ResRPhi", 0.1}; + Gaudi::Property<float> m_resZ {this, "ResZ", 2.828}; + + int m_nEvt=0; +}; +#endif diff --git a/Digitisers/SimpleDigi/src/PlanarDigiAlg.cpp b/Digitisers/SimpleDigi/src/PlanarDigiAlg.cpp index 09fb7eecd86948cf36f45dcdda81b35d48118cc9..730f61e34df936eab5d54bb4e84fff1ca6866a05 100644 --- a/Digitisers/SimpleDigi/src/PlanarDigiAlg.cpp +++ b/Digitisers/SimpleDigi/src/PlanarDigiAlg.cpp @@ -54,13 +54,20 @@ PlanarDigiAlg::PlanarDigiAlg(const std::string& name, ISvcLocator* svcLoc) StatusCode PlanarDigiAlg::initialize() { + if (_parameterize) { + if (_parU.size()!=10 || _parV.size()!=10) { + fatal() << "parameters number must be 10! now " << _parU.size() << " for U and " << _parV.size() << " for V" << endmsg; + return StatusCode::FAILURE; + } + } + else { + if (_resU.size() != _resV.size()) { + fatal() << "Inconsistent number of resolutions given for U and V coordinate: " + << "ResolutionU :" << _resU.size() << " != ResolutionV : " << _resV.size() + << endmsg; - if( _resU.size() != _resV.size() ) { - fatal() << "Inconsistent number of resolutions given for U and V coordinate: " - << "ResolutionU :" << _resU.size() << " != ResolutionV : " << _resV.size() - << endmsg; - - return StatusCode::FAILURE; + return StatusCode::FAILURE; + } } // get the GEAR manager @@ -85,7 +92,7 @@ StatusCode PlanarDigiAlg::initialize() //TODO:trksystem->init() ; //FIXME:SJA gear surface store has now been filled so we can dispose of the MarlinTrkSystem //TODO:delete trksystem; - + // fucd: fix TODO - surface store is needed to fill once always if does not handle tracking algorithm in job auto _trackSystemSvc = service<ITrackSystemSvc>("TrackSystemSvc"); if ( !_trackSystemSvc ) { error() << "Failed to find TrackSystemSvc ..." << endmsg; @@ -166,6 +173,8 @@ StatusCode PlanarDigiAlg::execute() int i = 0; for( auto SimTHit : *STHcol ) { + if (SimTHit.getEDep()<=_eThreshold) continue; + debug() << "MCParticle id " << SimTHit.getMCParticle().id() << endmsg; const int celId = SimTHit.getCellID() ; @@ -205,28 +214,60 @@ StatusCode PlanarDigiAlg::execute() // << endmsg; // continue; // } - if( (_resU.size() > 1 && layer > _resU.size()-1) || (_resV.size() > 1 && layer > _resV.size()-1) ) { - fatal() << "layer exceeds resolution vector, please check input parameters ResolutionU and ResolutionV" << endmsg; - return StatusCode::FAILURE; - } + gear::MeasurementSurface const* ms = _GEAR->getMeasurementSurfaceStore().GetMeasurementSurface( encoder.lowWord() ); + gear::CartesianCoordinateSystem* cartesian = dynamic_cast< gear::CartesianCoordinateSystem* >( ms->getCoordinateSystem() ); + CLHEP::Hep3Vector uVec = cartesian->getLocalXAxis(); + CLHEP::Hep3Vector vVec = cartesian->getLocalYAxis(); - float resU = ( _resU.size() > 1 ? _resU.value().at( layer ) : _resU.value().at(0) ) ; - float resV = ( _resV.size() > 1 ? _resV.value().at( layer ) : _resV.value().at(0) ) ; + float u_direction[2] ; + u_direction[0] = uVec.theta(); + u_direction[1] = uVec.phi(); + + float v_direction[2] ; + v_direction[0] = vVec.theta(); + v_direction[1] = vVec.phi(); + + debug() << " U[0] = "<< u_direction[0] << " U[1] = "<< u_direction[1] + << " V[0] = "<< v_direction[0] << " V[1] = "<< v_direction[1] + << endmsg ; + + float resU(0), resV(0); + + if (!_parameterize) { + if( (_resU.size() > 1 && layer > _resU.size()-1) || (_resV.size() > 1 && layer > _resV.size()-1) ) { + fatal() << "layer exceeds resolution vector, please check input parameters ResolutionU and ResolutionV" << endmsg; + return StatusCode::FAILURE; + } + + resU = ( _resU.size() > 1 ? _resU.value().at( layer ) : _resU.value().at(0) ) ; + resV = ( _resV.size() > 1 ? _resV.value().at( layer ) : _resV.value().at(0) ) ; + } + else { // Riccardo's parameterized model + auto mom = SimTHit.getMomentum(); + CLHEP::Hep3Vector momVec(mom[0], mom[1], mom[2]); + const double alpha = uVec.azimAngle(momVec, vVec); + const double cotanAlpha = 1./tan(alpha); + // TODO: title angle (PI/2), magnetic field (3) + const double tanLorentzAngle = (side==0) ? 0. : 0.053 * 3 * cos(M_PI/2.); + const double x = fabs(-cotanAlpha - tanLorentzAngle); + resU = _parU[0] + _parU[1] * x + _parU[2] * exp(-_parU[9] * x) * cos(_parU[3] * x + _parU[4]) + + _parU[5] * exp(-0.5 * pow(((x - _parU[6]) / _parU[7]), 2)) + _parU[8] * pow(x, 0.5); + + const double beta = vVec.azimAngle(momVec, uVec); + const double cotanBeta = 1./tan(beta); + const double y = fabs(-cotanBeta); + resV = _parV[0] + _parV[1] * y + _parV[2] * exp(-_parV[9] * y) * cos(_parV[3] * y + _parV[4]) + + _parV[5] * exp(-0.5 * pow(((y - _parV[6]) / _parV[7]), 2)) + _parV[8] * pow(y, 0.5); + } debug() << " --- will smear hit with resU = " << resU << " and resV = " << resV << endmsg; auto& pos = SimTHit.getPosition() ; - //edm4hep::Vector3d smearedPos; - - //GearSurfaces::MeasurementSurface* ms = _GEAR->getMeasurementSurfaceStore().GetMeasurementSurface( SimTHit->getCellID0() ); - - gear::MeasurementSurface const* ms = _GEAR->getMeasurementSurfaceStore().GetMeasurementSurface( encoder.lowWord() );; CLHEP::Hep3Vector globalPoint(pos[0],pos[1],pos[2]); CLHEP::Hep3Vector localPoint = ms->getCoordinateSystem()->getLocalPoint(globalPoint); CLHEP::Hep3Vector localPointSmeared = localPoint; - debug() << std::setprecision(8) << "Position of hit before smearing global: ( "<<pos[0]<<" "<<pos[1]<<" "<<pos[2]<< " ) " << "local: ( " << localPoint.x() << " " << localPoint.y() << " " << localPoint.z() << " )" << endmsg; @@ -252,11 +293,13 @@ StatusCode PlanarDigiAlg::execute() << " sensor" << sensor << " : retries " << tries << endmsg; } - localPointSmeared.setX( localPoint.x() + gsl_ran_gaussian(_rng, resU) ); - localPointSmeared.setY( localPoint.y() + gsl_ran_gaussian(_rng, resV) ); + double dx = gsl_ran_gaussian(_rng, resU); + double dy = gsl_ran_gaussian(_rng, resV); + localPointSmeared.setX( localPoint.x() + dx ); + localPointSmeared.setY( localPoint.y() + dy ); //check if hit is in boundaries - if ( ms->isLocalInBoundary( localPointSmeared ) ) { + if ( ms->isLocalInBoundary( localPointSmeared ) && fabs(dx)<=_maxPull*resU && fabs(dy)<=_maxPull*resV ) { accept_hit = true; break; } @@ -281,10 +324,6 @@ StatusCode PlanarDigiAlg::execute() << localPointSmeared.x() << " " << localPointSmeared.y() << " " << localPointSmeared.z() << " )" << endmsg; - //smearedPos[0] = globalPointSmeared.x(); - //smearedPos[1] = globalPointSmeared.y(); - //smearedPos[2] = globalPointSmeared.z(); - //make the TrackerHitPlaneImpl auto trkHit = trkhitVec->create(); @@ -292,7 +331,7 @@ StatusCode PlanarDigiAlg::execute() edm4hep::Vector3d smearedPos(globalPointSmeared.x(), globalPointSmeared.y(), globalPointSmeared.z()); trkHit.setPosition( smearedPos ) ; - + /* gear::CartesianCoordinateSystem* cartesian = dynamic_cast< gear::CartesianCoordinateSystem* >( ms->getCoordinateSystem() ); CLHEP::Hep3Vector uVec = cartesian->getLocalXAxis(); CLHEP::Hep3Vector vVec = cartesian->getLocalYAxis(); @@ -308,6 +347,7 @@ StatusCode PlanarDigiAlg::execute() debug() << " U[0] = "<< u_direction[0] << " U[1] = "<< u_direction[1] << " V[0] = "<< v_direction[0] << " V[1] = "<< v_direction[1] << endmsg ; + */ // fucd: next TODO: cov[0] = resU*reU, cov[2] = resV*resV, cov[5] = 0 if(_usePlanarTag){ std::array<float, 6> cov; @@ -339,7 +379,7 @@ StatusCode PlanarDigiAlg::execute() trkHit.setType( UTIL::set_bit( trkHit.getType() , UTIL::ILDTrkHitTypeBit::ONE_DIMENSIONAL ) ) ; } trkHit.setEDep( SimTHit.getEDep() ); - + trkHit.setTime( SimTHit.getTime() ); // make the relation auto rel = relCol->create(); @@ -374,5 +414,8 @@ StatusCode PlanarDigiAlg::execute() StatusCode PlanarDigiAlg::finalize() { info() << "Processed " << _nEvt << " events " << endmsg; + + if(_rng) gsl_rng_free(_rng); + return GaudiAlgorithm::finalize(); } diff --git a/Digitisers/SimpleDigi/src/PlanarDigiAlg.h b/Digitisers/SimpleDigi/src/PlanarDigiAlg.h index 10ddd9dd4bc3216348518ea0df14ebe9cb000684..981a171c2a8f6503242f82894db75ff0e8b5735a 100644 --- a/Digitisers/SimpleDigi/src/PlanarDigiAlg.h +++ b/Digitisers/SimpleDigi/src/PlanarDigiAlg.h @@ -82,13 +82,18 @@ protected: // whether use Planar tag for type and cov, if true, CEPCConf::TrkHitTypeBit::PLANAR bit is set as true // cov[0]=thetaU, cov[1]=phiU, cov[2]=resU, cov[0]=thetaV, cov[1]=phiV, cov[2]=resV Gaudi::Property<bool> _usePlanarTag{ this, "UsePlanarTag", true }; + Gaudi::Property<float> _eThreshold{ this, "EnergyThreshold", 0 }; + Gaudi::Property<float> _maxPull{ this, "PullCutToRetry", 1000. }; + Gaudi::Property<bool> _parameterize{ this, "ParameterizeResolution", false}; + Gaudi::Property<FloatVec> _parU{ this, "ParametersU", {0} }; + Gaudi::Property<FloatVec> _parV{ this, "ParametersV", {0} }; // Input collections DataHandle<edm4hep::EventHeaderCollection> _headerCol{"EventHeaderCol", Gaudi::DataHandle::Reader, this}; DataHandle<edm4hep::SimTrackerHitCollection> _inColHdl{"VXDCollection", Gaudi::DataHandle::Reader, this}; // Output collections DataHandle<edm4hep::TrackerHitCollection> _outColHdl{"VXDTrackerHits", Gaudi::DataHandle::Writer, this}; - DataHandle<edm4hep::MCRecoTrackerAssociationCollection> _outRelColHdl{"VTXTrackerHitRelations", Gaudi::DataHandle::Writer, this}; + DataHandle<edm4hep::MCRecoTrackerAssociationCollection> _outRelColHdl{"VXDTrackerHitRelations", Gaudi::DataHandle::Writer, this}; }; #endif diff --git a/Digitisers/SimpleDigi/src/TPCDigiAlg.cpp b/Digitisers/SimpleDigi/src/TPCDigiAlg.cpp index 44f43fc77144d3467a795c195a7da9bbba1e13f9..c6057e548414e27ed26ac1c683964a15bb497c60 100644 --- a/Digitisers/SimpleDigi/src/TPCDigiAlg.cpp +++ b/Digitisers/SimpleDigi/src/TPCDigiAlg.cpp @@ -590,7 +590,7 @@ StatusCode TPCDigiAlg::execute() if(mcp.isAvailable()){ // get the pt of the MCParticle, this will used later to uses nominal smearing for low momentum rubish - const edm4hep::Vector3f momentumMC= mcp.getMomentum() ; + const auto& momentumMC= mcp.getMomentum() ; ptSqrdMC = momentumMC[0]*momentumMC[0]+momentumMC[1]*momentumMC[1] ; debug() << " mcp id = " << mcp.id() @@ -1057,7 +1057,7 @@ StatusCode TPCDigiAlg::execute() auto mcp = (_tpcHitMap[ seed_hit ]).getMCParticle() ; if(mcp.isAvailable()) { ++_NLostPhysicsTPCHits; - const edm4hep::Vector3f mom= mcp.getMomentum() ; + const auto& mom= mcp.getMomentum() ; double ptSQRD = mom[0]*mom[0]+mom[1]*mom[1] ; if( ptSQRD > (0.2*0.2) ) ++_NLostPhysicsAbove02GeVPtTPCHits ; if( ptSQRD > 1.0 ) ++_NLostPhysicsAbove1GeVPtTPCHits ; diff --git a/Examples/options/LCIO_read.py b/Examples/options/LCIO_read.py index 8beafb9314a4fbf300b567ded81cecd3d8204715..f0d34348140c2660f5b1e636687ada049c0cf19b 100644 --- a/Examples/options/LCIO_read.py +++ b/Examples/options/LCIO_read.py @@ -1,61 +1,58 @@ #!/usr/bin/env python from Gaudi.Configuration import * +from Configurables import k4DataSvc +dsvc = k4DataSvc("EventDataSvc") -from Configurables import LCIODataSvc, CEPCDataSvc - -svcname = "LCIODataSvc" -rsvc = LCIODataSvc(svcname, inputs = [ -"/cefs/data/FullSim/CEPC240/CEPC_v4/higgs/smart_final_states/E240.Pffh_invi.e0.p0.whizard195//ffh_inv.e0.p0.00001_1000_sim.slcio" -]) - -wsvc = CEPCDataSvc("EventDataSvc") - -from Configurables import PlcioReadAlg -alg = PlcioReadAlg("PlcioReadAlg") -alg.InputCol.Path = "MCParticle" -alg.HeaderCol.Path = "EventHeader" - +# read LCIO files from Configurables import LCIOInput -lcioinput = LCIOInput("LCIOReader", collections=[ - "EventHeader", - "MCParticle", - "TPCCollection" - #"EventHeader", - #"MCParticle", - #"COILCollection", - #"EcalBarrelSiliconCollection", - #"EcalBarrelSiliconPreShowerCollection", - #"EcalEndcapRingCollection", - #"EcalEndcapRingPreShowerCollection", - #"EcalEndcapSiliconCollection", - #"EcalEndcapSiliconPreShowerCollection", - #"FTD_PIXELCollection", - #"FTD_STRIPCollection", - #"HcalBarrelCollection", - #"HcalEndCapRingsCollection", - #"HcalEndCapsCollection", - #"LumiCalCollection", - #"MuonBarrelCollection", - #"MuonEndCapCollection", - #"SETCollection", - #"SITCollection", - #"TPCCollection", - #"TPCSpacePointCollection", - #"VXDCollection" - ]) -lcioinput.DataSvc = svcname +read = LCIOInput("read") +read.inputs = [ +"/cefs/data/FullSim/CEPC240/CEPC_v4/higgs/smart_final_states/E240.Pffh_invi.e0.p0.whizard195/ffh_inv.e0.p0.00001_1000_sim.slcio" +] +read.collections = [ + "MCParticle:MCParticle", + "SimCalorimeterHit:EcalBarrelSiliconCollection", + #"CalorimeterHit:ECALBarrel", + #"CalorimeterHit:ECALEndcap", + #"CalorimeterHit:ECALOther" , + ########## HCAL will effect the reco efficiency close to gap region ###### + #"CalorimeterHit:HCALBarrel", + #"CalorimeterHit:HCALEndcap", + #"CalorimeterHit:HCALOther", + ##"TrackerHit:VXDTrackerHits", + ##"TrackerHit:SITTrackerHits", + #"TrackerHit:SITSpacePoints", + #"TrackerHit:TPCTrackerHits", + ##"TrackerHit:SETTrackerHits", + #"TrackerHit:SETSpacePoints", + ##"TrackerHit:FTDStripTrackerHits", + #"TrackerHit:FTDSpacePoints", + ##"TrackerHit:FTDPixelTrackerHits", + #"Track:ClupatraTrackSegments", + #"Track:ClupatraTracks", + #"Track:ForwardTracks", + #"Track:SiTracks", + #"Track:SubsetTracks", + #"Track:MarlinTrkTracks", + #"Vertex:KinkVertices", + #"Vertex:ProngVertices", + #"Vertex:V0Vertices", + #"ReconstructedParticle:KinkRecoParticles", + #"ReconstructedParticle:ProngRecoParticles", + #"ReconstructedParticle:V0RecoParticles" +] from Configurables import PodioOutput -plcioout = PodioOutput("PlcioWriter") -plcioout.filename = "lcio2plcio.root" -plcioout.outputCommands = ["keep *"] +write = PodioOutput("write") +write.filename = "lcio2plcio.root" +write.outputCommands = ["keep *"] # ApplicationMgr from Configurables import ApplicationMgr -ApplicationMgr( TopAlg = [lcioinput, alg, plcioout], +ApplicationMgr( TopAlg = [read, write], EvtSel = 'NONE', EvtMax = 10, - ExtSvc = [rsvc, wsvc], + ExtSvc = [dsvc], OutputLevel=DEBUG ) diff --git a/Examples/options/dump_simhit.py b/Examples/options/dump_simhit.py new file mode 100644 index 0000000000000000000000000000000000000000..1c699b7a4f98ca5860e6f7a77763f2c91e16eb07 --- /dev/null +++ b/Examples/options/dump_simhit.py @@ -0,0 +1,62 @@ +#!/usr/bin/env python + +from Gaudi.Configuration import * + +############################################################################## +# Geometry Svc +############################################################################## + +# geometry_option = "CepC_v4-onlyTracker.xml" +# geometry_option = "CepC_v4-onlyVXD.xml" +geometry_option = "CepC_v4.xml" + +if not os.getenv("DETCEPCV4ROOT"): + print("Can't find the geometry. Please setup envvar DETCEPCV4ROOT." ) + sys.exit(-1) + +geometry_path = os.path.join(os.getenv("DETCEPCV4ROOT"), "compact", geometry_option) +if not os.path.exists(geometry_path): + print("Can't find the compact geometry file: %s"%geometry_path) + sys.exit(-1) + +from Configurables import GeomSvc +geosvc = GeomSvc("GeomSvc") +geosvc.compact = geometry_path + +############################################################################## +# Event Data Svc +############################################################################## + +from Configurables import k4DataSvc +dsvc = k4DataSvc("EventDataSvc", input="test-detsim10.root") + +############################################################################## +# NTuple Svc +############################################################################## + +from Configurables import NTupleSvc +ntsvc = NTupleSvc("NTupleSvc") +ntsvc.Output = ["MyTuples DATAFILE='result.root' OPT='NEW' TYP='ROOT'"] + +############################################################################## +# DumpAlg +############################################################################## + +from Configurables import DumpSimHitAlg +alg = DumpSimHitAlg("DumpSimHitAlg") + +from Configurables import PodioInput +podioinput = PodioInput("PodioReader", collections=[ + "MCParticle", + "VXDCollection" + ]) + +# ApplicationMgr +from Configurables import ApplicationMgr +ApplicationMgr( TopAlg = [podioinput, alg], + EvtSel = 'NONE', + EvtMax = -1, + ExtSvc = [dsvc, ntsvc], + HistogramPersistency = "ROOT", + # OutputLevel=DEBUG +) diff --git a/Examples/options/dumpid.py b/Examples/options/dumpid.py index e8ce40f764767539d876251695f7999c5640c3b8..ef9a45ce18c6fbb86fb1dc8ed2dc79f4cf32dc88 100644 --- a/Examples/options/dumpid.py +++ b/Examples/options/dumpid.py @@ -9,7 +9,7 @@ from Gaudi.Configuration import * # geometry_option = "CepC_v4-onlyTracker.xml" # geometry_option = "CepC_v4-onlyVXD.xml" geometry_option = "CepC_v4-onlyECAL.xml" - +import os if not os.getenv("DETCEPCV4ROOT"): print("Can't find the geometry. Please setup envvar DETCEPCV4ROOT." ) sys.exit(-1) diff --git a/Examples/options/sim-rec-trackerecal.py b/Examples/options/sim-rec-trackerecal.py index 1117e414ab57dbc65ee71160ee28c5d3ca61af95..49e79a931fdc1350f51dd89de6f88fcc9700a78b 100644 --- a/Examples/options/sim-rec-trackerecal.py +++ b/Examples/options/sim-rec-trackerecal.py @@ -2,6 +2,8 @@ from Gaudi.Configuration import * +import os + NTupleSvc().Output = ["MyTuples DATAFILE='sim-rec-trackerEcal.root' OPT='NEW' TYP='ROOT'"] from Configurables import RndmGenSvc, HepRndm__Engine_CLHEP__RanluxEngine_ @@ -79,7 +81,7 @@ tpc_sensdettool.TypeOption = 1 from Configurables import GearSvc gearsvc = GearSvc("GearSvc") -gearsvc.GearXMLFile = "Detector/DetCEPCv4/compact/FullDetGear.xml" +#gearsvc.GearXMLFile = "Detector/DetCEPCv4/compact/FullDetGear.xml" from Configurables import TrackSystemSvc tracksystemsvc = TrackSystemSvc("TrackSystemSvc") @@ -331,7 +333,7 @@ ApplicationMgr( TopAlg = [genalg, detsimalg, digiVXD, digiSIT, digiSET, digiFTD, spSIT, spFTD, digiTPC, clupatra, tracking, forward, subset, full, simHitMerge, caloDigi, pandoralg, write], EvtSel = 'NONE', EvtMax = 10, - ExtSvc = [rndmengine, dsvc, evtseeder, gearsvc, geosvc, tracksystemsvc], + ExtSvc = [rndmengine, dsvc, evtseeder, geosvc, gearsvc, tracksystemsvc], HistogramPersistency='ROOT', OutputLevel=INFO ) diff --git a/Examples/options/tut_detsim_SDT_Heed.py b/Examples/options/tut_detsim_SDT_Heed.py new file mode 100644 index 0000000000000000000000000000000000000000..d994ae61418c40c14afcd40640223c872ba810c9 --- /dev/null +++ b/Examples/options/tut_detsim_SDT_Heed.py @@ -0,0 +1,206 @@ +#!/usr/bin/env python + +import os +import sys +# sys.exit(0) + +from Gaudi.Configuration import * + +############################################################################## +# Random Number Svc +############################################################################## +from Configurables import RndmGenSvc, HepRndm__Engine_CLHEP__RanluxEngine_ + +seed = [42] + +# rndmengine = HepRndm__Engine_CLHEP__RanluxEngine_() # The default engine in Gaudi +rndmengine = HepRndm__Engine_CLHEP__HepJamesRandom_("RndmGenSvc.Engine") # The default engine in Geant4 +rndmengine.SetSingleton = True +rndmengine.Seeds = seed + +rndmgensvc = RndmGenSvc("RndmGenSvc") +rndmgensvc.Engine = rndmengine.name() + + +############################################################################## +# Event Data Svc +############################################################################## +from Configurables import k4DataSvc +dsvc = k4DataSvc("EventDataSvc") + + +############################################################################## +# Geometry Svc +############################################################################## + +# geometry_option = "CepC_v4-onlyTracker.xml" +geometry_option = "det.xml" +#geometry_option = "CepC_v4.xml" +det_root = "DETDRIFTCHAMBERROOT" +#det_root = "DETCEPCV4ROOT"#"DETDRIFTCHAMBERROOT" +if not os.getenv(det_root): + print("Can't find the geometry. Please setup envvar %s."%det_root ) + sys.exit(-1) + +geometry_path = os.path.join(os.getenv(det_root), "compact", geometry_option) +if not os.path.exists(geometry_path): + print("Can't find the compact geometry file: %s"%geometry_path) + sys.exit(-1) + +from Configurables import GeomSvc +geosvc = GeomSvc("GeomSvc") +print('geometry_path=',geometry_path) +geosvc.compact = geometry_path + +############################################################################## +# Physics Generator +############################################################################## +from Configurables import GenAlgo +from Configurables import GtGunTool +from Configurables import StdHepRdr +from Configurables import SLCIORdr +from Configurables import HepMCRdr +from Configurables import GenPrinter + +gun = GtGunTool("GtGunTool") +# gun.Particles = ["pi+"] +# gun.EnergyMins = [100.] # GeV +# gun.EnergyMaxs = [100.] # GeV + +gun.Particles = ["e-"] + +# gun.PositionXs = [100.] # mm +# gun.PositionYs = [100.] # mm +# gun.PositionZs = [0.] # mm + + +gun.EnergyMins = [10] # GeV +gun.EnergyMaxs = [10] # GeV + +gun.ThetaMins = [80] # rad; 45deg +gun.ThetaMaxs = [90.] # rad; 45deg + +gun.PhiMins = [0] # rad; 0deg +gun.PhiMaxs = [360.] # rad; 360deg + +# stdheprdr = StdHepRdr("StdHepRdr") +# stdheprdr.Input = "/cefs/data/stdhep/CEPC250/2fermions/E250.Pbhabha.e0.p0.whizard195/bhabha.e0.p0.00001.stdhep" + +# lciordr = SLCIORdr("SLCIORdr") +# lciordr.Input = "/cefs/data/stdhep/lcio250/signal/Higgs/E250.Pbbh.whizard195/E250.Pbbh_X.e0.p0.whizard195/Pbbh_X.e0.p0.00001.slcio" + +# hepmcrdr = HepMCRdr("HepMCRdr") +# hepmcrdr.Input = "example_UsingIterators.txt" + +genprinter = GenPrinter("GenPrinter") + +genalg = GenAlgo("GenAlgo") +genalg.GenTools = ["GtGunTool"] +# genalg.GenTools = ["StdHepRdr"] +# genalg.GenTools = ["StdHepRdr", "GenPrinter"] +# genalg.GenTools = ["SLCIORdr", "GenPrinter"] +# genalg.GenTools = ["HepMCRdr", "GenPrinter"] + +############################################################################## +# Detector Simulation +############################################################################## +from Configurables import DetSimSvc + +detsimsvc = DetSimSvc("DetSimSvc") + +# from Configurables import ExampleAnaElemTool +# example_anatool = ExampleAnaElemTool("ExampleAnaElemTool") + +from Configurables import DetSimAlg + +detsimalg = DetSimAlg("DetSimAlg") +detsimalg.RandomSeeds = seed + +if int(os.environ.get("VIS", 0)): + detsimalg.VisMacs = ["vis.mac"] + +detsimalg.RunCmds = [ +# "/tracking/verbose 1", +] + +from Configurables import DummyFastSimG4Tool +dummy_fastsim_tool = DummyFastSimG4Tool("DummyFastSimG4Tool") + +detsimalg.FastSimG4Tools = [ +# "DummyFastSimG4Tool" +] + +detsimalg.AnaElems = [ + # example_anatool.name() + # "ExampleAnaElemTool" + "Edm4hepWriterAnaElemTool" +] +detsimalg.RootDetElem = "WorldDetElemTool" + +from Configurables import AnExampleDetElemTool +example_dettool = AnExampleDetElemTool("AnExampleDetElemTool") + +from Configurables import CalorimeterSensDetTool +from Configurables import DriftChamberSensDetTool + +calo_sensdettool = CalorimeterSensDetTool("CalorimeterSensDetTool") +driftchamber_sensdettool = DriftChamberSensDetTool("DriftChamberSensDetTool") + +#dedxoption = "DummyDedxSimTool" +#dedxoption = "BetheBlochEquationDedxSimTool" +dedxoption = "TrackHeedSimTool" + +driftchamber_sensdettool.DedxSimTool = dedxoption + +from Configurables import DummyDedxSimTool +from Configurables import BetheBlochEquationDedxSimTool +from Configurables import TrackHeedSimTool + +if dedxoption == "DummyDedxSimTool": + dedx_simtool = DummyDedxSimTool("DummyDedxSimTool") +elif dedxoption == "BetheBlochEquationDedxSimTool": + dedx_simtool = BetheBlochEquationDedxSimTool("BetheBlochEquationDedxSimTool") + dedx_simtool.material_Z = 2 + dedx_simtool.material_A = 4 + dedx_simtool.scale = 10 + dedx_simtool.resolution = 0.0001 +elif dedxoption == "TrackHeedSimTool": + dedx_simtool = TrackHeedSimTool("TrackHeedSimTool") + dedx_simtool.only_primary = False#True + dedx_simtool.use_max_step = True#True + dedx_simtool.max_step = 1#mm + #dedx_simtool.he = 50 + #dedx_simtool.isob = 50 + #dedx_simtool.gas_file ="/junofs/users/wxfang/MyGit/tmp/check_G4FastSim_20210121/CEPCSW/Digitisers/DigiGarfield/He_50_isobutane_50.gas" + dedx_simtool.he = 90 + dedx_simtool.isob = 10 + #dedx_simtool.gas_file ="/junofs/users/wxfang/MyGit/tmp/check_G4FastSim_20210121/CEPCSW/Digitisers/DigiGarfield/he_90_isobutane_10.gas" + #dedx_simtool.IonMobility_file ="/junofs/users/wxfang/MyGit/tmp/check_G4FastSim_20210121/CEPCSW/Digitisers/DigiGarfield/IonMobility_He+_He.txt" + dedx_simtool.gas_file ="he_90_isobutane_10.gas" + dedx_simtool.IonMobility_file ="IonMobility_He+_He.txt" + dedx_simtool.save_mc = True + dedx_simtool.debug = False + dedx_simtool.sim_pulse = True + #dedx_simtool.model='/junofs/users/wxfang/MyGit/tmp/fork_cepcsw_20220418/CEPCSW/Digitisers/SimCurrentONNX/src/model_90He10C4H10_18mm.onnx' + dedx_simtool.model='model_90He10C4H10_18mm.onnx' + dedx_simtool.batchsize = 100 + +############################################################################## +# POD I/O +############################################################################## +from Configurables import PodioOutput +out = PodioOutput("outputalg") +out.filename = "detsim_heed.root" +out.outputCommands = ["keep *"] + +############################################################################## +# ApplicationMgr +############################################################################## + +from Configurables import ApplicationMgr +ApplicationMgr( TopAlg = [genalg, detsimalg, out], + EvtSel = 'NONE', + EvtMax = 20, + ExtSvc = [rndmengine, rndmgensvc, dsvc, geosvc], + OutputLevel=INFO +) diff --git a/Generator/CMakeLists.txt b/Generator/CMakeLists.txt index 6169e415c23b9ec0ea47b9458f8b436a4194932c..e3f20777700086d01008e78756ec53a5bd1cafc9 100644 --- a/Generator/CMakeLists.txt +++ b/Generator/CMakeLists.txt @@ -10,14 +10,15 @@ gaudi_add_module(GenAlgo src/GenReader.cpp src/StdHepRdr.cpp src/GenPrinter.cpp - # src/LCAscHepRdr.cc - # src/HepevtRdr.cpp + src/LCAscHepRdr.cc + src/HepevtRdr.cpp src/SLCIORdr.cpp src/HepMCRdr.cpp src/GtGunTool.cpp # ------- Beam Background ------- src/GtBeamBackgroundTool.cpp src/BeamBackgroundFileParserV0.cpp + src/GuineaPigPairsFileParser.cpp LINK ${ROOT_LIBRARIES} k4FWCore::k4FWCore Gaudi::GaudiAlgLib diff --git a/Generator/src/GenAlgo.cpp b/Generator/src/GenAlgo.cpp index 58f9d4e8b438085a5322e565f778506830e7ec14..2d8ec8972668e5565960654176bd71d3d11d870c 100644 --- a/Generator/src/GenAlgo.cpp +++ b/Generator/src/GenAlgo.cpp @@ -13,19 +13,12 @@ #include "IGenTool.h" #include "GenEvent.h" -// #include "StdHepRdr.h" -// #include "HepevtRdr.h"// not correct still -// #include "SLCIORdr.h" -// #include "HepMCRdr.h" -// #include "GenPrinter.h" -// #include "GenWriter.h" -using namespace std; DECLARE_COMPONENT(GenAlgo) GenAlgo::GenAlgo(const std::string& name, ISvcLocator* pSvcLocator): GaudiAlgorithm(name, pSvcLocator) { - declareProperty("MCParticle", m_hdl, "MCParticle collection (output)"); + declareProperty("MCParticleGen", m_hdl, "MCParticle collection (at Generator phase)"); declareProperty("GenTools", m_genToolNames, "List of GenTools"); m_evtid = 0; @@ -42,25 +35,6 @@ GenAlgo::initialize() { m_genTools.push_back(gtname); } - // cout << "initialize start" << endl; - // string generatorName = m_input_file.value(); - // string outputName = m_output_file.value(); - // string format = m_input_format.value(); - // IGenTool* gen_reader; - // if(format=="stdhep") gen_reader = new StdHepRdr(generatorName); - // else if(format=="slcio") gen_reader = new SLCIORdr(generatorName); - // else if(format=="hepmc") gen_reader = new HepMCRdr(generatorName); - // else{cout << "Error : unsupport format for generator input file" << endl; return StatusCode::FAILURE; } - // //IGenTool* gen_reader = new HepevtRdr(generatorName); - // m_genTools.push_back(gen_reader); - // if(m_print.value()) { - // IGenTool* gen_printer = new GenPrinter(generatorName); - // m_genTools.push_back(gen_printer); - // } - //IGenTool* gen_writer = new GenWriter (outputName); - //m_genTools.push_back(gen_writer); - - // cout << "initialize done" << endl; return StatusCode::SUCCESS; } @@ -74,16 +48,16 @@ GenAlgo::execute() { for(auto gentool: m_genTools) { if (gentool->mutate(m_event)) {} else { - cout << "Have read all events, stop now." << endl; + warning() << "Have read all events, stop now." << endmsg; auto ep = serviceLocator()->as<IEventProcessor>(); if ( !ep ) { - error() << "Cannot get IEventProcessor" << endmsg; - return StatusCode::FAILURE; + error() << "Cannot get IEventProcessor" << endmsg; + return StatusCode::FAILURE; } ep->stopRun(); return StatusCode::SUCCESS; - } + } } return StatusCode::SUCCESS; @@ -92,10 +66,5 @@ GenAlgo::execute() { StatusCode GenAlgo::finalize() { - // cout << "finalize" << endl; - // for(auto gentool: m_genTools) { - // if (gentool->finish()) {} - // else {cout << "finish Failed" << endl; return StatusCode::FAILURE; } - // } return StatusCode::SUCCESS; } diff --git a/Generator/src/GenAlgo.h b/Generator/src/GenAlgo.h index 2eb6ac616f0a54f9acca641d197016b0fadf6b1f..2fa42bfa2af8eb4e9615ec3663fff798083373bf 100644 --- a/Generator/src/GenAlgo.h +++ b/Generator/src/GenAlgo.h @@ -12,12 +12,6 @@ #include "GenEvent.h" class IGenTool; -namespace plcio { - class MCParticleCollection; -} - - -using namespace std; class GenAlgo: public GaudiAlgorithm { @@ -42,7 +36,7 @@ private: int m_evtid; int m_evtMax; //MyHepMC::GenEvent m_event; - DataHandle<edm4hep::MCParticleCollection> m_hdl{"MCParticle", Gaudi::DataHandle::Writer, this}; + DataHandle<edm4hep::MCParticleCollection> m_hdl{"MCParticleGen", Gaudi::DataHandle::Writer, this}; }; diff --git a/Generator/src/GenPrinter.cpp b/Generator/src/GenPrinter.cpp index 48c6d499451ec24b1eb9b0874b971cdc0678f3b2..359f26dee192363cb2f5410332fd527577a1d640 100644 --- a/Generator/src/GenPrinter.cpp +++ b/Generator/src/GenPrinter.cpp @@ -4,28 +4,48 @@ DECLARE_COMPONENT(GenPrinter) bool GenPrinter::mutate(MyHepMC::GenEvent& event){ + auto msglevel = msgLevel(); + + // only print when current msglevel is MSG::DEBUG/VERBOSE + if (msglevel != MSG::NIL && msglevel != MSG::VERBOSE && msglevel != MSG::DEBUG) { + return true; + } + std::cout << "print mc info for event "<< event.getID() << ", mc size ="<< event.m_mc_vec.size() << std::endl; for ( int i =0; i < event.m_mc_vec.size(); i++ ) { - auto p = event.m_mc_vec.at(i); - std::cout<< "PDG :"<< p.getPDG ()<<std::endl - << "id :"<< p.id ()<<std::endl - << "ID :"<< p.getObjectID().index <<std::endl - << "GeneratorStatus :"<< p.getGeneratorStatus ()<<std::endl - << "SimulatorStatus :"<< p.getSimulatorStatus ()<<std::endl - << "Charge :"<< p.getCharge ()<<std::endl - << "Time :"<< p.getTime ()<<std::endl - << "Mass :"<< p.getMass ()<<std::endl - << "Vertex :"<< p.getVertex ()<<std::endl - << "Endpoint :"<< p.getEndpoint ()<<std::endl - << "Momentum :"<< p.getMomentum ()<<std::endl - << "MomentumAtEndpoint:"<< p.getMomentumAtEndpoint()<<std::endl - << "Spin :"<< p.getSpin ()<<std::endl - << "ColorFlow :"<< p.getColorFlow ()<<std::endl - << "Parent size :"<< p.parents_size ()<<std::endl - << "Daughter size :"<< p.daughters_size ()<<std::endl; - //for(unsigned int j=0; j<p.parents_size(); j++) std::cout << " for parent: "<< j << ",PDG="<< p.getParents(j).getPDG() << ",id=:"<< p.getParents(j).id()<<std::endl; - for (auto it = p.parents_begin(), end = p.parents_end(); it != end ; ++it ) std::cout << " for parent ,PDG="<< it->getPDG() << ",id=:"<< it->getObjectID().index<<std::endl; + auto p = event.m_mc_vec.at(i); + std::cout<< "PDG :"<< p.getPDG ()<<std::endl + << "id :"<< p.id ()<<std::endl + << "ID :"<< p.getObjectID().index <<std::endl + << "GeneratorStatus :"<< p.getGeneratorStatus ()<<std::endl + << "SimulatorStatus :"<< p.getSimulatorStatus ()<<std::endl + << "Charge :"<< p.getCharge ()<<std::endl + << "Time :"<< p.getTime ()<<std::endl + << "Mass :"<< p.getMass ()<<std::endl + << "Vertex :"<< p.getVertex ()<<std::endl + << "Endpoint :"<< p.getEndpoint ()<<std::endl + << "Momentum :"<< p.getMomentum ()<<std::endl + << "MomentumAtEndpoint:"<< p.getMomentumAtEndpoint()<<std::endl + << "Spin :"<< p.getSpin ()<<std::endl + << "ColorFlow :"<< p.getColorFlow ()<<std::endl + << "Parent size :"<< p.parents_size ()<<std::endl + << "Daughter size :"<< p.daughters_size ()<<std::endl; + //for(unsigned int j=0; j<p.parents_size(); j++) std::cout << " for parent: "<< j << ",PDG="<< p.getParents(j).getPDG() << ",id=:"<< p.getParents(j).id()<<std::endl; + for (auto it = p.parents_begin(), end = p.parents_end(); it != end ; ++it ) { + std::cout << " - parent, PDG=" << it->getPDG() + << ", id=" << it->id() + << ", ID=" << it->getObjectID().index + << std::endl; + } + + for (auto it = p.daughters_begin(), end = p.daughters_end(); it != end ; ++it ) { + std::cout << " - daughter, PDG=" << it->getPDG() + << ", id=" << it->id() + << ", ID=" << it->getObjectID().index + << std::endl; + } } + return true; } diff --git a/Generator/src/GenWriter.cpp b/Generator/src/GenWriter.cpp deleted file mode 100644 index f1f93a571dabc98f710c660754ae6507248c0212..0000000000000000000000000000000000000000 --- a/Generator/src/GenWriter.cpp +++ /dev/null @@ -1,44 +0,0 @@ -#include "GenWriter.h" -#include "GenEvent.h" - -#include "podio/EventStore.h" //podio -#include "podio/ROOTWriter.h" - - -#include "plcio/MCParticleCollection.h"//plico -#include "plcio/EventHeaderCollection.h" - - -GenWriter::GenWriter(string name){ - m_output_name = name; - store = new podio::EventStore(); - writer = new podio::ROOTWriter(m_output_name, store); - ehc = &store->create<plcio::EventHeaderCollection>("EvtHeaders"); - mcc = &store->create<plcio::MCParticleCollection>("MCParticles"); - - writer->registerForWrite("EvtHeaders"); - writer->registerForWrite("MCParticles"); -} - -GenWriter::~GenWriter(){ -} - -bool GenWriter::mutate(MyHepMC::GenEvent& event){ - std::cout << "write mc info for event "<< event.getID() << ", mc size ="<< event.m_mc_vec.size() << std::endl; - mcc=&event.m_mc_vec; - auto header = plcio::EventHeader(event.getID(), event.getRun(), event.getTime(), event.getName()); - ehc->push_back(header); - writer->writeEvent(); - store->clearCollections(); - return true; -} - -bool GenWriter::configure(){ -return true; -} - -bool GenWriter::finish(){ - writer->finish(); - std::cout<<"Saved root "<<m_output_name<<std::endl; - return true; -} diff --git a/Generator/src/GenWriter.h b/Generator/src/GenWriter.h deleted file mode 100644 index 30e6db4365343c44f0f7de97781774f0e5700db3..0000000000000000000000000000000000000000 --- a/Generator/src/GenWriter.h +++ /dev/null @@ -1,35 +0,0 @@ -#ifndef GenWriter_h -#define GenWriter_h 1 - -#include "GenEvent.h" -#include "IGenTool.h" - -#include "podio/EventStore.h" //podio -#include "podio/ROOTWriter.h" - - -#include "plcio/MCParticleCollection.h"//plico -#include "plcio/EventHeaderCollection.h" - - - -using namespace std; - -class GenWriter: public IGenTool{ - - public: - GenWriter(string name); - ~GenWriter(); - bool configure() override; - bool mutate(MyHepMC::GenEvent& event) override; - bool finish() override; - private: - string m_output_name; - podio::EventStore* store ; - podio::ROOTWriter* writer; - plcio::EventHeaderCollection* ehc ; - plcio::MCParticleCollection* mcc ; - -}; - -#endif diff --git a/Generator/src/GtBeamBackgroundTool.cpp b/Generator/src/GtBeamBackgroundTool.cpp index 1fe4797b5e42b8ded7f5a049e5d938ecd7e4acd6..fba5b0b4da7c995d8c09ceb7581cfdbf9de79ba0 100644 --- a/Generator/src/GtBeamBackgroundTool.cpp +++ b/Generator/src/GtBeamBackgroundTool.cpp @@ -1,6 +1,8 @@ #include "GtBeamBackgroundTool.h" #include "IBeamBackgroundFileParser.h" + #include "BeamBackgroundFileParserV0.h" +#include "GuineaPigPairsFileParser.h" #include "TVector3.h" // for rotation DECLARE_COMPONENT(GtBeamBackgroundTool) @@ -11,17 +13,21 @@ StatusCode GtBeamBackgroundTool::initialize() { // create the instances of the background parsers for (auto& [label, inputfn]: m_inputmaps) { - double beamE = 120.; - auto itBeamE = m_Ebeammaps.find(label); - if (itBeamE != m_Ebeammaps.end()) { - beamE = itBeamE->second; + std::string format = "BeamBackgroundFileParserV0"; + + auto itFormat = m_formatmaps.find(label); + if (itFormat != m_formatmaps.end()) { + format = itFormat->second; + } + + if (format == "BeamBackgroundFileParserV0") { + init_BeamBackgroundFileParserV0(label, inputfn); + } else if (format == "GuineaPigPairsFileParser") { + init_GuineaPigPairsFileParser(label, inputfn); + } else { + init_BeamBackgroundFileParserV0(label, inputfn); } - info() << "Initializing beam background ... " - << label << " " - << beamE << " " - << inputfn - << endmsg; - m_beaminputs[label] = std::make_shared<BeamBackgroundFileParserV0>(inputfn, 11, beamE); + } // check the size @@ -89,3 +95,28 @@ bool GtBeamBackgroundTool::configure_gentool() { return true; } + +bool GtBeamBackgroundTool::init_BeamBackgroundFileParserV0(const std::string& label, + const std::string& inputfn) { + double beamE = 120.; + auto itBeamE = m_Ebeammaps.find(label); + if (itBeamE != m_Ebeammaps.end()) { + beamE = itBeamE->second; + } + info() << "Initializing beam background ... " + << label << " " + << beamE << " " + << inputfn + << endmsg; + m_beaminputs[label] = std::make_shared<BeamBackgroundFileParserV0>(inputfn, 11, beamE); + + return true; +} + +bool GtBeamBackgroundTool::init_GuineaPigPairsFileParser(const std::string& label, + const std::string& inputfn) { + + m_beaminputs[label] = std::make_shared<GuineaPigPairsFileParser>(inputfn); + + return true; +} diff --git a/Generator/src/GtBeamBackgroundTool.h b/Generator/src/GtBeamBackgroundTool.h index 8e0af8e5777a834e7b42f441f2de5e8766e463bc..632f3851fea0e8468d53d9e63ccc42ad34b65dff 100644 --- a/Generator/src/GtBeamBackgroundTool.h +++ b/Generator/src/GtBeamBackgroundTool.h @@ -46,9 +46,14 @@ public: bool finish() override; bool configure_gentool() override; + +private: + bool init_BeamBackgroundFileParserV0(const std::string& label, const std::string& inputfn); + bool init_GuineaPigPairsFileParser(const std::string& label, const std::string& inputfn); + private: Gaudi::Property<std::map<std::string, std::string>> m_inputmaps{this, "InputFileMap"}; - Gaudi::Property<std::map<std::string, std::string>> m_fomatmaps{this, "InputFormatMap"}; + Gaudi::Property<std::map<std::string, std::string>> m_formatmaps{this, "InputFormatMap"}; Gaudi::Property<std::map<std::string, double>> m_ratemaps {this, "InputRateMap"}; // unit of beam energy: GeV diff --git a/Generator/src/GtGunTool.cpp b/Generator/src/GtGunTool.cpp index af2a98dd9fe5397312b31701cdb92c4cb1eb48a7..7f9b56a3a13c63d0f0b41ce9212b9e89371eace0 100644 --- a/Generator/src/GtGunTool.cpp +++ b/Generator/src/GtGunTool.cpp @@ -32,6 +32,39 @@ GtGunTool::initialize() { error() << "Mismatched PositionZs and particles." << endmsg; return StatusCode::FAILURE; } + + + if (m_posZmins.value().size() + && m_posZmins.value().size() != m_particles.value().size()) { + error() << "Mismatched PosZmins and particles." << endmsg; + return StatusCode::FAILURE; + } + if (m_posZmaxs.value().size() + && m_posZmaxs.value().size() != m_particles.value().size()) { + error() << "Mismatched PosZmaxs and particles." << endmsg; + return StatusCode::FAILURE; + } + + if (m_posZmins.value().size() != m_posZmaxs.value().size()) { + error() << "Mismatched PosZmins and PosZmaxs." << endmsg; + return StatusCode::FAILURE; + } + + if (m_posRmins.value().size() + && m_posRmins.value().size() != m_particles.value().size()) { + error() << "Mismatched PosRmins and particles." << endmsg; + return StatusCode::FAILURE; + } + if (m_posRmaxs.value().size() + && m_posRmaxs.value().size() != m_particles.value().size()) { + error() << "Mismatched PosRmaxs and particles." << endmsg; + return StatusCode::FAILURE; + } + + if (m_posRmins.value().size() != m_posRmaxs.value().size()) { + error() << "Mismatched PosRmins and PosRmaxs." << endmsg; + return StatusCode::FAILURE; + } // Energy if (m_energymins.value().size() != m_particles.value().size()) { @@ -137,10 +170,41 @@ GtGunTool::mutate(MyHepMC::GenEvent& event) { double x = 0; double y = 0; double z = 0; + + // ================================== + // 1. if there is fixed positions + // ================================== if (i<m_positionXs.value().size()) { x = m_positionXs.value()[i]; } if (i<m_positionYs.value().size()) { y = m_positionYs.value()[i]; } if (i<m_positionZs.value().size()) { z = m_positionZs.value()[i]; } + // ================================== + // 2. if there are varied positions + // ================================== + if (i<m_posZmins.value().size() and i<m_posZmaxs.value().size()) { + double zmin = m_posZmins.value()[i]; + double zmax = m_posZmaxs.value()[i]; + z = CLHEP::RandFlat::shoot(zmin, zmax); + } + + if (i<m_posRmins.value().size() and i<m_posRmaxs.value().size()) { + double rmin = fabs(m_posRmins.value()[i]); + double rmax = fabs(m_posRmaxs.value()[i]); + + while (true) { + double x_ = CLHEP::RandFlat::shoot(-rmax, rmax); + double y_ = CLHEP::RandFlat::shoot(-rmax, rmax); + double r_ = std::sqrt(x_*x_+y_*y_); + + if (rmin <= r_ && r_ <= rmax) { + x = x_; + y = y_; + break; + } + } + } + + mcp.setVertex(edm4hep::Vector3d(x,y,z)); // mcp.setEndpoint(); diff --git a/Generator/src/GtGunTool.h b/Generator/src/GtGunTool.h index fa4f887007a824d63445cbe940369f48e237b6b6..d4b8d9f81311ebac756836ba656cdc786d7857d0 100644 --- a/Generator/src/GtGunTool.h +++ b/Generator/src/GtGunTool.h @@ -34,14 +34,23 @@ private: Gaudi::Property<std::vector<std::string>> m_particles{this, "Particles"}; + // For fixed positions Gaudi::Property<std::vector<double>> m_positionXs{this, "PositionXs"}; Gaudi::Property<std::vector<double>> m_positionYs{this, "PositionYs"}; Gaudi::Property<std::vector<double>> m_positionZs{this, "PositionZs"}; + // For positions + Gaudi::Property<std::vector<double>> m_posZmins{this, "PosZMins"}; + Gaudi::Property<std::vector<double>> m_posZmaxs{this, "PosZMaxs"}; + Gaudi::Property<std::vector<double>> m_posRmins{this, "PosRMins"}; + Gaudi::Property<std::vector<double>> m_posRmaxs{this, "PosRMaxs"}; + + // For energies Gaudi::Property<std::vector<double>> m_energymins{this, "EnergyMins"}; Gaudi::Property<std::vector<double>> m_energymaxs{this, "EnergyMaxs"}; + // For directions Gaudi::Property<std::vector<double>> m_thetamins{this, "ThetaMins"}; Gaudi::Property<std::vector<double>> m_thetamaxs{this, "ThetaMaxs"}; diff --git a/Generator/src/GuineaPigPairsFileParser.cpp b/Generator/src/GuineaPigPairsFileParser.cpp new file mode 100644 index 0000000000000000000000000000000000000000..13df7f2344679e967cdcf765368f96f2316fc165 --- /dev/null +++ b/Generator/src/GuineaPigPairsFileParser.cpp @@ -0,0 +1,62 @@ +#include "GuineaPigPairsFileParser.h" +#include <sstream> +#include <cmath> + +GuineaPigPairsFileParser::GuineaPigPairsFileParser(const std::string& filename) { + m_input.open(filename.c_str()); +} + +bool GuineaPigPairsFileParser::load(IBeamBackgroundFileParser::BeamBackgroundData& result) { + if (not m_input.good()) { + return false; + } + + // read one record + std::string tmpline; + // the format + double energy; // unit: GeV + double vx; // unit: c + double vy; // unit: c + double vz; // unit: c + double x; // unit: nm + double y; // unit: nm + double z; // unit: nm + int process; + + while(m_input.good()) { + std::getline(m_input, tmpline); + std::stringstream ss; + ss << tmpline; + ss >> energy; if (ss.fail()) { continue; } + ss >> vx; if (ss.fail()) { continue; } + ss >> vy; if (ss.fail()) { continue; } + ss >> vz; if (ss.fail()) { continue; } + ss >> x; if (ss.fail()) { continue; } + ss >> y; if (ss.fail()) { continue; } + ss >> z; if (ss.fail()) { continue; } + ss >> process; if (ss.fail()) { continue; } + + int pdgid = 11; // 11: electron; -11: positron + if (energy<0) pdgid = -11; + + double p = std::fabs(energy); + double v = sqrt(vx*vx+vy*vy+vz*vz); + + // Now, we get a almost valid data + const double nm2mm = 1e-6; // convert from nm to mm + result.pdgid = pdgid; + result.x = x * nm2mm; + result.y = y * nm2mm; + result.z = z * nm2mm; + + result.px = p * vx/v; + result.py = p * vy/v; + result.pz = p * vz/v; + + result.mass = 0.000511; // assume e-/e+, mass is 0.511 MeV + + return true; + } + return false; + +} diff --git a/Generator/src/GuineaPigPairsFileParser.h b/Generator/src/GuineaPigPairsFileParser.h new file mode 100644 index 0000000000000000000000000000000000000000..078a38a0c7a62f5dc4fc9ef70e7655353405c306 --- /dev/null +++ b/Generator/src/GuineaPigPairsFileParser.h @@ -0,0 +1,32 @@ +#ifndef GuineaPigPairsFileParser_h +#define GuineaPigPairsFileParser_h + +#include "IBeamBackgroundFileParser.h" +#include <fstream> + +/* Format of Guinea-Pig Pairs: + * + * E vx vy vz x y z process + * + * Notes: + * - E (GeV). If E>0, it is electron. If E<0, it is positron + * - vx/vy/vz (speed of light) + * - x/y/z (nm) + * - process + * - 0: Breit-Wheeler + * - 1: Bethe-Heitler + * - 2: Landau-Lifschitz + * + */ + +class GuineaPigPairsFileParser: public IBeamBackgroundFileParser { +public: + GuineaPigPairsFileParser(const std::string& filename); + + bool load(IBeamBackgroundFileParser::BeamBackgroundData&); + +private: + std::ifstream m_input; +}; + +#endif diff --git a/Generator/src/HepevtRdr.cpp b/Generator/src/HepevtRdr.cpp index 7f036e2e970d5af1292d0ac22bcfc8769748862c..faf5ad9e0c009cccc8acee12f4e20d8dec16f1fb 100644 --- a/Generator/src/HepevtRdr.cpp +++ b/Generator/src/HepevtRdr.cpp @@ -7,12 +7,10 @@ #include "IMPL/MCParticleImpl.h" -#include "plcio/MCParticle.h" //plcio -#include "plcio/MCParticleObj.h" -#include "plcio/MCParticleCollection.h" -#include "plcio/DoubleThree.h" -#include "plcio/FloatThree.h" -#include "plcio/EventHeaderCollection.h" +#include "edm4hep/MCParticle.h" //edm4hep +#include "edm4hep/MCParticleObj.h" +#include "edm4hep/MCParticleCollection.h" +#include "edm4hep/EventHeaderCollection.h" @@ -23,7 +21,7 @@ using namespace lcio; using namespace IMPL; -using namespace plcio; +using namespace edm4hep; using namespace std; typedef enum HEPFILEFORMATS @@ -35,28 +33,57 @@ typedef enum HEPFILEFORMATS } HEPFILEFORMAT; -HepevtRdr::HepevtRdr(string name){ +DECLARE_COMPONENT(HepevtRdr) -m_hepevt_rdr = new UTIL::LCAscHepRdr(name.c_str(), hepevt); -m_processed_event=0; -std::cout<<"initial hepevt_rdr"<<std::endl; +HepevtRdr::~HepevtRdr(){ + delete m_hepevt_rdr; } -HepevtRdr::~HepevtRdr(){ -delete m_hepevt_rdr; +StatusCode HepevtRdr::initialize() { + StatusCode sc; + if (not configure_gentool()) { + error() << "failed to initialize." << endmsg; + return StatusCode::FAILURE; + } + + return sc; +} + +StatusCode HepevtRdr::finalize() { + StatusCode sc; + if (not finish()) { + error() << "Failed to finalize." << endmsg; + return StatusCode::FAILURE; + } + return sc; +} + + +bool HepevtRdr::configure_gentool(){ + int format = hepevt; + if (m_format == "HEPEvt") { + format = HEPEvt; + } else if (m_format == "hepevt") { + format = hepevt; + } + + m_hepevt_rdr = new UTIL::LCAscHepRdr(m_filename.value().c_str(), format); + m_processed_event=0; + std::cout<<"initial hepevt_rdr"<<std::endl; + return true; } bool HepevtRdr::mutate(MyHepMC::GenEvent& event){ LCCollectionVec* mc_vec = m_hepevt_rdr->readEvent(); if(mc_vec==nullptr) return false; m_processed_event ++; - int n_mc = mc_vec->getNumberOfElements(); + int n_mc = mc_vec->size(); std::cout<<"Read event :"<< m_processed_event <<", mc size :"<< n_mc <<std::endl; std::map<int, int> pmcid_lmcid; for (int i=0; i < n_mc; i++){ MCParticleImpl* mc = (MCParticleImpl*) mc_vec->getElementAt(i); - //std::cout<<"At mc :"<< i <<std::endl; - plcio::MCParticle mcp = event.m_mc_vec.create(); + // std::cout<<"At mc :"<< i <<std::endl; + auto mcp = event.m_mc_vec.create(); pmcid_lmcid.insert(std::pair<int, int>(mc->id(),i)); //std::cout<<"map<id,i>:"<<mc->id()<<","<< i <<std::endl; @@ -68,8 +95,8 @@ bool HepevtRdr::mutate(MyHepMC::GenEvent& event){ mcp.setMass (mc->getMass()); mcp.setVertex (mc->getVertex()); mcp.setEndpoint (mc->getEndpoint()); - mcp.setMomentum (FloatThree(float(mc->getMomentum()[0]), float(mc->getMomentum()[1]), float(mc->getMomentum()[2]) )); - mcp.setMomentumAtEndpoint (FloatThree(float(mc->getMomentumAtEndpoint()[0]), float(mc->getMomentumAtEndpoint()[1]), float(mc->getMomentumAtEndpoint()[2]) )); + mcp.setMomentum (edm4hep::Vector3f(float(mc->getMomentum()[0]), float(mc->getMomentum()[1]), float(mc->getMomentum()[2]) )); + mcp.setMomentumAtEndpoint (edm4hep::Vector3f(float(mc->getMomentumAtEndpoint()[0]), float(mc->getMomentumAtEndpoint()[1]), float(mc->getMomentumAtEndpoint()[2]) )); mcp.setSpin (mc->getSpin()); mcp.setColorFlow (mc->getColorFlow()); } @@ -79,16 +106,16 @@ bool HepevtRdr::mutate(MyHepMC::GenEvent& event){ MCParticleImpl* mc = (MCParticleImpl*) mc_vec->getElementAt(i); const MCParticleVec & mc_parents = mc->getParents(); const MCParticleVec & mc_daughters = mc->getDaughters(); - plcio::MCParticle pmc = event.m_mc_vec.at(i); + auto pmc = event.m_mc_vec.at(i); //std::cout<<"mc at "<< i<<", parent size "<<mc_parents.size() <<std::endl; for(unsigned int j=0; j< mc_parents.size(); j++){int p_id = mc_parents.at(j)->id(); //std::cout<<"parent id "<<p_id<<std::endl; - pmc.addParent( event.m_mc_vec.at( pmcid_lmcid.at(p_id) ) ); + pmc.addToParents( event.m_mc_vec.at( pmcid_lmcid.at(p_id) ) ); } //std::cout<<"mc at "<< i<<", daughter size "<<mc_daughters.size() <<std::endl; for(unsigned int j=0; j< mc_daughters.size(); j++){int d_id = mc_daughters.at(j)->id(); //std::cout<<"daughter id "<<d_id<<std::endl; - pmc.addDaughter( event.m_mc_vec.at( pmcid_lmcid.at(d_id) ) ); + pmc.addToDaughters( event.m_mc_vec.at( pmcid_lmcid.at(d_id) ) ); } } @@ -98,13 +125,9 @@ bool HepevtRdr::mutate(MyHepMC::GenEvent& event){ } bool HepevtRdr::isEnd(){ -return false; -} - -bool HepevtRdr::configure(){ -return true; + return false; } bool HepevtRdr::finish(){ -return true; + return true; } diff --git a/Generator/src/HepevtRdr.h b/Generator/src/HepevtRdr.h index 9ee2d7fd411f554fdc2114ca854f2fc52f8e7a62..7a1de27f7cebe2da2ecf19161575156172618bfc 100644 --- a/Generator/src/HepevtRdr.h +++ b/Generator/src/HepevtRdr.h @@ -1,6 +1,8 @@ #ifndef HepevtRdr_h #define HepevtRdr_h 1 +#include "GaudiKernel/AlgTool.h" + #include "GenReader.h" #include "GenEvent.h" @@ -8,19 +10,27 @@ #include "EVENT/LCIO.h" #include "LCAscHepRdr.h" -class HepevtRdr: public GenReader{ +class HepevtRdr: public extends<AlgTool, GenReader> { public: - HepevtRdr(string name); + using extends::extends; ~HepevtRdr(); - bool configure(); + + StatusCode initialize() override; + StatusCode finalize() override; + + bool configure_gentool(); bool mutate(MyHepMC::GenEvent& event); bool finish(); bool isEnd(); private: - UTIL::LCAscHepRdr* m_hepevt_rdr; - long m_total_event; - long m_processed_event; + UTIL::LCAscHepRdr* m_hepevt_rdr = nullptr; + long m_total_event = -1; + long m_processed_event = -1; + + // input file name + Gaudi::Property<std::string> m_filename{this, "Input"}; + Gaudi::Property<std::string> m_format{this, "Format"}; }; #endif diff --git a/Generator/src/LCAscHepRdr.cc b/Generator/src/LCAscHepRdr.cc index eabca0bb170238264887b321795fcc401b36f777..ac99d8f22ac895b5b49f31766453ffd7a9b639a6 100644 --- a/Generator/src/LCAscHepRdr.cc +++ b/Generator/src/LCAscHepRdr.cc @@ -56,11 +56,16 @@ namespace UTIL{ // // Read the event, check for errors // - int NHEP; // number of entries - int NOUT ; // number of outgoing particles - int BRE ; // beam remnants - double WEIGHT ; // weight - inputFile >> NHEP >> NOUT >> BRE >> WEIGHT; + int NHEP = -1; // number of entries + int NOUT = -1; // number of outgoing particles + int BRE = -1; // beam remnants + double WEIGHT = -1; // weight + + std::string line; // modified by Tao + std::getline(inputFile, line); + std::stringstream ss_(line); + ss_ >> NHEP >> NOUT >> BRE >> WEIGHT; + // std::cout << "NHEP: " << NHEP << std::endl; if( inputFile.eof() ) { // @@ -74,6 +79,7 @@ namespace UTIL{ // Create a Collection Vector // mcVec = new IMPL::LCCollectionVec(LCIO::MCPARTICLE); + // std::cout << "mc size: " << mcVec->size() << std::endl; MCParticleImpl* p; MCParticleImpl* d; @@ -101,12 +107,18 @@ namespace UTIL{ for( int IHEP=0; IHEP<NHEP; IHEP++ ) { - //if ( theFileFormat == HEPEvt) - if ( false) - inputFile >> ISTHEP >> IDHEP >> JDAHEP1 >> JDAHEP2 + std::getline(inputFile, line); + if(inputFile.eof()) + return nullptr; + + // std::cout << "LINE: " << line << std::endl; + std::stringstream ss(line); + + if ( theFileFormat == HEPEvt) + ss >> ISTHEP >> IDHEP >> JDAHEP1 >> JDAHEP2 >> PHEP1 >> PHEP2 >> PHEP3 >> PHEP5; else - inputFile >> ISTHEP >> IDHEP + ss >> ISTHEP >> IDHEP >> JMOHEP1 >> JMOHEP2 >> JDAHEP1 >> JDAHEP2 >> PHEP1 >> PHEP2 >> PHEP3 @@ -114,8 +126,8 @@ namespace UTIL{ >> VHEP1 >> VHEP2 >> VHEP3 >> VHEP4; - if(inputFile.eof()) - return nullptr; + // std::cout << "ISTHEP: " << ISTHEP << std::endl; + // // Create a MCParticle and fill it from stdhep info // @@ -124,6 +136,7 @@ namespace UTIL{ // PDGID // mcp->setPDG(IDHEP); + // std::cout << "PDG: " << IDHEP << std::endl; // // Momentum vector // @@ -221,6 +234,7 @@ namespace UTIL{ // for( int IHEP=0; IHEP<NHEP; IHEP++ ) { + // continue; // // Get the MCParticle // diff --git a/Generator/src/StdHepRdr.cpp b/Generator/src/StdHepRdr.cpp index b56342b0bfb25de4eb4ceee6b6d6362004bcb1bd..4255e4bd314f3549f0bea3f56be3d4e470221c5a 100644 --- a/Generator/src/StdHepRdr.cpp +++ b/Generator/src/StdHepRdr.cpp @@ -36,13 +36,13 @@ bool StdHepRdr::mutate(MyHepMC::GenEvent& event){ m_processed_event ++; int n_mc = mc_vec->getNumberOfElements(); //std::cout<<"Debug: Read event :"<< m_processed_event <<", mc size :"<< n_mc <<std::endl; - std::map<int, int> pmcid_lmcid; + std::map<int, int> pmcid_lmcid; // mapping between the obj idx in edm4hep and the idx in stdhep for (int i=0; i < n_mc; i++){ MCParticleImpl* mc = (MCParticleImpl*) mc_vec->getElementAt(i); //std::cout<<"At mc :"<< i <<std::endl; auto mcp = event.m_mc_vec.create(); pmcid_lmcid.insert(std::pair<int, int>(mc->id(),i)); - //std::cout<<"map<id,i>:"<<mc->id()<<","<< i <<std::endl; + // std::cout<<"map<id,i>:"<<mc->id()<<","<< i <<std::endl; mcp.setPDG (mc->getPDG()); mcp.setGeneratorStatus (mc->getGeneratorStatus()); diff --git a/Reconstruction/PFA/Arbor/src/ArborToolLCIO.cc b/Reconstruction/PFA/Arbor/src/ArborToolLCIO.cc index d97a82d6e86aa8b2d97b52b6504011d571c6f172..6a1e0cc20da795c05f1e7bc328060f5b232f91a8 100644 --- a/Reconstruction/PFA/Arbor/src/ArborToolLCIO.cc +++ b/Reconstruction/PFA/Arbor/src/ArborToolLCIO.cc @@ -35,6 +35,8 @@ #include <DDRec/CellIDPositionConverter.h> #include "DetInterface/IGeomSvc.h" +#include "podio/podioVersion.h" + using namespace std; /* void ClusterBuilding( LCEvent * evtPP, std::string Name, std::vector<CalorimeterHit*> Hits, std::vector< std::vector<int> > BranchOrder, int DHCALFlag ) @@ -859,7 +861,12 @@ edm4hep::ClusterCollection* ArborToolLCIO::ClusterVecMerge( std::vector<edm4hep: edm4hep::Cluster Mergebranch_A; edm4hep::Cluster Mergebranch_B; edm4hep::Cluster tmpMergebranch; +#if PODIO_BUILD_VERSION < PODIO_VERSION(0, 17, 4) edm4hep::Cluster Mainbranch (0); +#else + auto Mainbranch = edm4hep::Cluster::makeEmpty(); +#endif + TVector3 tmpClusterSeedPos, MBSeedPos; diff --git a/Reconstruction/PFA/Pandora/GaudiPandora/src/MCParticleCreator.cpp b/Reconstruction/PFA/Pandora/GaudiPandora/src/MCParticleCreator.cpp index 1912eee92592f0b8071fcabed38259a61c049f87..48908a6439a27cc352020a83572640803034f777 100644 --- a/Reconstruction/PFA/Pandora/GaudiPandora/src/MCParticleCreator.cpp +++ b/Reconstruction/PFA/Pandora/GaudiPandora/src/MCParticleCreator.cpp @@ -53,7 +53,7 @@ pandora::StatusCode MCParticleCreator::CreateMCParticles(const CollectionMaps& c mcParticleParameters.m_particleId = pMcParticle.getPDG(); mcParticleParameters.m_mcParticleType = pandora::MC_3D; mcParticleParameters.m_pParentAddress = &pMcParticle; - unsigned int p_id = pMcParticle.id(); + unsigned int p_id = pMcParticle.id().index; //auto p_mc = const_cast<edm4hep::MCParticle*>(&pMcParticle); auto p_mc = &pMcParticle; (*m_id_pMC_map) [p_id] = p_mc; @@ -131,8 +131,8 @@ pandora::StatusCode MCParticleCreator::CreateCaloHitToMCParticleRelationships(co auto conb = pSimHit.getContributions(iCont); auto ipa = conb.getParticle(); float ien = conb.getEnergy(); - if( m_id_pMC_map->find(ipa.id()) == m_id_pMC_map->end() ) continue; - auto p_tmp = (*m_id_pMC_map)[ipa.id()]; + if( m_id_pMC_map->find(ipa.id().index) == m_id_pMC_map->end() ) continue; + auto p_tmp = (*m_id_pMC_map)[ipa.id().index]; mcParticleToEnergyWeightMap[p_tmp] += ien; } @@ -190,13 +190,13 @@ pandora::StatusCode MCParticleCreator::CreateTrackToMCParticleRelationships(cons if( pMCRecoTrackerAssociationCollection.at(ic).getRec().id() != pTrack->getTrackerHits(ith).id() ) continue; auto pSimHit = pMCRecoTrackerAssociationCollection.at(ic).getSim(); auto ipa = pSimHit.getMCParticle(); - if( m_id_pMC_map->find(ipa.id()) == m_id_pMC_map->end() ) continue; + if( m_id_pMC_map->find(ipa.id().index) == m_id_pMC_map->end() ) continue; const float trueMomentum(pandora::CartesianVector(ipa.getMomentum()[0], ipa.getMomentum()[1], ipa.getMomentum()[2]).GetMagnitude()); const float deltaMomentum(std::fabs(recoMomentum - trueMomentum)); if (deltaMomentum < bestDeltaMomentum) { //pBestMCParticle =((*m_id_pMC_map)[ipa.id()]); - best_mc_id = ipa.id() ; + best_mc_id = ipa.id().index ; bestDeltaMomentum = deltaMomentum; } } diff --git a/Reconstruction/PFA/Pandora/GaudiPandora/src/PandoraPFAlg.cpp b/Reconstruction/PFA/Pandora/GaudiPandora/src/PandoraPFAlg.cpp index cfe8f2f25f1906723527534f6ec3154616c752c7..a95ea9c70b872d0731245f911af378d8e8a6dc30 100644 --- a/Reconstruction/PFA/Pandora/GaudiPandora/src/PandoraPFAlg.cpp +++ b/Reconstruction/PFA/Pandora/GaudiPandora/src/PandoraPFAlg.cpp @@ -669,9 +669,9 @@ StatusCode PandoraPFAlg::CreateMCRecoParticleAssociation() if(it->getRec().id() != hit.id()) continue; for(auto itc = it->getSim().contributions_begin(); itc != it->getSim().contributions_end(); itc++) { - if(mc_map.find(itc->getParticle().id()) == mc_map.end()) mc_map[itc->getParticle().id()] = itc->getParticle() ; - if(id_edep_map.find(itc->getParticle().id()) != id_edep_map.end()) id_edep_map[itc->getParticle().id()] = id_edep_map[itc->getParticle().id()] + itc->getEnergy() ; - else id_edep_map[itc->getParticle().id()] = itc->getEnergy() ; + if(mc_map.find(itc->getParticle().id().index) == mc_map.end()) mc_map[itc->getParticle().id().index] = itc->getParticle() ; + if(id_edep_map.find(itc->getParticle().id().index) != id_edep_map.end()) id_edep_map[itc->getParticle().id().index] = id_edep_map[itc->getParticle().id().index] + itc->getEnergy() ; + else id_edep_map[itc->getParticle().id().index] = itc->getEnergy() ; tot_en += itc->getEnergy() ; } } diff --git a/Reconstruction/PFA/Pandora/GaudiPandora/src/TrackCreator.cpp b/Reconstruction/PFA/Pandora/GaudiPandora/src/TrackCreator.cpp index 940d116f14d5682f6adfdd530deba7777a0c9d0d..8ebe8e239504f3475fa07c64db0199a72ea2e72b 100644 --- a/Reconstruction/PFA/Pandora/GaudiPandora/src/TrackCreator.cpp +++ b/Reconstruction/PFA/Pandora/GaudiPandora/src/TrackCreator.cpp @@ -10,6 +10,14 @@ #include "edm4hep/Vertex.h" #include "edm4hep/Vector3f.h" #include "edm4hep/ReconstructedParticle.h" +#if __has_include("edm4hep/EDM4hepVersion.h") +#include "edm4hep/EDM4hepVersion.h" +#else +// Copy the necessary parts from the header above to make whatever we need to work here +#define EDM4HEP_VERSION(major, minor, patch) ((UINT64_C(major) << 32) | (UINT64_C(minor) << 16) | (UINT64_C(patch))) +// v00-09 is the last version without the capitalization change of the track vector members +#define EDM4HEP_BUILD_VERSION EDM4HEP_VERSION(0, 9, 0) +#endif #include "gear/BField.h" #include "gear/CalorimeterParameters.h" @@ -313,7 +321,7 @@ pandora::StatusCode TrackCreator::ExtractKinks(const CollectionMaps& collectionM for (unsigned int iTrack = 0, nTracks = pReconstructedParticle.tracks_size(); iTrack < nTracks; ++iTrack) { auto pTrack = pReconstructedParticle.getTracks(iTrack); - (0 == iTrack) ? m_parentTrackList.insert(pTrack.id()) : m_daughterTrackList.insert(pTrack.id()); + (0 == iTrack) ? m_parentTrackList.insert(pTrack.id().index) : m_daughterTrackList.insert(pTrack.id().index); int trackPdgCode = pandora::UNKNOWN_PARTICLE_TYPE; @@ -413,7 +421,7 @@ pandora::StatusCode TrackCreator::ExtractProngsAndSplits(const CollectionMaps& c for (unsigned int iTrack = 0, nTracks = pReconstructedParticle.tracks_size(); iTrack < nTracks; ++iTrack) { edm4hep::Track pTrack = pReconstructedParticle.getTracks(iTrack); - (0 == iTrack) ? m_parentTrackList.insert(pTrack.id()) : m_daughterTrackList.insert(pTrack.id()); + (0 == iTrack) ? m_parentTrackList.insert(pTrack.id().index) : m_daughterTrackList.insert(pTrack.id().index); if (0 == m_settings.m_shouldFormTrackRelationships) continue; @@ -482,7 +490,7 @@ pandora::StatusCode TrackCreator::ExtractV0s(const CollectionMaps& collectionMap for (unsigned int iTrack = 0, nTracks = pReconstructedParticle.tracks_size(); iTrack < nTracks; ++iTrack) { edm4hep::Track pTrack = pReconstructedParticle.getTracks(iTrack); - m_v0TrackList.insert(pTrack.id()); + m_v0TrackList.insert(pTrack.id().index); int trackPdgCode = pandora::UNKNOWN_PARTICLE_TYPE; @@ -538,7 +546,7 @@ bool TrackCreator::IsConflictingRelationship(const edm4hep::ReconstructedParticl for (unsigned int iTrack = 0, nTracks = Particle.tracks_size(); iTrack < nTracks; ++iTrack) { edm4hep::Track pTrack = Particle.getTracks(iTrack) ; - unsigned int pTrack_id = pTrack.id() ; + unsigned int pTrack_id = pTrack.id().index ; if (this->IsDaughter(pTrack_id) || this->IsParent(pTrack_id) || this->IsV0(pTrack_id)) return true; @@ -851,7 +859,7 @@ void TrackCreator::DefineTrackPfoUsage(const edm4hep::Track *const pTrack, Pando bool canFormPfo(false); bool canFormClusterlessPfo(false); - if (trackParameters.m_reachesCalorimeter.Get() && !this->IsParent(pTrack->id())) + if (trackParameters.m_reachesCalorimeter.Get() && !this->IsParent(pTrack->id().index)) { const float d0(std::fabs(pTrack->getTrackStates(0).D0)), z0(std::fabs(pTrack->getTrackStates(0).Z0)); @@ -880,8 +888,8 @@ void TrackCreator::DefineTrackPfoUsage(const edm4hep::Track *const pTrack, Pando const float zCutForNonVertexTracks(m_tpcInnerR * std::fabs(pZ / pT) + m_settings.m_zCutForNonVertexTracks); const bool passRzQualityCuts((zMin < zCutForNonVertexTracks) && (rInner < m_tpcInnerR + m_settings.m_maxTpcInnerRDistance)); - const bool isV0(this->IsV0(pTrack->id())); - const bool isDaughter(this->IsDaughter(pTrack->id())); + const bool isV0(this->IsV0(pTrack->id().index)); + const bool isDaughter(this->IsDaughter(pTrack->id().index)); // Decide whether track can be associated with a pandora cluster and used to form a charged PFO if ((d0 < m_settings.m_d0TrackCut) && (z0 < m_settings.m_z0TrackCut) && (rInner < m_tpcInnerR + m_settings.m_maxTpcInnerRDistance)) @@ -918,7 +926,7 @@ void TrackCreator::DefineTrackPfoUsage(const edm4hep::Track *const pTrack, Pando } } } - else if (this->IsDaughter(pTrack->id()) || this->IsV0(pTrack->id())) + else if (this->IsDaughter(pTrack->id().index) || this->IsV0(pTrack->id().index)) { std::cout<<"WARNING Recovering daughter or v0 track " << trackParameters.m_momentumAtDca.Get().GetMagnitude() << std::endl; canFormPfo = true; @@ -1020,9 +1028,15 @@ int TrackCreator::GetNTpcHits(const edm4hep::Track *const pTrack) const //According to FG: [ 2 * lcio::ILDDetID::TPC - 2 ] is the first number and it is supposed to //be the number of hits in the fit and this is what should be used ! // at least for DD4hep/DDSim +#if EDM4HEP_BUILD_VERSION > EDM4HEP_VERSION(0, 9, 0) + return pTrack->getSubdetectorHitNumbers(3);//FIXME https://github.com/wenxingfang/CEPCSW/blob/master/Reconstruction/Tracking/src/FullLDCTracking/FullLDCTrackingAlg.cpp#L483 + } + else return pTrack->getSubdetectorHitNumbers(2 * 4 - 1);// lcio::ILDDetID::TPC=4, still use LCIO code now +#else return pTrack->getSubDetectorHitNumbers(3);//FIXME https://github.com/wenxingfang/CEPCSW/blob/master/Reconstruction/Tracking/src/FullLDCTracking/FullLDCTrackingAlg.cpp#L483 } else return pTrack->getSubDetectorHitNumbers(2 * 4 - 1);// lcio::ILDDetID::TPC=4, still use LCIO code now +#endif } //------------------------------------------------------------------------------------------------------------------------------------------ @@ -1036,9 +1050,16 @@ int TrackCreator::GetNFtdHits(const edm4hep::Track *const pTrack) const // ---- use hitsInFit : //return pTrack->getSubdetectorHitNumbers()[ 2 * lcio::ILDDetID::FTD - 1 ]; if(m_settings.m_use_dd4hep_geo){ +#if EDM4HEP_BUILD_VERSION > EDM4HEP_VERSION(0, 9, 0) + return pTrack->getSubdetectorHitNumbers(1);//FIXME https://github.com/wenxingfang/CEPCSW/blob/master/Reconstruction/Tracking/src/FullLDCTracking/FullLDCTrackingAlg.cpp#L481 + } + else return pTrack->getSubdetectorHitNumbers( 2 * 3 - 1 );// lcio::ILDDetID::FTD=3 +#else return pTrack->getSubDetectorHitNumbers(1);//FIXME https://github.com/wenxingfang/CEPCSW/blob/master/Reconstruction/Tracking/src/FullLDCTracking/FullLDCTrackingAlg.cpp#L481 } else return pTrack->getSubDetectorHitNumbers( 2 * 3 - 1 );// lcio::ILDDetID::FTD=3 + +#endif } //------------------------------------------------------------------------------------------------------------------------------------------ diff --git a/Reconstruction/PFA/Pandora/MatrixPandora/src/MCParticleCreator.cpp b/Reconstruction/PFA/Pandora/MatrixPandora/src/MCParticleCreator.cpp index 40f44d1a4a5a3f76cf8f527c704d855eeb709ddb..2da13168523268d37056960708474d8891c12ad2 100644 --- a/Reconstruction/PFA/Pandora/MatrixPandora/src/MCParticleCreator.cpp +++ b/Reconstruction/PFA/Pandora/MatrixPandora/src/MCParticleCreator.cpp @@ -57,7 +57,7 @@ pandora::StatusCode MCParticleCreator::CreateMCParticles(const CollectionMaps& c mcParticleParameters.m_particleId = pMcParticle.getPDG(); mcParticleParameters.m_mcParticleType = pandora::MC_3D; mcParticleParameters.m_pParentAddress = &pMcParticle; - unsigned int p_id = pMcParticle.id(); + unsigned int p_id = pMcParticle.id().index; auto p_mc = &pMcParticle; (*m_id_pMC_map) [p_id] = p_mc; mcParticleParameters.m_momentum = pandora::CartesianVector(pMcParticle.getMomentum()[0], pMcParticle.getMomentum()[1], @@ -271,8 +271,8 @@ pandora::StatusCode MCParticleCreator::CreateCaloHitToMCParticleRelationships(co edm4hep::CaloHitContribution conb = pSimHit.getContributions(iCont); auto ipa = conb.getParticle(); float ien = conb.getEnergy(); - if( m_id_pMC_map->find(ipa.id()) == m_id_pMC_map->end() ) continue; - auto p_tmp = (*m_id_pMC_map)[ipa.id()]; + if( m_id_pMC_map->find(ipa.id().index) == m_id_pMC_map->end() ) continue; + auto p_tmp = (*m_id_pMC_map)[ipa.id().index]; mcParticleToEnergyWeightMap[p_tmp] += ien; } @@ -331,12 +331,12 @@ pandora::StatusCode MCParticleCreator::CreateTrackToMCParticleRelationships(cons if( pMCRecoTrackerAssociationCollection.at(ic).getRec().id() != pTrack->getTrackerHits(ith).id() ) continue; auto pSimHit = pMCRecoTrackerAssociationCollection.at(ic).getSim(); auto ipa = pSimHit.getMCParticle(); - if( m_id_pMC_map->find(ipa.id()) == m_id_pMC_map->end() ) continue; + if( m_id_pMC_map->find(ipa.id().index) == m_id_pMC_map->end() ) continue; const float trueMomentum(pandora::CartesianVector(ipa.getMomentum()[0], ipa.getMomentum()[1], ipa.getMomentum()[2]).GetMagnitude()); const float deltaMomentum(std::fabs(recoMomentum - trueMomentum)); if (deltaMomentum < bestDeltaMomentum) { - pBestMCParticle = ((*m_id_pMC_map)[ipa.id()]); + pBestMCParticle = ((*m_id_pMC_map)[ipa.id().index]); bestDeltaMomentum = deltaMomentum; } } diff --git a/Reconstruction/PFA/Pandora/MatrixPandora/src/PandoraMatrixAlg.cpp b/Reconstruction/PFA/Pandora/MatrixPandora/src/PandoraMatrixAlg.cpp index b0a1d7ca4fd4c57807960672cc588f5f3576cf7e..16996f6ca34d503c97f67350c1262ac7343bf45d 100644 --- a/Reconstruction/PFA/Pandora/MatrixPandora/src/PandoraMatrixAlg.cpp +++ b/Reconstruction/PFA/Pandora/MatrixPandora/src/PandoraMatrixAlg.cpp @@ -591,7 +591,7 @@ StatusCode PandoraMatrixAlg::Ana() { if(reco_associa_col->at(j).getRec().id() != pReco.id() ) continue; std::cout<<"MC pid ="<<reco_associa_col->at(j).getSim().getPDG()<<",weight="<<reco_associa_col->at(j).getWeight()<<", px="<<reco_associa_col->at(j).getSim().getMomentum()[0]<<", py="<<reco_associa_col->at(j).getSim().getMomentum()[1]<<",pz="<<reco_associa_col->at(j).getSim().getMomentum()[2]<<std::endl; - tmp_mc_id .push_back(reco_associa_col->at(j).getSim().id()); + tmp_mc_id .push_back(reco_associa_col->at(j).getSim().id().index); tmp_mc_weight.push_back(reco_associa_col->at(j).getWeight()); } m_pReco_mc_id .push_back(tmp_mc_id); @@ -604,7 +604,7 @@ StatusCode PandoraMatrixAlg::Ana() { for(unsigned int i=0 ; i< MCParticle->size(); i++) { - m_mc_id .push_back(MCParticle->at(i).id()); + m_mc_id .push_back(MCParticle->at(i).id().index); m_mc_p_size.push_back(MCParticle->at(i).parents_size()); m_mc_pid .push_back(MCParticle->at(i).getPDG()); m_mc_mass .push_back(MCParticle->at(i).getMass()); @@ -655,9 +655,9 @@ StatusCode PandoraMatrixAlg::CreateMCRecoParticleAssociation() if(it->getRec().id() != hit.id()) continue; for(auto itc = it->getSim().contributions_begin(); itc != it->getSim().contributions_end(); itc++) { - if(mc_map.find(itc->getParticle().id()) == mc_map.end()) mc_map[itc->getParticle().id()] = itc->getParticle() ; - if(id_edep_map.find(itc->getParticle().id()) != id_edep_map.end()) id_edep_map[itc->getParticle().id()] = id_edep_map[itc->getParticle().id()] + itc->getEnergy() ; - else id_edep_map[itc->getParticle().id()] = itc->getEnergy() ; + if(mc_map.find(itc->getParticle().id().index) == mc_map.end()) mc_map[itc->getParticle().id().index] = itc->getParticle() ; + if(id_edep_map.find(itc->getParticle().id().index) != id_edep_map.end()) id_edep_map[itc->getParticle().id().index] = id_edep_map[itc->getParticle().id().index] + itc->getEnergy() ; + else id_edep_map[itc->getParticle().id().index] = itc->getEnergy() ; tot_en += itc->getEnergy() ; } } diff --git a/Reconstruction/PFA/Pandora/MatrixPandora/src/TrackCreator.cpp b/Reconstruction/PFA/Pandora/MatrixPandora/src/TrackCreator.cpp index dd633f076d472d602dcf1406e37e68df69a50d32..c290e069311e26d5294033c7eaddf8bebdde34d9 100644 --- a/Reconstruction/PFA/Pandora/MatrixPandora/src/TrackCreator.cpp +++ b/Reconstruction/PFA/Pandora/MatrixPandora/src/TrackCreator.cpp @@ -10,6 +10,14 @@ #include "edm4hep/Vertex.h" #include "edm4hep/ReconstructedParticle.h" +#if __has_include("edm4hep/EDM4hepVersion.h") +#include "edm4hep/EDM4hepVersion.h" +#else +// Copy the necessary parts from the header above to make whatever we need to work here +#define EDM4HEP_VERSION(major, minor, patch) ((UINT64_C(major) << 32) | (UINT64_C(minor) << 16) | (UINT64_C(patch))) +// v00-09 is the last version without the capitalization change of the track vector members +#define EDM4HEP_BUILD_VERSION EDM4HEP_VERSION(0, 9, 0) +#endif #include "gear/BField.h" #include "gear/CalorimeterParameters.h" @@ -177,7 +185,7 @@ pandora::StatusCode TrackCreator::ExtractKinks(const CollectionMaps& collectionM for (unsigned int iTrack = 0, nTracks = pReconstructedParticle.tracks_size(); iTrack < nTracks; ++iTrack) { auto pTrack = pReconstructedParticle.getTracks(iTrack); - (0 == iTrack) ? m_parentTrackList.insert(pTrack.id()) : m_daughterTrackList.insert(pTrack.id()); + (0 == iTrack) ? m_parentTrackList.insert(pTrack.id().index) : m_daughterTrackList.insert(pTrack.id().index); int trackPdgCode = pandora::UNKNOWN_PARTICLE_TYPE; @@ -277,7 +285,7 @@ pandora::StatusCode TrackCreator::ExtractProngsAndSplits(const CollectionMaps& c for (unsigned int iTrack = 0, nTracks = pReconstructedParticle.tracks_size(); iTrack < nTracks; ++iTrack) { auto pTrack = pReconstructedParticle.getTracks(iTrack); - (0 == iTrack) ? m_parentTrackList.insert(pTrack.id()) : m_daughterTrackList.insert(pTrack.id()); + (0 == iTrack) ? m_parentTrackList.insert(pTrack.id().index) : m_daughterTrackList.insert(pTrack.id().index); if (0 == m_settings.m_shouldFormTrackRelationships) continue; @@ -346,7 +354,7 @@ pandora::StatusCode TrackCreator::ExtractV0s(const CollectionMaps& collectionMap for (unsigned int iTrack = 0, nTracks = pReconstructedParticle.tracks_size(); iTrack < nTracks; ++iTrack) { auto pTrack = pReconstructedParticle.getTracks(iTrack); - m_v0TrackList.insert(pTrack.id()); + m_v0TrackList.insert(pTrack.id().index); int trackPdgCode = pandora::UNKNOWN_PARTICLE_TYPE; @@ -401,7 +409,7 @@ bool TrackCreator::IsConflictingRelationship(const edm4hep::ReconstructedParticl for (unsigned int iTrack = 0, nTracks = Particle.tracks_size(); iTrack < nTracks; ++iTrack) { edm4hep::Track pTrack = Particle.getTracks(iTrack) ; - unsigned int pTrack_id = pTrack.id() ; + unsigned int pTrack_id = pTrack.id().index ; if (this->IsDaughter(pTrack_id) || this->IsParent(pTrack_id) || this->IsV0(pTrack_id)) return true; @@ -712,7 +720,7 @@ void TrackCreator::DefineTrackPfoUsage(edm4hep::Track *const pTrack, PandoraApi: bool canFormPfo(false); bool canFormClusterlessPfo(false); - if (trackParameters.m_reachesCalorimeter.Get() && !this->IsParent(pTrack->id())) + if (trackParameters.m_reachesCalorimeter.Get() && !this->IsParent(pTrack->id().index)) { const float d0(std::fabs(pTrack->getTrackStates(0).D0)), z0(std::fabs(pTrack->getTrackStates(0).Z0)); @@ -740,8 +748,8 @@ void TrackCreator::DefineTrackPfoUsage(edm4hep::Track *const pTrack, PandoraApi: const float zCutForNonVertexTracks(m_tpcInnerR * std::fabs(pZ / pT) + m_settings.m_zCutForNonVertexTracks); const bool passRzQualityCuts((zMin < zCutForNonVertexTracks) && (rInner < m_tpcInnerR + m_settings.m_maxTpcInnerRDistance)); - const bool isV0(this->IsV0(pTrack->id())); - const bool isDaughter(this->IsDaughter(pTrack->id())); + const bool isV0(this->IsV0(pTrack->id().index)); + const bool isDaughter(this->IsDaughter(pTrack->id().index)); // Decide whether track can be associated with a pandora cluster and used to form a charged PFO if ((d0 < m_settings.m_d0TrackCut) && (z0 < m_settings.m_z0TrackCut) && (rInner < m_tpcInnerR + m_settings.m_maxTpcInnerRDistance)) @@ -778,7 +786,7 @@ void TrackCreator::DefineTrackPfoUsage(edm4hep::Track *const pTrack, PandoraApi: } } } - else if (this->IsDaughter(pTrack->id()) || this->IsV0(pTrack->id())) + else if (this->IsDaughter(pTrack->id().index) || this->IsV0(pTrack->id().index)) { std::cout<<"WARNING Recovering daughter or v0 track " << trackParameters.m_momentumAtDca.Get().GetMagnitude() << std::endl; canFormPfo = true; @@ -870,14 +878,22 @@ bool TrackCreator::PassesQualityCuts(edm4hep::Track *const pTrack, const Pandora int TrackCreator::GetNTpcHits(edm4hep::Track *const pTrack) const { +#if EDM4HEP_BUILD_VERSION > EDM4HEP_VERSION(0, 9, 0) + return pTrack->getSubdetectorHitNumbers(2 * lcio::ILDDetID::TPC - 1);// still use LCIO code now +#else return pTrack->getSubDetectorHitNumbers(2 * lcio::ILDDetID::TPC - 1);// still use LCIO code now +#endif } //------------------------------------------------------------------------------------------------------------------------------------------ int TrackCreator::GetNFtdHits(edm4hep::Track *const pTrack) const { +#if EDM4HEP_BUILD_VERSION > EDM4HEP_VERSION(0, 9, 0) + return pTrack->getSubdetectorHitNumbers( 2 * lcio::ILDDetID::FTD - 1 ); +#else return pTrack->getSubDetectorHitNumbers( 2 * lcio::ILDDetID::FTD - 1 ); +#endif } //------------------------------------------------------------------------------------------------------------------------------------------ diff --git a/Reconstruction/RecGenfitAlg/src/GenfitTrack.cpp b/Reconstruction/RecGenfitAlg/src/GenfitTrack.cpp index 1b154b957586939bffcfb4492eb1fb18fc5da86e..f16513c0cb401be80e26bcf5ff25948b0b0214fc 100644 --- a/Reconstruction/RecGenfitAlg/src/GenfitTrack.cpp +++ b/Reconstruction/RecGenfitAlg/src/GenfitTrack.cpp @@ -58,6 +58,7 @@ //cpp #include <cfloat> +#include <type_traits> #undef GENFIT_MY_DEBUG //#define GENFIT_MY_DEBUG 1 @@ -1639,3 +1640,4 @@ GenfitHit* GenfitTrack::makeAGenfitHit(edm4hep::TrackerHit* trackerHit, } return genfitHit; } + diff --git a/Reconstruction/RecGenfitAlg/src/GenfitTrack.h b/Reconstruction/RecGenfitAlg/src/GenfitTrack.h index 27ef200b6153e0354b80d67067e238d4ec664c2b..29b4394d1d246fa3b11dec0cc4161be6f2872f9c 100644 --- a/Reconstruction/RecGenfitAlg/src/GenfitTrack.h +++ b/Reconstruction/RecGenfitAlg/src/GenfitTrack.h @@ -144,6 +144,7 @@ class GenfitTrack { std::vector<double>& Res); ///A tool to convert track to the first layer of DC + void pivotToFirstLayer(const edm4hep::Vector3d& pos, const edm4hep::Vector3f& mom, edm4hep::Vector3d& firstPos, edm4hep::Vector3f& firstMom); diff --git a/Reconstruction/RecGenfitAlg/src/RecGenfitAlgDC.cpp b/Reconstruction/RecGenfitAlg/src/RecGenfitAlgDC.cpp index 6619c418ebd22f4dc7d21d1be1a52327e8dd2a7d..8dc13f65c0317fed845dd12d82395c21fdd99c93 100644 --- a/Reconstruction/RecGenfitAlg/src/RecGenfitAlgDC.cpp +++ b/Reconstruction/RecGenfitAlg/src/RecGenfitAlgDC.cpp @@ -397,7 +397,7 @@ void RecGenfitAlgDC::debugEvent() m_mcIndex=iHit; int iMcParticle=0; for(auto mcParticle : *mcParticleCol){ - edm4hep::Vector3f mcPocaMom = mcParticle.getMomentum();//GeV + const auto& mcPocaMom = mcParticle.getMomentum();//GeV float px=mcPocaMom.x; float py=mcPocaMom.y; float pz=mcPocaMom.z; diff --git a/Reconstruction/SiliconTracking/src/ForwardTrackingAlg.cpp b/Reconstruction/SiliconTracking/src/ForwardTrackingAlg.cpp index df95acc6cbe9cfa3fe53902b659792f367b5c558..3eb06e29713317bc809ef615a31e801259e8fd56 100644 --- a/Reconstruction/SiliconTracking/src/ForwardTrackingAlg.cpp +++ b/Reconstruction/SiliconTracking/src/ForwardTrackingAlg.cpp @@ -6,6 +6,14 @@ #include "edm4hep/TrackerHit.h" #include "edm4hep/TrackerHit.h" #include "edm4hep/Track.h" +#if __has_include("edm4hep/EDM4hepVersion.h") +#include "edm4hep/EDM4hepVersion.h" +#else +// Copy the necessary parts from the header above to make whatever we need to work here +#define EDM4HEP_VERSION(major, minor, patch) ((UINT64_C(major) << 32) | (UINT64_C(minor) << 16) | (UINT64_C(patch))) +// v00-09 is the last version without the capitalization change of the track vector members +#define EDM4HEP_BUILD_VERSION EDM4HEP_VERSION(0, 9, 0) +#endif #include "UTIL/ILDConf.h" @@ -1001,13 +1009,21 @@ void ForwardTrackingAlg::finaliseTrack( edm4hep::MutableTrack* trackImpl ){ //trackImpl->subdetectorHitNumbers()[ 2 * lcio::ILDDetID::TPC - 1 ] = hitNumbers[lcio::ILDDetID::TPC]; //trackImpl->subdetectorHitNumbers()[ 2 * lcio::ILDDetID::SET - 1 ] = hitNumbers[lcio::ILDDetID::SET]; //trackImpl->subdetectorHitNumbers()[ 2 * lcio::ILDDetID::ETD - 1 ] = hitNumbers[lcio::ILDDetID::ETD]; +#if EDM4HEP_BUILD_VERSION > EDM4HEP_VERSION(0, 9, 0) + trackImpl->addToSubdetectorHitNumbers(hitNumbers[UTIL::ILDDetID::VXD]); + trackImpl->addToSubdetectorHitNumbers(hitNumbers[UTIL::ILDDetID::SIT]); + trackImpl->addToSubdetectorHitNumbers(hitNumbers[UTIL::ILDDetID::FTD]); + trackImpl->addToSubdetectorHitNumbers(hitNumbers[UTIL::ILDDetID::TPC]); + trackImpl->addToSubdetectorHitNumbers(hitNumbers[UTIL::ILDDetID::SET]); + trackImpl->addToSubdetectorHitNumbers(hitNumbers[UTIL::ILDDetID::ETD]); +#else trackImpl->addToSubDetectorHitNumbers(hitNumbers[UTIL::ILDDetID::VXD]); trackImpl->addToSubDetectorHitNumbers(hitNumbers[UTIL::ILDDetID::SIT]); trackImpl->addToSubDetectorHitNumbers(hitNumbers[UTIL::ILDDetID::FTD]); trackImpl->addToSubDetectorHitNumbers(hitNumbers[UTIL::ILDDetID::TPC]); trackImpl->addToSubDetectorHitNumbers(hitNumbers[UTIL::ILDDetID::SET]); trackImpl->addToSubDetectorHitNumbers(hitNumbers[UTIL::ILDDetID::ETD]); - +#endif return; } diff --git a/Reconstruction/SiliconTracking/src/SiliconTrackingAlg.cpp b/Reconstruction/SiliconTracking/src/SiliconTrackingAlg.cpp index f9b6a5466aba7cf08527d77d2f3b6c5d429ba3d8..1ef104fa4b479dde6ce3be62b98ad6a6feb31b4a 100644 --- a/Reconstruction/SiliconTracking/src/SiliconTrackingAlg.cpp +++ b/Reconstruction/SiliconTracking/src/SiliconTrackingAlg.cpp @@ -9,6 +9,14 @@ //#include "edm4hep/TrackerHitPlane.h" #include "edm4hep/Track.h" #include "edm4hep/TrackState.h" +#if __has_include("edm4hep/EDM4hepVersion.h") +#include "edm4hep/EDM4hepVersion.h" +#else +// Copy the necessary parts from the header above to make whatever we need to work here +#define EDM4HEP_VERSION(major, minor, patch) ((UINT64_C(major) << 32) | (UINT64_C(minor) << 16) | (UINT64_C(patch))) +// v00-09 is the last version without the capitalization change of the track vector members +#define EDM4HEP_BUILD_VERSION EDM4HEP_VERSION(0, 9, 0) +#endif #include <iostream> #include <algorithm> @@ -2833,10 +2841,15 @@ void SiliconTrackingAlg::FinalRefit(edm4hep::TrackCollection* trk_col) { MarlinTrk::addHitNumbersToTrack(&track, all_hits, false, cellID_encoder); delete marlinTrk; - +#if EDM4HEP_BUILD_VERSION > EDM4HEP_VERSION(0, 9, 0) + int nhits_in_vxd = track.getSubdetectorHitNumbers(0); + int nhits_in_ftd = track.getSubdetectorHitNumbers(1); + int nhits_in_sit = track.getSubdetectorHitNumbers(2); +#else int nhits_in_vxd = track.getSubDetectorHitNumbers(0); int nhits_in_ftd = track.getSubDetectorHitNumbers(1); int nhits_in_sit = track.getSubDetectorHitNumbers(2); +#endif //debug() << " Hit numbers for Track "<< track.id() << ": " debug() << " Hit numbers for Track "<< iTrk <<": " diff --git a/Reconstruction/Tracking/src/Clupatra/ClupatraAlg.cpp b/Reconstruction/Tracking/src/Clupatra/ClupatraAlg.cpp index 05d12daeb2d9f5367e8e0f1c5bde76f490a8d114..d218e041b47024844daf858f9abf23d77693143f 100644 --- a/Reconstruction/Tracking/src/Clupatra/ClupatraAlg.cpp +++ b/Reconstruction/Tracking/src/Clupatra/ClupatraAlg.cpp @@ -799,7 +799,7 @@ StatusCode ClupatraAlg::execute() { //=============================================================================================== // FIXME Mingrui - debug() << " =========== refitting final " << cluList.size() << " track segments " << endmsg ; + debug() << " =========== refitting final " << cluList.size() << " track segments chi2 cut = " << _dChi2Max << endmsg ; //---- refit cluster tracks individually to save memory ( KalTest tracks have ~1MByte each) @@ -811,10 +811,12 @@ StatusCode ClupatraAlg::execute() { continue ; MarlinTrk::IMarlinTrack* trk = fit( *icv ) ; - trk->smooth() ; - edm4hep::MutableTrack edm4hepTrk = converter( *icv ) ; - tsCol_tmp.push_back( new ClupaPlcioTrack(edm4hepTrk) ) ; - MarTrk_of_edm4hepTrack(edm4hepTrk) = 0 ; + if(trk){ + trk->smooth() ; + edm4hep::MutableTrack edm4hepTrk = converter( *icv ) ; + tsCol_tmp.push_back( new ClupaPlcioTrack(edm4hepTrk) ) ; + MarTrk_of_edm4hepTrack(edm4hepTrk) = 0 ; + } delete trk ; } @@ -883,14 +885,13 @@ StatusCode ClupatraAlg::execute() { nntrkclu.cluster( incSegVec.begin() , incSegVec.end() , std::back_inserter( incSegCluVec ), trkMerge , 2 ) ; - // FIXME: Mingrui - // streamlog_out( DEBUG4 ) << " ===== merged track segments - # cluster: " << incSegCluVec.size() - // << " from " << incSegVec.size() << " incomplete track segments " << " ============================== " << std::endl ; + debug() << " ===== merged track segments - # cluster: " << incSegCluVec.size() + << " from " << incSegVec.size() << " incomplete track segments =====" << endmsg; for( TrackClusterer::cluster_vector::iterator it= incSegCluVec.begin() ; it != incSegCluVec.end() ; ++it) { // FIXME: Mingrui - // streamlog_out( DEBUG4 ) << edm4hep::header<edm4hep::Track>() << std::endl ; + // streamlog_out( DEBUG4 ) << edm4hep::header<edm4hep::Track>() << std::endl ; TrackClusterer::cluster_type* incSegClu = *it ; @@ -951,8 +952,7 @@ StatusCode ClupatraAlg::execute() { delete mTrk ; computeTrackInfo( track ) ; - // FIXME: Mingrui - // streamlog_out( DEBUG4 ) << " ****** created new track : " << " : " << lcshort( (Track*) track ) << std::endl ; + debug() << " ****** created new track : " << " : " << track.id() << endmsg; } }// loop over l diff --git a/Reconstruction/Tracking/src/Clupatra/clupatra_new.cpp b/Reconstruction/Tracking/src/Clupatra/clupatra_new.cpp index 9ecee56418ae4387e73572d73b42b757a92bd2b2..17a8dcbb43eae981f3341775b1e3ed363c4459f8 100644 --- a/Reconstruction/Tracking/src/Clupatra/clupatra_new.cpp +++ b/Reconstruction/Tracking/src/Clupatra/clupatra_new.cpp @@ -19,6 +19,9 @@ #include "k4FWCore/DataHandle.h" #include "GaudiAlg/GaudiAlgorithm.h" #include "GearSvc/IGearSvc.h" + +#include "podio/podioVersion.h" + using namespace MarlinTrk ; namespace lcio{ @@ -287,7 +290,12 @@ namespace clupatra_new{ UTIL::BitField64 encoder( UTIL::ILDCellID0::encoder_string ) ; encoder[UTIL::ILDCellID0::subdet] = UTIL::ILDDetID::TPC ; - edm4hep::TrackerHit firstHit; // = 0 ; +#if PODIO_BUILD_VERSION < PODIO_VERSION(0, 17, 4) + edm4hep::TrackerHit firstHit = 0; +#else + auto firstHit = edm4hep::TrackerHit::makeEmpty(); +#endif + // = 0 equal to unlink() //firstHit.unlink(); IMarlinTrack* bwTrk = 0 ; @@ -1409,7 +1417,11 @@ start: #if use_fit_at_last_hit code = mtrk->getTrackState( lHit, tsLH, chi2, ndf ) ; #else // get the track state at the last hit by propagating from the last(first) constrained fit position (a la MarlinTrkUtils) +#if PODIO_BUILD_VERSION < PODIO_VERSION(0, 17, 4) edm4hep::TrackerHit last_constrained_hit(0); +#else + auto last_constrained_hit = edm4hep::TrackerHit::makeEmpty(); +#endif code = mtrk->getTrackerHitAtPositiveNDF( last_constrained_hit ); //code = mtrk->smooth() ; if( code != MarlinTrk::IMarlinTrack::success ){ diff --git a/Reconstruction/Tracking/src/Clupatra/clupatra_new.h b/Reconstruction/Tracking/src/Clupatra/clupatra_new.h index 6ace630a7dcf6bdc552426f519f62c51a992da1a..af946bf255dc92e465d830ea1f71d149e01d32b2 100644 --- a/Reconstruction/Tracking/src/Clupatra/clupatra_new.h +++ b/Reconstruction/Tracking/src/Clupatra/clupatra_new.h @@ -30,6 +30,8 @@ #include "TrackSystemSvc/IMarlinTrack.h" #include "TrackSystemSvc/IMarlinTrkSystem.h" +#include "podio/podioVersion.h" + // ----- include for verbosity dependend logging --------- // #include "marlin/VerbosityLevels.h" @@ -57,7 +59,11 @@ namespace clupatra_new{ ClupaHit() :layer(-1), zIndex(-1), phiIndex(-1), +#if PODIO_BUILD_VERSION < PODIO_VERSION(0, 17, 4) edm4hepHit(0), +#else + edm4hepHit(edm4hep::TrackerHit::makeEmpty()), +#endif pos(0.,0.,0.) {} int layer ; int zIndex ; diff --git a/Reconstruction/Tracking/src/FullLDCTracking/FullLDCTrackingAlg.cpp b/Reconstruction/Tracking/src/FullLDCTracking/FullLDCTrackingAlg.cpp index 08e1fb022fdfc240dd127957085fb954ca2edf54..ee5f1feb25c5cda5c95f0f4d9dab9801e943db04 100755 --- a/Reconstruction/Tracking/src/FullLDCTracking/FullLDCTrackingAlg.cpp +++ b/Reconstruction/Tracking/src/FullLDCTracking/FullLDCTrackingAlg.cpp @@ -8,6 +8,14 @@ #include <edm4hep/TrackerHit.h> #include <edm4hep/TrackerHit.h> #include <edm4hep/Track.h> +#if __has_include("edm4hep/EDM4hepVersion.h") +#include "edm4hep/EDM4hepVersion.h" +#else +// Copy the necessary parts from the header above to make whatever we need to work here +#define EDM4HEP_VERSION(major, minor, patch) ((UINT64_C(major) << 32) | (UINT64_C(minor) << 16) | (UINT64_C(patch))) +// v00-09 is the last version without the capitalization change of the track vector members +#define EDM4HEP_BUILD_VERSION EDM4HEP_VERSION(0, 9, 0) +#endif #include <iostream> #include <algorithm> @@ -513,11 +521,19 @@ void FullLDCTrackingAlg::AddTrackColToEvt(TrackExtendedVec & trkVec, edm4hep::Tr float z0TrkCand = trkCand->getZ0(); // float phi0TrkCand = trkCand->getPhi(); // FIXME, fucd +#if EDM4HEP_BUILD_VERSION > EDM4HEP_VERSION(0, 9, 0) + int nhits_in_vxd = track.getSubdetectorHitNumbers(0); + int nhits_in_ftd = track.getSubdetectorHitNumbers(1); + int nhits_in_sit = track.getSubdetectorHitNumbers(2); + int nhits_in_tpc = track.getSubdetectorHitNumbers(3); + int nhits_in_set = track.getSubdetectorHitNumbers(4); +#else int nhits_in_vxd = track.getSubDetectorHitNumbers(0); int nhits_in_ftd = track.getSubDetectorHitNumbers(1); int nhits_in_sit = track.getSubDetectorHitNumbers(2); int nhits_in_tpc = track.getSubDetectorHitNumbers(3); int nhits_in_set = track.getSubDetectorHitNumbers(4); +#endif //int nhits_in_vxd = Track->subdetectorHitNumbers()[ 2 * lcio::ILDDetID::VXD - 2 ]; //int nhits_in_ftd = Track->subdetectorHitNumbers()[ 2 * lcio::ILDDetID::FTD - 2 ]; //int nhits_in_sit = Track->subdetectorHitNumbers()[ 2 * lcio::ILDDetID::SIT - 2 ]; @@ -1150,13 +1166,18 @@ void FullLDCTrackingAlg::prepareVectors() { trackExt->setNDF(tpcTrack.getNdf()); trackExt->setChi2(tpcTrack.getChi2()); for (int iHit=0;iHit<nHits;++iHit) { - edm4hep::TrackerHit hit = tpcTrack.getTrackerHits(iHit);//hitVec[iHit]; - if(!hit.isAvailable()) error() << "Tracker hit not available" << endmsg; + edm4hep::TrackerHit hit = tpcTrack.getTrackerHits(iHit); + if (!hit.isAvailable()) { + error() << "Tracker hit not available" << endmsg; + continue; + } //info() << "hit " << hit.id() << " " << hit.getCellID() << " " << hit.getPosition()[0] << " " << hit.getPosition()[1] << " " << hit.getPosition()[2] << endmsg; auto it = mapTrackerHits.find(hit); - if(it==mapTrackerHits.end()) error() << "Cannot find hit " << hit.id() << " in map" << endmsg; - else continue; - TrackerHitExtended * hitExt = it->second; + if (it==mapTrackerHits.end()) { + error() << "Cannot find hit " << hit.id() << " in map" << endmsg; + continue; + } + TrackerHitExtended* hitExt = it->second; //info() << hit.id() << " " << hitExt << endmsg; hitExt->setTrackExtended( trackExt ); trackExt->addTrackerHitExtended( hitExt ); @@ -1215,8 +1236,17 @@ void FullLDCTrackingAlg::prepareVectors() { char strg[200]; HelixClass helixSi; for (int iHit=0;iHit<nHits;++iHit) { - edm4hep::TrackerHit hit = siTrack.getTrackerHits(iHit);//hitVec[iHit]; - TrackerHitExtended * hitExt = mapTrackerHits[hit]; + edm4hep::TrackerHit hit = siTrack.getTrackerHits(iHit); + if (!hit.isAvailable()) { + error() << "Tracker hit not available" << endmsg; + continue; + } + auto it = mapTrackerHits.find(hit); + if (it==mapTrackerHits.end()) { + error() << "Cannot find hit " << hit.id() << " in map" << endmsg; + continue; + } + TrackerHitExtended* hitExt = it->second; hitExt->setTrackExtended( trackExt ); trackExt->addTrackerHitExtended( hitExt ); @@ -1518,8 +1548,8 @@ TrackExtended * FullLDCTrackingAlg::CombineTracks(TrackExtended * tpcTrack, Trac int nTPCHits = int(tpcHitVec.size()); int nHits = nTPCHits + nSiHits; - //std::cout << "FullLDCTrackingAlg::CombineTracks nSiHits = " << nSiHits << endmsg; - //std::cout << "FullLDCTrackingAlg::CombineTracks nTPCHits = " << nTPCHits << endmsg; + //debug() << "FullLDCTrackingAlg::CombineTracks nSiHits = " << nSiHits << endmsg; + //debug() << "FullLDCTrackingAlg::CombineTracks nTPCHits = " << nTPCHits << endmsg; TrackerHitVec trkHits; trkHits.reserve(nHits); @@ -1732,7 +1762,7 @@ TrackExtended * FullLDCTrackingAlg::CombineTracks(TrackExtended * tpcTrack, Trac tpcHitInFit.push_back(tpcHitVec[i]); } } - + debug() << "FullLDCTrackingAlg::CombineTracks: Check for Silicon Hit rejections ... " << endmsg; if ( (int)siOutliers.size() > _maxAllowedSiHitRejectionsForTrackCombination ) { diff --git a/Reconstruction/Tracking/src/TruthTracker/TruthTrackerAlg.cpp b/Reconstruction/Tracking/src/TruthTracker/TruthTrackerAlg.cpp index 28eabd34273659c5ede08e46833c5a13136a9702..611b7789d2c5382a9c25a6dcb7cacb69351b156d 100644 --- a/Reconstruction/Tracking/src/TruthTracker/TruthTrackerAlg.cpp +++ b/Reconstruction/Tracking/src/TruthTracker/TruthTrackerAlg.cpp @@ -418,7 +418,9 @@ void TruthTrackerAlg::getTrackStateFromMcParticle( mcParticleVertexSmeared.z= CLHEP::RandGauss::shoot(mcParticleVertex.z,m_resVertexZ); ///Momentum + const edm4hep::Vector3f mcParticleMom=mcParticle.getMomentum();//GeV + double mcParticlePt=sqrt(mcParticleMom.x*mcParticleMom.x+ mcParticleMom.y*mcParticleMom.y); //double mcParticlePtSmeared= diff --git a/Service/GearSvc/src/GearSvc.cpp b/Service/GearSvc/src/GearSvc.cpp index e96ae681694de49f30b430dedf1ec1ac9568f0e3..695e455499efff51aeca796bb0ee45bd1d8b7020 100644 --- a/Service/GearSvc/src/GearSvc.cpp +++ b/Service/GearSvc/src/GearSvc.cpp @@ -135,7 +135,7 @@ StatusCode GearSvc::initialize() m_gearMgr->setYokeBarrelParameters(barrelYokeParam) ; m_gearMgr->setYokeEndcapParameters(endcapYokeParam) ; m_gearMgr->setYokePlugParameters(plugYokeParam) ; - gear::TiXmlDocument* doc = new gear::TiXmlDocument ; + gear::GearXML::createXMLFile(m_gearMgr, "test.xml"); } diff --git a/Service/TrackSystemSvc/src/MarlinKalTestTrack.cc b/Service/TrackSystemSvc/src/MarlinKalTestTrack.cc index ffedd64edb8558338e69a028ddcdcbf8021d42e1..3ca601461c16443ca6352740f3358c3a4eb499cb 100644 --- a/Service/TrackSystemSvc/src/MarlinKalTestTrack.cc +++ b/Service/TrackSystemSvc/src/MarlinKalTestTrack.cc @@ -26,6 +26,8 @@ #include "gear/GEAR.h" #include "gear/BField.h" +#include "podio/podioVersion.h" + //#include "streamlog/streamlog.h" @@ -76,8 +78,12 @@ namespace MarlinTrk { MarlinKalTestTrack::MarlinKalTestTrack(MarlinKalTest* ktest) - : _ktest(ktest), _trackHitAtPositiveNDF(edm4hep::TrackerHit(0)) { - + : _ktest(ktest), +#if PODIO_BUILD_VERSION < PODIO_VERSION(0, 17, 4) + _trackHitAtPositiveNDF(edm4hep::TrackerHit(0)) { +#else + _trackHitAtPositiveNDF(edm4hep::TrackerHit::makeEmpty()) { +#endif _kaltrack = new TKalTrack() ; _kaltrack->SetOwner() ; diff --git a/Service/TrackSystemSvc/src/MarlinTrkUtils.cc b/Service/TrackSystemSvc/src/MarlinTrkUtils.cc index ffa0f7f9395accd360f1efce633308447873d258..fcacb19cf8fead3e3204d70af7517f286372faef 100644 --- a/Service/TrackSystemSvc/src/MarlinTrkUtils.cc +++ b/Service/TrackSystemSvc/src/MarlinTrkUtils.cc @@ -16,6 +16,15 @@ #include "edm4hep/Track.h" #include "edm4hep/MutableTrack.h" +#if __has_include("edm4hep/EDM4hepVersion.h") +#include "edm4hep/EDM4hepVersion.h" +#else +// Copy the necessary parts from the header above to make whatever we need to work here +#define EDM4HEP_VERSION(major, minor, patch) ((UINT64_C(major) << 32) | (UINT64_C(minor) << 16) | (UINT64_C(patch))) +// v00-09 is the last version without the capitalization change of the track vector members +#define EDM4HEP_BUILD_VERSION EDM4HEP_VERSION(0, 9, 0) +#endif + #include <UTIL/BitField64.h> #include <UTIL/ILDConf.h> #include <UTIL/BitSet32.h> @@ -24,6 +33,8 @@ #include "TMatrixD.h" +#include "podio/podioVersion.h" + #define MIN_NDF 6 namespace MarlinTrk { @@ -258,7 +269,9 @@ namespace MarlinTrk { // set the initial track parameters /////////////////////////////////////////////////////// - return_error = marlinTrk->initialise( *pre_fit, bfield_z, IMarlinTrack::backward ) ; + //return_error = marlinTrk->initialise( *pre_fit, bfield_z, IMarlinTrack::backward ) ; + // fucd: previous fixed as IMarlinTrack::backward, can not change? using input value now + return_error = marlinTrk->initialise( *pre_fit, bfield_z, fit_backwards ) ; if (return_error != IMarlinTrack::success) { std::cout << "MarlinTrk::createFit Initialisation of track fit failed with error : " << return_error << std::endl; @@ -388,10 +401,10 @@ namespace MarlinTrk { return_error = marlintrk->getNDF(ndf); if ( return_error != IMarlinTrack::success) { - //streamlog_out(DEBUG3) << "MarlinTrk::finaliseLCIOTrack: getNDF returns " << return_error << std::endl; + //std::cout << "MarlinTrk::finaliseLCIOTrack: getNDF returns " << return_error << std::endl; return return_error; } else if( ndf < 0 ) { - //streamlog_out(DEBUG2) << "MarlinTrk::finaliseLCIOTrack: number of degrees of freedom less than 0 track dropped : NDF = " << ndf << std::endl; + //std::cout << "MarlinTrk::finaliseLCIOTrack: number of degrees of freedom less than 0 track dropped : NDF = " << ndf << std::endl; return IMarlinTrack::error; } else { //streamlog_out(DEBUG1) << "MarlinTrk::finaliseLCIOTrack: NDF = " << ndf << std::endl; @@ -481,9 +494,14 @@ namespace MarlinTrk { /////////////////////////////////////////////////////// edm4hep::TrackState* trkStateAtLastHit = new edm4hep::TrackState() ; + edm4hep::TrackerHit lastHit = hits_in_fit.front().first; +#if PODIO_BUILD_VERSION < PODIO_VERSION(0, 17, 4) edm4hep::TrackerHit last_constrained_hit(0);// = 0 ; +#else + auto last_constrained_hit = edm4hep::TrackerHit::makeEmpty(); +#endif marlintrk->getTrackerHitAtPositiveNDF(last_constrained_hit); return_error = marlintrk->smooth(lastHit); @@ -543,7 +561,6 @@ namespace MarlinTrk { track->addToTrackStates(*trkStateAtFirstHit); } else { //streamlog_out( WARNING ) << " >>>>>>>>>>> MarlinTrk::finaliseLCIOTrack: could not get TrackState at First Hit " << firstHit << std::endl ; - delete trkStateAtFirstHit; } double r_first = firstHit.getPosition()[0]*firstHit.getPosition()[0] + firstHit.getPosition()[1]*firstHit.getPosition()[1]; @@ -569,7 +586,7 @@ namespace MarlinTrk { track->addToTrackStates(*trkStateAtLastHit); } else { std::cout << "ERROR>>>>>>>>>>> MarlinTrk::finaliseLCIOTrack: could not get TrackState at Last Hit " << last_constrained_hit.id() << std::endl ; - delete trkStateAtLastHit; + //delete trkStateAtLastHit; } // const EVENT::FloatVec& ma = trkStateAtLastHit->getCovMatrix(); @@ -587,17 +604,22 @@ namespace MarlinTrk { // return_error = createTrackStateAtCaloFace(marlintrk, trkStateCalo, lastHit, tanL_is_positive); if ( return_error == 0 ) { + //std::cout << "fucdout referencePoint " << trkStateCalo.referencePoint << std::endl; trkStateCalo.location = MarlinTrk::Location::AtCalorimeter; track->addToTrackStates(trkStateCalo); } else { - //streamlog_out( WARNING ) << " >>>>>>>>>>> MarlinTrk::finaliseLCIOTrack: could not get TrackState at Calo Face " << std::endl ; + std::cout << " >>>>>>>>>>> MarlinTrk::finaliseLCIOTrack: could not get TrackState at Calo Face " << std::endl ; //delete trkStateCalo; } } else { track->addToTrackStates(*atLastHit); track->addToTrackStates(*atCaloFace); + //delete trkStateAtLastHit; } - + + if(trkStateAtFirstHit) delete trkStateAtFirstHit; + if(trkStateAtLastHit) delete trkStateAtLastHit; + if(trkStateIP) delete trkStateIP; /////////////////////////////////////////////////////// // done /////////////////////////////////////////////////////// @@ -688,12 +710,21 @@ namespace MarlinTrk { if ( hits_in_fit == false ) { // all hit atributed by patrec offset = 1 ; } +#if EDM4HEP_BUILD_VERSION > EDM4HEP_VERSION(0, 9, 0) + track->addToSubdetectorHitNumbers(hitNumbers[UTIL::ILDDetID::VXD]); + track->addToSubdetectorHitNumbers(hitNumbers[UTIL::ILDDetID::FTD]); + track->addToSubdetectorHitNumbers(hitNumbers[UTIL::ILDDetID::SIT]); + track->addToSubdetectorHitNumbers(hitNumbers[UTIL::ILDDetID::TPC]); + track->addToSubdetectorHitNumbers(hitNumbers[UTIL::ILDDetID::SET]); + track->addToSubdetectorHitNumbers(hitNumbers[UTIL::ILDDetID::ETD]); +#else track->addToSubDetectorHitNumbers(hitNumbers[UTIL::ILDDetID::VXD]); track->addToSubDetectorHitNumbers(hitNumbers[UTIL::ILDDetID::FTD]); track->addToSubDetectorHitNumbers(hitNumbers[UTIL::ILDDetID::SIT]); track->addToSubDetectorHitNumbers(hitNumbers[UTIL::ILDDetID::TPC]); track->addToSubDetectorHitNumbers(hitNumbers[UTIL::ILDDetID::SET]); track->addToSubDetectorHitNumbers(hitNumbers[UTIL::ILDDetID::ETD]); +#endif //track->subdetectorHitNumbers().resize(2 * lcio::ILDDetID::ETD); //track->subdetectorHitNumbers()[ 2 * lcio::ILDDetID::VXD - offset ] = hitNumbers[lcio::ILDDetID::VXD]; //track->subdetectorHitNumbers()[ 2 * lcio::ILDDetID::FTD - offset ] = hitNumbers[lcio::ILDDetID::FTD]; @@ -732,12 +763,21 @@ namespace MarlinTrk { if ( hits_in_fit == false ) { // all hit atributed by patrec offset = 1 ; } +#if EDM4HEP_BUILD_VERSION > EDM4HEP_VERSION(0, 9, 0) + track->addToSubdetectorHitNumbers(hitNumbers[UTIL::ILDDetID::VXD]); + track->addToSubdetectorHitNumbers(hitNumbers[UTIL::ILDDetID::FTD]); + track->addToSubdetectorHitNumbers(hitNumbers[UTIL::ILDDetID::SIT]); + track->addToSubdetectorHitNumbers(hitNumbers[UTIL::ILDDetID::TPC]); + track->addToSubdetectorHitNumbers(hitNumbers[UTIL::ILDDetID::SET]); + track->addToSubdetectorHitNumbers(hitNumbers[UTIL::ILDDetID::ETD]); +#else track->addToSubDetectorHitNumbers(hitNumbers[lcio::ILDDetID::VXD]); track->addToSubDetectorHitNumbers(hitNumbers[lcio::ILDDetID::FTD]); track->addToSubDetectorHitNumbers(hitNumbers[lcio::ILDDetID::SIT]); track->addToSubDetectorHitNumbers(hitNumbers[lcio::ILDDetID::TPC]); track->addToSubDetectorHitNumbers(hitNumbers[lcio::ILDDetID::SET]); track->addToSubDetectorHitNumbers(hitNumbers[lcio::ILDDetID::ETD]); +#endif //track->subdetectorHitNumbers().resize(2 * lcio::ILDDetID::ETD); //track->subdetectorHitNumbers()[ 2 * lcio::ILDDetID::VXD - offset ] = hitNumbers[lcio::ILDDetID::VXD]; //track->subdetectorHitNumbers()[ 2 * lcio::ILDDetID::FTD - offset ] = hitNumbers[lcio::ILDDetID::FTD]; diff --git a/Simulation/DetSimAna/CMakeLists.txt b/Simulation/DetSimAna/CMakeLists.txt index 883dfd8215c9ccfd9e88b7d1713c442de1f5e151..b1bd935f32e1de1bb87d8c490f5967960deda351 100644 --- a/Simulation/DetSimAna/CMakeLists.txt +++ b/Simulation/DetSimAna/CMakeLists.txt @@ -5,12 +5,17 @@ include(${Geant4_USE_FILE}) gaudi_add_module(DetSimAna SOURCES src/Edm4hepWriterAnaElemTool.cpp LINK DetSimInterface + DetSimSDLib ${DD4hep_COMPONENT_LIBRARIES} Gaudi::GaudiKernel EDM4HEP::edm4hep EDM4HEP::edm4hepDict k4FWCore::k4FWCore ) +target_include_directories(DetSimAna PUBLIC + $<BUILD_INTERFACE:${CMAKE_CURRENT_LIST_DIR}>/include + $<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>) + install(TARGETS DetSimAna EXPORT CEPCSWTargets RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}" COMPONENT bin diff --git a/Simulation/DetSimAna/src/Edm4hepWriterAnaElemTool.cpp b/Simulation/DetSimAna/src/Edm4hepWriterAnaElemTool.cpp index b05e7994b44cc54d2dbda14039a3700348fcc704..0c687f82701832b673c49e2a744566aa1d76b061 100644 --- a/Simulation/DetSimAna/src/Edm4hepWriterAnaElemTool.cpp +++ b/Simulation/DetSimAna/src/Edm4hepWriterAnaElemTool.cpp @@ -1,5 +1,6 @@ #include "Edm4hepWriterAnaElemTool.h" +#include "G4Step.hh" #include "G4Event.hh" #include "G4THitsCollection.hh" #include "G4EventManager.hh" @@ -12,13 +13,36 @@ #include "DDG4/Geant4Mapping.h" #include "DDG4/Geant4HitCollection.h" #include "DDG4/Geant4Data.h" -#include "DDG4/Geant4Hits.h" +#include "DetSimSD/Geant4Hits.h" DECLARE_COMPONENT(Edm4hepWriterAnaElemTool) void Edm4hepWriterAnaElemTool::BeginOfRunAction(const G4Run*) { + auto msglevel = msgLevel(); + if (msglevel == MSG::VERBOSE || msglevel == MSG::DEBUG) { + verboseOutput = true; + } + G4cout << "Begin Run of detector simultion..." << G4endl; + + // access geometry service + m_geosvc = service<IGeomSvc>("GeomSvc"); + if (m_geosvc) { + dd4hep::Detector* dd4hep_geo = m_geosvc->lcdd(); + // try to get the constants + R = dd4hep_geo->constant<double>("tracker_region_rmax")/dd4hep::mm*CLHEP::mm; + Z = dd4hep_geo->constant<double>("tracker_region_zmax")/dd4hep::mm*CLHEP::mm; + + info() << "Tracker Region " + << " R: " << R + << " Z: " << Z + << endmsg; + + } else { + error() << "Failed to find GeomSvc." << endmsg; + } + } void @@ -30,6 +54,15 @@ void Edm4hepWriterAnaElemTool::BeginOfEventAction(const G4Event* anEvent) { msg() << "Event " << anEvent->GetEventID() << endmsg; + // event info + m_userinfo = nullptr; + if (anEvent->GetUserInformation()) { + m_userinfo = dynamic_cast<CommonUserEventInfo*>(anEvent->GetUserInformation()); + if (verboseOutput) { + m_userinfo->dumpIdxG4Track2Edm4hep(); + } + } + auto mcGenCol = m_mcParGenCol.get(); mcCol = m_mcParCol.createAndPut(); @@ -50,17 +83,18 @@ Edm4hepWriterAnaElemTool::BeginOfEventAction(const G4Event* anEvent) { newparticle.setColorFlow (mcGenParticle.getColorFlow()); } - msg() << "mcCol size: " << mcCol->size() << endmsg; + msg() << "mcCol size (original) : " << mcCol->size() << endmsg; // reset m_track2primary.clear(); - + } void Edm4hepWriterAnaElemTool::EndOfEventAction(const G4Event* anEvent) { - // save all data + msg() << "mcCol size (after simulation) : " << mcCol->size() << endmsg; + // save all data // create collections. auto trackercols = m_trackerCol.createAndPut(); auto calorimetercols = m_calorimeterCol.createAndPut(); @@ -257,7 +291,12 @@ Edm4hepWriterAnaElemTool::EndOfEventAction(const G4Event* anEvent) { pritrkid = 1; } - edm_trk_hit.setMCParticle(mcCol->at(pritrkid-1)); + if (m_userinfo) { + auto idxedm4hep = m_userinfo->idxG4Track2Edm4hep(pritrkid); + if (idxedm4hep != -1) { + edm_trk_hit.setMCParticle(mcCol->at(idxedm4hep)); + } + } if (pritrkid != trackID) { // If the track is a secondary, then the primary track id and current track id is different @@ -297,7 +336,12 @@ Edm4hepWriterAnaElemTool::EndOfEventAction(const G4Event* anEvent) { pritrkid = 1; } - edm_calo_contrib.setParticle(mcCol->at(pritrkid-1)); // todo + if (m_userinfo) { + auto idxedm4hep = m_userinfo->idxG4Track2Edm4hep(pritrkid); + if (idxedm4hep != -1) { + edm_calo_contrib.setParticle(mcCol->at(idxedm4hep)); // todo + } + } edm_calo_hit.addToContributions(edm_calo_contrib); } } @@ -345,17 +389,27 @@ void Edm4hepWriterAnaElemTool::PostUserTrackingAction(const G4Track* track) { int curtrkid = track->GetTrackID(); // starts from 1 int curparid = track->GetParentID(); + int idxedm4hep = -1; - if (curparid == 0) { + if (m_userinfo) { + idxedm4hep = m_userinfo->idxG4Track2Edm4hep(curtrkid); + } + + if (curparid == 0) { // Primary Track // select the primary tracks (parentID == 0) // auto mcCol = m_mcParCol.get(); - if (curtrkid-1>=mcCol->size()) { + if (idxedm4hep == -1) { + error () << "Failed to get idxedm4hep according to the g4track id " << curtrkid << endmsg; + return; + } + + if (idxedm4hep>=mcCol->size()) { error() << "out of range: curtrkid is " << curtrkid << " while the MCParticle size is " << mcCol->size() << endmsg; return; } - auto primary_particle = mcCol->at(curtrkid-1); + auto primary_particle = mcCol->at(idxedm4hep); const G4ThreeVector& stop_pos = track->GetPosition(); edm4hep::Vector3d endpoint(stop_pos.x()/CLHEP::mm, @@ -407,14 +461,14 @@ Edm4hepWriterAnaElemTool::PostUserTrackingAction(const G4Track* track) { // select the necessary processes if (creatorProcess==proc_decay) { - info() << "Creator Process is Decay for secondary particle: " - << " idx: " << i - << " trkid: " << sectrk->GetTrackID() // not valid until track - << " particle: " << secparticle->GetParticleName() - << " pdg: " << secparticle->GetPDGEncoding() - << " at position: " << sectrk->GetPosition() // - << " time: " << sectrk->GetGlobalTime() - << " momentum: " << sectrk->GetMomentum() // + debug() << "Creator Process is Decay for secondary particle: " + << " idx: " << i + << " trkid: " << sectrk->GetTrackID() // not valid until track + << " particle: " << secparticle->GetParticleName() + << " pdg: " << secparticle->GetPDGEncoding() + << " at position: " << sectrk->GetPosition() // + << " time: " << sectrk->GetGlobalTime() + << " momentum: " << sectrk->GetMomentum() // << endmsg; is_decay = true; @@ -445,6 +499,15 @@ Edm4hepWriterAnaElemTool::PostUserTrackingAction(const G4Track* track) { mcp.addToParents(primary_particle); primary_particle.addToDaughters(mcp); + + // store the edm4hep obj idx in track info. + // using this idx, the MCParticle object could be modified later. + auto trackinfo = new CommonUserTrackInfo(); + trackinfo->setIdxEdm4hep(mcp.getObjectID().index); + sectrk->SetUserInformation(trackinfo); + debug() << " Appending MCParticle: (id: " + << mcp.getObjectID().index << ")" + << endmsg; } } } @@ -462,8 +525,36 @@ Edm4hepWriterAnaElemTool::PostUserTrackingAction(const G4Track* track) { } void -Edm4hepWriterAnaElemTool::UserSteppingAction(const G4Step*) { - +Edm4hepWriterAnaElemTool::UserSteppingAction(const G4Step* aStep) { + auto aTrack = aStep->GetTrack(); + // try to get user track info + auto trackinfo = dynamic_cast<CommonUserTrackInfo*>(aTrack->GetUserInformation()); + + // ======================================================================== + // Note: + // if there is no track info, then do nothing. + // ======================================================================== + if (trackinfo) { + // back scattering is defined as following: + // - pre point is not in tracker + // - post point is in tracker + // For details, look at Mokka's source code: + // https://llrforge.in2p3.fr/trac/Mokka/browser/trunk/source/Kernel/src/SteppingAction.cc + const auto& pre_pos = aStep->GetPreStepPoint()->GetPosition(); + const auto& post_pos = aStep->GetPostStepPoint()->GetPosition(); + + bool is_pre_in_tracker = pre_pos.perp() < R && std::fabs(pre_pos.z()) < Z; + bool is_post_in_tracker = post_pos.perp() < R && std::fabs(post_pos.z()) < Z; + + if ((!is_pre_in_tracker) and is_post_in_tracker) { + // set back scattering + auto idxedm4hep = trackinfo->idxEdm4hep(); + mcCol->at(idxedm4hep).setBackscatter(true); + debug() << " set back scatter for MCParticle " + << " (ID: " << idxedm4hep << ")" + << endmsg; + } + } } StatusCode diff --git a/Simulation/DetSimAna/src/Edm4hepWriterAnaElemTool.h b/Simulation/DetSimAna/src/Edm4hepWriterAnaElemTool.h index 7b992d3076c0ddfa7b7bd9f5d8639274ba0538b1..e4415b17899012530817186c0428581b585bad62 100644 --- a/Simulation/DetSimAna/src/Edm4hepWriterAnaElemTool.h +++ b/Simulation/DetSimAna/src/Edm4hepWriterAnaElemTool.h @@ -6,6 +6,10 @@ #include "GaudiKernel/AlgTool.h" #include "k4FWCore/DataHandle.h" #include "DetSimInterface/IAnaElemTool.h" +#include "DetSimInterface/CommonUserEventInfo.hh" +#include "DetSimInterface/CommonUserTrackInfo.hh" + +#include "DetInterface/IGeomSvc.h" #include "edm4hep/MCParticleCollection.h" #include "edm4hep/SimTrackerHitCollection.h" @@ -42,10 +46,10 @@ public: private: // In order to associate MCParticle with contribution, we need to access MC Particle. // - collection MCParticle: the particles in Generator - DataHandle<edm4hep::MCParticleCollection> m_mcParGenCol{"MCParticle", + DataHandle<edm4hep::MCParticleCollection> m_mcParGenCol{"MCParticleGen", Gaudi::DataHandle::Writer, this}; // - collection MCParticleG4: the simulated particles in Geant4 - DataHandle<edm4hep::MCParticleCollection> m_mcParCol{"MCParticleG4", + DataHandle<edm4hep::MCParticleCollection> m_mcParCol{"MCParticle", Gaudi::DataHandle::Writer, this}; edm4hep::MCParticleCollection* mcCol; @@ -140,6 +144,14 @@ private: std::map<int, int> m_track2primary; + CommonUserEventInfo* m_userinfo = nullptr; + + // get the limitation of R/Z in tracker + SmartIF<IGeomSvc> m_geosvc; + double R = 0; + double Z = 0; + + bool verboseOutput = false; }; #endif diff --git a/Simulation/DetSimAna/src/ExampleAnaElemTool.cpp b/Simulation/DetSimAna/src/ExampleAnaElemTool.cpp index d912414d4108a8f45efdb394d26ddcfab5fc0d21..1e11da48b5c8872ff1553c95025597a2a7db251c 100644 --- a/Simulation/DetSimAna/src/ExampleAnaElemTool.cpp +++ b/Simulation/DetSimAna/src/ExampleAnaElemTool.cpp @@ -9,7 +9,7 @@ #include "DDG4/Geant4Mapping.h" #include "DDG4/Geant4HitCollection.h" #include "DDG4/Geant4Data.h" -#include "DDG4/Geant4Hits.h" +#include "DetSimSD/Geant4Hits.h" DECLARE_COMPONENT(ExampleAnaElemTool) diff --git a/Simulation/DetSimCore/src/DetSimSvc.cpp b/Simulation/DetSimCore/src/DetSimSvc.cpp index dd26f3bb580d38e6f35b852e05e996865eaeca27..7bd32614fa2b400009afc0f35eb28c7bcb31ec74 100644 --- a/Simulation/DetSimCore/src/DetSimSvc.cpp +++ b/Simulation/DetSimCore/src/DetSimSvc.cpp @@ -39,7 +39,7 @@ DetSimSvc::simulateEvent(int i_event) { StatusCode sc; m_runmgr->ProcessOneEvent(i_event); - + m_runmgr->TerminateOneEvent(); return sc; } diff --git a/Simulation/DetSimCore/src/G4PrimaryCnvTool.cpp b/Simulation/DetSimCore/src/G4PrimaryCnvTool.cpp index c756412f62dccf71d5628191b10f4a4e6f555e26..9e027750383bbb8c856248f4736275a730b843e0 100644 --- a/Simulation/DetSimCore/src/G4PrimaryCnvTool.cpp +++ b/Simulation/DetSimCore/src/G4PrimaryCnvTool.cpp @@ -5,24 +5,43 @@ #include "G4IonTable.hh" #include "G4ParticleDefinition.hh" +#include "DetSimInterface/CommonUserEventInfo.hh" + DECLARE_COMPONENT(G4PrimaryCnvTool) bool G4PrimaryCnvTool::mutate(G4Event* anEvent) { + // create a event info + auto eventinfo = new CommonUserEventInfo(); + anEvent->SetUserInformation(eventinfo); + + int idxG4 = 0; // valid: [1, N+1) + int idxEdm4hep = -1; // valid: [0, N) + auto mcCol = m_mcParCol.get(); - info() << "Start a new event: " << endmsg; + info() << "Start a new event " << anEvent->GetEventID() << endmsg; for ( auto p : *mcCol ) { - info() << p.getObjectID().index << " : ["; + debug() << " gen track: " << p.getObjectID().index + << " : (status: " << p.getGeneratorStatus() << ")" + << " : (daughters: ["; for ( auto it = p.daughters_begin(), end = p.daughters_end(); it != end; ++it ) { - info() << " " << it->getObjectID().index; + debug() << " " << it->getObjectID().index; } - info() << " ]; " << endmsg; + debug() << " ]); " << endmsg; + + // idx in mc particle collection + ++idxEdm4hep; // only the GeneratorStatus == 1 is used. if (p.getGeneratorStatus() != 1) { continue; } + // idx in g4 collection + ++idxG4; + + eventinfo->setIdxG4Track2Edm4hep(idxG4, idxEdm4hep); + // vertex const edm4hep::Vector3d& vertex = p.getVertex(); double t = p.getTime()*CLHEP::ns; @@ -31,11 +50,11 @@ bool G4PrimaryCnvTool::mutate(G4Event* anEvent) { vertex.z*CLHEP::mm, t); - info() << "Geant4 Primary Vertex: (" - << vertex.x*CLHEP::mm << "," - << vertex.y*CLHEP::mm << "," - << vertex.z*CLHEP::mm << ")" - << endmsg; + debug() << "--> Creating Geant4 Primary Vertex: (" + << vertex.x*CLHEP::mm << "," + << vertex.y*CLHEP::mm << "," + << vertex.z*CLHEP::mm << ")" + << endmsg; // pdg/particle int pdgcode = p.getPDG(); @@ -53,7 +72,7 @@ bool G4PrimaryCnvTool::mutate(G4Event* anEvent) { particle_def = particletbl->FindParticle(pdgcode); } // momentum - const edm4hep::Vector3f& momentum = p.getMomentum(); + const auto& momentum = p.getMomentum(); G4PrimaryParticle* g4prim = new G4PrimaryParticle(particle_def, momentum.x*CLHEP::GeV, momentum.y*CLHEP::GeV, diff --git a/Simulation/DetSimCore/src/G4PrimaryCnvTool.h b/Simulation/DetSimCore/src/G4PrimaryCnvTool.h index 1e47772177fd0c5f2e57029bae512a2c12f7813e..70b143fc57409b0f1010a86636b5db84d3391855 100644 --- a/Simulation/DetSimCore/src/G4PrimaryCnvTool.h +++ b/Simulation/DetSimCore/src/G4PrimaryCnvTool.h @@ -16,7 +16,7 @@ public: bool mutate(G4Event* anEvent) override; private: - DataHandle<edm4hep::MCParticleCollection> m_mcParCol{"MCParticle", Gaudi::DataHandle::Reader, this}; + DataHandle<edm4hep::MCParticleCollection> m_mcParCol{"MCParticleGen", Gaudi::DataHandle::Reader, this}; Gaudi::Property<double> m_chargedgeantino_mass{this, "ChargedGeantinoMass"}; }; diff --git a/Simulation/DetSimDedx/CMakeLists.txt b/Simulation/DetSimDedx/CMakeLists.txt index fb8e4d3a65429de7514834b96268b8cae7b611fb..867ff20cd4b6ed8f04919b89340901dccbb12272 100644 --- a/Simulation/DetSimDedx/CMakeLists.txt +++ b/Simulation/DetSimDedx/CMakeLists.txt @@ -1,15 +1,31 @@ find_package(Geant4 REQUIRED ui_all vis_all) include(${Geant4_USE_FILE}) +find_package(Garfield REQUIRED) +message(Garfield::Garfield) +message("libonnxruntime ${OnnxRuntime_LIBRARY}") +message("libonnxruntime include ${OnnxRuntime_INCLUDE_DIR}") +find_package(OnnxRuntime REQUIRED) +message("libonnxruntime ${OnnxRuntime_LIBRARY}") gaudi_add_module(DetSimDedx SOURCES src/DummyDedxSimTool.cpp src/BetheBlochEquationDedxSimTool.cpp src/GFDndxSimTool.cpp + src/TrackHeedSimTool.cpp LINK DetSimInterface + DetInterface + DetSegmentation ${DD4hep_COMPONENT_LIBRARIES} Gaudi::GaudiKernel EDM4HEP::edm4hep EDM4HEP::edm4hepDict + k4FWCore::k4FWCore + Garfield::Garfield + OnnxRuntime + #${OnnxRuntime_LIBRARY} + #/cvmfs/sft.cern.ch/lcg/views/LCG_103/x86_64-centos7-gcc11-opt/lib/libonnxruntime.so + ${CLHEP_LIBRARIES} + ) diff --git a/Simulation/DetSimDedx/src/TrackHeedSimTool.cpp b/Simulation/DetSimDedx/src/TrackHeedSimTool.cpp new file mode 100644 index 0000000000000000000000000000000000000000..f66c582b2a90d19ad86ede717d7e538ca51d9de0 --- /dev/null +++ b/Simulation/DetSimDedx/src/TrackHeedSimTool.cpp @@ -0,0 +1,659 @@ +#include "TrackHeedSimTool.h" +#include "G4Step.hh" +#include "G4SystemOfUnits.hh" +#include <G4VProcess.hh> +#include "G4TransportationManager.hh" +#include "G4Navigator.hh" +#include "G4VPhysicalVolume.hh" +#include "G4LogicalVolume.hh" +#include <G4VTouchable.hh> +#include "DDG4/Geant4Converter.h" +#include "DetSegmentation/GridDriftChamber.h" + + +#include <math.h> +#include <cmath> +#include <iostream> +#include <time.h> +#include "CLHEP/Random/RandGauss.h" + + +DECLARE_COMPONENT(TrackHeedSimTool) + +double TrackHeedSimTool::dedx(const edm4hep::MCParticle& mc) {return 0;} +double TrackHeedSimTool::dndx(double betagamma) {return 0;} + +double TrackHeedSimTool::dedx(const G4Step* Step) +{ + if(m_beginEvt){ + m_SimPrimaryIonizationCol = m_SimPrimaryIonizationColWriter.createAndPut(); + m_beginEvt = false; + } + clock_t t0 = clock(); + double de = 0; + float cm_to_mm = 10; + G4Step* aStep = const_cast<G4Step*>(Step); + G4Track* g4Track = aStep->GetTrack(); + int pdg_code = g4Track->GetParticleDefinition()->GetPDGEncoding(); + G4double pdg_mass = g4Track->GetParticleDefinition()->GetPDGMass(); + G4double pdg_charge = g4Track->GetParticleDefinition()->GetPDGCharge(); + const G4VProcess* creatorProcess = g4Track->GetCreatorProcess(); + const G4String tmp_str_pro = (creatorProcess !=0) ? creatorProcess->GetProcessName() : "normal"; + G4double gammabeta=aStep->GetPreStepPoint()->GetBeta() * aStep->GetPreStepPoint()->GetGamma(); + if(g4Track->GetParticleDefinition()->GetPDGCharge() ==0) return 0;//skip neutral particle + if(gammabeta<0.01)return m_eps;//too low momentum + if(m_only_primary.value() && g4Track->GetParentID() != 0) return m_eps; + if(g4Track->GetKineticEnergy() <=0) return 0; + if(pdg_code == 11 && (tmp_str_pro=="phot" || tmp_str_pro=="hIoni" || tmp_str_pro=="eIoni" || tmp_str_pro=="muIoni" || tmp_str_pro=="ionIoni" ) ) return m_eps;//skip the electron produced by Ioni, because it is already simulated by TrackHeed + if(m_particle_map.find(pdg_code) == m_particle_map.end() ) return m_eps; + edm4hep::MCParticleCollection* mcCol = nullptr; + try{ + mcCol = const_cast<edm4hep::MCParticleCollection*>(m_mc_handle.get()); + } + catch(...){ + G4cout<<"Error! Can't find MCParticle collection in event, please check it have been createAndPut() in Begin of event"<<G4endl; + throw "stop here!"; + } + + G4double track_KE = aStep->GetPreStepPoint()->GetKineticEnergy(); + G4double track_time = aStep->GetPreStepPoint()->GetGlobalTime(); + G4double track_dx = aStep->GetPreStepPoint()->GetMomentumDirection ().x(); + G4double track_dy = aStep->GetPreStepPoint()->GetMomentumDirection ().y(); + G4double track_dz = aStep->GetPreStepPoint()->GetMomentumDirection ().z(); + G4double track_length = aStep->GetStepLength(); + G4double position_x = aStep->GetPreStepPoint()->GetPosition().x(); + G4double position_y = aStep->GetPreStepPoint()->GetPosition().y(); + G4double position_z = aStep->GetPreStepPoint()->GetPosition().z(); + int track_ID = g4Track->GetTrackID(); + int Parent_ID = g4Track->GetParentID(); + bool update_ke = true; + if(m_use_max_step.value()){ + bool do_sim = false; + if(m_isFirst){ + m_pre_x = aStep->GetPreStepPoint()->GetPosition().x(); + m_pre_y = aStep->GetPreStepPoint()->GetPosition().y(); + m_pre_z = aStep->GetPreStepPoint()->GetPosition().z(); + m_pre_dx = aStep->GetPreStepPoint()->GetMomentumDirection().x(); + m_pre_dy = aStep->GetPreStepPoint()->GetMomentumDirection().y(); + m_pre_dz = aStep->GetPreStepPoint()->GetMomentumDirection().z(); + m_pre_t = aStep->GetPreStepPoint()->GetGlobalTime(); + m_post_point = aStep->GetPostStepPoint(); + m_total_range += track_length; + m_current_track_ID = g4Track->GetTrackID(); + m_current_Parent_ID = g4Track->GetParentID(); + m_pdg_code = g4Track->GetParticleDefinition()->GetPDGEncoding(); + m_isFirst = false; + m_pa_KE = aStep->GetPreStepPoint()->GetKineticEnergy(); + } + else{ + + if(g4Track->GetTrackID() != m_current_track_ID){ + do_sim = true; + m_change_track = true; + update_ke = false; + } + else{ + m_post_point = aStep->GetPostStepPoint(); + m_total_range += track_length; + } + } + if(m_total_range/CLHEP::mm >= m_max_step.value()){ + do_sim = true; + } + if(do_sim){ + track_KE = m_pa_KE; + pdg_code = m_pdg_code; + track_length = m_total_range; + track_time = m_pre_t; + track_dx = m_pre_dx; + track_dy = m_pre_dy; + track_dz = m_pre_dz; + position_x = m_pre_x; + position_y = m_pre_y; + position_z = m_pre_z; + track_ID = m_current_track_ID; + Parent_ID = m_current_Parent_ID; + if(m_change_track){ + m_pre_x = aStep->GetPreStepPoint()->GetPosition().x(); + m_pre_y = aStep->GetPreStepPoint()->GetPosition().y(); + m_pre_z = aStep->GetPreStepPoint()->GetPosition().z(); + m_pre_dx = aStep->GetPreStepPoint()->GetMomentumDirection().x(); + m_pre_dy = aStep->GetPreStepPoint()->GetMomentumDirection().y(); + m_pre_dz = aStep->GetPreStepPoint()->GetMomentumDirection().z(); + m_pre_t = aStep->GetPreStepPoint()->GetGlobalTime(); + m_post_point = aStep->GetPostStepPoint(); + m_total_range = aStep->GetStepLength(); + m_current_track_ID = g4Track->GetTrackID(); + m_current_Parent_ID = g4Track->GetParentID(); + m_pdg_code = g4Track->GetParticleDefinition()->GetPDGEncoding(); + m_change_track = false; + } + else{ + m_pre_x = aStep->GetPostStepPoint()->GetPosition().x(); + m_pre_y = aStep->GetPostStepPoint()->GetPosition().y(); + m_pre_z = aStep->GetPostStepPoint()->GetPosition().z(); + m_pre_dx = aStep->GetPostStepPoint()->GetMomentumDirection().x(); + m_pre_dy = aStep->GetPostStepPoint()->GetMomentumDirection().y(); + m_pre_dz = aStep->GetPostStepPoint()->GetMomentumDirection().z(); + m_pre_t = aStep->GetPostStepPoint()->GetGlobalTime(); + m_total_range = 0; + } + } + else return m_eps; + } + + float init_x = 10;//cm + float init_y = -10;//cm + /* + if(pdg_code == 11 && track_KE/CLHEP::keV < m_delta_threshold.value()){ + int nc = 0, ni=0; + m_track->TransportDeltaElectron(init_x, init_y, 0, track_time/CLHEP::ns, track_KE/CLHEP::eV, track_dx, track_dy, track_dz, nc, ni); + for (int j = 0; j < nc; ++j) { + double xe = 0., ye = 0., ze = 0., te = 0., ee = 0.; + double dx = 0., dy = 0., dz = 0.; + m_track->GetElectron(j, xe, ye, ze, te, ee, dx, dy, dz); + auto ehit = SimIonizationCol->create(); + ehit.setTime(te); + double epos[3] = { cm_to_mm*( (xe - init_x)+position_x/CLHEP::cm) , cm_to_mm*((ye - init_y)+position_y/CLHEP::cm), cm_to_mm*(ze + position_z/CLHEP::cm)}; + ehit.setPosition(edm4hep::Vector3d(epos)); + ehit.setType(11); + } + g4Track->SetTrackStatus(fStopAndKill); + return 0; + } + */ + clock_t t01 = clock(); + //cmp.SetMagneticField(0., 0., -3.); + m_track->SetParticle(m_particle_map[pdg_code]); + + bool change_KE = false; + if( abs(m_previous_KE -(track_KE/CLHEP::eV) )/(track_KE/CLHEP::eV) > m_change_threshold.value()) { + change_KE = true; + m_previous_KE = track_KE/CLHEP::eV; + } + + bool change_ID = false; + if(m_previous_track_ID != track_ID ){ + change_ID = true; + m_previous_track_ID = track_ID; + m_previous_KE = track_KE/CLHEP::eV; + } + if(change_ID || change_KE ){ + m_track->SetKineticEnergy(track_KE/CLHEP::eV); + } + + + m_track->EnableOneStepFly(true); + m_track->SetSteppingLimits( track_length/CLHEP::cm, 1000, 0.1, 0.2); + clock_t t012 = clock(); + m_track->NewTrack(init_x, init_y, 0, track_time/CLHEP::ns, track_dx, track_dy, track_dz);//cm + double xc = 0., yc = 0., zc = 0., tc = 0., ec = 0., extra = 0.; + int nc = 0; + int ic = 0; + int first=true; + clock_t t02 = clock(); + while (m_track->GetCluster(xc, yc, zc, tc, nc, ec, extra)) { + //auto chit = SimHitCol->create(); + //auto chit = SimPrimaryIonizationCol->create(); + auto chit = m_SimPrimaryIonizationCol->create(); + chit.setTime(tc); + double cpos[3] = { cm_to_mm*( (xc - init_x)+position_x/CLHEP::cm) , cm_to_mm*((yc - init_y)+position_y/CLHEP::cm), cm_to_mm*(zc + position_z/CLHEP::cm)}; + chit.setPosition(edm4hep::Vector3d(cpos)); + //float cmom[3] = {0,0,0}; + //getMom(ec, 1, 0, 0, cmom);//FIXME direction is not important? + chit.setType(0);//default + if(m_save_cellID) chit.setCellID( getCellID(cpos[0], cpos[1], cpos[2]) ); + if(m_save_mc && Parent_ID == 0 && track_ID <= mcCol->size() && mcCol ){ + chit.setMCParticle( mcCol->at(track_ID-1) ); + //std::cout<<"mc obj index="<<mcCol->at(track_ID-1).getObjectID().index<<std::endl; + //std::cout<<"mc obj index1="<<chit.getMCParticle().getObjectID().index<<std::endl; + } + de += ec; + for (int j = 0; j < nc; ++j) { + double xe = 0., ye = 0., ze = 0., te = 0., ee = 0.; + double dx = 0., dy = 0., dz = 0.; + m_track->GetElectron(j, xe, ye, ze, te, ee, dx, dy, dz); + //auto ehit = SimHitCol->create(); + //auto ehit = SimIonizationCol->create(); + //ehit.setPrimaryIonization(chit); + chit.addToElectronTime(te); + //ehit.setTime(te); + double epos[3] = { cm_to_mm*( (xe - init_x)+position_x/CLHEP::cm) , cm_to_mm*((ye - init_y)+position_y/CLHEP::cm), cm_to_mm*(ze + position_z/CLHEP::cm)}; + //ehit.setPosition(edm4hep::Vector3d(epos)); + //ehit.setPosition(edm4hep::Vector3d(epos)); + chit.addToElectronPosition(edm4hep::Vector3d(epos)); + //if(m_save_mc && Parent_ID == 0 && track_ID <= mcCol->size() && mcCol ){ + // ehit.setMCParticle( mcCol->at(track_ID-1) ); + //ehit.setMcParticleObjID( mcCol->at(track_ID-1).id() ); + //ehit.setMcParticleColID( mcCol->at(track_ID-1).getObjectID().collectionID ); + //} + /* //no sense of conductor electron + float emom[3] = {0,0,0}; + getMom(ee, dx, dy, dz, emom); + ehit.setMomentum(edm4hep::Vector3f(emom)); + */ + //if(m_save_cellID) ehit.setCellID( getCellID(epos[0], epos[1], epos[2]) ); + if(m_save_cellID) chit.addToElectronCellID( getCellID(epos[0], epos[1], epos[2]) ); + //ehit.setQuality(2); + //ehit.setType(0);//default + } + } + double Dedx = (de*1e-6/(track_length/CLHEP::cm) ) ;//MeV/cm + double new_KE = track_KE/CLHEP::MeV - de*1e-6; + if( update_ke ){ + g4Track->SetKineticEnergy ( new_KE*CLHEP::MeV ); + aStep->GetPostStepPoint()->SetKineticEnergy ( new_KE*CLHEP::MeV ); + m_pa_KE = new_KE; + } + else{ + m_pa_KE = aStep->GetPreStepPoint()->GetKineticEnergy(); + } + m_tot_edep += de; + m_tot_length += track_length; + return Dedx; +} + + +long long TrackHeedSimTool::getCellID(float x, float y, float z) +{ + float MM_2_CM = 0.1; + G4Navigator* gNavigator = G4TransportationManager::GetTransportationManager()->GetNavigatorForTracking(); + G4ThreeVector global(x,y,z); + dd4hep::sim::Geant4VolumeManager volMgr = dd4hep::sim::Geant4Mapping::instance().volumeManager(); + G4VPhysicalVolume* pv = gNavigator->LocateGlobalPointAndSetup( global, 0, true); + if(!pv) return 0; + G4TouchableHistory *hist = gNavigator->CreateTouchableHistory(); + dd4hep::VolumeID volID = volMgr.volumeID(hist); + const G4AffineTransform & affine = gNavigator->GetGlobalToLocalTransform(); + G4ThreeVector local = affine.TransformPoint(global); + dd4hep::Position loc(local.x()*MM_2_CM, local.y()*MM_2_CM, local.z()*MM_2_CM); + dd4hep::Position glob(global.x()*MM_2_CM, global.y()*MM_2_CM, global.z()*MM_2_CM); + dd4hep::VolumeID cID = m_segmentation->cellID(loc,glob,volID); + + if(m_debug){ + TVector3 Wstart(0,0,0); + TVector3 Wend (0,0,0); + m_segmentation->cellposition(cID, Wstart, Wend); + std::cout<<"Name="<<pv->GetName()<<",CopyNo="<<pv->GetCopyNo()<<",cID="<<cID<<",volID="<<volID<<",glob="<<glob<<",loc="<<loc<<",ws_x="<<Wstart.X()<<",y="<<Wstart.Y()<<",z="<<Wstart.Z()<<",we_x="<<Wend.X()<<",y="<<Wend.Y()<<",z="<<Wend.Z()<<std::endl; + } + delete hist; + return cID; +} + +void TrackHeedSimTool::getMom(float ee, float dx, float dy,float dz, float mom[3]) +{ + double tot_E = 0.511*1e6 + ee;//eV + double Mom = sqrt(tot_E*tot_E - pow(0.511*1e6,2) ); + double mom_direction = sqrt(dx*dx + dy*dy + dz*dz); + if (mom_direction == 0){ + mom[0] = 0; + mom[1] = 0; + mom[2] = 0; + } + else{ + double scale = Mom/mom_direction; + mom[0] = scale*dx/1e9; + mom[1] = scale*dy/1e9; + mom[2] = scale*dz/1e9; + } +} + +StatusCode TrackHeedSimTool::initialize() +{ + + m_geosvc = service<IGeomSvc>("GeomSvc"); + if ( !m_geosvc ) throw "TrackHeedSimTool :Failed to find GeomSvc ..."; + m_dd4hep = m_geosvc->lcdd(); + if ( !m_dd4hep ) throw "TrackHeedSimTool :Failed to get dd4hep::Detector ..."; + m_readout = new dd4hep::Readout( m_dd4hep->readout(m_readout_name) ); + if ( !m_readout ) throw "TrackHeedSimTool :Failed to get readout ..."; + m_segmentation = dynamic_cast<dd4hep::DDSegmentation::GridDriftChamber*>(m_readout->segmentation().segmentation()); + if ( !m_segmentation ) throw "TrackHeedSimTool :Failed to get segmentation ..."; + + m_particle_map[ 11] = "e-"; + m_particle_map[-11] = "e+"; + m_particle_map[ 13] = "mu-"; + m_particle_map[-13] = "mu+"; + m_particle_map[ 211] = "pi+"; + m_particle_map[-211] = "pi-"; + m_particle_map[ 321] = "K+"; + m_particle_map[-321] = "K-"; + m_particle_map[2212] = "p"; + m_particle_map[-2212] = "pbar"; + m_particle_map[700201] = "d"; + m_particle_map[700202] = "alpha"; + + m_gas.SetComposition("he", m_he,"isobutane", m_isob); + m_gas.SetTemperature(293.15); + m_gas.SetPressure(760.0); + m_gas.SetMaxElectronEnergy(200.); + m_gas.EnablePenningTransfer(0.44, 0.0, "He"); + m_gas.LoadGasFile(m_gas_file.value()); + m_gas.LoadIonMobility(m_IonMobility.value()); + //std::this_thread::sleep_for(std::chrono::milliseconds(m_delay_time)); + //m_gas.LoadGasFile("/junofs/users/wxfang/MyGit/tmp/check_G4FastSim_20210121/CEPCSW/Digitisers/DigiGarfield/He_50_isobutane_50.gas"); + //m_gas.LoadIonMobility("/junofs/users/wxfang/MyGit/tmp/check_G4FastSim_20210121/CEPCSW/Digitisers/DigiGarfield/IonMobility_He+_He.txt"); + /* + m_gas.SetComposition("he", 90.,"isobutane", 10.); // cepc gas + m_gas.SetPressure(760.0); + m_gas.SetTemperature(293.15); + m_gas.SetFieldGrid(100., 100000., 20, true); + m_gas.GenerateGasTable(10); + m_gas.WriteGasFile("he_90_isobutane_10.gas"); + */ + + cmp.SetMedium(&m_gas); + // Field Wire radius [cm] + const double rFWire = 110.e-4; + // Signa Wire radius [cm] + const double rSWire = 25.e-4; + // Cell radius [cm] + float rCell = 50;//As the ionization process is almost not effected by cell geometry and wire voltage. Here the radius is to make sure the ionization process is completed. + // Voltages + const double vSWire = 2000.; + const double vFWire = 0.; + // Add the signal wire in the centre. + cmp.AddWire(0, 0, 2 * rSWire, vSWire, "s"); + // Add the field wire around the signal wire. + cmp.AddWire(-rCell, -rCell, 2 * rFWire, vFWire, "f"); + cmp.AddWire( 0., -rCell, 2 * rFWire, vFWire, "f"); + cmp.AddWire( rCell, -rCell, 2 * rFWire, vFWire, "f"); + cmp.AddWire(-rCell, 0., 2 * rFWire, vFWire, "f"); + cmp.AddWire( rCell, 0., 2 * rFWire, vFWire, "f"); + cmp.AddWire(-rCell, rCell, 2 * rFWire, vFWire, "f"); + cmp.AddWire( 0., rCell, 2 * rFWire, vFWire, "f"); + cmp.AddWire( rCell, rCell, 2 * rFWire, vFWire, "f"); + if(m_BField !=0 ) cmp.SetMagneticField(0., 0., m_BField); + cmp.AddReadout("s"); + + + /// + /// Make a sensor. + /// + m_sensor = new Sensor(); + m_sensor->AddComponent(&cmp); + m_sensor->AddElectrode(&cmp, "s"); + // Set the signal time window. [ns] + const double tstep = 0.5; + const double tmin = -0.5 * 0.5; + const unsigned int nbins = 1000; + m_sensor->SetTimeWindow(tmin, tstep, nbins); + m_sensor->ClearSignal(); + + + + m_track = new Garfield::TrackHeed(); + //track->EnableDebugging(); + m_track->SetSensor(m_sensor); + m_track->EnableDeltaElectronTransport(); + //track->DisableDeltaElectronTransport(); + m_track->EnableMagneticField(); + m_track->EnableElectricField();//almost no effect here + + m_current_track_ID = 0; + m_previous_track_ID =0; + m_previous_KE = 0; + m_current_Parent_ID = -1; + m_change_track = false; + m_total_range = 0; + m_isFirst = true; + m_beginEvt = true; + m_tot_edep = 0; + m_tot_length = 0; + m_pa_KE =0; + m_pdg_code = 0; + m_pre_x = 0; + m_pre_y = 0; + m_pre_z = 0; + m_pre_dx = 0; + m_pre_dy = 0; + m_pre_dz = 0; + m_pre_t = 0; + + + // for NN pulse simulation// + m_env = std::make_shared<Ort::Env>(ORT_LOGGING_LEVEL_WARNING, "ENV"); + m_seesion_options = std::make_shared<Ort::SessionOptions>(); + m_seesion_options->SetIntraOpNumThreads(m_intra_op_nthreads); + m_seesion_options->SetInterOpNumThreads(m_inter_op_nthreads); + if(m_debug) std::cout << "before load model " << m_model_file.value() << std::endl; + m_session = std::make_shared<Ort::Session>(*m_env, m_model_file.value().c_str(), *m_seesion_options); + if(m_debug) std::cout << "after load model " << m_model_file.value() << std::endl; + // lambda function to print the dims. + auto dims_str = [&](const auto& dims) { + return std::accumulate(dims.begin(), dims.end(), std::to_string(dims[0]), + [](const std::string& a, int64_t b){ + return a + "x" + std::to_string(b); + }); + }; + // prepare the input + auto num_input_nodes = m_session->GetInputCount(); + if(m_debug) std::cout << "num_input_nodes: " << num_input_nodes << std::endl; + for (size_t i = 0; i < num_input_nodes; ++i) { + #if (ORT_API_VERSION >=13) + auto name = m_session->GetInputNameAllocated(i, m_allocator); + m_inputNodeNameAllocatedStrings.push_back(std::move(name)); + m_input_node_names.push_back(m_inputNodeNameAllocatedStrings.back().get()); + #else + auto name = m_session->GetInputName(i, m_allocator); + m_inputNodeNameAllocatedStrings.push_back(name); + m_input_node_names.push_back(m_inputNodeNameAllocatedStrings.back()); + #endif + + Ort::TypeInfo type_info = m_session->GetInputTypeInfo(i); + auto tensor_info = type_info.GetTensorTypeAndShapeInfo(); + auto dims = tensor_info.GetShape(); + //dims[0] = 1; //wxfang, FIXME, if it is -1 (dynamic axis), need overwrite it manually + dims[0] = 10; //wxfang, FIXME, if it is -1 (dynamic axis), need overwrite it manually + m_input_node_dims.push_back(dims); + + + if(m_debug) std::cout<< "[" << i << "]" + #if (ORT_API_VERSION >=13) + << " input_name: " << m_inputNodeNameAllocatedStrings.back().get() + #else + << " input_name: " << m_inputNodeNameAllocatedStrings.back() + #endif + << " ndims: " << dims.size() + << " dims: " << dims_str(dims) + << std::endl; + } + // prepare the output + size_t num_output_nodes = m_session->GetOutputCount(); + for(std::size_t i = 0; i < num_output_nodes; i++) { + #if (ORT_API_VERSION >=13) + auto output_name = m_session->GetOutputNameAllocated(i, m_allocator); + m_outputNodeNameAllocatedStrings.push_back(std::move(output_name)); + m_output_node_names.push_back(m_outputNodeNameAllocatedStrings.back().get()); + #else + auto output_name = m_session->GetOutputName(i, m_allocator); + m_outputNodeNameAllocatedStrings.push_back(output_name); + m_output_node_names.push_back(m_outputNodeNameAllocatedStrings.back()); + #endif + Ort::TypeInfo type_info = m_session->GetOutputTypeInfo(i); + auto tensor_info = type_info.GetTensorTypeAndShapeInfo(); + ONNXTensorElementDataType type = tensor_info.GetElementType(); + m_output_node_dims = tensor_info.GetShape(); + if(m_debug) std::cout << "[" << i << "]" + #if (ORT_API_VERSION >=13) + << " output_name: " << m_outputNodeNameAllocatedStrings.back().get() + #else + << " output_name: " << m_outputNodeNameAllocatedStrings.back() + #endif + << " ndims: " << m_output_node_dims.size() + << " dims: " << dims_str(m_output_node_dims) + << std::endl; + + } + + return StatusCode::SUCCESS; +} + +void TrackHeedSimTool::wire_xy(float x1, float y1, float z1, float x2, float y2, float z2, float z, float &x, float &y){ + //linear function: + //(x-x1)/(x2-x1)=(y-y1)/(y2-y1)=(z-z1)/(z2-z1) + x = x1+(x2-x1)*(z-z1)/(z2-z1); + y = y1+(y2-y1)*(z-z1)/(z2-z1); +} + +float TrackHeedSimTool::xy2phi(float x, float y){ + float phi = acos(x/sqrt(x*x+y*y)); + if(y < 0) phi = 2*M_PI-phi; + return phi; +} +void TrackHeedSimTool::getLocal(float x1, float y1, float x2, float y2, float& dx, float& dy){ + /* . + . *(x2,y2) + . . + . . + *(x1, y1) + . + . + . + o + */ + float mo1 = sqrt(x1*x1+y1*y1); + float mo2 = sqrt((x2-x1)*(x2-x1)+(y2-y1)*(y2-y1) ); + float costheta = (x1*(x2-x1)+y1*(y2-y1))/(mo1*mo2); + dy = mo2*costheta; + dx = xy2phi(x2,y2)>xy2phi(x1,y1) ? mo2*sqrt(1-costheta*costheta) : -mo2*sqrt(1-costheta*costheta) ; +} + +float* TrackHeedSimTool::NNPred(std::vector<float>& inputs) +{ + + + std::vector<Ort::Value> input_tensors; + auto& dims = m_input_node_dims[0]; + //std::cout << "inputs.size()="<<inputs.size() << std::endl; + dims[0] = int(inputs.size()/3); + Ort::MemoryInfo info("Cpu", OrtDeviceAllocator, 0, OrtMemTypeDefault); + // prepare a dummy input for the model + + + auto input_tensor = Ort::Value::CreateTensor(info, + inputs.data(), + inputs.size(), + dims.data(), + dims.size()); + + input_tensors.push_back(std::move(input_tensor)); + auto output_tensors = m_session->Run(Ort::RunOptions{ nullptr }, m_input_node_names.data(), input_tensors.data(), input_tensors.size(), m_output_node_names.data(), m_output_node_names.size()); + //const auto& output_tensor = output_tensors[0]; + auto& output_tensor = output_tensors[0]; + int num_elements = output_tensor.GetTensorTypeAndShapeInfo().GetElementCount(); + //std::cout << "output_tensor num_elements=" << num_elements<< std::endl; + + float* vec2 = new float[num_elements]; + std::memcpy(vec2, output_tensor.GetTensorMutableData<float>(), num_elements * sizeof(float)); + /* + for (int k=0;k<num_elements;k++){ + std::cout<<"k="<<k<< ",v=" <<vec2[k]<< std::endl; + } + */ + return vec2; +} + + +void TrackHeedSimTool::endOfEvent() { + if(m_sim_pulse){ + if(m_debug) G4cout<<"SimPrimaryIonizationCol size="<<m_SimPrimaryIonizationCol->size()<<G4endl; + clock_t t01 = clock(); + std::vector<float> inputs; + std::vector<unsigned long> indexs_c; + std::vector<unsigned long> indexs_i; + std::map<unsigned long long, std::vector<std::pair<float, float> > > id_pulse_map; + for (unsigned long z=0; z<m_SimPrimaryIonizationCol->size(); z++) { + for (unsigned long k=0; k<m_SimPrimaryIonizationCol->at(z).electronCellID_size(); k++) { + auto position = m_SimPrimaryIonizationCol->at(z).getElectronPosition(k);//mm + auto cellId = m_SimPrimaryIonizationCol->at(z).getElectronCellID(k); + TVector3 Wstart(0,0,0); + TVector3 Wend (0,0,0); + m_segmentation->cellposition(cellId, Wstart, Wend); + float dd4hep_mm = dd4hep::mm; + Wstart =(1/dd4hep_mm)* Wstart;// from DD4HEP cm to mm + Wend =(1/dd4hep_mm)* Wend ; + //std::cout<<"cellid="<<cellId<<",s_x="<<Wstart.x()<<",s_y="<<Wstart.y()<<",s_z="<<Wstart.z()<<",E_x="<<Wend.x()<<",E_y="<<Wend.y()<<",E_z="<<Wend.z()<<std::endl; + float wire_x = 0; + float wire_y = 0; + double pos_z = position[2]; + wire_xy(Wend.x(), Wend.y(), Wend.z(), Wstart.x(), Wstart.y(), Wstart.z(), pos_z, wire_x, wire_y); + float local_x = 0; + float local_y = 0; + getLocal(wire_x, wire_y, position[0], position[1], local_x, local_y); + //std::cout<<"pos_z="<<pos_z<<",wire_x="<<wire_x<<",wire_y="<<wire_y<<",position[0]="<<position[0]<<",position[1]="<<position[1]<<",local_x="<<local_x<<",local_y="<<local_y<<",dr="<<sqrt(local_x*local_x+local_y*local_y)<<",dr1="<<sqrt( (wire_x-position[0])*(wire_x-position[0])+(wire_y-position[1])*(wire_y-position[1]) )<<std::endl; + //float ext_x_scale = 1;//TODO, default is 18mm x 18mm, the real cell size maybe a bit different. need konw size of cell for each layer, and do normalization using ext_x_scale + //float ext_y_scale = 1; + local_x = local_x/m_x_scale; + local_y = local_y/m_y_scale; + float noise = CLHEP::RandGauss::shoot(0,1); + inputs.push_back(local_x); + inputs.push_back(local_y); + inputs.push_back(noise ); + indexs_c.push_back(z); + indexs_i.push_back(k); + if(indexs_c.size()==m_batchsize){ + float* res = NNPred(inputs); + for(unsigned int i=0; i<m_batchsize; i++){ + float tmp_time = res[i*2 ]*m_time_scale + m_time_shift;// in ns + float tmp_amp = res[i*2+1]*m_amp_scale + m_amp_shift ; + //unsigned long tmp_index = indexs.at(i); + //tmp_pluse.setCellID(SimIonizationCol->at(tmp_index).getCellID()); + //tmp_pluse.setTime(tmp_time + SimIonizationCol->at(tmp_index).getTime());//ns + //tmp_pluse.setValue(tmp_amp); + //tmp_pluse.setType(SimIonizationCol->at(tmp_index).getType()); + //tmp_pluse.setSimIonization(SimIonizationCol->at(tmp_index)); + auto ion_time = m_SimPrimaryIonizationCol->at(indexs_c.at(i)).getElectronTime(indexs_i.at(i)); + id_pulse_map[indexs_c.at(i)].push_back(std::make_pair(tmp_time+ion_time,tmp_amp) ); + } + inputs.clear(); + indexs_c.clear(); + indexs_i.clear(); + delete [] res; + } + } //end of k + }//end of z + if(indexs_c.size()!=0){ + float* res = NNPred(inputs); + for(unsigned int i=0; i<indexs_c.size(); i++){ + float tmp_time = res[i*2 ]*m_time_scale + m_time_shift; + float tmp_amp = res[i*2+1]*m_amp_scale + m_amp_shift ; + //tmp_pluse.setCellID(SimIonizationCol->at(tmp_index).getCellID()); + //tmp_pluse.setTime(tmp_time + SimIonizationCol->at(tmp_index).getTime());//ns + //tmp_pluse.setValue(tmp_amp); + //tmp_pluse.setType(SimIonizationCol->at(tmp_index).getType()); + //tmp_pluse.setSimIonization(SimIonizationCol->at(tmp_index)); + //id_pulse_map[SimIonizationCol->at(tmp_index).getCellID()].push_back(std::make_pair(tmp_pluse.getTime(), tmp_pluse.getValue() ) ); + auto ion_time = m_SimPrimaryIonizationCol->at(indexs_c.at(i)).getElectronTime(indexs_i.at(i)); + id_pulse_map[indexs_c.at(i)].push_back(std::make_pair(tmp_time+ion_time,tmp_amp) ); + } + inputs.clear(); + indexs_c.clear(); + indexs_i.clear(); + delete [] res; + } + for(auto iter = id_pulse_map.begin(); iter != id_pulse_map.end(); iter++){ + edm4hep::MutableSimPrimaryIonizationCluster dcIonCls = m_SimPrimaryIonizationCol->at(iter->first); + for(unsigned int i=0; i< iter->second.size(); i++){ + auto tmp_time = iter->second.at(i).first ; + auto tmp_amp = iter->second.at(i).second; + dcIonCls.addToPulseTime(tmp_time); + dcIonCls.addToPulseAmplitude(tmp_amp); + } + if(dcIonCls.electronPosition_size() != dcIonCls.pulseTime_size()){ + G4cout<<"Error: ion size != pulse size"<<G4endl; + throw "stop here!"; + } + } + clock_t t02 = clock(); + if(m_debug) std::cout<<"time for Pulse Simulation=" << (double)(t02 - t01) / CLOCKS_PER_SEC <<" seconds"<< std::endl; + } + reset(); +} + +StatusCode TrackHeedSimTool::finalize() +{ + //if(m_debug)std::cout << "m_tot_edep="<<m_tot_edep<<" eV"<<std::endl; + //std::cout << "m_tot_length="<<m_tot_length<<" mm"<<std::endl; + return StatusCode::SUCCESS; +} diff --git a/Simulation/DetSimDedx/src/TrackHeedSimTool.h b/Simulation/DetSimDedx/src/TrackHeedSimTool.h new file mode 100644 index 0000000000000000000000000000000000000000..4568c4f9016842d9aa5d8ab017a88e7cdfc90447 --- /dev/null +++ b/Simulation/DetSimDedx/src/TrackHeedSimTool.h @@ -0,0 +1,163 @@ +#ifndef TrackHeedSimTool_h +#define TrackHeedSimTool_h + +#include "k4FWCore/DataHandle.h" +#include "GaudiKernel/MsgStream.h" +#include "DetSimInterface/IDedxSimTool.h" +#include <GaudiKernel/AlgTool.h> +#include "edm4hep/MCParticle.h" +#include "edm4hep/MCParticleCollection.h" +#include "edm4hep/SimPrimaryIonizationClusterCollection.h" +#include "TVector3.h" +#include <G4StepPoint.hh> + +#include "DD4hep/Segmentations.h" +#include "DD4hep/Printout.h" +#include "DD4hep/Detector.h" +#include "DetInterface/IGeomSvc.h" +#include "DetSegmentation/GridDriftChamber.h" + + +#include "Garfield/ViewCell.hh" +#include "Garfield/ViewDrift.hh" +#include "Garfield/ViewSignal.hh" +#include "Garfield/ViewMedium.hh" +#include "Garfield/ComponentAnalyticField.hh" +#include "Garfield/MediumMagboltz.hh" +#include "Garfield/Sensor.hh" +#include "Garfield/DriftLineRKF.hh" +#include "Garfield/AvalancheMicroscopic.hh" +#include "Garfield/AvalancheMC.hh" +#include "Garfield/TrackHeed.hh" +#include "Garfield/ComponentNeBem3d.hh" +#include "Garfield/SolidWire.hh" +#include "Garfield/GeometrySimple.hh" +#include "Garfield/MediumConductor.hh" +#include "Garfield/ViewField.hh" + +#include <map> +#include <string> + +#include "core/session/onnxruntime_cxx_api.h" +#include "core/session/onnxruntime_c_api.h" +using namespace Garfield; + +class TrackHeedSimTool: public extends<AlgTool, IDedxSimTool> { + public: + using extends::extends; + + StatusCode initialize() override; + StatusCode finalize() override; + double dedx(const G4Step* Step) override; + double dedx(const edm4hep::MCParticle& mc) override; + double dndx(double betagamma) override; + void getMom(float ee, float dx, float dy,float dz, float mom[3] ); + void reset(){ + m_beginEvt = true; + m_isFirst = true; + m_previous_track_ID = 0; + m_previous_KE = 0; + m_tot_edep = 0; + m_tot_length = 0; + } + void endOfEvent(); + long long getCellID(float x, float y, float z); + void wire_xy(float x1, float y1, float z1, float x2, float y2, float z2, float z, float &x, float &y); + float* NNPred(std::vector<float>& inputs); + float xy2phi(float x, float y); + void getLocal(float x1, float y1, float x2, float y2, float& dx, float& dy); + private: + //ServiceHandle<IDataProviderSvc> m_eds; + SmartIF<IGeomSvc> m_geosvc; + dd4hep::Detector* m_dd4hep; + dd4hep::Readout* m_readout; + dd4hep::DDSegmentation::GridDriftChamber* m_segmentation; + Gaudi::Property<std::string> m_readout_name{ this, "readout", "DriftChamberHitsCollection"};//readout for getting segmentation + Gaudi::Property<std::string> m_gas_file{ this, "gas_file", "He_50_isobutane_50.gas"};//gas + Gaudi::Property<std::string> m_IonMobility{ this, "IonMobility_file", "IonMobility_He+_He.txt"}; + Gaudi::Property<float> m_isob {this, "isob", 50, ""}; + Gaudi::Property<float> m_he {this, "he", 50, ""}; + Gaudi::Property<bool> m_debug{this, "debug", false}; + Gaudi::Property<bool> m_use_max_step{this, "use_max_step", false}; + Gaudi::Property<bool> m_update_KE{this, "update_KE", true}; + Gaudi::Property<float> m_max_step {this, "max_step", 1};//mm + Gaudi::Property<bool> m_only_primary{this, "only_primary", false}; + Gaudi::Property<bool> m_save_mc{this, "save_mc", false}; + Gaudi::Property<bool> m_save_cellID{this, "save_cellID", true}; + Gaudi::Property<float> m_delta_threshold{this, "delta_threshold", 50};//keV + Gaudi::Property<float> m_change_threshold {this, "change_threshold", 0.05}; + Gaudi::Property<float> m_BField {this, "BField", -3}; + Gaudi::Property<float> m_eps { this, "eps" , 1e-6 };//very small value, it is returned dedx for unsimulated step (may needed for SimTrackerHit) + // Output collections + DataHandle<edm4hep::SimPrimaryIonizationClusterCollection> m_SimPrimaryIonizationColWriter{"SimPrimaryIonizationClusterCollection", Gaudi::DataHandle::Writer, this}; + edm4hep::SimPrimaryIonizationClusterCollection* m_SimPrimaryIonizationCol; + // In order to associate MCParticle with contribution, we need to access MC Particle. + DataHandle<edm4hep::MCParticleCollection> m_mc_handle{"MCParticle", Gaudi::DataHandle::Writer, this}; + + TrackHeed* m_track; + ComponentNeBem3d m_nebem; + ComponentAnalyticField cmp; + GeometrySimple m_geo; + MediumConductor m_metal; + MediumMagboltz m_gas; + Sensor* m_sensor; + std::map<int, std::string> m_particle_map; + + int m_previous_track_ID; + float m_previous_KE; + int m_current_track_ID; + int m_current_Parent_ID; + int m_pdg_code; + G4StepPoint* m_pre_point; + G4StepPoint* m_post_point; + G4double m_total_range; + bool m_isFirst; + bool m_beginEvt; + bool m_change_track; + edm4hep::MCParticle m_mc_paricle; + float m_tot_edep; + float m_tot_length; + float m_pa_KE; + + G4double m_pre_x ; + G4double m_pre_y ; + G4double m_pre_z ; + G4double m_pre_dx ; + G4double m_pre_dy ; + G4double m_pre_dz ; + G4double m_pre_t ; + + //// sim pulse from NN /// + Gaudi::Property<int> m_intra_op_nthreads{ this, "intraOpNumThreads", 1}; + Gaudi::Property<int> m_inter_op_nthreads{ this, "interOpNumThreads", 1}; + std::shared_ptr<Ort::Env> m_env; + std::shared_ptr<Ort::SessionOptions> m_seesion_options; + std::shared_ptr<Ort::Session> m_session; + Ort::AllocatorWithDefaultOptions m_allocator; + std::vector<const char*> m_input_node_names; + std::vector<std::vector<int64_t>> m_input_node_dims; + std::vector<const char*> m_output_node_names; + std::vector<int64_t> m_output_node_dims; + #if (ORT_API_VERSION >=13) + std::vector<Ort::AllocatedStringPtr> m_inputNodeNameAllocatedStrings; + std::vector<Ort::AllocatedStringPtr> m_outputNodeNameAllocatedStrings; + #else + std::vector<const char*> m_inputNodeNameAllocatedStrings; + std::vector<const char*> m_outputNodeNameAllocatedStrings; + #endif + + Gaudi::Property<bool> m_sim_pulse { this, "sim_pulse" , true }; + Gaudi::Property<std::string> m_model_file{ this, "model", "model_test.onnx"}; + Gaudi::Property<int> m_batchsize { this, "batchsize", 100}; + Gaudi::Property<float> m_time_scale { this, "time_scale", 503.0}; + Gaudi::Property<float> m_time_shift { this, "time_shift", 814.0}; + Gaudi::Property<float> m_amp_scale { this, "amp_scale" , 1.15 }; + Gaudi::Property<float> m_amp_shift { this, "amp_shift" , 0.86 }; + Gaudi::Property<float> m_x_scale { this, "x_scale" , 9. };// in mm + Gaudi::Property<float> m_y_scale { this, "y_scale" , 9. };// in mm + + + +}; + +#endif diff --git a/Simulation/DetSimGeom/src/AnExampleDetElemTool.cpp b/Simulation/DetSimGeom/src/AnExampleDetElemTool.cpp index fb2c1126b79293482e3c66c6ebb3ffe9681302d7..00c84c75eaebcedad22265694d9c08ca6d081988 100644 --- a/Simulation/DetSimGeom/src/AnExampleDetElemTool.cpp +++ b/Simulation/DetSimGeom/src/AnExampleDetElemTool.cpp @@ -180,10 +180,12 @@ AnExampleDetElemTool::ConstructSDandField() { throw std::runtime_error("ConstructSDandField: Failed to access G4LogicalVolume for SD " + nam + " of type " + typ + "."); } - info() << " -> Adding " << g4v->GetName() << endmsg; + debug() << " -> Adding " << g4v->GetName() << endmsg; G4SDManager::GetSDMpointer()->AddNewDetector(g4sd); g4v->SetSensitiveDetector(g4sd); } + info() << "-> Total " << sens_vols.size() + << " senstive volumes are registered. " << endmsg; } // ======================================================================= diff --git a/Simulation/DetSimInterface/CMakeLists.txt b/Simulation/DetSimInterface/CMakeLists.txt index ed99eead6c48943bbe639731e2705a8e70423d31..21963df1a8e0fd3289849181995d25908f69641e 100644 --- a/Simulation/DetSimInterface/CMakeLists.txt +++ b/Simulation/DetSimInterface/CMakeLists.txt @@ -4,7 +4,10 @@ gaudi_add_library(DetSimInterface SOURCES src/IDetSimSvc.cpp + src/CommonUserEventInfo.cc + src/CommonUserTrackInfo.cc LINK Gaudi::GaudiKernel + ${Geant4_LIBRARIES} ) install(TARGETS DetSimInterface diff --git a/Simulation/DetSimInterface/include/DetSimInterface/CommonUserEventInfo.hh b/Simulation/DetSimInterface/include/DetSimInterface/CommonUserEventInfo.hh new file mode 100644 index 0000000000000000000000000000000000000000..3319598a270d0d4cb38607d87b6c4fd3b2a85ad4 --- /dev/null +++ b/Simulation/DetSimInterface/include/DetSimInterface/CommonUserEventInfo.hh @@ -0,0 +1,39 @@ +#ifndef CommonUserEventInfo_hh +#define CommonUserEventInfo_hh + +/* + * Description: + * This class is a part of simulation framework to allow users to extend the G4Event. + * + * For example, when G4 converts the EDM4hep/G4 primary vertex/particle to G4 track, + * the relationship between the EDM4hep track and G4 track is missing. + * So a map is used as a bookkeeping. + * + * Author: + * Tao Lin <lintao AT ihep.ac.cn> + */ + +#include "G4VUserEventInformation.hh" +#include <map> + +class CommonUserEventInfo: public G4VUserEventInformation { +public: + + CommonUserEventInfo(); + virtual ~CommonUserEventInfo(); + +public: + virtual void Print() const; + + // set the relationship between idx in geant4 and idx in mc particle collection. + // idxG4: G4 track ID (starts from 1) + // idxEdm4hep: index in MC Particle collection (starts from 0) + bool setIdxG4Track2Edm4hep(int idxG4, int idxEdm4hep); + int idxG4Track2Edm4hep(int idxG4) const; + void dumpIdxG4Track2Edm4hep() const; + +private: + std::map<int, int> m_g4track_to_edm4hep; +}; + +#endif diff --git a/Simulation/DetSimInterface/include/DetSimInterface/CommonUserTrackInfo.hh b/Simulation/DetSimInterface/include/DetSimInterface/CommonUserTrackInfo.hh new file mode 100644 index 0000000000000000000000000000000000000000..ce63e602d26267dd87465406d454c7d558eb83ad --- /dev/null +++ b/Simulation/DetSimInterface/include/DetSimInterface/CommonUserTrackInfo.hh @@ -0,0 +1,35 @@ +#ifndef CommonUserTrackInfo_hh +#define CommonUserTrackInfo_hh + +/* Description: + * This class is a part of simulation framework to extend the G4Track. + * + * Some secondaries are created due to decay. However, their G4 Track IDs are + * not valid until the tracks are tracking by geant4. In order to associate + * these tracks and their edm4hep MC particle, we use the track information + * to record the extra track information. + * + * Author: + * Tao Lin <lintao AT ihep.ac.cn> + */ + +#include "G4VUserTrackInformation.hh" + +class CommonUserTrackInfo: public G4VUserTrackInformation { +public: + CommonUserTrackInfo(); + ~CommonUserTrackInfo(); + +public: + + virtual void Print() const; + + // get the idx in the EDM4hep MC particle collection + bool setIdxEdm4hep(int idxEdm4hep); + int idxEdm4hep() const; + +private: + int m_idxEdm4hep = -1; +}; + +#endif diff --git a/Simulation/DetSimInterface/include/DetSimInterface/IDedxSimTool.h b/Simulation/DetSimInterface/include/DetSimInterface/IDedxSimTool.h index 8c804500a7b4322e1998a04a7a8a43f46ba3f499..4da01d532a69f4cba7078d82fb161fcc34a1634c 100644 --- a/Simulation/DetSimInterface/include/DetSimInterface/IDedxSimTool.h +++ b/Simulation/DetSimInterface/include/DetSimInterface/IDedxSimTool.h @@ -28,6 +28,7 @@ public: virtual double dedx(const G4Step* aStep) = 0; virtual double dedx(const edm4hep::MCParticle& mc) = 0; virtual double dndx(double betagamma) = 0; + virtual void endOfEvent() {} }; diff --git a/Simulation/DetSimInterface/src/CommonUserEventInfo.cc b/Simulation/DetSimInterface/src/CommonUserEventInfo.cc new file mode 100644 index 0000000000000000000000000000000000000000..7992c69c897967e728040b3602a472663f604c6f --- /dev/null +++ b/Simulation/DetSimInterface/src/CommonUserEventInfo.cc @@ -0,0 +1,53 @@ +#include "DetSimInterface/CommonUserEventInfo.hh" +#include <iostream> + +CommonUserEventInfo::CommonUserEventInfo() { + +} + +CommonUserEventInfo::~CommonUserEventInfo() { + +} + +void +CommonUserEventInfo::Print() const { + +} + +bool +CommonUserEventInfo::setIdxG4Track2Edm4hep(int idxG4, int idxEdm4hep) { + auto it = m_g4track_to_edm4hep.find(idxG4); + + // if already exists, return false + if (it != m_g4track_to_edm4hep.end()) { + return false; + } + + m_g4track_to_edm4hep[idxG4] = idxEdm4hep; + + return true; +} + +int +CommonUserEventInfo::idxG4Track2Edm4hep(int idxG4) const { + int ret = -1; + + auto it = m_g4track_to_edm4hep.find(idxG4); + + // if found + if (it != m_g4track_to_edm4hep.end()) { + ret = it->second; + } + + return ret; +} + +void +CommonUserEventInfo::dumpIdxG4Track2Edm4hep() const { + std::cout << "---- Dumping IdxG4Track2Edm4hep: " + << " total size: " << m_g4track_to_edm4hep.size() + << std::endl; + for (auto [idxG4, idxE4]: m_g4track_to_edm4hep) { + std::cout << " - " << idxG4 << " -> " << idxE4 << std::endl; + } +} diff --git a/Simulation/DetSimInterface/src/CommonUserTrackInfo.cc b/Simulation/DetSimInterface/src/CommonUserTrackInfo.cc new file mode 100644 index 0000000000000000000000000000000000000000..9a923a35a22e7fafe496c827e066e591864f3c50 --- /dev/null +++ b/Simulation/DetSimInterface/src/CommonUserTrackInfo.cc @@ -0,0 +1,22 @@ +#include "DetSimInterface/CommonUserTrackInfo.hh" +#include <iostream> + +CommonUserTrackInfo::CommonUserTrackInfo() { + +} + +CommonUserTrackInfo::~CommonUserTrackInfo() { + +} + +void CommonUserTrackInfo::Print() const { + +} + +bool CommonUserTrackInfo::setIdxEdm4hep(int idxEdm4hep) { + m_idxEdm4hep = idxEdm4hep; +} + +int CommonUserTrackInfo::idxEdm4hep() const { + return m_idxEdm4hep; +} diff --git a/Simulation/DetSimSD/CMakeLists.txt b/Simulation/DetSimSD/CMakeLists.txt index fa8ba9ef3e13d27da31d8c25763278ba795ef47c..f3a9618ac625fce03d1c277bcef6be28e355628e 100644 --- a/Simulation/DetSimSD/CMakeLists.txt +++ b/Simulation/DetSimSD/CMakeLists.txt @@ -2,20 +2,34 @@ find_package(Geant4 REQUIRED ui_all vis_all) include(${Geant4_USE_FILE}) +gaudi_add_library(DetSimSDLib + SOURCES src/Geant4Hits.cpp + src/DDG4SensitiveDetector.cpp + src/CaloSensitiveDetector.cpp + src/DriftChamberSensitiveDetector.cpp + src/TimeProjectionChamberSensitiveDetector.cpp + src/GenericTrackerSensitiveDetector.cpp + src/TrackerCombineSensitiveDetector.cpp + LINK DetSimInterface + DetInterface + ${DD4hep_COMPONENT_LIBRARIES} +) +target_include_directories(DetSimSDLib PUBLIC + $<BUILD_INTERFACE:${CMAKE_CURRENT_LIST_DIR}>/include + $<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>) +install(TARGETS DetSimSDLib + EXPORT CEPCSWTargets + RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}" COMPONENT bin + LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}" COMPONENT shlib + COMPONENT dev) + gaudi_add_module(DetSimSD SOURCES src/CalorimeterSensDetTool.cpp - src/DDG4SensitiveDetector.cpp - src/CaloSensitiveDetector.cpp - src/DriftChamberSensDetTool.cpp - src/DriftChamberSensitiveDetector.cpp - src/TimeProjectionChamberSensDetTool.cpp - src/TimeProjectionChamberSensitiveDetector.cpp - src/GenericTrackerSensDetTool.cpp - src/GenericTrackerSensitiveDetector.cpp LINK DetSimInterface + DetSimSDLib DetInterface ${DD4hep_COMPONENT_LIBRARIES} Gaudi::GaudiKernel diff --git a/Simulation/DetSimSD/include/DetSimSD/DDG4SensitiveDetector.h b/Simulation/DetSimSD/include/DetSimSD/DDG4SensitiveDetector.h index 687771e344b9f12ae553e56888b1222288fefbaf..c4a29eb3983d0e1f240059eb1c767b8fc0773c15 100644 --- a/Simulation/DetSimSD/include/DetSimSD/DDG4SensitiveDetector.h +++ b/Simulation/DetSimSD/include/DetSimSD/DDG4SensitiveDetector.h @@ -15,7 +15,7 @@ #include "DD4hep/Detector.h" -#include "DDG4/Geant4Hits.h" +#include "DetSimSD/Geant4Hits.h" #include "G4Step.hh" #include "G4HCofThisEvent.hh" diff --git a/Simulation/DetSimSD/include/DetSimSD/Geant4Hits.h b/Simulation/DetSimSD/include/DetSimSD/Geant4Hits.h new file mode 100644 index 0000000000000000000000000000000000000000..60fc18d4792876eac5b8ebe6c558c74447a4f6c3 --- /dev/null +++ b/Simulation/DetSimSD/include/DetSimSD/Geant4Hits.h @@ -0,0 +1,201 @@ +//========================================================================== +// AIDA Detector description implementation +//-------------------------------------------------------------------------- +// Copyright (C) Organisation europeenne pour la Recherche nucleaire (CERN) +// All rights reserved. +// +// For the licensing terms see $DD4hepINSTALL/LICENSE. +// For the list of contributors see $DD4hepINSTALL/doc/CREDITS. +// +// Author : M.Frank +// +//========================================================================== + +#ifndef DDG4_GEANT4HITS_H +#define DDG4_GEANT4HITS_H + +// Framework include files +#include "DD4hep/Objects.h" +#include "DDG4/Geant4StepHandler.h" + +// Geant4 include files +#include "G4VHit.hh" +#include "G4Step.hh" +#include "G4StepPoint.hh" + +/// Namespace for the AIDA detector description toolkit +namespace dd4hep { + + /// Namespace for the Geant4 based simulation part of the AIDA detector description toolkit + namespace sim { + + // Forward declarations; + class Geant4Hit; + class Geant4TrackerHit; + class Geant4CalorimeterHit; + + /// Deprecated: Base class for hit comparisons. + /** @class HitCompare Geant4Hits.h DDG4/Geant4Hits.h + * + * @author M.Frank + * @version 1.0 + */ + template <class HIT> class HitCompare { + public: + /// Default destructor + virtual ~HitCompare() {} + /// Comparison function + virtual bool operator()(const HIT* h) const = 0; + }; + + /// Deprecated: Seek the hits of an arbitrary collection for the same position. + /** @class HitPositionCompare Geant4Hits.h DDG4/Geant4Hits.h + * + * @author M.Frank + * @version 1.0 + */ + template <class HIT> struct HitPositionCompare: public HitCompare<HIT> { + /// Reference to the hit position + const Position& pos; + /// Constructor + HitPositionCompare(const Position& p) : pos(p) {} + /// Default destructor + virtual ~HitPositionCompare() {} + /// Comparison function + virtual bool operator()(const HIT* h) const { + return pos == h->position; + } + }; + + /// Deprecated: basic geant4 hit class for deprecated sensitive detectors + /** @class Geant4Hit Geant4Hits.h DDG4/Geant4Hits.h + * + * Geant4 hit base class. Here only the basic + * quantites are stored such as the energy deposit and + * the time stamp. + * + * @author M.Frank + * @version 1.0 + */ + class Geant4Hit: public G4VHit { + public: + + // cellID + unsigned long cellID = 0; + + /// Deprecated!!! + struct MonteCarloContrib { + /// Geant 4 Track identifier + int trackID = -1; + /// Particle ID from the PDG table + int pdgID = -1; + /// Total energy deposit in this hit + double deposit = 0.0; + /// Timestamp when this energy was deposited + double time = 0.0; + /// Default constructor + MonteCarloContrib() = default; + /// Copy constructor + MonteCarloContrib(const MonteCarloContrib& c) = default; + /// Initializing constructor + MonteCarloContrib(int track_id, double dep, double time_stamp) + : trackID(track_id), pdgID(-1), deposit(dep), time(time_stamp) {} + /// Initializing constructor + MonteCarloContrib(int track_id, int pdg, double dep, double time_stamp) + : trackID(track_id), pdgID(pdg), deposit(dep), time(time_stamp) {} + /// Assignment operator + MonteCarloContrib& operator=(const MonteCarloContrib& c) = default; + /// Clear data + void clear() { + time = deposit = 0.0; + pdgID = trackID = -1; + } + }; + typedef MonteCarloContrib Contribution; + typedef std::vector<MonteCarloContrib> Contributions; + + public: + /// Standard constructor + Geant4Hit() = default; + /// Default destructor + virtual ~Geant4Hit() { } + /// Check if the Geant4 track is a Geantino + static bool isGeantino(G4Track* track); + /// Extract the MC contribution for a given hit from the step information + static Contribution extractContribution(G4Step* step); + }; + + /// Deprecated: Geant4 tracker hit class for deprecated sensitive detectors + /** @class Geant4TrackerHit Geant4Hits.h DDG4/Geant4Hits.h + * + * Geant4 tracker hit class. Tracker hits contain the momentum + * direction as well as the hit position. + * + * @author M.Frank + * @version 1.0 + */ + class Geant4TrackerHit: public Geant4Hit { + public: + /// Hit position + Position position; + /// Hit direction + Direction momentum; + /// Length of the track segment contributing to this hit + double length; + /// Monte Carlo / Geant4 information + Contribution truth; + /// Energy deposit of the hit + double energyDeposit; + + public: + /// Default constructor + Geant4TrackerHit(); + /// Standard initializing constructor + Geant4TrackerHit(int track_id, int pdg_id, double deposit, double time_stamp); + /// Default destructor + virtual ~Geant4TrackerHit() {} + /// Clear hit content + Geant4TrackerHit& clear(); + /// Store Geant4 point and step information into tracker hit structure. + Geant4TrackerHit& storePoint(G4Step* step, G4StepPoint* point); + + /// Assignment operator + Geant4TrackerHit& operator=(const Geant4TrackerHit& c); + /// Geant4 required object allocator + void *operator new(size_t); + /// Geat4 required object destroyer + void operator delete(void *ptr); + }; + + /// Deprecated: Geant4 calorimeter hit class for deprecated sensitive detectors + /** @class Geant4CalorimeterHit Geant4Hits.h DDG4/Geant4Hits.h + * + * Geant4 calorimeter hit class. Calorimeter hits contain the momentum + * direction as well as the hit position. + * + * @author M.Frank + * @version 1.0 + */ + class Geant4CalorimeterHit: public Geant4Hit { + public: + /// Hit position + Position position; + /// Hit contributions by individual particles + Contributions truth; + /// Total energy deposit + double energyDeposit; + public: + /// Standard constructor + Geant4CalorimeterHit(const Position& cell_pos); + /// Default destructor + virtual ~Geant4CalorimeterHit() { } + /// Geant4 required object allocator + void *operator new(size_t); + /// Geat4 required object destroyer + void operator delete(void *ptr); + }; + + } // End namespace sim +} // End namespace dd4hep + +#endif // DDG4_GEANT4HITS_H diff --git a/Simulation/DetSimSD/src/DDG4SensitiveDetector.cpp b/Simulation/DetSimSD/src/DDG4SensitiveDetector.cpp index a1698ee3cd3cbe43b6ae856112a2edb2f9f20ed0..3d16e02be94bc3ecfe30e161e81b80bb683892f7 100644 --- a/Simulation/DetSimSD/src/DDG4SensitiveDetector.cpp +++ b/Simulation/DetSimSD/src/DDG4SensitiveDetector.cpp @@ -1,7 +1,6 @@ #include "DetSimSD/DDG4SensitiveDetector.h" #include "DDG4/Geant4Converter.h" -#include "DDG4/Geant4Hits.h" #include "DD4hep/Segmentations.h" #include "DD4hep/Printout.h" diff --git a/Simulation/DetSimSD/src/DriftChamberSensDetTool.cpp b/Simulation/DetSimSD/src/DriftChamberSensDetTool.cpp index 43dfa17828453c1545318eea45c0aec7e271976e..58c49d6c62e5d3646348995b52e815a2bc42b31f 100644 --- a/Simulation/DetSimSD/src/DriftChamberSensDetTool.cpp +++ b/Simulation/DetSimSD/src/DriftChamberSensDetTool.cpp @@ -5,7 +5,7 @@ #include "DD4hep/Detector.h" #include "DriftChamberSensitiveDetector.h" - +#include "TrackerCombineSensitiveDetector.h" DECLARE_COMPONENT(DriftChamberSensDetTool) StatusCode DriftChamberSensDetTool::initialize() { @@ -22,7 +22,6 @@ StatusCode DriftChamberSensDetTool::initialize() { error() << "Failed to find dedx simtoo." << endmsg; return StatusCode::FAILURE; } - return sc; } @@ -39,12 +38,19 @@ DriftChamberSensDetTool::createSD(const std::string& name) { G4VSensitiveDetector* sd = nullptr; if (name == "DriftChamber") { - DriftChamberSensitiveDetector* dcsd = new DriftChamberSensitiveDetector(name, *dd4hep_geo); - dcsd->setDedxSimTool(m_dedx_simtool); - - sd = dcsd; + auto sens = dd4hep_geo->sensitiveDetector(name); + if(!sens.combineHits()){ + DriftChamberSensitiveDetector* dcsd = new DriftChamberSensitiveDetector(name, *dd4hep_geo); + dcsd->setDedxSimTool(m_dedx_simtool); + sd = dcsd; + } + else{ + sd = new TrackerCombineSensitiveDetector(name, *dd4hep_geo); + } + } + else{ + warning() << "The SD " << name << " want to use SD for DriftChamber" << endmsg; } - return sd; } diff --git a/Simulation/DetSimSD/src/DriftChamberSensitiveDetector.cpp b/Simulation/DetSimSD/src/DriftChamberSensitiveDetector.cpp index c6ff3db08209c3307b8fd2c954ee9c97f5c015cc..44bf01d1016ae3578ef192f609a3163b6ea6b483 100644 --- a/Simulation/DetSimSD/src/DriftChamberSensitiveDetector.cpp +++ b/Simulation/DetSimSD/src/DriftChamberSensitiveDetector.cpp @@ -71,5 +71,5 @@ DriftChamberSensitiveDetector::ProcessHits(G4Step* step, G4TouchableHistory*) { void DriftChamberSensitiveDetector::EndOfEvent(G4HCofThisEvent* HCE) { - + m_dedx_simtool->endOfEvent(); } diff --git a/Simulation/DetSimSD/src/Geant4Hits.cpp b/Simulation/DetSimSD/src/Geant4Hits.cpp new file mode 100644 index 0000000000000000000000000000000000000000..0358bf019d8222bc8a92ab02bc4fb2022e60b1cf --- /dev/null +++ b/Simulation/DetSimSD/src/Geant4Hits.cpp @@ -0,0 +1,135 @@ +//========================================================================== +// AIDA Detector description implementation +//-------------------------------------------------------------------------- +// Copyright (C) Organisation europeenne pour la Recherche nucleaire (CERN) +// All rights reserved. +// +// For the licensing terms see $DD4hepINSTALL/LICENSE. +// For the list of contributors see $DD4hepINSTALL/doc/CREDITS. +// +// Author : M.Frank +// +//========================================================================== + +// Framework include files +#include "DetSimSD/Geant4Hits.h" + +// Geant4 include files +#include "G4Allocator.hh" +#include "G4ParticleDefinition.hh" +#include "G4ChargedGeantino.hh" +#include "G4OpticalPhoton.hh" +#include "G4Geantino.hh" + +// C/C++ include files +#include <iostream> + +using namespace std; +using namespace dd4hep::sim; + +G4ThreadLocal G4Allocator<Geant4TrackerHit>* TrackerHitAllocator = 0; +G4ThreadLocal G4Allocator<Geant4CalorimeterHit>* CalorimeterHitAllocator = 0; + + +/// Check if the Geant4 track is a Geantino +bool Geant4Hit::isGeantino(G4Track* track) { + if (track) { + G4ParticleDefinition* def = track->GetDefinition(); + if (def == G4ChargedGeantino::Definition()) + return true; + if (def == G4Geantino::Definition()) { + return true; + } + } + return false; +} + +Geant4Hit::Contribution Geant4Hit::extractContribution(G4Step* step) { + G4Track* trk = step->GetTrack(); + double energy_deposit = + (trk->GetDefinition() == G4OpticalPhoton::OpticalPhotonDefinition()) ? + trk->GetTotalEnergy() : step->GetTotalEnergyDeposit(); + Contribution contrib(trk->GetTrackID(), trk->GetDefinition()->GetPDGEncoding(), energy_deposit, trk->GetGlobalTime()); + return contrib; +} + +/// Default constructor +Geant4TrackerHit::Geant4TrackerHit() + : Geant4Hit(), position(), momentum(), length(0.0), truth(), energyDeposit(0.0) { +} + +/// Standard initializing constructor +Geant4TrackerHit::Geant4TrackerHit(int track_id, int pdg_id, double deposit, double time_stamp) + : Geant4Hit(), position(), momentum(), length(0.0), truth(track_id, pdg_id, deposit, time_stamp), energyDeposit(deposit) { +} + +/// Assignment operator +Geant4TrackerHit& Geant4TrackerHit::operator=(const Geant4TrackerHit& c) { + if ( this != &c ) { + position = c.position; + momentum = c.momentum; + length = c.length; + truth = c.truth; + energyDeposit = c.energyDeposit; + } + return *this; +} + +/// Clear hit content +Geant4TrackerHit& Geant4TrackerHit::clear() { + position.SetXYZ(0, 0, 0); + momentum.SetXYZ(0, 0, 0); + length = 0.0; + truth.clear(); + energyDeposit = 0.0; + return *this; +} + +/// Store Geant4 point and step information into tracker hit structure. +Geant4TrackerHit& Geant4TrackerHit::storePoint(G4Step* step, G4StepPoint* pnt) { + G4Track* trk = step->GetTrack(); + G4ThreeVector pos = pnt->GetPosition(); + G4ThreeVector mom = pnt->GetMomentum(); + + truth.trackID = trk->GetTrackID(); + truth.pdgID = trk->GetDefinition()->GetPDGEncoding(); + truth.deposit = step->GetTotalEnergyDeposit(); + truth.time = trk->GetGlobalTime(); + energyDeposit = step->GetTotalEnergyDeposit(); + position.SetXYZ(pos.x(), pos.y(), pos.z()); + momentum.SetXYZ(mom.x(), mom.y(), mom.z()); + length = 0; + return *this; +} + +/// Geant4 required object allocator +void* Geant4TrackerHit::operator new(size_t) { + if ( TrackerHitAllocator ) + return TrackerHitAllocator->MallocSingle(); + TrackerHitAllocator = new G4Allocator<Geant4TrackerHit>; + return TrackerHitAllocator->MallocSingle(); +} + +/// Geat4 required object destroyer +void Geant4TrackerHit::operator delete(void *p) { + TrackerHitAllocator->FreeSingle((Geant4TrackerHit*) p); +} + +/// Standard constructor +Geant4CalorimeterHit::Geant4CalorimeterHit(const Position& pos) + : Geant4Hit(), position(pos), truth(), energyDeposit(0) { +} + +/// Geant4 required object allocator +void* Geant4CalorimeterHit::operator new(size_t) { + if ( CalorimeterHitAllocator ) + return CalorimeterHitAllocator->MallocSingle(); + CalorimeterHitAllocator = new G4Allocator<Geant4CalorimeterHit>; + return CalorimeterHitAllocator->MallocSingle(); +} + +/// Geat4 required object destroyer +void Geant4CalorimeterHit::operator delete(void *p) { + CalorimeterHitAllocator->FreeSingle((Geant4CalorimeterHit*) p); +} + diff --git a/Simulation/DetSimSD/src/GenericTrackerSensDetTool.cpp b/Simulation/DetSimSD/src/GenericTrackerSensDetTool.cpp index 480f509aa57c563e90c032aac64abcaca4957a31..edb275a8d76e4d0710368611e916f4c026837e12 100644 --- a/Simulation/DetSimSD/src/GenericTrackerSensDetTool.cpp +++ b/Simulation/DetSimSD/src/GenericTrackerSensDetTool.cpp @@ -5,6 +5,7 @@ #include "DD4hep/Detector.h" #include "GenericTrackerSensitiveDetector.h" +#include "TrackerCombineSensitiveDetector.h" #include "CLHEP/Units/SystemOfUnits.h" @@ -33,8 +34,14 @@ G4VSensitiveDetector* GenericTrackerSensDetTool::createSD(const std::string& nam debug() << "createSD for " << name << endmsg; dd4hep::Detector* dd4hep_geo = m_geosvc->lcdd(); - - G4VSensitiveDetector* sd = new GenericTrackerSensitiveDetector(name, *dd4hep_geo); + auto sens = dd4hep_geo->sensitiveDetector(name); + G4VSensitiveDetector* sd = nullptr; + if(sens.combineHits()){ + sd = new TrackerCombineSensitiveDetector(name, *dd4hep_geo); + } + else{ + sd = new GenericTrackerSensitiveDetector(name, *dd4hep_geo); + } return sd; } diff --git a/Simulation/DetSimSD/src/GenericTrackerSensitiveDetector.cpp b/Simulation/DetSimSD/src/GenericTrackerSensitiveDetector.cpp index d250079ef0a8aa5f15e50fb801b1de90c46d3a17..5e9ba1a6af4cf2dbe994a1bf7d686f3bfcbf19f7 100644 --- a/Simulation/DetSimSD/src/GenericTrackerSensitiveDetector.cpp +++ b/Simulation/DetSimSD/src/GenericTrackerSensitiveDetector.cpp @@ -23,10 +23,11 @@ void GenericTrackerSensitiveDetector::Initialize(G4HCofThisEvent* HCE){ } G4bool GenericTrackerSensitiveDetector::ProcessHits(G4Step* step, G4TouchableHistory*){ - G4TouchableHandle touchPost = step->GetPostStepPoint()->GetTouchableHandle(); G4TouchableHandle touchPre = step->GetPreStepPoint()->GetTouchableHandle(); dd4hep::sim::Geant4StepHandler h(step); + if (fabs(h.trackDef()->GetPDGCharge()) < 0.01) return true; + dd4hep::Position prePos = h.prePos(); dd4hep::Position postPos = h.postPos(); dd4hep::Position direction = postPos - prePos; diff --git a/Simulation/DetSimSD/src/TrackerCombineSensitiveDetector.cpp b/Simulation/DetSimSD/src/TrackerCombineSensitiveDetector.cpp new file mode 100644 index 0000000000000000000000000000000000000000..591c3cf3273a872f8533a8d11f3301fe60a408eb --- /dev/null +++ b/Simulation/DetSimSD/src/TrackerCombineSensitiveDetector.cpp @@ -0,0 +1,58 @@ +#include "TrackerCombineSensitiveDetector.h" + +#include "G4Step.hh" +#include "G4VProcess.hh" +#include "G4SDManager.hh" +#include "DD4hep/DD4hepUnits.h" + +TrackerCombineSensitiveDetector::TrackerCombineSensitiveDetector(const std::string& name, + dd4hep::Detector& description) + : DDG4SensitiveDetector(name, description), + m_hc(nullptr){ + G4String CollName = m_sensitive.hitsCollection(); + collectionName.insert(CollName); +} + +void TrackerCombineSensitiveDetector::Initialize(G4HCofThisEvent* HCE){ + userData.e_cut = m_sensitive.energyCutoff(); + + m_hc = new HitCollection(GetName(), collectionName[0]); + int HCID = G4SDManager::GetSDMpointer()->GetCollectionID(m_hc); + HCE->AddHitsCollection( HCID, m_hc ); +} + +G4bool TrackerCombineSensitiveDetector::ProcessHits(G4Step* step, G4TouchableHistory*){ + dd4hep::sim::Geant4StepHandler h(step); + if (fabs(h.trackDef()->GetPDGCharge()) < 0.01) return true; + + bool return_code = false; + if ( userData.current == -1 ) userData.start(getCellID(step), step, h.pre); + else if ( !userData.track || userData.current != h.track->GetTrackID() ) { + return_code = userData.extractHit(m_hc) != 0; + userData.start(getCellID(step), step, h.pre); + } + + // ....update ..... + userData.update(step); + + void *prePV = h.volume(h.pre), *postPV = h.volume(h.post); + if ( prePV != postPV ) { + return_code = userData.extractHit(m_hc) != 0; + void* postSD = h.sd(h.post); + if ( 0 != postSD ) { + void* preSD = h.sd(h.pre); + if ( preSD == postSD ) { + // fucd: getCellID(step) for preVolume not postVolume, so should start at next step + //userData.start(getCellID(step), step, h.post); + } + } + } + else if ( userData.track->GetTrackStatus() == fStopAndKill ) { + return_code = userData.extractHit(m_hc) != 0; + } + return return_code; +} + +void TrackerCombineSensitiveDetector::EndOfEvent(G4HCofThisEvent* HCE){ + userData.clear(); +} diff --git a/Simulation/DetSimSD/src/TrackerCombineSensitiveDetector.h b/Simulation/DetSimSD/src/TrackerCombineSensitiveDetector.h new file mode 100644 index 0000000000000000000000000000000000000000..cf0cb844eb64a076d8c39477c94a6fd62f677402 --- /dev/null +++ b/Simulation/DetSimSD/src/TrackerCombineSensitiveDetector.h @@ -0,0 +1,95 @@ +// ********************************************************* +// +// $Id: TrackerCombineSensitiveDetector.hh,v 1.0 2022/03/27 + +#ifndef TrackerCombineSensitiveDetector_h +#define TrackerCombineSensitiveDetector_h + +#include "DetSimSD/DDG4SensitiveDetector.h" +#include "DDG4/Defs.h" + +namespace dd4hep { + namespace sim { + struct TrackerCombine { + Geant4TrackerHit pre; + Geant4TrackerHit post; + G4Track* track; + double e_cut; + int current; + long long int cellID; + TrackerCombine() : pre(), post(), track(0), e_cut(0.0), current(-1), cellID(0) {} + void start(long long int cell, G4Step* step, G4StepPoint* point) { + pre.storePoint(step,point); + current = pre.truth.trackID; + track = step->GetTrack(); + cellID = cell; + post = pre; + //std::cout << "start: " << cellID << " " << pre.position << " current = " << current << std::endl; + } + void update(G4Step* step) { + post.storePoint(step,step->GetPostStepPoint()); + pre.truth.deposit += post.truth.deposit; + //std::cout << "update: " << cellID << " " << post.position << " current = " << current << std::endl; + } + void clear() { + pre.truth.clear(); + current = -1; + track = 0; + } + Geant4TrackerHit* extractHit(DDG4SensitiveDetector::HitCollection* c) { + //std::cout << "create Geant4TrackerHit: " << cellID << " current = " << current << " track = " << track << " de = " << pre.truth.deposit << std::endl; + if ( current == -1 || !track ) { + return 0; + } + else if ( pre.truth.deposit <= e_cut && !Geant4Hit::isGeantino(track) ) { + clear(); + return 0; + } + double rho1 = pre.position.Rho(); + double rho2 = post.position.Rho(); + double rho = 0.5*(rho1+rho2); + Position pos = 0.5 * (pre.position + post.position); + double z = pos.z(); + double r = sqrt(rho*rho+z*z); + Position path = post.position - pre.position; + double angle_O_pre_post = acos(-pre.position.Unit().Dot(path.Unit())); + double angle_O_post_pre = acos(post.position.Unit().Dot(path.Unit())); + double angle_O_P_pre = asin(pre.position.R()*sin(angle_O_pre_post)/r); + if(angle_O_pre_post>dd4hep::halfpi||angle_O_post_pre>dd4hep::halfpi){ + bool backward = angle_O_post_pre>angle_O_pre_post; + double angle_O_P_pre = backward ? dd4hep::pi - asin(pre.position.R()*sin(angle_O_pre_post)/r) : asin(pre.position.R()*sin(angle_O_pre_post)/r); + double pre2P = r/sin(angle_O_pre_post)*sin(angle_O_pre_post+angle_O_P_pre); + pos = pre.position + pre2P*path.Unit(); + } + Momentum mom = 0.5 * (pre.momentum + post.momentum); + Geant4TrackerHit* hit = new Geant4TrackerHit(pre.truth.trackID, + pre.truth.pdgID, + pre.truth.deposit, + pre.truth.time); + hit->cellID = cellID; + hit->position = pos; + hit->momentum = mom; + hit->length = path.R();; + clear(); + c->insert(hit); + return hit; + } + }; + } +} + +class TrackerCombineSensitiveDetector: public DDG4SensitiveDetector { + public: + TrackerCombineSensitiveDetector(const std::string& name, dd4hep::Detector& description); + + void Initialize(G4HCofThisEvent* HCE); + G4bool ProcessHits(G4Step* step, G4TouchableHistory* history); + void EndOfEvent(G4HCofThisEvent* HCE); + + protected: + HitCollection* m_hc = nullptr; + + private: + dd4hep::sim::TrackerCombine userData; +}; +#endif diff --git a/Utilities/DataHelper/include/DataHelper/Navigation.h b/Utilities/DataHelper/include/DataHelper/Navigation.h index 87ca762b9de7ad7dc499929dcad740033fea936b..6fbf6cca04106c292ed5477dcbaaf1881cba7470 100644 --- a/Utilities/DataHelper/include/DataHelper/Navigation.h +++ b/Utilities/DataHelper/include/DataHelper/Navigation.h @@ -5,6 +5,15 @@ #include "edm4hep/TrackerHitCollection.h" #include <map> +#if __has_include("edm4hep/EDM4hepVersion.h") +#include "edm4hep/EDM4hepVersion.h" +#else +// Copy the necessary parts from the header above to make whatever we need to work here +#define EDM4HEP_VERSION(major, minor, patch) ((UINT64_C(major) << 32) | (UINT64_C(minor) << 16) | (UINT64_C(patch))) +// v00-09 is the last version without the capitalization change of the track vector members +#define EDM4HEP_BUILD_VERSION EDM4HEP_VERSION(0, 9, 0) +#endif + class Navigation{ public: static Navigation* Instance(); @@ -17,9 +26,15 @@ class Navigation{ void AddTrackerHitCollection(const edm4hep::TrackerHitCollection* col){m_hitColVec.push_back(col);}; void AddTrackerAssociationCollection(const edm4hep::MCRecoTrackerAssociationCollection* col){m_assColVec.push_back(col);}; +#if EDM4HEP_BUILD_VERSION <= EDM4HEP_VERSION(0, 10, 5) edm4hep::TrackerHit GetTrackerHit(const edm4hep::ObjectID& id, bool delete_by_caller=true); std::vector<edm4hep::SimTrackerHit> GetRelatedTrackerHit(const edm4hep::ObjectID& id); +#else + edm4hep::TrackerHit GetTrackerHit(const podio::ObjectID& id, bool delete_by_caller=true); + std::vector<edm4hep::SimTrackerHit> GetRelatedTrackerHit(const podio::ObjectID& id); +#endif std::vector<edm4hep::SimTrackerHit> GetRelatedTrackerHit(const edm4hep::TrackerHit& hit); + std::vector<edm4hep::SimTrackerHit> GetRelatedTrackerHit(const edm4hep::TrackerHit& hit, const edm4hep::MCRecoTrackerAssociationCollection* col); //static Navigation* m_fNavigation; private: diff --git a/Utilities/DataHelper/src/Navigation.cpp b/Utilities/DataHelper/src/Navigation.cpp index cc81b7f0e01d514fc0cd158af6034476198560f6..a7ba56f921c6273936f2cedea04a1beaa870f8c7 100644 --- a/Utilities/DataHelper/src/Navigation.cpp +++ b/Utilities/DataHelper/src/Navigation.cpp @@ -25,7 +25,11 @@ void Navigation::Initialize(){ m_trkHits.clear(); } +#if EDM4HEP_BUILD_VERSION <= EDM4HEP_VERSION(0, 10, 5) edm4hep::TrackerHit Navigation::GetTrackerHit(const edm4hep::ObjectID& obj_id, bool delete_by_caller){ +#else +edm4hep::TrackerHit Navigation::GetTrackerHit(const podio::ObjectID& obj_id, bool delete_by_caller){ +#endif int id = obj_id.collectionID * 10000000 + obj_id.index; if(!delete_by_caller){ if(m_trkHits.find(id)!=m_trkHits.end()) return m_trkHits[id]; @@ -33,7 +37,7 @@ edm4hep::TrackerHit Navigation::GetTrackerHit(const edm4hep::ObjectID& obj_id, b /* for(int i=0;i<m_assColVec.size();i++){ for(auto ass : *m_assColVec[i]){ - edm4hep::ObjectID rec_id = ass.getRec().getObjectID(); + auto rec_id = ass.getRec().getObjectID(); if(rec_id.collectionID!=id.collectionID)break; else if(rec_id.index==id.index){ m_trkHits.push_back(ass.getRec()); @@ -44,7 +48,7 @@ edm4hep::TrackerHit Navigation::GetTrackerHit(const edm4hep::ObjectID& obj_id, b */ for(int i=0;i<m_hitColVec.size();i++){ for(auto hit : *m_hitColVec[i]){ - edm4hep::ObjectID this_id = hit.getObjectID(); + auto this_id = hit.getObjectID(); if(this_id.collectionID!=obj_id.collectionID)break; else if(this_id.index==obj_id.index){ edm4hep::TrackerHit hit_copy = edm4hep::TrackerHit(hit); @@ -57,11 +61,15 @@ edm4hep::TrackerHit Navigation::GetTrackerHit(const edm4hep::ObjectID& obj_id, b throw std::runtime_error("Not found TrackerHit"); } +#if EDM4HEP_BUILD_VERSION <= EDM4HEP_VERSION(0, 10, 5) std::vector<edm4hep::SimTrackerHit> Navigation::GetRelatedTrackerHit(const edm4hep::ObjectID& id){ +#else +std::vector<edm4hep::SimTrackerHit> Navigation::GetRelatedTrackerHit(const podio::ObjectID& id){ +#endif std::vector<edm4hep::SimTrackerHit> hits; for(int i=0;i<m_assColVec.size();i++){ for(auto ass : *m_assColVec[i]){ - edm4hep::ObjectID this_id = ass.getRec().getObjectID(); + auto this_id = ass.getRec().getObjectID(); if(this_id.collectionID!=id.collectionID)break; else if(this_id.index==id.index) hits.push_back(ass.getSim()); } @@ -79,3 +87,12 @@ std::vector<edm4hep::SimTrackerHit> Navigation::GetRelatedTrackerHit(const edm4h } return hits; } + +std::vector<edm4hep::SimTrackerHit> Navigation::GetRelatedTrackerHit(const edm4hep::TrackerHit& hit, const edm4hep::MCRecoTrackerAssociationCollection* col){ + std::vector<edm4hep::SimTrackerHit> hits; + for(auto ass : *col){ + if(ass.getRec().getObjectID().collectionID != hit.getObjectID().collectionID) break; + else if(ass.getRec()==hit) hits.push_back(ass.getSim()); + } + return hits; +} diff --git a/Utilities/DataHelper/src/TrackExtended.cc b/Utilities/DataHelper/src/TrackExtended.cc index edf9d43bb06afc488e8ae6b3cacf08e874c2e39c..7a2bf72dde5e13174d9c25d5e38516c22a666590 100644 --- a/Utilities/DataHelper/src/TrackExtended.cc +++ b/Utilities/DataHelper/src/TrackExtended.cc @@ -1,10 +1,18 @@ #include "DataHelper/ClusterExtended.h" #include "DataHelper/TrackerHitExtended.h" #include "DataHelper/TrackExtended.h" + +#include "podio/podioVersion.h" + #include <math.h> +#include <iostream> TrackExtended::TrackExtended( ) { +#if PODIO_BUILD_VERSION < PODIO_VERSION(0, 17, 4) _track = NULL; +#else + _track = edm4hep::Track::makeEmpty(); +#endif _superCluster = NULL; _trackerHitVector.clear(); _clusterVec.clear(); @@ -23,7 +31,11 @@ TrackExtended::TrackExtended(Track track) { TrackExtended::TrackExtended( TrackerHitExtended * trackerhit) { _trackerHitVector.clear(); _trackerHitVector.push_back(trackerhit); +#if PODIO_BUILD_VERSION < PODIO_VERSION(0, 17, 4) _track = NULL; +#else + _track = edm4hep::Track::makeEmpty(); +#endif _superCluster = NULL; _clusterVec.clear(); _group = NULL; diff --git a/Utilities/KalTest/src/kaltracklib/TKalDetCradle.cxx b/Utilities/KalTest/src/kaltracklib/TKalDetCradle.cxx index 5f8c643d242d5289b0f8170e2153819cc6ede1ab..0ff61c7073b50eea9ce7f33d1397f0b21b7bcaae 100644 --- a/Utilities/KalTest/src/kaltracklib/TKalDetCradle.cxx +++ b/Utilities/KalTest/src/kaltracklib/TKalDetCradle.cxx @@ -29,6 +29,7 @@ #include "TVSurface.h" // from GeomLib #include <memory> // from STL #include <iostream> // from STL +#include <map> ClassImp(TKalDetCradle) @@ -45,6 +46,19 @@ fDone(kFALSE), fIsClosed(kFALSE) TKalDetCradle::~TKalDetCradle() { + //std::cout << "TKalDetCradle::~TKalDetCradle() " << this << " " << GetEntries() << std::endl; + std::map<TAttElement*, int> det_nelement; + + TIter next(this); + TObject *mlp = 0; + while ((mlp = next())) { + TAttElement* det = const_cast<TAttElement*>(&(dynamic_cast<TAttElement *>(mlp)->GetParent(kFALSE))); + if(det_nelement.find(det)!=det_nelement.end()) det_nelement[det]++; + else det_nelement[det] = 1; + } + for (auto it : det_nelement) { + delete it.first; + } } //_________________________________________________________________________ @@ -71,6 +85,8 @@ void TKalDetCradle::Install(TVKalDetector &det) dynamic_cast<TAttElement *>(mlp)->SetParentPtr(&det); det.SetParentPtr(this); } + det.SetOwner(kFALSE); + fDone = kFALSE; } diff --git a/build-k4.sh b/build-k4.sh index a483d8993ef03f377d1fdd74fecf76d4f1d6adbe..4570c559aca12e47b9e7cc603af30ab9cd259d59 100755 --- a/build-k4.sh +++ b/build-k4.sh @@ -104,12 +104,16 @@ function run-make() { cmake --build . } +function run-install() { + cmake --install . +} + ############################################################################## # Parse the command line options ############################################################################## # The current default platform -k4_platform=x86_64-linux-gcc9-opt +k4_platform=x86_64-linux-gcc11-opt k4_version=master bldtool=${CEPCSW_BLDTOOL} # make, ninja # set in env var @@ -120,3 +124,5 @@ check-working-builddir || exit -1 run-cmake || exit -1 run-make || exit -1 + +run-install || exit -1 diff --git a/build.sh b/build.sh index 337287fe081bdbf364c5fa2b856dc0a4534aa9df..5c7393d169fd5b35240df699e7c1314b5cc783a3 100755 --- a/build.sh +++ b/build.sh @@ -83,7 +83,12 @@ function run-cmake() { } function run-make() { - cmake --build . + local njobs=-j$(nproc) + cmake --build . $njobs +} + +function run-install() { + cmake --install . } ############################################################################## @@ -91,8 +96,8 @@ function run-make() { ############################################################################## # The current default platform -lcg_platform=x86_64-centos7-gcc8-opt -lcg_version=101.0.1 +lcg_platform=x86_64-centos7-gcc11-opt +lcg_version=103.0.2 bldtool=${CEPCSW_BLDTOOL} # make, ninja # set in env var @@ -103,3 +108,5 @@ check-working-builddir || exit -1 run-cmake || exit -1 run-make || exit -1 + +run-install || exit -1 diff --git a/cmake/CEPCSWConfig.cmake b/cmake/CEPCSWConfig.cmake index c008c2f82eae85e547b939a54d87cb190073bdfa..4f9445ac3683765653b333811ce5ca8803cec5c6 100644 --- a/cmake/CEPCSWConfig.cmake +++ b/cmake/CEPCSWConfig.cmake @@ -2,7 +2,6 @@ include(CMakeFindDependencyMacro) find_dependency(podio REQUIRED) find_dependency(Gaudi REQUIRED) find_dependency(k4FWCore REQUIRED) -find_dependency(k4LCIOReader REQUIRED) find_dependency(EDM4HEP REQUIRED) find_dependency(ROOT REQUIRED) diff --git a/cmake/FindOnnxRuntime.cmake b/cmake/FindOnnxRuntime.cmake new file mode 100644 index 0000000000000000000000000000000000000000..5a9db01ce9b30c9d3f40e7d17c263a469e647d90 --- /dev/null +++ b/cmake/FindOnnxRuntime.cmake @@ -0,0 +1,35 @@ +# Find the ONNX Runtime include directory and library. +# +# This module defines the `onnxruntime` imported target that encodes all +# necessary information in its target properties. + +find_library( + OnnxRuntime_LIBRARY + NAMES onnxruntime + PATH_SUFFIXES lib lib32 lib64 + DOC "The ONNXRuntime library") + +if(NOT OnnxRuntime_LIBRARY) + message(FATAL_ERROR "onnxruntime library not found") +endif() + +find_path( + OnnxRuntime_INCLUDE_DIR + NAMES core/session/onnxruntime_cxx_api.h + PATH_SUFFIXES include include/onnxruntime + DOC "The ONNXRuntime include directory") + +if(NOT OnnxRuntime_INCLUDE_DIR) + message(FATAL_ERROR "onnxruntime includes not found") +endif() + +include(FindPackageHandleStandardArgs) +find_package_handle_standard_args( + OnnxRuntime + REQUIRED_VARS OnnxRuntime_LIBRARY OnnxRuntime_INCLUDE_DIR) + +add_library(OnnxRuntime SHARED IMPORTED) +set_property(TARGET OnnxRuntime PROPERTY IMPORTED_LOCATION ${OnnxRuntime_LIBRARY}) +set_property(TARGET OnnxRuntime PROPERTY INTERFACE_INCLUDE_DIRECTORIES ${OnnxRuntime_INCLUDE_DIR}) + +mark_as_advanced(OnnxRuntime_FOUND OnnxRuntime_INCLUDE_DIR OnnxRuntime_LIBRARY) diff --git a/run.sh b/run.sh index bb42b5c8d3b22959ff6e0ffa15306f6fdad1fa19..461f88885e1fcac08fd648eadced5f942f60976b 100755 --- a/run.sh +++ b/run.sh @@ -66,8 +66,9 @@ function run-job() { ############################################################################## # The current default platform -lcg_platform=x86_64-centos7-gcc8-opt -lcg_version=101.0.1 +lcg_platform=x86_64-centos7-gcc11-opt +lcg_version=103.0.2 + bldtool=${CEPCSW_BLDTOOL} # make, ninja # set in env var diff --git a/setup.sh b/setup.sh index a75d5f39d2d3fca4d0501c970c74648b69229014..3e09a68fff76f3d16300423d10bd8aba3d713317 100644 --- a/setup.sh +++ b/setup.sh @@ -9,6 +9,8 @@ # Author: Tao Lin <lintao@ihep.ac.cn> ############################################################################## +THISSCRITDIR=$(dirname $(readlink -e "${BASH_SOURCE[0]}" 2>/dev/null) 2>/dev/null) # Darwin readlink doesnt accept -e + function info:() { echo "INFO: $*" 1>&2 } @@ -41,6 +43,25 @@ function setup-external() { } +function setup-install-area() { + local installarea=$THISSCRITDIR/InstallArea + if [ ! -d "$installarea" ]; then + return + fi + + export PATH=$installarea/bin:$PATH + export LD_LIBRARY_PATH=$installarea/lib:$LD_LIBRARY_PATH + export PYTHONPATH=$installarea/lib:$PYTHONPATH + export PYTHONPATH=$installarea/python:$PYTHONPATH + export ROOT_INCLUDE_PATH=$installarea/include:$ROOT_INCLUDE_PATH + + local extrasetupscript=$installarea/setup.sh + if [ -f "$extrasetupscript" ]; then + source $extrasetupscript + fi + + info: "Setup CEPCSW: $installarea" +} ############################################################################## # Parse the command line options @@ -49,8 +70,9 @@ function setup-external() { # CEPCSW_LCG_VERSION=${1}; shift if [ -z "$CEPCSW_LCG_VERSION" ]; then - CEPCSW_LCG_VERSION=101.0.1 + CEPCSW_LCG_VERSION=103.0.2 fi export CEPCSW_LCG_VERSION setup-external +setup-install-area