"""Return standard concentrations for 1H MRS brain metabolites for those which match basis set names."""
# These defaults are from the average of the MRS fitting challenge
standardconcs={'Ala':0.60,
'Asc':1.20,
'Asp':2.40,
'Cr':4.87,
'GABA':1.20,
'Glc':1.20,
'Gln':3.37,
'Glu':12.41,
'GPC':0.74,
'GSH':1.20,
'Gly':1.20,
'Ins':7.72,
'Lac':0.60,
'NAA':13.80,
'NAAG':1.20,
'PCho':0.85,
'PCh':0.85,
'PCr':4.87,
'PE':1.80,
'sIns':0.30,
'Scyllo':0.30,
'Tau':1.80}
standardconcs={'Ala':0.60,
'Asc':1.20,
'Asp':2.40,
'Cr':4.87,
'GABA':1.20,
'Glc':1.20,
'Gln':3.37,
'Glu':12.41,
'GPC':0.74,
'GSH':1.20,
'Gly':1.20,
'Ins':7.72,
'Lac':0.60,
'NAA':13.80,
'NAAG':1.20,
'PCho':0.85,
'PCh':0.85,
'PCr':4.87,
'PE':1.80,
'sIns':0.30,
'Scyllo':0.30,
'Tau':1.80}
concs=[]
fornameinbasisNames:
ifnameinstandardconcs:
concs.append(standardconcs[name])
else:
print(f'{name} not in standard concentrations. Setting to random between 1 and 5.')
concs.append(np.random.random()*(5.0-1.0)+1.0)
concs.append(np.random.random()*(5.0-1.0)+1.0)
returnconcs
defsyntheticFromBasisFile(basisFile,
concentrations=None,
broadening=(9.0,0.0),
shifting=0.0,
baseline=[0,0],
coilamps=[1.0],
coilphase=[0.0],
noisecovariance=[[0.1]],
bandwidth=4000.0,
points=2048):
defsyntheticFromBasisFile(basisFile,
concentrations=None,
broadening=(9.0,0.0),
shifting=0.0,
baseline=None,
coilamps=[1.0],
coilphase=[0.0],
noisecovariance=[[0.1]],
bandwidth=4000.0,
points=2048):
""" Create synthetic data from a set of FSL-MRS basis files.
Args:
basisFile (str): path to directory containg basis spectra json files
concentrations (list or dict or None, optional ): If None, standard concentrations will be used.
If list of same length as basis spectra, then these will be used.
Pass dict to overide standard values for specific metabolites. Key should be metabolite name.
broadening (list of tuples or tuple:floats, optional): Tuple containg a gamma and sigma or a list of tuples for
each basis.
If list of same length as basis spectra, then these will be
used.
Pass dict to overide standard values for specific metabolites.
Key should be metabolite name.
broadening (list of tuples or tuple:floats, optional): Tuple containg a gamma and sigma or a list of tuples
for each basis.
shifting (list of floats or float, optional): Eps shift value or a list for each basis.
baseline (list of floats, optional): Baseline parameters. Not yet implemented
coilamps (list of floats, optional): If multiple coils, specify magnitude scaling.
coilphase (list of floats, optional): If multiple coils, specify phase.
noisecovariance (list of floats, optional): N coils x N coils array of noise variance/covariance.
bandwidth (float,optional): Bandwidth of output spectrum in Hz
points (int,optional): Number of points in output spectrum.
points (int,optional): Number of points in output spectrum.
Returns:
FIDs: Numpy array of synthetic FIDs
outHeader: Header suitable for loading FIDs into MRS object.
concentrations: Final concentration scalings
"""
basis,names,header=mrs_io.read_basis(basisFile)
basis,names,header=mrs_io.read_basis(basisFile)
ifconcentrationsisNone:
concentrations=standardConcentrations(names)
elifisinstance(concentrations,(list,np.ndarray)):
elifisinstance(concentrations,(list,np.ndarray)):
iflen(concentrations)!=len(names):
raiseValueError(f'Concentrations must have the same number of elements as basis spectra. {len(concentrations)} concentrations, {len(names)} basis spectra.')
elifisinstance(concentrations,dict):
raiseValueError(f'Concentrations must have the same number of elements as basis spectra.'