Skip to content

Commit cfa1bfb

Browse files
add pacbio_absquant_v12 to require sample mass (#366)
* add pacbio_absquant_v12 to require sample mass * clarify inheritance comment
1 parent 047c018 commit cfa1bfb

19 files changed

Lines changed: 315 additions & 61 deletions

‎metapool/abs_quant_sample_info.py‎

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
11
import os
22
import pandas
3+
from typing import Optional
34
import yaml
45

5-
from typing import Optional
6+
from metapool.mp_strings import CALC_MASS_SAMPLE_ALIQUOT_INPUT_G_KEY
7+
68

79
# Relative path to default config file
810
DEFAULT_CONFIG_FP = 'data/abs_quant_sample_info_calc.yml'
@@ -46,7 +48,6 @@
4648
CALC_DENSITY_HOMOGENATE_G_ML_KEY = 'calc_density_homogenate_g_ml'
4749
CALC_MASS_HOMOGENATE_ALIQUOT_INPUT_G_KEY = \
4850
'calc_mass_homogenate_aliquot_input_g'
49-
CALC_MASS_SAMPLE_ALIQUOT_INPUT_G_KEY = 'calc_mass_sample_aliquot_input_g'
5051
CALC_MASS_SAMPLE_ALIQUOT_INPUT_MG_KEY = 'calc_mass_sample_aliquot_input_mg'
5152
CALC_MASS_STORAGE_LIQUID_ALIQUOT_INPUT_G = \
5253
'calc_mass_storage_liquid_aliquot_input_g'

‎metapool/mp_strings.py‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,7 @@
7070
BARCODE_ID_KEY = 'barcode_id'
7171
TWIST_ADAPTOR_ID_KEY = 'twist_adaptor_id'
7272
SYNDNA_IS_TWISTED_KEY = 'syndna_is_twisted'
73+
CALC_MASS_SAMPLE_ALIQUOT_INPUT_G_KEY = 'calc_mass_sample_aliquot_input_g'
7374

7475

7576
def parse_project_name(project_name):

‎metapool/sample_sheet.py‎

Lines changed: 76 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,8 @@
1616
PROJECT_FULL_NAME_KEY, TUBECODE_KEY, SYNDNA_POOL_MASS_NG_KEY, \
1717
SYNDNA_POOL_NUM_KEY, ELUTION_VOL_KEY, EXTRACTED_GDNA_CONC_KEY, \
1818
LIB_CONSTRUCT_PROTOCOL_KEY, PM_WELL_ID_384_KEY, DESTINATION_WELL_384_KEY, \
19-
BARCODE_ID_KEY, TWIST_ADAPTOR_ID_KEY, SYNDNA_IS_TWISTED_KEY
19+
BARCODE_ID_KEY, TWIST_ADAPTOR_ID_KEY, SYNDNA_IS_TWISTED_KEY, \
20+
CALC_MASS_SAMPLE_ALIQUOT_INPUT_G_KEY
2021
from metapool.util import convert_to_bool
2122
from metapool.metapool import (bcl_scrub_name, sequencer_i5_index)
2223
from metapool.sequencers import is_i5_revcomp_sequencer, get_sequencer_type, \
@@ -1542,7 +1543,7 @@ def __init__(self, path=None, defer_validate=False):
15421543
self._validate_on_load(path, defer_validate)
15431544

15441545

1545-
class AbsQuantMixin(object):
1546+
class AbsQuantMixinV1(object):
15461547
_ABSQUANT_SPECIFIC_COLUMNS = (
15471548
SYNDNA_POOL_MASS_NG_KEY, EXTRACTED_GDNA_CONC_KEY,
15481549
ELUTION_VOL_KEY, SYNDNA_POOL_NUM_KEY)
@@ -1555,7 +1556,35 @@ class AbsQuantMixin(object):
15551556
})
15561557

