Skip to content

Commit 65b7954

Browse files
committed
SUV is not calculated when TimezoneOffsetFromUTC is negative #635
1 parent 08f376e commit 65b7954

File tree

2 files changed

+31
-32
lines changed
  • weasis-core/src/main/java/org/weasis/core/api/media/data
  • weasis-dicom/weasis-dicom-codec/src/main/java/org/weasis/dicom/codec/utils

2 files changed

+31
-32
lines changed

weasis-core/src/main/java/org/weasis/core/api/media/data/TagUtil.java

Lines changed: 0 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,6 @@
2020
import java.time.format.FormatStyle;
2121
import java.time.temporal.TemporalAccessor;
2222
import java.util.ArrayList;
23-
import java.util.Calendar;
2423
import java.util.Date;
2524
import java.util.regex.Pattern;
2625
import javax.xml.stream.XMLStreamReader;
@@ -98,26 +97,6 @@ public static LocalDateTime toLocalDateTime(Date date) {
9897
return null;
9998
}
10099

101-
public static Date dateTime(Date date, Date time) {
102-
if (time == null) {
103-
return date;
104-
} else if (date == null) {
105-
return time;
106-
}
107-
Calendar calendarA = Calendar.getInstance();
108-
calendarA.setTime(date);
109-
110-
Calendar calendarB = Calendar.getInstance();
111-
calendarB.setTime(time);
112-
113-
calendarA.set(Calendar.HOUR_OF_DAY, calendarB.get(Calendar.HOUR_OF_DAY));
114-
calendarA.set(Calendar.MINUTE, calendarB.get(Calendar.MINUTE));
115-
calendarA.set(Calendar.SECOND, calendarB.get(Calendar.SECOND));
116-
calendarA.set(Calendar.MILLISECOND, calendarB.get(Calendar.MILLISECOND));
117-
118-
return calendarA.getTime();
119-
}
120-
121100
public static String formatDateTime(TemporalAccessor date) {
122101
if (date instanceof LocalDate) {
123102
return DateTimeFormatter.ofLocalizedDate(FormatStyle.MEDIUM).format(date);

weasis-dicom/weasis-dicom-codec/src/main/java/org/weasis/dicom/codec/utils/DicomMediaUtils.java

Lines changed: 31 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -16,13 +16,15 @@
1616
import java.time.LocalTime;
1717
import java.time.temporal.TemporalAccessor;
1818
import java.util.Arrays;
19+
import java.util.Calendar;
1920
import java.util.Date;
2021
import java.util.HashMap;
2122
import java.util.Iterator;
2223
import java.util.Map;
2324
import java.util.Map.Entry;
2425
import java.util.Objects;
2526
import java.util.Set;
27+
import java.util.TimeZone;
2628
import java.util.TreeSet;
2729
import java.util.regex.Pattern;
2830
import javax.xml.stream.XMLInputFactory;
@@ -474,22 +476,15 @@ public static void computeSUVFactor(Attributes dicomObject, Taggable taggable, i
474476
Date injectDateTime =
475477
DicomUtils.getDateFromDicomElement(
476478
dcm, Tag.RadiopharmaceuticalStartDateTime, null);
477-
Date acquisitionDateTime =
478-
TagUtil.dateTime(
479-
DicomUtils.getDateFromDicomElement(dicomObject, Tag.AcquisitionDate, null),
480-
DicomUtils.getDateFromDicomElement(dicomObject, Tag.AcquisitionTime, null));
481-
Date scanDate = DicomUtils.getDateFromDicomElement(dicomObject, Tag.SeriesDate, null);
479+
Date acquisitionDateTime = dicomObject.getDate(Tag.AcquisitionDateAndTime);
480+
Date scanDate = dicomObject.getDate(Tag.SeriesDateAndTime);
482481
if ("START".equals(dicomObject.getString(Tag.DecayCorrection))
483482
&& totalDose != null
484483
&& halfLife != null
485484
&& acquisitionDateTime != null
486485
&& (injectDateTime != null || (scanDate != null && injectTime != null))) {
487486
double time = 0.0;
488-
long scanDateTime =
489-
TagUtil.dateTime(
490-
scanDate,
491-
DicomUtils.getDateFromDicomElement(dicomObject, Tag.SeriesTime, null))
492-
.getTime();
487+
long scanDateTime = scanDate.getTime();
493488
if (injectDateTime == null) {
494489
if (scanDateTime > acquisitionDateTime.getTime()) {
495490
// per GE docs, may have been updated during post-processing into new series
@@ -504,7 +499,8 @@ public static void computeSUVFactor(Attributes dicomObject, Taggable taggable, i
504499
}
505500
}
506501
if (scanDate != null) {
507-
injectDateTime = TagUtil.dateTime(scanDate, injectTime);
502+
injectDateTime =
503+
dateTime(dicomObject.getTimeZone(), scanDate, injectTime, false);
508504
time = (double) scanDateTime - injectDateTime.getTime();
509505
}
510506

@@ -537,6 +533,30 @@ public static void computeSUVFactor(Attributes dicomObject, Taggable taggable, i
537533
}
538534
}
539535

536+
// Remove this method and use DateTimeUtils
537+
public static Date dateTime(TimeZone tz, Date date, Date time, boolean acceptNullDateOrTime) {
538+
if (!acceptNullDateOrTime && (date == null || time == null)) {
539+
return null;
540+
}
541+
Calendar calendar =
542+
tz == null || date == null ? Calendar.getInstance() : Calendar.getInstance(tz);
543+
544+
Calendar datePart = Calendar.getInstance();
545+
datePart.setTime(date == null ? new Date(0) : date);
546+
calendar.set(Calendar.YEAR, datePart.get(Calendar.YEAR));
547+
calendar.set(Calendar.MONTH, datePart.get(Calendar.MONTH));
548+
calendar.set(Calendar.DAY_OF_MONTH, datePart.get(Calendar.DAY_OF_MONTH));
549+
550+
Calendar timePart = Calendar.getInstance();
551+
timePart.setTime(time == null ? new Date(0) : time);
552+
calendar.set(Calendar.HOUR_OF_DAY, timePart.get(Calendar.HOUR_OF_DAY));
553+
calendar.set(Calendar.MINUTE, timePart.get(Calendar.MINUTE));
554+
calendar.set(Calendar.SECOND, timePart.get(Calendar.SECOND));
555+
calendar.set(Calendar.MILLISECOND, timePart.get(Calendar.MILLISECOND));
556+
557+
return calendar.getTime();
558+
}
559+
540560
public static double[] getFrameTime(Attributes attributes) {
541561
double[] frameTimes = null;
542562
String frameIncrementPointer = attributes.getString(Tag.FrameIncrementPointer, null);

0 commit comments

Comments
 (0)