Skip to content

Fix bug in SIF generation for replicated blanks #136

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 20 commits into from
Jul 25, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
20 commits
Select commit Hold shift + click to select a range
ab094af
centralize string operations and identification of blanks
AmandaBirmingham Jul 10, 2025
5ba9944
fix function name typo
AmandaBirmingham Jul 10, 2025
719ab35
modify _replace_tube_ids_w_sample_names to use sample sheet's sample_…
AmandaBirmingham Jul 10, 2025
38d3326
lint
AmandaBirmingham Jul 10, 2025
467c8ed
remove "BLANK" dependency in update_blanks_in_qiita
AmandaBirmingham Jul 10, 2025
421ddf6
expected to fail: added test for replicate blank bug. also modified g…
AmandaBirmingham Jul 10, 2025
60e1038
get blanks from prep file paths not sample sheet
AmandaBirmingham Jul 10, 2025
b042249
fix typo
AmandaBirmingham Jul 10, 2025
d9de827
correct misunderstanding about prep_file_paths data structure
AmandaBirmingham Jul 10, 2025
9e08c7c
correct misunderstanding about prep_file_paths data structure
AmandaBirmingham Jul 10, 2025
ffe63f9
fix typo, move test sample sheets to correct location
AmandaBirmingham Jul 11, 2025
f7cc35b
expected fail: temp test change to help debugging
AmandaBirmingham Jul 11, 2025
f941664
add test for sif generation from sample sheet with samplecontext
AmandaBirmingham Jul 11, 2025
f5afd15
test debugging
AmandaBirmingham Jul 11, 2025
f9b5f7a
test debugging
AmandaBirmingham Jul 11, 2025
821a710
test debugging
AmandaBirmingham Jul 11, 2025
421c360
fix function name typo, per copilot catch
AmandaBirmingham Jul 11, 2025
8c568d3
roll back blanks identification changes in code shared by amplicon an…
AmandaBirmingham Jul 15, 2025
2d0baac
Merge branch 'main' into replicate_blanks
AmandaBirmingham Jul 25, 2025
7b5c765
Rename test projects
AmandaBirmingham Jul 25, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions src/qp_klp/Assays.py
Original file line number Diff line number Diff line change
Expand Up @@ -395,6 +395,7 @@ def generate_prep_file(self):
if 'GenPrepFileJob' not in self.skip_steps:
job.run(callback=self.job_callback)

self.dereplicated_input_file_paths = job.dereplicated_input_file_paths
self.prep_file_paths = job.prep_file_paths
self.has_replicates = job.has_replicates

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

self.dereplicated_input_file_paths = job.dereplicated_input_file_paths
self.prep_file_paths = job.prep_file_paths
self.has_replicates = job.has_replicates

Expand Down
59 changes: 16 additions & 43 deletions src/qp_klp/Workflows.py
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@ def __init__(self, **kwargs):
self.output_path = None
self.pipeline = None
self.prep_copy_index = 0
self.dereplicated_input_file_paths = None
self.prep_file_paths = None
self.qclient = None
self.run_prefixes = {}
Expand Down Expand Up @@ -158,39 +159,13 @@ def generate_special_map(self):
def generate_sifs(self):
"""
Generates sample-info files for each project, containing
metadata on BLANKS.
metadata on blanks.
"""
from_qiita = {}

for study_id in self.prep_file_paths:
url = f'/api/v1/study/{study_id}/samples'
logging.debug(url)
samples = list(self.qclient.get(url))
from_qiita[study_id] = samples

add_sif_info = []

qid_pn_map = {proj['qiita_id']: proj['project_name'] for
proj in self.pipeline.get_project_info()}

# in case we really do need to query for samples again:
# assume set of valid study_ids can be determined from prep_file_paths.
for study_id in from_qiita:
samples = from_qiita[study_id]
# generate a list of (sample-name, project-name) pairs.
project_name = qid_pn_map[study_id]
samples = [(x, project_name) for x in samples]
add_sif_info.append(pd.DataFrame(data=samples,
columns=['sample_name',
'project_name']))

# convert the list of dataframes into a single dataframe.
add_sif_info = pd.concat(add_sif_info,
ignore_index=True).drop_duplicates()

# generate SIF files with add_sif_info as additional metadata input.
# duplicate sample-names and non-blanks will be handled properly.
self.sifs = self.pipeline.generate_sample_info_files(add_sif_info)

# generate SIF files with paths to the input file(s) (multiples when
# there are replicates)
self.sifs = self.pipeline.generate_sample_info_files(
self.dereplicated_input_file_paths)

return self.sifs

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

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

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

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