15571558
# Reminder: the method of adding carried prep columns and data columns used
1558-
# below ONLY works if the mixin is the last class in the inheritance list
1559+
# below ONLY works if the mixin is the leaf class in the inheritance
1560+
# (which, in python, is the *first* one listed in the class definition)
1561+
# and if the class that inherits from it does not explicitly set these
1562+
# attributes in its own __init__ method. Safest not to set these
1563+
# attributes in leaf classes at all (specific sheet versions) for leaf
1564+
# class that uses a mixin like this.
1565+
def __init__(self, path=None, defer_validate=False):
1566+
super().__init__(path=path, defer_validate=True)
1567+
self._remapper = self._extend_mapping_type(self._ABSQUANT_REMAPPER)
1568+
self._data_columns = \
1569+
self._data_columns + self._ABSQUANT_SPECIFIC_COLUMNS
1570+
if self._CARRIED_PREP_COLUMNS is not None:
1571+
self._CARRIED_PREP_COLUMNS = \
1572+
self._CARRIED_PREP_COLUMNS + self._ABSQUANT_SPECIFIC_COLUMNS
1573+
self._validate_on_load(path, defer_validate)
1574+
1575+
1576+
class AbsQuantMixinV2(object):
1577+
_ABSQUANT_SPECIFIC_COLUMNS = AbsQuantMixinV1._ABSQUANT_SPECIFIC_COLUMNS + \
1578+
(CALC_MASS_SAMPLE_ALIQUOT_INPUT_G_KEY,)
1579+
_ABSQUANT_REMAPPER = MappingProxyType(
1580+
AbsQuantMixinV1._ABSQUANT_REMAPPER |
1581+
{CALC_MASS_SAMPLE_ALIQUOT_INPUT_G_KEY:
1582+
CALC_MASS_SAMPLE_ALIQUOT_INPUT_G_KEY}
1583+
)
1584+
1585+
# Reminder: the method of adding carried prep columns and data columns used
1586+
# below ONLY works if the mixin is the leaf class in the inheritance
1587+
# (which, in python, is the *first* one listed in the class definition)
15591588
# and if the class that inherits from it does not explicitly set these
15601589
# attributes in its own __init__ method. Safest not to set these
15611590
# attributes in leaf classes at all (specific sheet versions) for leaf
@@ -1680,7 +1709,8 @@ class TellseqMetagSampleSheetv10(KLTellSeqSampleSheet):
16801709
_HEADER[_ASSAY_KEY] = _METAGENOMIC
16811710

16821711

1683-
class TellseqAbsquantMetagSampleSheetv10(AbsQuantMixin, KLTellSeqSampleSheet):
1712+
class TellseqAbsquantMetagSampleSheetv10(
1713+
AbsQuantMixinV1, KLTellSeqSampleSheet):
16841714
_HEADER = KLSampleSheet._HEADER.copy()
16851715
_HEADER[_SHEET_TYPE_KEY] = TELLSEQ_ABSQUANT_SHEET_TYPE
16861716
_HEADER[_SHEET_VERSION_KEY] = '10'
@@ -1828,7 +1858,7 @@ class PacBioMetagSampleSheetv10(PacBioSampleSheet):
18281858
_HEADER[_ASSAY_KEY] = _METAGENOMIC
18291859

18301860

1831-
class PacBioAbsquantSampleSheetv10(AbsQuantMixin, PacBioSampleSheet):
1861+
class PacBioAbsquantSampleSheetv10(AbsQuantMixinV1, PacBioSampleSheet):
18321862
_HEADER = PacBioSampleSheet._HEADER.copy()
18331863
_HEADER[_SHEET_TYPE_KEY] = PACBIO_ABSQUANT_SHEET_TYPE
18341864
_HEADER[_SHEET_VERSION_KEY] = '10'
@@ -1886,15 +1916,42 @@ class PacBioMetagSampleSheetv11(PacBioSampleSheetWithTwistAdapters):
18861916
_HEADER[_ASSAY_KEY] = _METAGENOMIC
18871917

18881918

