def read_bruker(args): """ :param args: :return list imageOut: :return list fileoutNames: """ imageOut = [] fileoutNames = [] # for all Bruker datasets compliant all queries for data, properties in yield_bruker(args): orientation = NIFTIOrient(np.reshape(np.array(properties['affine']), (4,4))) imageOut.append( nifti_mrs.NIfTI_MRS(data, orientation.Q44, properties['dwell_s'], nifti_mrs.hdr_ext( properties['SpectrometerFrequency'], properties['ResonantNucleus'] )) ) fileoutNames.append(properties['id']) return imageOut, fileoutNames
def jmrui_hdr_to_obj(header): """Translate jMRUI txt header to NIfTI MRS""" if 'TypeOfNucleus' in header: nucleus = id_nucleus(header['TypeOfNucleus'], header['TransmitterFrequency'], header['MagneticField']) else: nucleus = id_nucleus(None, header['TransmitterFrequency'], header['MagneticField']) meta = nifti_mrs.hdr_ext(float(header['TransmitterFrequency']), nucleus) if 'Spectrometer' in header: meta.set_standard_def('ManufacturersModelName', header['Spectrometer']) if 'NameOfPatient' in header: meta.set_standard_def('PatientName', header['NameOfPatient']) meta.set_standard_def('ConversionMethod', f'spec2nii v{spec2nii_ver}') conversion_time = datetime.now().isoformat(sep='T', timespec='milliseconds') meta.set_standard_def('ConversionTime', conversion_time) if 'AdditionalInformation' in header: meta.set_user_def(key='AdditionalInformation', value=header['AdditionalInformation'], doc='jMRUI AdditionalInformation field.') if 'SignalNames' in header: meta.set_user_def(key='SignalNames', value=header['SignalNames'], doc='jMRUI SignalNames field.') return meta
def lcm_raw(args): '''Processing for LCModel .RAW (and .H2O) files. Currently only handles one FID per file. ''' # Read data from file data, header = readLCModelRaw(args.file, conjugate=True) newshape = (1, 1, 1) + data.shape data = data.reshape(newshape) # meta dwelltime = header['dwelltime'] meta = nifti_mrs.hdr_ext(header['centralFrequency'], args.nucleus) meta.set_standard_def('ConversionMethod', f'spec2nii v{spec2nii_ver}') conversion_time = datetime.now().isoformat(sep='T', timespec='milliseconds') meta.set_standard_def('ConversionTime', conversion_time) meta.set_standard_def('OriginalFile', [basename(args.file), ]) # Read optional affine file if args.affine: affine = np.loadtxt(args.affine) else: tmp = np.array([10000, 10000, 10000, 1]) affine = np.diag(tmp) nifti_orientation = NIFTIOrient(affine) img_out = [nifti_mrs.NIfTI_MRS(data, nifti_orientation.Q44, dwelltime, meta), ] # File names if args.fileout: fname_out = [args.fileout, ] else: fname_out = [splitext(basename(args.file))[0], ] # Place in data output format return img_out, fname_out
def text(args): '''Processing for simple ascii formatted columns of data.''' # Read text from file data = np.loadtxt(args.file) data = data[:, 0] + 1j * data[:, 1] newshape = (1, 1, 1) + data.shape data = data.reshape(newshape) # Interpret required arguments (frequency and bandwidth) dwelltime = 1.0 / args.bandwidth meta = nifti_mrs.hdr_ext(args.imagingfreq, args.nucleus) meta.set_standard_def('ConversionMethod', 'spec2nii') conversion_time = datetime.now().isoformat(sep='T', timespec='milliseconds') meta.set_standard_def('ConversionTime', conversion_time) meta.set_standard_def('OriginalFile', [basename(args.file), ]) # Read optional affine file if args.affine: affine = np.loadtxt(args.affine) else: tmp = np.array([10000, 10000, 10000, 1]) affine = np.diag(tmp) nifti_orientation = NIFTIOrient(affine) img_out = [nifti_mrs.NIfTI_MRS(data, nifti_orientation.Q44, dwelltime, meta), ] # File names if args.fileout: fname_out = [args.fileout, ] else: fname_out = [splitext(basename(args.file))[0], ] # Place in data output format return img_out, fname_out
def jmrui_hdr_to_obj_mrui(header, str_info): """Translate jMRUI mrui header to NIfTI MRS""" nucleus = id_nucleus(header['type_of_nucleus'], header['transmitter_frequency'], header['magnetic_field']) meta = nifti_mrs.hdr_ext(header['transmitter_frequency'], nucleus) # meta.set_standard_def('ManufacturersModelName', header['Spectrometer']) # meta.set_standard_def('PatientName', header['NameOfPatient']) meta.set_standard_def('TxOffset', header['reference_frequency_ppm']) meta.set_standard_def('ConversionMethod', 'spec2nii') conversion_time = datetime.now().isoformat(sep='T', timespec='milliseconds') meta.set_standard_def('ConversionTime', conversion_time) meta.set_user_def(key='AdditionalInformation', value=str_info, doc='jMRUI .mrui string field.') return meta
def extractTwixMetadata(mapVBVDHdr, orignal_file): """ Extract information from the pymapVBVD header to insert into the json sidecar. Args: dcmdata (dict): Twix headers Returns: obj (hdr_ext): NIfTI MRS hdr ext object. """ # Extract required metadata and create hdr_ext object obj = nifti_mrs.hdr_ext(mapVBVDHdr['Meas'][('Frequency')] / 1E6, mapVBVDHdr['Meas'][('ResonantNucleus')]) # Standard defined metadata # # 5.1 MRS specific Tags # 'EchoTime' obj.set_standard_def('EchoTime', mapVBVDHdr['Phoenix'][('alTE', '0')] * 1E-6) # 'RepetitionTime' if ('TR_Time') in mapVBVDHdr['Meas']: tr = mapVBVDHdr['Meas'][('TR_Time')] / 1E6 else: tr = mapVBVDHdr['Meas'][('TR')] / 1E6 obj.set_standard_def('RepetitionTime', float(tr)) # 'InversionTime' if ('InversionTime') in mapVBVDHdr['Meas']: obj.set_standard_def('InversionTime', float(mapVBVDHdr['Meas'][('TI_Time')])) # 'MixingTime' # 'ExcitationFlipAngle' obj.set_standard_def('ExcitationFlipAngle', float(mapVBVDHdr['Meas'][('FlipAngle')])) # 'TxOffset' obj.set_standard_def( 'TxOffset', empty_str_to_0float(mapVBVDHdr['Meas'][('dDeltaFrequency')])) # 'VOI' # 'WaterSuppressed' # TO DO # 'WaterSuppressionType' # 'SequenceTriggered' # # 5.2 Scanner information # 'Manufacturer' obj.set_standard_def('Manufacturer', mapVBVDHdr['Dicom'][('Manufacturer')]) # 'ManufacturersModelName' obj.set_standard_def('ManufacturersModelName', mapVBVDHdr['Dicom'][('ManufacturersModelName')]) # 'DeviceSerialNumber' obj.set_standard_def('DeviceSerialNumber', str(mapVBVDHdr['Dicom'][('DeviceSerialNumber')])) # 'SoftwareVersions' obj.set_standard_def('SoftwareVersions', mapVBVDHdr['Dicom'][('SoftwareVersions')]) # 'InstitutionName' obj.set_standard_def('InstitutionName', mapVBVDHdr['Dicom'][('InstitutionName')]) # 'InstitutionAddress' obj.set_standard_def('InstitutionAddress', mapVBVDHdr['Dicom'][('InstitutionAddress')]) # 'TxCoil' # 'RxCoil' rx_coil_1 = ('sCoilSelectMeas', 'aRxCoilSelectData', '0', 'asList', '0', 'sCoilElementID', 'tCoilID') rx_coil_2 = ('asCoilSelectMeas', '0', 'asList', '0', 'sCoilElementID', 'tCoilID') if rx_coil_1 in mapVBVDHdr['MeasYaps']: obj.set_standard_def('RxCoil', mapVBVDHdr['MeasYaps'][rx_coil_1]) elif rx_coil_2 in mapVBVDHdr['MeasYaps']: obj.set_standard_def('RxCoil', mapVBVDHdr['MeasYaps'][rx_coil_2]) # # 5.3 Sequence information # 'SequenceName' obj.set_standard_def('SequenceName', mapVBVDHdr['Meas'][('tSequenceString')]) # 'ProtocolName' obj.set_standard_def('ProtocolName', mapVBVDHdr['Dicom'][('tProtocolName')]) # # 5.4 Sequence information # 'PatientPosition' obj.set_standard_def('PatientPosition', mapVBVDHdr['Meas'][('PatientPosition')]) # 'PatientName' obj.set_standard_def('PatientName', mapVBVDHdr['Meas'][('PatientName')]) # 'PatientID' # 'PatientWeight' obj.set_standard_def('PatientWeight', mapVBVDHdr['Meas'][('flUsedPatientWeight')]) # 'PatientDoB' obj.set_standard_def('PatientDoB', str(mapVBVDHdr['Meas'][('PatientBirthDay')])) # 'PatientSex' if mapVBVDHdr['Meas'][('PatientSex')] == 1: sex_str = 'M' elif mapVBVDHdr['Meas'][('PatientSex')] == 2: sex_str = 'F' else: sex_str = 'O' obj.set_standard_def('PatientSex', sex_str) # # 5.5 Provenance and conversion metadata # 'ConversionMethod' obj.set_standard_def('ConversionMethod', f'spec2nii v{spec2nii_ver}') # 'ConversionTime' conversion_time = datetime.now().isoformat(sep='T', timespec='milliseconds') obj.set_standard_def('ConversionTime', conversion_time) # 'OriginalFile' obj.set_standard_def('OriginalFile', [ orignal_file, ]) # # 5.6 Spatial information # 'kSpace' obj.set_standard_def('kSpace', [False, False, False]) # Some additional information obj.set_user_def(key='PulseSequenceFile', value=mapVBVDHdr['Config'][('SequenceFileName')], doc='Sequence binary path.') obj.set_user_def(key='IceProgramFile', value=mapVBVDHdr['Meas'][('tICEProgramName')], doc='Reconstruction binary path.') return obj
def extractDicomMetadata(dcmdata): """ Extract information from the nibabel DICOM object to insert into the json header ext. Args: dcmdata: nibabel.nicom image object Returns: obj (hdr_ext): NIfTI MRS hdr ext object. """ # Extract required metadata and create hdr_ext object obj = nifti_mrs.hdr_ext( dcmdata.csa_header['tags']['ImagingFrequency']['items'][0], dcmdata.csa_header['tags']['ImagedNucleus']['items'][0]) # Standard defined metadata def set_standard_def(nifti_mrs_key, location, key, cast=None): try: if cast is not None: obj.set_standard_def(nifti_mrs_key, cast(getattr(location, key))) else: obj.set_standard_def(nifti_mrs_key, getattr(location, key)) except AttributeError: pass # # 5.1 MRS specific Tags # 'EchoTime' obj.set_standard_def( 'EchoTime', float(dcmdata.csa_header['tags']['EchoTime']['items'][0] * 1E-3)) # 'RepetitionTime' obj.set_standard_def( 'RepetitionTime', float(dcmdata.csa_header['tags']['RepetitionTime']['items'][0] / 1E3)) # 'InversionTime' if dcmdata.csa_header['tags']['InversionTime']['n_items'] > 0: obj.set_standard_def( 'InversionTime', float(dcmdata.csa_header['tags']['InversionTime']['items'][0])) # 'MixingTime' # 'ExcitationFlipAngle' obj.set_standard_def( 'ExcitationFlipAngle', float(dcmdata.csa_header['tags']['FlipAngle']['items'][0])) # 'TxOffset' # 'VOI' # 'WaterSuppressed' # 'WaterSuppressionType' # 'SequenceTriggered' # # 5.2 Scanner information # 'Manufacturer' set_standard_def('Manufacturer', dcmdata.dcm_data, 'Manufacturer') # 'ManufacturersModelName' set_standard_def('ManufacturersModelName', dcmdata.dcm_data, 'ManufacturerModelName') # 'DeviceSerialNumber' set_standard_def('DeviceSerialNumber', dcmdata.dcm_data, 'DeviceSerialNumber', cast=str) # 'SoftwareVersions' set_standard_def('SoftwareVersions', dcmdata.dcm_data, 'SoftwareVersions') # 'InstitutionName' set_standard_def('InstitutionName', dcmdata.dcm_data, 'InstitutionName') # 'InstitutionAddress' set_standard_def('InstitutionAddress', dcmdata.dcm_data, 'InstitutionAddress') # 'TxCoil' # 'RxCoil' if len(dcmdata.csa_header['tags']['ReceivingCoil']['items']) > 0: obj.set_standard_def( 'RxCoil', dcmdata.csa_header['tags']['ReceivingCoil']['items'][0]) else: obj.set_standard_def( 'RxCoil', dcmdata.csa_header['tags']['ImaCoilString']['items'][0]) # # 5.3 Sequence information # 'SequenceName' obj.set_standard_def( 'SequenceName', dcmdata.csa_header['tags']['SequenceName']['items'][0]) # 'ProtocolName' set_standard_def('ProtocolName', dcmdata.dcm_data, 'ProtocolName') # # 5.4 Sequence information # 'PatientPosition' set_standard_def('PatientPosition', dcmdata.dcm_data, 'PatientPosition') # 'PatientName' set_standard_def('PatientName', dcmdata.dcm_data.PatientName, 'family_name') # 'PatientID' # 'PatientWeight' set_standard_def('PatientWeight', dcmdata.dcm_data, 'PatientWeight', cast=float) # 'PatientDoB' set_standard_def('PatientDoB', dcmdata.dcm_data, 'PatientBirthDate') # 'PatientSex' set_standard_def('PatientSex', dcmdata.dcm_data, 'PatientSex') # # 5.5 Provenance and conversion metadata obj.set_standard_def('ConversionMethod', f'spec2nii v{spec2nii_ver}') # 'ConversionTime' conversion_time = datetime.now().isoformat(sep='T', timespec='milliseconds') obj.set_standard_def('ConversionTime', conversion_time) # 'OriginalFile' # Set elsewhere # # 5.6 Spatial information # 'kSpace' obj.set_standard_def('kSpace', [False, False, False]) # Some additional sequence information obj.set_user_def( key='PulseSequenceFile', value=dcmdata.csa_header['tags']['SequenceName']['items'][0], doc='Sequence binary path.') # obj.set_user_def(key='IceProgramFile', # value=mapVBVDHdr['Meas'][('tICEProgramName')], # doc='Reconstruction binary path.') return obj
def spar_to_nmrs_hdrext(spar_dict): """ Extract information from the dict of keys read from the spar file to insert into the json header ext. :param dict spar_dict: key-value pairs read from spar file :return: NIfTI MRS hdr ext object. """ # Extract required metadata and create hdr_ext object cf = float(spar_dict["synthesizer_frequency"]) / 1E6 obj = nifti_mrs.hdr_ext(cf, spar_dict["nucleus"]) def set_standard_def(nifti_mrs_key, location, key, cast=None): try: if cast is not None: obj.set_standard_def(nifti_mrs_key, cast(getattr(location, key))) else: obj.set_standard_def(nifti_mrs_key, getattr(location, key)) except AttributeError: pass # # 5.1 MRS specific Tags # 'EchoTime' obj.set_standard_def('EchoTime', float(spar_dict['echo_time']) * 1E-3) # 'RepetitionTime' obj.set_standard_def('RepetitionTime', float(spar_dict['repetition_time'] / 1E3)) # 'InversionTime' if spar_dict['spectrum_inversion_time'] > 0: obj.set_standard_def('InversionTime', float(spar_dict['spectrum_inversion_time'])) # 'MixingTime' # 'ExcitationFlipAngle' # 'TxOffset' obj.set_standard_def('TxOffset', float(spar_dict['offset_frequency'] / cf)) # 'VOI' # 'WaterSuppressed' # No apparent parameter stored in the SPAR info. # 'WaterSuppressionType' # 'SequenceTriggered' # # 5.2 Scanner information # 'Manufacturer' obj.set_standard_def('Manufacturer', 'Philips') # 'ManufacturersModelName' # 'DeviceSerialNumber' # 'SoftwareVersions' set_standard_def('SoftwareVersions', spar_dict, 'equipment_sw_verions') # 'InstitutionName' # 'InstitutionAddress' # 'TxCoil' # 'RxCoil' # # 5.3 Sequence information # 'SequenceName' # 'ProtocolName' set_standard_def('ProtocolName', spar_dict, 'scan_id') # # 5.4 Sequence information # 'PatientPosition' try: obj.set_standard_def( 'PatientPosition', spar_dict['patient_position'] + ' ' + spar_dict['patient_orientation']) except AttributeError: pass # 'PatientName' set_standard_def('PatientName', spar_dict, 'patient_name') # 'PatientID' # 'PatientWeight' # 'PatientDoB' set_standard_def('PatientDoB', spar_dict, 'patient_birth_date') # 'PatientSex' # # 5.5 Provenance and conversion metadata # 'ConversionMethod' obj.set_standard_def('ConversionMethod', f'spec2nii v{spec2nii_ver}') # 'ConversionTime' conversion_time = datetime.now().isoformat(sep='T', timespec='milliseconds') obj.set_standard_def('ConversionTime', conversion_time) # 'OriginalFile' # Set elsewhere # # 5.6 Spatial information # 'kSpace' obj.set_standard_def('kSpace', [False, False, False]) return obj
def _populate_metadata(pfile, water_suppressed=True): ''' Populate a nifti-mrs header extension with the requisite information''' hdr = pfile.hdr spec_frequency = float(pfile.hdr.rhr_rh_ps_mps_freq) / 1e7 # Use the mps freq and field strength to determine gamma and thus isotope gamma = (hdr.rhr_rh_ps_mps_freq * 1e-7) / (hdr.rhe_magstrength / 10000.0) if abs(gamma - 42.57) < 0.3: nucleus = "1H" elif abs(gamma - 10.7) < 0.3: nucleus = "13C" elif abs(gamma - 17.2) < 0.3: nucleus = "31P" else: nucleus = "1H" meta = nifti_mrs.hdr_ext(spec_frequency, nucleus) # Standard defined metadata # # 5.1 MRS specific Tags # 'EchoTime' meta.set_standard_def('EchoTime', float(hdr.rhi_te)) # 'RepetitionTime' meta.set_standard_def('RepetitionTime', float(hdr.rhi_tr)) # 'InversionTime' meta.set_standard_def('InversionTime', float(hdr.rhi_ti)) # 'MixingTime' # Not known # 'ExcitationFlipAngle' meta.set_standard_def('ExcitationFlipAngle', float(hdr.rhi_mr_flip)) # 'TxOffset' # Not known # 'VOI' # Not known # 'WaterSuppressed' meta.set_standard_def('WaterSuppressed', water_suppressed) # 'WaterSuppressionType' # Not Known # 'SequenceTriggered' # Not Known # # 5.2 Scanner information # 'Manufacturer' meta.set_standard_def('Manufacturer', 'GE') # 'ManufacturersModelName' meta.set_standard_def('ManufacturersModelName', hdr.rhe_ex_sysid.decode('utf-8')) # 'DeviceSerialNumber' meta.set_standard_def('DeviceSerialNumber', hdr.rhe_uniq_sys_id.decode('utf-8')) # 'SoftwareVersions' meta.set_standard_def('SoftwareVersions', hdr.rhe_ex_verscre.decode('utf-8')) # 'InstitutionName' meta.set_standard_def('InstitutionName', hdr.rhe_hospname.decode('utf-8')) # 'InstitutionAddress' # Not known # 'TxCoil' # Not Known # 'RxCoil' meta.set_user_def(key='ReceiveCoilName', value=hdr.rhi_cname.decode('utf-8'), doc='Rx coil name.') # # 5.3 Sequence information # 'SequenceName' meta.set_standard_def('SequenceName', hdr.rhi_psdname.decode('utf-8')) # 'ProtocolName' meta.set_standard_def('ProtocolName', hdr.rhs_se_desc.decode('utf-8')) # # 5.4 Sequence information # 'PatientPosition' # Not known # 'PatientName' meta.set_standard_def('PatientName', hdr.rhe_patname.decode('utf-8')) # 'PatientID' # Not known # 'PatientWeight' # Not known # 'PatientDoB' meta.set_standard_def('PatientDoB', hdr.rhe_dateofbirth.decode('utf-8')) # 'PatientSex' if hdr.rhe_patsex == 1: sex_str = 'M' elif hdr.rhe_patsex == 2: sex_str = 'F' else: sex_str = 'O' meta.set_standard_def('PatientSex', sex_str) # # 5.5 Provenance and conversion metadata # 'ConversionMethod' meta.set_standard_def('ConversionMethod', f'spec2nii v{spec2nii_ver}') # 'ConversionTime' conversion_time = datetime.now().isoformat(sep='T', timespec='milliseconds') meta.set_standard_def('ConversionTime', conversion_time) # 'OriginalFile' meta.set_standard_def('OriginalFile', [basename(pfile.file_name)]) # # 5.6 Spatial information # 'kSpace' meta.set_standard_def('kSpace', [False, False, False]) return meta
def read_varian(args): """read_varian -- load a varian fid. Note that this format is very flexible and some rather large assumptions are made. At the moment, this assumes little. :param file: path to the varian .fid directory, containing fid and procpar files. returns img_out, fname_out """ dic, data = v.read(args.file) # extract number of coils number_of_coils = 0 for i in dic['procpar']['rcvrs']['values'][0]: if re.search(i, 'y'): number_of_coils += 1 # number of time points -- probably number_of_time_points = float( dic['procpar']['arraydim']['values'][0]) / number_of_coils if (not number_of_time_points.is_integer()): raise ValueError('Coil reshaping failed') number_of_time_points = int(number_of_time_points) # spectral number of points number_of_spectral_points = int(int(dic['np']) / 2) # reshape newshape = (1, 1, 1, number_of_spectral_points, number_of_coils, number_of_time_points) data = data.transpose() data = np.resize(data, newshape) # extract additional spectral metadata dwelltime = 1.0 / float(dic['procpar']['sw']['values'][0]) imagingfreq = float(dic['procpar']['sfrq']['values'][0]) nucleus = dic['procpar']['tn']['values'][0] # reshape to be in the form '13C' rather than 'C13' nucleus = nucleus[1:] + nucleus[0] try: repitition_time = float(dic['procpar']['tr']['values'][0]) except KeyError: pass try: echotime = float( dic['procpar']['te']['values'][0]) # In ms if 'tis there except KeyError: pass try: echotime = float(dic['procpar']['pw']['values'][0]) + float( dic['procpar']['alfa']['values'][0]) except KeyError: pass try: echotime = float(dic['procpar']['p1']['values'][0]) + float( dic['procpar']['alfa']['values'][0]) except KeyError: pass # Parse 3D localisation sequence_name = dic['procpar']['seqfil']['values'][0] if (sequence_name.count('press') or sequence_name.count('steam')): affine = _varian_orientation_3d(dic) else: affine = np.diag(np.array([10000, 10000, 10000, 1])) # 10 m slab for now.... # TODO: Jack should implement the affine matrix correctly for all sequences orientation = NIFTIOrient(affine) # create object meta = nifti_mrs.hdr_ext(imagingfreq, nucleus) meta.set_standard_def('ConversionMethod', f'spec2nii v{spec2nii_ver}') meta.set_standard_def('EchoTime', echotime) meta.set_standard_def('RepetitionTime', repitition_time) meta.set_standard_def('Manufacturer', 'Varian') meta.set_standard_def('ProtocolName', dic['procpar']['seqfil']['values'][0]) meta.set_standard_def('PatientName', dic['procpar']['comment']['values'][0]) # stuff that is nice to have: try: meta.set_standard_def('SoftwareVersions', dic['procpar']['parver']['values'][0]) meta.set_standard_def('TxCoil', dic['procpar']['rfcoil']['values'][0]) meta.set_standard_def('RxCoil', dic['procpar']['rfcoil']['values'][0]) except KeyError: warnings.warn('Expected standard metadata keying failed') try: meta.set_standard_def('InversionTime', dic['procpar']['ti']['values'][0]) except KeyError: pass try: meta.set_standard_def('ExcitationFlipAngle', dic['procpar']['flip1']['values'][0]) except KeyError: pass conversion_time = datetime.now().isoformat(sep='T', timespec='milliseconds') meta.set_standard_def('ConversionTime', conversion_time) meta.set_standard_def('OriginalFile', [basename(args.file)]) # k-space meta.set_standard_def('kSpace', [False, False, False]) # set tag dimensions meta.set_dim_info(0, "DIM_COIL") meta.set_dim_info(1, args.tag6) # Stuff full headers into user fields if args.dump_headers: meta.set_user_def(key='VarianProcpar', doc='Varian procpar metadata.', value=dic['procpar']) # File names if args.fileout: fname_out = [ args.fileout, ] else: fname_out = [ splitext(basename(args.file))[0], ] return [ nifti_mrs.NIfTI_MRS(data, orientation.Q44, dwelltime, meta), ], fname_out
def _extractDicomMetadata(dcmdata, water_suppressed=True): """ Extract information from the nibabel DICOM object to insert into the json header ext. Args: dcmdata: nibabel.nicom image object Returns: obj (hdr_ext): NIfTI MRS hdr ext object. """ # Extract required metadata and create hdr_ext object obj = nifti_mrs.hdr_ext(dcmdata.dcm_data.TransmitterFrequency, dcmdata.dcm_data.ResonantNucleus) def set_if_present(tag, val): if val: obj.set_standard_def(tag, val) # Standard metadata # # 5.1 MRS specific Tags # 'EchoTime' echo_time = float(dcmdata.dcm_data.PerFrameFunctionalGroupsSequence[0]. MREchoSequence[0].EffectiveEchoTime) * 1E-3 obj.set_standard_def('EchoTime', echo_time) # 'RepetitionTime' rep_tim = float( dcmdata.dcm_data.PerFrameFunctionalGroupsSequence[0]. MRTimingAndRelatedParametersSequence[0].RepetitionTime) / 1E3 obj.set_standard_def('RepetitionTime', rep_tim) # 'InversionTime' # Not known # 'MixingTime' # Not known # 'ExcitationFlipAngle' fa = float(dcmdata.dcm_data.PerFrameFunctionalGroupsSequence[0]. MRTimingAndRelatedParametersSequence[0].RepetitionTime) obj.set_standard_def('ExcitationFlipAngle', fa) # 'TxOffset' # Not known # 'VOI' # Not known # 'WaterSuppressed' obj.set_standard_def('WaterSuppressed', water_suppressed) # 'WaterSuppressionType' # Not known # 'SequenceTriggered' # Not known # # 5.2 Scanner information # 'Manufacturer' obj.set_standard_def('Manufacturer', dcmdata.dcm_data.Manufacturer) # 'ManufacturersModelName' obj.set_standard_def('ManufacturersModelName', dcmdata.dcm_data.ManufacturerModelName) # 'DeviceSerialNumber' if 'DeviceSerialNumber' in dcmdata.dcm_data: obj.set_standard_def('DeviceSerialNumber', str(dcmdata.dcm_data.DeviceSerialNumber)) # 'SoftwareVersions' obj.set_standard_def('SoftwareVersions', str(dcmdata.dcm_data.SoftwareVersions)) # 'InstitutionName' obj.set_standard_def('InstitutionName', dcmdata.dcm_data.InstitutionName) # 'InstitutionAddress' if 'InstitutionAddress' in dcmdata.dcm_data: obj.set_standard_def('InstitutionAddress', dcmdata.dcm_data.InstitutionAddress) # 'TxCoil' # Not known # 'RxCoil' # ToDo # img.dcm_data.SharedFunctionalGroupsSequence[0].MRReceiveCoilSequence[0].ReceiveCoilName # # 5.3 Sequence information # 'SequenceName' obj.set_standard_def('SequenceName', dcmdata.dcm_data.PulseSequenceName) # 'ProtocolName' obj.set_standard_def('ProtocolName', dcmdata.dcm_data.ProtocolName) # # 5.4 Sequence information # 'PatientPosition' obj.set_standard_def('PatientPosition', dcmdata.dcm_data.PatientPosition) # 'PatientName' if dcmdata.dcm_data.PatientName: obj.set_standard_def('PatientName', dcmdata.dcm_data.PatientName.family_name) # 'PatientID' # Not known # 'PatientWeight' if 'PatientWeight' in dcmdata.dcm_data and dcmdata.dcm_data.PatientWeight: obj.set_standard_def('PatientWeight', float(dcmdata.dcm_data.PatientWeight)) # 'PatientDoB' set_if_present('PatientDoB', dcmdata.dcm_data.PatientBirthDate) # 'PatientSex' set_if_present('PatientSex', dcmdata.dcm_data.PatientSex) # # 5.5 Provenance and conversion metadata # 'ConversionMethod' obj.set_standard_def('ConversionMethod', f'spec2nii v{spec2nii_ver}') # 'ConversionTime' conversion_time = datetime.now().isoformat(sep='T', timespec='milliseconds') obj.set_standard_def('ConversionTime', conversion_time) # 'OriginalFile' # Added later # # 5.6 Spatial information # 'kSpace' obj.set_standard_def('kSpace', [False, False, False]) return obj
def _fid_meta(d, dump=False): """ Extract information from method and acqp file into hdr_ext. :param d: Dataset :return: NIfTI MRS hdr ext object. """ # Extract required metadata and create hdr_ext object cf = d.SpectrometerFrequency obj = nifti_mrs.hdr_ext(cf, d.ResonantNucleus) # # 5.1 MRS specific Tags # 'EchoTime' obj.set_standard_def('EchoTime', float(d.TE * 1E-3)) # 'RepetitionTime' obj.set_standard_def('RepetitionTime', float(d.TR / 1E3)) # 'InversionTime' # 'MixingTime' # 'ExcitationFlipAngle' # 'TxOffset' # Bit of a guess, not sure of units. obj.set_standard_def('TxOffset', float(d.working_offset[0])) # 'VOI' # 'WaterSuppressed' # No apparent parameter stored in the SPAR info. # 'WaterSuppressionType' # 'SequenceTriggered' # # 5.2 Scanner information # 'Manufacturer' obj.set_standard_def('Manufacturer', 'Bruker') # 'ManufacturersModelName' # 'DeviceSerialNumber' # 'SoftwareVersions' obj.set_standard_def('SoftwareVersions', d.PV_version) # 'InstitutionName' # 'InstitutionAddress' # 'TxCoil' # 'RxCoil' # # 5.3 Sequence information # 'SequenceName' obj.set_standard_def('SequenceName', d.method_desc) # 'ProtocolName' # # 5.4 Sequence information # 'PatientPosition' # 'PatientName' obj.set_standard_def('PatientName', d.subj_id) # 'PatientID' # 'PatientWeight' # 'PatientDoB' # 'PatientSex' # # 5.5 Provenance and conversion metadata # 'ConversionMethod' obj.set_standard_def('ConversionMethod', f'spec2nii v{spec2nii_ver}') # 'ConversionTime' conversion_time = datetime.now().isoformat(sep='T', timespec='milliseconds') obj.set_standard_def('ConversionTime', conversion_time) # 'OriginalFile' obj.set_standard_def('OriginalFile', [str(d.path), ]) # # 5.6 Spatial information # 'kSpace' obj.set_standard_def('kSpace', [False, False, False]) # Stuff full headers into user fields if dump: for hdr_file in d.parameters: obj.set_user_def(key=hdr_file, doc=f'Bruker {hdr_file} file.', value=d.parameters[hdr_file].to_dict()) # Tags unknown_count = 0 for ddx, dim in enumerate(d.dim_type[1:]): if dim in fid_dimension_defaults: obj.set_dim_info(ddx, fid_dimension_defaults[dim]) else: obj.set_dim_info(ddx, f'DIM_USER_{unknown_count}') unknown_count += 1 return obj
def extractDicomMetadata(dcmdata): """ Extract information from the nibabel DICOM object to insert into the json header ext. There seems to be a large 'uprotocol' in tag 0065,1007 but I don't know how to interpret it. Args: dcmdata: nibabel.nicom image object Returns: obj (hdr_ext): NIfTI MRS hdr ext object. """ # Extract required metadata and create hdr_ext object obj = nifti_mrs.hdr_ext(dcmdata.dcm_data.TransmitterFrequency, dcmdata.dcm_data.ResonantNucleus) def set_if_present(tag, val): if val: obj.set_standard_def(tag, val) # Standard defined # # 5.1 MRS specific Tags # 'EchoTime' obj.set_standard_def('EchoTime', float(dcmdata.dcm_data.EchoTime) * 1E-3) # 'RepetitionTime' obj.set_standard_def('RepetitionTime', float(dcmdata.dcm_data.RepetitionTime) / 1E3) # 'InversionTime' if 'InversionTime' in dcmdata.dcm_data: obj.set_standard_def('InversionTime', float(dcmdata.dcm_data.InversionTime) * 1E-3) # 'MixingTime' # 'ExcitationFlipAngle' obj.set_standard_def('ExcitationFlipAngle', float(dcmdata.dcm_data.FlipAngle)) # 'TxOffset' # 'VOI' # 'WaterSuppressed' # TO DO # 'WaterSuppressionType' # 'SequenceTriggered' # # 5.2 Scanner information # 'Manufacturer' obj.set_standard_def('Manufacturer', dcmdata.dcm_data.Manufacturer) # 'ManufacturersModelName' obj.set_standard_def('ManufacturersModelName', dcmdata.dcm_data.ManufacturerModelName) # 'DeviceSerialNumber' obj.set_standard_def('DeviceSerialNumber', str(dcmdata.dcm_data.DeviceSerialNumber)) # 'SoftwareVersions' obj.set_standard_def('SoftwareVersions', dcmdata.dcm_data.SoftwareVersions) # 'InstitutionName' obj.set_standard_def('InstitutionName', dcmdata.dcm_data.InstitutionName) # 'InstitutionAddress' obj.set_standard_def('InstitutionAddress', dcmdata.dcm_data.InstitutionAddress) # 'TxCoil' # 'RxCoil' # No apparent coil name in header. # # 5.3 Sequence information # 'SequenceName' obj.set_standard_def('SequenceName', dcmdata.dcm_data.SequenceName) # 'ProtocolName' obj.set_standard_def('ProtocolName', dcmdata.dcm_data.ProtocolName) # # 5.4 Sequence information # 'PatientPosition' obj.set_standard_def('PatientPosition', dcmdata.dcm_data.PatientPosition) # 'PatientName' if dcmdata.dcm_data.PatientName: obj.set_standard_def('PatientName', dcmdata.dcm_data.PatientName.family_name) # 'PatientID' # 'PatientWeight' if dcmdata.dcm_data.PatientWeight: obj.set_standard_def('PatientWeight', float(dcmdata.dcm_data.PatientWeight)) # 'PatientDoB' set_if_present('PatientDoB', dcmdata.dcm_data.PatientBirthDate) # 'PatientSex' set_if_present('PatientSex', dcmdata.dcm_data.PatientSex) # # 5.5 Provenance and conversion metadata # 'ConversionMethod' obj.set_standard_def('ConversionMethod', f'spec2nii v{spec2nii_ver}') # 'ConversionTime' conversion_time = datetime.now().isoformat(sep='T', timespec='milliseconds') obj.set_standard_def('ConversionTime', conversion_time) # 'OriginalFile' # Set elsewhere # # 5.6 Spatial information # 'kSpace' obj.set_standard_def('kSpace', [False, False, False]) return obj