Пример #1
0
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
Пример #2
0
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
Пример #3
0
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
Пример #4
0
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
Пример #5
0
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
Пример #6
0
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
Пример #7
0
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
Пример #8
0
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
Пример #9
0
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
Пример #10
0
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
Пример #11
0
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
Пример #12
0
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
Пример #13
0
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