1889-
class TwistAbsquantMixin(AbsQuantMixin):
1919+
class TwistAbsquantMixinV1(AbsQuantMixinV1):
1920+
_TWIST_ABSQUANT_SPECIFIC_COLUMNS = (SYNDNA_IS_TWISTED_KEY,)
1921+
1922+
_TWIST_ABSQUANT_REMAPPER = MappingProxyType({
1923+
SYNDNA_IS_TWISTED_KEY: SYNDNA_IS_TWISTED_KEY,
1924+
})
1925+
1926+
# Reminder: the method of adding carried prep columns and data columns used
1927+
# below ONLY works if the mixin is the leaf class in the inheritance
1928+
# (which, in python, is the *first* one listed in the class definition)
1929+
# and if the class that inherits from it does not explicitly set these
1930+
# attributes in its own __init__ method. Safest not to set these
1931+
# attributes in leaf classes at all (specific sheet versions) for leaf
1932+
# class that uses a mixin like this.
1933+
def __init__(self, path=None, defer_validate=False):
1934+
super().__init__(path=path, defer_validate=True)
1935+
self._remapper = self._extend_mapping_type(
1936+
self._TWIST_ABSQUANT_REMAPPER)
1937+
self._data_columns = self._data_columns + \
1938+
self._TWIST_ABSQUANT_SPECIFIC_COLUMNS
1939+
if self._CARRIED_PREP_COLUMNS is not None:
1940+
self._CARRIED_PREP_COLUMNS = self._CARRIED_PREP_COLUMNS + \
1941+
self._TWIST_ABSQUANT_SPECIFIC_COLUMNS
1942+
self._validate_on_load(path, defer_validate)
1943+
1944+
1945+
class TwistAbsquantMixinV2(AbsQuantMixinV2):
18901946
_TWIST_ABSQUANT_SPECIFIC_COLUMNS = (SYNDNA_IS_TWISTED_KEY,)
18911947

18921948
_TWIST_ABSQUANT_REMAPPER = MappingProxyType({
18931949
SYNDNA_IS_TWISTED_KEY: SYNDNA_IS_TWISTED_KEY,
18941950
})
18951951

18961952
# Reminder: the method of adding carried prep columns and data columns used
1897-
# below ONLY works if the mixin is the last class in the inheritance list
1953+
# below ONLY works if the mixin is the leaf class in the inheritance
1954+
# (which, in python, is the *first* one listed in the class definition)
18981955
# and if the class that inherits from it does not explicitly set these
18991956
# attributes in its own __init__ method. Safest not to set these
19001957
# attributes in leaf classes at all (specific sheet versions) for leaf
@@ -1912,13 +1969,21 @@ def __init__(self, path=None, defer_validate=False):
19121969

19131970

19141971
class PacBioAbsquantSampleSheetv11(
1915-
TwistAbsquantMixin, PacBioSampleSheetWithTwistAdapters):
1972+
TwistAbsquantMixinV1, PacBioSampleSheetWithTwistAdapters):
19161973
_HEADER = PacBioSampleSheetWithTwistAdapters._HEADER.copy()
19171974
_HEADER[_SHEET_TYPE_KEY] = PACBIO_ABSQUANT_SHEET_TYPE
19181975
_HEADER[_SHEET_VERSION_KEY] = '11'
19191976
_HEADER[_ASSAY_KEY] = _METAGENOMIC
19201977

19211978

1979+
class PacBioAbsquantSampleSheetv12(
1980+
TwistAbsquantMixinV2, PacBioSampleSheetWithTwistAdapters):
1981+
_HEADER = PacBioSampleSheetWithTwistAdapters._HEADER.copy()
1982+
_HEADER[_SHEET_TYPE_KEY] = PACBIO_ABSQUANT_SHEET_TYPE
1983+
_HEADER[_SHEET_VERSION_KEY] = '12'
1984+
_HEADER[_ASSAY_KEY] = _METAGENOMIC
1985+
1986+
19221987
class MetagenomicSampleSheetv102(
19231988
KatharoseqMixin, KLSampleSheetWithSampleContext):
19241989
# Adds support for optional KATHAROSEQ columns in [Data] section.
@@ -2008,7 +2073,7 @@ def __init__(self, path=None, defer_validate=False):
20082073
self._validate_on_load(path, defer_validate)
20092074

20102075

2011-
class AbsQuantSampleSheetv10(AbsQuantMixin, KLSampleSheetWithReplicates):
2076+
class AbsQuantSampleSheetv10(AbsQuantMixinV1, KLSampleSheetWithReplicates):
20122077
_HEADER = {
20132078
'IEMFileVersion': '4',
20142079
_SHEET_TYPE_KEY: ABSQUANT_SHEET_TYPE,
@@ -2024,7 +2089,7 @@ class AbsQuantSampleSheetv10(AbsQuantMixin, KLSampleSheetWithReplicates):
20242089
}
20252090

20262091

