9 #include "Managers/GeometryManager.h" 
   10 #include "Managers/PluginManager.h" 
   12 #include "Geometry/DetectorGap.h" 
   13 #include "Geometry/LArTPC.h" 
   15 #include "Objects/CartesianVector.h" 
   17 #include "Pandora/Pandora.h" 
   24 #include "Plugins/LArTransformationPlugin.h" 
   31 float LArGeometryHelper::MergeTwoPositions(
const Pandora &
pandora, 
const HitType view1, 
const HitType view2, 
const float position1, 
const float position2)
 
   34         throw StatusCodeException(STATUS_CODE_INVALID_PARAMETER);
 
   36     if ((view1 == TPC_VIEW_U) && (view2 == TPC_VIEW_V))
 
   38         return pandora.GetPlugins()->GetLArTransformationPlugin()->UVtoW(position1, position2);
 
   41     if ((view1 == TPC_VIEW_V) && (view2 == TPC_VIEW_U))
 
   43         return pandora.GetPlugins()->GetLArTransformationPlugin()->UVtoW(position2, position1);
 
   46     if ((view1 == TPC_VIEW_W) && (view2 == TPC_VIEW_U))
 
   48         return pandora.GetPlugins()->GetLArTransformationPlugin()->WUtoV(position1, position2);
 
   51     if ((view1 == TPC_VIEW_U) && (view2 == TPC_VIEW_W))
 
   53         return pandora.GetPlugins()->GetLArTransformationPlugin()->WUtoV(position2, position1);
 
   56     if ((view1 == TPC_VIEW_V) && (view2 == TPC_VIEW_W))
 
   58         return pandora.GetPlugins()->GetLArTransformationPlugin()->VWtoU(position1, position2);
 
   61     if ((view1 == TPC_VIEW_W) && (view2 == TPC_VIEW_V))
 
   63         return pandora.GetPlugins()->GetLArTransformationPlugin()->VWtoU(position2, position1);
 
   66     throw StatusCodeException(STATUS_CODE_INVALID_PARAMETER);
 
   71 CartesianVector LArGeometryHelper::MergeTwoDirections(
 
   72     const Pandora &pandora, 
const HitType view1, 
const HitType view2, 
const CartesianVector &direction1, 
const CartesianVector &direction2)
 
   75     if (direction1.GetX() * direction2.GetX() < 0.f)
 
   76         throw StatusCodeException(STATUS_CODE_INVALID_PARAMETER);
 
   79     const float s1((std::fabs(direction1.GetX()) > std::numeric_limits<float>::epsilon()) ? 100.f * std::fabs(direction2.GetX()) : 1.f);
 
   80     const float s2((std::fabs(direction2.GetX()) > std::numeric_limits<float>::epsilon()) ? 100.f * std::fabs(direction1.GetX()) : 1.f);
 
   82     float pX(s1 * direction1.GetX()), pU(0.f), pV(0.f), pW(0.f);
 
   83     HitType newView(HIT_CUSTOM);
 
   85     if ((view1 == TPC_VIEW_U) && (view2 == TPC_VIEW_V))
 
   87         pU = s1 * direction1.GetZ();
 
   88         pV = s2 * direction2.GetZ();
 
   92     if ((view1 == TPC_VIEW_V) && (view2 == TPC_VIEW_U))
 
   94         pV = s1 * direction1.GetZ();
 
   95         pU = s2 * direction2.GetZ();
 
   99     if ((view1 == TPC_VIEW_W) && (view2 == TPC_VIEW_U))
 
  101         pW = s1 * direction1.GetZ();
 
  102         pU = s2 * direction2.GetZ();
 
  103         newView = TPC_VIEW_V;
 
  106     if ((view1 == TPC_VIEW_U) && (view2 == TPC_VIEW_W))
 
  108         pU = s1 * direction1.GetZ();
 
  109         pW = s2 * direction2.GetZ();
 
  110         newView = TPC_VIEW_V;
 
  113     if ((view1 == TPC_VIEW_V) && (view2 == TPC_VIEW_W))
 
  115         pV = s1 * direction1.GetZ();
 
  116         pW = s2 * direction2.GetZ();
 
  117         newView = TPC_VIEW_U;
 
  120     if ((view1 == TPC_VIEW_W) && (view2 == TPC_VIEW_V))
 
  122         pW = s1 * direction1.GetZ();
 
  123         pV = s2 * direction2.GetZ();
 
  124         newView = TPC_VIEW_U;
 
  127     if (newView == TPC_VIEW_W)
 
  128         return CartesianVector(pX, 0.f, pandora.GetPlugins()->GetLArTransformationPlugin()->UVtoW(pU, pV)).GetUnitVector();
 
  130     if (newView == TPC_VIEW_U)
 
  131         return CartesianVector(pX, 0.f, pandora.GetPlugins()->GetLArTransformationPlugin()->VWtoU(pV, pW)).GetUnitVector();
 
  133     if (newView == TPC_VIEW_V)
 
  134         return CartesianVector(pX, 0.f, pandora.GetPlugins()->GetLArTransformationPlugin()->WUtoV(pW, pU)).GetUnitVector();
 
  136     throw StatusCodeException(STATUS_CODE_INVALID_PARAMETER);
 
  141 void LArGeometryHelper::MergeTwoPositions(
const Pandora &pandora, 
const HitType view1, 
const HitType view2,
 
  142     const CartesianVector &position1, 
const CartesianVector &position2, CartesianVector &position3, 
float &chiSquared)
 
  145         throw StatusCodeException(STATUS_CODE_INVALID_PARAMETER);
 
  147     const float X3((position1.GetX() + position2.GetX()) / 2.f);
 
  148     const float Z1(position1.GetZ());
 
  149     const float Z2(position2.GetZ());
 
  150     const float Z3(LArGeometryHelper::MergeTwoPositions(pandora, view1, view2, 
Z1, Z2));
 
  152     position3.SetValues(X3, 0.f, Z3);
 
  153     const float sigmaUVW(LArGeometryHelper::GetSigmaUVW(pandora));
 
  154     chiSquared = ((X3 - position1.GetX()) * (X3 - position1.GetX()) + (X3 - position2.GetX()) * (X3 - position2.GetX())) / (sigmaUVW * sigmaUVW);
 
  159 void LArGeometryHelper::MergeTwoPositions(
const Pandora &pandora, 
const HitType view1, 
const HitType view2, 
const CartesianVector &position1,
 
  160     const CartesianVector &position2, CartesianVector &outputU, CartesianVector &outputV, CartesianVector &outputW, 
float &chiSquared)
 
  163         throw StatusCodeException(STATUS_CODE_INVALID_PARAMETER);
 
  165     CartesianVector position3(0.f, 0.f, 0.f);
 
  166     LArGeometryHelper::MergeTwoPositions(pandora, view1, view2, position1, position2, position3, chiSquared);
 
  168     float aveU(0.f), aveV(0.f), aveW(0.f);
 
  169     const float Z1(position1.GetZ()), Z2(position2.GetZ()), Z3(position3.GetZ()), aveX(position3.GetX());
 
  171     if ((view1 == TPC_VIEW_U) && (view2 == TPC_VIEW_V))
 
  178     if ((view1 == TPC_VIEW_V) && (view2 == TPC_VIEW_W))
 
  185     if ((view1 == TPC_VIEW_W) && (view2 == TPC_VIEW_U))
 
  192     if ((view1 == TPC_VIEW_V) && (view2 == TPC_VIEW_U))
 
  199     if ((view1 == TPC_VIEW_W) && (view2 == TPC_VIEW_V))
 
  206     if ((view1 == TPC_VIEW_U) && (view2 == TPC_VIEW_W))
 
  213     outputU.SetValues(aveX, 0.f, aveU);
 
  214     outputV.SetValues(aveX, 0.f, aveV);
 
  215     outputW.SetValues(aveX, 0.f, aveW);
 
  220 void LArGeometryHelper::MergeThreePositions(
const Pandora &pandora, 
const HitType view1, 
const HitType view2, 
const HitType view3,
 
  221     const CartesianVector &position1, 
const CartesianVector &position2, 
const CartesianVector &position3, CartesianVector &outputU,
 
  222     CartesianVector &outputV, CartesianVector &outputW, 
float &chiSquared)
 
  224     if ((view1 == view2) || (view2 == view3) || (view3 == view1))
 
  225         throw StatusCodeException(STATUS_CODE_INVALID_PARAMETER);
 
  227     if ((view1 == TPC_VIEW_U) && (view2 == TPC_VIEW_V))
 
  229         return LArGeometryHelper::MergeThreePositions(pandora, position1, position2, position3, outputU, outputV, outputW, chiSquared);
 
  232     if ((view1 == TPC_VIEW_V) && (view2 == TPC_VIEW_W))
 
  234         return LArGeometryHelper::MergeThreePositions(pandora, position3, position1, position2, outputU, outputV, outputW, chiSquared);
 
  237     if ((view1 == TPC_VIEW_W) && (view2 == TPC_VIEW_U))
 
  239         return LArGeometryHelper::MergeThreePositions(pandora, position2, position3, position1, outputU, outputV, outputW, chiSquared);
 
  242     if ((view1 == TPC_VIEW_V) && (view2 == TPC_VIEW_U))
 
  244         return LArGeometryHelper::MergeThreePositions(pandora, position2, position1, position3, outputU, outputV, outputW, chiSquared);
 
  247     if ((view1 == TPC_VIEW_W) && (view2 == TPC_VIEW_V))
 
  249         return LArGeometryHelper::MergeThreePositions(pandora, position3, position2, position1, outputU, outputV, outputW, chiSquared);
 
  252     if ((view1 == TPC_VIEW_U) && (view2 == TPC_VIEW_W))
 
  254         return LArGeometryHelper::MergeThreePositions(pandora, position1, position3, position2, outputU, outputV, outputW, chiSquared);
 
  257     throw StatusCodeException(STATUS_CODE_INVALID_PARAMETER);
 
  262 void LArGeometryHelper::MergeThreePositions(
const Pandora &pandora, 
const CartesianVector &positionU, 
const CartesianVector &positionV,
 
  263     const CartesianVector &positionW, CartesianVector &outputU, CartesianVector &outputV, CartesianVector &outputW, 
float &chiSquared)
 
  265     const float YfromUV(pandora.GetPlugins()->GetLArTransformationPlugin()->UVtoY(positionU.GetZ(), positionV.GetZ()));
 
  266     const float YfromUW(pandora.GetPlugins()->GetLArTransformationPlugin()->UWtoY(positionU.GetZ(), positionW.GetZ()));
 
  267     const float YfromVW(pandora.GetPlugins()->GetLArTransformationPlugin()->VWtoY(positionV.GetZ(), positionW.GetZ()));
 
  269     const float ZfromUV(pandora.GetPlugins()->GetLArTransformationPlugin()->UVtoZ(positionU.GetZ(), positionV.GetZ()));
 
  270     const float ZfromUW(pandora.GetPlugins()->GetLArTransformationPlugin()->UWtoZ(positionU.GetZ(), positionW.GetZ()));
 
  271     const float ZfromVW(pandora.GetPlugins()->GetLArTransformationPlugin()->VWtoZ(positionV.GetZ(), positionW.GetZ()));
 
  274     const bool useOldWZEquivalentTreatment(std::fabs(ZfromUW - ZfromVW) < std::numeric_limits<float>::epsilon());
 
  275     const float aveX((positionU.GetX() + positionV.GetX() + positionW.GetX()) / 3.f);
 
  276     const float aveY(useOldWZEquivalentTreatment ? YfromUV : (YfromUV + YfromUW + YfromVW) / 3.f);
 
  277     const float aveZ(useOldWZEquivalentTreatment ? (positionW.GetZ() + 2.f * ZfromUV) / 3.f : (ZfromUV + ZfromUW + ZfromVW) / 3.f);
 
  279     const float aveU(pandora.GetPlugins()->GetLArTransformationPlugin()->YZtoU(aveY, aveZ));
 
  280     const float aveV(pandora.GetPlugins()->GetLArTransformationPlugin()->YZtoV(aveY, aveZ));
 
  281     const float aveW(pandora.GetPlugins()->GetLArTransformationPlugin()->YZtoW(aveY, aveZ));
 
  283     outputU.SetValues(aveX, 0.f, aveU);
 
  284     outputV.SetValues(aveX, 0.f, aveV);
 
  285     outputW.SetValues(aveX, 0.f, aveW);
 
  287     const float sigmaUVW(LArGeometryHelper::GetSigmaUVW(pandora));
 
  288     chiSquared = ((outputU.GetX() - positionU.GetX()) * (outputU.GetX() - positionU.GetX()) +
 
  289                      (outputV.GetX() - positionV.GetX()) * (outputV.GetX() - positionV.GetX()) +
 
  290                      (outputW.GetX() - positionW.GetX()) * (outputW.GetX() - positionW.GetX()) +
 
  291                      (outputU.GetZ() - positionU.GetZ()) * (outputU.GetZ() - positionU.GetZ()) +
 
  292                      (outputV.GetZ() - positionV.GetZ()) * (outputV.GetZ() - positionV.GetZ()) +
 
  293                      (outputW.GetZ() - positionW.GetZ()) * (outputW.GetZ() - positionW.GetZ())) /
 
  294                  (sigmaUVW * sigmaUVW);
 
  299 void LArGeometryHelper::MergeTwoPositions3D(
const Pandora &pandora, 
const HitType view1, 
const HitType view2,
 
  300     const CartesianVector &position1, 
const CartesianVector &position2, CartesianVector &position3D, 
float &chiSquared)
 
  302     CartesianVector positionU(0.f, 0.f, 0.f), positionV(0.f, 0.f, 0.f), positionW(0.f, 0.f, 0.f);
 
  303     LArGeometryHelper::MergeTwoPositions(pandora, view1, view2, position1, position2, positionU, positionV, positionW, chiSquared);
 
  305     position3D.SetValues(positionW.GetX(), pandora.GetPlugins()->GetLArTransformationPlugin()->UVtoY(positionU.GetZ(), positionV.GetZ()),
 
  306         pandora.GetPlugins()->GetLArTransformationPlugin()->UVtoZ(positionU.GetZ(), positionV.GetZ()));
 
  311 void LArGeometryHelper::MergeThreePositions3D(
const Pandora &pandora, 
const HitType view1, 
const HitType view2, 
const HitType view3,
 
  312     const CartesianVector &position1, 
const CartesianVector &position2, 
const CartesianVector &position3, CartesianVector &position3D, 
float &chiSquared)
 
  314     CartesianVector positionU(0.f, 0.f, 0.f), positionV(0.f, 0.f, 0.f), positionW(0.f, 0.f, 0.f);
 
  315     LArGeometryHelper::MergeThreePositions(pandora, view1, view2, view3, position1, position2, position3, positionU, positionV, positionW, chiSquared);
 
  317     position3D.SetValues(positionW.GetX(), pandora.GetPlugins()->GetLArTransformationPlugin()->UVtoY(positionU.GetZ(), positionV.GetZ()),
 
  318         pandora.GetPlugins()->GetLArTransformationPlugin()->UVtoZ(positionU.GetZ(), positionV.GetZ()));
 
  323 CartesianVector LArGeometryHelper::ProjectPosition(
const Pandora &pandora, 
const CartesianVector &position3D, 
const HitType view)
 
  325     if (view == TPC_VIEW_U)
 
  327         return CartesianVector(
 
  328             position3D.GetX(), 0.f, pandora.GetPlugins()->GetLArTransformationPlugin()->YZtoU(position3D.GetY(), position3D.GetZ()));
 
  331     else if (view == TPC_VIEW_V)
 
  333         return CartesianVector(
 
  334             position3D.GetX(), 0.f, pandora.GetPlugins()->GetLArTransformationPlugin()->YZtoV(position3D.GetY(), position3D.GetZ()));
 
  337     else if (view == TPC_VIEW_W)
 
  339         return CartesianVector(
 
  340             position3D.GetX(), 0.f, pandora.GetPlugins()->GetLArTransformationPlugin()->YZtoW(position3D.GetY(), position3D.GetZ()));
 
  343     throw StatusCodeException(STATUS_CODE_INVALID_PARAMETER);
 
  348 CartesianVector LArGeometryHelper::ProjectDirection(
const Pandora &pandora, 
const CartesianVector &direction3D, 
const HitType view)
 
  350     if (view == TPC_VIEW_U)
 
  352         return CartesianVector(
 
  353             direction3D.GetX(), 0.f, pandora.GetPlugins()->GetLArTransformationPlugin()->YZtoU(direction3D.GetY(), direction3D.GetZ()))
 
  357     else if (view == TPC_VIEW_V)
 
  359         return CartesianVector(
 
  360             direction3D.GetX(), 0.f, pandora.GetPlugins()->GetLArTransformationPlugin()->YZtoV(direction3D.GetY(), direction3D.GetZ()))
 
  364     else if (view == TPC_VIEW_W)
 
  366         return CartesianVector(
 
  367             direction3D.GetX(), 0.f, pandora.GetPlugins()->GetLArTransformationPlugin()->YZtoW(direction3D.GetY(), direction3D.GetZ()))
 
  371     throw StatusCodeException(STATUS_CODE_INVALID_PARAMETER);
 
  376 float LArGeometryHelper::GetWirePitch(
const Pandora &pandora, 
const HitType view, 
const float maxWirePitchDiscrepancy)
 
  378     if (view != TPC_VIEW_U && view != TPC_VIEW_V && view != TPC_VIEW_W)
 
  379         throw StatusCodeException(STATUS_CODE_INVALID_PARAMETER);
 
  381     const LArTPCMap &larTPCMap(pandora.GetGeometry()->GetLArTPCMap());
 
  383     if (larTPCMap.empty())
 
  385         std::cout << 
