Skip to content

Commit 4ab1cd1

Browse files
benjefferymergify[bot]
authored andcommitted
Move dump_text
1 parent 6147db4 commit 4ab1cd1

File tree

2 files changed

+176
-149
lines changed

2 files changed

+176
-149
lines changed

python/tskit/text_formats.py

Lines changed: 163 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,8 @@
2222
"""
2323
Module responsible for working with text format data.
2424
"""
25+
import base64
26+
2527
import numpy as np
2628

2729
import tskit
@@ -248,3 +250,164 @@ def build_newick(tree, *, root, precision, node_labels, include_branch_lengths):
248250
include_branch_lengths=include_branch_lengths,
249251
)
250252
return s + ";"
253+
254+
255+
def dump_text(
256+
ts,
257+
nodes,
258+
edges,
259+
sites,
260+
mutations,
261+
individuals,
262+
populations,
263+
provenances,
264+
precision,
265+
encoding,
266+
base64_metadata,
267+
):
268+
if nodes is not None:
269+
print(
270+
"id",
271+
"is_sample",
272+
"time",
273+
"population",
274+
"individual",
275+
"metadata",
276+
sep="\t",
277+
file=nodes,
278+
)
279+
for node in ts.nodes():
280+
metadata = node.metadata
281+
if base64_metadata:
282+
metadata = base64.b64encode(metadata).decode(encoding)
283+
row = (
284+
"{id:d}\t"
285+
"{is_sample:d}\t"
286+
"{time:.{precision}f}\t"
287+
"{population:d}\t"
288+
"{individual:d}\t"
289+
"{metadata}"
290+
).format(
291+
precision=precision,
292+
id=node.id,
293+
is_sample=node.is_sample(),
294+
time=node.time,
295+
population=node.population,
296+
individual=node.individual,
297+
metadata=metadata,
298+
)
299+
print(row, file=nodes)
300+
301+
if edges is not None:
302+
print("left", "right", "parent", "child", sep="\t", file=edges)
303+
for edge in ts.edges():
304+
row = (
305+
"{left:.{precision}f}\t"
306+
"{right:.{precision}f}\t"
307+
"{parent:d}\t"
308+
"{child:d}"
309+
).format(
310+
precision=precision,
311+
left=edge.left,
312+
right=edge.right,
313+
parent=edge.parent,
314+
child=edge.child,
315+
)
316+
print(row, file=edges)
317+
318+
if sites is not None:
319+
print("position", "ancestral_state", "metadata", sep="\t", file=sites)
320+
for site in ts.sites():
321+
metadata = site.metadata
322+
if base64_metadata:
323+
metadata = base64.b64encode(metadata).decode(encoding)
324+
row = (
325+
"{position:.{precision}f}\t" "{ancestral_state}\t" "{metadata}"
326+
).format(
327+
precision=precision,
328+
position=site.position,
329+
ancestral_state=site.ancestral_state,
330+
metadata=metadata,
331+
)
332+
print(row, file=sites)
333+
334+
if mutations is not None:
335+
print(
336+
"site",
337+
"node",
338+
"time",
339+
"derived_state",
340+
"parent",
341+
"metadata",
342+
sep="\t",
343+
file=mutations,
344+
)
345+
for site in ts.sites():
346+
for mutation in site.mutations:
347+
metadata = mutation.metadata
348+
if base64_metadata:
349+
metadata = base64.b64encode(metadata).decode(encoding)
350+
row = (
351+
"{site}\t"
352+
"{node}\t"
353+
"{time}\t"
354+
"{derived_state}\t"
355+
"{parent}\t"
356+
"{metadata}"
357+
).format(
358+
site=mutation.site,
359+
node=mutation.node,
360+
time="unknown"
361+
if util.is_unknown_time(mutation.time)
362+
else mutation.time,
363+
derived_state=mutation.derived_state,
364+
parent=mutation.parent,
365+
metadata=metadata,
366+
)
367+
print(row, file=mutations)
368+
369+
if individuals is not None:
370+
print(
371+
"id",
372+
"flags",
373+
"location",
374+
"parents",
375+
"metadata",
376+
sep="\t",
377+
file=individuals,
378+
)
379+
for individual in ts.individuals():
380+
metadata = individual.metadata
381+
if base64_metadata:
382+
metadata = base64.b64encode(metadata).decode(encoding)
383+
location = ",".join(map(str, individual.location))
384+
parents = ",".join(map(str, individual.parents))
385+
row = (
386+
"{id}\t" "{flags}\t" "{location}\t" "{parents}\t" "{metadata}"
387+
).format(
388+
id=individual.id,
389+
flags=individual.flags,
390+
location=location,
391+
parents=parents,
392+
metadata=metadata,
393+
)
394+
print(row, file=individuals)
395+
396+
if populations is not None:
397+
print("id", "metadata", sep="\t", file=populations)
398+
for population in ts.populations():
399+
metadata = population.metadata
400+
if base64_metadata:
401+
metadata = base64.b64encode(metadata).decode(encoding)
402+
row = ("{id}\t" "{metadata}").format(id=population.id, metadata=metadata)
403+
print(row, file=populations)
404+
405+
if provenances is not None:
406+
print("id", "timestamp", "record", sep="\t", file=provenances)
407+
for provenance in ts.provenances():
408+
row = ("{id}\t" "{timestamp}\t" "{record}\t").format(
409+
id=provenance.id,
410+
timestamp=provenance.timestamp,
411+
record=provenance.record,
412+
)
413+
print(row, file=provenances)

python/tskit/trees.py

