Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
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
49 changes: 43 additions & 6 deletions qiita_pet/handlers/admin_processing_job.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
from qiita_db.study import Study

from json import dumps
from collections import Counter


class AdminProcessingJobBaseClass(BaseHandler):
Expand Down Expand Up @@ -105,28 +106,64 @@ def get(self):

@execute_as_transaction
def post(self):

# Get user-inputted qiita id and sample names
# Get user-inputted qiita id and sample names / tube_ids
qid = self.get_argument("qid")
snames = self.get_argument("snames").split()

# Get study give qiita id
study = Study(qid).sample_template

# Stripping leading qiita id from sample names
# Example: 1.SKB1.640202 -> SKB1.640202
qsnames = list(Study(qid).sample_template)
qsnames = list(study)
for i, qsname in enumerate(qsnames):
if qsname.startswith(qid):
qsnames[i] = qsname.replace(f'{qid}.', "", 1)

# Creates a way to access a tube_id by its corresponding sample name
# and vice versa, which is important to adding tube_id in parentheses
# after a sample name a few lines later
tube_ids_lookup = dict()
tube_ids_rev = dict()
tube_ids = set()
if "anonymized_name" in study.categories:
for qsname, tid in study.get_category("anonymized_name").items():
formatted_name = qsname
if qsname.startswith(qid):
formatted_name = qsname.replace(f'{qid}.', "", 1)

tube_ids.add(tid)
tube_ids_lookup[formatted_name] = tid
tube_ids_rev[tid] = formatted_name

# Adds tube ids after sample name in parentheses
if len(tube_ids) > 0:
for i, sname in enumerate(snames):
if sname in qsnames:
snames[i] = f'{sname} ({tube_ids_lookup[sname]})'
elif sname in tube_ids:
snames[i] = f'{tube_ids_rev[sname]} ({sname})'

# Finds duplicates in the samples
seen = Counter()
for sample in snames:
seen[sample] += 1
duplicates = [f'{s} \u00D7 {seen[s]}' for s in seen if seen[s] > 1]

# Remove blank samples from sample names
blank = [x for x in snames if x.lower().startswith('blank')]
blank = set([x for x in snames if x.lower().startswith('blank')])
snames = [x for x in snames if 'blank' not in x.lower()]

# Validate user's sample names against qiita study
qsnames = set(qsnames)
if len(tube_ids) == 0:
qsnames = set(qsnames)
else:
qsnames = set([f'{x} ({tube_ids_lookup[x]})' for x in qsnames])
snames = set(snames)
matching = qsnames.intersection(snames)
missing = qsnames.difference(snames)
extra = snames.difference(qsnames)

self.render("sample_validation.html", input=False, matching=matching,
missing=missing, extra=extra, blank=blank)
missing=missing, extra=extra, blank=blank,
duplicates=duplicates)
10 changes: 9 additions & 1 deletion qiita_pet/templates/sample_validation.html
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
<style>
.column {
float: left;
width: 25%;
width: 20%;
}

.row:after {
Expand Down Expand Up @@ -49,6 +49,14 @@ <h2>Blank</h2>
{% end %}
</ul>
</div>
<div class="column">
<h2>Duplicates</h2>
<ul>
{% for sample in duplicates %}
<li>{{ sample }}</li>
{% end %}
</ul>
</div>
<div class="column">
<h2>Extra</h2>
<ul>
Expand Down