Skip to content

Commit cb7e65d

Browse files
committed
update spar/sdat export
fixes in NNLLS and jcoupling tools
1 parent 7554f9b commit cb7e65d

File tree

3 files changed

+88
-65
lines changed

3 files changed

+88
-65
lines changed

QMRITools/GeneralTools.wl

+14-12
Original file line numberDiff line numberDiff line change
@@ -1245,16 +1245,17 @@ LLeastSquaresCCC = Compile[{{A, _Complex, 2}, {y, _Complex, 1}},
12451245
SyntaxInformation[NNLeastSquares] = {"ArgumentsPattern" -> {_, _}};
12461246

12471247
(*Main function*)
1248-
NNLeastSquares[A_, y_] := Block[{At, zeros, x, zeroed, w, zerow, pos, sp, xp, neg, xi, si, alpha, i, j ,l},
1248+
NNLeastSquares[A_, y_] := Block[{At, x, zeroed, w, zerow, pos, sp, xp, neg, xi, si, alpha, i, j ,l},
12491249
(*Initialze values*)
12501250
At = Transpose[A];(*already define Transpose A for speed up CalcW*)
1251-
zeros = 0. A[[1]];
1252-
l = Length[zeros];
12531251

1254-
(*initialize x,w,posSet and zerSet*)
1255-
x = zeros;(*initial solution x=0*)
1256-
zeroed = zeros + 1.;(*zero set all are in zero set*)
1257-
w = CalcW[A, At, y, x];(*initial vector w*)
1252+
(*initialize values*)
1253+
x = 0. A[[1]];
1254+
l = Length[x];
1255+
zeroed = x + 1.;
1256+
1257+
(*initial vector w*)
1258+
w = CalcW[A, At, y, x];
12581259

12591260
(*first while loop: select highest positive solution in the zero set as long as the zero set is not empty*)
12601261
j = 1;
@@ -1270,7 +1271,8 @@ NNLeastSquares[A_, y_] := Block[{At, zeros, x, zeroed, w, zerow, pos, sp, xp, ne
12701271
i = 1;
12711272
While[i < l && Min[sp] < 0.,
12721273
i++;
1273-
(*calculated alpha, which is the minimal values of the rations xi/(xi-si) for all negative values of s*)
1274+
(*calculated alpha, which is the minimal values of the rations xi/(xi-si) for all
1275+
negative values of s*)
12741276
xp = x[[pos]];
12751277
neg = UnitStep[-sp];
12761278
xi = Pick[xp, neg, 1];
@@ -1285,15 +1287,15 @@ NNLeastSquares[A_, y_] := Block[{At, zeros, x, zeroed, w, zerow, pos, sp, xp, ne
12851287
];
12861288

12871289
(*set xp to sp and recalculate w*)
1288-
x[[pos]] = sp;
1290+
x = 0. x; x[[pos]] = sp;
12891291
w = CalcW[A, At, y, x];
1290-
];
1291-
x
1292+
];
1293+
x
12921294
]
12931295

12941296
PosInd = Compile[{{v, _Real, 1}}, Block[{z = Round@Total[1 - v]}, Ordering[v][[;; z]]], RuntimeOptions -> "Speed"];
12951297
CalcW = Compile[{{A, _Real, 2}, {At, _Real, 2}, {y, _Real, 1}, {x, _Real, 1}}, Chop[At.(y - A.x)], RuntimeOptions -> "Speed"];
1296-
LLSC = Compile[{{A, _Real, 2}, {y, _Real, 1}}, Chop[Inverse[A.Transpose[A]].A.y], RuntimeOptions -> "Speed"];
1298+
LLSC = Compile[{{A, _Real, 2}, {y, _Real, 1}},Inverse[A.Transpose[A]].A.y, RuntimeOptions -> "Speed"];
12971299

12981300

12991301
(* ::Subsection::Closed:: *)

QMRITools/JcouplingTools.wl

+13
Original file line numberDiff line numberDiff line change
@@ -558,6 +558,19 @@ GetSpinSystem[name_, OptionsPattern[]]:=Block[{names, n, it, sysS, sysSi, sysJ,
558558
cf=OptionValue[CenterFrequency];
559559

560560
Switch[name,
561+
"PPA",
562+
(*single spin system*)
563+
names={"A"};
564+
n=Length[names];
565+
it=Range[n];
566+
(*sysSi={-2.52,-7.56,-16.15};*)
567+
sysSi={20};
568+
sysS=sysSi-cf;
569+
sysJ={};
570+
sysJ=SysToMat[sysJ,n];
571+
scale={1};
572+
{sysJ,sysS,scale,sysSi,names,it,name}
573+
,
561574
"ATP",
562575
(*single spin system*)
563576
names={"\[Gamma]","\[Alpha]","\[Beta]"};

QMRITools/SpectroTools.wl

+61-53
Original file line numberDiff line numberDiff line change
@@ -355,20 +355,17 @@ CorrectTEFid[fid_, dw_, te_, gyro_, ppmRan_] := Block[{missing},
355355
(*HenkelFit*)
356356

357357

358-
HenkelFit[fid_ ,dw_, te_, gyro_, ppmRan_]:=Block[{timeFull, firstTime, timeOr, timeMis, henk, fit},
358+
HenkelFit[fid_ ,dw_, te_, gyro_, ppmRan_]:=Block[{timeOr, timeMis, henk, fit},
359359
(*get the correct timing of the fid and missing values*)
360-
timeFull = Reverse@Range[dw (Length[fid] - 1) + te, 0., -dw];
361-
firstTime = First[timeFull];
362-
timeFull = If[Abs[firstTime - dw] < firstTime, Prepend[timeFull, firstTime - dw], timeFull];
363-
timeOr = Select[timeFull, # >= te &];
364-
timeMis = Select[timeFull, # < te &];
360+
timeOr = dw Range[1, Length[fid]];
361+
timeMis = Reverse@Range[te - dw, If[Mod[te, dw] > 0.5 dw, -0.5 dw, 0], -dw];
365362

366363
(*get the henkel values*)
367364
henk = HenkelSVDFid[fid, dw, gyro, ppmRan];
368365
fit = (PseudoInverse[HenkelSVDBasisC[timeOr, henk]].fid);
369366

370367
(*missing and full henkle fid*)
371-
{If[timeMis =!= {}, HenkelSVDBasisC[timeMis,henk].fit,{}], HenkelSVDBasisC[timeFull, henk].fit}
368+
{If[timeMis =!= {}, HenkelSVDBasisC[timeMis,henk].fit,{}], HenkelSVDBasisC[timeOr, henk].fit}
372369
]
373370

374371

@@ -871,7 +868,7 @@ FitSpectra[specBasisIn_, specIn_, {st_,end_}, dtime_, {lwvals_?VectorQ, lwamsp_?
871868
Off[FindMinimum::cvmit];Off[FindMinimum::lstol];
872869

873870
(*logging*)
874-
log={};(*Print[Dynamic[Column[log]]];*)
871+
log={};(*Print[Dynamic[Column[log]]]*);
875872

876873
(*get options*)
877874
pad = OptionValue[PaddingFactor];
@@ -1131,14 +1128,15 @@ FitSpectraError[{ppmFull_, spec_}, {timeFull_, timeBasis_}, {indSt_, indEnd_}, {
11311128

11321129
(*----------- Perform Fit and calculate errro -------------*)
11331130
(*perform Fit of basis spectra*)
1134-
fit = Quiet@Clip[LeastSquares[Join[Transpose[Re[specBasisF]],Transpose[Im[specBasisF]]], Join[Re[specF],Im[specF]]],{0,Infinity}];
1135-
1131+
(*fit = Quiet@Clip[LeastSquares[Join[Transpose[Re[specBasisF]],Transpose[Im[specBasisF]]], Join[Re[specF],Im[specF]]],{0,Infinity}];*)
1132+
1133+
fit = Quiet@NNLeastSquares[Transpose[Re[specBasisF]], Re[specF]];
11361134
(*define errors fid and spectra*)
11371135
errorS = specF - fit.specBasisF;
11381136
errorF = fidF - fit.fidBasisF;
11391137

11401138
(*Re and Im error normalized for number of points*)
1141-
err = Mean[Re[errorS]^2] + Mean[Re[errorF]^2] + Mean[Im[errorS]^2] + Mean[Im[errorF]^2];
1139+
err = 2 Mean[Abs[errorS]^2] + Mean[Abs[errorF]^2] (*+ 2 Mean[Im[errorS]^2] + Mean[Im[errorF]^2]*);
11421140

11431141
If[init === 0,
11441142
(*constrain f between 0 and 1*)
@@ -1147,7 +1145,6 @@ FitSpectraError[{ppmFull_, spec_}, {timeFull_, timeBasis_}, {indSt_, indEnd_}, {
11471145
perr = ConFuncC[phi[[2]], -0.5, 0.5, 5];
11481146
(*constrain gam to be positive*)
11491147
gerr = Total[ConFuncC[gam, 1, 500, 3]];
1150-
11511148
(*no initial values, minimize RMSE with f, gam and phase contraint*)
11521149
err + ferr + gerr + perr
11531150
,
@@ -1173,7 +1170,8 @@ FitSpectraError[{ppmFull_, spec_}, {timeFull_, timeBasis_}, {indSt_, indEnd_}, {
11731170
specBasis = BasisSpectraApply[{ppmFull, timeFull, timeBasis}, {gam, eps, phi, f}, gyro, readout];
11741171

11751172
(*perform Fit of basis spectra*)
1176-
fit = Quiet@Clip[LeastSquares[Join[Transpose[Re[specBasis]],Transpose[Im[specBasis]]], Join[Re[spec],Im[spec]]],{0,Infinity}];
1173+
(*fit = Quiet@Clip[LeastSquares[Join[Transpose[Re[specBasis]],Transpose[Im[specBasis]]], Join[Re[spec],Im[spec]]],{0,Infinity}];*)
1174+
fit = Quiet@NNLeastSquares[Transpose[Re[specBasis]], Re[spec]];
11771175
specFit = fit.specBasis;
11781176

11791177
(*fit a spline through the residuals*)
@@ -1808,9 +1806,9 @@ CSIInterface[file_?StringQ, opts : OptionsPattern[]] := CSIInterface[file, {0, 0
18081806

18091807
CSIInterface[file_?StringQ, {tei_?NumberQ, bwi_?NumberQ}, OptionsPattern[]] := Module[{
18101808
f, te, bw, nuc, field, gyro, names, met, metSel, metRef, method, plot, kload, rec, spectraC, dec, line, fine, den, z, y, x,
1811-
sphase, status, statusP, kspace, noise, header, type, ham, spectra, spectraR, spec, proc, shift, times, fids, ppms, specs,
1809+
sphase, status, statusP, kspace, noise, header, type, ham, spectra, spectraR, spec, proc, shift, fids, specs,
18121810
table, fit, basisFit, errorFit, pars, log, plots, specf, fitted, xm, ym, zm, dn, dc, mr, dw, nsamp, filt, teu,
1813-
fileSave, spectraPlot, lab, fovz, fovy, fovx, coils, ncoils,
1811+
fileSave, spectraPlot, lab, fovz, fovy, fovx, coils, ncoils, teE,
18141812
statPart, loadPart, reconPart, plotpart, fitPart, closePart
18151813
},
18161814

@@ -1961,28 +1959,29 @@ CSIInterface[file_?StringQ, {tei_?NumberQ, bwi_?NumberQ}, OptionsPattern[]] := M
19611959
{Button["Save spar/sdat",
19621960
(*saving make better!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!*)
19631961
spectraPlot = Switch[plot,
1964-
"Raw", spectraR,
1965-
"Proc",spectra,
1962+
"Raw", teE=te; spectraR,
1963+
"Proc",teE=te; spectra,
19661964
"Cor",
19671965
If[!sphase,
19681966
status = "Correcting phase of spectra"; statusP = True;
19691967
spectraC = Map[PhaseCorrectSpectra[ApodizePadSpectra[ShiftSpectra[#, {dw, gyro}, -shift]], dw, teu, gyro, {10, -20}, True]&, spectra, {-2}];
19701968
status = "Done phase correcting spectra!"; statusP = False; sphase = True
19711969
];
1970+
teE=0.;
19721971
spectraC
19731972
];
19741973
status = "Saving the CSI data";
19751974
fileSave = SystemDialogInput["FileSave"];
19761975
lab = mr <> If[plot==="Raw","",If[dn, ", denoised", ""] <> If[dc, ", deconvolved", ""]]<>If[plot ==="Cor"," ,phase corrected",""];
1977-
If[fileSave =!= $Canceled, ExportSparSdat[fileSave, spectraPlot, {bw, te}, {gyro, nuc},{"QMRITools Data", fovx, fovz, 0, 0, lab}]];
1976+
If[fileSave =!= $Canceled, ExportSparSdat[fileSave, spectraPlot, {bw, teE}, {gyro, nuc}, {fovz, fovy, fovx}]];
19781977
(*saving make better!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!*)
19791978
,
19801979
Enabled -> Dynamic[rec&&fovy>0&&fovz>0&&fovx>0], Method -> "Queued", ImageSize -> 175],
19811980
Row[{
19821981
{fovz, fovy, fovx} = Round[{fovz, fovy, fovx}];
1983-
TextCell[" FOV z "], InputField[Dynamic[fovz, (fovz = Round[#]) &], Number, FieldSize -> 3, ContinuousAction -> True, Background -> Dynamic[If[fovz>0, White, RGBColor[1, 0.9, 0.9]]]],
1984-
TextCell[" FOV y "], InputField[Dynamic[fovy, (fovy = Round[#]) &], Number, FieldSize -> 3, ContinuousAction -> True, Background -> Dynamic[If[fovy>0, White, RGBColor[1, 0.9, 0.9]]]],
1985-
TextCell[" FOV x "], InputField[Dynamic[fovx, (fovx = Round[#]) &], Number, FieldSize -> 3, ContinuousAction -> True, Background -> Dynamic[If[fovx>0, White, RGBColor[1, 0.9, 0.9]]]]
1982+
TextCell[" vox z [mm] "], InputField[Dynamic[fovz, (fovz = Round[#]) &], Number, FieldSize -> 3, ContinuousAction -> True, Background -> Dynamic[If[fovz>0, White, RGBColor[1, 0.9, 0.9]]]],
1983+
TextCell[" vox y [mm] "], InputField[Dynamic[fovy, (fovy = Round[#]) &], Number, FieldSize -> 3, ContinuousAction -> True, Background -> Dynamic[If[fovy>0, White, RGBColor[1, 0.9, 0.9]]]],
1984+
TextCell[" vox x [mm] "], InputField[Dynamic[fovx, (fovx = Round[#]) &], Number, FieldSize -> 3, ContinuousAction -> True, Background -> Dynamic[If[fovx>0, White, RGBColor[1, 0.9, 0.9]]]]
19861985
}, " "]}
19871986
};
19881987

@@ -1996,7 +1995,7 @@ CSIInterface[file_?StringQ, {tei_?NumberQ, bwi_?NumberQ}, OptionsPattern[]] := M
19961995
NotebookClose[plotwindow];
19971996
(*basis spectra*)
19981997
status = "Generating basis spectra"; statusP = True;
1999-
{names, times, fids, ppms, specs, table} = GetSpectraBasisFunctions[metSel, {"ATP"}, BasisSequence -> {"PulseAcquire", teu},
1998+
{names, fids, specs, table} = GetSpectraBasisFunctions[metSel, {"ATP"}, BasisSequence -> {"PulseAcquire", teu},
20001999
SpectraSamples -> nsamp, SpectraBandwith -> bw, SpectraPpmShift -> 0, SpectraFieldStrength -> field, SpectraNucleus -> nuc];
20012000
status = "Done generating basis spectra!"; statusP = False;
20022001

@@ -2212,12 +2211,13 @@ FromVaxD=Compile[{{int,_Integer,0}},Block[{bin,sign ,fraction, exponent},
22122211
(* ::Subsubsection::Closed:: *)
22132212
(*ExportSparSdat*)
22142213

2214+
Options[ExportSparSdat]={SparName->"QMRITools", SparOrientation->{0,0},SparID->""}
22152215

2216-
SyntaxInformation[ExportSparSdat] = {"ArgumentsPattern" -> {_, _, {_,_}, {_,_}}};
2216+
SyntaxInformation[ExportSparSdat] = {"ArgumentsPattern" -> {_, _, {_,_}, {_,_}, _., OptionsPattern[]}};
22172217

2218-
ExportSparSdat[file_,specs_,{bw_,te_},{gyro_,nuc_}]:=ExportSparSdat[file,specs,{bw,te},{gyro,nuc},{"QMRITools Data",1,1,0,0,"QMRITools Data"}]
2218+
ExportSparSdat[file_, specs_, {bw_, te_}, {gyro_, nuc_}, opts:OptionsPattern[]] := ExportSparSdat[file, specs, {bw, te}, {gyro, nuc}, {1,1,1}, opts]
22192219

2220-
ExportSparSdat[file_,specs_,{bw_,te_},{gyro_,nuc_},pars_]:=Block[{fidsOut,numsOut,fileOut,datOut,headOut},
2220+
ExportSparSdat[file_, specs_, {bw_, te_}, {gyro_, nuc_}, vox_, opts:OptionsPattern[]]:=Block[{fidsOut,numsOut,fileOut,datOut,headOut},
22212221
(*export data*)
22222222
fidsOut=Map[ShiftedInverseFourier,specs,{-2}];
22232223
numsOut=binO=ToVaxD[Flatten[TransData[{Re@fidsOut,Im@fidsOut},"l"]]];
@@ -2227,8 +2227,8 @@ ExportSparSdat[file_,specs_,{bw_,te_},{gyro_,nuc_},pars_]:=Block[{fidsOut,numsOu
22272227
Close[fileOut];
22282228

22292229
(*export header*)
2230-
headOut=MakeSpar[specs,{bw,te},{gyro,nuc},pars];
2231-
Export[file<>".SPAR",headOut,"text"];
2230+
headOut=MakeSpar[specs, {bw, te}, {gyro, nuc}, vox, opts];
2231+
Export[file<>".SPAR", headOut, "text"];
22322232
]
22332233

22342234

@@ -2256,11 +2256,10 @@ ToVaxD=Compile[{{num,_Real,0}},Block[{signBin,numA,exp,expBin,frac,fracBin},
22562256
(* ::Subsubsection::Closed:: *)
22572257
(*MakeSpar*)
22582258

2259+
Options[MakeSpar]=Options[ExportSparSdat];
22592260

2260-
MakeSpar[{dimzO_,dimyO_,dimxO_,nsampO_},{bw_,te_},{gyro_,nuc_}]:=MakeSpar[{dimzO,dimyO,dimxO,nsampO},{bw,te},{gyro,nuc},{"QMRITools Data",1,1,0,0,"QMRITools Data"}];
2261-
2262-
MakeSpar[specs_,{bw_,te_},{gyro_,nuc_},{name_,fov1_,fov2_,tr_,teS_,proc_}]:=Block[{
2263-
dimzO,dimyO,dimxO,nsampO,gyroO,nucO,bwO,teO,nameO,fov1O,fov2O,trO,thickO,processingO,
2261+
MakeSpar[specs_, {bw_, te_}, {gyro_, nuc_}, vox_, OptionsPattern[]]:=Block[{
2262+
dimzO,dimyO,dimxO,nsampO,gyroO,nucO,bwO,teO,nameO, hf, ps, id,
22642263
text,lab,filHeader,fixedHeader, vals, head,row,depth
22652264
},
22662265
(*swith between data dimensions*)
@@ -2285,12 +2284,13 @@ MakeSpar[specs_,{bw_,te_},{gyro_,nuc_},{name_,fov1_,fov2_,tr_,teS_,proc_}]:=Bloc
22852284
];
22862285

22872286
(*manditory input paramters*)
2288-
{gyroO,nucO}={10^6 gyro,nuc};
2289-
{bwO,teO}={bw,te};
2287+
{gyroO,nucO} = {10^6 gyro,nuc};
2288+
{bwO, teO} = {bw, te};
2289+
22902290
(*optional input parameters*)
2291-
{nameO,fov1O,fov2O,trO}={name,fov1,fov2,tr};
2292-
thickO=Round[fov2/dimzO];
2293-
processingO=proc;(*prefer the processing steps*)
2291+
nameO = OptionValue[SparName];
2292+
{hf,ps} = OptionValue[SparOrientation];(*head or feat first / prone or supine*)
2293+
id = OptionValue[SparID];(*prefer the processing steps*)
22942294

22952295
(*all needed fixed header information orders of text and lab are important*)
22962296
text={
@@ -2318,39 +2318,47 @@ MakeSpar[specs_,{bw_,te_},{gyro_,nuc_},{name_,fov1_,fov2_,tr_,teS_,proc_}]:=Bloc
23182318
(*from input*)
23192319
filHeader={
23202320
(*general acquistion names*)
2321-
"patient_position"->"\"head_first\"",(*"\"head_first\"","\"feet_first\""*)
2322-
"patient_orientation" ->"\"supine\"",(*"\"supine\"","\"prone\""*)
2321+
"patient_position"->Switch[hf, 0, "\"head_first\"", 1, "\"feat_first\""],
2322+
"patient_orientation" ->Switch[ps, 0, "\"supine\"", 1, "\"prone\""],
23232323
(*get from input window*)
2324-
"examination_name"->nameO,"patient_name"->nameO,
2325-
"phase_encoding_fov"->fov1O,(*mm fov in freq*)
2326-
"slice_thickness"->fov2O,(*mm fov in phase*)
2327-
"slice_distance"->If[depth>2,thickO,0],(*mm slice thickness*)
2328-
"repetition_time"->trO,(*ms*)
2324+
"examination_name"->"Generated by QMRITools",
2325+
"patient_name"->nameO,
2326+
"phase_encoding_fov"->vox[[2]] dimyO,(*mm fov in freq*)
2327+
"slice_thickness"->vox[[1]] dimzO,(*mm fov in phase*)
2328+
"slice_distance"->If[depth>2, vox[[1]], 0],(*mm slice thickness*)
2329+
"repetition_time"->0,(*ms could be an input parameter but not relevant for now*)
23292330
(*save date*)
23302331
"scan_date"->StringRiffle[ToString/@DateList[Today][[1;;3]],"."]<>" "<>StringRiffle[ToString/@Round[DateList[Now][[-3;;]]],":"],
23312332
(*get from gui with processing settings*)
2332-
"scan_id"->processingO,
2333+
"scan_id"->id (*a string describing the data*),
23332334

23342335
(*get from processing tool*)
23352336
"synthesizer_frequency"->gyroO,(*MHz*)
2336-
"sample_frequency" ->bwO,(*Hz*)
2337-
"nucleus" ->nucO,(*string*)
2337+
"sample_frequency"->bwO,(*Hz*)
2338+
"nucleus"->nucO,(*string*)
23382339
"echo_time"->teO,(*ms*)
2339-
"spectrum_echo_time"->If[teS===0,teO,teS],(*ms, !!! should be 0 after phasing*)
2340+
"spectrum_echo_time"->teO,
23402341

23412342
(*get from data dimensions*)
23422343
"num_dimensions"->Clip[depth,{2,4}],
23432344
(*dynamics if needed*)
2344-
"rows"->row,"spec_row_upper_val"->row,"spec_num_row"->row,
2345+
"rows"->row,
2346+
"spec_row_upper_val"->row,
2347+
"spec_num_row"->row,
23452348
(*fid parameters and time*)
2346-
"samples" ->nsampO,"spec_num_col"->nsampO,"dim1_pnts"->nsampO,
2347-
"dim1_step"-> 1./bwO,(*s*)"spec_col_upper_val"->(nsampO-1)(1./bw),(*s*)
2349+
"samples" ->nsampO,
2350+
"spec_num_col"->nsampO,
2351+
"dim1_pnts"->nsampO,
2352+
"dim1_step"-> 1./bwO,(*s*)
2353+
"spec_col_upper_val"->(nsampO-1)(1./bw),(*s*)
23482354
(*data dimensions*)
2349-
"dim2_pnts"->dimxO,"dim3_pnts"->dimyO,
2355+
"dim2_pnts"->dimxO,
2356+
"dim3_pnts"->dimyO,
23502357
"nr_of_slices_for_multislice"->dimzO,
23512358
"nr_phase_encoding_profiles"->dimxO,
23522359
"nr_of_phase_encoding_profiles_ky"->dimyO,
2353-
"phase_encoding_enable"-> If[depth<=2,"\"no\"","\"yes\""],"dim4_pnts" ->dimzO
2360+
"phase_encoding_enable"-> If[depth<=2,"\"no\"","\"yes\""],
2361+
"dim4_pnts" ->dimzO
23542362
};
23552363

23562364
(*fixed parameters that are default*)
@@ -2383,7 +2391,7 @@ MakeSpar[specs_,{bw_,te_},{gyro_,nuc_},{name_,fov1_,fov2_,tr_,teS_,proc_}]:=Bloc
23832391
"dim4_ext"->"[index]","dim4_low_val"->1.0,"dim4_step"->1.0,"dim4_direction"->"slice","dim4_t0_point"->"-",
23842392
(*closing values*)
23852393
"echo_acquisition"->"NO","TSI_factor"->0,"resp_motion_comp_technique"->"NONE","de_coupling"->"NO",
2386-
"equipment_sw_verions"->"QMRITools CSIinterface","placeholder1"->"","placeholder2"->""
2394+
"equipment_sw_verions"->"QMRITools","placeholder1"->"","placeholder2"->""
23872395
};
23882396

23892397
(*generate the header values*)

0 commit comments

Comments
 (0)