示例#1
0
    def process_primer(self):
        source = UCSCSequenceSource()
        left_padding = 1000
        right_padding = 1000
        sequences = source.sequences_for_primers(
            self.form_result["primer_fwd"], self.form_result["primer_rev"], left_padding, right_padding
        )

        # TODO: better selective update method
        c.primer_fwd = self.form_result["primer_fwd"]
        c.primer_rev = self.form_result["primer_rev"]
        c.left_padding = left_padding
        c.right_padding = right_padding
        c.sequences = sequences

        for seq in c.sequences:
            seq.snps = self._get_snps(seq.chromosome, seq.start, seq.end)
            self.__add_sequence_primer_display_attrs(
                seq, primer_fwd=self.form_result["primer_fwd"], primer_rev=self.form_result["primer_rev"]
            )

        assayutil.set_amplicon_snps(c.sequences)

        c.assay_form = h.LiteralForm(
            value={"primer_fwd": self.form_result["primer_fwd"], "primer_rev": self.form_result["primer_rev"]}
        )

        return render("/assay/primer_output.html")
示例#2
0
    def process_location(self):
        source = UCSCSequenceSource()
        left_padding = 1000
        right_padding = 1000
        sequence = source.sequence_around_loc(
            self.form_result["chromosome"],
            self.form_result["location"],
            self.form_result["width"],
            left_padding,
            right_padding,
        )
        # TODO: better selective update method
        c.chromosome = self.form_result["chromosome"]
        c.location = self.form_result["location"]
        c.width = self.form_result["width"]
        c.left_padding = left_padding
        c.right_padding = right_padding
        c.sequence = sequence
        c.sequences = [sequence]

        for seq in c.sequences:
            seq.snps = self._get_snps(seq.chromosome, seq.start, seq.end)
            seq.positive_display_sequence = seq.amplicon.positive_strand_sequence.lower()
            seq.negative_display_sequence = seq.amplicon.negative_strand_sequence.lower()

        assayutil.set_amplicon_snps(c.sequences)

        c.assay_form = h.LiteralForm()
        return render("/assay/location_output.html")
示例#3
0
    def process_snp(self):
        snp_source = HG19Source()
        seq_source = UCSCSequenceSource()
        left_padding = 1000
        right_padding = 1000
        snps = snp_source.snps_by_rsid(self.form_result["snp_rsid"])

        c.assay_form = h.LiteralForm()

        c.snp_rsid = self.form_result["snp_rsid"]
        c.width = self.form_result["width"]

        # override
        if not snps or len(snps) == 0:
            # TODO: figure out how to make this appear on the field error instead
            session["flash"] = "Could not find a SNP with the name %s" % self.form_result["snp_rsid"]
            session["flash_class"] = "error"
            session.save()
            return render("/assay/snp_output.html")

        sequences = []
        for snp in snps:
            chromStart = snp["chromStart"]
            chromEnd = snp["chromEnd"]

            # handle insertions and single variations, normally the chromStart
            # refers to the gap just before the base #
            if snp["chromStart"] == snp["chromEnd"]:
                chromStart = chromEnd
            else:
                chromStart += 1

            sequence = seq_source.sequence_around_region(
                snp["chrom"][3:], chromStart, chromEnd, self.form_result["width"], left_padding, right_padding
            )
            # sequence.snps = self._get_snps(sequence.chromosome, sequence.start, sequence.end)
            sequences.append(sequence)

        c.left_padding = left_padding
        c.right_padding = right_padding
        c.sequences = sequences
        for seq in c.sequences:
            seq.snps = self._get_snps(seq.chromosome, seq.start, seq.end)
            seq.positive_display_sequence = seq.amplicon.positive_strand_sequence.lower()
            seq.negative_display_sequence = seq.amplicon.negative_strand_sequence.lower()[::-1]

        assayutil.set_amplicon_snps(c.sequences)

        return render("/assay/snp_output.html")
示例#4
0
    def create(self):
        assay = Assay()
        for k, v in self.form_result.items():
            if k not in ("seq_padding_pos5", "seq_padding_pos3", "sequences"):
                setattr(assay, k, v)

        # avoids double lookup if lookup has already been done
        if self.form_result["sequences"]:
            # add 1000-padding sequence and snps to each.
            seq_source = UCSCSequenceSource()
            snp_source = HG19Source()

            for seq in self.form_result["sequences"]:
                # TODO: just call sequences_for_assay here?  logic the same.
                if not seq["positive_sequence"] or seq["negative_sequence"]:
                    sequence = seq_source.sequence(
                        seq["chromosome"],
                        seq["start_pos"] - self.form_result["seq_padding_pos5"],
                        seq["end_pos"] + self.form_result["seq_padding_pos3"],
                    )

                    cache_rec = HG19AssayCache(
                        chromosome=sequence.chromosome,
                        start_pos=seq["start_pos"],
                        end_pos=seq["end_pos"],
                        seq_padding_pos5=self.form_result["seq_padding_pos5"],
                        seq_padding_pos3=self.form_result["seq_padding_pos3"],
                        positive_sequence=sequence.positive_strand_sequence,
                    )
                else:
                    cache_rec = HG19AssayCache(
                        chromosome=seq["chromosome"],
                        start_pos=seq["start_pos"],
                        end_pos=seq["end_pos"],
                        seq_padding_pos5=seq["padding_pos5"],
                        seq_padding_pos3=seq["padding_pos3"],
                        positive_sequence=seq["positive_sequence"] or None,
                        negative_sequence=seq["negative_sequence"] or None,
                    )

                for snp in seq["snps"]:
                    cache_rec.snps.append(
                        SNP131AssayCache(
                            bin=snp["bin"],
                            chrom=snp["chrom"],
                            chromStart=snp["chromStart"],
                            chromEnd=snp["chromEnd"],
                            name=snp["name"],
                            score=snp["score"],
                            strand=snp["strand"],
                            refNCBI=snp["refNCBI"],
                            refUCSC=snp["refUCSC"],
                            observed=snp["observed"],
                            molType=snp["molType"],
                            class_=snp["class_"],
                            valid=snp["valid"],
                            avHet=snp["avHet"],
                            avHetSE=snp["avHetSE"],
                            func=snp["func"],
                            locType=snp["locType"],
                            weight=snp["weight"],
                        )
                    )

                assay.cached_sequences.append(cache_rec)

        Session.add(assay)
        self.__update_tms(assay)

        Session.commit()
        redirect(url(controller="assay", action="view", id=assay.id))