43 lines
1.6 KiB
Python
Executable file
43 lines
1.6 KiB
Python
Executable file
#!/usr/bin/env python3
|
|
import textwrap
|
|
|
|
def svg_path_from_points(points, r):
|
|
points_joined = ' '.join(f'{x:.6f} {y:.6f}' for x, y in points)
|
|
return textwrap.dedent(f'''
|
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
|
<svg
|
|
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
|
xmlns:cc="http://creativecommons.org/ns#"
|
|
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
|
xmlns:svg="http://www.w3.org/2000/svg"
|
|
xmlns="http://www.w3.org/2000/svg"
|
|
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
|
version="1.1"
|
|
width="{r*2}mm"
|
|
height="{r*2}mm"
|
|
viewBox="0 0 {r*2} {r*2}"
|
|
id="svg2">
|
|
<g id="layer1">
|
|
<path id="path2991"
|
|
style="fill:none;stroke:#000000;stroke-width:0.1mm;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
|
d="M 0,0 L {points_joined}" />
|
|
</g>
|
|
</svg>
|
|
''').strip()
|
|
|
|
if __name__ == '__main__':
|
|
import argparse
|
|
parser = argparse.ArgumentParser()
|
|
parser.add_argument('locus_csv', help='CSV file containing locus coordinates. Format: lambda, x, y, z.')
|
|
parser.add_argument('-r', '--radius', type=float, default=100, help='Radius of plot area in mm')
|
|
args = parser.parse_args()
|
|
|
|
import csv, ast
|
|
points = []
|
|
with open(args.locus_csv, newline='') as f:
|
|
for row in csv.reader(f):
|
|
# use literal_eval to handle entries like "1.153E-5"
|
|
λ, x, y, z = (ast.literal_eval(e.strip()) for e in row)
|
|
points.append((x*args.radius*2, y*args.radius*2))
|
|
|
|
print(svg_path_from_points(points, args.radius))
|