Skip to content

Commit 4d263c4

Browse files
committed
Used calc docs library for implementation
1 parent b0ebd01 commit 4d263c4

4 files changed

Lines changed: 155 additions & 128 deletions

File tree

src/allotropy/allotrope/schema_mappers/adm/pcr/BENCHLING/_2023/_09/dpcr.py

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -183,6 +183,15 @@ def _get_technique_document(
183183
def _get_measurement_document(
184184
self, measurement: Measurement, metadata: Metadata
185185
) -> MeasurementDocumentItem:
186+
sample_document = SampleDocument(
187+
sample_identifier=measurement.sample_identifier,
188+
well_location_identifier=measurement.location_identifier,
189+
well_plate_identifier=measurement.plate_identifier,
190+
sample_role_type=measurement.sample_role_type,
191+
)
192+
sample_document = add_custom_information_document(
193+
sample_document, measurement.sample_custom_info
194+
)
186195
measurement_doc = MeasurementDocumentItem(
187196
measurement_identifier=measurement.identifier,
188197
measurement_time=self.get_date_time(measurement.measurement_time),
@@ -199,12 +208,7 @@ def _get_measurement_document(
199208
error_aggregate_document=self._get_error_aggregate_document(
200209
measurement.errors
201210
),
202-
sample_document=SampleDocument(
203-
sample_identifier=measurement.sample_identifier,
204-
well_location_identifier=measurement.location_identifier,
205-
well_plate_identifier=measurement.plate_identifier,
206-
sample_role_type=measurement.sample_role_type,
207-
),
211+
sample_document=sample_document,
208212
device_control_aggregate_document=DeviceControlAggregateDocument(
209213
device_control_document=[
210214
DeviceControlDocumentItem(
@@ -246,9 +250,6 @@ def _get_measurement_document(
246250
),
247251
)
248252

249-
measurement_doc.sample_document = add_custom_information_document(
250-
measurement_doc.sample_document, measurement.sample_custom_info
251-
)
252253
return add_custom_information_document(measurement_doc, measurement.custom_info)
253254

254255
def _get_calculated_data_aggregate_document(

src/allotropy/parsers/qiacuity_dpcr/constants.py

Lines changed: 25 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -1,35 +1,30 @@
1-
from dataclasses import dataclass
2-
3-
4-
@dataclass(frozen=True)
5-
class CalculatedDataConfig:
6-
name: str
7-
key: str
8-
unit: str
9-
feature: str | None = None
10-
11-
12-
CONFIGS: list[CalculatedDataConfig] = [
13-
CalculatedDataConfig(
14-
name="CI (95%)", key="CI (95%)", unit="%", feature="Positive Partition Count"
15-
),
16-
CalculatedDataConfig(
17-
name="SD", key="SD", unit="(unitless)", feature="Number Concentration (#/μL)"
18-
),
19-
CalculatedDataConfig(
20-
name="CV%", key="CV%", unit="%", feature="Number Concentration (#/μL)"
21-
),
22-
CalculatedDataConfig(
23-
name="Mean Concentration",
24-
key="Mean conc. [copies/μL]",
25-
unit="#/μL",
26-
feature="Mean Concentration (#/μL)",
27-
),
1+
CALCULATED_DATA_CONFIGS: list[dict[str, str]] = [
2+
{
3+
"name": "CI (95%)",
4+
"keys": "CI (95%)",
5+
"unit": "%",
6+
"feature": "Positive Partition Count",
7+
},
8+
{
9+
"name": "SD",
10+
"keys": "SD",
11+
"unit": "(unitless)",
12+
"feature": "Number Concentration",
13+
},
14+
{
15+
"name": "CV%",
16+
"keys": "CV%",
17+
"unit": "%",
18+
"feature": "Number Concentration (#/μL)",
19+
},
20+
{
21+
"name": "Mean Concentration",
22+
"keys": "Mean conc. [copies/μL]",
23+
"unit": "#/μL",
24+
"feature": "Mean Concentration (#/μL)",
25+
},
2826
]
2927

30-
CONFIGS_KEYS: set[str] = {config.key for config in CONFIGS}
31-
32-
3328
BRAND_NAME = "Qiacuity Digital PCR System"
3429
PRODUCT_MANUFACTURER = "Qiagen"
3530
SOFTWARE_NAME = "Qiacuity Software Suite"

src/allotropy/parsers/qiacuity_dpcr/qiacuity_dpcr_calculated_data.py

Lines changed: 47 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -6,42 +6,73 @@
66
CalculatedDataItem,
77
DataSource,
88
)
9-
from allotropy.parsers.qiacuity_dpcr.constants import CONFIGS
9+
from allotropy.parsers.qiacuity_dpcr.constants import CALCULATED_DATA_CONFIGS
10+
from allotropy.parsers.utils.calculated_data_documents.definition import (
11+
CalculatedDocument as UtilsCalculatedDocument,
12+
DataSource as UtilsDataSource,
13+
Referenceable as UtilsReferenceable,
14+
)
1015
from allotropy.parsers.utils.pandas import SeriesData
1116
from allotropy.parsers.utils.uuids import random_uuid_str
1217

1318

14-
def _iter_row_calculated_items(row: SeriesData) -> Iterable[CalculatedDataItem]:
19+
def _iter_row_calculated_docs(row: SeriesData) -> Iterable[UtilsCalculatedDocument]:
1520
measurement_identifier = row.get(str, "_measurement_identifier")
1621
if not measurement_identifier:
1722
return []
1823

19-
items: list[CalculatedDataItem] = []
24+
docs: list[UtilsCalculatedDocument] = []
2025

21-
for conf in CONFIGS:
22-
value = row.get(float, conf.key)
26+
measurement_ref = UtilsReferenceable(uuid=measurement_identifier)
27+
28+
for conf in CALCULATED_DATA_CONFIGS:
29+
value = row.get(float, conf["keys"])
2330
if value is None:
2431
continue
25-
items.append(
26-
CalculatedDataItem(
27-
identifier=random_uuid_str(),
28-
name=conf.name,
32+
docs.append(
33+
UtilsCalculatedDocument(
34+
uuid=random_uuid_str(),
35+
name=conf["name"],
2936
value=float(value),
30-
unit=conf.unit,
37+
unit=conf["unit"],
3138
data_sources=[
32-
DataSource(
33-
identifier=measurement_identifier,
34-
feature=conf.feature or conf.name,
39+
UtilsDataSource(
40+
feature=conf.get("feature", conf["name"]),
41+
reference=measurement_ref,
3542
)
3643
],
3744
)
3845
)
3946

47+
return docs
48+
49+
50+
def _docs_to_benchling_items(
51+
docs: Iterable[UtilsCalculatedDocument],
52+
) -> list[CalculatedDataItem]:
53+
items: list[CalculatedDataItem] = []
54+
for doc in docs:
55+
for flat_doc in doc.iter_struct():
56+
items.append(
57+
CalculatedDataItem(
58+
identifier=flat_doc.uuid,
59+
name=flat_doc.name,
60+
value=flat_doc.value,
61+
unit=flat_doc.unit or "",
62+
data_sources=[
63+
DataSource(
64+
identifier=ds.reference.uuid,
65+
feature=ds.feature,
66+
)
67+
for ds in flat_doc.data_sources
68+
],
69+
)
70+
)
4071
return items
4172

4273

4374
def create_calculated_data(rows: list[SeriesData]) -> list[CalculatedDataItem]:
44-
calculated: list[CalculatedDataItem] = []
75+
docs: list[UtilsCalculatedDocument] = []
4576
for row in rows:
46-
calculated.extend(list(_iter_row_calculated_items(row)))
47-
return calculated
77+
docs.extend(list(_iter_row_calculated_docs(row)))
78+
return _docs_to_benchling_items(docs)

0 commit comments

Comments
 (0)