"LArGeometryHelper::GetWirePitch - LArTPC description not registered with Pandora as required " << std::endl;
 
  386         throw StatusCodeException(STATUS_CODE_NOT_INITIALIZED);
 
  389     const LArTPC *
const pFirstLArTPC(larTPCMap.begin()->second);
 
  390     const float wirePitch(view == TPC_VIEW_U ? pFirstLArTPC->GetWirePitchU()
 
  391                                              : (view == TPC_VIEW_V ? pFirstLArTPC->GetWirePitchV() : pFirstLArTPC->GetWirePitchW()));
 
  393     for (
const LArTPCMap::value_type &mapEntry : larTPCMap)
 
  395         const LArTPC *
const pLArTPC(mapEntry.second);
 
  396         const float alternateWirePitch(
 
  397             view == TPC_VIEW_U ? pLArTPC->GetWirePitchU() : (view == TPC_VIEW_V ? pLArTPC->GetWirePitchV() : pLArTPC->GetWirePitchW()));
 
  399         if (std::fabs(wirePitch - alternateWirePitch) > maxWirePitchDiscrepancy)
 
  401             std::cout << 
"LArGeometryHelper::GetWirePitch - LArTPC configuration not supported" << std::endl;
 
  402             throw StatusCodeException(STATUS_CODE_INVALID_PARAMETER);
 
  411 CartesianVector LArGeometryHelper::GetWireAxis(
const Pandora &pandora, 
const HitType view)
 
  413     if (view == TPC_VIEW_U)
 
  415         return CartesianVector(0.f, pandora.GetPlugins()->GetLArTransformationPlugin()->YZtoU(1.f, 0.f),
 
  416             pandora.GetPlugins()->GetLArTransformationPlugin()->YZtoU(0.f, 1.f));
 
  419     else if (view == TPC_VIEW_V)
 
  421         return CartesianVector(0.f, pandora.GetPlugins()->GetLArTransformationPlugin()->YZtoV(1.f, 0.f),
 
  422             pandora.GetPlugins()->GetLArTransformationPlugin()->YZtoV(0.f, 1.f));
 
  425     else if (view == TPC_VIEW_W)
 
  427         return CartesianVector(0.f, pandora.GetPlugins()->GetLArTransformationPlugin()->YZtoW(1.f, 0.f),
 
  428             pandora.GetPlugins()->GetLArTransformationPlugin()->YZtoW(0.f, 1.f));
 
  431     throw StatusCodeException(STATUS_CODE_INVALID_PARAMETER);
 
  436 void LArGeometryHelper::GetCommonDaughterVolumes(
const Cluster *
const pCluster1, 
const Cluster *
const pCluster2, 
UIntSet &intersect)
 
  438     UIntSet daughterVolumeIds1, daughterVolumeIds2;
 
  440     LArClusterHelper::GetDaughterVolumeIDs(pCluster1, daughterVolumeIds1);
 
  441     LArClusterHelper::GetDaughterVolumeIDs(pCluster2, daughterVolumeIds2);
 
  443     std::set_intersection(daughterVolumeIds1.begin(), daughterVolumeIds1.end(), daughterVolumeIds2.begin(), daughterVolumeIds2.end(),
 
  444         std::inserter(intersect, intersect.begin()));
 
  449 bool LArGeometryHelper::IsInGap(
const Pandora &pandora, 
const CartesianVector &testPoint2D, 
const HitType hitType, 
const float gapTolerance)
 
  452     for (
const DetectorGap *
const pDetectorGap : pandora.GetGeometry()->GetDetectorGapList())
 
  454         if (pDetectorGap->IsInGap(testPoint2D, hitType, gapTolerance))
 
  463 bool LArGeometryHelper::IsInGap3D(
const Pandora &pandora, 
const CartesianVector &testPoint3D, 
const HitType hitType, 
const float gapTolerance)
 
  465     const CartesianVector testPoint2D(LArGeometryHelper::ProjectPosition(pandora, testPoint3D, hitType));
 
  466     return LArGeometryHelper::IsInGap(pandora, testPoint2D, hitType, gapTolerance);
 
  471 bool LArGeometryHelper::IsXSamplingPointInGap(
const Pandora &pandora, 
const float xSample, 
const TwoDSlidingFitResult &slidingFitResult, 
const float gapTolerance)
 
  473     const HitType hitType(LArClusterHelper::GetClusterHitType(slidingFitResult.
GetCluster()));
 
  477     const bool minLayerIsAtLowX(minLayerPosition.GetX() < maxLayerPosition.GetX());
 
  478     const CartesianVector &lowXCoordinate(minLayerIsAtLowX ? minLayerPosition : maxLayerPosition);
 
  479     const CartesianVector &highXCoordinate(minLayerIsAtLowX ? maxLayerPosition : minLayerPosition);
 
  481     if ((xSample > lowXCoordinate.GetX()) && (xSample < highXCoordinate.GetX()))
 
  483         CartesianVector slidingFitPosition(0.f, 0.f, 0.f);
 
  486             return (LArGeometryHelper::IsInGap(pandora, slidingFitPosition, hitType, gapTolerance));
 
  489     const CartesianVector lowXDirection(
 
  491     const CartesianVector highXDirection(
 
  494     const bool sampleIsNearerToLowX(std::fabs(xSample - lowXCoordinate.GetX()) < std::fabs(xSample - highXCoordinate.GetX()));
 
  495     const CartesianVector &startPosition(sampleIsNearerToLowX ? lowXCoordinate : highXCoordinate);
 
  496     const CartesianVector &startDirection(sampleIsNearerToLowX ? lowXDirection : highXDirection);
 
  498     if (std::fabs(startDirection.GetX()) < std::numeric_limits<float>::epsilon())
 
  499         throw StatusCodeException(STATUS_CODE_NOT_FOUND);
 
  501     const float pathLength((xSample - startPosition.GetX()) / startDirection.GetX());
 
  502     const CartesianVector samplingPoint(startPosition + startDirection * 
pathLength);
 
  504     return (LArGeometryHelper::IsInGap(pandora, samplingPoint, hitType, gapTolerance));
 
  509 float LArGeometryHelper::CalculateGapDeltaZ(
const Pandora &pandora, 
const float minZ, 
const float maxZ, 
const HitType hitType)
 
  511     if (maxZ - minZ < std::numeric_limits<float>::epsilon())
 
  512         throw StatusCodeException(STATUS_CODE_INVALID_PARAMETER);
 
  514     float gapDeltaZ(0.f);
 
  516     for (
const DetectorGap *
const pDetectorGap : pandora.GetGeometry()->GetDetectorGapList())
 
  518         const LineGap *
const pLineGap = 
dynamic_cast<const LineGap *
>(pDetectorGap);
 
  521             throw StatusCodeException(STATUS_CODE_INVALID_PARAMETER);
 
  523         const LineGapType lineGapType(pLineGap->GetLineGapType());
 
  525         if (!(((TPC_VIEW_U == hitType) && (TPC_WIRE_GAP_VIEW_U == lineGapType)) || ((TPC_VIEW_V == hitType) && (TPC_WIRE_GAP_VIEW_V == lineGapType)) ||
 
  526                 ((TPC_VIEW_W == hitType) && (TPC_WIRE_GAP_VIEW_W == lineGapType))))
 
  531         if ((pLineGap->GetLineStartZ() > maxZ) || (pLineGap->GetLineEndZ() < minZ))
 
  534         const float gapMinZ(std::max(minZ, pLineGap->GetLineStartZ()));
 
  535         const float gapMaxZ(std::min(maxZ, pLineGap->GetLineEndZ()));
 
  537         if ((gapMaxZ - gapMinZ) > std::numeric_limits<float>::epsilon())
 
  538             gapDeltaZ += (gapMaxZ - gapMinZ);
 
  546 float LArGeometryHelper::GetSigmaUVW(
const Pandora &pandora, 
const float maxSigmaDiscrepancy)
 
  548     const LArTPCMap &larTPCMap(pandora.GetGeometry()->GetLArTPCMap());
 
  550     if (larTPCMap.empty())
 
  552         std::cout << 
"LArGeometryHelper::GetSigmaUVW - LArTPC description not registered with Pandora as required " << std::endl;
 
  553         throw StatusCodeException(STATUS_CODE_NOT_INITIALIZED);
 
  556     const LArTPC *
const pFirstLArTPC(larTPCMap.begin()->second);
 
  557     const float sigmaUVW(pFirstLArTPC->GetSigmaUVW());
 
  559     for (
const LArTPCMap::value_type &mapEntry : larTPCMap)
 
  561         const LArTPC *
const pLArTPC(mapEntry.second);
 
  563         if (std::fabs(sigmaUVW - pLArTPC->GetSigmaUVW()) > maxSigmaDiscrepancy)
 
  565             std::cout << 
"LArGeometryHelper::GetSigmaUVW - Plugin does not support provided LArTPC configurations " << std::endl;
 
  566             throw StatusCodeException(STATUS_CODE_INVALID_PARAMETER);
 
pandora::CartesianVector GetGlobalMinLayerDirection() const 
Get global direction corresponding to the fit result in minimum fit layer. 
 
std::set< unsigned int > UIntSet
 
Header file for the geometry helper class. 
 
Header file for the cluster helper class. 
 
Header file for the lar two dimensional sliding fit result class. 
 
pandora::CartesianVector GetGlobalMinLayerPosition() const 
Get global position corresponding to the fit result in minimum fit layer. 
 
double pathLength(BIter begin, EIter end)
Returns the total length of the specified path. 
 
BEGIN_PROLOG supported so bottom corner of box bottom corner of box bottom corner of box top corner of box top corner of box Z1
 
const pandora::Cluster * GetCluster() const 
Get the address of the cluster, if originally provided. 
 
required by fuzzyCluster table::sbnd_g4_services gaushitTruthMatch pandora
 
pandora::StatusCode GetGlobalFitPositionAtX(const float x, pandora::CartesianVector &position) const 
Get global fit position for a given input x coordinate. 
 
pandora::CartesianVector GetGlobalMaxLayerDirection() const 
Get global direction corresponding to the fit result in maximum fit layer. 
 
pandora::CartesianVector GetGlobalMaxLayerPosition() const 
Get global position corresponding to the fit result in maximum fit layer. 
 
TwoDSlidingFitResult class. 
 
BEGIN_PROLOG could also be cout