Skip to content

Commit 09afe4f

Browse files
authored
[EventFiltering] Automatically deal with models that need float and double precision in input (#1068)
* Automatically deal with models that need float and double precision in input
1 parent 87bf08d commit 09afe4f

1 file changed

Lines changed: 22 additions & 3 deletions

File tree

EventFiltering/PWGHF/HFFilter.cxx

Lines changed: 22 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -327,6 +327,7 @@ struct HfFilter { // Main struct for HF triggers
327327
std::array<std::vector<std::vector<int64_t>>, kNCharmParticles> outputShapesML{};
328328
std::array<std::shared_ptr<Ort::Experimental::Session>, kNCharmParticles> sessionML = {nullptr, nullptr, nullptr, nullptr, nullptr};
329329
std::array<Ort::SessionOptions, kNCharmParticles> sessionOptions{};
330+
std::array<int, kNCharmParticles> dataTypeML{};
330331
std::array<Ort::Env, kNCharmParticles> env = {
331332
Ort::Env{ORT_LOGGING_LEVEL_WARNING, "ml-model-d0-triggers"},
332333
Ort::Env{ORT_LOGGING_LEVEL_WARNING, "ml-model-dplus-triggers"},
@@ -392,6 +393,10 @@ struct HfFilter { // Main struct for HF triggers
392393
}
393394
outputNamesML[iCharmPart] = sessionML[iCharmPart]->GetOutputNames();
394395
outputShapesML[iCharmPart] = sessionML[iCharmPart]->GetOutputShapes();
396+
397+
Ort::TypeInfo typeInfo = sessionML[iCharmPart]->GetInputTypeInfo(0);
398+
auto tensorInfo = typeInfo.GetTensorTypeAndShapeInfo();
399+
dataTypeML[iCharmPart] = tensorInfo.GetElementType();
395400
}
396401
}
397402
}
@@ -698,9 +703,16 @@ struct HfFilter { // Main struct for HF triggers
698703
// apply ML models
699704
if (applyML && onnxFiles[kD0] != "") {
700705
// TODO: add more feature configurations
701-
std::vector<float> inputFeaturesD0{trackPos.pt(), trackPos.dcaXY(), trackPos.dcaZ(), trackNeg.pt(), trackNeg.dcaXY(), trackNeg.dcaZ()};
702706
std::vector<Ort::Value> inputTensorD0;
703-
inputTensorD0.push_back(Ort::Experimental::Value::CreateTensor<float>(inputFeaturesD0.data(), inputFeaturesD0.size(), inputShapesML[kD0][0]));
707+
std::vector<float> inputFeaturesD0{trackPos.pt(), trackPos.dcaXY(), trackPos.dcaZ(), trackNeg.pt(), trackNeg.dcaXY(), trackNeg.dcaZ()};
708+
std::vector<double> inputFeaturesDoD0{trackPos.pt(), trackPos.dcaXY(), trackPos.dcaZ(), trackNeg.pt(), trackNeg.dcaXY(), trackNeg.dcaZ()};
709+
if (dataTypeML[kD0] == 1) {
710+
inputTensorD0.push_back(Ort::Experimental::Value::CreateTensor<float>(inputFeaturesD0.data(), inputFeaturesD0.size(), inputShapesML[kD0][0]));
711+
} else if (dataTypeML[kD0] == 11) {
712+
inputTensorD0.push_back(Ort::Experimental::Value::CreateTensor<double>(inputFeaturesDoD0.data(), inputFeaturesDoD0.size(), inputShapesML[kD0][0]));
713+
} else {
714+
LOG(fatal) << "Error running model inference: Unexpected input data type.";
715+
}
704716

705717
// double-check the dimensions of the input tensor
706718
if (inputTensorD0[0].GetTensorTypeAndShapeInfo().GetShape()[0] > 0) { // vectorial models can have negative shape if the shape is unknown
@@ -826,9 +838,16 @@ struct HfFilter { // Main struct for HF triggers
826838
if (applyML) {
827839
// TODO: add more feature configurations
828840
std::vector<float> inputFeatures{trackFirst.pt(), trackFirst.dcaXY(), trackFirst.dcaZ(), trackSecond.pt(), trackSecond.dcaXY(), trackSecond.dcaZ(), trackThird.pt(), trackThird.dcaXY(), trackThird.dcaZ()};
841+
std::vector<double> inputFeaturesD{trackFirst.pt(), trackFirst.dcaXY(), trackFirst.dcaZ(), trackSecond.pt(), trackSecond.dcaXY(), trackSecond.dcaZ(), trackThird.pt(), trackThird.dcaXY(), trackThird.dcaZ()};
829842
for (auto iCharmPart{0}; (iCharmPart < kNCharmParticles - 1) && is3Prong[iCharmPart] && onnxFiles[iCharmPart + 1] != ""; ++iCharmPart) {
830843
std::vector<Ort::Value> inputTensor;
831-
inputTensor.push_back(Ort::Experimental::Value::CreateTensor<float>(inputFeatures.data(), inputFeatures.size(), inputShapesML[iCharmPart + 1][0]));
844+
if (dataTypeML[iCharmPart + 1] == 1) {
845+
inputTensor.push_back(Ort::Experimental::Value::CreateTensor<float>(inputFeatures.data(), inputFeatures.size(), inputShapesML[iCharmPart + 1][0]));
846+
} else if (dataTypeML[iCharmPart + 1] == 11) {
847+
inputTensor.push_back(Ort::Experimental::Value::CreateTensor<double>(inputFeaturesD.data(), inputFeaturesD.size(), inputShapesML[iCharmPart + 1][0]));
848+
} else {
849+
LOG(error) << "Error running model inference: Unexpected input data type.";
850+
}
832851

833852
// double-check the dimensions of the input tensor
834853
if (inputTensor[0].GetTensorTypeAndShapeInfo().GetShape()[0] > 0) { // vectorial models can have negative shape if the shape is unknown

0 commit comments

Comments
 (0)