12#include <torch/script.h>
13#include <torch/torch.h>
29 m_trainingMode{false},
30 m_trainingOutputFile{
""},
39 m_rng(static_cast<std::mt19937::result_type>(std::chrono::high_resolution_clock::now().time_since_epoch().count())),
40 m_volumeType{
"dune_fd_hd"}
54 std::cout <<
"VertexAssessmentAlgorithm: Unable to write to ROOT tree" << std::endl;
68 return STATUS_CODE_SUCCESS;
79 std::map<HitType, float> wireMin, wireMax;
80 float driftMin{std::numeric_limits<float>::max()}, driftMax{-std::numeric_limits<float>::max()};
85 if (pCaloHitList->empty())
88 HitType view{pCaloHitList->front()->GetHitType()};
89 float viewDriftMin{driftMin}, viewDriftMax{driftMax};
90 this->
GetHitRegion(*pCaloHitList, viewDriftMin, viewDriftMax, wireMin[view], wireMax[view]);
91 driftMin = std::min(viewDriftMin, driftMin);
92 driftMax = std::max(viewDriftMax, driftMax);
98 if (pCaloHitList->empty())
101 HitType view{pCaloHitList->front()->GetHitType()};
103 if (!(isU || isV || isW))
104 return STATUS_CODE_NOT_ALLOWED;
110 vertices.push_back(mc->GetVertex());
112 if (vertices.empty())
116 const unsigned long nVertices{1};
117 unsigned long nHits{0};
122 const double xVtx{vertex.GetX()};
125 zVtx = transform->
YZtoW(vertex.GetY(), vertex.GetZ());
127 zVtx = transform->YZtoV(vertex.GetY(), vertex.GetZ());
129 zVtx = transform->YZtoU(vertex.GetY(), vertex.GetZ());
132 double xMin{driftMin}, xMax{driftMax}, zMin{wireMin[view]}, zMax{wireMax[view]};
135 if (!(xVtx > (xMin - 1.f) && xVtx < (xMax + 1.f) && zVtx > (zMin - 1.f) && zVtx < (zMax + 1.f)))
139 featureVector.emplace_back(
static_cast<double>(nuance));
140 featureVector.emplace_back(
static_cast<double>(nVertices));
141 featureVector.emplace_back(xVtx);
142 featureVector.emplace_back(zVtx);
144 featureVector.emplace_back(xMin);
145 featureVector.emplace_back(xMax);
146 featureVector.emplace_back(zMin);
147 featureVector.emplace_back(zMax);
149 for (
const CaloHit *pCaloHit : *pCaloHitList)
151 const float x{pCaloHit->GetPositionVector().GetX()}, z{pCaloHit->GetPositionVector().GetZ()}, adc{pCaloHit->GetMipEquivalentEnergy()};
153 if (
m_pass > 1 && (x < xMin || x > xMax || z < zMin || z > zMax))
155 featureVector.emplace_back(
static_cast<double>(x));
156 featureVector.emplace_back(
static_cast<double>(z));
157 featureVector.emplace_back(
static_cast<double>(adc));
160 featureVector.insert(featureVector.begin() + 8,
static_cast<double>(nHits));
166 return STATUS_CODE_SUCCESS;
176 std::map<HitType, float> wireMin, wireMax;
177 float driftMin{std::numeric_limits<float>::max()}, driftMax{-std::numeric_limits<float>::max()};
182 if (pCaloHitList->empty())
185 HitType view{pCaloHitList->front()->GetHitType()};
186 float viewDriftMin{driftMin}, viewDriftMax{driftMax};
187 this->
GetHitRegion(*pCaloHitList, viewDriftMin, viewDriftMax, wireMin[view], wireMax[view]);
188 driftMin = std::min(viewDriftMin, driftMin);
189 driftMax = std::max(viewDriftMax, driftMax);
198 HitType view{pCaloHitList->front()->GetHitType()};
200 if (!isU && !isV && !isW)
201 return STATUS_CODE_NOT_ALLOWED;
205 this->
MakeNetworkInputFromHits(*pCaloHitList, view, driftMin, driftMax, wireMin[view], wireMax[view], input, pixelVector);
209 inputs.push_back(input);
218 int colOffset{0}, rowOffset{0}, canvasWidth{
m_width}, canvasHeight{
m_height};
219 this->
GetCanvasParameters(output, pixelVector, colOffset, rowOffset, canvasWidth, canvasHeight);
221 float **canvas{
new float *[canvasHeight]};
222 for (
int row = 0; row < canvasHeight; ++row)
223 canvas[row] =
new float[canvasWidth]{};
226 auto classes{torch::argmax(output, 1)};
228 auto classesAccessor{classes.accessor<long, 3>()};
230 std::map<int, bool> haveSeenMap;
231 for (
const auto &[row, col] : pixelVector)
233 const auto cls{classesAccessor[0][row][col]};
236 const int inner{
static_cast<int>(std::round(std::ceil(scaleFactor *
m_thresholds[cls - 1])))};
237 const int outer{
static_cast<int>(std::round(std::ceil(scaleFactor *
m_thresholds[cls])))};
238 this->
DrawRing(canvas, row + rowOffset, col + colOffset, inner, outer, 1.f / (outer * outer - inner * inner));
244 canvas, canvasWidth, canvasHeight, colOffset, rowOffset, view, driftMin, driftMax, wireMin[view], wireMax[view], positionVector);
246 vertexCandidatesU.emplace_back(positionVector.front());
248 vertexCandidatesV.emplace_back(positionVector.front());
250 vertexCandidatesW.emplace_back(positionVector.front());
258 float x{0.f}, u{0.f}, v{0.f}, w{0.f};
278 std::cerr <<
"DlVertexingAlgorithm: Warning. Couldn't find true vertex." << std::endl;
280 for (
const auto &pos : positionVector)
282 std::string label{isU ?
"U" : isV ?
"V" :
"W"};
289 for (
int row = 0; row < canvasHeight; ++row)
290 delete[] canvas[row];
295 if (vertexCandidatesU.empty())
297 if (vertexCandidatesV.empty())
299 if (vertexCandidatesW.empty())
301 std::vector<VertexTuple> vertexTuples;
303 if (nEmptyLists == 0)
305 vertexTuples.emplace_back(
VertexTuple(this->
GetPandora(), vertexCandidatesU.front(), vertexCandidatesV.front(), vertexCandidatesW.front()));
307 else if (nEmptyLists == 1)
309 if (vertexCandidatesU.empty())
313 else if (vertexCandidatesV.empty())
324 std::cout <<
"Insufficient 2D vertices to reconstruct a 3D vertex" << std::endl;
325 return STATUS_CODE_NOT_FOUND;
333 if (!vertexTuples.empty())
337 vertexCandidates.emplace_back(vertex);
342 std::cout <<
"Insufficient 2D vertices to reconstruct a 3D vertex" << std::endl;
343 return STATUS_CODE_NOT_FOUND;
351 return STATUS_CODE_SUCCESS;
360 const LArTPC *
const pTPC(this->
GetPandora().GetGeometry()->GetLArTPCMap().begin()->second);
364 std::vector<double> xBinEdges(
m_width + 1);
365 std::vector<double> zBinEdges(
m_height + 1);
368 for (
int i = 1; i <
m_width + 1; ++i)
369 xBinEdges[i] = xBinEdges[i - 1] + dx;
370 zBinEdges[0] = zMin - 0.5f * pitch;
371 const double dz = ((zMax + 0.5f * pitch) - zBinEdges[0]) /
m_height;
372 for (
int i = 1; i <
m_height + 1; ++i)
373 zBinEdges[i] = zBinEdges[i - 1] + dz;
376 auto accessor = networkInput.accessor<float, 4>();
378 for (
const CaloHit *pCaloHit : caloHits)
380 const float x{pCaloHit->GetPositionVector().GetX()};
381 const float z{pCaloHit->GetPositionVector().GetZ()};
384 if (x < xMin || x > xMax || z < zMin || z > zMax)
387 const float adc{pCaloHit->GetMipEquivalentEnergy()};
388 const int pixelX{
static_cast<int>(std::floor((x - xBinEdges[0]) / dx))};
389 const int pixelZ{
static_cast<int>(std::floor((z - zBinEdges[0]) / dz))};
390 accessor[0][0][pixelZ][pixelX] += adc;
392 for (
int row = 0; row <
m_height; ++row)
394 for (
int col = 0; col <
m_width; ++col)
396 const float value{accessor[0][0][row][col]};
398 pixelVector.emplace_back(std::make_pair(row, col));
402 return STATUS_CODE_SUCCESS;
408 const int columnOffset,
const int rowOffset,
const HitType view,
const float xMin,
const float xMax,
const float zMin,
const float zMax,
412 const LArTPC *
const pTPC(this->
GetPandora().GetGeometry()->GetLArTPCMap().begin()->second);
416 const double dz = ((zMax + 0.5f * pitch) - (zMin - 0.5f * pitch)) /
m_height;
419 int rowBest{0}, colBest{0};
420 for (
int row = 0; row < canvasHeight; ++row)
421 for (
int col = 0; col < canvasWidth; ++col)
422 if (canvas[row][col] > 0 && canvas[row][col] > best)
424 best = canvas[row][col];
429 const float x{
static_cast<float>((colBest - columnOffset) * dx + xMin)};
430 const float z{
static_cast<float>((rowBest - rowOffset) * dz + zMin)};
433 positionVector.emplace_back(pt);
435 return STATUS_CODE_SUCCESS;
441 int &colOffset,
int &rowOffset,
int &width,
int &height)
const
446 auto classes{torch::argmax(networkOutput, 1)};
448 auto classesAccessor{classes.accessor<long, 3>()};
449 int colOffsetMin{0}, colOffsetMax{0}, rowOffsetMin{0}, rowOffsetMax{0};
450 for (
const auto &[row, col] : pixelVector)
452 const auto cls{classesAccessor[0][row][col]};
454 if (threshold > 0. && threshold < 1.)
456 const int distance =
static_cast<int>(std::round(std::ceil(scaleFactor * threshold)));
457 if ((row - distance) < rowOffsetMin)
458 rowOffsetMin = row - distance;
459 if ((row + distance) > rowOffsetMax)
460 rowOffsetMax = row + distance;
461 if ((col - distance) < colOffsetMin)
462 colOffsetMin = col - distance;
463 if ((col + distance) > colOffsetMax)
464 colOffsetMax = col + distance;
467 colOffset = colOffsetMin < 0 ? -colOffsetMin : 0;
468 rowOffset = rowOffsetMin < 0 ? -rowOffsetMin : 0;
469 width = std::max(colOffsetMax + colOffset + 1,
m_width);
470 height = std::max(rowOffsetMax + rowOffset + 1,
m_height);
478 int c1{inner}, r1{0}, c2{outer}, r2{0};
479 int inner2{inner * inner}, outer2{outer * outer};
483 int rp2{r2}, cp2{c2};
492 for (
int c = cp1; c <= cp2; ++c)
494 canvas[row + rp2][col + c] += weight;
496 canvas[row + c][col + rp2] += weight;
497 if (rp2 != 0 && cp2 != 0)
499 canvas[row - rp2][col - c] += weight;
501 canvas[row - c][col - rp2] += weight;
505 canvas[row - rp2][col + c] += weight;
507 canvas[row + c][col - rp2] += weight;
511 canvas[row + rp2][col - c] += weight;
513 canvas[row - c][col + rp2] += weight;
519 this->
Update(inner2, c1, r1);
521 this->
Update(outer2, c2, r2);
531 const int a{1 - (col << 2)};
532 const int b{col * col + row * row - radius2 + (row << 2) + 1};
533 const int c{(a << 2) * b + a * a};
557 return STATUS_CODE_SUCCESS;
566 for (
const auto &[mc, hits] : mcToHitsMap)
569 mcHierarchy.push_back(mc);
580 std::find_if(mcHierarchy.begin(), mcHierarchy.end(), [](
const MCParticle *mc) ->
bool { return LArMCParticleHelper::IsNeutrino(mc); });
582 if (pivot != mcHierarchy.end())
583 std::rotate(mcHierarchy.begin(), pivot, std::next(pivot));
585 return STATUS_CODE_NOT_FOUND;
587 return STATUS_CODE_SUCCESS;
594 xMin = std::numeric_limits<float>::max();
595 xMax = -std::numeric_limits<float>::max();
596 zMin = std::numeric_limits<float>::max();
597 zMax = -std::numeric_limits<float>::max();
599 for (
const CaloHit *pCaloHit : caloHitList)
601 const float x{pCaloHit->GetPositionVector().GetX()};
602 const float z{pCaloHit->GetPositionVector().GetZ()};
603 xMin = std::min(x, xMin);
604 xMax = std::max(x, xMax);
605 zMin = std::min(z, zMin);
606 zMax = std::max(z, zMax);
609 if (caloHitList.empty())
612 const HitType view{caloHitList.front()->GetHitType()};
614 if (!(isU || isV || isW))
618 const LArTPC *
const pTPC(this->
GetPandora().GetGeometry()->GetLArTPCMap().begin()->second);
625 if (pVertexList->empty())
630 int nHitsLeft{0}, nHitsRight{0};
631 const double xVtx{vertex.
GetX()};
636 if (pCaloHitList->empty())
638 for (
const CaloHit *
const pCaloHit : *pCaloHitList)
641 if (pos.GetX() <= xVtx)
647 const int nHitsTotal{nHitsLeft + nHitsRight};
650 const float xAsymmetry{nHitsLeft /
static_cast<float>(nHitsTotal)};
656 zVtx += transform->
YZtoW(vertex.GetY(), vertex.GetZ());
658 zVtx += transform->YZtoV(vertex.GetY(), vertex.GetZ());
660 zVtx = transform->YZtoU(vertex.GetY(), vertex.GetZ());
663 int nHitsUpstream{0}, nHitsDownstream{0};
664 for (
const CaloHit *
const pCaloHit : caloHitList)
667 if (pos.GetZ() <= zVtx)
672 const int nHitsViewTotal{nHitsUpstream + nHitsDownstream};
673 if (nHitsViewTotal == 0)
675 const float zAsymmetry{nHitsUpstream /
static_cast<float>(nHitsViewTotal)};
678 xMin = xVtx - xAsymmetry * xSpan;
680 const float zSpan{pitch * (
m_height - 1)};
681 zMin = zVtx - zAsymmetry * zSpan;
688 const float xRange{xMax - xMin}, zRange{zMax - zMin};
690 if (xRange < minXSpan)
692 const float padding{0.5f * (minXSpan - xRange)};
696 const float minZSpan{pitch * (
m_height - 1)};
697 if (zRange < minZSpan)
699 const float padding{0.5f * (minZSpan - zRange)};
710 std::string temporaryListName;
715 PandoraContentApi::Vertex::Parameters parameters;
716 parameters.m_position = position;
720 const Vertex *pVertex(
nullptr);
726 return STATUS_CODE_SUCCESS;
734 x = trueVertex.
GetX();
735 y = trueVertex.GetY();
736 z = trueVertex.GetZ();
745 x = trueVertex.GetX();
746 u =
static_cast<float>(transform->YZtoU(trueVertex.GetY(), trueVertex.GetZ()));
747 v =
static_cast<float>(transform->YZtoV(trueVertex.GetY(), trueVertex.GetZ()));
748 w =
static_cast<float>(transform->YZtoW(trueVertex.GetY(), trueVertex.GetZ()));
760 if (!primaries.empty())
764 if (parents.size() == 1)
766 const MCParticle *trueNeutrino{parents.front()};
777void DlVertexingAlgorithm::PopulateRootTree(
const std::vector<VertexTuple> &vertexTuples,
const pandora::CartesianPointVector &vertexCandidatesU,
790 if (!primaries.empty())
794 if (parents.size() == 1)
796 const MCParticle *trueNeutrino{parents.front()};
804 const float tx{trueVertex.
GetX()};
805 const float tu{
static_cast<float>(transform->YZtoU(trueVertex.GetY(), trueVertex.GetZ()))};
806 const float tv{
static_cast<float>(transform->YZtoV(trueVertex.GetY(), trueVertex.GetZ()))};
807 const float tw{
static_cast<float>(transform->YZtoW(trueVertex.GetY(), trueVertex.GetZ()))};
808 const float rx_u{vertexCandidatesU.front().GetX()};
809 const float ru{vertexCandidatesU.front().GetZ()};
810 const float rx_v{vertexCandidatesV.front().GetX()};
811 const float rv{vertexCandidatesV.front().GetZ()};
812 const float rx_w{vertexCandidatesW.front().GetX()};
813 const float rw{vertexCandidatesW.front().GetZ()};
814 const float dr_u{std::sqrt((rx_u - tx) * (rx_u - tx) + (ru - tu) * (ru - tu))};
815 const float dr_v{std::sqrt((rx_v - tx) * (rx_v - tx) + (rv - tv) * (rv - tv))};
816 const float dr_w{std::sqrt((rx_w - tx) * (rx_w - tx) + (rw - tw) * (rw - tw))};
819 const float dx{dv.GetX()}, dy{dv.GetY()}, dz{dv.GetZ()};
863 std::string modelName;
886 return STATUS_CODE_SUCCESS;
894 m_pos{0.f, 0.f, 0.f},
936 m_pos{0.f, 0.f, 0.f},
961 const float x{m_pos.
GetX()}, y{m_pos.GetY()}, z{m_pos.GetZ()};
962 return "3D pos: (" + std::to_string(x) +
", " + std::to_string(y) +
", " + std::to_string(z) +
") X2 = " + std::to_string(m_chi2);
Header file for the file helper class.
Header file for the geometry helper class.
Header file for the vertex helper class.
#define PANDORA_THROW_RESULT_IF(StatusCode1, Operator, Command)
#define PANDORA_RETURN_RESULT_IF_AND_IF(StatusCode1, StatusCode2, Operator, Command)
#define PANDORA_RETURN_RESULT_IF(StatusCode1, Operator, Command)
static pandora::StatusCode ReplaceCurrentList(const pandora::Algorithm &algorithm, const std::string &newListName)
Replace the current list with a pre-saved list; use this new list as a permanent replacement for the ...
static pandora::StatusCode CreateTemporaryListAndSetCurrent(const pandora::Algorithm &algorithm, const T *&pT, std::string &temporaryListName)
Create a temporary list and set it to be the current list, enabling object creation.
static pandora::StatusCode GetCurrentList(const pandora::Algorithm &algorithm, const T *&pT)
Get the current list.
static pandora::StatusCode GetList(const pandora::Algorithm &algorithm, const std::string &listName, const T *&pT)
Get a named list.
static std::string FindFileInPath(const std::string &unqualifiedFileName, const std::string &environmentVariable, const std::string &delimiter=":")
Find the fully-qualified file name by searching through a list of delimiter-separated paths in a name...
static void MergeTwoPositions3D(const pandora::Pandora &pandora, const pandora::HitType view1, const pandora::HitType view2, const pandora::CartesianVector &position1, const pandora::CartesianVector &position2, pandora::CartesianVector &position3D, float &chiSquared)
Merge 2D positions from two views to give unified 3D position.
static void MergeThreePositions3D(const pandora::Pandora &pandora, const pandora::HitType view1, const pandora::HitType view2, const pandora::HitType view3, const pandora::CartesianVector &position1, const pandora::CartesianVector &position2, const pandora::CartesianVector &position3, pandora::CartesianVector &position3D, float &chiSquared)
Merge 2D positions from three views to give unified 3D position.
float m_maxPhotonPropagation
the maximum photon propagation length
static void GetAllAncestorMCParticles(const pandora::MCParticle *const pMCParticle, pandora::MCParticleList &ancestorMCParticleList)
Get all ancestor mc particles.
static void GetPrimaryMCParticleList(const pandora::MCParticleList *const pMCParticleList, pandora::MCParticleVector &mcPrimaryVector)
Get vector of primary MC particles from an input list of MC particles.
static bool IsNeutrino(const pandora::MCParticle *const pMCParticle)
Whether a mc particle is a neutrino or antineutrino.
static void SelectReconstructableMCParticles(const pandora::MCParticleList *pMCParticleList, const pandora::CaloHitList *pCaloHitList, const PrimaryParameters ¶meters, std::function< bool(const pandora::MCParticle *const)> fCriteria, MCContributionMap &selectedMCParticlesToHitsMap)
Select target, reconstructable mc particles that match given criteria.
std::unordered_map< const pandora::MCParticle *, pandora::CaloHitList > MCContributionMap
static unsigned int GetNuanceCode(const pandora::MCParticle *const pMCParticle)
Get the nuance code of an MCParticle.
static bool IsBeamNeutrinoFinalState(const pandora::MCParticle *const pMCParticle)
Returns true if passed a primary neutrino final state MCParticle.
MvaTypes::MvaFeatureVector MvaFeatureVector
static pandora::StatusCode ProduceTrainingExample(const std::string &trainingOutputFile, const bool result, TCONTAINER &&featureContainer)
Produce a training example with the given features and result.
static bool IsInFiducialVolume(const pandora::Pandora &pandora, const pandora::CartesianVector &vertex, const std::string &detector)
Determine if a vertex is within a detector's fiducial volume. This throws a STATUS_CODE_INVALID_PARAM...
std::string ToString() const
const pandora::CartesianVector & GetPosition() const
pandora::CartesianVector m_pos
Calculated 3D position.
float m_chi2
Chi squared of calculated position.
VertexTuple(const pandora::Pandora &pandora, const pandora::CartesianVector &vertexU, const pandora::CartesianVector &vertexV, const pandora::CartesianVector &vertexW)
pandora::StatusCode Run()
Run the algorithm.
void DrawRing(float **canvas, const int row, const int col, const int inner, const int outer, const float weight) const
Add a filled ring to the specified canvas. The ring has an inner radius based on the minimum predicte...
pandora::StatusCode PrepareTrainingSample()
bool m_trainingMode
Training mode.
int m_width
The width of the images.
pandora::StatusCode Infer()
pandora::StatusCode MakeCandidateVertexList(const pandora::CartesianPointVector &positions)
Create a vertex list from the candidate vertices.
const pandora::CartesianVector & GetTrueVertex() const
Retrieve the true neutrino vertex.
LArDLHelper::TorchModel m_modelW
The model for the W view.
bool m_visualise
Whether or not to visualise the candidate vertices.
virtual ~DlVertexingAlgorithm()
std::string m_outputVertexListName
Output vertex list name.
std::string m_rootTreeName
The ROOT tree name.
pandora::StatusCode ReadSettings(const pandora::TiXmlHandle xmlHandle)
Read the algorithm settings.
int m_pass
The pass of the train/infer step.
pandora::StatusCode MakeWirePlaneCoordinatesFromCanvas(float **canvas, const int canvasWidth, const int canvasHeight, const int columnOffset, const int rowOffset, const pandora::HitType view, const float xMin, const float xMax, const float zMin, const float zMax, pandora::CartesianPointVector &positionVector) const
DlVertexingAlgorithm()
Default constructor.
LArDLHelper::TorchModel m_modelV
The model for the V view.
pandora::StatusCode MakeNetworkInputFromHits(const pandora::CaloHitList &caloHits, const pandora::HitType view, const float xMin, const float xMax, const float zMin, const float zMax, LArDLHelper::TorchInput &networkInput, PixelVector &pixelVector) const
int m_nClasses
The number of distance classes.
float m_driftStep
The size of a pixel in the drift direction in cm (most relevant in pass 2)
std::string m_inputVertexListName
Input vertex list name if 2nd pass.
LArDLHelper::TorchModel m_modelU
The model for the U view.
std::string m_trainingOutputFile
Output file name for training examples.
pandora::StatusCode GetMCToHitsMap(LArMCParticleHelper::MCContributionMap &mcToHitsMap) const
bool m_writeTree
Whether or not to write validation details to a ROOT tree.
void Update(const int radius, int &col, int &row) const
Update the coordinates along the loci of a circle. When drawing the ring we need an efficient means t...
int m_height
The height of the images.
pandora::StringVector m_caloHitListNames
Names of input calo hit lists.
std::string m_volumeType
The name of the fiducial volume type for the monitoring output.
void GetHitRegion(const pandora::CaloHitList &caloHitList, float &xMin, float &xMax, float &zMin, float &zMax) const
std::vector< Pixel > PixelVector
void GetCanvasParameters(const LArDLHelper::TorchOutput &networkOutput, const PixelVector &pixelVector, int &columnOffset, int &rowOffset, int &width, int &height) const
Determines the parameters of the canvas for extracting the vertex location. The network predicts the ...
void GetTrueVertexPosition(float &x, float &y, float &z) const
Retrieve the true neutrino vertex position.
std::string m_rootFileName
The ROOT file name.
std::vector< double > m_thresholds
Distance class thresholds.
int m_event
The current event number.
pandora::StatusCode CompleteMCHierarchy(const LArMCParticleHelper::MCContributionMap &mcToHitsMap, pandora::MCParticleList &mcHierarchy) const
static void InitialiseInput(const at::IntArrayRef dimensions, TorchInput &tensor)
Create a torch input tensor.
std::vector< torch::jit::IValue > TorchInputVector
static pandora::StatusCode LoadModel(const std::string &filename, TorchModel &model)
Loads a deep learning model.
static void Forward(TorchModel &model, const TorchInputVector &input, TorchOutput &output)
Run a deep learning model.
float GetX() const
Get the cartesian x coordinate.
float GetZ() const
Get the cartesian z coordinate.
float GetMagnitude() const
Get the magnitude.
float GetY() const
Get the cartesian y coordinate.
float GetWirePitchU() const
Get the u wire pitch, units mm.
float GetWirePitchV() const
Get the v wire pitch, units mm.
float GetWirePitchW() const
Get the w wire pitch, units mm.
const CartesianVector & GetVertex() const
Get the production vertex of the mc particle, units mm.
const MCParticleList & GetParentList() const
Get list of parents of mc particle.
const PluginManager * GetPlugins() const
Get the pandora plugin instance, providing access to user registered functions and calculators.
const LArTransformationPlugin * GetLArTransformationPlugin() const
Get the address of the lar transformation plugin.
const Pandora & GetPandora() const
Get the associated pandora instance.
StatusCodeException class.
StatusCode GetStatusCode() const
Get status code.
static StatusCode ReadVectorOfValues(const TiXmlHandle &xmlHandle, const std::string &xmlElementName, std::vector< T > &vector)
Read a vector of values from a (space separated) list in an xml element.
static StatusCode ReadValue(const TiXmlHandle &xmlHandle, const std::string &xmlElementName, T &t)
Read a value from an xml element.
HitType
Calorimeter hit type enum.
MANAGED_CONTAINER< const MCParticle * > MCParticleList
std::vector< CartesianVector > CartesianPointVector
MANAGED_CONTAINER< const CaloHit * > CaloHitList
std::vector< const MCParticle * > MCParticleVector
MANAGED_CONTAINER< const Vertex * > VertexList
StatusCode
The StatusCode enum.