Skip to content

Commit

Permalink
SUV is not calculated when TimezoneOffsetFromUTC is negative #635
Browse files Browse the repository at this point in the history
  • Loading branch information
nroduit committed Feb 21, 2025
1 parent 08f376e commit 65b7954
Show file tree
Hide file tree
Showing 2 changed files with 31 additions and 32 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,6 @@
import java.time.format.FormatStyle;
import java.time.temporal.TemporalAccessor;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.regex.Pattern;
import javax.xml.stream.XMLStreamReader;
Expand Down Expand Up @@ -98,26 +97,6 @@ public static LocalDateTime toLocalDateTime(Date date) {
return null;
}

public static Date dateTime(Date date, Date time) {
if (time == null) {
return date;
} else if (date == null) {
return time;
}
Calendar calendarA = Calendar.getInstance();
calendarA.setTime(date);

Calendar calendarB = Calendar.getInstance();
calendarB.setTime(time);

calendarA.set(Calendar.HOUR_OF_DAY, calendarB.get(Calendar.HOUR_OF_DAY));
calendarA.set(Calendar.MINUTE, calendarB.get(Calendar.MINUTE));
calendarA.set(Calendar.SECOND, calendarB.get(Calendar.SECOND));
calendarA.set(Calendar.MILLISECOND, calendarB.get(Calendar.MILLISECOND));

return calendarA.getTime();
}

public static String formatDateTime(TemporalAccessor date) {
if (date instanceof LocalDate) {
return DateTimeFormatter.ofLocalizedDate(FormatStyle.MEDIUM).format(date);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,13 +16,15 @@
import java.time.LocalTime;
import java.time.temporal.TemporalAccessor;
import java.util.Arrays;
import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Objects;
import java.util.Set;
import java.util.TimeZone;
import java.util.TreeSet;
import java.util.regex.Pattern;
import javax.xml.stream.XMLInputFactory;
Expand Down Expand Up @@ -474,22 +476,15 @@ public static void computeSUVFactor(Attributes dicomObject, Taggable taggable, i
Date injectDateTime =
DicomUtils.getDateFromDicomElement(
dcm, Tag.RadiopharmaceuticalStartDateTime, null);
Date acquisitionDateTime =
TagUtil.dateTime(
DicomUtils.getDateFromDicomElement(dicomObject, Tag.AcquisitionDate, null),
DicomUtils.getDateFromDicomElement(dicomObject, Tag.AcquisitionTime, null));
Date scanDate = DicomUtils.getDateFromDicomElement(dicomObject, Tag.SeriesDate, null);
Date acquisitionDateTime = dicomObject.getDate(Tag.AcquisitionDateAndTime);
Date scanDate = dicomObject.getDate(Tag.SeriesDateAndTime);
if ("START".equals(dicomObject.getString(Tag.DecayCorrection))
&& totalDose != null
&& halfLife != null
&& acquisitionDateTime != null
&& (injectDateTime != null || (scanDate != null && injectTime != null))) {
double time = 0.0;
long scanDateTime =
TagUtil.dateTime(
scanDate,
DicomUtils.getDateFromDicomElement(dicomObject, Tag.SeriesTime, null))
.getTime();
long scanDateTime = scanDate.getTime();
if (injectDateTime == null) {
if (scanDateTime > acquisitionDateTime.getTime()) {
// per GE docs, may have been updated during post-processing into new series
Expand All @@ -504,7 +499,8 @@ public static void computeSUVFactor(Attributes dicomObject, Taggable taggable, i
}
}
if (scanDate != null) {
injectDateTime = TagUtil.dateTime(scanDate, injectTime);
injectDateTime =
dateTime(dicomObject.getTimeZone(), scanDate, injectTime, false);
time = (double) scanDateTime - injectDateTime.getTime();
}

Expand Down Expand Up @@ -537,6 +533,30 @@ public static void computeSUVFactor(Attributes dicomObject, Taggable taggable, i
}
}

// Remove this method and use DateTimeUtils
public static Date dateTime(TimeZone tz, Date date, Date time, boolean acceptNullDateOrTime) {
if (!acceptNullDateOrTime && (date == null || time == null)) {
return null;
}
Calendar calendar =
tz == null || date == null ? Calendar.getInstance() : Calendar.getInstance(tz);

Calendar datePart = Calendar.getInstance();
datePart.setTime(date == null ? new Date(0) : date);
calendar.set(Calendar.YEAR, datePart.get(Calendar.YEAR));
calendar.set(Calendar.MONTH, datePart.get(Calendar.MONTH));
calendar.set(Calendar.DAY_OF_MONTH, datePart.get(Calendar.DAY_OF_MONTH));

Calendar timePart = Calendar.getInstance();
timePart.setTime(time == null ? new Date(0) : time);
calendar.set(Calendar.HOUR_OF_DAY, timePart.get(Calendar.HOUR_OF_DAY));
calendar.set(Calendar.MINUTE, timePart.get(Calendar.MINUTE));
calendar.set(Calendar.SECOND, timePart.get(Calendar.SECOND));
calendar.set(Calendar.MILLISECOND, timePart.get(Calendar.MILLISECOND));

return calendar.getTime();
}

public static double[] getFrameTime(Attributes attributes) {
double[] frameTimes = null;
String frameIncrementPointer = attributes.getString(Tag.FrameIncrementPointer, null);
Expand Down

0 comments on commit 65b7954

Please sign in to comment.