From acf33fb3ba8ad814ae4d8173c245b132ee4570fc Mon Sep 17 00:00:00 2001 From: robmina Date: Thu, 17 Sep 2026 12:36:16 -0400 Subject: [PATCH 1/4] Stability improvements to align with KinKal PR#224. --- BFieldGeom/inc/BFieldConfig.hh | 6 +- CaloReco/data/ReadoutNoise.root | Bin 38082 -> 0 bytes GeometryService/src/BFieldConfigMaker.cc | 1 + Mu2eG4/geom/bfgeom_v01_minfield.txt | 17 ++++ Mu2eG4/geom/bfgeom_v01_minfield0p3.txt | 16 +++ Mu2eKinKal/inc/KKBField.hh | 3 +- Mu2eKinKal/inc/KKFitSettings.hh | 2 + Mu2eKinKal/src/CentralHelixFit_module.cc | 8 +- Mu2eKinKal/src/KKBField.cc | 5 + Mu2eKinKal/src/KKFitSettings.cc | 2 + Mu2eKinKal/src/KKTruthSeed_module.cc | 14 +++ Mu2eKinKal/src/KinematicLineFit_module.cc | 3 +- Mu2eKinKal/src/LoopHelixFit_module.cc | 3 +- scripts/build/SConscript | 44 --------- scripts/build/bin/procs.sh | 115 ---------------------- scripts/build/cmake/Mu2eSwigHelper.cmake | 45 --------- 16 files changed, 74 insertions(+), 210 deletions(-) delete mode 100644 CaloReco/data/ReadoutNoise.root create mode 100644 Mu2eG4/geom/bfgeom_v01_minfield.txt create mode 100644 Mu2eG4/geom/bfgeom_v01_minfield0p3.txt delete mode 100644 scripts/build/SConscript delete mode 100755 scripts/build/bin/procs.sh delete mode 100644 scripts/build/cmake/Mu2eSwigHelper.cmake diff --git a/BFieldGeom/inc/BFieldConfig.hh b/BFieldGeom/inc/BFieldConfig.hh index b7100f5345..f01f9bd88b 100644 --- a/BFieldGeom/inc/BFieldConfig.hh +++ b/BFieldGeom/inc/BFieldConfig.hh @@ -64,9 +64,12 @@ namespace mu2e { bool flipBFieldMaps() const { return flipBFieldMaps_; } + // smallest |B| (T) KinKal may use for field-corrected transport; 0 disables its low-field protection + double minUsableField() const { return minUsableField_; } + private: BFieldConfig() - : scaleFactor_(1.), writeBinaries_(false), verbosityLevel_(1), flipBFieldMaps_(false) {} + : scaleFactor_(1.), writeBinaries_(false), verbosityLevel_(1), flipBFieldMaps_(false), minUsableField_(0.) {} // G4BL, PARAM or possible future types. BFMapType mapType_; @@ -91,6 +94,7 @@ namespace mu2e { bool writeBinaries_; int verbosityLevel_; bool flipBFieldMaps_; + double minUsableField_; }; } // namespace mu2e diff --git a/CaloReco/data/ReadoutNoise.root b/CaloReco/data/ReadoutNoise.root deleted file mode 100644 index 57298869e7ccedb14cb747d4647c2bc475335f68..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 38082 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 diff --git a/GeometryService/src/BFieldConfigMaker.cc b/GeometryService/src/BFieldConfigMaker.cc index 6149ead151..3b78fd0668 100644 --- a/GeometryService/src/BFieldConfigMaker.cc +++ b/GeometryService/src/BFieldConfigMaker.cc @@ -47,6 +47,7 @@ namespace mu2e { bfconf_->flipBFieldMaps_ = config.getBool("bfield.flipMaps", false); bfconf_->scaleFactor_ = config.getDouble("bfield.scaleFactor", 1.0); + bfconf_->minUsableField_ = config.getDouble("bfield.minUsableField", 0.0); bfconf_->dsFieldForm_ = BFieldConfig::DSFieldModel( config.getInt("detSolFieldForm", BFieldConfig::dsModelUniform)); diff --git a/Mu2eG4/geom/bfgeom_v01_minfield.txt b/Mu2eG4/geom/bfgeom_v01_minfield.txt new file mode 100644 index 0000000000..2e255171e4 --- /dev/null +++ b/Mu2eG4/geom/bfgeom_v01_minfield.txt @@ -0,0 +1,17 @@ +// +// bfgeom_v01 with KinKal low-field protection enabled at the null-field threshold. +// +// bfield.minUsableField is the smallest |B| (T) KinKal uses for field-corrected transport. Below it, and +// outside the maps, bfcorr extrapolation hands off to geometric free-particle continuation instead of +// building domains on a field it can't parameterize. 1e-6 T is KinKal's null-field value +// (BFieldMap::zeroField), so this only removes the degenerate samples. Reconstruction only: Geant4 ignores it. + +#include "Offline/Mu2eG4/geom/bfgeom_v01.txt" + +double bfield.minUsableField = 1.0e-6; + +// +// This tells emacs to view this file in c++ mode. +// Local Variables: +// mode:c++ +// End: diff --git a/Mu2eG4/geom/bfgeom_v01_minfield0p3.txt b/Mu2eG4/geom/bfgeom_v01_minfield0p3.txt new file mode 100644 index 0000000000..f59af60e7e --- /dev/null +++ b/Mu2eG4/geom/bfgeom_v01_minfield0p3.txt @@ -0,0 +1,16 @@ +// +// bfgeom_v01 with KinKal low-field protection at 0.3 T. +// +// bfield.minUsableField is the smallest |B| (T) KinKal uses for field-corrected transport; see +// bfgeom_v01_minfield.txt. 0.3 T hands off to geometric continuation while real bending remains, so it +// trades extrapolation accuracy for stability. Reconstruction only: Geant4 ignores it. + +#include "Offline/Mu2eG4/geom/bfgeom_v01.txt" + +double bfield.minUsableField = 0.3; + +// +// This tells emacs to view this file in c++ mode. +// Local Variables: +// mode:c++ +// End: diff --git a/Mu2eKinKal/inc/KKBField.hh b/Mu2eKinKal/inc/KKBField.hh index f916223501..78b2383d66 100644 --- a/Mu2eKinKal/inc/KKBField.hh +++ b/Mu2eKinKal/inc/KKBField.hh @@ -17,7 +17,8 @@ namespace mu2e using Grad = ROOT::Math::SMatrix; // field gradient: ie dBi/d(x,y,z) // construct from BField object and system translator. // This should be a single BField map valid in the detector system, to avoid making continuous translations FIXME! - KKBField(BFieldManager const& bfmgr, DetectorSystem const& det) : bfmgr_(bfmgr), det_(det) {} + // The minimum usable field comes from the BField geometry (bfield.minUsableField), so every module in a job shares it. + KKBField(BFieldManager const& bfmgr, DetectorSystem const& det); virtual ~KKBField() {} // KinKal BField interface // return value of the field at a poin diff --git a/Mu2eKinKal/inc/KKFitSettings.hh b/Mu2eKinKal/inc/KKFitSettings.hh index 60ec284281..d650ca051d 100644 --- a/Mu2eKinKal/inc/KKFitSettings.hh +++ b/Mu2eKinKal/inc/KKFitSettings.hh @@ -35,6 +35,8 @@ namespace mu2e { fhicl::Atom bfieldCorr { Name("BFieldCorrection"), Comment("Apply correction for BField inhomogeneity") }; fhicl::Atom ends { Name("ProcessEnds"), Comment("Process purely passive sites at the time range ends") }; fhicl::Atom btol { Name("BCorrTolerance"), Comment("Tolerance on BField correction momentum fractional accuracy (dimensionless)") }; + fhicl::Atom minDomainTimeStep { Name("MinDomainTimeStep"), Comment("Minimum BField domain time step (ns); 0 leaves it unbounded"), 0.0 }; + fhicl::Atom domainMargin { Name("DomainMargin"), Comment("Maximum time a BField domain may extend beyond the active range (ns); negative leaves domains unconfined"), -1.0 }; // Updater settings using MetaIterationSettings = fhicl::Sequence>; MetaIterationSettings miConfig { Name("MetaIterationSettings"), Comment("Temperature (dimensionless), StrawHitUpdater algorithm") }; diff --git a/Mu2eKinKal/src/CentralHelixFit_module.cc b/Mu2eKinKal/src/CentralHelixFit_module.cc index 888ec8e928..7cb98adf2f 100644 --- a/Mu2eKinKal/src/CentralHelixFit_module.cc +++ b/Mu2eKinKal/src/CentralHelixFit_module.cc @@ -358,9 +358,13 @@ namespace mu2e { goodfit = goodFit(*ktrk); } // extrapolate as required - if(goodfit && extrap_)extrap_->extrapolate(*ktrk); + if(goodfit && extrap_){ + extrap_->extrapolate(*ktrk); + goodfit = goodFit(*ktrk); // extrapolation can mark the fit failing + } if(print_>1)ktrk->printFit(std::cout,print_); - if(goodfit || saveall_){ + // a fit that failed before its trajectory was built has nothing to save + if((goodfit || saveall_) && ktrk->hasTraj()){ TrkFitFlag fitflag; fitflag.merge(fitflag_); if(goodfit) diff --git a/Mu2eKinKal/src/KKBField.cc b/Mu2eKinKal/src/KKBField.cc index fee672de22..214f1acaa5 100644 --- a/Mu2eKinKal/src/KKBField.cc +++ b/Mu2eKinKal/src/KKBField.cc @@ -1,9 +1,14 @@ #include "Offline/Mu2eKinKal/inc/KKBField.hh" +#include "Offline/BFieldGeom/inc/BFieldConfig.hh" +#include "Offline/GeometryService/inc/GeomHandle.hh" #include "cetlib_except/exception.h" namespace mu2e { using Grad = ROOT::Math::SMatrix; using SVEC3 = KinKal::SVEC3; + KKBField::KKBField(BFieldManager const& bfmgr, DetectorSystem const& det) : + KinKal::BFieldMap(GeomHandle()->minUsableField()), bfmgr_(bfmgr), det_(det) {} + VEC3 KKBField::fieldVect(VEC3 const& position) const { // change coordinates to mu2e; the map should be native in detector coordinates FIXME! CLHEP::Hep3Vector vpoint(position.x(),position.y(),position.z()); diff --git a/Mu2eKinKal/src/KKFitSettings.cc b/Mu2eKinKal/src/KKFitSettings.cc index 9f25a90e75..54435975ee 100644 --- a/Mu2eKinKal/src/KKFitSettings.cc +++ b/Mu2eKinKal/src/KKFitSettings.cc @@ -22,6 +22,8 @@ namespace mu2e { config.bfcorr_ = fitconfig.bfieldCorr(); config.ends_ = fitconfig.ends(); config.tol_ = fitconfig.btol(); + config.mindtstep_ = fitconfig.minDomainTimeStep(); + if(fitconfig.domainMargin() >= 0.0) config.domainmargin_ = fitconfig.domainMargin(); // negative keeps KinKal's unconfined default // create the updaters requested std::vector cadshusettings; std::vector driftannshusettings; diff --git a/Mu2eKinKal/src/KKTruthSeed_module.cc b/Mu2eKinKal/src/KKTruthSeed_module.cc index 43ba1cf330..d7167de623 100644 --- a/Mu2eKinKal/src/KKTruthSeed_module.cc +++ b/Mu2eKinKal/src/KKTruthSeed_module.cc @@ -214,6 +214,14 @@ namespace mu2e { auto const htime = fpiece.range().mid(); VEC3 tpos, tmom; double ttime = 0.0; if(!trueStateAt(mctrajs, det, fpiece.position3(htime), mass, tpos, tmom, ttime)) continue; + // a helix needs a usable local field: outside the map, or where the helix can't represent the true state there + // (null field, circle centered on the axis), the constructor would refuse it + if constexpr(!isLine){ + VEC4 tpos4(tpos.X(),tpos.Y(),tpos.Z(),ttime); + MOM4 tmom4(tmom.X(),tmom.Y(),tmom.Z(),mass); + if(!kkbf_->usable(tpos) || + !KTRAJ::constructible(KinKal::ParticleState(tpos4,tmom4,tcharge),VEC3(0.0,0.0,kkbf_->fieldVect(tpos).Z()))) continue; + } // the KTRAJ nominal BField: the local field for a helix; a fixed non-zero z for a field-free line // (KinematicLine requires a non-zero bnom for interface consistency). KTRAJ tpiece = [&]{ @@ -284,6 +292,12 @@ namespace mu2e { // without re-running the full extension schedule (which diverges a hit-less truth-pinned fit). truthConfig.bfcorr_ = exconfig_.bfcorr_; truthConfig.tol_ = exconfig_.tol_; + truthConfig.mindtstep_ = exconfig_.mindtstep_; // floors the extrapolation step too + // a field-corrected truth fit needs the reco domains, as in RegrowLoopHelix + if(truthConfig.bfcorr_ && truthDomains.empty()){ + if(debug_ > 0) std::cout << "KKTruthSeed: no BField domains from " << recoseed.domainBounds().size() << " saved bounds; skipping" << std::endl; + return std::nullopt; + } auto ktrk_truth = std::make_unique(truthConfig,*kkbf_,recoseed.particle(),truthTraj, nostrawhits,nostrawxings,nocalohits,truthParamHits,truthDomains); if(!ktrk_truth->fitStatus().usable()){ diff --git a/Mu2eKinKal/src/KinematicLineFit_module.cc b/Mu2eKinKal/src/KinematicLineFit_module.cc index 96f1be100f..72762a92a8 100644 --- a/Mu2eKinKal/src/KinematicLineFit_module.cc +++ b/Mu2eKinKal/src/KinematicLineFit_module.cc @@ -313,7 +313,8 @@ namespace mu2e { // extrapolate as required if(goodfit && extrap_) extrap_->extrapolate(*kktrk); bool save = goodFit(*kktrk); - if(save || saveall_){ + // a fit that failed before its trajectory was built has nothing to save + if((save || saveall_) && kktrk->hasTraj()){ TrkFitFlag fitflag(hptr->status()); fitflag.merge(TrkFitFlag::KKLine); sampleFit(*kktrk); diff --git a/Mu2eKinKal/src/LoopHelixFit_module.cc b/Mu2eKinKal/src/LoopHelixFit_module.cc index 5f9056cf7f..a9a91cc43f 100644 --- a/Mu2eKinKal/src/LoopHelixFit_module.cc +++ b/Mu2eKinKal/src/LoopHelixFit_module.cc @@ -364,7 +364,8 @@ namespace mu2e { } if(print_>0) printf("[LoopHelixFit::%s] After extending the fit : goodFit = %o, fitcon = %.4f, nHits = %2lu, %lu calo-hits\n", __func__, goodfit, ktrk->fitStatus().chisq_.probability(), ktrk->strawHits().size(), ktrk->caloHits().size()); - if((!goodfit) && (! saveall_)) ktrk.reset(); + // a fit that failed before its trajectory was built has nothing to save + if(!ktrk->hasTraj() || ((!goodfit) && (! saveall_))) ktrk.reset(); return ktrk; } diff --git a/scripts/build/SConscript b/scripts/build/SConscript deleted file mode 100644 index 78adb49141..0000000000 --- a/scripts/build/SConscript +++ /dev/null @@ -1,44 +0,0 @@ -#!/usr/bin/env python -# -# -import os -Import('env') - -# make a copy of env with the full build environmentals so it can run exe's -exe_env = env.Clone() -exe_env.Append(ENV=os.environ) - -command="Offline/scripts/build/bin/procs.sh " - -# each of these generates a useful file or runs a test -targets = ["DEPS","GDML","ROVERLAPS","TEST03","GITPACK","RMSO"] - -for target in targets: - exe_env.AlwaysBuild(exe_env.Alias(target, [], - command+target)) - -# the RELEASE target runs all the above generators and tests - -exe_env.AlwaysBuild(env.Alias('RELEASE', [], '#echo completed release targets')) -Depends('RELEASE', targets) - -# the INCPATH target just prints the include path, for use in making dependencies -inclist=exe_env["CPPPATH"] -incpath="echo " -for dd in inclist: - incpath=incpath+" -I"+dd -if 'G4INCLUDE' in os.environ: - incpath = incpath + " -I" + os.environ['G4INCLUDE'] - incpath = incpath + " -I" + os.environ['G4INCLUDE'] + "/Geant4" -if 'CRYHOME' in os.environ: - incpath = incpath + " -I" + os.environ['CRYHOME'] + '/src' - -exe_env.AlwaysBuild(env.Alias('INCPATH', [], incpath)) - - -# This tells emacs to view this file in python mode. -# Local Variables: -# mode:python -# End: -# vi:syntax=python - diff --git a/scripts/build/bin/procs.sh b/scripts/build/bin/procs.sh deleted file mode 100755 index 4068c8af56..0000000000 --- a/scripts/build/bin/procs.sh +++ /dev/null @@ -1,115 +0,0 @@ -#!/bin/bash -# -# SConstruct phony targets run mu2e exe's via this script -# the one argument is the scons target name -# - - -# -# a function to make the deps file in the Muse case -# -museDeps() { - - local INCPATH=$( scons -f $MUSE_DIR/python/SConstruct -s INCPATH \ - | sed 's|'$PWD'|.|g' ) - - mkdir -p $MUSE_BUILD_BASE/Offline/gen/txt - local DFILE=$MUSE_BUILD_BASE/Offline/gen/txt/deps.txt - rm -f $DFILE - touch $DFILE - - # remove Project (unmaintained) and .git - local DIRS=$( find Offline -mindepth 1 -maxdepth 1 -type d | sed 's|^./||' | \ - grep -v Projects | grep -v git ) - - for DD in $DIRS - do - local REPO=$(echo $DD | awk -F/ '{print $2}') - # remove CRVResponse wls subdir - wrong include paths - local FILES=$(find $DD \( -name "classes.h" -or -name "*.hh" -or -name "*.cc" \) | \ - grep -v wls ) - local N=$( echo $FILES | wc -w ) - if [ $N -gt 0 ]; then - cat $FILES > sconsInclude.cc - g++ --std=c++17 -M $INCPATH sconsInclude.cc \ - | sed -e 's|\\|\n|g' -e 's/ /\n/' | grep -v sconsInclude | \ - sed '/^\/usr\/*/d' | sed -e '/^[[:space:]]*$/d' > sconsInclude.txt - local RC=$? - if [ $RC -ne 0 ]; then - echo "ERROR compile error in $DD" - rm -f sconsInclude* - return 1 - fi - local HDEPS=$(cat sconsInclude.txt | grep Offline | awk -F/ '{print $2}' | \ - sort | uniq | grep -v $REPO | tr "\n" " " ) - local PDEPS=$(cat sconsInclude.txt | grep cvmfs | awk -F/ '{print $5}' | \ - sort | uniq | grep -v $REPO | tr "\n" " ") - local NI=$(cat sconsInclude.txt | wc -l) - echo $REPO $N files $NI includes - - echo "HDR $REPO $HDEPS" >> $DFILE - echo "PRD $REPO $PDEPS" >> $DFILE - else - echo $REPO 0 files - fi - done - - rm -f sconsInclude* - - return 0 -} - - - -COMMAND=$1 -RC=0 - -echo [$(date)] procs.sh starting $COMMAND - -if [ "$COMMAND" == "DEPS" ]; then - # make a text file of the package dependencies - museDeps - RC=$? -elif [ "$COMMAND" == "GDML" ]; then - # find gdml fcl files and make all GDML files, add to build dir - RC=0 - mkdir -p ${MUSE_BUILD_BASE}/Offline/gen/gdml - FCLS=$(ls Offline/Mu2eG4/fcl/gdmldump_* ) - OWD=$PWD - TWD=$(mktemp -d) - cd $TWD - for FCL in $FCLS - do - echo - echo "Starting GDML for $FCL" - mu2e -c $FCL - # some tags and geometries are inconsistent - # so do not fail on failure to make GDML - done - mv *.gdml ${MUSE_WORK_DIR}/${MUSE_BUILD_BASE}/Offline/gen/gdml - cd $OWD - rmdir $TWD -elif [ "$COMMAND" == "TEST03" ]; then - # see if this fcl runs - mu2e -c Offline/Mu2eG4/fcl/g4test_03.fcl -o /dev/null -T /dev/null - [ $? -ne 0 ] && RC=1 -elif [ "$COMMAND" == "ROVERLAPS" ]; then - # fast root overlap check - Offline/bin/overlapCheck.sh -r -q -b -elif [ "$COMMAND" == "GITPACK" ]; then - git -C Offline repack -d -l - [ $? -ne 0 ] && RC=1 -elif [ "$COMMAND" == "RMSO" ]; then - find ${MUSE_BUILD_BASE}/Offline -name "*.os" -delete - find ${MUSE_BUILD_BASE}/Offline -name "*.o" -delete - rm -f .sconsign.dblite -fi - -if [ $RC -ne 0 ]; then - echo "[$(date)] procs.sh failed $COMMAND" - exit 1 -fi - -echo [$(date)] procs.sh success $COMMAND - -exit 0 diff --git a/scripts/build/cmake/Mu2eSwigHelper.cmake b/scripts/build/cmake/Mu2eSwigHelper.cmake deleted file mode 100644 index 22fb7391c3..0000000000 --- a/scripts/build/cmake/Mu2eSwigHelper.cmake +++ /dev/null @@ -1,45 +0,0 @@ -# cmake/Mu2eSwigHelper.cmake -# -# called from a Offline subdirectory -# PYTHON_INSTALL_DIR was set at top level - -function(mu2e_swig TARGET_NAME INTERFACE_FILE CPP_LIB_DEPENDENCY) - # Define the output directory for this specific sub-module - set(GEN_DIR "${CMAKE_CURRENT_BINARY_DIR}/swig_gen") - set(CMAKE_SWIG_OUTDIR ${GEN_DIR}) - - # Set C++ mode on the .i file - set_property(SOURCE ${INTERFACE_FILE} PROPERTY CPLUSPLUS ON) - - # Create the SWIG library - swig_add_library(${TARGET_NAME} - LANGUAGE Python - SOURCES ${INTERFACE_FILE} - ) - - # Inherit includes and link to the requested C++ library + Python - set_property(TARGET ${TARGET_NAME} PROPERTY SWIG_USE_TARGET_INCLUDE_DIRECTORIES ON) - - target_link_libraries(${TARGET_NAME} - PRIVATE - ${CPP_LIB_DEPENDENCY} - Python3::Module - Python3::Python - ) - - #target_compile_options(${TARGET_NAME} PRIVATE "-std=c++20") - - # Install both the .so and the .py file - install(TARGETS ${TARGET_NAME} - LIBRARY DESTINATION ${PYTHON_INSTALL_DIR}) - - get_target_property(_py_dir ${TARGET_NAME} SWIG_SUPPORT_FILES_DIRECTORY) - - # Note: This assumes the .py filename matches the target name - # (or you can pass the module name as a 4th argument) - install(DIRECTORY ${_py_dir}/ - DESTINATION ${PYTHON_INSTALL_DIR} - FILES_MATCHING PATTERN "*.py") - -endfunction() - From 71a5cc1c5de908d685a22642c731c87d5dfa4ea9 Mon Sep 17 00:00:00 2001 From: Rob Mina Date: Wed, 30 Sep 2026 11:05:26 -0500 Subject: [PATCH 2/4] Restore incorrectly deleted files. --- CaloReco/data/ReadoutNoise.root | Bin 0 -> 38082 bytes scripts/build/SConscript | 43 +++++++++ scripts/build/bin/procs.sh | 115 +++++++++++++++++++++++ scripts/build/cmake/Mu2eSwigHelper.cmake | 45 +++++++++ 4 files changed, 203 insertions(+) create mode 100644 CaloReco/data/ReadoutNoise.root create mode 100644 scripts/build/SConscript create mode 100755 scripts/build/bin/procs.sh create mode 100644 scripts/build/cmake/Mu2eSwigHelper.cmake diff --git a/CaloReco/data/ReadoutNoise.root b/CaloReco/data/ReadoutNoise.root new file mode 100644 index 0000000000000000000000000000000000000000..57298869e7ccedb14cb747d4647c2bc475335f68 GIT binary patch literal 38082 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 literal 0 HcmV?d00001 diff --git a/scripts/build/SConscript b/scripts/build/SConscript new file mode 100644 index 0000000000..85d02f1592 --- /dev/null +++ b/scripts/build/SConscript @@ -0,0 +1,43 @@ +#!/usr/bin/env python +# +# +import os +Import('env') + +# make a copy of env with the full build environmentals so it can run exe's +exe_env = env.Clone() +exe_env.Append(ENV=os.environ) + +command="Offline/scripts/build/bin/procs.sh " + +# each of these generates a useful file or runs a test +targets = ["DEPS","GDML","ROVERLAPS","TEST03","GITPACK","RMSO"] + +for target in targets: + exe_env.AlwaysBuild(exe_env.Alias(target, [], + command+target)) + +# the RELEASE target runs all the above generators and tests + +exe_env.AlwaysBuild(env.Alias('RELEASE', [], '#echo completed release targets')) +Depends('RELEASE', targets) + +# the INCPATH target just prints the include path, for use in making dependencies +inclist=exe_env["CPPPATH"] +incpath="echo " +for dd in inclist: + incpath=incpath+" -I"+dd +if 'G4INCLUDE' in os.environ: + incpath = incpath + " -I" + os.environ['G4INCLUDE'] + incpath = incpath + " -I" + os.environ['G4INCLUDE'] + "/Geant4" +if 'CRYHOME' in os.environ: + incpath = incpath + " -I" + os.environ['CRYHOME'] + '/src' + +exe_env.AlwaysBuild(env.Alias('INCPATH', [], incpath)) + + +# This tells emacs to view this file in python mode. +# Local Variables: +# mode:python +# End: +# vi:syntax=python diff --git a/scripts/build/bin/procs.sh b/scripts/build/bin/procs.sh new file mode 100755 index 0000000000..4068c8af56 --- /dev/null +++ b/scripts/build/bin/procs.sh @@ -0,0 +1,115 @@ +#!/bin/bash +# +# SConstruct phony targets run mu2e exe's via this script +# the one argument is the scons target name +# + + +# +# a function to make the deps file in the Muse case +# +museDeps() { + + local INCPATH=$( scons -f $MUSE_DIR/python/SConstruct -s INCPATH \ + | sed 's|'$PWD'|.|g' ) + + mkdir -p $MUSE_BUILD_BASE/Offline/gen/txt + local DFILE=$MUSE_BUILD_BASE/Offline/gen/txt/deps.txt + rm -f $DFILE + touch $DFILE + + # remove Project (unmaintained) and .git + local DIRS=$( find Offline -mindepth 1 -maxdepth 1 -type d | sed 's|^./||' | \ + grep -v Projects | grep -v git ) + + for DD in $DIRS + do + local REPO=$(echo $DD | awk -F/ '{print $2}') + # remove CRVResponse wls subdir - wrong include paths + local FILES=$(find $DD \( -name "classes.h" -or -name "*.hh" -or -name "*.cc" \) | \ + grep -v wls ) + local N=$( echo $FILES | wc -w ) + if [ $N -gt 0 ]; then + cat $FILES > sconsInclude.cc + g++ --std=c++17 -M $INCPATH sconsInclude.cc \ + | sed -e 's|\\|\n|g' -e 's/ /\n/' | grep -v sconsInclude | \ + sed '/^\/usr\/*/d' | sed -e '/^[[:space:]]*$/d' > sconsInclude.txt + local RC=$? + if [ $RC -ne 0 ]; then + echo "ERROR compile error in $DD" + rm -f sconsInclude* + return 1 + fi + local HDEPS=$(cat sconsInclude.txt | grep Offline | awk -F/ '{print $2}' | \ + sort | uniq | grep -v $REPO | tr "\n" " " ) + local PDEPS=$(cat sconsInclude.txt | grep cvmfs | awk -F/ '{print $5}' | \ + sort | uniq | grep -v $REPO | tr "\n" " ") + local NI=$(cat sconsInclude.txt | wc -l) + echo $REPO $N files $NI includes + + echo "HDR $REPO $HDEPS" >> $DFILE + echo "PRD $REPO $PDEPS" >> $DFILE + else + echo $REPO 0 files + fi + done + + rm -f sconsInclude* + + return 0 +} + + + +COMMAND=$1 +RC=0 + +echo [$(date)] procs.sh starting $COMMAND + +if [ "$COMMAND" == "DEPS" ]; then + # make a text file of the package dependencies + museDeps + RC=$? +elif [ "$COMMAND" == "GDML" ]; then + # find gdml fcl files and make all GDML files, add to build dir + RC=0 + mkdir -p ${MUSE_BUILD_BASE}/Offline/gen/gdml + FCLS=$(ls Offline/Mu2eG4/fcl/gdmldump_* ) + OWD=$PWD + TWD=$(mktemp -d) + cd $TWD + for FCL in $FCLS + do + echo + echo "Starting GDML for $FCL" + mu2e -c $FCL + # some tags and geometries are inconsistent + # so do not fail on failure to make GDML + done + mv *.gdml ${MUSE_WORK_DIR}/${MUSE_BUILD_BASE}/Offline/gen/gdml + cd $OWD + rmdir $TWD +elif [ "$COMMAND" == "TEST03" ]; then + # see if this fcl runs + mu2e -c Offline/Mu2eG4/fcl/g4test_03.fcl -o /dev/null -T /dev/null + [ $? -ne 0 ] && RC=1 +elif [ "$COMMAND" == "ROVERLAPS" ]; then + # fast root overlap check + Offline/bin/overlapCheck.sh -r -q -b +elif [ "$COMMAND" == "GITPACK" ]; then + git -C Offline repack -d -l + [ $? -ne 0 ] && RC=1 +elif [ "$COMMAND" == "RMSO" ]; then + find ${MUSE_BUILD_BASE}/Offline -name "*.os" -delete + find ${MUSE_BUILD_BASE}/Offline -name "*.o" -delete + rm -f .sconsign.dblite +fi + +if [ $RC -ne 0 ]; then + echo "[$(date)] procs.sh failed $COMMAND" + exit 1 +fi + +echo [$(date)] procs.sh success $COMMAND + +exit 0 diff --git a/scripts/build/cmake/Mu2eSwigHelper.cmake b/scripts/build/cmake/Mu2eSwigHelper.cmake new file mode 100644 index 0000000000..22fb7391c3 --- /dev/null +++ b/scripts/build/cmake/Mu2eSwigHelper.cmake @@ -0,0 +1,45 @@ +# cmake/Mu2eSwigHelper.cmake +# +# called from a Offline subdirectory +# PYTHON_INSTALL_DIR was set at top level + +function(mu2e_swig TARGET_NAME INTERFACE_FILE CPP_LIB_DEPENDENCY) + # Define the output directory for this specific sub-module + set(GEN_DIR "${CMAKE_CURRENT_BINARY_DIR}/swig_gen") + set(CMAKE_SWIG_OUTDIR ${GEN_DIR}) + + # Set C++ mode on the .i file + set_property(SOURCE ${INTERFACE_FILE} PROPERTY CPLUSPLUS ON) + + # Create the SWIG library + swig_add_library(${TARGET_NAME} + LANGUAGE Python + SOURCES ${INTERFACE_FILE} + ) + + # Inherit includes and link to the requested C++ library + Python + set_property(TARGET ${TARGET_NAME} PROPERTY SWIG_USE_TARGET_INCLUDE_DIRECTORIES ON) + + target_link_libraries(${TARGET_NAME} + PRIVATE + ${CPP_LIB_DEPENDENCY} + Python3::Module + Python3::Python + ) + + #target_compile_options(${TARGET_NAME} PRIVATE "-std=c++20") + + # Install both the .so and the .py file + install(TARGETS ${TARGET_NAME} + LIBRARY DESTINATION ${PYTHON_INSTALL_DIR}) + + get_target_property(_py_dir ${TARGET_NAME} SWIG_SUPPORT_FILES_DIRECTORY) + + # Note: This assumes the .py filename matches the target name + # (or you can pass the module name as a 4th argument) + install(DIRECTORY ${_py_dir}/ + DESTINATION ${PYTHON_INSTALL_DIR} + FILES_MATCHING PATTERN "*.py") + +endfunction() + From 1fff0c2f07ef5b6e9c57baf6f0a1b64f7d1960c6 Mon Sep 17 00:00:00 2001 From: Rob Mina Date: Wed, 30 Sep 2026 15:19:48 -0500 Subject: [PATCH 3/4] Address AI review comments. --- Mu2eKinKal/fcl/prolog.fcl | 8 ++++++++ Mu2eKinKal/inc/KKExtrap.hh | 9 +++++++++ Mu2eKinKal/inc/KKFitSettings.hh | 3 ++- Mu2eKinKal/src/CentralHelixFit_module.cc | 2 ++ Mu2eKinKal/src/KKFitSettings.cc | 7 ++++++- Mu2eKinKal/src/KKTruthSeed_module.cc | 2 ++ Mu2eKinKal/src/KinematicLineFit_module.cc | 2 ++ Mu2eKinKal/src/LoopHelixFit_module.cc | 2 ++ 8 files changed, 33 insertions(+), 2 deletions(-) diff --git a/Mu2eKinKal/fcl/prolog.fcl b/Mu2eKinKal/fcl/prolog.fcl index d1440a4d71..29e43eac39 100644 --- a/Mu2eKinKal/fcl/prolog.fcl +++ b/Mu2eKinKal/fcl/prolog.fcl @@ -53,6 +53,7 @@ Mu2eKinKal : { DivergenceGap : 20 # mm BFieldCorrection : false BCorrTolerance : 1e-2 # momemntum fraction + MinDomainTimeStep : 0.0 # (ns); 0 leaves the BField domain step unbounded ProcessEnds : false MetaIterationSettings : [ # annealing temp, strawhit updater algorithm @@ -89,6 +90,7 @@ Mu2eKinKal : { BFieldCorrection : true ProcessEnds : false BCorrTolerance : 1e-2 # relative momemntum precision + MinDomainTimeStep : 0.0 # (ns); 0 leaves the BField domain step unbounded MetaIterationSettings : [ # annealing temp, strawhit updater algorithm [ 2.0, "CADSHU" ], @@ -128,6 +130,7 @@ Mu2eKinKal : { BFieldCorrection : false ProcessEnds : false BCorrTolerance : 1e-4 # momemntum fraction + MinDomainTimeStep : 0.0 # (ns); 0 leaves the BField domain step unbounded MetaIterationSettings : [ # annealing temp, strawhit updater algorithms [ 2.0, "CADSHU" ], @@ -194,6 +197,7 @@ Mu2eKinKal : { DivergenceGap : 10 # mm BFieldCorrection : true BCorrTolerance : 1e-2 # momemntum fraction + MinDomainTimeStep : 0.0 # (ns); 0 leaves the BField domain step unbounded ProcessEnds : false MetaIterationSettings : [ # annealing temp, strawhit updater algorithm @@ -227,6 +231,7 @@ Mu2eKinKal : { BFieldCorrection : false ProcessEnds : false BCorrTolerance : 1e-4 # momemntum fraction + MinDomainTimeStep : 0.0 # (ns); 0 leaves the BField domain step unbounded MetaIterationSettings : [] CADSHUSettings : [] StrawXingUpdaterSettings : [] @@ -244,6 +249,7 @@ Mu2eKinKal : { BFieldCorrection : true ProcessEnds : false BCorrTolerance : 1e-2 # relative momemntum precision + MinDomainTimeStep : 0.0 # (ns); 0 leaves the BField domain step unbounded MetaIterationSettings : [ # annealing temp, strawhit updater algorithm [ 2.0, "CADSHU" ], @@ -283,6 +289,7 @@ Mu2eKinKal : { BFieldCorrection : true ProcessEnds : true BCorrTolerance : 1e-4 # momemntum fraction + MinDomainTimeStep : 0.0 # (ns); 0 leaves the BField domain step unbounded MetaIterationSettings : [ # annealing temp, strawhit updater algorithms [ 2.0, "CADSHU" ], @@ -358,6 +365,7 @@ Mu2eKinKal : { DivergenceGap : 100 # mm ProcessEnds : true BCorrTolerance : 1e-4 + MinDomainTimeStep : 0.0 # (ns); 0 leaves the BField domain step unbounded MetaIterationSettings : [ [ 0.0, "" ] ] CADSHUSettings : [ ] BkgANNSHUSettings : [ ] diff --git a/Mu2eKinKal/inc/KKExtrap.hh b/Mu2eKinKal/inc/KKExtrap.hh index a72489b0d6..13a1b179aa 100644 --- a/Mu2eKinKal/inc/KKExtrap.hh +++ b/Mu2eKinKal/inc/KKExtrap.hh @@ -19,6 +19,7 @@ #include "Offline/Mu2eKinKal/inc/KKShellXing.hh" #include "Offline/KinKalGeom/inc/KKMaterial.hh" #include "KinKal/Geometry/ParticleTrajectoryIntersect.hh" +#include "cetlib_except/exception.h" #include "Offline/GeometryService/inc/GeomHandle.hh" #include #include @@ -41,6 +42,8 @@ namespace mu2e { class KKExtrap { public: explicit KKExtrap(KKExtrapConfig const& exconfig); + // throw at configuration if the fit config's minimum domain step can't fit this extrapolation's maximum step + void checkConfig(KinKal::Config const& config) const; // extrapolation functions; these are templated on the type of trajectory template void extrapolate(KKTrack& ktrk) const; template bool extrapolateIPA(KKTrack& ktrk,TimeDir trkdir) const; @@ -80,6 +83,12 @@ namespace mu2e { toCRV_(extrapconfig.ToCRV()) {} + inline void KKExtrap::checkConfig(KinKal::Config const& config) const { + if(config.bfcorr_ && config.mindtstep_ > maxdtstep_) + throw cet::exception("RECO") << "mu2e::KKExtrap: MinDomainTimeStep " << config.mindtstep_ + << " ns exceeds ExtrapolationSettings.MaxDtStep " << maxdtstep_ << " ns" << std::endl; + } + template void KKExtrap::extrapolate(KKTrack& ktrk) const { GeomHandle kkg_h; // define the time direction according to the fit direction inside the tracker diff --git a/Mu2eKinKal/inc/KKFitSettings.hh b/Mu2eKinKal/inc/KKFitSettings.hh index d650ca051d..4395e5999d 100644 --- a/Mu2eKinKal/inc/KKFitSettings.hh +++ b/Mu2eKinKal/inc/KKFitSettings.hh @@ -4,6 +4,7 @@ // Structs for configuring the Mu2e KinKal fit // #include "fhiclcpp/types/Atom.h" +#include "fhiclcpp/types/OptionalAtom.h" #include "fhiclcpp/types/Sequence.h" #include "fhiclcpp/types/OptionalSequence.h" #include "fhiclcpp/types/Tuple.h" @@ -36,7 +37,7 @@ namespace mu2e { fhicl::Atom ends { Name("ProcessEnds"), Comment("Process purely passive sites at the time range ends") }; fhicl::Atom btol { Name("BCorrTolerance"), Comment("Tolerance on BField correction momentum fractional accuracy (dimensionless)") }; fhicl::Atom minDomainTimeStep { Name("MinDomainTimeStep"), Comment("Minimum BField domain time step (ns); 0 leaves it unbounded"), 0.0 }; - fhicl::Atom domainMargin { Name("DomainMargin"), Comment("Maximum time a BField domain may extend beyond the active range (ns); negative leaves domains unconfined"), -1.0 }; + fhicl::OptionalAtom domainMargin { Name("DomainMargin"), Comment("Maximum time a BField domain may extend beyond the active range (ns, >= 0); absent leaves domains unconfined") }; // Updater settings using MetaIterationSettings = fhicl::Sequence>; MetaIterationSettings miConfig { Name("MetaIterationSettings"), Comment("Temperature (dimensionless), StrawHitUpdater algorithm") }; diff --git a/Mu2eKinKal/src/CentralHelixFit_module.cc b/Mu2eKinKal/src/CentralHelixFit_module.cc index 8820e88184..11e4fb51a2 100644 --- a/Mu2eKinKal/src/CentralHelixFit_module.cc +++ b/Mu2eKinKal/src/CentralHelixFit_module.cc @@ -233,6 +233,8 @@ namespace mu2e { } // setup extrapolation if(settings().extrapSettings())extrap_ = make_unique(*settings().extrapSettings()); + // extrapolation runs under the extension config when there is one + if(extrap_) extrap_->checkConfig(exconfig_.schedule().size() > 0 ? exconfig_ : config_); // surfaces to sample; this interface is deprecatecd and should be replaced with extrapolation TODO for(auto const& sidname : settings().modSettings().sampleSurfaces()) { diff --git a/Mu2eKinKal/src/KKFitSettings.cc b/Mu2eKinKal/src/KKFitSettings.cc index 54435975ee..a8d78bce14 100644 --- a/Mu2eKinKal/src/KKFitSettings.cc +++ b/Mu2eKinKal/src/KKFitSettings.cc @@ -2,6 +2,7 @@ #include "Offline/Mu2eKinKal/inc/WireHitState.hh" #include "Offline/Mu2eKinKal/inc/StrawHitUpdaters.hh" #include "Offline/GeneralUtilities/inc/splitLine.hh" +#include "cetlib_except/exception.h" #include namespace mu2e { @@ -23,7 +24,11 @@ namespace mu2e { config.ends_ = fitconfig.ends(); config.tol_ = fitconfig.btol(); config.mindtstep_ = fitconfig.minDomainTimeStep(); - if(fitconfig.domainMargin() >= 0.0) config.domainmargin_ = fitconfig.domainMargin(); // negative keeps KinKal's unconfined default + double domainmargin(0.0); + if(fitconfig.domainMargin(domainmargin)){ // absent keeps KinKal's unconfined default + if(domainmargin < 0.0) throw cet::exception("RECO") << "mu2e::Mu2eKinKal::makeConfig: DomainMargin must be >= 0, got " << domainmargin << std::endl; + config.domainmargin_ = domainmargin; + } // create the updaters requested std::vector cadshusettings; std::vector driftannshusettings; diff --git a/Mu2eKinKal/src/KKTruthSeed_module.cc b/Mu2eKinKal/src/KKTruthSeed_module.cc index 98ce750ebe..0e80cfb7ba 100644 --- a/Mu2eKinKal/src/KKTruthSeed_module.cc +++ b/Mu2eKinKal/src/KKTruthSeed_module.cc @@ -145,6 +145,8 @@ namespace mu2e { produces(); produces(); if(settings().extrapSettings()) extrap_ = std::make_unique(*settings().extrapSettings()); + // the truth track extrapolates with the extension config's bfcorr_ and mindtstep_ + if(extrap_) extrap_->checkConfig(exconfig_); if(truthSeedParamConstraints_.size() != KinKal::NParams()) throw cet::exception("RECO") << "mu2e::KKTruthSeed: TruthSeedParameterConstraints must have " << KinKal::NParams() << " entries" << std::endl; diff --git a/Mu2eKinKal/src/KinematicLineFit_module.cc b/Mu2eKinKal/src/KinematicLineFit_module.cc index e5244532e2..1ecc83e40c 100644 --- a/Mu2eKinKal/src/KinematicLineFit_module.cc +++ b/Mu2eKinKal/src/KinematicLineFit_module.cc @@ -219,6 +219,8 @@ namespace mu2e { } // setup extrapolation if(settings().extrapSettings())extrap_ = make_unique(*settings().extrapSettings()); + // extrapolation runs under the extension config when there is one + if(extrap_) extrap_->checkConfig(exconfig_.schedule().size() > 0 ? exconfig_ : config_); if(print_ > 0) std::cout << config_; } diff --git a/Mu2eKinKal/src/LoopHelixFit_module.cc b/Mu2eKinKal/src/LoopHelixFit_module.cc index 19b2de5c9d..94249e6cb3 100644 --- a/Mu2eKinKal/src/LoopHelixFit_module.cc +++ b/Mu2eKinKal/src/LoopHelixFit_module.cc @@ -225,6 +225,8 @@ namespace mu2e { } // setup extrapolation if(settings().extrapSettings())extrap_ = make_unique(*settings().extrapSettings()); + // extrapolation runs under the extension config when there is one + if(extrap_) extrap_->checkConfig(exconfig_.schedule().size() > 0 ? exconfig_ : config_); // setup optional fit finalization; this just updates the internals, not the fit result itself if(settings().finalSettings()){ From 0846afe6cf2c75e110952dba6a44920ad024322b Mon Sep 17 00:00:00 2001 From: Rob Mina Date: Tue, 6 Oct 2026 15:30:09 -0500 Subject: [PATCH 4/4] Update doc comment to clarify unbiased DOCA meaning. --- RecoDataProducts/inc/TrkStrawHitSeed.hh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/RecoDataProducts/inc/TrkStrawHitSeed.hh b/RecoDataProducts/inc/TrkStrawHitSeed.hh index dc56783c9c..1a1721506b 100644 --- a/RecoDataProducts/inc/TrkStrawHitSeed.hh +++ b/RecoDataProducts/inc/TrkStrawHitSeed.hh @@ -172,7 +172,7 @@ namespace mu2e { float _stoca =0; // reference sensor time of closest approach (TOCA) float _rdoca, _rdocavar =0; // reference (biased) DOCA from the track to the wire, signed by the angular momentum WRT the wire and the measurement end (and variance) float _rdt, _rtocavar =0; // reference (biased) time difference (and variance) at POCA - float _udoca, _udocavar =0; // unbiaed DOCA (and variance) + float _udoca, _udocavar =0; // unbiased DOCA (and variance) WRT the final fit trajectory; the hit-state updaters (ANNs) used the unbiased DOCA from the previous fit cycle. float _udt, _utocavar =0; //unbiased dt and variance float _rupos =0; // reference POCA position along the straw WRT the straw middle float _uupos =0; // unbiased POCA position along the straw WRT the straw middle