From a192076842c2d234f20919a476e8d4eec2cdec1b Mon Sep 17 00:00:00 2001 From: Andrew Edmonds Date: Tue, 30 Jun 2026 11:28:23 -0500 Subject: [PATCH] Add TrkQual BDT to art module --- TrkDiag/data/TrkQual_BDT1_v2.0.ubj | Bin 0 -> 446765 bytes TrkDiag/src/SConscript | 3 +- TrkDiag/src/TrackQuality_module.cc | 77 ++++++++++++++++++++++++----- 3 files changed, 68 insertions(+), 12 deletions(-) create mode 100644 TrkDiag/data/TrkQual_BDT1_v2.0.ubj diff --git a/TrkDiag/data/TrkQual_BDT1_v2.0.ubj b/TrkDiag/data/TrkQual_BDT1_v2.0.ubj new file mode 100644 index 0000000000000000000000000000000000000000..699871af29df8404c8e86b1bfe4379ccc5506bb1 GIT binary patch literal 446765 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 Ym=hb$9sS#fA0;XtP%J<{z+m+M0SWSR2LJ#7 literal 0 HcmV?d00001 diff --git a/TrkDiag/src/SConscript b/TrkDiag/src/SConscript index efb348f..7d02d04 100644 --- a/TrkDiag/src/SConscript +++ b/TrkDiag/src/SConscript @@ -103,7 +103,8 @@ helper.make_plugins( [ 'TMVA', 'ROOTTMVASofie', 'pthread', - 'onnxruntime' + 'onnxruntime', + 'xgboost' ] ) helper.make_dict_and_map( [ diff --git a/TrkDiag/src/TrackQuality_module.cc b/TrkDiag/src/TrackQuality_module.cc index b1cf2eb..6fafdce 100644 --- a/TrkDiag/src/TrackQuality_module.cc +++ b/TrkDiag/src/TrackQuality_module.cc @@ -23,6 +23,8 @@ #include "Offline/RecoDataProducts/inc/MVAResult.hh" // ONNXRuntime #include "onnxruntime/onnxruntime_cxx_api.h" +// XGBoost +#include // C++ #include #include @@ -47,6 +49,7 @@ namespace mu2e fhicl::Atom kalSeedPtrTag{Name("KalSeedPtrCollection"), Comment("Input tag for KalSeedPtrCollection")}; fhicl::Atom printMVA{Name("PrintMVA"), Comment("Print the MVA used"), false}; fhicl::Atom onnxFilename{Name("onnxFilename"), Comment("Filename for the .onnx file to use")}; + fhicl::Atom xgbFileName{Name("xgbFilename"), Comment("Path to XGBoost .ubj model file")}; fhicl::Atom debug{Name("debugLevel"), Comment("Debug printout level"), 0}; }; @@ -63,6 +66,7 @@ namespace mu2e ConfigFileLookupPolicy _configFileLookup; + // for the ANN Ort::Env _env; Ort::SessionOptions _session_options; Ort::Session _session; @@ -74,6 +78,11 @@ namespace mu2e size_t _total_size; Ort::MemoryInfo _memory_info; Ort::AllocatedStringPtr _output_name; + + // for the BDT + BoosterHandle _booster; // Booster object + // Number of features is fixed, must match training! + static constexpr size_t _nFeatures = 7; }; TrackQuality::TrackQuality(const Parameters& conf) : @@ -91,7 +100,8 @@ namespace mu2e _memory_info(Ort::MemoryInfo::CreateCpu(OrtArenaAllocator, OrtMemTypeDefault)), _output_name(_session.GetOutputNameAllocated(0, _allocator)) { - produces(); + produces("ANN"); + produces("BDT"); // Handle dynamic dimensions if needed for (auto& dim : _input_shape) { @@ -103,11 +113,29 @@ namespace mu2e for (auto dim : _input_shape) { _total_size *= dim; } + + // Load XGBoost model + if (XGBoosterCreate(nullptr, 0, &_booster) != 0) { + throw std::runtime_error(std::string("XGBoosterCreate failed: ") + XGBGetLastError()); + } + + std::string modelPath = ConfigFileLookupPolicy()(conf().xgbFileName()); + if (XGBoosterLoadModel(_booster, modelPath.c_str()) != 0) { + throw std::runtime_error(std::string("XGBoosterLoadModel failed: ") + XGBGetLastError()); + } + + // verify the loaded model matches the expected feature count + bst_ulong nFeaturesModel = 0; + if (XGBoosterGetNumFeature(_booster, &nFeaturesModel) != 0) { + throw std::runtime_error(std::string("XGBoosterGetNumFeature failed: ") + XGBGetLastError()); + } + } void TrackQuality::produce(art::Event& event ) { // create output - unique_ptr mvacol(new MVAResultCollection()); + unique_ptr anncol(new MVAResultCollection()); + unique_ptr bdtcol(new MVAResultCollection()); // get the KalSeedPtrs art::Handle kalSeedPtrHandle; @@ -186,7 +214,7 @@ namespace mu2e _input_shape.data(), _input_shape.size() ); - // Run inference + // Run ANN inference const char* input_names[] = {_input_name.get()}; const char* output_names[] = {_output_name.get()}; auto output_tensors = _session.Run( @@ -198,28 +226,55 @@ namespace mu2e 1 ); // Get output - float* mvaout = output_tensors[0].GetTensorMutableData(); + float* annout = output_tensors[0].GetTensorMutableData(); if (!entrance_found) { - mvaout[0] = 0; // this is not a good track + annout[0] = 0; // this is not a good track } + // run XGBoost inference + // See reference in preamble comments... + float bdt_score = 0.0f; + DMatrixHandle dmat; + if (XGDMatrixCreateFromMat(features.data(), 1, _nFeatures, NAN, &dmat) != 0) { // use same features vector + throw std::runtime_error(std::string("XGDMatrixCreateFromMat failed: ") + XGBGetLastError()); + } + + bst_ulong out_len = 0; + const float* out_result = nullptr; + if (XGBoosterPredict(_booster, dmat, 0, 0, 0, &out_len, &out_result) != 0) { + XGDMatrixFree(dmat); + throw std::runtime_error(std::string("XGBoosterPredict failed: ") + XGBGetLastError()); + } + if (out_len < 1 || out_result == nullptr) { + XGDMatrixFree(dmat); + throw std::runtime_error("XGBoosterPredict returned no result"); + } + + bdt_score = out_result[0]; + if (XGDMatrixFree(dmat) != 0) { + throw std::runtime_error(std::string("XGDMatrixFree failed: ") + XGBGetLastError()); + } + + if(_debug > 0) { - printf("[TrackQuality::%s::%s] Inputs = %.0f, %.4f, %.4f, %.4f, %.4f, %.4f %.4f --> output = %.4f\n", + printf("[TrackQuality::%s::%s] Inputs = %.0f, %.4f, %.4f, %.4f, %.4f, %.4f %.4f --> ANN output = %.4fm BDT output = %.4fm\n", __func__, moduleDescription().moduleLabel().c_str(), - features[0], features[1], features[2], features[3], features[4], features[5], features[6], mvaout[0]); + features[0], features[1], features[2], features[3], features[4], features[5], features[6], annout[0], bdt_score); } - mvacol->push_back(MVAResult(mvaout[0])); + anncol->push_back(MVAResult(annout[0])); + bdtcol->push_back(MVAResult(bdt_score)); } - if ( (mvacol->size() != kalSeedPtrs.size()) ) { - throw cet::exception("TrackQuality") << "KalSeedPtr and MVAResult sizes are inconsistent (" << kalSeedPtrs.size() << ", " << mvacol->size(); + if ( (anncol->size() != kalSeedPtrs.size()) ) { + throw cet::exception("TrackQuality") << "KalSeedPtr and MVAResult sizes are inconsistent (" << kalSeedPtrs.size() << ", " << anncol->size(); } // put the output products into the event - event.put(move(mvacol)); + event.put(move(anncol), "ANN"); + event.put(move(bdtcol), "BDT"); } }// mu2e