def _summary_demultiplexed(artifact_type, filepaths): """Generates the HTML summary for Demultiplexed artifacts Parameters ---------- artifact_type : str The artifact type filepaths : [(str, str)] A list of string pairs where the first element is the filepath and the second is the filepath type Returns ------- list A list of strings with the html summary """ # loop over each of the fps/fps_type pairs to find the demux_fp demux_fps = filepaths.get('preprocessed_demux', None) if demux_fps is None: return None # If demux_fps exists, it should contain only a single file demux_fp = demux_fps[0] # generating html summary artifact_information = [] sn, smax, smin, smean, sstd, smedian, shist, shist_edge = demux_stats( demux_fp) artifact_information.append("<h3>Features</h3>") artifact_information.append('<b>Total</b>: %d' % sn) artifact_information.append("<br/>") artifact_information.append('<b>Max</b>: %d' % smax) artifact_information.append("<br/>") artifact_information.append('<b>Mean</b>: %d' % smean) artifact_information.append("<br/>") artifact_information.append('<b>Standard deviation</b>: %d' % sstd) artifact_information.append("<br/>") artifact_information.append('<b>Median</b>: %d' % smedian) artifact_information.append("<br/>") # taken from http://stackoverflow.com/a/9141911 plt.bar(shist_edge[:-1], shist, width=1) plt.xlim(min(shist_edge), max(shist_edge)) plt.xlabel('Sequence Length') plt.ylabel('Number of sequences') plot = BytesIO() plt.savefig(plot, format='png') plot.seek(0) artifact_information.append( '<img src = "data:image/png;base64,{}"/>'.format( b64encode(plot.getvalue()).decode('utf-8'))) return artifact_information
def _summary_demultiplexed(artifact_type, filepaths): """Generates the HTML summary for Demultiplexed artifacts Parameters ---------- artifact_type : str The artifact type filepaths : [(str, str)] A list of string pairs where the first element is the filepath and the second is the filepath type Returns ------- list A list of strings with the html summary """ # loop over each of the fps/fps_type pairs to find the demux_fp demux_fps = filepaths.get('preprocessed_demux', None) if demux_fps is None: return None # If demux_fps exists, it should contain only a single file demux_fp = demux_fps[0] # generating html summary artifact_information = [] sn, smax, smin, smean, sstd, smedian, shist, shist_edge = demux_stats( demux_fp) artifact_information.append("<h3>Features</h3>") artifact_information.append('<b>Total</b>: %d' % sn) artifact_information.append("<br/>") artifact_information.append('<b>Max</b>: %d' % smax) artifact_information.append("<br/>") artifact_information.append('<b>Mean</b>: %d' % smean) artifact_information.append("<br/>") artifact_information.append('<b>Standard deviation</b>: %d' % sstd) artifact_information.append("<br/>") artifact_information.append('<b>Median</b>: %d' % smedian) artifact_information.append("<br/>") # taken from http://stackoverflow.com/a/9141911 plt.bar(shist_edge[:-1], shist, width=1) plt.xlim(min(shist_edge), max(shist_edge)) plt.xlabel('Sequence Length') plt.ylabel('Number of sequences') plot = StringIO() plt.savefig(plot, format='png') plot.seek(0) uri = 'data:image/png;base64,' + quote(b64encode(plot.buf)) artifact_information.append('<img src = "%s"/>' % uri) return artifact_information
def display_template(self, artifact_id, msg, msg_level): """Simple function to avoid duplication of code""" artifact_id = int(artifact_id) try: artifact = Artifact(artifact_id) except QiitaDBUnknownIDError: raise HTTPError(404, reason="Artifact %d does not exist!" % artifact_id) else: user = self.current_user if user.level != 'admin': raise HTTPError(403, reason="No permissions of admin, " "get/EBISubmitHandler: %s!" % user.id) prep_templates = artifact.prep_templates allow_submission = len(prep_templates) == 1 msg_list = ["Submission to EBI disabled:"] if not allow_submission: msg_list.append( "Only artifacts with a single prep template can be submitted") # If allow_submission is already false, we technically don't need to # do the following work. However, there is no clean way to fix this # using the current structure, so we perform the work as we # did so it doesn't fail. # We currently support only one prep template for submission, so # grabbing the first one prep_template = prep_templates[0] study = artifact.study sample_template = study.sample_template stats = { 'Number of samples': len(prep_template), 'Number of metadata headers': len(sample_template.categories()), 'Number of sequences': 'N/A', 'Total forward': 'N/A', 'Total reverse': 'N/A' } artifact_type = artifact.artifact_type if artifact_type not in VALID_SUBMISSION_TYPES: msg = "You can only submit: '%s' and this artifact is '%s'" % ( ', '.join(VALID_SUBMISSION_TYPES), artifact_type) msg_level = 'danger' elif artifact_type == 'Demultiplexed': demux = [x['fp'] for x in artifact.filepaths if x['fp_type'] == 'preprocessed_demux'] demux_length = len(demux) if demux_length > 1: msg = "Study appears to have multiple demultiplexed files!" msg_level = 'danger' else: demux_file = demux[0] demux_file_stats = demux_stats(demux_file) stats['Number of sequences'] = demux_file_stats.n msg_level = 'success' elif artifact_type == 'per_sample_FASTQ': raw_forward_seqs = [] raw_reverse_seqs = [] for x in artifact.filepaths: if x['fp_type'] == 'raw_forward_seqs': raw_forward_seqs.append(x['fp']) elif x['fp_type'] == 'raw_reverse_seqs': raw_reverse_seqs.append(x['fp']) stats['Total forward'] = len(raw_forward_seqs) stats['Total reverse'] = len(raw_reverse_seqs) msg_level = 'success' # Check if the templates have all the required columns for EBI pt_missing_cols = prep_template.check_restrictions( [PREP_TEMPLATE_COLUMNS['EBI']]) st_missing_cols = sample_template.check_restrictions( [SAMPLE_TEMPLATE_COLUMNS['EBI']]) allow_submission = (len(pt_missing_cols) == 0 and len(st_missing_cols) == 0 and allow_submission) if not allow_submission: if len(pt_missing_cols) > 0: msg_list.append("Columns missing in prep template: %s" % ', '.join(pt_missing_cols)) if len(st_missing_cols) > 0: msg_list.append("Columns missing in sample template: %s" % ', '.join(st_missing_cols)) ebi_disabled_msg = "<br/>".join(msg_list) else: ebi_disabled_msg = None self.render('ebi_submission.html', study_title=study.title, stats=stats.items(), message=msg, study_id=study.id, level=msg_level, preprocessed_data_id=artifact_id, investigation_type=prep_template.investigation_type, allow_submission=allow_submission, ebi_disabled_msg=ebi_disabled_msg)
def display_template(self, preprocessed_data_id, msg, msg_level): """Simple function to avoid duplication of code""" preprocessed_data_id = int(preprocessed_data_id) try: preprocessed_data = Artifact(preprocessed_data_id) except QiitaDBUnknownIDError: raise HTTPError( 404, "Artifact %d does not exist!" % preprocessed_data_id) else: user = self.current_user if user.level != 'admin': raise HTTPError( 403, "No permissions of admin, " "get/VAMPSSubmitHandler: %s!" % user.id) prep_templates = preprocessed_data.prep_templates allow_submission = len(prep_templates) == 1 msg_list = ["Submission to EBI disabled:"] if not allow_submission: msg_list.append( "Only artifacts with a single prep template can be submitted") # If allow_submission is already false, we technically don't need to # do the following work. However, there is no clean way to fix this # using the current structure, so we perform the work as we # did so it doesn't fail. # We currently support only one prep template for submission, so # grabbing the first one prep_template = prep_templates[0] study = preprocessed_data.study sample_template = study.sample_template stats = [('Number of samples', len(prep_template)), ('Number of metadata headers', len(sample_template.categories()))] demux = [ path for _, path, ftype in preprocessed_data.filepaths if ftype == 'preprocessed_demux' ] demux_length = len(demux) if not demux_length: msg = ("Study does not appear to have demultiplexed " "sequences associated") msg_level = 'danger' elif demux_length > 1: msg = ("Study appears to have multiple demultiplexed files!") msg_level = 'danger' elif demux_length == 1: demux_file = demux[0] demux_file_stats = demux_stats(demux_file) stats.append(('Number of sequences', demux_file_stats.n)) msg_level = 'success' # In EBI here we check that we have the required field for submission, # however for VAMPS we don't need that if not allow_submission: disabled_msg = "<br/>".join(msg_list) else: disabled_msg = None self.render('vamps_submission.html', study_title=study.title, stats=stats, message=msg, study_id=study.id, level=msg_level, preprocessed_data_id=preprocessed_data_id, investigation_type=prep_template.investigation_type, allow_submission=allow_submission, disabled_msg=disabled_msg)
def display_template(self, artifact_id, msg, msg_level): """Simple function to avoid duplication of code""" artifact_id = int(artifact_id) try: artifact = Artifact(artifact_id) except QiitaDBUnknownIDError: raise HTTPError(404, reason="Artifact %d does not exist!" % artifact_id) else: user = self.current_user if user.level != 'admin': raise HTTPError(403, reason="No permissions of admin, " "get/EBISubmitHandler: %s!" % user.id) prep_templates = artifact.prep_templates allow_submission = len(prep_templates) == 1 msg_list = ["Submission to EBI disabled:"] if not allow_submission: msg_list.append( "Only artifacts with a single prep template can be submitted") # If allow_submission is already false, we technically don't need to # do the following work. However, there is no clean way to fix this # using the current structure, so we perform the work as we # did so it doesn't fail. # We currently support only one prep template for submission, so # grabbing the first one prep_template = prep_templates[0] study = artifact.study sample_template = study.sample_template stats = { 'Number of samples': len(prep_template), 'Number of metadata headers': len(sample_template.categories()), 'Number of sequences': 'N/A', 'Total forward': 'N/A', 'Total reverse': 'N/A' } artifact_type = artifact.artifact_type if artifact_type not in VALID_SUBMISSION_TYPES: msg = "You can only submit: '%s' and this artifact is '%s'" % ( ', '.join(VALID_SUBMISSION_TYPES), artifact_type) msg_level = 'danger' elif artifact_type == 'Demultiplexed': demux = [path for _, path, ftype in artifact.filepaths if ftype == 'preprocessed_demux'] demux_length = len(demux) if demux_length > 1: msg = "Study appears to have multiple demultiplexed files!" msg_level = 'danger' else: demux_file = demux[0] demux_file_stats = demux_stats(demux_file) stats['Number of sequences'] = demux_file_stats.n msg_level = 'success' elif artifact_type == 'per_sample_FASTQ': raw_forward_seqs = [] raw_reverse_seqs = [] for _, path, ftype in artifact.filepaths: if ftype == 'raw_forward_seqs': raw_forward_seqs.append(path) elif ftype == 'raw_reverse_seqs': raw_reverse_seqs.append(path) stats['Total forward'] = len(raw_forward_seqs) stats['Total reverse'] = len(raw_reverse_seqs) msg_level = 'success' # Check if the templates have all the required columns for EBI pt_missing_cols = prep_template.check_restrictions( [PREP_TEMPLATE_COLUMNS['EBI']]) st_missing_cols = sample_template.check_restrictions( [SAMPLE_TEMPLATE_COLUMNS['EBI']]) allow_submission = (len(pt_missing_cols) == 0 and len(st_missing_cols) == 0 and allow_submission) if not allow_submission: if len(pt_missing_cols) > 0: msg_list.append("Columns missing in prep template: %s" % ', '.join(pt_missing_cols)) if len(st_missing_cols) > 0: msg_list.append("Columns missing in sample template: %s" % ', '.join(st_missing_cols)) ebi_disabled_msg = "<br/>".join(msg_list) else: ebi_disabled_msg = None self.render('ebi_submission.html', study_title=study.title, stats=stats.items(), message=msg, study_id=study.id, level=msg_level, preprocessed_data_id=artifact_id, investigation_type=prep_template.investigation_type, allow_submission=allow_submission, ebi_disabled_msg=ebi_disabled_msg)
def display_template(self, preprocessed_data_id, msg, msg_level): """Simple function to avoid duplication of code""" preprocessed_data_id = int(preprocessed_data_id) try: preprocessed_data = Artifact(preprocessed_data_id) except QiitaDBUnknownIDError: raise HTTPError(404, reason="Artifact %d does not exist!" % preprocessed_data_id) else: user = self.current_user if user.level != 'admin': raise HTTPError(403, reason="No permissions of admin, " "get/EBISubmitHandler: %s!" % user.id) prep_templates = preprocessed_data.prep_templates allow_submission = len(prep_templates) == 1 msg_list = ["Submission to EBI disabled:"] if not allow_submission: msg_list.append( "Only artifacts with a single prep template can be submitted") # If allow_submission is already false, we technically don't need to # do the following work. However, there is no clean way to fix this # using the current structure, so we perform the work as we # did so it doesn't fail. # We currently support only one prep template for submission, so # grabbing the first one prep_template = prep_templates[0] study = preprocessed_data.study sample_template = study.sample_template stats = [('Number of samples', len(prep_template)), ('Number of metadata headers', len(sample_template.categories()))] demux = [path for _, path, ftype in preprocessed_data.filepaths if ftype == 'preprocessed_demux'] demux_length = len(demux) if not demux_length: msg = ("Study does not appear to have demultiplexed " "sequences associated") msg_level = 'danger' elif demux_length > 1: msg = ("Study appears to have multiple demultiplexed files!") msg_level = 'danger' elif demux_length == 1: demux_file = demux[0] demux_file_stats = demux_stats(demux_file) stats.append(('Number of sequences', demux_file_stats.n)) msg_level = 'success' # Check if the templates have all the required columns for EBI pt_missing_cols = prep_template.check_restrictions( [PREP_TEMPLATE_COLUMNS['EBI']]) st_missing_cols = sample_template.check_restrictions( [SAMPLE_TEMPLATE_COLUMNS['EBI']]) allow_submission = (len(pt_missing_cols) == 0 and len(st_missing_cols) == 0 and allow_submission) if not allow_submission: if len(pt_missing_cols) > 0: msg_list.append("Columns missing in prep template: %s" % ', '.join(pt_missing_cols)) if len(st_missing_cols) > 0: msg_list.append("Columns missing in sample template: %s" % ', '.join(st_missing_cols)) ebi_disabled_msg = "<br/>".join(msg_list) else: ebi_disabled_msg = None self.render('ebi_submission.html', study_title=study.title, stats=stats, message=msg, study_id=study.id, level=msg_level, preprocessed_data_id=preprocessed_data_id, investigation_type=prep_template.investigation_type, allow_submission=allow_submission, ebi_disabled_msg=ebi_disabled_msg)
len(sample_template.categories()))] demux = [path for _, path, ftype in preprocessed_data.get_filepaths() if ftype == 'preprocessed_demux'] demux_length = len(demux) if not demux_length: msg = ("Study does not appear to have demultiplexed " "sequences associated") msg_level = 'danger' elif demux_length > 1: msg = ("Study appears to have multiple demultiplexed files!") msg_level = 'danger' elif demux_length == 1: demux_file = demux[0] demux_file_stats = demux_stats(demux_file) stats.append(('Number of sequences', demux_file_stats.n)) msg_level = 'success' self.render('vamps_submission.html', study_title=study.title, stats=stats, message=msg, study_id=study.id, level=msg_level, preprocessed_data_id=preprocessed_data_id) @authenticated def get(self, preprocessed_data_id): self.display_template(preprocessed_data_id, "", "") @authenticated @execute_as_transaction def post(self, preprocessed_data_id):
def display_template(self, preprocessed_data_id, msg, msg_level): """Simple function to avoid duplication of code""" preprocessed_data_id = int(preprocessed_data_id) try: preprocessed_data = Artifact(preprocessed_data_id) except QiitaDBUnknownIDError: raise HTTPError(404, reason="Artifact %d does not exist!" % preprocessed_data_id) else: user = self.current_user if user.level != 'admin': raise HTTPError(403, reason="No permissions of admin, " "get/VAMPSSubmitHandler: %s!" % user.id) prep_templates = preprocessed_data.prep_templates allow_submission = len(prep_templates) == 1 msg_list = ["Submission to EBI disabled:"] if not allow_submission: msg_list.append( "Only artifacts with a single prep template can be submitted") # If allow_submission is already false, we technically don't need to # do the following work. However, there is no clean way to fix this # using the current structure, so we perform the work as we # did so it doesn't fail. # We currently support only one prep template for submission, so # grabbing the first one prep_template = prep_templates[0] study = preprocessed_data.study sample_template = study.sample_template stats = [('Number of samples', len(prep_template)), ('Number of metadata headers', len(sample_template.categories()))] demux = [x['fp'] for x in preprocessed_data.filepaths if x['fp_type'] == 'preprocessed_demux'] demux_length = len(demux) if not demux_length: msg = ("Study does not appear to have demultiplexed " "sequences associated") msg_level = 'danger' elif demux_length > 1: msg = ("Study appears to have multiple demultiplexed files!") msg_level = 'danger' elif demux_length == 1: demux_file = demux[0] demux_file_stats = demux_stats(demux_file) stats.append(('Number of sequences', demux_file_stats.n)) msg_level = 'success' # In EBI here we check that we have the required field for submission, # however for VAMPS we don't need that if not allow_submission: disabled_msg = "<br/>".join(msg_list) else: disabled_msg = None self.render('vamps_submission.html', study_title=study.title, stats=stats, message=msg, study_id=study.id, level=msg_level, preprocessed_data_id=preprocessed_data_id, investigation_type=prep_template.investigation_type, allow_submission=allow_submission, disabled_msg=disabled_msg)
def display_template(self, preprocessed_data_id, msg, msg_level): """Simple function to avoid duplication of code""" preprocessed_data_id = int(preprocessed_data_id) try: preprocessed_data = Artifact(preprocessed_data_id) except QiitaDBUnknownIDError: raise HTTPError(404, reason="Artifact %d does not exist!" % preprocessed_data_id) else: user = self.current_user if user.level != 'admin': raise HTTPError(403, reason="No permissions of admin, " "get/EBISubmitHandler: %s!" % user.id) prep_templates = preprocessed_data.prep_templates allow_submission = len(prep_templates) == 1 msg_list = ["Submission to EBI disabled:"] if not allow_submission: msg_list.append( "Only artifacts with a single prep template can be submitted") # If allow_submission is already false, we technically don't need to # do the following work. However, there is no clean way to fix this # using the current structure, so we perform the work as we # did not fail. # We currently support only one prep template for submission, so # grabbing the first one prep_template = prep_templates[0] study = preprocessed_data.study sample_template = study.sample_template stats = [('Number of samples', len(prep_template)), ('Number of metadata headers', len(sample_template.categories()))] demux = [path for _, path, ftype in preprocessed_data.filepaths if ftype == 'preprocessed_demux'] demux_length = len(demux) if not demux_length: msg = ("Study does not appear to have demultiplexed " "sequences associated") msg_level = 'danger' elif demux_length > 1: msg = ("Study appears to have multiple demultiplexed files!") msg_level = 'danger' elif demux_length == 1: demux_file = demux[0] demux_file_stats = demux_stats(demux_file) stats.append(('Number of sequences', demux_file_stats.n)) msg_level = 'success' # Check if the templates have all the required columns for EBI pt_missing_cols = prep_template.check_restrictions( [PREP_TEMPLATE_COLUMNS['EBI']]) st_missing_cols = sample_template.check_restrictions( [SAMPLE_TEMPLATE_COLUMNS['EBI']]) allow_submission = (len(pt_missing_cols) == 0 and len(st_missing_cols) == 0 and allow_submission) if not allow_submission: if len(pt_missing_cols) > 0: msg_list.append("Columns missing in prep template: %s" % ', '.join(pt_missing_cols)) if len(st_missing_cols) > 0: msg_list.append("Columns missing in sample template: %s" % ', '.join(st_missing_cols)) ebi_disabled_msg = "<br/>".join(msg_list) else: ebi_disabled_msg = None self.render('ebi_submission.html', study_title=study.title, stats=stats, message=msg, study_id=study.id, level=msg_level, preprocessed_data_id=preprocessed_data_id, investigation_type=prep_template.investigation_type, allow_submission=allow_submission, ebi_disabled_msg=ebi_disabled_msg)