@@ -4797,6 +4797,7 @@ struct TDICOMdata readDICOMx(char *fname, struct TDCMprefs *prefs, struct TDTI4D
4797
4797
int multiBandFactor = 0 ;
4798
4798
int frequencyRows = 0 ;
4799
4799
int numberOfImagesInMosaic = 0 ;
4800
+ int swVers = -1 ;
4800
4801
int encapsulatedDataFragments = 0 ;
4801
4802
int encapsulatedDataFragmentStart = 0 ; // position of first FFFE,E000 for compressed images
4802
4803
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
4932
4933
sqDepth00189114 = -1 ; // triggered
4933
4934
// d.aslFlags = kASL_FLAG_PHILIPS_LABEL; kASL_FLAG_PHILIPS_LABEL
4934
4935
// 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) {
4936
4938
isKludgeIssue809 = true ;
4937
4939
for (int i = 0 ; i < nDimIndxVal; i++)
4938
4940
d.dimensionIndexValues [i] = 0 ;
4939
4941
int phase = d.phaseNumber ;
4940
4942
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 ;
4956
4945
int imageType = 0 ;
4957
4946
if (isReal) imageType = 1 ;
4958
4947
if (isImaginary) imageType = 2 ;
4959
4948
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 ;
4969
4952
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 ;
4974
4960
}
4975
4961
if ((volumeNumber == 1 ) && (acquisitionTimePhilips >= 0.0 ) && (inStackPositionNumber > 0 )) {
4976
4962
d.CSA .sliceTiming [inStackPositionNumber - 1 ] = acquisitionTimePhilips;
@@ -5861,6 +5847,7 @@ struct TDICOMdata readDICOMx(char *fname, struct TDCMprefs *prefs, struct TDTI4D
5861
5847
case kSoftwareVersions : {
5862
5848
dcmStr (lLength, &buffer[lPos], d.softwareVersions );
5863
5849
int slen = (int )strlen (d.softwareVersions );
5850
+ swVers = dcmStrInt (lLength, &buffer[lPos]);
5864
5851
if ((slen > 4 ) && (strstr (d.softwareVersions , " XA10" ) != NULL ))
5865
5852
d.isXA10A = true ;
5866
5853
if ((slen > 4 ) && (strstr (d.softwareVersions , " XA11" ) != NULL ))
@@ -7246,7 +7233,7 @@ struct TDICOMdata readDICOMx(char *fname, struct TDCMprefs *prefs, struct TDTI4D
7246
7233
if (d.manufacturer == kMANUFACTURER_PHILIPS ) {
7247
7234
// n.b. historically VR of 2005,1413 is IS, but with R11 is can be SL
7248
7235
// 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 ' ) {
7250
7237
gradientOrientationNumberPhilips = dcmInt (lLength, &buffer[lPos], d.isLittleEndian );
7251
7238
} else {
7252
7239
gradientOrientationNumberPhilips = dcmStrInt (lLength, &buffer[lPos]);
@@ -7272,7 +7259,13 @@ struct TDICOMdata readDICOMx(char *fname, struct TDCMprefs *prefs, struct TDTI4D
7272
7259
case kMRImageDiffBValueNumber :
7273
7260
if (d.manufacturer != kMANUFACTURER_PHILIPS )
7274
7261
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
+ }
7276
7269
break ;
7277
7270
case kMRImageDiffVolumeNumber :
7278
7271
if (d.manufacturer != kMANUFACTURER_PHILIPS )
@@ -8499,10 +8492,14 @@ struct TDICOMdata readDICOMx(char *fname, struct TDCMprefs *prefs, struct TDTI4D
8499
8492
d.rawDataRunNumber = (d.rawDataRunNumber > gradientOrientationNumberPhilips) ? d.rawDataRunNumber : gradientOrientationNumberPhilips;
8500
8493
if ((d.rawDataRunNumber < 0 ) && (d.manufacturer == kMANUFACTURER_PHILIPS ) && (nDimIndxVal > 1 ) && (d.dimensionIndexValues [nDimIndxVal - 1 ] > 0 ))
8501
8494
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
8503
8496
d.rawDataRunNumber = philMRImageDiffVolumeNumber;
8504
8497
d.phaseNumber = 0 ;
8505
8498
}
8499
+ /* if (gradientOrientationNumberPhilips >= 0) { //issue809
8500
+ d.rawDataRunNumber = gradientOrientationNumberPhilips;
8501
+ }*/
8502
+
8506
8503
// Phase encoding polarity
8507
8504
// next conditionals updated: make GE match Siemens
8508
8505
// it also rescues Siemens XA20 images without CSA header but with 0021,111C
0 commit comments