32 mitkReThrow(e) <<
"Cannot generate a control point from the DICOM tag of the given data node.";
43 return currentControlPoint.
UID == controlPointUID;
47 const auto existingControlPoint = std::find_if(allControlPoints.begin(), allControlPoints.end(), lambda);
50 if (existingControlPoint != allControlPoints.end())
52 controlPoint = *existingControlPoint;
61 for (
const auto& currentControlPoint : allControlPoints)
63 if (controlPoint.
date == currentControlPoint.date)
65 return currentControlPoint;
75 if (allControlPoints.empty())
81 std::sort(allControlPoints.begin(), allControlPoints.end());
84 SemanticTypes::ControlPointVector::const_iterator it;
85 for (it = allControlPoints.begin(); it != allControlPoints.end(); ++it)
87 if (controlPoint.
date < it->date)
95 if (it == allControlPoints.begin())
98 nextControlPoint = *it;
100 else if (it != allControlPoints.end())
104 nextControlPoint = *it;
105 previousControlPoint = *(--it);
110 previousControlPoint = *(--it);
114 double distanceToNextExaminationPeriod = nextControlPoint.
DistanceInDays(controlPoint);
115 double distanceToPreviousExaminationPeriod = previousControlPoint.
DistanceInDays(controlPoint);
118 int closestDistanceInDays = 0;
119 if (distanceToNextExaminationPeriod < distanceToPreviousExaminationPeriod)
122 closestControlPoint = nextControlPoint;
123 closestDistanceInDays = distanceToNextExaminationPeriod;
128 closestControlPoint = previousControlPoint;
129 closestDistanceInDays = distanceToPreviousExaminationPeriod;
132 int THRESHOLD_DISTANCE_IN_DAYS = 30;
133 if (closestDistanceInDays <= THRESHOLD_DISTANCE_IN_DAYS)
135 return closestControlPoint;
144 for (
const auto& examinationPeriod : allExaminationPeriods)
146 for (
const auto& UID : examinationPeriod.controlPointUIDs)
148 if (controlPoint.
UID == UID)
150 return examinationPeriod;
164 if (!existingControlPoint.
UID.empty())
166 specificControlPoint = existingControlPoint;
171 if (!closestControlPoint.UID.empty())
173 specificControlPoint = closestControlPoint;
192 mitkReThrow(e) <<
"Cannot find an examination period.";
202 std::sort(controlPoints.begin(), controlPoints.end());
211 if (rightExaminationPeriod.controlPointUIDs.empty())
216 const auto rightUID = rightExaminationPeriod.controlPointUIDs.front();
220 return leftControlPoint.date < rightControlPoint.date;
223 std::sort(allExaminationPeriods.begin(), allExaminationPeriods.end(), lambda);
std::vector< ID > controlPointUIDs
MITKSEMANTICRELATIONS_EXPORT SemanticTypes::ExaminationPeriod FindFittingExaminationPeriod(const SemanticTypes::CaseID &caseID, const SemanticTypes::ControlPoint &controlPoint)
Return the examination period to which the given data node belongs. The control point is used to find...
#define mitkReThrow(mitkexception)
MITKSEMANTICRELATIONS_EXPORT SemanticTypes::ControlPoint FindExistingControlPoint(const SemanticTypes::CaseID &caseID, const SemanticTypes::ControlPoint &controlPoint)
Returns an already existing control point from the given vector of control points. This existing control point has the the same date (year, month, day) as the given single control point. If no existing control point can be found an empty control point is returned.
boost::gregorian::date date
MITKSEMANTICRELATIONS_EXPORT SemanticTypes::CaseID GetCaseIDFromDataNode(const mitk::DataNode *dataNode)
std::vector< ControlPoint > ControlPointVector
MITKSEMANTICRELATIONS_EXPORT SemanticTypes::ControlPoint FindClosestControlPoint(const SemanticTypes::CaseID &caseID, const SemanticTypes::ControlPoint &controlPoint)
Returns an already existing close control point from the given vector of control points. This closest control point has a date that is within a certain distance-in-days to the given control point. If no closest control point can be found within the distance threshold an empty control point is returned.
The concept of an examination period. An examination period holds a vector of control point UIDs...
MITKSEMANTICRELATIONS_EXPORT SemanticTypes::ControlPoint GenerateControlPoint(const mitk::DataNode *datanode)
Provides helper functions that are needed to work with control points.
int DistanceInDays(const ControlPoint &other) const
MITKSEMANTICRELATIONS_EXPORT SemanticTypes::ExaminationPeriod FindContainingExaminationPeriod(const SemanticTypes::CaseID &caseID, const SemanticTypes::ControlPoint &controlPoint)
Returns the examination period to which the given control point belongs. Each examination point holds...
MITKSEMANTICRELATIONS_EXPORT SemanticTypes::ExaminationPeriodVector GetAllExaminationPeriodsOfCase(const SemanticTypes::CaseID &caseID)
MITKSEMANTICRELATIONS_EXPORT SemanticTypes::ControlPoint GetDICOMDateFromDataNode(const mitk::DataNode *dataNode)
MITKSEMANTICRELATIONS_EXPORT SemanticTypes::ControlPoint GetControlPointByUID(const SemanticTypes::CaseID &caseID, const SemanticTypes::ID &controlPointUID)
Find and return a whole control point including its date given a specific control point UID...
std::vector< ExaminationPeriod > ExaminationPeriodVector
MITKSEMANTICRELATIONS_EXPORT std::string GenerateUID()
Class for nodes of the DataTree.
MITKSEMANTICRELATIONS_EXPORT SemanticTypes::ControlPointVector GetAllControlPointsOfCase(const SemanticTypes::CaseID &caseID)
MITKSEMANTICRELATIONS_EXPORT void SortAllExaminationPeriods(const SemanticTypes::CaseID &caseID, SemanticTypes::ExaminationPeriodVector &allExaminationPeriods)
Sort the given vector of examination periods. Each examination period has a vector of control point U...