Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
22 changes: 11 additions & 11 deletions brukerapi/cli.py
Original file line number Diff line number Diff line change
Expand Up @@ -112,9 +112,9 @@ def split(args):
dataset = Dataset(args.path_in)

if args.slice_package:
SlicePackageSplitter().split(dataset, write=True)
SlicePackageSplitter().split(dataset, write=True, path_out=args.path_out)
elif args.frame_group:
FrameGroupSplitter(args.frame_group).split(dataset, write=True)
FrameGroupSplitter(args.frame_group).split(dataset, write=True, path_out=args.path_out)


def report(args):
Expand All @@ -124,25 +124,25 @@ def report(args):
:return:
"""
input = Path(args.input)

if args.output is None:
output = None
else:
output = Path(args.output)
output = None if args.output is None else Path(args.output)

if input.is_dir():
# folder in-place
if output is None:
Folder(input).report(format_=args.format, props=args.props, verbose=args.verbose)
elif output.is_dir():
# folder to folder
else:
# folder to folder -- an output folder that does not exist yet is
# created rather than silently matching no branch and exiting 0
output.mkdir(parents=True, exist_ok=True)
Folder(input).report(path_out=output, format_=args.format, props=args.props, verbose=args.verbose)
# dataset in-place
elif output is None:
Dataset(input, add_parameters=["subject"]).report(props=args.props, verbose=args.verbose)
Dataset(input, add_parameters=["subject"]).report(props=args.props, verbose=args.verbose, format_=args.format)
# dataset to folder, or dataset to file
else:
Dataset(input, add_parameters=["subject"]).report(path=output, props=args.props, verbose=args.verbose)
if not output.suffix:
output.mkdir(parents=True, exist_ok=True)
Dataset(input, add_parameters=["subject"]).report(path=output, props=args.props, verbose=args.verbose, format_=args.format)


def filter(args):
Expand Down
34 changes: 23 additions & 11 deletions brukerapi/config/properties_2dseq_core.json
Original file line number Diff line number Diff line change
@@ -1,8 +1,9 @@
{
"pv_version": [
{
"cmd": "#VisuCreatorVersion[1:-1]",
"conditions": []
"cmd": "#VisuCreatorVersion[1:-1].split(';')[0]",
"conditions": [],
"comment": "spec 7.1: VisuCreator/VisuCreatorVersion are semicolon-separated lists; the first creator is the one that wrote the dataset"
}
],
"numpy_dtype": [
Expand Down Expand Up @@ -67,8 +68,12 @@
"conditions": ["#RECO_wordtype in ['_32BIT_SGN_INT','_16BIT_SGN_INT','_32BIT_FLOAT','_8BIT_UNSGN_INT']", "#RECO_byte_order in ['littleEndian','bigEndian']"]
},
{
"cmd": "np.dtype({'ip_int':'int32','ip_short':'int16','ip_float':'float32'}[#DATTYPE]).newbyteorder('<')",
"conditions": ["#DATTYPE in ['ip_int','ip_short','ip_float']"]
"cmd": "np.dtype(DATTYPE_WORD_TYPES[str(#DATTYPE)]).newbyteorder('>' if int(np.atleast_1d(#PR_STA)[15]) else '<')",
"conditions": ["str(#DATTYPE) in DATTYPE_WORD_TYPES", "len(np.atleast_1d(#PR_STA))>15"]
},
{
"cmd": "np.dtype(DATTYPE_WORD_TYPES[str(#DATTYPE)]).newbyteorder('<')",
"conditions": ["str(#DATTYPE) in DATTYPE_WORD_TYPES"]
}
],
"shape_frames": [
Expand Down Expand Up @@ -118,11 +123,17 @@
"conditions": []
},
{
"cmd": "#RECO_size.tuple",
"conditions": []
"cmd": "(int(#IM_SIX), int(#IM_SIY))",
"conditions": [],
"comment": "spec 8: IM_SIX/IM_SIY are the in-plane matrix written after transposition; IM_SIZ is the number of frames, which shape_frames already counts"
},
{
"cmd": "tuple(size for size in (int(#IM_SIX), int(#IM_SIY), int(#IM_SIZ)) if size > 1)",
"cmd": "transposed_size(#RECO_size.tuple, #RECO_transposition)",
"conditions": [],
"comment": "spec 6.9: RECO_size still refers to the non-transposed ordering, so the stored frame shape is RECO_size with the recorded exchange applied"
},
{
"cmd": "#RECO_size.tuple",
"conditions": []
}
],
Expand Down Expand Up @@ -165,8 +176,9 @@
"conditions": []
},
{
"cmd": "#RECO_map_slope.array",
"conditions": []
"cmd": "1.0 / #RECO_map_slope.array",
"conditions": [],
"comment": "spec 3.4: real = pixel / RECO_map_slope + RECO_map_offset, so VisuCoreDataSlope = 1 / RECO_map_slope. Multiplying instead of dividing makes values slope^2 too small"
}
],
"offset": [
Expand All @@ -181,11 +193,11 @@
],
"dim_type": [
{
"cmd": "#VisuCoreDimDesc.list + ['spatial',] + #VisuFGOrderDesc.sub_list(1)",
"cmd": "#VisuCoreDimDesc.list + ['frame',] + #VisuFGOrderDesc.sub_list(1)",
"conditions": ["@is_single_slice==True"]
},
{
"cmd": "#VisuCoreDimDesc.list + ['spatial',]",
"cmd": "#VisuCoreDimDesc.list + ['frame',]",
"conditions": ["@is_single_slice==True"]
},
{
Expand Down
121 changes: 8 additions & 113 deletions brukerapi/config/properties_2dseq_custom.json
Original file line number Diff line number Diff line change
Expand Up @@ -58,15 +58,15 @@
{
"cmd": "np.array([#PVM_VoxArrSize[0,0] * #VisuAcqSize[1], #PVM_VoxArrSize[0,1] * #VisuAcqSize[2], #VisuCoreFrameThickness])",
"conditions": [
"#VisuCreatorVersion in ['<5.1>']",
"@pv_version.split('.')[0]=='5'",
"#VisuCoreDimDesc.list[0]=='spectroscopic'",
"#VisuCoreDimDesc.list[1]=='spatial'",
"#VisuCoreDimDesc.list[2]=='spatial'"]
},
{
"cmd": "np.array([#PVM_VoxArrSize[0,0], #PVM_VoxArrSize[0,1], #PVM_VoxArrSize[0,2]])",
"conditions": [
"#VisuCreatorVersion in ['<6.0.1>']",
"@pv_version.split('.')[0]!='5'",
"#VisuCoreDimDesc.list[0]=='spectroscopic'",
"#VisuCoreDimDesc.list[1]=='spatial'",
"#VisuCoreDimDesc.list[2]=='spatial'"]
Expand Down Expand Up @@ -97,49 +97,34 @@
{
"cmd": "np.array([#PVM_VoxArrSize[0,0], #PVM_VoxArrSize[0,1], #VisuCoreFrameThickness])",
"conditions": [
"#VisuCreatorVersion in ['<5.1>']",
"@pv_version.split('.')[0]=='5'",
"#VisuCoreDimDesc.list[0]=='spectroscopic'",
"#VisuCoreDimDesc.list[1]=='spatial'",
"#VisuCoreDimDesc.list[2]=='spatial'"]
},
{
"cmd": "np.array([#PVM_VoxArrSize[0,0] / #VisuCoreSize[1], #PVM_VoxArrSize[0,1] / #VisuCoreSize[2], #PVM_VoxArrSize[0,2]])",
"conditions": [
"#VisuCreatorVersion in ['<6.0.1>']",
"@pv_version.split('.')[0]!='5'",
"#VisuCoreDimDesc.list[0]=='spectroscopic'",
"#VisuCoreDimDesc.list[1]=='spatial'",
"#VisuCoreDimDesc.list[2]=='spatial'"]
},
{
"cmd": "np.array([#VisuCoreExtent[0] / #VisuCoreSize[0], #VisuCoreExtent[1] / #VisuCoreSize[1], #VisuCoreFrameThickness + #VisuCoreSlicePacksSliceDist.list[0]])",
"conditions": [
"#VisuCreatorVersion in ['<6.0.1>']",
"#VisuCoreDim==2"]
},
{
"cmd": "np.array([#VisuCoreExtent[0] / #VisuCoreSize[0], #VisuCoreExtent[1] / #VisuCoreSize[1], abs(#VisuCorePosition[0,2] - #VisuCorePosition[1,2])])",
"cmd": "np.array([#VisuCoreExtent[0] / #VisuCoreSize[0], #VisuCoreExtent[1] / #VisuCoreSize[1], np.linalg.norm(#VisuCorePosition[1,:] - #VisuCorePosition[0,:])])",
"conditions": [
"#VisuCreatorVersion in ['<5.1>']",
"#VisuCorePosition.size[0]>1",
"#VisuCoreDim==2"]
"#VisuCoreDim==2"],
"comment": "spec 7.10: the distance between two measured slice centres. VisuCoreSlicePacksSliceDist is already centre-to-centre, so it must not be added to VisuCoreFrameThickness"
},
{
"cmd": "np.array([#VisuCoreExtent[0] / #VisuCoreSize[0], #VisuCoreExtent[1] / #VisuCoreSize[1], #VisuCoreFrameThickness])",
"cmd": "np.array([#VisuCoreExtent[0] / #VisuCoreSize[0], #VisuCoreExtent[1] / #VisuCoreSize[1], #VisuCoreSlicePacksSliceDist.list[0]])",
"conditions": [
"#VisuCreatorVersion in ['<5.1>']",
"#VisuCorePosition.size[0]==1",
"#VisuCoreDim==2"]
},
{
"cmd": "np.array([#VisuCoreExtent[0] / #VisuCoreSize[0], #VisuCoreExtent[1] / #VisuCoreSize[1], np.linalg.norm(#VisuCorePosition[1,:] - #VisuCorePosition[0,:])])",
"conditions": [
"#VisuCorePosition.size[0]>1",
"#VisuCoreDim==2"]
},
{
"cmd": "np.array([#VisuCoreExtent[0] / #VisuCoreSize[0], #VisuCoreExtent[1] / #VisuCoreSize[1], #VisuCoreFrameThickness])",
"conditions": [
"#VisuCorePosition.size[0]==1",
"#VisuCoreDim==2"]
},
{
Expand All @@ -150,96 +135,6 @@
"#VisuCoreDimDesc.list[2]=='spatial'"]
}
],
"position_matrix": [
{
"cmd": "np.array([[np.cos(np.pi), -np.sin(np.pi), 0], [np.sin(np.pi), np.cos(np.pi), 0], [0, 0, 1]])",
"conditions": [
"#VisuSubjectPosition=='Head_Supine'"
],
"reference": "This recipe was taken from the version BrkRaw repository (https://github.com/BrkRaw/bruker) version 0.3.4 (10.5281/zenodo.3907018)"
},
{
"cmd": "np.array([[1, 0, 0], [0, 1, 0], [0, 0, 1]])",
"conditions": [
"#VisuSubjectPosition=='Head_Prone'"
],
"reference": "This recipe was taken from the version BrkRaw repository (https://github.com/BrkRaw/bruker) version 0.3.4 (10.5281/zenodo.3907018)"
},
{
"cmd": "np.array([[np.cos(np.pi/2), -np.sin(np.pi/2), 0], [np.sin(np.pi/2), np.cos(np.pi/2), 0], [0, 0, 1]])",
"conditions": [
"#VisuSubjectPosition=='Head_Left'"
],
"reference": "This recipe was taken from the version BrkRaw repository (https://github.com/BrkRaw/bruker) version 0.3.4 (10.5281/zenodo.3907018)"
},
{
"cmd": "np.array([[np.cos(-np.pi/2), -np.sin(-np.pi/2), 0], [np.sin(-np.pi/2), np.cos(-np.pi/2), 0], [0, 0, 1]])",
"conditions": [
"#VisuSubjectPosition=='Head_Right'"
],
"reference": "This recipe was taken from the version BrkRaw repository (https://github.com/BrkRaw/bruker) version 0.3.4 (10.5281/zenodo.3907018)"
},
{
"cmd": "np.array([[1, 0, 0], [0, np.cos(np.pi), -np.sin(np.pi)], [0, np.sin(np.pi), np.cos(np.pi)]]).astype('float')",
"conditions": [
"#VisuSubjectPosition in ['Foot_Supine', 'Tail_Supine']"
],
"reference": "This recipe was taken from the version BrkRaw repository (https://github.com/BrkRaw/bruker) version 0.3.4 (10.5281/zenodo.3907018)"
},
{
"cmd": "np.array([[np.cos(np.pi), 0, np.sin(np.pi)], [0, 1, 0], [-np.sin(np.pi), 0, np.cos(np.pi)]]).astype('float')",
"conditions": [
"#VisuSubjectPosition in ['Foot_Prone', 'Tail_Prone']"
],
"reference": "This recipe was taken from the version BrkRaw repository (https://github.com/BrkRaw/bruker) version 0.3.4 (10.5281/zenodo.3907018)"
},
{
"cmd": "np.array([[np.cos(np.pi/2), -np.sin(np.pi/2), 0], [np.sin(np.pi/2), np.cos(np.pi/2), 0], [0, 0, 1]])",
"conditions": [
"#VisuSubjectPosition in ['Foot_Left', 'Tail_Left']"
],
"reference": "This recipe was taken from the version BrkRaw repository (https://github.com/BrkRaw/bruker) version 0.3.4 (10.5281/zenodo.3907018)"
},
{
"cmd": "np.array([[np.cos(-np.pi/2), -np.sin(-np.pi/2), 0], [np.sin(-np.pi/2), np.cos(-np.pi/2), 0], [0, 0, 1]])",
"conditions": [
"#VisuSubjectPosition in ['Foot_Right', 'Tail_Right']"
],
"reference": "This recipe was taken from the version BrkRaw repository (https://github.com/BrkRaw/bruker) version 0.3.4 (10.5281/zenodo.3907018)"
}
],
"rotation": [
{
"cmd": "np.dot(@position_matrix, np.reshape(#VisuCoreOrientation[0,:],(3,3)).T.dot(np.diag(@resolution)))",
"conditions": [
],
"reference": "This recipe was taken from the version BrkRaw repository (https://github.com/BrkRaw/bruker) version 0.3.4 (10.5281/zenodo.3907018)"
}
],
"position": [
{
"cmd": "#PVM_VoxArrPosition[0,:].astype(np.float64)",
"conditions": [
"#VisuCoreDimDesc.list[0]=='spectroscopic'",
"#VisuCoreDimDesc.list[1]=='spatial'",
"#VisuCoreDimDesc.list[2]=='spatial'"]
},
{
"cmd": "np.array([#VisuCorePosition[0,0] + @extent[0], #VisuCorePosition[0,1] + @extent[1], #VisuCorePosition[0,2]])",
"conditions": []
}
],
"affine": [
{
"cmd": "np.array([[@rotation[0,0], @rotation[0,1], @rotation[0,2], @position[0]],[@rotation[1,0], @rotation[1,1], @rotation[1,2], @position[1]],[@rotation[2,0], @rotation[2,1], @rotation[2,2], @position[2]],[0, 0, 0, 1]])",
"conditions": []
},
{
"cmd": "np.identity(4)",
"conditions": [],
"comment": "default value"
}
],
"TE": [
{
"cmd": "#VisuAcqEchoTime",
Expand Down
Loading