diff --git a/molecularnodes/io/parse/__init__.py b/molecularnodes/io/parse/__init__.py index e19866d0..1c2f6e96 100644 --- a/molecularnodes/io/parse/__init__.py +++ b/molecularnodes/io/parse/__init__.py @@ -7,7 +7,7 @@ # from .cif import CIF from .pdb import PDB from .cellpack import CellPack -from .star import StarFile +from .star import StarFile, NDJSON from .sdf import SDF from .mda import MDAnalysisSession from .mrc import MRC diff --git a/molecularnodes/io/parse/star.py b/molecularnodes/io/parse/star.py index b6a273a5..19e95d67 100644 --- a/molecularnodes/io/parse/star.py +++ b/molecularnodes/io/parse/star.py @@ -1,8 +1,12 @@ import numpy as np import bpy +import json + +from mathutils import Matrix from .ensemble import Ensemble from ... import blender as bl + @bpy.app.handlers.persistent def _rehydrate_ensembles(scene): for obj in bpy.data.objects: @@ -13,11 +17,11 @@ def _rehydrate_ensembles(scene): bpy.types.Scene.MN_starfile_ensembles = [] bpy.types.Scene.MN_starfile_ensembles.append(ensemble) + class StarFile(Ensemble): def __init__(self, file_path): super().__init__(file_path) - - + @classmethod def from_starfile(cls, file_path): self = cls(file_path) @@ -28,7 +32,7 @@ def from_starfile(cls, file_path): self._create_mn_columns() self.n_images = self._n_images() return self - + @classmethod def from_blender_object(cls, blender_object): import bpy @@ -42,9 +46,9 @@ def from_blender_object(cls, blender_object): self.current_image = -1 self._create_mn_columns() self.n_images = self._n_images() - bpy.app.handlers.depsgraph_update_post.append(self._update_micrograph_texture) + bpy.app.handlers.depsgraph_update_post.append( + self._update_micrograph_texture) return self - def _read(self): import starfile @@ -69,7 +73,8 @@ def _create_mn_columns(self): # Get absolute position and orientations if self.star_type == 'relion': - df = self.data['particles'].merge(self.data['optics'], on='rlnOpticsGroup') + df = self.data['particles'].merge( + self.data['optics'], on='rlnOpticsGroup') # get necessary info from dataframes # Standard cryoEM starfile don't have rlnCoordinateZ. If this column is not present @@ -78,7 +83,7 @@ def _create_mn_columns(self): df['rlnCoordinateZ'] = 0 self.positions = df[['rlnCoordinateX', 'rlnCoordinateY', - 'rlnCoordinateZ']].to_numpy() + 'rlnCoordinateZ']].to_numpy() pixel_size = df['rlnImagePixelSize'].to_numpy().reshape((-1, 1)) self.positions = self.positions * pixel_size shift_column_names = ['rlnOriginXAngst', @@ -99,7 +104,7 @@ def _create_mn_columns(self): 'category').cat.codes.to_numpy() except KeyError: df['MNImageId'] = 0.0 - + self.data = df elif self.star_type == 'cistem': @@ -109,34 +114,38 @@ def _create_mn_columns(self): df['cisTEMZFromDefocus'] = df['cisTEMZFromDefocus'] - \ df['cisTEMZFromDefocus'].median() self.positions = df[['cisTEMOriginalXPosition', - 'cisTEMOriginalYPosition', 'cisTEMZFromDefocus']].to_numpy() + 'cisTEMOriginalYPosition', 'cisTEMZFromDefocus']].to_numpy() df['MNAnglePhi'] = df['cisTEMAnglePhi'] df['MNAngleTheta'] = df['cisTEMAngleTheta'] df['MNAnglePsi'] = df['cisTEMAnglePsi'] df['MNPixelSize'] = df['cisTEMPixelSize'] df['MNImageId'] = df['cisTEMOriginalImageFilename'].astype( 'category').cat.codes.to_numpy() - + def _convert_mrc_to_tiff(self): import mrcfile from pathlib import Path if self.star_type == 'relion': micrograph_path = self.object['rlnMicrographName_categories'][self.star_node.inputs['Image'].default_value - 1] elif self.star_type == 'cistem': - micrograph_path = self.object['cisTEMOriginalImageFilename_categories'][self.star_node.inputs['Image'].default_value - 1].strip("'") + micrograph_path = self.object['cisTEMOriginalImageFilename_categories'][ + self.star_node.inputs['Image'].default_value - 1].strip("'") else: return False - + # This could be more elegant if not Path(micrograph_path).exists(): pot_micrograph_path = Path(self.file_path).parent / micrograph_path if not pot_micrograph_path.exists(): if self.star_type == 'relion': - pot_micrograph_path = Path(self.file_path).parent.parent.parent / micrograph_path + pot_micrograph_path = Path( + self.file_path).parent.parent.parent / micrograph_path if not pot_micrograph_path.exists(): - raise FileNotFoundError(f"Micrograph file {micrograph_path} not found") + raise FileNotFoundError( + f"Micrograph file {micrograph_path} not found") else: - raise FileNotFoundError(f"Micrograph file {micrograph_path} not found") + raise FileNotFoundError( + f"Micrograph file {micrograph_path} not found") micrograph_path = pot_micrograph_path tiff_path = Path(micrograph_path).with_suffix('.tiff') @@ -148,21 +157,23 @@ def _convert_mrc_to_tiff(self): if micrograph_data.ndim == 3: micrograph_data = np.sum(micrograph_data, axis=0) # Normalize the data to 0-1 - micrograph_data = (micrograph_data - micrograph_data.min()) / (micrograph_data.max() - micrograph_data.min()) - + micrograph_data = (micrograph_data - micrograph_data.min()) / \ + (micrograph_data.max() - micrograph_data.min()) + if micrograph_data.dtype != np.float32: micrograph_data = micrograph_data.astype(np.float32) from PIL import Image # Need to invert in Y to generate the correct tiff - Image.fromarray(micrograph_data[::-1,:]).save(tiff_path) + Image.fromarray(micrograph_data[::-1, :]).save(tiff_path) return tiff_path - + def _update_micrograph_texture(self, *_): try: show_micrograph = self.star_node.inputs['Show Micrograph'] _ = self.object['mn'] except ReferenceError: - bpy.app.handlers.depsgraph_update_post.remove(self._update_micrograph_texture) + bpy.app.handlers.depsgraph_update_post.remove( + self._update_micrograph_texture) return if self.star_node.inputs['Image'].default_value == self.current_image: return @@ -180,15 +191,13 @@ def _update_micrograph_texture(self, *_): self.micrograph_material.node_tree.nodes['Image Texture'].image = image_obj self.star_node.inputs['Micrograph'].default_value = image_obj - - def create_model(self, name='StarFileObject', node_setup=True, world_scale=0.01): from molecularnodes.blender.nodes import get_star_node, MN_micrograph_material blender_object = bl.obj.create_object( self.positions * world_scale, collection=bl.coll.mn(), name=name) blender_object.mn['molecule_type'] = 'star' - + # create attribute for every column in the STAR file for col in self.data.columns: col_type = self.data[col].dtype @@ -201,7 +210,8 @@ def create_model(self, name='StarFileObject', node_setup=True, world_scale=0.01) elif col_type == object: codes = self.data[col].astype( 'category').cat.codes.to_numpy().reshape(-1) - bl.obj.set_attribute(blender_object, col, codes, 'INT', 'POINT') + bl.obj.set_attribute(blender_object, col, + codes, 'INT', 'POINT') # Add the category names as a property to the blender object blender_object[f'{col}_categories'] = list( self.data[col].astype('category').cat.categories) @@ -215,5 +225,72 @@ def create_model(self, name='StarFileObject', node_setup=True, world_scale=0.01) self.object = blender_object self.star_node = get_star_node(self.object) self.micrograph_material = MN_micrograph_material() - bpy.app.handlers.depsgraph_update_post.append(self._update_micrograph_texture) + bpy.app.handlers.depsgraph_update_post.append( + self._update_micrograph_texture) return blender_object + + +class NDJSON(Ensemble): + def __init__(self, file_path): + super().__init__(file_path) + self.scale = 10 + + @classmethod + def from_ndjson(cls, file_path): + self = cls(file_path) + self.data = self._read() + return self + + def _read(self): + with open(self.file_path, 'r') as f: + lines = f.readlines() + + has_rotation = bool(json.loads(lines[0]).get('xyz_rotation_matrix')) + + arr = np.zeros((len(lines), 4, 4), float) + + for i, line in enumerate(lines): + matrix = np.identity(4, float) + data = json.loads(line) + pos = [data['location'][axis] for axis in 'xyz'] + + matrix[:3, 3] = pos + if has_rotation: + matrix[:3, :3] = data['xyz_rotation_matrix'] + # fixes orientation issues for how the matrices are stored + # https://github.com/BradyAJohnston/MolecularNodes/pull/493#issuecomment-2127461280 + matrix[:3, :3] = np.flip(matrix[:3, :3]) + arr[i] = matrix + + # returns a (n, 4, 4) matrix, where the 4x4 rotation matrix is returned for + # each point from the ndjson file + # this currently doesn't handle where there might be different points or different + # proteins being instanced on those points, at which point we will have to change + # what kind of array we are returning + return arr + + def create_model(self, name='NewInstances', world_scale=0.01, node_setup=True): + n_points = len(self.data) + data = np.zeros((n_points, 7), float) + + for i in range(n_points): + translation, rotation, scale = Matrix(self.data[i]).decompose() + data[i, :3] = translation + data[i, 3:] = rotation + + # use the positions to create the object + bob = bl.obj.create_object( + vertices=data[:, :3] * world_scale * self.scale, + collection=bl.coll.mn(), + name=name + ) + bob.mn['molecule_type'] = 'ndjson' + + bl.obj.set_attribute( + object=bob, + name='rotation', + data=data[:, 3:], + type='QUATERNION' + ) + + self.object = bob diff --git a/molecularnodes/io/star.py b/molecularnodes/io/star.py index 5b6743ca..02a5e6f2 100644 --- a/molecularnodes/io/star.py +++ b/molecularnodes/io/star.py @@ -1,6 +1,8 @@ import bpy +from pathlib import Path from . import parse + bpy.types.Scene.MN_import_star_file_path = bpy.props.StringProperty( name='File', description='File path for the `.star` file to import.', @@ -21,10 +23,18 @@ def load( node_setup=True, world_scale=0.01 ): + suffix = Path(file_path).suffix + parser = { + '.star': parse.StarFile.from_starfile, + '.ndjson': parse.NDJSON.from_ndjson + } - ensemble = parse.StarFile.from_starfile(file_path) - ensemble.create_model(name=name, node_setup=node_setup, - world_scale=world_scale) + ensemble = parser[suffix](file_path) + ensemble.create_model( + name=name, + node_setup=node_setup, + world_scale=world_scale + ) return ensemble diff --git a/tests/__snapshots__/test_star.ambr b/tests/__snapshots__/test_star.ambr new file mode 100644 index 00000000..0b93ba2c --- /dev/null +++ b/tests/__snapshots__/test_star.ambr @@ -0,0 +1,205 @@ +# serializer version: 1 +# name: test_read_ndjson_oriented + array([[67.89524841, 17.43763161, 22.13544273], + [23.08059692, 61.77287674, 12.38536263], + [64.4564743 , 30.65621567, 18.54438591], + [52.86577606, 55.69303131, 16.25313187], + [ 6.20414495, 36.64030838, 6.37513065], + [54.58604813, 29.43314171, 22.34353828], + [14.06875038, 47.85198975, 21.17700577], + [43.96713638, 65.11677551, 23.58200073], + [44.89732361, 62.41956711, 24.19034004], + [55.74905396, 65.76979065, 11.86001968], + [36.090065 , 52.66305542, 10.34024143], + [31.31638527, 47.66959763, 15.3553524 ], + [11.97279644, 44.25136948, 5.44673634], + [54.46987152, 15.13813591, 15.97834492], + [56.21677399, 25.87101746, 27.18723679], + [ 9.87597847, 49.51506424, 12.3587141 ], + [13.91390419, 29.99807358, 17.72655106], + [51.93511963, 22.36917496, 25.15249634], + [49.47748184, 57.96022797, 21.6821804 ], + [ 4.06388712, 38.19799042, 20.83314323], + [65.57754517, 28.05740929, 14.07811737], + [43.66610718, 64.83459473, 7.38464451], + [26.45141983, 47.54461288, 4.86148834], + [16.60074997, 48.76285934, 10.41742802], + [23.39784622, 49.58771515, 16.01901054], + [27.15598679, 60.88577271, 16.65639687], + [31.21142197, 61.35739136, 7.98280048], + [51.30709839, 70.84198761, 15.93934345], + [43.68464279, 67.27449036, 8.0412693 ], + [31.54167747, 59.21632004, 16.35448837], + [22.91976166, 59.52243805, 16.25029373], + [51.98854446, 24.20150185, 15.58591747], + [54.71170044, 15.0560379 , 17.85561371], + [25.1693058 , 62.42335129, 10.15520573], + [57.03777313, 64.6453476 , 15.02038097], + [13.97542381, 46.53133392, 6.43689632], + [11.97700691, 28.90350914, 17.25115776], + [18.58106995, 52.79833221, 10.71258163], + [11.74255943, 50.15063858, 16.04758453], + [60.33190155, 12.66550255, 20.32970047], + [ 7.96153736, 43.63059616, 22.08521652], + [ 5.49580622, 44.04118729, 6.52855778], + [22.61281013, 58.95380402, 3.78601503], + [66.59542847, 16.63515091, 24.53244209], + [16.94487572, 45.76476669, 21.01480103], + [52.56850433, 16.10758781, 18.12054443], + [47.89723969, 68.80099487, 23.15443802], + [26.38423729, 47.07402039, 16.12504959], + [18.8255558 , 56.94241333, 9.12901497], + [65.56826019, 13.91527367, 22.31264687], + [28.25974083, 62.25115967, 6.38484001], + [22.13425255, 54.66535568, 17.81489944], + [26.53245926, 51.2662735 , 18.65706635], + [51.91865158, 65.96222687, 22.762043 ], + [21.3722744 , 53.96972656, 3.95877957], + [53.4070816 , 70.58049774, 14.29399395], + [ 3.03580284, 42.6346283 , 20.07530975], + [50.95928574, 60.73108673, 8.92034912], + [49.10300446, 71.2615509 , 10.48911572], + [52.7314949 , 64.73478699, 9.15091419], + [59.65195847, 16.06346321, 12.86775494], + [45.29924774, 71.99123383, 18.51223946], + [20.26343155, 53.94652557, 16.16703606], + [30.77408791, 62.75239944, 11.20719719], + [ 3.03875661, 44.45789719, 16.58519936], + [32.51819611, 60.58320999, 6.13994789], + [33.47792053, 47.73781204, 7.47792149], + [34.68603134, 57.75600433, 10.39967346], + [ 7.70740891, 41.5221138 , 5.9620266 ], + [21.57788849, 47.93281555, 13.86778736], + [41.58405685, 70.51507568, 15.03430176], + [21.74500656, 39.35902405, 9.85125637], + [18.2670536 , 46.38023758, 9.74495792], + [29.56215858, 57.72190094, 18.15228462], + [12.9010601 , 35.85571289, 23.22083855], + [55.52906418, 60.04745483, 15.85917091], + [55.91930389, 61.78018951, 18.17969894], + [ 7.917624 , 31.53142929, 10.73446465], + [39.50636292, 67.61630249, 14.806674 ], + [29.11103249, 46.35424042, 6.58320856], + [66.68469238, 17.95492935, 15.60600567], + [19.33745193, 32.94595337, 14.82588196], + [54.20957565, 27.03795815, 14.55182838], + [46.05752182, 60.26448822, 23.45272446], + [53.70537186, 59.13062668, 10.18519878], + [ 9.53022194, 38.52846146, 3.62488604], + [47.12935638, 67.64637756, 8.32175255], + [21.92087173, 42.05246353, 18.90416145], + [44.4587326 , 71.62984467, 13.65610313], + [ 4.66935396, 35.73403931, 9.03784275], + [55.569664 , 68.1591568 , 16.75448799], + [68.70695496, 17.89582253, 18.19699669], + [59.20109177, 25.53931046, 11.85580921], + [60.05117798, 15.56478405, 27.01594162], + [60.28691483, 13.42234039, 23.85629845], + [ 8.50437355, 48.19210052, 8.54011059], + [ 4.83738613, 40.87253571, 20.46499634], + [28.72857285, 45.92423248, 11.60600471], + [14.89724255, 43.91654587, 22.46966362], + [30.94048691, 53.90393066, 17.74952698]]) +# --- +# name: test_read_ndjson_oriented.1 + array([[ 0.01165986, 0.26973841, -0.05671988, 0.961191 ], + [ 0.20568496, 0.47465736, -0.49774304, -0.6961652 ], + [ 0.65922862, -0.6307537 , -0.02235707, -0.40873903], + [ 0.61917615, 0.68662608, 0.29060724, 0.2464001 ], + [ 0.5028708 , -0.68689299, -0.48177201, -0.20783338], + [ 0.97054797, -0.2270066 , -0.03676705, -0.07178352], + [ 0.64959109, -0.26697949, 0.44688636, 0.55411732], + [ 0.50046355, 0.24306978, -0.22359243, -0.80028731], + [ 0.50269175, 0.34565437, 0.09242386, -0.78694463], + [ 0.24900492, -0.3077893 , 0.91828686, -0.00339005], + [ 0.04729332, 0.56279492, 0.52536601, 0.63640851], + [ 0.00817937, 0.16262607, 0.01075885, -0.98659521], + [ 0.31087241, -0.61101663, -0.54363126, -0.48423356], + [ 0.6187619 , 0.23691496, -0.67747039, 0.31943521], + [ 0.21407017, 0.62656647, -0.42357978, -0.61819786], + [ 0.51207268, 0.12057482, -0.55980891, -0.64020097], + [ 0.55729759, 0.35780478, 0.74763316, -0.04939436], + [ 0.65925491, -0.31891984, -0.12759112, 0.66887486], + [ 0.22392197, -0.20416659, -0.5168516 , 0.8006494 ], + [ 0.29253396, 0.68869442, -0.28154191, -0.60071462], + [ 0.36342955, -0.6651094 , -0.2784259 , -0.58993852], + [ 0.49133933, -0.29379687, -0.80720025, -0.14386387], + [ 0.40611276, 0.36245346, -0.62338287, 0.56133211], + [ 0.27524036, -0.31630579, 0.81295896, 0.404093 ], + [ 0.27923387, -0.51176804, -0.59488028, 0.55338895], + [ 0.50544256, -0.13078219, -0.24339749, -0.8174237 ], + [ 0.49053118, -0.48331833, -0.25138521, -0.68013823], + [ 0.33721629, -0.66322315, 0.66565847, 0.05761116], + [ 0.54318863, -0.50447255, -0.65436196, -0.14921117], + [ 0.54965496, -0.25327405, 0.49039441, 0.62709248], + [ 0.37705773, 0.16249676, -0.23099521, -0.88207906], + [ 0.66107124, -0.56409508, -0.48657024, 0.08961532], + [ 0.07631762, 0.88267839, 0.42946264, -0.17497541], + [ 0.32220572, 0.49269286, -0.62195808, -0.51633847], + [ 0.66604161, 0.02181097, 0.74364197, -0.05393944], + [ 0.38377339, -0.65919769, -0.51948309, -0.38511536], + [ 0.50604278, 0.16893536, -0.3894538 , 0.75080442], + [ 0.67288703, -0.38259628, -0.58422321, 0.24398032], + [ 0.13857608, 0.19388862, -0.66998696, -0.70307988], + [ 0.02878221, 0.42860818, 0.52347046, -0.73582965], + [ 0.27467957, -0.71080571, 0.19578849, 0.6172303 ], + [ 0.41451845, 0.42875811, -0.749412 , 0.28761527], + [ 0.00321258, -0.83674419, 0.54744577, 0.01232888], + [ 0.46513048, 0.14468452, -0.05970852, 0.87129498], + [ 0.03280167, 0.05649693, 0.6983788 , 0.71274066], + [ 0.49252811, -0.23296186, -0.5858537 , 0.59993362], + [ 0.33713034, -0.59418738, 0.23825966, 0.69030201], + [ 0.63572448, 0.70402735, 0.19583964, -0.24868985], + [ 0.29654577, -0.78962505, 0.19650972, 0.49993682], + [ 0.81499642, 0.39857918, 0.40172198, 0.12463921], + [ 0.17653082, -0.24536671, -0.71727026, -0.62781805], + [ 0.98083609, -0.0852363 , -0.00399728, 0.1751551 ], + [ 0.74531239, -0.01691453, 0.14961761, 0.64949054], + [ 0.1716169 , -0.08210115, -0.33125943, -0.92416137], + [ 0.23303799, 0.91210693, -0.33640358, -0.02422602], + [ 0.01521522, -0.30596042, -0.61165524, -0.72940707], + [ 0.38833329, 0.40910742, -0.24513678, -0.78850257], + [ 0.45633873, 0.59147322, -0.1380755 , 0.65026885], + [ 0.23281951, -0.60571468, 0.73714674, 0.18846628], + [ 0.2608555 , 0.3158451 , 0.49160177, 0.76845556], + [ 0.50938028, 0.45303518, -0.51089406, 0.52371573], + [ 0.79478317, -0.29619101, -0.34876254, -0.39869204], + [ 0.92361897, 0.02632416, -0.2961238 , -0.24196233], + [ 0.53817773, -0.343499 , 0.6360839 , 0.43332496], + [ 0.80808812, -0.51701188, -0.18986481, -0.20891055], + [ 0.15368363, 0.03496722, 0.78980905, 0.59275651], + [ 0.42950997, 0.74398404, 0.10350103, 0.50129491], + [ 0.46698269, -0.35147074, 0.087143 , -0.80672276], + [ 0.22523183, 0.49443585, -0.83838147, 0.04382144], + [ 0.87831867, 0.41994146, 0.0324602 , -0.22616765], + [ 0.48158255, -0.75169069, 0.22109202, 0.39262918], + [ 0.18715473, -0.70094311, -0.09221867, -0.68201733], + [ 0.38380659, -0.35910818, -0.39569405, -0.75310028], + [ 0.16785546, -0.05949348, 0.08951101, -0.97993517], + [ 0.49587467, 0.61889935, 0.41556957, -0.44539183], + [ 0.33370054, 0.40408763, 0.54749066, 0.65238881], + [ 0.02596377, 0.24302907, -0.17708994, 0.95336348], + [ 0.26652336, 0.93402851, 0.12205516, -0.20410436], + [ 0.84993595, -0.43094248, -0.29281324, 0.07847214], + [ 0.59610945, 0.43046644, -0.45888138, 0.49877855], + [ 0.0350038 , -0.40455717, 0.09291609, -0.90910661], + [ 0.01702069, -0.20637929, -0.53974718, 0.81596011], + [ 0.04112349, -0.99446005, -0.08324496, -0.0492792 ], + [ 0.0209744 , -0.40991148, -0.44546321, 0.79567277], + [ 0.046996 , 0.63618207, -0.48131526, 0.601165 ], + [ 0.01733323, 0.94805014, -0.18496925, 0.25823799], + [ 0.47238344, -0.37355524, -0.44867331, -0.66030496], + [ 0.28241423, 0.3463482 , 0.46593332, 0.76366961], + [ 0.16079472, -0.82011914, 0.46437907, 0.29309008], + [ 0.83899975, 0.49771485, -0.14417572, -0.16605034], + [ 0.5555445 , -0.59087068, 0.19896477, -0.55014098], + [ 0.29223406, 0.02139156, 0.87528747, -0.38472521], + [ 0.1226824 , 0.97407031, -0.08102459, 0.17196265], + [ 0.00799717, 0.24473511, 0.50840843, -0.82556748], + [ 0.67629206, 0.29045978, -0.00961014, 0.67688245], + [ 0.07493034, -0.78267843, 0.5275259 , 0.32173958], + [ 0.89750737, -0.42547289, 0.0998721 , -0.05898306], + [ 0.10108523, 0.61559635, 0.6792655 , -0.38655055], + [ 0.6405831 , -0.36886588, 0.55069333, -0.38772172], + [ 0.72442305, 0.1615794 , 0.58008015, -0.33557472]]) +# --- diff --git a/tests/data/cryoet/oriented_point.ndjson b/tests/data/cryoet/oriented_point.ndjson new file mode 100644 index 00000000..6a16a757 --- /dev/null +++ b/tests/data/cryoet/oriented_point.ndjson @@ -0,0 +1,118 @@ +{"type": "orientedPoint", "location": {"x": 448.9732375, "y": 624.1956595, "z": 241.9033945}, "xyz_rotation_matrix": [[0.7439617679101664, 0.2020502689310821, -0.6369431502990333], [-0.49298012013899795, -0.47751769796385557, -0.7272877348608588], [-0.4511003092835546, 0.8550745797625943, -0.25564814493382126]]} +{"type": "orientedPoint", "location": {"x": 460.5752285, "y": 602.6449085, "z": 234.527252}, "xyz_rotation_matrix": [[0.26707018676702765, -0.7260811925855215, -0.6336241923362873], [-0.6916906153827915, -0.6022452010612729, 0.39857848711394667], [-0.6709974723734811, 0.33182347652366967, -0.6630652852443306]]} +{"type": "orientedPoint", "location": {"x": 494.774804, "y": 579.602317, "z": 216.8218015}, "xyz_rotation_matrix": [[0.38236091426254926, -0.919068533524169, -0.09546288247293278], [-0.7361990086979108, -0.3654468284217396, 0.5696135840977681], [-0.5584005290439121, -0.14751829134797173, -0.8163499267356211]]} +{"type": "orientedPoint", "location": {"x": 519.186521, "y": 659.622226, "z": 227.620431}, "xyz_rotation_matrix": [[0.7670531860507088, 0.5840944504278349, 0.2654488326379728], [0.64045421998484, -0.7216296736086716, -0.262809829099013], [0.03804999176172198, 0.3715969417888794, -0.9276140959364974]]} +{"type": "orientedPoint", "location": {"x": 439.6713445, "y": 651.1677545, "z": 235.8200065}, "xyz_rotation_matrix": [[0.7818470278677156, 0.6011714666042023, -0.1652516043957588], [0.11458124429770827, -0.39908537691677504, -0.9097263326882349], [-0.6128510124570316, 0.6923320949314343, -0.38090669048763526]]} +{"type": "orientedPoint", "location": {"x": 478.9724215, "y": 688.0099545, "z": 231.5443865}, "xyz_rotation_matrix": [[0.18034747689602423, -0.07169488312014721, -0.9809865602094794], [0.7295794049772117, -0.6591509449069485, 0.18230173795489368], [-0.6596883198983712, -0.7485852493621988, -0.06656909964089067]]} +{"type": "orientedPoint", "location": {"x": 434.4944515, "y": 678.2108355, "z": 203.046834}, "xyz_rotation_matrix": [[-0.14470160186032882, -0.6827366230470215, -0.7161928161950554], [0.9776152992455769, 0.013084249050143493, -0.20999316443107208], [0.15274086912164775, -0.7305474015949569, 0.6655604562493332]]} +{"type": "orientedPoint", "location": {"x": 452.9924935, "y": 719.9123695, "z": 185.122389}, "xyz_rotation_matrix": [[0.581271174002464, -0.19271754719511125, 0.7905591497648342], [0.7489128958296615, 0.5066311656883196, -0.427146738736614], [-0.3182032318092135, 0.8403480284717723, 0.4388187488129666]]} +{"type": "orientedPoint", "location": {"x": 559.1930485, "y": 617.801893, "z": 181.7969975}, "xyz_rotation_matrix": [[0.8191520442889918, -0.32504225431125594, 0.47258593001635435], [-0.3502820614989554, -0.9359300717228123, -0.036570182348104684], [0.45419423788640007, -0.1355818341710585, -0.8805255024776988]]} +{"type": "orientedPoint", "location": {"x": 555.6966385, "y": 681.591547, "z": 167.544876}, "xyz_rotation_matrix": [[0.22256954997116074, -0.8754273123795447, 0.4290568915255437], [0.4375925518027214, -0.30356674429475483, -0.8463805233847633], [0.8711920305147527, 0.3761306322253083, 0.31551575787806907]]} +{"type": "orientedPoint", "location": {"x": 528.6578005, "y": 556.93032, "z": 162.5313315}, "xyz_rotation_matrix": [[-0.1118158158520064, 0.9934962364477113, -0.02150468529375338], [-0.7070736004187812, -0.06433668890811683, 0.7042071527975002], [0.6982436157360636, 0.09394689257539807, 0.7096688202670699]]} +{"type": "orientedPoint", "location": {"x": 570.377774, "y": 646.453492, "z": 150.2038185}, "xyz_rotation_matrix": [[-0.10695822422404089, -0.051169242634885787, -0.9929459435835428], [-0.1092773040086173, 0.9932296351915665, -0.039412721370598286], [0.988240056413141, 0.10429094105146605, -0.11182571491008508]]} +{"type": "orientedPoint", "location": {"x": 513.0709855, "y": 708.419876, "z": 159.39344}, "xyz_rotation_matrix": [[-0.7659322438502234, -0.37060061400076566, -0.5253598602223224], [0.5239980123288621, 0.11363202129429661, -0.8441053529103905], [0.3725236648938752, -0.9218150295145054, 0.10715955606108007]]} +{"type": "orientedPoint", "location": {"x": 395.0636425, "y": 676.163022, "z": 148.066743}, "xyz_rotation_matrix": [[0.4570979270586941, -0.7785023949059336, 0.43011103938909856], [0.6865916643347435, 0.616261369528154, 0.3857639315609108], [-0.5653789627716014, 0.11897876093240331, 0.8162050495447197]]} +{"type": "orientedPoint", "location": {"x": 555.290633, "y": 600.474543, "z": 158.59171}, "xyz_rotation_matrix": [[0.07393443607558493, 0.9840420434270372, 0.16184855862851183], [0.44466505308020404, -0.17779585536612952, 0.8778733532713054], [0.8926402913443718, 0.007063326593604979, -0.45071434377670677]]} +{"type": "orientedPoint", "location": {"x": 534.0708225, "y": 705.8049935, "z": 142.939948}, "xyz_rotation_matrix": [[0.06453230825295815, 0.882980740247648, 0.4649522486699694], [0.9016017568818099, -0.2512928052123528, 0.3520883383983925], [0.42772637652964496, 0.39648069108119555, -0.8123134914677944]]} +{"type": "orientedPoint", "location": {"x": 444.587304, "y": 716.298466, "z": 136.5610315}, "xyz_rotation_matrix": [[-0.7764865126870787, 0.00846813639390337, -0.6300769685372366], [0.5359514518358917, -0.5169943012746702, -0.6674375878870742], [-0.33139815462681643, -0.855946951110599, 0.39690059208120465]]} +{"type": "orientedPoint", "location": {"x": 415.840568, "y": 705.1507835, "z": 150.3430155}, "xyz_rotation_matrix": [[-0.22784107411061244, -0.5503878398473456, -0.8032195656831917], [0.8976166145528524, -0.4383930909253226, 0.04578112173831128], [-0.37732328079088706, -0.7105524073403134, 0.5939212222139287]]} +{"type": "orientedPoint", "location": {"x": 557.490535, "y": 657.697944, "z": 118.600196}, "xyz_rotation_matrix": [[-0.8759701390087025, -0.15950814035717048, -0.45522902886884514], [0.1470559694632887, 0.810508583102401, -0.5669659412720932], [0.45940271811373407, -0.5635893805574547, -0.6865246919904466]]} +{"type": "orientedPoint", "location": {"x": 491.030026, "y": 712.615535, "z": 104.8911555}, "xyz_rotation_matrix": [[-0.8205511091470279, -0.004189812571503415, -0.5715578035056454], [0.5598989209100155, 0.1951804716709467, -0.8052439269203505], [0.11493074280357982, -0.9807583947889115, -0.15780968097583542]]} +{"type": "orientedPoint", "location": {"x": 417.5261095, "y": 690.389197, "z": 104.384465}, "xyz_rotation_matrix": [[-0.8999386178498898, -0.17810832633966933, -0.39797978364599346], [0.3226450456417995, -0.8859768067969047, -0.33308448228754384], [-0.2932757382144507, -0.42816179407607335, 0.8547905120369126]]} +{"type": "orientedPoint", "location": {"x": 537.053688, "y": 591.306299, "z": 101.851991}, "xyz_rotation_matrix": [[-0.2727840258572374, -0.5189037737036825, 0.8101405735260984], [-0.6384958374104616, -0.5322539521284244, -0.5559035852134669], [0.7196609902215289, -0.668913001876739, -0.18612752368636443]]} +{"type": "orientedPoint", "location": {"x": 527.314948, "y": 647.347911, "z": 91.5091385}, "xyz_rotation_matrix": [[0.3171391378715274, 0.9203281158747461, 0.2289517992079224], [0.5907683604332361, -0.3805642002201694, 0.7114517789856241], [0.7418999336441072, -0.09037172478836136, -0.6643925344385249]]} +{"type": "orientedPoint", "location": {"x": 471.2935705, "y": 676.463773, "z": 83.217526}, "xyz_rotation_matrix": [[0.3182975644513295, 0.2395998397334409, 0.9172123948486857], [0.9454450036000608, -0.1510924056716635, -0.28862576135201534], [0.06942914108667037, 0.959042752825993, -0.2746208160717397]]} +{"type": "orientedPoint", "location": {"x": 436.8464425, "y": 672.7449415, "z": 80.412696}, "xyz_rotation_matrix": [[-0.36536423398402396, -0.3527713258032595, 0.8614298394043931], [0.7433237697977277, 0.44648690602893404, 0.49811566528107204], [-0.5603380674012453, 0.8223149241231857, 0.0990929653674629]]} +{"type": "orientedPoint", "location": {"x": 436.661064, "y": 648.345953, "z": 73.8464425}, "xyz_rotation_matrix": [[-0.4757777294638948, -0.05645400524491495, 0.8777519566699857], [0.5209618051159062, 0.7859731762142377, 0.33293387313711437], [-0.7086849439324628, 0.615677766013611, -0.3445381527203218]]} +{"type": "orientedPoint", "location": {"x": 458.1272845, "y": 596.040307, "z": 81.982213}, "xyz_rotation_matrix": [[0.099493418189392, 0.8701115929631387, 0.4827078573300212], [-0.99503088508371, 0.08886412318576214, 0.04490774253906088], [-0.0038206630994695734, -0.4847772513243325, 0.8746293038378632]]} +{"type": "orientedPoint", "location": {"x": 509.5928525, "y": 607.310868, "z": 89.203492}, "xyz_rotation_matrix": [[0.2621891786408648, 0.36025188612207704, 0.8952515920952695], [-0.7193966359271974, -0.5453802698514586, 0.43014978957728367], [0.643214827892097, -0.7568216036836133, 0.11617118996336293]]} +{"type": "orientedPoint", "location": {"x": 148.9724215, "y": 439.16547, "z": 224.6966385}, "xyz_rotation_matrix": [[0.12134963077358368, -0.8996100149934765, -0.4194950393443912], [0.045546935832453395, 0.4272196619853895, -0.9029999097726225], [0.991564291282915, 0.0904719920004356, 0.09281742786828251]]} +{"type": "orientedPoint", "location": {"x": 188.6173305, "y": 407.060052, "z": 231.6710185}, "xyz_rotation_matrix": [[0.4887735133343941, -0.8149013051594567, -0.31150652563335984], [0.022837050145021076, 0.36889289716736595, -0.9291913148324951], [0.8721117599272623, 0.4470502133640934, 0.19891501936176648]]} +{"type": "orientedPoint", "location": {"x": 129.010607, "y": 358.557115, "z": 232.2083875}, "xyz_rotation_matrix": [[-0.11146893220632556, 0.2436104610435631, -0.9634462208254928], [-0.9839755688367192, -0.1628204595704775, 0.07267446510097864], [-0.13916449649690277, 0.9561084882038237, 0.25785616474957973]]} +{"type": "orientedPoint", "location": {"x": 187.8639035, "y": 375.7573435, "z": 233.1914165}, "xyz_rotation_matrix": [[0.4518120069806555, -0.7776031961313369, -0.43726328420579974], [-0.424173650994608, 0.243945490554612, -0.872105103436492], [0.7848201221617708, 0.5795031207891805, -0.21962128504674566]]} +{"type": "orientedPoint", "location": {"x": 79.615372, "y": 436.3059725, "z": 220.852154}, "xyz_rotation_matrix": [[-0.0871557427476583, -0.1487944001874626, -0.9850198490279053], [0.6321808080995093, -0.7724359883014797, 0.060745945110498856], [-0.7699034370469816, -0.6174162861875037, 0.1613871964366288]]} +{"type": "orientedPoint", "location": {"x": 140.6875, "y": 478.5199085, "z": 211.770072}, "xyz_rotation_matrix": [[0.4580290709046065, 0.14839991892204746, -0.8764626827596216], [0.84210989939948, 0.24335197596384645, 0.48128030619160966], [0.28471088412574086, -0.9585182730957306, -0.013506761340815687]]} +{"type": "orientedPoint", "location": {"x": 40.638871, "y": 381.979928, "z": 208.3314295}, "xyz_rotation_matrix": [[-0.10713175431387387, 0.7411856605366842, -0.6626964643276977], [-0.06468040547797771, -0.6703160964352484, -0.7392514971286942], [-0.9921387162916467, -0.036333833745016975, 0.11975232841391151]]} +{"type": "orientedPoint", "location": {"x": 188.469321, "y": 345.510607, "z": 210.4933095}, "xyz_rotation_matrix": [[0.07758909147106624, 0.7048521009549412, -0.7050981837050073], [-0.11147873842101308, 0.7089286737290432, 0.6964141199349992], [0.9907332757936186, 0.024569317129003232, 0.1335811547002817]]} +{"type": "orientedPoint", "location": {"x": 219.208714, "y": 420.524641, "z": 189.0416125}, "xyz_rotation_matrix": [[0.32589818286136774, 0.9072655424244838, 0.26581875392241644], [0.5160109694543149, -0.4062967004298471, 0.7540926140883742], [0.792163527190237, -0.10859201972993571, -0.6005703284716092]]} +{"type": "orientedPoint", "location": {"x": 169.44876, "y": 457.647683, "z": 210.148009}, "xyz_rotation_matrix": [[0.018150427499495022, 0.9992322696808397, 0.034719349217161834], [0.9918194967939843, -0.022382335282255864, 0.12567066820320633], [0.12635128713595783, 0.03215435111754467, -0.9914642958489712]]} +{"type": "orientedPoint", "location": {"x": 30.3580285, "y": 426.3462795, "z": 200.7531005}, "xyz_rotation_matrix": [[0.5450780872195287, 0.7043220699691037, -0.4547749999588115], [0.06884187230619404, -0.5782104043852512, -0.8129781822890589], [-0.8355541128200361, 0.4118290300781156, -0.36365667123599016]]} +{"type": "orientedPoint", "location": {"x": 48.3738575, "y": 408.725359, "z": 204.6499675}, "xyz_rotation_matrix": [[0.617996836899209, -0.7755115288066637, -0.12908051080826982], [0.7519484806275246, 0.6309877085672652, -0.19086119070934648], [0.22946326953246776, 0.02088971816428957, 0.9730931238121493]]} +{"type": "orientedPoint", "location": {"x": 139.139034, "y": 299.980744, "z": 177.2655025}, "xyz_rotation_matrix": [[-0.37395920573780034, 0.324949752324248, -0.868655380981643], [-0.4726651910575475, 0.7390718808434382, 0.4799587191718415], [0.7979612331476295, 0.5900681430232888, -0.12279029677691089]]} +{"type": "orientedPoint", "location": {"x": 212.3568865, "y": 445.9396215, "z": 174.799445}, "xyz_rotation_matrix": [[-0.0732381971276316, 0.9583436401730678, -0.2760681687941008], [0.5757373927867018, 0.2666553363848767, 0.7729303889255745], [0.8143479729382678, -0.10233473954284644, -0.5712836248782497]]} +{"type": "orientedPoint", "location": {"x": 119.770072, "y": 289.035085, "z": 172.511586}, "xyz_rotation_matrix": [[0.6395731804546583, -0.4138302335103425, 0.6478353839332095], [-0.7557843041219694, -0.18449293539147082, 0.6282932774059494], [-0.1404857020695841, -0.8914633445203534, -0.430763128517985]]} +{"type": "orientedPoint", "location": {"x": 30.3875655, "y": 444.5789815, "z": 165.851991}, "xyz_rotation_matrix": [[0.3933001361241672, -0.7562527855478718, 0.5228735289492064], [0.9149118667920497, 0.3781101942280776, -0.14131156012121684], [-0.090836550615919, 0.5339610522986582, 0.8406154386521291]]} +{"type": "orientedPoint", "location": {"x": 53.3118475, "y": 315.924119, "z": 118.4704635}, "xyz_rotation_matrix": [[0.27966144946037974, 0.9559629524091948, -0.08901857843627606], [-0.914598069423568, 0.29346506718132515, 0.2781881121668268], [0.2920613721333277, 0.0036177293094270535, 0.9563927367678208]]} +{"type": "orientedPoint", "location": {"x": 193.3745105, "y": 329.45953, "z": 148.258812}, "xyz_rotation_matrix": [[0.3321611318837032, -0.8878497466248233, -0.3184208062987946], [-0.8737988739936319, -0.41676655634114346, 0.25056169963305647], [-0.35516828444161314, 0.19500888424321056, -0.9142357599618492]]} +{"type": "orientedPoint", "location": {"x": 117.4255875, "y": 501.506364, "z": 160.4758485}, "xyz_rotation_matrix": [[0.02704930381533157, 0.9958453819030555, -0.08695004603485718], [0.8883720948070504, -0.06382823967907511, -0.45466578603145835], [-0.45832669170716994, -0.06494560155875406, -0.8864077574722214]]} +{"type": "orientedPoint", "location": {"x": 98.759791, "y": 495.15062, "z": 123.587141}, "xyz_rotation_matrix": [[0.3441513560555897, 0.8402665654800153, 0.41894145541056016], [0.5932942764031656, 0.1512088894873173, -0.7906565457436351], [-0.7277099323991281, 0.5206610900349976, -0.4464865995875186]]} +{"type": "orientedPoint", "location": {"x": 66.6640015, "y": 325.6103135, "z": 101.489556}, "xyz_rotation_matrix": [[-0.08837275882253864, -0.17622078648495457, 0.980375688146497], [0.4300816085036675, 0.8810054340047586, 0.19712745947986302], [-0.898454264570541, 0.439062250329849, -0.0020675614374178752]]} +{"type": "orientedPoint", "location": {"x": 79.17624, "y": 315.314295, "z": 107.3446475}, "xyz_rotation_matrix": [[-0.7746134527225701, 0.4480567960604749, -0.4463396759926694], [-0.5477047554530765, -0.8281357079823737, 0.11920885042067615], [-0.31621748799727184, 0.33680314230801867, 0.8868878979984676]]} +{"type": "orientedPoint", "location": {"x": 196.2602805, "y": 334.083551, "z": 138.5187665}, "xyz_rotation_matrix": [[-0.9851093261547739, 0.12140236738122669, -0.12174186098922969], [0.014326851344149086, 0.7635953511304592, 0.6455361190998639], [0.17133113217815935, 0.6341794737502819, -0.7539642154773432]]} +{"type": "orientedPoint", "location": {"x": 182.6705285, "y": 463.8023825, "z": 97.4495755}, "xyz_rotation_matrix": [[0.42893513340314643, 0.3203384491736979, 0.8446288707553251], [0.871650730134654, -0.3922375222665037, -0.29389578217789936], [0.23714901641826436, 0.8622835984217865, -0.4474676970515587]]} +{"type": "orientedPoint", "location": {"x": 166.0075065, "y": 487.62859, "z": 104.174282}, "xyz_rotation_matrix": [[-0.5219031823064668, 0.4829017818558471, -0.7031521438343418], [0.8311422734016795, 0.47331898429576397, -0.2918418415339281], [0.19188431322823396, -0.7367326572004762, -0.6483867689514144]]} +{"type": "orientedPoint", "location": {"x": 46.693538, "y": 357.3404045, "z": 90.378427}, "xyz_rotation_matrix": [[0.4629866634945249, 0.8830460754607422, 0.07663535763333246], [-0.7872843669660715, 0.4494145056165247, -0.4221491770361357], [-0.4072182154042714, 0.1351156199513433, 0.9032812930024204]]} +{"type": "orientedPoint", "location": {"x": 139.754243, "y": 465.313316, "z": 64.368962}, "xyz_rotation_matrix": [[-0.4088083632440133, -0.10584327350486117, 0.9064617606912748], [0.9060867762435771, -0.16571079208455258, 0.3892899784264065], [0.10900677069922166, 0.9804780134406306, 0.16364714816104184]]} +{"type": "orientedPoint", "location": {"x": 85.0437335, "y": 481.9210185, "z": 85.4011095}, "xyz_rotation_matrix": [[-0.7817381998634186, 0.22215916003323447, -0.5826926243635061], [0.45674460462503585, -0.4322038025737105, -0.7775501522003229], [-0.4245818566780993, -0.8739823686174414, 0.23640022488488702]]} +{"type": "orientedPoint", "location": {"x": 54.9580615, "y": 440.41188, "z": 65.2855745}, "xyz_rotation_matrix": [[-0.49090375361514094, -0.07562832842462403, 0.8679250316854922], [-0.7865410423737229, 0.4668877827643817, -0.404189295957992], [-0.37465543282891656, -0.8810767016809926, -0.2886817493481716]]} +{"type": "orientedPoint", "location": {"x": 98.2495105, "y": 312.3048305, "z": 83.4219975}, "xyz_rotation_matrix": [[-0.9515407455365151, 0.1904275886914052, -0.24146954890625527], [-0.27834619941336086, -0.8671499935229728, 0.4130063946299694], [-0.1307425059265384, 0.460204543869664, 0.878133346904537]]} +{"type": "orientedPoint", "location": {"x": 197.548466, "y": 365.69827, "z": 84.8392625}, "xyz_rotation_matrix": [[0.07132335698704334, -0.05029022606881939, 0.996184657535964], [0.5854429437652365, -0.8064917219860475, -0.08262966757450946], [0.8075701445345741, 0.5891027037197563, -0.02807963900195737]]} +{"type": "orientedPoint", "location": {"x": 217.4500655, "y": 393.5902415, "z": 98.5125655}, "xyz_rotation_matrix": [[0.00034906584331006324, -0.13658010292063752, 0.9906289687058547], [0.38815905020654795, -0.9129376688763245, -0.12600541452419195], [0.921592333895952, 0.3845655837862391, 0.052696127669511365]]} +{"type": "orientedPoint", "location": {"x": 119.72797, "y": 442.5137075, "z": 54.467363}, "xyz_rotation_matrix": [[-0.3377524466543247, 0.14659253860046756, 0.9297493815032565], [0.9063853681350054, -0.21564685802542538, 0.3632657388944524], [0.25374957972337225, 0.9654051275244151, -0.0600340781538246]]} +{"type": "orientedPoint", "location": {"x": 77.074086, "y": 415.221116, "z": 59.6202675}, "xyz_rotation_matrix": [[-0.8947006103084156, 0.14924725133826472, 0.42099415183791006], [-0.29620354689030853, 0.5072256716656242, -0.809311792088165], [-0.33432660187808755, -0.8487917153055449, -0.40960755279330674]]} +{"type": "orientedPoint", "location": {"x": 62.041449, "y": 366.403068, "z": 63.7513055}, "xyz_rotation_matrix": [[-0.40785244557264455, -0.4905802540461053, 0.7700567491948058], [0.8910934536694328, -0.030033237183567707, 0.45282497887346973], [-0.1990196961807943, 0.8708783032113814, 0.449401982113753]]} +{"type": "orientedPoint", "location": {"x": 95.3022195, "y": 385.2845955, "z": 36.2488575}, "xyz_rotation_matrix": [[-0.8660254037844388, -0.06266661678215213, 0.4960573506572389], [-0.12839772430409385, -0.9309718743710504, -0.3417680405239539], [0.4832328883608088, -0.3596724402440809, 0.7981990424294796]]} +{"type": "orientedPoint", "location": {"x": 265.3245755, "y": 512.662696, "z": 186.5706595}, "xyz_rotation_matrix": [[0.9546569379242447, 0.1691372294853079, -0.24499536419111967], [0.21956365127310618, 0.15575193517895958, 0.9630852183102132], [0.20105206766588324, -0.9732080621789174, 0.11155327784170954]]} +{"type": "orientedPoint", "location": {"x": 221.342526, "y": 546.6535575, "z": 178.1489885}, "xyz_rotation_matrix": [[0.9854375906365049, -0.16860596540544018, -0.022017797124590344], [0.16580539107232253, 0.9241109245496878, 0.3442783342286811], [-0.037700494053450925, -0.3429154816534546, 0.9386094210002929]]} +{"type": "orientedPoint", "location": {"x": 309.404863, "y": 539.0393275, "z": 177.4952675}, "xyz_rotation_matrix": [[0.2747983918901805, -0.15521676569701842, -0.9488907205053319], [-0.623424051318086, 0.722563457615254, -0.29873818295831145], [0.7320029344563554, 0.6736540695087101, 0.10179341128795505]]} +{"type": "orientedPoint", "location": {"x": 295.621573, "y": 577.218995, "z": 181.522846}, "xyz_rotation_matrix": [[0.9768966130813811, -0.19540255302611143, 0.08654969451710562], [-0.15545732828513986, -0.9276246545248011, -0.3396255576369215], [0.14664933151082835, 0.3183242726978597, -0.936570142049599]]} +{"type": "orientedPoint", "location": {"x": 233.9784595, "y": 495.8771215, "z": 160.190111}, "xyz_rotation_matrix": [[-0.2315781185457096, -0.9442063333663608, -0.2341921754493137], [-0.37259439047613413, -0.136291852470748, 0.9179313433671443], [-0.8986350734288906, 0.2998315043169159, -0.32024377249605945]]} +{"type": "orientedPoint", "location": {"x": 271.559889, "y": 608.8577025, "z": 166.5639685}, "xyz_rotation_matrix": [[0.8473073628658121, 0.26571195906021405, 0.45985583354543436], [0.530123517433473, -0.37057087757428536, -0.7626573811075236], [-0.03223800703122626, 0.8899856063477697, -0.45484759139347714]]} +{"type": "orientedPoint", "location": {"x": 229.1976175, "y": 595.22438, "z": 162.5029375}, "xyz_rotation_matrix": [[0.8404720447750577, 0.5300533715318919, -0.11247295354576478], [0.2849707419169727, -0.6089374075199921, -0.7402613794965407], [-0.4608670287652651, 0.5901174942759326, -0.6628445705793863]]} +{"type": "orientedPoint", "location": {"x": 202.6343015, "y": 539.4652415, "z": 161.6703655}, "xyz_rotation_matrix": [[0.8232354634267354, 0.19192859615582142, 0.5342722019104347], [0.09467462951922129, 0.8815225358978962, -0.4625524113325331], [-0.5597500212433821, 0.43137157148078076, 0.7075298446258188]]} +{"type": "orientedPoint", "location": {"x": 315.4167755, "y": 592.1631855, "z": 163.544876}, "xyz_rotation_matrix": [[0.3907311284892739, 0.3366186326203095, -0.8567479684261479], [0.8934719888742835, 0.0852145664053624, 0.4409606363037163], [0.2214429730800478, -0.9377773583560115, -0.2674633354841183]]} +{"type": "orientedPoint", "location": {"x": 230.8059725, "y": 617.728786, "z": 123.8536225}, "xyz_rotation_matrix": [[0.053904534636001804, 0.8882825163637563, -0.4561233081833787], [0.4977629852641047, -0.41989111243292093, -0.7588962143803402], [-0.8656363622484, -0.18613335225670213, -0.46478819211662387]]} +{"type": "orientedPoint", "location": {"x": 263.842363, "y": 470.740209, "z": 161.2504895}, "xyz_rotation_matrix": [[-0.06801529066524836, 0.7977282492207532, -0.5991690584725766], [-0.9925415884302314, -0.11500223504837453, -0.04044355536141725], [-0.10116874750690247, 0.5919494288611744, 0.7996003740612023]]} +{"type": "orientedPoint", "location": {"x": 313.163838, "y": 476.6959855, "z": 153.553525}, "xyz_rotation_matrix": [[0.9468740133026661, -0.01856890065672704, -0.3210682152759804], [-0.023889616948451577, -0.9996346900800533, -0.012640118298974795], [-0.3207162127709775, 0.019638796219636892, -0.9469717147565099]]} +{"type": "orientedPoint", "location": {"x": 346.8603135, "y": 577.560052, "z": 103.9967365}, "xyz_rotation_matrix": [[0.7377488080424877, -0.4688619643089681, 0.48569038970956047], [0.18766104145345816, -0.5486665864699642, -0.8147074999114717], [0.6484674469489523, 0.6921946513197955, -0.3167909956608215]]} +{"type": "orientedPoint", "location": {"x": 307.7408615, "y": 627.5239885, "z": 112.071965}, "xyz_rotation_matrix": [[-0.04518863418348751, 0.18153503670121185, -0.9823456712331564], [0.9209889935962954, 0.38847593066897657, 0.02942320453919789], [0.38695899138683143, -0.9033999566862743, -0.18474646747400592]]} +{"type": "orientedPoint", "location": {"x": 251.6930485, "y": 624.2335185, "z": 101.552056}, "xyz_rotation_matrix": [[-0.25915620104749143, 0.9597786189937743, -0.10799567575155983], [0.32478489865673904, -0.018703281929501506, -0.9456029594124573], [-0.9095893760720626, -0.28013423526493403, -0.30687453001082804]]} +{"type": "orientedPoint", "location": {"x": 188.2555485, "y": 569.424119, "z": 91.2901435}, "xyz_rotation_matrix": [[-0.3242476445475944, -0.2718350725468874, -0.9060734839618504], [0.6648048274892169, -0.746889067934147, -0.013829734180169584], [-0.6729769731219409, -0.606846284930451, 0.42289428952604763]]} +{"type": "orientedPoint", "location": {"x": 184.9985315, "y": 560.705777, "z": 126.736945}, "xyz_rotation_matrix": [[0.3470993387875629, 0.23908949107160393, 0.9068397125580453], [0.22100019143039396, 0.9188727204661371, -0.32685140197173634], [-0.9114170090584036, 0.313861655578189, 0.26610129040790537]]} +{"type": "orientedPoint", "location": {"x": 215.778884, "y": 479.328166, "z": 138.677872}, "xyz_rotation_matrix": [[0.6451910332955677, 0.723001953004041, -0.24697511313357123], [-0.7523677324812452, 0.5449947655549258, -0.3700317562571638], [-0.13293353856731277, 0.4245572770193371, 0.8955890758902203]]} +{"type": "orientedPoint", "location": {"x": 287.2857375, "y": 459.2423305, "z": 116.060052}, "xyz_rotation_matrix": [[-0.6807208689589177, -0.40068552246680395, -0.6132456364698572], [-0.6495962902953047, -0.05676041381128971, 0.7581575793056144], [-0.33859084187023436, 0.9144557766833098, -0.22164583075738298]]} +{"type": "orientedPoint", "location": {"x": 185.810705, "y": 527.983355, "z": 107.125816}, "xyz_rotation_matrix": [[0.024606658604981513, -0.7999660246059557, 0.5995405506122514], [0.22981027667734338, 0.5881874261558905, 0.7753855740504796], [-0.9729243285506745, 0.11870093170760049, 0.1983137406383299]]} +{"type": "orientedPoint", "location": {"x": 360.90062, "y": 526.6305485, "z": 103.402415}, "xyz_rotation_matrix": [[-0.1854951142728647, 0.7219276313227725, 0.6666423761760036], [0.6154618625208961, -0.4435078714944968, 0.6515423729157844], [0.7660275832913637, 0.5311508853942658, -0.36205038127542555]]} +{"type": "orientedPoint", "location": {"x": 291.1103135, "y": 463.542428, "z": 65.832082}, "xyz_rotation_matrix": [[0.2082531160681866, 0.05544979628391361, 0.9765018995065822], [-0.9709705808215041, 0.1318372994178899, 0.19958721818129782], [-0.11767230271836149, -0.9897192766508442, 0.08129564932201577]]} +{"type": "orientedPoint", "location": {"x": 325.1819515, "y": 605.832082, "z": 61.399478}, "xyz_rotation_matrix": [[-0.25004204152788206, 0.9470767231250091, -0.2013073719051634], [0.9255811728233062, 0.29483395191912126, 0.23742879629646121], [0.2842155343812194, -0.12695913244248377, -0.95031726739329]]} +{"type": "orientedPoint", "location": {"x": 312.11423, "y": 613.573923, "z": 79.8280025}, "xyz_rotation_matrix": [[0.40641773078041304, -0.13221202746466498, 0.9040711298902219], [0.8161188088311221, -0.39236928869459436, -0.42425986277441863], [0.410822002793631, 0.9102561843146032, -0.05156511357157184]]} +{"type": "orientedPoint", "location": {"x": 334.77921, "y": 477.3781005, "z": 74.77921}, "xyz_rotation_matrix": [[-0.1284494302003029, 0.7428660962906226, 0.6570012989813258], [-0.5353279647203628, -0.6096175548860127, 0.5846284349594653], [0.834820168700764, -0.2766159788528695, 0.47598202295223013]]} +{"type": "orientedPoint", "location": {"x": 282.5974215, "y": 622.511586, "z": 63.848401}, "xyz_rotation_matrix": [[-0.1493627706235383, 0.8140007906610435, 0.5613318764820474], [0.9872599264494036, 0.09127937862152391, 0.13033001444635428], [0.05485070992046226, 0.573646919142485, -0.8172641016094837]]} +{"type": "orientedPoint", "location": {"x": 226.1281005, "y": 589.538022, "z": 37.86015}, "xyz_rotation_matrix": [[-0.9996753563210988, 0.008122565249065414, -0.024149656272074712], [0.018874996991137802, -0.4005856310685475, -0.9160648921719456], [-0.017114802156882252, -0.9162233221847109, 0.4003022700809259]]} +{"type": "orientedPoint", "location": {"x": 213.32327, "y": 574.185868, "z": 52.47797}, "xyz_rotation_matrix": [[-0.9914448613738106, -0.13046178542350007, -0.004099926777209516], [0.11428205910560686, -0.8524546192384953, -0.5101575571385127], [0.06306106423180977, -0.5062616365902762, 0.8600711932711657]]} +{"type": "orientedPoint", "location": {"x": 213.722748, "y": 539.697291, "z": 39.5877935}, "xyz_rotation_matrix": [[-0.8902128046111268, 0.4414105364532402, 0.11259618472423978], [-0.4088116620028381, -0.665051865396642, -0.6249632319928305], [-0.20098305281010553, -0.6023809049434669, 0.7724914613396194]]} +{"type": "orientedPoint", "location": {"x": 264.514197, "y": 475.446149, "z": 48.6148825}, "xyz_rotation_matrix": [[-0.039957399601580595, -0.40545569554647565, 0.9132409786940157], [-0.9942435670098912, 0.10706754210592087, 0.0040337187364944405], [-0.09941396117511808, -0.9078227912849075, -0.40739985756888974]]} +{"type": "orientedPoint", "location": {"x": 562.1677545, "y": 258.710183, "z": 271.872389}, "xyz_rotation_matrix": [[-0.14401078255225225, 0.7919706109171893, -0.5933324919066392], [0.2554537695481238, -0.5495082642366546, -0.7954772398750785], [-0.9560357033774116, -0.2661263214698483, -0.12317676277847607]]} +{"type": "orientedPoint", "location": {"x": 600.5117495, "y": 155.647846, "z": 270.159432}, "xyz_rotation_matrix": [[0.3632512304729784, -0.8355365319042443, -0.41222232765013467], [-0.8433652877689468, -0.48291385253099034, 0.2356463503219999], [-0.39595900664875505, 0.2620551752725078, -0.8800815588152194]]} +{"type": "orientedPoint", "location": {"x": 665.954308, "y": 166.3515015, "z": 245.3244125}, "xyz_rotation_matrix": [[0.9510025681700438, 0.030546884643774863, 0.30767028321328216], [-0.23864182274372536, -0.5601770607744444, 0.7932538944245131], [0.19658127014426807, -0.8278094879986966, -0.5254400591959106]]} +{"type": "orientedPoint", "location": {"x": 545.8604765, "y": 294.3314295, "z": 223.4353785}, "xyz_rotation_matrix": [[0.8942323719236088, -0.4353630493490266, 0.10395903166821842], [0.44592012211171694, 0.8866302548705363, -0.12264597769221507], [-0.03877769590561121, 0.1560314276347073, 0.9869906199607609]]} +{"type": "orientedPoint", "location": {"x": 519.351175, "y": 223.691743, "z": 251.5249675}, "xyz_rotation_matrix": [[0.764021289333614, -0.5911839252202262, -0.25840479098926966], [0.24981394978091642, -0.09820693307599077, 0.9633007779456351], [-0.5948650770887967, -0.800535423861439, 0.07265380377603226]]} +{"type": "orientedPoint", "location": {"x": 527.5664165, "y": 166.397193, "z": 219.5930155}, "xyz_rotation_matrix": [[-0.322430911785791, -0.31520043923518765, -0.8925732408216867], [-0.833140196592461, -0.35311630805900035, 0.42565982404339847], [-0.44935033097446286, 0.8808845305082422, -0.14875054273653848]]} +{"type": "orientedPoint", "location": {"x": 602.8691255, "y": 134.223401, "z": 238.5629895}, "xyz_rotation_matrix": [[0.831081548518267, 0.3798613287975003, 0.4062127897994802], [-0.40588114362277355, -0.0850734750554093, 0.9099576919249961], [0.38021567164432973, -0.9211231593691442, 0.08347555516351612]]} +{"type": "orientedPoint", "location": {"x": 678.952513, "y": 174.3763055, "z": 221.3544385}, "xyz_rotation_matrix": [[0.8480480961564261, -0.10274706435447983, 0.5198629313309401], [-0.11532750732431604, -0.9932938045603428, -0.008184367806956805], [0.5172175486773637, -0.053013758483775736, -0.854210482698265]]} +{"type": "orientedPoint", "location": {"x": 520.671834, "y": 259.3745105, "z": 222.945333}, "xyz_rotation_matrix": [[0.10539630743387962, -0.8954552880947458, -0.43249444551630856], [0.9817489678572268, 0.16293127627467285, -0.09809364567991363], [0.1583053457422501, -0.41426226745222916, 0.8962846597341521]]} +{"type": "orientedPoint", "location": {"x": 603.3190275, "y": 126.655026, "z": 203.2969975}, "xyz_rotation_matrix": [[0.08454741542810872, -0.745697593989712, -0.6608985042064944], [-0.7950427445093896, -0.4503005457406474, 0.4063698474403004], [-0.6006319746295602, 0.4910850403174894, -0.6309332090078675]]} +{"type": "orientedPoint", "location": {"x": 655.6826045, "y": 139.1527415, "z": 223.1264685}, "xyz_rotation_matrix": [[0.35950826546626363, 0.7498217904617933, -0.5554467477716557], [-0.5495405904592779, 0.651199454394683, 0.523396990852771], [0.7541610878977428, 0.11707498940737973, 0.6461690957916165]]} +{"type": "orientedPoint", "location": {"x": 644.5647845, "y": 306.5621735, "z": 185.443864}, "xyz_rotation_matrix": [[0.20329998740012123, -0.8133452984339922, 0.5451041557706483], [0.849898135387563, -0.1298355760744031, -0.5107013634700539], [0.48615046496723086, 0.5671085863401721, 0.664865081585277]]} +{"type": "orientedPoint", "location": {"x": 525.685052, "y": 161.075881, "z": 181.2054505}, "xyz_rotation_matrix": [[0.20500855755272393, -0.9324271235407338, 0.29757545365117866], [-0.4734661438925043, 0.1716168115460119, 0.863931409651451], [-0.856622029787767, -0.3180052346744216, -0.4062897596567654]]} +{"type": "orientedPoint", "location": {"x": 547.117004, "y": 150.5603785, "z": 178.556136}, "xyz_rotation_matrix": [[-0.9271184592607542, -0.015562967184537785, -0.37444513156186027], [-0.28501861175043486, -0.6194749568256515, 0.7314473110359436], [-0.2433428722067295, 0.7848621356125358, 0.5698909322211656]]} +{"type": "orientedPoint", "location": {"x": 605.4949415, "y": 131.577676, "z": 155.6349545}, "xyz_rotation_matrix": [[-0.8234335779767455, 0.10593339465002838, -0.5574363269094835], [-0.5646071417693871, -0.250544725069516, 0.7864134511838186], [-0.05635528478695112, 0.9622917731321214, 0.26611769057847257]]} +{"type": "orientedPoint", "location": {"x": 666.846932, "y": 179.549282, "z": 156.060052}, "xyz_rotation_matrix": [[0.655400170911794, -0.19726334977864995, 0.7290663802445544], [-0.140619187117135, -0.9802826664659195, -0.138824126292885], [0.7420760474394167, -0.011535365645384002, -0.6702164390375097]]} +{"type": "orientedPoint", "location": {"x": 687.069517, "y": 178.9582245, "z": 181.969974}, "xyz_rotation_matrix": [[-0.5331716207371886, -0.660987593364192, -0.5280373322588974], [-0.6859929670830363, 0.7030578765179294, -0.18741203637630238], [0.4951178364319872, 0.262307117106482, -0.8282833478720881]]} +{"type": "orientedPoint", "location": {"x": 519.885444, "y": 242.015013, "z": 155.859171}, "xyz_rotation_matrix": [[-0.10990778833190495, -0.8330223775441021, 0.5422121324488789], [0.65860575553198, 0.34753169179456483, 0.6674280350558836], [-0.744418388303338, 0.43045957035380117, 0.5104368927170938]]} +{"type": "orientedPoint", "location": {"x": 544.69876, "y": 151.381364, "z": 159.783453}, "xyz_rotation_matrix": [[-0.030189608313507754, -0.13962791217089587, 0.9897437212191214], [-0.7260037171870996, 0.6836648785872601, 0.0743030040898815], [-0.6870277943288692, -0.7163144420776839, -0.12200995816139543]]} +{"type": "orientedPoint", "location": {"x": 655.775457, "y": 280.574086, "z": 140.7811685}, "xyz_rotation_matrix": [[-0.03978300545342958, -0.15493248933269682, 0.9871237188044195], [0.8119491587787033, -0.5807959510942396, -0.05843480770135345], [0.5823709093315437, 0.7991695608203004, 0.1489031128708855]]} +{"type": "orientedPoint", "location": {"x": 542.09579, "y": 270.379569, "z": 145.518277}, "xyz_rotation_matrix": [[-0.9917608370004417, -0.0735868530246859, 0.10485903515723806], [0.08999583340660283, -0.9827582693242495, 0.16151450103398615], [0.09116574006519447, 0.1696206329923627, 0.9812836739198488]]} +{"type": "orientedPoint", "location": {"x": 548.6509465, "y": 216.8218015, "z": 120.7398825}, "xyz_rotation_matrix": [[-0.5321376304173837, -0.7408615737184916, 0.4098215110034271], [0.26864848330766544, 0.3112817512565015, 0.9115545314193642], [-0.8029056823253047, 0.5951703957036553, 0.03338660461459475]]} +{"type": "orientedPoint", "location": {"x": 596.519582, "y": 160.634628, "z": 128.6775455}, "xyz_rotation_matrix": [[0.0674928950988965, -0.0735921879515708, 0.9950019592863475], [-0.9966608319289236, 0.04096190333560917, 0.07063503786273434], [-0.04595536105738979, -0.9964468437140162, -0.07058181382240086]]} +{"type": "orientedPoint", "location": {"x": 592.0109335, "y": 255.3931135, "z": 118.558094}, "xyz_rotation_matrix": [[-0.910755747259856, 0.2111361684673798, 0.35488799246812464], [-0.26686898049969393, -0.9567680849729825, -0.11565370216376997], [0.31512682538970793, -0.2000408706790846, 0.9277277262094512]]} \ No newline at end of file diff --git a/tests/data/cryoet/point.ndjson b/tests/data/cryoet/point.ndjson new file mode 100644 index 00000000..1455664c --- /dev/null +++ b/tests/data/cryoet/point.ndjson @@ -0,0 +1,83 @@ +{"type": "point", "location": {"x": 234.0, "y": 672.0, "z": 274.0}} +{"type": "point", "location": {"x": 734.0, "y": 748.0, "z": 228.0}} +{"type": "point", "location": {"x": 602.0, "y": 738.0, "z": 246.0}} +{"type": "point", "location": {"x": 508.0, "y": 820.0, "z": 210.0}} +{"type": "point", "location": {"x": 710.0, "y": 746.0, "z": 188.0}} +{"type": "point", "location": {"x": 706.0, "y": 794.0, "z": 218.0}} +{"type": "point", "location": {"x": 712.0, "y": 708.0, "z": 226.0}} +{"type": "point", "location": {"x": 838.0, "y": 898.0, "z": 190.0}} +{"type": "point", "location": {"x": 732.0, "y": 648.0, "z": 300.0}} +{"type": "point", "location": {"x": 610.0, "y": 794.0, "z": 252.0}} +{"type": "point", "location": {"x": 570.0, "y": 750.0, "z": 232.0}} +{"type": "point", "location": {"x": 710.0, "y": 682.0, "z": 276.0}} +{"type": "point", "location": {"x": 220.0, "y": 906.0, "z": 314.0}} +{"type": "point", "location": {"x": 756.0, "y": 672.0, "z": 274.0}} +{"type": "point", "location": {"x": 426.0, "y": 794.0, "z": 254.0}} +{"type": "point", "location": {"x": 104.0, "y": 644.0, "z": 306.0}} +{"type": "point", "location": {"x": 76.0, "y": 752.0, "z": 302.0}} +{"type": "point", "location": {"x": 898.0, "y": 728.0, "z": 266.0}} +{"type": "point", "location": {"x": 238.0, "y": 670.0, "z": 290.0}} +{"type": "point", "location": {"x": 908.0, "y": 920.0, "z": 266.0}} +{"type": "point", "location": {"x": 920.0, "y": 684.0, "z": 138.0}} +{"type": "point", "location": {"x": 318.0, "y": 680.0, "z": 278.0}} +{"type": "point", "location": {"x": 310.0, "y": 792.0, "z": 200.0}} +{"type": "point", "location": {"x": 868.0, "y": 928.0, "z": 278.0}} +{"type": "point", "location": {"x": 504.0, "y": 784.0, "z": 278.0}} +{"type": "point", "location": {"x": 274.0, "y": 774.0, "z": 258.0}} +{"type": "point", "location": {"x": 910.0, "y": 654.0, "z": 192.0}} +{"type": "point", "location": {"x": 280.0, "y": 680.0, "z": 226.0}} +{"type": "point", "location": {"x": 860.0, "y": 714.0, "z": 148.0}} +{"type": "point", "location": {"x": 562.0, "y": 678.0, "z": 288.0}} +{"type": "point", "location": {"x": 552.0, "y": 718.0, "z": 278.0}} +{"type": "point", "location": {"x": 890.0, "y": 880.0, "z": 206.0}} +{"type": "point", "location": {"x": 632.0, "y": 770.0, "z": 238.0}} +{"type": "point", "location": {"x": 864.0, "y": 698.0, "z": 256.0}} +{"type": "point", "location": {"x": 750.0, "y": 772.0, "z": 256.0}} +{"type": "point", "location": {"x": 314.0, "y": 680.0, "z": 258.0}} +{"type": "point", "location": {"x": 886.0, "y": 692.0, "z": 302.0}} +{"type": "point", "location": {"x": 876.0, "y": 930.0, "z": 292.0}} +{"type": "point", "location": {"x": 248.0, "y": 932.0, "z": 222.0}} +{"type": "point", "location": {"x": 910.0, "y": 938.0, "z": 308.0}} +{"type": "point", "location": {"x": 432.0, "y": 722.0, "z": 218.0}} +{"type": "point", "location": {"x": 712.0, "y": 716.0, "z": 266.0}} +{"type": "point", "location": {"x": 462.0, "y": 744.0, "z": 230.0}} +{"type": "point", "location": {"x": 860.0, "y": 880.0, "z": 178.0}} +{"type": "point", "location": {"x": 82.0, "y": 868.0, "z": 210.0}} +{"type": "point", "location": {"x": 740.0, "y": 782.0, "z": 206.0}} +{"type": "point", "location": {"x": 862.0, "y": 876.0, "z": 194.0}} +{"type": "point", "location": {"x": 928.0, "y": 678.0, "z": 312.0}} +{"type": "point", "location": {"x": 828.0, "y": 780.0, "z": 122.0}} +{"type": "point", "location": {"x": 80.0, "y": 920.0, "z": 186.0}} +{"type": "point", "location": {"x": 426.0, "y": 678.0, "z": 284.0}} +{"type": "point", "location": {"x": 312.0, "y": 786.0, "z": 216.0}} +{"type": "point", "location": {"x": 434.0, "y": 688.0, "z": 176.0}} +{"type": "point", "location": {"x": 774.0, "y": 754.0, "z": 144.0}} +{"type": "point", "location": {"x": 322.0, "y": 774.0, "z": 318.0}} +{"type": "point", "location": {"x": 718.0, "y": 744.0, "z": 306.0}} +{"type": "point", "location": {"x": 72.0, "y": 920.0, "z": 200.0}} +{"type": "point", "location": {"x": 806.0, "y": 912.0, "z": 188.0}} +{"type": "point", "location": {"x": 938.0, "y": 640.0, "z": 202.0}} +{"type": "point", "location": {"x": 918.0, "y": 856.0, "z": 174.0}} +{"type": "point", "location": {"x": 350.0, "y": 776.0, "z": 236.0}} +{"type": "point", "location": {"x": 344.0, "y": 684.0, "z": 222.0}} +{"type": "point", "location": {"x": 358.0, "y": 722.0, "z": 314.0}} +{"type": "point", "location": {"x": 536.0, "y": 810.0, "z": 252.0}} +{"type": "point", "location": {"x": 306.0, "y": 840.0, "z": 156.0}} +{"type": "point", "location": {"x": 900.0, "y": 670.0, "z": 226.0}} +{"type": "point", "location": {"x": 434.0, "y": 788.0, "z": 192.0}} +{"type": "point", "location": {"x": 438.0, "y": 718.0, "z": 248.0}} +{"type": "point", "location": {"x": 754.0, "y": 642.0, "z": 172.0}} +{"type": "point", "location": {"x": 498.0, "y": 738.0, "z": 254.0}} +{"type": "point", "location": {"x": 938.0, "y": 914.0, "z": 298.0}} +{"type": "point", "location": {"x": 904.0, "y": 730.0, "z": 298.0}} +{"type": "point", "location": {"x": 144.0, "y": 768.0, "z": 310.0}} +{"type": "point", "location": {"x": 364.0, "y": 826.0, "z": 290.0}} +{"type": "point", "location": {"x": 268.0, "y": 692.0, "z": 154.0}} +{"type": "point", "location": {"x": 264.0, "y": 896.0, "z": 272.0}} +{"type": "point", "location": {"x": 540.0, "y": 842.0, "z": 218.0}} +{"type": "point", "location": {"x": 346.0, "y": 684.0, "z": 240.0}} +{"type": "point", "location": {"x": 902.0, "y": 730.0, "z": 282.0}} +{"type": "point", "location": {"x": 918.0, "y": 716.0, "z": 304.0}} +{"type": "point", "location": {"x": 556.0, "y": 722.0, "z": 296.0}} +{"type": "point", "location": {"x": 732.0, "y": 686.0, "z": 240.0}} +{"type": "point", "location": {"x": 556.0, "y": 724.0, "z": 316.0}} \ No newline at end of file diff --git a/tests/test_star.py b/tests/test_star.py index d53df983..4175b8df 100644 --- a/tests/test_star.py +++ b/tests/test_star.py @@ -3,6 +3,7 @@ from scipy.spatial.transform import Rotation as R import starfile from .constants import data_dir +from .utils import sample_attribute mn.unregister() mn.register() @@ -49,6 +50,14 @@ def test_starfile_attributes(type): assert (rot_from_euler * rot_from_geo_nodes.inv()).magnitude().max() < 1e-5 +def test_read_ndjson_oriented(snapshot): + file = data_dir / "cryoet/oriented_point.ndjson" + ensemble = mn.io.star.load(file) + for attr in ['position', 'rotation']: + assert snapshot == sample_attribute( + ensemble.object, attr, evaluate=False) + + def test_categorical_attributes(): file = data_dir / "cistem.star" ensemble = mn.io.star.load(file)