Skip to content

Commit 6e92d3f

Browse files
Fix bug in SIF generation for replicated blanks (#136)
* centralize string operations and identification of blanks * fix function name typo * modify _replace_tube_ids_w_sample_names to use sample sheet's sample_name_is_blank * lint * remove "BLANK" dependency in update_blanks_in_qiita * expected to fail: added test for replicate blank bug. also modified generate_sample_info_files to take paths * get blanks from prep file paths not sample sheet * fix typo * correct misunderstanding about prep_file_paths data structure * correct misunderstanding about prep_file_paths data structure * fix typo, move test sample sheets to correct location * expected fail: temp test change to help debugging * add test for sif generation from sample sheet with samplecontext * test debugging * test debugging * test debugging * fix function name typo, per copilot catch * roll back blanks identification changes in code shared by amplicon and shotgun processing * Rename test projects
1 parent be759c1 commit 6e92d3f

18 files changed

+2207
-1755
lines changed

src/qp_klp/Assays.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -395,6 +395,7 @@ def generate_prep_file(self):
395395
if 'GenPrepFileJob' not in self.skip_steps:
396396
job.run(callback=self.job_callback)
397397

398+
self.dereplicated_input_file_paths = job.dereplicated_input_file_paths
398399
self.prep_file_paths = job.prep_file_paths
399400
self.has_replicates = job.has_replicates
400401

@@ -592,6 +593,7 @@ def generate_prep_file(self):
592593
if 'GenPrepFileJob' not in self.skip_steps:
593594
job.run(callback=self.job_callback)
594595

596+
self.dereplicated_input_file_paths = job.dereplicated_input_file_paths
595597
self.prep_file_paths = job.prep_file_paths
596598
self.has_replicates = job.has_replicates
597599

src/qp_klp/Workflows.py

Lines changed: 16 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ def __init__(self, **kwargs):
3737
self.output_path = None
3838
self.pipeline = None
3939
self.prep_copy_index = 0
40+
self.dereplicated_input_file_paths = None
4041
self.prep_file_paths = None
4142
self.qclient = None
4243
self.run_prefixes = {}
@@ -158,39 +159,13 @@ def generate_special_map(self):
158159
def generate_sifs(self):
159160
"""
160161
Generates sample-info files for each project, containing
161-
metadata on BLANKS.
162+
metadata on blanks.
162163
"""
163-
from_qiita = {}
164-
165-
for study_id in self.prep_file_paths:
166-
url = f'/api/v1/study/{study_id}/samples'
167-
logging.debug(url)
168-
samples = list(self.qclient.get(url))
169-
from_qiita[study_id] = samples
170-
171-
add_sif_info = []
172-
173-
qid_pn_map = {proj['qiita_id']: proj['project_name'] for
174-
proj in self.pipeline.get_project_info()}
175-
176-
# in case we really do need to query for samples again:
177-
# assume set of valid study_ids can be determined from prep_file_paths.
178-
for study_id in from_qiita:
179-
samples = from_qiita[study_id]
180-
# generate a list of (sample-name, project-name) pairs.
181-
project_name = qid_pn_map[study_id]
182-
samples = [(x, project_name) for x in samples]
183-
add_sif_info.append(pd.DataFrame(data=samples,
184-
columns=['sample_name',
185-
'project_name']))
186-
187-
# convert the list of dataframes into a single dataframe.
188-
add_sif_info = pd.concat(add_sif_info,
189-
ignore_index=True).drop_duplicates()
190-
191-
# generate SIF files with add_sif_info as additional metadata input.
192-
# duplicate sample-names and non-blanks will be handled properly.
193-
self.sifs = self.pipeline.generate_sample_info_files(add_sif_info)
164+
165+
# generate SIF files with paths to the input file(s) (multiples when
166+
# there are replicates)
167+
self.sifs = self.pipeline.generate_sample_info_files(
168+
self.dereplicated_input_file_paths)
194169

195170
return self.sifs
196171

@@ -202,30 +177,28 @@ def update_blanks_in_qiita(self):
202177

203178
for sif_path in self.sifs:
204179
# get study_id from sif_file_name ...something_14385_blanks.tsv
205-
study_id = sif_path.split('_')[-2]
180+
study_id = self.pipeline.get_qiita_id_from_sif_fp(sif_path)
206181

207182
df = pd.read_csv(sif_path, delimiter='\t', dtype=str)
208183

209184
# Prepend study_id to make them compatible w/list from Qiita.
210185
df['sample_name'] = f'{study_id}.' + df['sample_name'].astype(str)
211186

212-
# SIFs only contain BLANKs. Get the list of potentially new BLANKs.
213-
blank_ids = [i for i in df['sample_name'] if 'blank' in i.lower()]
214-
blanks = df[df['sample_name'].isin(blank_ids)]['sample_name']
187+
# SIFs only contain blanks. Get the list of potentially new blanks.
188+
blanks = df['sample_name'].tolist()
215189
if len(blanks) == 0:
216190
# we have nothing to do so let's return early
217191
return
218192

219-
# Get list of BLANKs already registered in Qiita.
193+
# Get list of samples already registered in Qiita
194+
# (will include any already-registered blanks)
220195
from_qiita = self.qclient.get(f'/api/v1/study/{study_id}/samples')
221-
from_qiita = [x for x in from_qiita if
222-
x.startswith(f'{study_id}.BLANK')]
223196

224-
# Generate list of BLANKs that need to be ADDED to Qiita.
197+
# Generate list of blanks that need to be ADDED to Qiita.
225198
new_blanks = (set(blanks) | set(from_qiita)) - set(from_qiita)
226199

227200
if len(new_blanks):
228-
# Generate dummy entries for each new BLANK, if any.
201+
# Generate dummy entries for each new blank, if any.
229202
url = f'/api/v1/study/{study_id}/samples/info'
230203
logging.debug(url)
231204
categories = self.qclient.get(url)['categories']
@@ -324,7 +297,7 @@ def _process_blanks(self):
324297
:return:
325298
"""
326299
results = [x for x in listdir(self.pipeline.output_path) if
327-
x.endswith('_blanks.tsv')]
300+
self.pipeline.is_sif_fp(x)]
328301

329302
results.sort()
330303

@@ -495,7 +468,7 @@ def _compare_samples_against_qiita(self):
495468
else:
496469
samples = set(self.pipeline.get_sample_names(p_name))
497470

498-
# do not include BLANKs. If they are unregistered, we will add
471+
# do not include blanks. If they are unregistered, we will add
499472
# them downstream.
500473
samples = {smpl for smpl in samples
501474
if not smpl.startswith('BLANK')}

src/sequence_processing_pipeline/GenPrepFileJob.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ def __init__(self, run_dir, convert_job_path, qc_job_path, output_path,
2727
self.seqpro_path = seqpro_path
2828
self.qiita_job_id = qiita_job_id
2929
self.is_amplicon = is_amplicon
30+
self.dereplicated_input_file_paths = None
3031
self.prep_file_paths = None
3132
self.commands = []
3233
self.has_replicates = False
@@ -120,6 +121,10 @@ def __init__(self, run_dir, convert_job_path, qc_job_path, output_path,
120121
# overwrite default setting
121122
file_paths = self._write_to_file(demux_sample_sheet(fp))
122123

124+
# if no replicate demuxing was needed, then this will be a list
125+
# containing only the original input file path.
126+
self.dereplicated_input_file_paths = file_paths
127+
123128
for fp in file_paths:
124129
# generate a seqpro command-line using the new sample-sheet.
125130
if self.has_replicates:

src/sequence_processing_pipeline/Pipeline.py

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -609,10 +609,12 @@ def _validate_mapping_file(self, mapping_file_path):
609609

610610
return df
611611

612-
def generate_sample_info_files(self, addl_info=None):
612+
def generate_sample_info_files(self, dereplicated_input_file_paths):
613613
"""
614614
Generate sample-information files in self.output_path.
615-
:param addl_info: A df of (sample-name, project-name) pairs.
615+
:param dereplicated_input_file_paths: a list of input files (either
616+
sample-sheets or pre-prep files) that have been dereplicated (split
617+
into separate files for each replicate).
616618
:return: A list of paths to sample-information-files.
617619
"""
618620
if self.pipeline_type == Pipeline.AMPLICON_PTYPE:
@@ -631,8 +633,15 @@ def generate_sample_info_files(self, addl_info=None):
631633
# next record from mapping file df
632634
df = pd.DataFrame(blanks_dicts_list)
633635
else:
634-
controls = self.sample_sheet.get_denormalized_controls_list()
635-
df = pd.DataFrame(controls)
636+
all_controls = []
637+
for curr_input_path in dereplicated_input_file_paths:
638+
curr_sample_sheet = load_sample_sheet(curr_input_path)
639+
curr_controls = \
640+
curr_sample_sheet.get_denormalized_controls_list()
641+
all_controls.extend(curr_controls)
642+
# next path
643+
df = pd.DataFrame(all_controls)
644+
df.drop_duplicates(inplace=True)
636645

637646
paths = []
638647

Lines changed: 103 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,103 @@
1+
[Header],,,,,,,,,,,,
2+
IEMFileVersion,4,,,,,,,,,,,
3+
SheetType,standard_metag,,,,,,,,,,,
4+
SheetVersion,101,,,,,,,,,,,
5+
Investigator Name,Knight,,,,,,,,,,,
6+
Experiment Name,RKL0042,,,,,,,,,,,
7+
Date,2/26/20,,,,,,,,,,,
8+
Workflow,GenerateFASTQ,,,,,,,,,,,
9+
Application,FASTQ Only,,,,,,,,,,,
10+
Assay,Metagenomic,,,,,,,,,,,
11+
Description,,,,,,,,,,,,
12+
Chemistry,Default,,,,,,,,,,,
13+
,,,,,,,,,,,,
14+
[Reads],,,,,,,,,,,,
15+
150,,,,,,,,,,,,
16+
150,,,,,,,,,,,,
17+
,,,,,,,,,,,,
18+
[Settings],,,,,,,,,,,,
19+
ReverseComplement,0,,,,,,,,,,,
20+
,,,,,,,,,,,,
21+
[Data],,,,,,,,,,,,
22+
orig_name,Sample_ID,Sample_Name,source_well_384,destination_well_384,Sample_Plate,well_id_384,I7_Index_ID,index,I5_Index_ID,index2,Sample_Project,Well_description
23+
BLANK.43.12G,BLANK_43_12G_A1,BLANK.43.12G.A1,A1,A1,ProjectF_11661_P43,A1,iTru7_114_08,CCGACTAT,iTru5_01_A,AAGGCTGA,ProjectF_11661,blue_quadrant
24+
BLANK.43.12H,BLANK_43_12H_A3,BLANK.43.12H.A3,A3,A3,ProjectF_11661_P43,A3,iTru7_114_09,ACCGACAA,iTru5_02_A,CGATCGAT,ProjectF_11661,blue_quadrant
25+
TMI.test.1,TMI_test_1_A5,TMI.test.1.A5,A5,A5,ProjectF_11661_P43,A5,iTru7_114_10,CCGACTAT,iTru5_03_A,TTACCGAG,TMI_10317,blue_quadrant
26+
Other.test.2,Other_test_2_A7,Other.test.2.A7,A7,A7,ProjectF_11661_P43,A7,iTru7_114_11,CTTCGCAA,iTru5_04_A,AAGACACC,Other_11223,blue_quadrant
27+
RMA.KHP.rpoS.Mage.Q97N,RMA_KHP_rpoS_Mage_Q97N_A9,RMA.KHP.rpoS.Mage.Q97N.A9,A9,A9,ProjectF_11661_P43,A9,iTru7_114_12,GCCTTGTT,iTru5_05_A,GTCCTAAG,ProjectF_11661,blue_quadrant
28+
RMA.KHP.rpoS.Mage.Q97E,RMA_KHP_rpoS_Mage_Q97E_A11,RMA.KHP.rpoS.Mage.Q97E.A11,A11,A11,ProjectF_11661_P43,A11,iTru7_201_01,AACACCAC,iTru5_06_A,CATCTGCT,ProjectF_11661,blue_quadrant
29+
JBI.KHP.HGL.021,JBI_KHP_HGL_021_A13,JBI.KHP.HGL.021.A13,A13,A13,ProjectF_11661_P43,A13,iTru7_201_02,AACTTGCC,iTru5_07_A,GAAGGTTC,ProjectF_11661,blue_quadrant
30+
JBI.KHP.HGL.022,JBI_KHP_HGL_022_A15,JBI.KHP.HGL.022.A15,A15,A15,ProjectF_11661_P43,A15,iTru7_201_03,CGTATCTC,iTru5_08_A,CTCTCAGA,ProjectF_11661,blue_quadrant
31+
JBI.KHP.HGL.023,JBI_KHP_HGL_023_A17,JBI.KHP.HGL.023.A17,A17,A17,ProjectF_11661_P43,A17,iTru7_201_04,CAATGTGG,iTru5_09_A,GAAGAGGT,ProjectF_11661,blue_quadrant
32+
JBI.KHP.HGL.024,JBI_KHP_HGL_024_A19,JBI.KHP.HGL.024.A19,A19,A19,ProjectF_11661_P43,A19,iTru7_201_05,GGTACGAA,iTru5_10_A,TCGTCTGA,ProjectF_11661,blue_quadrant
33+
AP581451B02,AP581451B02_A21,AP581451B02.A21,A21,A21,ProjectN_13059_P1,A21,iTru7_108_05,TCTGAGAG,iTru5_09_A,CTCTCAGA,ProjectN_13059,blue_quadrant
34+
EP256645B01,EP256645B01_A23,EP256645B01.A23,A23,A23,ProjectN_13059_P1,A23,iTru7_108_06,ACCGCATA,iTru5_10_A,TCGTCTGA,ProjectN_13059,blue_quadrant
35+
EP112567B02,EP112567B02_C1,EP112567B02.C1,C1,C1,ProjectN_13059_P1,C1,iTru7_108_07,GAAGTACC,iTru5_11_A,CAATAGCC,ProjectN_13059,blue_quadrant
36+
EP337425B01,EP337425B01_C3,EP337425B01.C3,C3,C3,ProjectN_13059_P1,C3,iTru7_108_08,CAGGTATC,iTru5_12_A,CATTCGTC,ProjectN_13059,blue_quadrant
37+
LP127890A01,LP127890A01_C5,LP127890A01.C5,C5,C5,ProjectN_13059_P1,C5,iTru7_108_09,TCTCTAGG,iTru5_01_B,AGTGGCAA,ProjectN_13059,blue_quadrant
38+
EP159692B04,EP159692B04_C7,EP159692B04.C7,C7,C7,ProjectN_13059_P1,C7,iTru7_108_10,AAGCACTG,iTru5_02_B,GTGGTATG,ProjectN_13059,blue_quadrant
39+
EP987683A01,EP987683A01_C9,EP987683A01.C9,C9,C9,ProjectN_13059_P1,C9,iTru7_108_11,CCAAGCAA,iTru5_03_B,TGAGCTGT,ProjectN_13059,blue_quadrant
40+
AP959450A03,AP959450A03_C11,AP959450A03.C11,C11,C11,ProjectN_13059_P1,C11,iTru7_108_12,TGTTCGAG,iTru5_04_B,CGTCAAGA,ProjectN_13059,blue_quadrant
41+
SP464350A04,SP464350A04_C13,SP464350A04.C13,C13,C13,ProjectN_13059_P1,C13,iTru7_109_01,CTCGTCTT,iTru5_05_B,AAGCATCG,ProjectN_13059,blue_quadrant
42+
EP121011B01,EP121011B01_C15,EP121011B01.C15,C15,C15,ProjectN_13059_P1,C15,iTru7_109_04,TCGGTTAC,iTru5_08_B,ACCTCTTC,ProjectN_13059,blue_quadrant
43+
BLANK.43.12G,BLANK_43_12G_A2,BLANK.43.12G.A2,A1,A2,ProjectF_11661_P43,A2,iTru7_114_08,TCTGAGAG,iTru5_01_A,AAGCACTG,ProjectF_11661,green_quadrant
44+
BLANK.43.12H,BLANK_43_12H_A4,BLANK.43.12H.A4,A3,A4,ProjectF_11661_P43,A4,iTru7_114_09,CAATAGCC,iTru5_02_A,CGTCAAGA,ProjectF_11661,green_quadrant
45+
TMI.test.1,TMI_test_1_A6,TMI.test.1.A6,A5,A6,ProjectF_11661_P43,A6,iTru7_114_10,ACCGCATA,iTru5_03_A,CCAAGCAA,TMI_10317,green_quadrant
46+
Other.test.2,Other_test_2_A8,Other.test.2.A8,A7,A8,ProjectF_11661_P43,A8,iTru7_114_11,CATTCGTC,iTru5_04_A,AAGCATCG,Other_11223,green_quadrant
47+
RMA.KHP.rpoS.Mage.Q97N,RMA_KHP_rpoS_Mage_Q97N_A10,RMA.KHP.rpoS.Mage.Q97N.A10,A9,A10,ProjectF_11661_P43,A10,iTru7_114_12,GAAGTACC,iTru5_05_A,TGTTCGAG,ProjectF_11661,green_quadrant
48+
RMA.KHP.rpoS.Mage.Q97E,RMA_KHP_rpoS_Mage_Q97E_A12,RMA.KHP.rpoS.Mage.Q97E.A12,A11,A12,ProjectF_11661_P43,A12,iTru7_201_01,AGTGGCAA,iTru5_06_A,TACTCCAG,ProjectF_11661,green_quadrant
49+
JBI.KHP.HGL.021,JBI_KHP_HGL_021_A14,JBI.KHP.HGL.021.A14,A13,A14,ProjectF_11661_P43,A14,iTru7_201_02,CAGGAATC,iTru5_07_A,CTCGTCTT,ProjectF_11661,green_quadrant
50+
JBI.KHP.HGL.022,JBI_KHP_HGL_022_A16,JBI.KHP.HGL.022.A16,A15,A16,ProjectF_11661_P43,A16,iTru7_201_03,GTGGAATG,iTru5_08_A,GATACCTG,ProjectF_11661,green_quadrant
51+
JBI.KHP.HGL.023,JBI_KHP_HGL_023_A18,JBI.KHP.HGL.023.A18,A17,A18,ProjectF_11661_P43,A18,iTru7_201_04,TCTCAAGG,iTru5_09_A,CGAACTGT,ProjectF_11661,green_quadrant
52+
JBI.KHP.HGL.024,JBI_KHP_HGL_024_A20,JBI.KHP.HGL.024.A20,A19,A20,ProjectF_11661_P43,A20,iTru7_201_05,TGAGATGT,iTru5_10_A,ACCTCTTC,ProjectF_11661,green_quadrant
53+
AP581451B02,AP581451B02_A22,AP581451B02.A22,A21,A22,ProjectN_13059_P1,A22,iTru7_108_05,TCTGAAAG,iTru5_09_A,ATCTCAGA,ProjectN_13059,green_quadrant
54+
EP256645B01,EP256645B01_A24,EP256645B01.A24,A23,A24,ProjectN_13059_P1,A24,iTru7_108_06,ACAGCATA,iTru5_10_A,TGGTCTGA,ProjectN_13059,green_quadrant
55+
EP112567B02,EP112567B02_C2,EP112567B02.C2,C1,C2,ProjectN_13059_P1,C2,iTru7_108_07,GAAATACC,iTru5_11_A,CATTAGCC,ProjectN_13059,green_quadrant
56+
EP337425B01,EP337425B01_C4,EP337425B01.C4,C3,C4,ProjectN_13059_P1,C4,iTru7_108_08,CAGATATC,iTru5_12_A,CAGTCGTC,ProjectN_13059,green_quadrant
57+
LP127890A01,LP127890A01_C6,LP127890A01.C6,C5,C6,ProjectN_13059_P1,C6,iTru7_108_09,TCTATAGG,iTru5_01_B,AGTCGCAA,ProjectN_13059,green_quadrant
58+
EP159692B04,EP159692B04_C8,EP159692B04.C8,C7,C8,ProjectN_13059_P1,C8,iTru7_108_10,AAGTTATG,iTru5_02_B,GTGGAATG,ProjectN_13059,green_quadrant
59+
EP987683A01,EP987683A01_C10,EP987683A01.C10,C9,C10,ProjectN_13059_P1,C10,iTru7_108_11,ACAAGCAA,iTru5_03_B,TGAGCTGT,ProjectN_13059,green_quadrant
60+
AP959450A03,AP959450A03_C12,AP959450A03.C12,C11,C12,ProjectN_13059_P1,C12,iTru7_108_12,AGTTCGAG,iTru5_04_B,CGTCCAGA,ProjectN_13059,green_quadrant
61+
SP464350A04,SP464350A04_C14,SP464350A04.C14,C13,C14,ProjectN_13059_P1,C14,iTru7_109_01,ATCGTCTT,iTru5_05_B,AAGAATCG,ProjectN_13059,green_quadrant
62+
EP121011B01,EP121011B01_C16,EP121011B01.C16,C15,C16,ProjectN_13059_P1,C16,iTru7_109_04,ACGGTTAC,iTru5_08_B,ACCACTTC,ProjectN_13059,green_quadrant
63+
BLANK.43.12G,BLANK_43_12G_B2,BLANK.43.12G.B2,A1,B2,ProjectF_11661_P43,B2,iTru7_114_08,AATTCGGT,iTru5_01_A,GTATTAGC,ProjectF_11661,yellow_quadrant
64+
BLANK.43.12H,BLANK_43_12H_B4,BLANK.43.12H.B4,A3,B4,ProjectF_11661_P43,B4,iTru7_114_09,TCGGACTT,iTru5_02_A,CACTGAAG,ProjectF_11661,yellow_quadrant
65+
TMI.test.1,TMI_test_1_B6,TMI.test.1.B6,A5,B6,ProjectF_11661_P43,B6,iTru7_114_10,TCGGTAAC,iTru5_03_A,AGTCGCTT,TMI_10317,yellow_quadrant
66+
Other.test.2,Other_test_2_B8,Other.test.2.B8,A7,B8,ProjectF_11661_P43,B8,iTru7_114_11,CATGTGTG,iTru5_04_A,CACAGGAA,Other_11223,yellow_quadrant
67+
RMA.KHP.rpoS.Mage.Q97N,RMA_KHP_rpoS_Mage_Q97N_B10,RMA.KHP.rpoS.Mage.Q97N.B10,A9,B10,ProjectF_11661_P43,B10,iTru7_114_12,AAGTCGAG,iTru5_05_A,TGGCACTA,ProjectF_11661,yellow_quadrant
68+
RMA.KHP.rpoS.Mage.Q97E,RMA_KHP_rpoS_Mage_Q97E_B12,RMA.KHP.rpoS.Mage.Q97E.B12,A11,B12,ProjectF_11661_P43,B12,iTru7_201_01,TGCCTCAA,iTru5_06_A,CCATGAAC,ProjectF_11661,yellow_quadrant
69+
JBI.KHP.HGL.021,JBI_KHP_HGL_021_B14,JBI.KHP.HGL.021.B14,A13,B14,ProjectF_11661_P43,B14,iTru7_201_02,TATCGGTC,iTru5_07_A,GGTTGTCA,ProjectF_11661,yellow_quadrant
70+
JBI.KHP.HGL.022,JBI_KHP_HGL_022_B16,JBI.KHP.HGL.022.B16,A15,B16,ProjectF_11661_P43,B16,iTru7_201_03,ATCTGACC,iTru5_08_A,GCCAATAC,ProjectF_11661,yellow_quadrant
71+
JBI.KHP.HGL.023,JBI_KHP_HGL_023_B18,JBI.KHP.HGL.023.B18,A17,B18,ProjectF_11661_P43,B18,iTru7_201_04,TATTCGCC,iTru5_09_A,AACCTCCT,ProjectF_11661,yellow_quadrant
72+
JBI.KHP.HGL.024,JBI_KHP_HGL_024_B20,JBI.KHP.HGL.024.B20,A19,B20,ProjectF_11661_P43,B20,iTru7_201_05,CACAGACT,iTru5_10_A,AGCTACCA,ProjectF_11661,yellow_quadrant
73+
AP581451B02,AP581451B02_B22,AP581451B02.B22,A21,B22,ProjectN_13059_P1,B22,iTru7_108_05,GCTGAGAG,iTru5_09_A,CTCTCAGA,ProjectN_13059,yellow_quadrant
74+
EP256645B01,EP256645B01_B24,EP256645B01.B24,A23,B24,ProjectN_13059_P1,B24,iTru7_108_06,GCCGCATA,iTru5_10_A,TCGTCTGA,ProjectN_13059,yellow_quadrant
75+
EP112567B02,EP112567B02_D2,EP112567B02.D2,C1,D2,ProjectN_13059_P1,D2,iTru7_108_07,GGAGTACC,iTru5_11_A,CAATAGCC,ProjectN_13059,yellow_quadrant
76+
EP337425B01,EP337425B01_D4,EP337425B01.D4,C3,D4,ProjectN_13059_P1,D4,iTru7_108_08,CGGGTATC,iTru5_12_A,CATTCGTC,ProjectN_13059,yellow_quadrant
77+
LP127890A01,LP127890A01_D6,LP127890A01.D6,C5,D6,ProjectN_13059_P1,D6,iTru7_108_09,TGTCTAGG,iTru5_01_B,AGTGGCAA,ProjectN_13059,yellow_quadrant
78+
EP159692B04,EP159692B04_D8,EP159692B04.D8,C7,D8,ProjectN_13059_P1,D8,iTru7_108_10,AGGCACTG,iTru5_02_B,GTGGTATG,ProjectN_13059,yellow_quadrant
79+
EP987683A01,EP987683A01_D10,EP987683A01.D10,C9,D10,ProjectN_13059_P1,D10,iTru7_108_11,GCAAGCAA,iTru5_03_B,TGAGCTGT,ProjectN_13059,yellow_quadrant
80+
AP959450A03,AP959450A03_D12,AP959450A03.D12,C11,D12,ProjectN_13059_P1,D12,iTru7_108_12,GGTTCGAG,iTru5_04_B,CGTCAAGA,ProjectN_13059,yellow_quadrant
81+
SP464350A04,SP464350A04_D14,SP464350A04.D14,C13,D14,ProjectN_13059_P1,D14,iTru7_109_01,GTCGTCTT,iTru5_05_B,AAGCATCG,ProjectN_13059,yellow_quadrant
82+
EP121011B01,EP121011B01_D16,EP121011B01.D16,C15,D16,ProjectN_13059_P1,D16,iTru7_109_04,GCGGTTAC,iTru5_08_B,ACCTCTTC,ProjectN_13059,yellow_quadrant
83+
,,,,,,,,,,,,
84+
[Bioinformatics],,,,,,,,,,,,
85+
Sample_Project,QiitaID,BarcodesAreRC,ForwardAdapter,ReverseAdapter,HumanFiltering,library_construction_protocol,experiment_design_description,contains_replicates,,,,
86+
ProjectF_11661,11661,FALSE,AACC,GGTT,FALSE,Nextera,Equipment,TRUE,,,,
87+
ProjectN_13059,13059,FALSE,AACC,GGTT,FALSE,Knight Lab Kapa HP,Equipment,TRUE,,,,
88+
TMI_10317,10317,FALSE,AACC,GGTT,FALSE,Knight Lab Kapa HP,Eqiiperiment,TRUE,,,,
89+
Other_11223,11223,FALSE,AACC,GGTT,FALSE,Knight Lab Kapa HP,Eqiiperiment,TRUE,,,,
90+
,,,,,,,,,,,,
91+
[Contact],,,,,,,,,,,,
92+
Email,Sample_Project,,,,,,,,,,,
93+
[email protected],ProjectF_11661,,,,,,,,,,,
94+
[email protected],ProjectN_13059,,,,,,,,,,,
95+
,,,,,,,,,,,,
96+
[SampleContext],,,,,,,,,,,,
97+
sample_name,sample_type,primary_qiita_study,secondary_qiita_studies,,,,,,,,,
98+
BLANK.43.12G.A1,control blank,11661,10317;11223,,,,,,,,,
99+
BLANK.43.12H.A3,control blank,11661,10317,,,,,,,,,
100+
BLANK.43.12G.A2,control blank,11661,10317;11223,,,,,,,,,
101+
BLANK.43.12H.A4,control blank,11661,10317,,,,,,,,,
102+
BLANK.43.12G.B2,control blank,11661,10317;11223,,,,,,,,,
103+
BLANK.43.12H.B4,control blank,11661,10317,,,,,,,,,

0 commit comments

Comments
 (0)