Lines changed: 13 additions & 149 deletions
Original file line numberDiff line numberDiff line change
@@ -3849,155 +3849,19 @@ def dump_text(
38493849
:param bool base64_metadata: If True, metadata is encoded using Base64
38503850
encoding; otherwise, as plain text.
38513851
"""
3852-
3853-
if nodes is not None:
3854-
print(
3855-
"id",
3856-
"is_sample",
3857-
"time",
3858-
"population",
3859-
"individual",
3860-
"metadata",
3861-
sep="\t",
3862-
file=nodes,
3863-
)
3864-
for node in self.nodes():
3865-
metadata = node.metadata
3866-
if base64_metadata:
3867-
metadata = base64.b64encode(metadata).decode(encoding)
3868-
row = (
3869-
"{id:d}\t"
3870-
"{is_sample:d}\t"
3871-
"{time:.{precision}f}\t"
3872-
"{population:d}\t"
3873-
"{individual:d}\t"
3874-
"{metadata}"
3875-
).format(
3876-
precision=precision,
3877-
id=node.id,
3878-
is_sample=node.is_sample(),
3879-
time=node.time,
3880-
population=node.population,
3881-
individual=node.individual,
3882-
metadata=metadata,
3883-
)
3884-
print(row, file=nodes)
3885-
3886-
if edges is not None:
3887-
print("left", "right", "parent", "child", sep="\t", file=edges)
3888-
for edge in self.edges():
3889-
row = (
3890-
"{left:.{precision}f}\t"
3891-
"{right:.{precision}f}\t"
3892-
"{parent:d}\t"
3893-
"{child:d}"
3894-
).format(
3895-
precision=precision,
3896-
left=edge.left,
3897-
right=edge.right,
3898-
parent=edge.parent,
3899-
child=edge.child,
3900-
)
3901-
print(row, file=edges)
3902-
3903-
if sites is not None:
3904-
print("position", "ancestral_state", "metadata", sep="\t", file=sites)
3905-
for site in self.sites():
3906-
metadata = site.metadata
3907-
if base64_metadata:
3908-
metadata = base64.b64encode(metadata).decode(encoding)
3909-
row = (
3910-
"{position:.{precision}f}\t" "{ancestral_state}\t" "{metadata}"
3911-
).format(
3912-
precision=precision,
3913-
position=site.position,
3914-
ancestral_state=site.ancestral_state,
3915-
metadata=metadata,
3916-
)
3917-
print(row, file=sites)
3918-
3919-
if mutations is not None:
3920-
print(
3921-
"site",
3922-
"node",
3923-
"time",
3924-
"derived_state",
3925-
"parent",
3926-
"metadata",
3927-
sep="\t",
3928-
file=mutations,
3929-
)
3930-
for site in self.sites():
3931-
for mutation in site.mutations:
3932-
metadata = mutation.metadata
3933-
if base64_metadata:
3934-
metadata = base64.b64encode(metadata).decode(encoding)
3935-
row = (
3936-
"{site}\t"
3937-
"{node}\t"
3938-
"{time}\t"
3939-
"{derived_state}\t"
3940-
"{parent}\t"
3941-
"{metadata}"
3942-
).format(
3943-
site=mutation.site,
3944-
node=mutation.node,
3945-
time="unknown"
3946-
if util.is_unknown_time(mutation.time)
3947-
else mutation.time,
3948-
derived_state=mutation.derived_state,
3949-
parent=mutation.parent,
3950-
metadata=metadata,
3951-
)
3952-
print(row, file=mutations)
3953-
3954-
if individuals is not None:
3955-
print(
3956-
"id",
3957-
"flags",
3958-
"location",
3959-
"parents",
3960-
"metadata",
3961-
sep="\t",
3962-
file=individuals,
3963-
)
3964-
for individual in self.individuals():
3965-
metadata = individual.metadata
3966-
if base64_metadata:
3967-
metadata = base64.b64encode(metadata).decode(encoding)
3968-
location = ",".join(map(str, individual.location))
3969-
parents = ",".join(map(str, individual.parents))
3970-
row = (
3971-
"{id}\t" "{flags}\t" "{location}\t" "{parents}\t" "{metadata}"
3972-
).format(
3973-
id=individual.id,
3974-
flags=individual.flags,
3975-
location=location,
3976-
parents=parents,
3977-
metadata=metadata,
3978-
)
3979-
print(row, file=individuals)
3980-
3981-
if populations is not None:
3982-
print("id", "metadata", sep="\t", file=populations)
3983-
for population in self.populations():
3984-
metadata = population.metadata
3985-
if base64_metadata:
3986-
metadata = base64.b64encode(metadata).decode(encoding)
3987-
row = ("{id}\t" "{metadata}").format(
3988-
id=population.id, metadata=metadata
3989-
)
3990-
print(row, file=populations)
3991-
3992-
if provenances is not None:
3993-
print("id", "timestamp", "record", sep="\t", file=provenances)
3994-
for provenance in self.provenances():
3995-
row = ("{id}\t" "{timestamp}\t" "{record}\t").format(
3996-
id=provenance.id,
3997-
timestamp=provenance.timestamp,
3998-
record=provenance.record,
3999-
)
4000-
print(row, file=provenances)
3852+
text_formats.dump_text(
3853+
self,
3854+
nodes,
3855+
edges,
3856+
sites,
3857+
mutations,
3858+
individuals,
3859+
populations,
3860+
provenances,
3861+
precision,
3862+
encoding,
3863+
base64_metadata,
3864+
)
40013865

40023866
def __str__(self):
40033867
"""

0 commit comments

Comments
 (0)