2027-
class AbsQuantSampleSheetv11(AbsQuantMixin, KLSampleSheetWithSampleContext):
2092+
class AbsQuantSampleSheetv11(AbsQuantMixinV1, KLSampleSheetWithSampleContext):
20282093
_HEADER = AbsQuantSampleSheetv10._HEADER.copy()
20292094
_HEADER[_SHEET_TYPE_KEY] = ABSQUANT_SHEET_TYPE
20302095
_HEADER[_SHEET_VERSION_KEY] = '11'
@@ -2243,6 +2308,7 @@ def _id_sample_sheet_class(sheet_type, sheet_version, assay_type):
22432308
_METAGENOMIC: {
22442309
'10': PacBioAbsquantSampleSheetv10,
22452310
'11': PacBioAbsquantSampleSheetv11,
2311+
'12': PacBioAbsquantSampleSheetv12,
22462312
},
22472313
}
22482314
}
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
[Header],,,,,,,,,,,,,,
2+
SheetType,pacbio_absquant,,,,,,,,,,,,,
3+
SheetVersion,12,,,,,,,,,,,,,
4+
Investigator Name,Knight,,,,,,,,,,,,,
5+
Experiment Name,RKL_experiment,,,,,,,,,,,,,
6+
Date,2025-08-29,,,,,,,,,,,,,
7+
Assay,Metagenomic,,,,,,,,,,,,,
8+
Description,,,,,,,,,,,,,,
9+
,,,,,,,,,,,,,,
10+
[Data],,,,,,,,,,,,,,
11+
Sample_ID,Sample_Name,Sample_Plate,Sample_Well,barcode_id,twist_adaptor_id,Sample_Project,Well_description,mass_syndna_input_ng,extracted_gdna_concentration_ng_ul,vol_extracted_elution_ul,syndna_pool_number,calc_mass_sample_aliquot_input_g,syndna_is_twisted,Lane
12+
sample_1,sample.1,sample_plate_1,A1,bc3011,16_UDI_1_A01_F--16_UDI_1_A01_R,MyProject_99999,sample_plate_1.sample.1.A1,0.2,1,1.1,1,0.02,False,1
13+
sample_2,sample.2,sample_plate_1,A2,bc0112,16_UDI_2_B01_F--16_UDI_2_B01_R,MyProject_99999,sample_plate_1.sample.2.A2,0.22,1,1.1,1,0.012,False,1
14+
sample_3,sample.3,sample_plate_1,A3,bc9992,16_UDI_5_E01_F--16_UDI_5_E01_R,MyProject_99999,sample_plate_1.sample.3.A3,0.25,1,1.1,1,0.105,False,1
15+
,,,,,,,,,,,,,,
16+
[Bioinformatics],,,,,,,,,,,,,,
17+
Sample_Project,QiitaID,HumanFiltering,library_construction_protocol,experiment_design_description,contains_replicates,,,,,,,,,
18+
MyProject_99999,99999,False,some protocol,some description,False,,,,,,,,,
19+
,,,,,,,,,,,,,,
20+
[Contact],,,,,,,,,,,,,,
21+
Sample_Project,Email,,,,,,,,,,,,,
22+
MyProject_99999,foo@bar.org,,,,,,,,,,,,,
23+
,,,,,,,,,,,,,,
24+
[SampleContext],,,,,,,,,,,,,,
25+
sample_name,sample_type,primary_qiita_study,secondary_qiita_studies,,,,,,,,,,,
26+
sample.3,control blank,99999,,,,,,,,,,,,
27+
,,,,,,,,,,,,,,

‎metapool/tests/test_sample_sheet.py‎

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@
3131
PacBioAbsquantSampleSheetv10,
3232
PacBioMetagSampleSheetv11,
3333
PacBioAbsquantSampleSheetv11,
34+
PacBioAbsquantSampleSheetv12,
3435
sample_sheet_to_dataframe,
3536
make_sample_sheet, load_sample_sheet,
3637
demux_sample_sheet, sheet_needs_demuxing,
@@ -3296,6 +3297,54 @@ def test_PacBioAbsquantSampleSheetv11_roundtrip(self):
32963297
self._help_test_roundtrip_sample_sheet(self.sheet_class)
32973298

32983299