# SIFs only contain BLANKs. Get the list of potentially new BLANKs.
blank_ids = [i for i in df['sample_name'] if 'blank' in i.lower()]
blanks = df[df['sample_name'].isin(blank_ids)]['sample_name']
# SIFs only contain blanks. Get the list of potentially new blanks.
blanks = df['sample_name'].tolist()
if len(blanks) == 0:
# we have nothing to do so let's return early
return

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

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

if len(new_blanks):
# Generate dummy entries for each new BLANK, if any.
# Generate dummy entries for each new blank, if any.
url = f'/api/v1/study/{study_id}/samples/info'
logging.debug(url)
categories = self.qclient.get(url)['categories']
Expand Down Expand Up @@ -324,7 +297,7 @@ def _process_blanks(self):
:return:
"""
results = [x for x in listdir(self.pipeline.output_path) if
x.endswith('_blanks.tsv')]
self.pipeline.is_sif_fp(x)]

results.sort()

Expand Down Expand Up @@ -495,7 +468,7 @@ def _compare_samples_against_qiita(self):
else:
samples = set(self.pipeline.get_sample_names(p_name))

# do not include BLANKs. If they are unregistered, we will add
# do not include blanks. If they are unregistered, we will add
# them downstream.
samples = {smpl for smpl in samples
if not smpl.startswith('BLANK')}
Expand Down
5 changes: 5 additions & 0 deletions src/sequence_processing_pipeline/GenPrepFileJob.py
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ def __init__(self, run_dir, convert_job_path, qc_job_path, output_path,
self.seqpro_path = seqpro_path
self.qiita_job_id = qiita_job_id
self.is_amplicon = is_amplicon
self.dereplicated_input_file_paths = None
self.prep_file_paths = None
self.commands = []
self.has_replicates = False
Expand Down Expand Up @@ -120,6 +121,10 @@ def __init__(self, run_dir, convert_job_path, qc_job_path, output_path,
# overwrite default setting
file_paths = self._write_to_file(demux_sample_sheet(fp))

# if no replicate demuxing was needed, then this will be a list
# containing only the original input file path.
self.dereplicated_input_file_paths = file_paths

for fp in file_paths:
# generate a seqpro command-line using the new sample-sheet.
if self.has_replicates:
Expand Down
17 changes: 13 additions & 4 deletions src/sequence_processing_pipeline/Pipeline.py
Original file line number Diff line number Diff line change
Expand Up @@ -609,10 +609,12 @@ def _validate_mapping_file(self, mapping_file_path):

return df

def generate_sample_info_files(self, addl_info=None):
def generate_sample_info_files(self, dereplicated_input_file_paths):
"""
Generate sample-information files in self.output_path.
:param addl_info: A df of (sample-name, project-name) pairs.
:param dereplicated_input_file_paths: a list of input files (either
sample-sheets or pre-prep files) that have been dereplicated (split
into separate files for each replicate).
:return: A list of paths to sample-information-files.
"""
if self.pipeline_type == Pipeline.AMPLICON_PTYPE:
Expand All @@ -631,8 +633,15 @@ def generate_sample_info_files(self, addl_info=None):
# next record from mapping file df
df = pd.DataFrame(blanks_dicts_list)
else:
controls = self.sample_sheet.get_denormalized_controls_list()
df = pd.DataFrame(controls)
all_controls = []
for curr_input_path in dereplicated_input_file_paths:
curr_sample_sheet = load_sample_sheet(curr_input_path)
curr_controls = \
curr_sample_sheet.get_denormalized_controls_list()
all_controls.extend(curr_controls)
# next path
df = pd.DataFrame(all_controls)
df.drop_duplicates(inplace=True)

paths = []

Expand Down
103 changes: 103 additions & 0 deletions tests/data/good_sheet_w_replicates_and_context.csv
Original file line number Diff line number Diff line change
@@ -0,0 +1,103 @@
[Header],,,,,,,,,,,,
IEMFileVersion,4,,,,,,,,,,,
SheetType,standard_metag,,,,,,,,,,,
SheetVersion,101,,,,,,,,,,,
Investigator Name,Knight,,,,,,,,,,,
Experiment Name,RKL0042,,,,,,,,,,,
Date,2/26/20,,,,,,,,,,,
Workflow,GenerateFASTQ,,,,,,,,,,,
Application,FASTQ Only,,,,,,,,,,,
Assay,Metagenomic,,,,,,,,,,,
Description,,,,,,,,,,,,
Chemistry,Default,,,,,,,,,,,
,,,,,,,,,,,,
[Reads],,,,,,,,,,,,
150,,,,,,,,,,,,
150,,,,,,,,,,,,
,,,,,,,,,,,,
[Settings],,,,,,,,,,,,
ReverseComplement,0,,,,,,,,,,,
,,,,,,,,,,,,
[Data],,,,,,,,,,,,
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
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
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
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
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
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
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
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
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
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
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
AP581451B02,AP581451B02_A21,AP581451B02.A21,A21,A21,ProjectN_13059_P1,A21,iTru7_108_05,TCTGAGAG,iTru5_09_A,CTCTCAGA,ProjectN_13059,blue_quadrant
EP256645B01,EP256645B01_A23,EP256645B01.A23,A23,A23,ProjectN_13059_P1,A23,iTru7_108_06,ACCGCATA,iTru5_10_A,TCGTCTGA,ProjectN_13059,blue_quadrant
EP112567B02,EP112567B02_C1,EP112567B02.C1,C1,C1,ProjectN_13059_P1,C1,iTru7_108_07,GAAGTACC,iTru5_11_A,CAATAGCC,ProjectN_13059,blue_quadrant
EP337425B01,EP337425B01_C3,EP337425B01.C3,C3,C3,ProjectN_13059_P1,C3,iTru7_108_08,CAGGTATC,iTru5_12_A,CATTCGTC,ProjectN_13059,blue_quadrant
LP127890A01,LP127890A01_C5,LP127890A01.C5,C5,C5,ProjectN_13059_P1,C5,iTru7_108_09,TCTCTAGG,iTru5_01_B,AGTGGCAA,ProjectN_13059,blue_quadrant
EP159692B04,EP159692B04_C7,EP159692B04.C7,C7,C7,ProjectN_13059_P1,C7,iTru7_108_10,AAGCACTG,iTru5_02_B,GTGGTATG,ProjectN_13059,blue_quadrant
EP987683A01,EP987683A01_C9,EP987683A01.C9,C9,C9,ProjectN_13059_P1,C9,iTru7_108_11,CCAAGCAA,iTru5_03_B,TGAGCTGT,ProjectN_13059,blue_quadrant
AP959450A03,AP959450A03_C11,AP959450A03.C11,C11,C11,ProjectN_13059_P1,C11,iTru7_108_12,TGTTCGAG,iTru5_04_B,CGTCAAGA,ProjectN_13059,blue_quadrant
SP464350A04,SP464350A04_C13,SP464350A04.C13,C13,C13,ProjectN_13059_P1,C13,iTru7_109_01,CTCGTCTT,iTru5_05_B,AAGCATCG,ProjectN_13059,blue_quadrant
EP121011B01,EP121011B01_C15,EP121011B01.C15,C15,C15,ProjectN_13059_P1,C15,iTru7_109_04,TCGGTTAC,iTru5_08_B,ACCTCTTC,ProjectN_13059,blue_quadrant
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
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
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
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
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
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
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
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
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
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
AP581451B02,AP581451B02_A22,AP581451B02.A22,A21,A22,ProjectN_13059_P1,A22,iTru7_108_05,TCTGAAAG,iTru5_09_A,ATCTCAGA,ProjectN_13059,green_quadrant
EP256645B01,EP256645B01_A24,EP256645B01.A24,A23,A24,ProjectN_13059_P1,A24,iTru7_108_06,ACAGCATA,iTru5_10_A,TGGTCTGA,ProjectN_13059,green_quadrant
EP112567B02,EP112567B02_C2,EP112567B02.C2,C1,C2,ProjectN_13059_P1,C2,iTru7_108_07,GAAATACC,iTru5_11_A,CATTAGCC,ProjectN_13059,green_quadrant
EP337425B01,EP337425B01_C4,EP337425B01.C4,C3,C4,ProjectN_13059_P1,C4,iTru7_108_08,CAGATATC,iTru5_12_A,CAGTCGTC,ProjectN_13059,green_quadrant
LP127890A01,LP127890A01_C6,LP127890A01.C6,C5,C6,ProjectN_13059_P1,C6,iTru7_108_09,TCTATAGG,iTru5_01_B,AGTCGCAA,ProjectN_13059,green_quadrant
EP159692B04,EP159692B04_C8,EP159692B04.C8,C7,C8,ProjectN_13059_P1,C8,iTru7_108_10,AAGTTATG,iTru5_02_B,GTGGAATG,ProjectN_13059,green_quadrant
EP987683A01,EP987683A01_C10,EP987683A01.C10,C9,C10,ProjectN_13059_P1,C10,iTru7_108_11,ACAAGCAA,iTru5_03_B,TGAGCTGT,ProjectN_13059,green_quadrant
AP959450A03,AP959450A03_C12,AP959450A03.C12,C11,C12,ProjectN_13059_P1,C12,iTru7_108_12,AGTTCGAG,iTru5_04_B,CGTCCAGA,ProjectN_13059,green_quadrant
SP464350A04,SP464350A04_C14,SP464350A04.C14,C13,C14,ProjectN_13059_P1,C14,iTru7_109_01,ATCGTCTT,iTru5_05_B,AAGAATCG,ProjectN_13059,green_quadrant
EP121011B01,EP121011B01_C16,EP121011B01.C16,C15,C16,ProjectN_13059_P1,C16,iTru7_109_04,ACGGTTAC,iTru5_08_B,ACCACTTC,ProjectN_13059,green_quadrant
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
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
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
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
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
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
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
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
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
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
AP581451B02,AP581451B02_B22,AP581451B02.B22,A21,B22,ProjectN_13059_P1,B22,iTru7_108_05,GCTGAGAG,iTru5_09_A,CTCTCAGA,ProjectN_13059,yellow_quadrant
EP256645B01,EP256645B01_B24,EP256645B01.B24,A23,B24,ProjectN_13059_P1,B24,iTru7_108_06,GCCGCATA,iTru5_10_A,TCGTCTGA,ProjectN_13059,yellow_quadrant
EP112567B02,EP112567B02_D2,EP112567B02.D2,C1,D2,ProjectN_13059_P1,D2,iTru7_108_07,GGAGTACC,iTru5_11_A,CAATAGCC,ProjectN_13059,yellow_quadrant
EP337425B01,EP337425B01_D4,EP337425B01.D4,C3,D4,ProjectN_13059_P1,D4,iTru7_108_08,CGGGTATC,iTru5_12_A,CATTCGTC,ProjectN_13059,yellow_quadrant
LP127890A01,LP127890A01_D6,LP127890A01.D6,C5,D6,ProjectN_13059_P1,D6,iTru7_108_09,TGTCTAGG,iTru5_01_B,AGTGGCAA,ProjectN_13059,yellow_quadrant
EP159692B04,EP159692B04_D8,EP159692B04.D8,C7,D8,ProjectN_13059_P1,D8,iTru7_108_10,AGGCACTG,iTru5_02_B,GTGGTATG,ProjectN_13059,yellow_quadrant
EP987683A01,EP987683A01_D10,EP987683A01.D10,C9,D10,ProjectN_13059_P1,D10,iTru7_108_11,GCAAGCAA,iTru5_03_B,TGAGCTGT,ProjectN_13059,yellow_quadrant
AP959450A03,AP959450A03_D12,AP959450A03.D12,C11,D12,ProjectN_13059_P1,D12,iTru7_108_12,GGTTCGAG,iTru5_04_B,CGTCAAGA,ProjectN_13059,yellow_quadrant
SP464350A04,SP464350A04_D14,SP464350A04.D14,C13,D14,ProjectN_13059_P1,D14,iTru7_109_01,GTCGTCTT,iTru5_05_B,AAGCATCG,ProjectN_13059,yellow_quadrant
EP121011B01,EP121011B01_D16,EP121011B01.D16,C15,D16,ProjectN_13059_P1,D16,iTru7_109_04,GCGGTTAC,iTru5_08_B,ACCTCTTC,ProjectN_13059,yellow_quadrant
,,,,,,,,,,,,
[Bioinformatics],,,,,,,,,,,,
Sample_Project,QiitaID,BarcodesAreRC,ForwardAdapter,ReverseAdapter,HumanFiltering,library_construction_protocol,experiment_design_description,contains_replicates,,,,
ProjectF_11661,11661,FALSE,AACC,GGTT,FALSE,Nextera,Equipment,TRUE,,,,
ProjectN_13059,13059,FALSE,AACC,GGTT,FALSE,Knight Lab Kapa HP,Equipment,TRUE,,,,
TMI_10317,10317,FALSE,AACC,GGTT,FALSE,Knight Lab Kapa HP,Eqiiperiment,TRUE,,,,
Other_11223,11223,FALSE,AACC,GGTT,FALSE,Knight Lab Kapa HP,Eqiiperiment,TRUE,,,,
,,,,,,,,,,,,
[Contact],,,,,,,,,,,,
Email,Sample_Project,,,,,,,,,,,
[email protected],ProjectF_11661,,,,,,,,,,,
[email protected],ProjectN_13059,,,,,,,,,,,
,,,,,,,,,,,,
[SampleContext],,,,,,,,,,,,
sample_name,sample_type,primary_qiita_study,secondary_qiita_studies,,,,,,,,,
BLANK.43.12G.A1,control blank,11661,10317;11223,,,,,,,,,
BLANK.43.12H.A3,control blank,11661,10317,,,,,,,,,
BLANK.43.12G.A2,control blank,11661,10317;11223,,,,,,,,,
BLANK.43.12H.A4,control blank,11661,10317,,,,,,,,,
BLANK.43.12G.B2,control blank,11661,10317;11223,,,,,,,,,
BLANK.43.12H.B4,control blank,11661,10317,,,,,,,,,
Loading
Loading