Source code for PyOpenWorm.data_trans.wormatlas
import traceback
from ..datasource import GenericTranslation
from ..network import Network
from ..worm import Worm
from ..website import Website
from ..evidence import Evidence
from rdflib.namespace import Namespace
from .csv_ds import CSVDataSource, CSVDataTranslator
from .data_with_evidence_ds import DataWithEvidenceDataSource
from .common_data import DS_NS, TRANS_NS
[docs]class WormAtlasCellListDataSource(CSVDataSource):
rdf_namespace = Namespace(DS_NS['WormAtlasCellListDataSource#'])
csv_header = ['Cell', 'Lineage Name', 'Description']
csv_field_delimiter = '\t'
[docs]class WormAtlasCellListDataTranslation(GenericTranslation):
def __init__(self, **kwargs):
super(WormAtlasCellListDataTranslation, self).__init__(**kwargs)
self.neurons_source = WormAtlasCellListDataTranslation.ObjectProperty()
[docs] def defined_augment(self):
return super(WormAtlasCellListDataTranslation, self).defined_augment() and \
self.neurons_source.has_defined_value()
[docs] def identifier_augment(self):
return self.make_identifier(super(WormAtlasCellListDataTranslation, self).identifier_augment().n3() +
self.neurons_source.onedef().identifier.n3())
[docs]class WormAtlasCellListDataTranslator(CSVDataTranslator):
input_type = (WormAtlasCellListDataSource, DataWithEvidenceDataSource)
output_type = DataWithEvidenceDataSource
translation_type = WormAtlasCellListDataTranslation
translator_identifier = TRANS_NS.WormAtlasCellListDataTranslator
[docs] def make_translation(self, sources):
res = super(WormAtlasCellListDataTranslator, self).make_translation()
res.source(sources[0])
res.neurons_source(sources[1])
return res
[docs] def translate(self, data_source, neurons_source):
res = self.make_new_output(sources=(data_source, neurons_source))
try:
net_q = neurons_source.data_context.query(Network)()
net = next(net_q.load(), net_q)
# TODO: Improve this evidence marker
doc = res.evidence_context(Website)(url="http://www.wormatlas.org/celllist.htm")
ev = res.evidence_context(Evidence)(reference=doc)
doc_ctx = res.data_context_for(document=doc)
ev.supports(doc_ctx.rdf_object)
w = doc_ctx(Worm)()
with self.make_reader(data_source, skipinitialspace=True, skipheader=True) as csvreader:
cell_name_counters = dict()
data = dict()
for j in csvreader:
name = j[0]
lineageName = j[1]
desc = j[2]
# XXX: These renaming choices are arbitrary; may be inappropriate
if name == "DB1/3":
name = "DB1"
elif name == "DB3/1":
name = "DB3"
elif name == "AVFL/R":
if lineageName[0] == "W":
name = "AVFL"
elif lineageName[0] == "P":
name = "AVFR"
if name in cell_name_counters:
basename = name
while name in cell_name_counters:
cell_name_counters[basename] += 1
name = basename + "(" + str(cell_name_counters[basename]) + ")"
else:
cell_name_counters[name] = 0
data[name] = {"lineageName": lineageName, "desc": desc}
for n in net.neurons():
# Get the name of the neuron in its original context
name = n.name.one()
cell_data = data[str(name)]
# Make statements in the result context
nn = doc_ctx(n)
nn.lineageName(cell_data['lineageName'])
nn.description(cell_data['desc'])
w.cell(nn)
# TODO: Add data for other cells here. Requires relating named
# muscle cells to their counterparts in the cell list (e.g. mu_bod(#))
print ("uploaded lineage and descriptions")
except Exception:
traceback.print_exc()
return res
__yarom_mapped_classes__ = (WormAtlasCellListDataSource,
WormAtlasCellListDataTranslator,
WormAtlasCellListDataTranslation)