3300+
class PacBioAbsquantSampleSheetv12CreationTests(
3301+
SampleSheetLoadMakeAndLoadTests):
3302+
sheet_class = PacBioAbsquantSampleSheetv12
3303+
sample_sheet_name = "good_pacbio_absquantv12.csv"
3304+
3305+
_INPUT_COLS = PacBioMetagSampleSheetv11CreationTests._INPUT_COLS.copy() + \
3306+
['mass_syndna_input_ng', 'extracted_gdna_concentration_ng_ul',
3307+
'vol_extracted_elution_ul', 'syndna_pool_number',
3308+
'calc_mass_sample_aliquot_input_g', 'syndna_is_twisted']
3309+
3310+
_INPUT_DATA = [
3311+
['sample_1', 'sample.1', '1', '1', 'False',
3312+
'A1', 'bc3011', '16_UDI_1_A01_F--16_UDI_1_A01_R',
3313+
'sample_plate_1', 'MyProject_99999',
3314+
'0.2', '1.0', '1.1', '1', '0.02', 'False'],
3315+
['sample_2', 'sample.2', '2', '1', 'False',
3316+
'A2', 'bc0112', '16_UDI_2_B01_F--16_UDI_2_B01_R',
3317+
'sample_plate_1', 'MyProject_99999',
3318+
'0.22', '1.0', '1.1', '1', '0.012', 'False'],
3319+
['sample_3', 'sample.3', '3', '1', 'False',
3320+
'A3', 'bc9992', '16_UDI_5_E01_F--16_UDI_5_E01_R',
3321+
'sample_plate_1', 'MyProject_99999',
3322+
'0.25', '1.0', '1.1', '1', '0.105', 'False'],
3323+
]
3324+
3325+
_OUTPUT_COLS = \
3326+
PacBioMetagSampleSheetv11CreationTests._OUTPUT_COLS.copy() + [
3327+
'mass_syndna_input_ng', 'extracted_gdna_concentration_ng_ul',
3328+
'vol_extracted_elution_ul', 'syndna_pool_number',
3329+
'calc_mass_sample_aliquot_input_g', 'syndna_is_twisted']
3330+
3331+
_BIOINFORMATICS = PacBioMetagSampleSheetv11CreationTests._BIOINFORMATICS
3332+
3333+
_SAMPLE_CONTEXT = MetagenomicSampleSheetv101CreationTests._SAMPLE_CONTEXT
3334+
3335+
def test_PacBioAbsquantSampleSheetv12_instantiate_from_path(self):
3336+
self._help_test_instantiate_sample_sheet_from_path(self.sheet_class)
3337+
3338+
def test_PacBioAbsquantSampleSheetv12_make_sample_sheet(self):
3339+
self._help_test_make_sample_sheet(self.sheet_class, sequencer="Revio")
3340+
3341+
def test_PacBioAbsquantSampleSheetv12_load_sample_sheet(self):
3342+
self._help_test_load_sample_sheet(self.sheet_class)
3343+
3344+
def test_PacBioAbsquantSampleSheetv12_roundtrip(self):
3345+
self._help_test_roundtrip_sample_sheet(self.sheet_class)
3346+
3347+
32993348
class AbsQuantSampleSheetv10CreationTests(SampleSheetLoadMakeAndLoadTests):
33003349
sheet_class = AbsQuantSampleSheetv10
33013350
sample_sheet_name = "good_abs_quant_metagv10.csv"

‎notebooks/pacbio_sample_sheet_builder.ipynb‎

