Skip to content

Commit 3e9b2a7

Browse files
committed
Philips R11 (#809)
1 parent 5b5a5be commit 3e9b2a7

File tree

2 files changed

+30
-33
lines changed

2 files changed

+30
-33
lines changed

console/nii_dicom.cpp

+29-32
Original file line numberDiff line numberDiff line change
@@ -4797,6 +4797,7 @@ struct TDICOMdata readDICOMx(char *fname, struct TDCMprefs *prefs, struct TDTI4D
47974797
int multiBandFactor = 0;
47984798
int frequencyRows = 0;
47994799
int numberOfImagesInMosaic = 0;
4800+
int swVers = -1;
48004801
int encapsulatedDataFragments = 0;
48014802
int encapsulatedDataFragmentStart = 0; // position of first FFFE,E000 for compressed images
48024803
int encapsulatedDataImageStart = 0; // position of 7FE0,0010 for compressed images (where actual image start should be start of first fragment)
@@ -4932,45 +4933,30 @@ struct TDICOMdata readDICOMx(char *fname, struct TDCMprefs *prefs, struct TDTI4D
49324933
sqDepth00189114 = -1; // triggered
49334934
// d.aslFlags = kASL_FLAG_PHILIPS_LABEL; kASL_FLAG_PHILIPS_LABEL
49344935
//printf("issue809 %d %d %d\n", inStackPositionNumber, philMRImageDiffBValueNumber, gradientOrientationNumberPhilips);
4935-
if ((nDimIndxVal > 1) && (volumeNumber > 0) && (inStackPositionNumber > 0) && ((d.aslFlags == kASL_FLAG_PHILIPS_LABEL) || (d.aslFlags == kASL_FLAG_PHILIPS_CONTROL))) {
4936+
bool isKludge = (swVers > 10) && (d.manufacturer == kMANUFACTURER_PHILIPS) && (nDimIndxVal > 1) && (inStackPositionNumber > 0);
4937+
if (isKludge) {
49364938
isKludgeIssue809 = true;
49374939
for (int i = 0; i < nDimIndxVal; i++)
49384940
d.dimensionIndexValues[i] = 0;
49394941
int phase = d.phaseNumber;
49404942
if (d.phaseNumber < 0)
4941-
phase = 0; // if not set: we are saving as UINT
4942-
d.dimensionIndexValues[0] = inStackPositionNumber; // dim[3] slice changes fastest
4943-
d.dimensionIndexValues[1] = phase; // dim[4] successive volumes are phase
4944-
d.dimensionIndexValues[2] = d.aslFlags == kASL_FLAG_PHILIPS_LABEL; // dim[5] Control/Label
4945-
d.dimensionIndexValues[3] = volumeNumber; // dim[6] Repeat changes slowest
4946-
nDimIndxVal = 4; // slice < phase < control/label < volume
4947-
// printf("slice %d phase %d control/label %d repeat %d\n", inStackPositionNumber, d.phaseNumber, d.aslFlags == kASL_FLAG_PHILIPS_LABEL, volumeNumber);
4948-
} else if ((d.manufacturer == kMANUFACTURER_PHILIPS) && (nDimIndxVal > 1) && (volumeNumber > 0) && (gradientOrientationNumberPhilips > 0) && (inStackPositionNumber > 0)) {
4949-
isKludgeIssue809 = true;
4950-
for (int i = 0; i < nDimIndxVal; i++)
4951-
d.dimensionIndexValues[i] = 0;
4952-
d.dimensionIndexValues[0] = inStackPositionNumber;
4953-
d.dimensionIndexValues[1] = philMRImageDiffBValueNumber;
4954-
d.dimensionIndexValues[2] = gradientOrientationNumberPhilips;
4955-
// magnitude[0], real[1], imaginary[2] or phase[3]
4943+
phase = 0;
4944+
int aslFlag = d.aslFlags == kASL_FLAG_PHILIPS_LABEL;
49564945
int imageType = 0;
49574946
if (isReal) imageType = 1;
49584947
if (isImaginary) imageType = 2;
49594948
if (isPhase) imageType = 3;
4960-
d.dimensionIndexValues[3] = imageType;
4961-
nDimIndxVal = 4;
4962-
} else if ((d.manufacturer == kMANUFACTURER_PHILIPS) && (nDimIndxVal > 1) && (volumeNumber > 0) && (inStackPositionNumber > 0) ) {
4963-
isKludgeIssue809 = true;
4964-
for (int i = 0; i < nDimIndxVal; i++)
4965-
d.dimensionIndexValues[i] = 0;
4966-
int phase = d.phaseNumber;
4967-
if (d.phaseNumber < 0)
4968-
phase = 0; // if not set: we are saving as UINT
4949+
int bvalNum = philMRImageDiffBValueNumber > 0 ? philMRImageDiffBValueNumber : 0;
4950+
int gradNum = gradientOrientationNumberPhilips > 0 ? gradientOrientationNumberPhilips : 0;
4951+
int volume = volumeNumber > 0 ? volumeNumber : 0;
49694952
d.dimensionIndexValues[0] = inStackPositionNumber; // dim[3] slice changes fastest
4970-
d.dimensionIndexValues[1] = phase; // dim[4] successive volumes are phase
4971-
d.dimensionIndexValues[2] = 0; // dim[5] Control/Label unused for fMRI
4972-
d.dimensionIndexValues[3] = volumeNumber; // dim[6] Repeat changes slowest
4973-
nDimIndxVal = 4; // slice < phase < control/label < volume
4953+
d.dimensionIndexValues[1] = phase;
4954+
d.dimensionIndexValues[2] = aslFlag;
4955+
d.dimensionIndexValues[3] = imageType;
4956+
d.dimensionIndexValues[4] = bvalNum;
4957+
d.dimensionIndexValues[5] = gradNum;
4958+
d.dimensionIndexValues[6] = volume;
4959+
nDimIndxVal = 7;
49744960
}
49754961
if ((volumeNumber == 1) && (acquisitionTimePhilips >= 0.0) && (inStackPositionNumber > 0)) {
49764962
d.CSA.sliceTiming[inStackPositionNumber - 1] = acquisitionTimePhilips;
@@ -5861,6 +5847,7 @@ struct TDICOMdata readDICOMx(char *fname, struct TDCMprefs *prefs, struct TDTI4D
58615847
case kSoftwareVersions: {
58625848
dcmStr(lLength, &buffer[lPos], d.softwareVersions);
58635849
int slen = (int)strlen(d.softwareVersions);
5850+
swVers = dcmStrInt(lLength, &buffer[lPos]);
58645851
if ((slen > 4) && (strstr(d.softwareVersions, "XA10") != NULL))
58655852
d.isXA10A = true;
58665853
if ((slen > 4) && (strstr(d.softwareVersions, "XA11") != NULL))
@@ -7246,7 +7233,7 @@ struct TDICOMdata readDICOMx(char *fname, struct TDCMprefs *prefs, struct TDTI4D
72467233
if (d.manufacturer == kMANUFACTURER_PHILIPS) {
72477234
//n.b. historically VR of 2005,1413 is IS, but with R11 is can be SL
72487235
// this will cause havoc if Philips data is saved on a PACS with implicit vr
7249-
if (vr[0] == 'S' && vr[0] == 'S') {
7236+
if (vr[0] == 'S' && vr[1] == 'L') {
72507237
gradientOrientationNumberPhilips = dcmInt(lLength, &buffer[lPos], d.isLittleEndian);
72517238
} else {
72527239
gradientOrientationNumberPhilips = dcmStrInt(lLength, &buffer[lPos]);
@@ -7272,7 +7259,13 @@ struct TDICOMdata readDICOMx(char *fname, struct TDCMprefs *prefs, struct TDTI4D
72727259
case kMRImageDiffBValueNumber:
72737260
if (d.manufacturer != kMANUFACTURER_PHILIPS)
72747261
break;
7275-
philMRImageDiffBValueNumber = dcmStrInt(lLength, &buffer[lPos]);
7262+
//n.b. historically VR of 2005,1412 is IS, but with R11 is can be SL
7263+
// this will cause havoc if Philips data is saved on a PACS with implicit vr
7264+
if (vr[0] == 'S' && vr[1] == 'L') {
7265+
philMRImageDiffBValueNumber = dcmInt(lLength, &buffer[lPos], d.isLittleEndian);
7266+
} else {
7267+
philMRImageDiffBValueNumber = dcmStrInt(lLength, &buffer[lPos]);
7268+
}
72767269
break;
72777270
case kMRImageDiffVolumeNumber:
72787271
if (d.manufacturer != kMANUFACTURER_PHILIPS)
@@ -8499,10 +8492,14 @@ struct TDICOMdata readDICOMx(char *fname, struct TDCMprefs *prefs, struct TDTI4D
84998492
d.rawDataRunNumber = (d.rawDataRunNumber > gradientOrientationNumberPhilips) ? d.rawDataRunNumber : gradientOrientationNumberPhilips;
85008493
if ((d.rawDataRunNumber < 0) && (d.manufacturer == kMANUFACTURER_PHILIPS) && (nDimIndxVal > 1) && (d.dimensionIndexValues[nDimIndxVal - 1] > 0))
85018494
d.rawDataRunNumber = d.dimensionIndexValues[nDimIndxVal - 1]; // Philips enhanced scans converted to classic with dcuncat
8502-
if (philMRImageDiffVolumeNumber > 0) { // use 2005,1596 for Philips DWI >= R5.6
8495+
if ((philMRImageDiffVolumeNumber > 0) && (swVers < 11)) { // use 2005,1596 for Philips DWI >= R5.6; issue809
85038496
d.rawDataRunNumber = philMRImageDiffVolumeNumber;
85048497
d.phaseNumber = 0;
85058498
}
8499+
/*if (gradientOrientationNumberPhilips >= 0) { //issue809
8500+
d.rawDataRunNumber = gradientOrientationNumberPhilips;
8501+
}*/
8502+
85068503
// Phase encoding polarity
85078504
// next conditionals updated: make GE match Siemens
85088505
// it also rescues Siemens XA20 images without CSA header but with 0021,111C

console/nii_dicom.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ extern "C" {
5050
#define kCPUsuf " " // unknown CPU
5151
#endif
5252

53-
#define kDCMdate "v1.0.20250329"
53+
#define kDCMdate "v1.0.20250330"
5454
#define kDCMvers kDCMdate " " kJP2suf kLSsuf kCCsuf kCPUsuf
5555

5656
static const int kMaxEPI3D = 1024; // maximum number of EPI images in Siemens Mosaic

0 commit comments

Comments
 (0)