diff --git a/bvbabel/fbr.py b/bvbabel/fbr.py new file mode 100644 index 0000000..e84a923 --- /dev/null +++ b/bvbabel/fbr.py @@ -0,0 +1,178 @@ +"""Read, write BrainVoyager FBR file format (binary encoded)""" + +import struct + +# ============================================================================= +def read_fbr(filename): + """ + Read Brainvoyager FBR file (Binary encoded) + + https://helpdesk.brainvoyager.com/603922-The-Format-of-FBR-Files + + Parameters + ---------- + filename : string + Path to file. + + Returns + ------- + header : dictionary + FBR header data + groups : list + Fibers/Streamlines + + + Description FBR file format + + Parameter Sample value Description + ------------- --------- ----------- + Magic number (integer 32-bit): 0xa4d3c2b1 Value should be as specified in sample value for binary fiber files + + FileVersion (integer 32-bit): 5 File version of the *.fbr file + + CoordsType (integer 32-bit): 2 BrainVoyager coordinate system: 2 - BVI (default), 1 - SYS, 0 - TAL + + FibersOriginX (float 32-bit): 128 Origin of fibers + FibersOriginY (float 32-bit): 128 + FibersOriginZ (float 32-bit): 128 + + NrOfGroups (int 32-bit): 1 + + [Loop over number of groups:] + + Name (0-terminated 8-bit characters): "Tracked From VOI: testvoi_ACPC" + + Visible (integer 32-bit): 1 Boolean value indicating whether the fiber should be shown + + Animate (integer 32-bit): -1 + + Thickness (float 32-bit): 0.3 Thickness of the shown fiber in mm + + Color (3 * 8-bit): 25 25 127 RGB values for fiber (between 0 and 255) + + NrOfFibers: 121 + + [Loop over number of fibers/streamlines:] + + NrOfPoints (integer 32-bit): 45 + + X positions (float) * number of points + + Y positions (float) * number of points + + Z positions (float) * number of points + + R colour (char) * number of points + + G colour (char) * number of points + + B colour (char) * number of points + """ + + header = dict() + groups = list() + + with open(filename, 'rb') as f: + + # --- Header fields reading --- + magic = f.read(4) + if magic != b'\xa4\xd3\xc2\xb1': # magic number verification + raise ValueError("FBR file has invalid magic number") + + header['FBRFile'] = filename + header['MagicNumber'] = magic + header['FileVersion'] = struct.unpack('