Lines changed: 15 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,8 @@
2222
"from metapool.mp_strings import (\n",
2323
" PM_WELL_KEY, BARCODE_ID_KEY, PM_BLANK_KEY, SYNDNA_POOL_MASS_NG_KEY,\n",
2424
" ELUTION_VOL_KEY, EXTRACTED_GDNA_CONC_KEY, SYNDNA_POOL_NUM_KEY,\n",
25-
" TWIST_ADAPTOR_ID_KEY, SYNDNA_IS_TWISTED_KEY)\n",
25+
" TWIST_ADAPTOR_ID_KEY, SYNDNA_IS_TWISTED_KEY,\n",
26+
" CALC_MASS_SAMPLE_ALIQUOT_INPUT_G_KEY)\n",
2627
"from metapool.metapool import bcl_scrub_name\n",
2728
"\n",
2829
"%watermark -i -v -iv -m -h -p metapool,sample_sheet,openpyxl -u"
@@ -89,7 +90,8 @@
8990
"# run_title_key = \"Sequencing Run Name\"\n",
9091
"## ---------------------------------\n",
9192
"\n",
92-
"# experimental_design_desc = \"fecal samples for metagenomic sequencing\""
93+
"# experimental_design_desc = \"fecal samples for metagenomic sequencing\"\n",
94+
"# contact_email = \"g@example.com\""
9395
]
9496
},
9597
{
@@ -101,7 +103,8 @@
101103
"# DEFAULTS: DO NOT CHANGE THESE\n",
102104
"# unless you definitely know what you are doing\n",
103105
"lib_const_protocol = \"Knight Lab PacBio\"\n",
104-
"sheet_type = PACBIO_METAG_SHEET_TYPE"
106+
"sheet_type = PACBIO_METAG_SHEET_TYPE\n",
107+
"sheet_version = '11' # metag sheet version"
105108
]
106109
},
107110
{
@@ -113,16 +116,18 @@
113116
"# CONSTANTS: DO NOT CHANGE THESE EITHER\n",
114117
"# unless you definitely know what you are doing\n",
115118
"ISOLATE_STR = \"isolate\"\n",
116-
"SHEET_VERSION_NUM = \"11\" # for both metag and absquant\n",
119+
"ABSQUANT_SHEET_VERSION_NUM = \"12\"\n",
117120
"ASSUMED_SYNDNA_POOL_NUM = \"2000\"\n",
118121
"EXPECTED_ABSQUANT_COLS = [\n",
119122
" SYNDNA_POOL_MASS_NG_KEY, # mass_syndna_input_ng\n",
120123
" ELUTION_VOL_KEY, # vol_extracted_elution_ul\n",
121124
" EXTRACTED_GDNA_CONC_KEY, # extracted_gdna_concentration_ng_ul\n",
122-
" SYNDNA_IS_TWISTED_KEY # syndna_is_twisted\n",
125+
" SYNDNA_IS_TWISTED_KEY, # syndna_is_twisted\n",
126+
" CALC_MASS_SAMPLE_ALIQUOT_INPUT_G_KEY # calc_mass_sample_aliquot_input_g\n",
123127
"]\n",
124-
"# NB: calc_mass_sample_aliquot_input_g is needed to do the actual abs quant,\n",
125-
"# but not for the sample sheet generation"
128+
"\n",
129+
"# NB: there are other absquant input metrics (for surface area or volume)\n",
130+
"# that require OTHER input columns; these aren't yet supported here"
126131
]
127132
},
128133
{
@@ -389,6 +394,7 @@
389394
" lib_const_protocol += \" absquant\"\n",
390395
" experimental_design_desc += \" with absquant\"\n",
391396
" sheet_type = PACBIO_ABSQUANT_SHEET_TYPE\n",
397+
" sheet_version = ABSQUANT_SHEET_VERSION_NUM\n",
392398
" plate_df[SYNDNA_POOL_NUM_KEY] = ASSUMED_SYNDNA_POOL_NUM\n",
393399
"\n",
394400
" # set the SYNDNA_IS_TWISTED_KEY column to empty string for anything\n",
@@ -425,8 +431,8 @@
425431
"# fill the non-project-specific parts of the metadata dictionary\n",
426432
"metadata = {\n",
427433
" _ASSAY_KEY: _METAGENOMIC,\n",
428-
" _SHEET_VERSION_KEY: SHEET_VERSION_NUM,\n",
429434
" _SHEET_TYPE_KEY: sheet_type,\n",
435+
" _SHEET_VERSION_KEY: sheet_version,\n",
430436
" _EXPERIMENT_NAME_KEY: curr_run_title,\n",
431437
" _BIOINFORMATICS_KEY: [],\n",
432438
" _CONTACT_KEY: [],\n",
@@ -484,7 +490,7 @@
484490
" metadata[_CONTACT_KEY].append(\n",
485491
" {\n",
486492
" 'Sample_Project': unique_projects[0],\n",
487-
" 'Email': \"gail.ackermann50@gmail.com\"\n",
493+
" 'Email': contact_email\n",
488494
" }\n",
489495
" )\n",
490496
"# next qiita id\n",

0 commit comments

Comments
 (0)