Example #1
0
    def beta_qlt(self, id=None):
        c.beta = True

        setup, struct = self.__load_setup(id)
        if not setup:
            abort(404)
        
        quadrant = request.params.get('quadrant', None)
        if not quadrant or quadrant not in ('A','B','C','D','E','F','G','H'):
            abort(404)
        
        plate_layout = struct.get('plate_layout', None)
        if not plate_layout:
            abort(404)
        
        # TODO this line of code sucks (this whole thing sucks)
        if plate_layout[2] in ('s', 'sh', 'sw'):
            qlt_file = "%s/%s" % (config['qlb.setup_template_store'], plate_layout[0])
        else:
            qlt_file = "%s/%s" % (config['qlb.setup_template_store'], (plate_layout[0] % quadrant))
        
        # figure out which plate layout to load
        response.headers['Content-Type'] = 'application/quantalife-template'
        h.set_download_response_header(request, response, "%s.qlt" % ("%s_%s" % (setup.prefix, quadrant)))
        response.headers['Pragma'] = 'no-cache'
        response.headers['Cache-Control'] = 'no-cache'
        return forward(FileApp(qlt_file, response.headerlist))
Example #2
0
    def size_csv(self, id=None):
        c.batch_test = self.__batch_test(id)
        c.batch = self.__batch(id)
        if not c.batch or not c.batch_test:
            abort(404)

        c.chips = defaultdict(lambda: defaultdict(lambda: None))
        for chan in c.batch_test.size_channels:
            c.chips[chan.chip_num - 1][chan.channel_num - 1] = chan

        # print in row order
        out = StringIO.StringIO()
        out.write("Chip,Channel1,Channel2,Channel3,Channel4,Channel5,Channel6,Channel7,Channel8\n")
        for i in range(5):
            out.write("%s," % (i + 1))
            out.write(",".join([str(c.chips[i][j].size_mean) if c.chips[i][j] else "" for j in range(8)]))
            out.write("\n,")
            out.write(",".join([str(c.chips[i][j].size_stdev) if c.chips[i][j] else "" for j in range(8)]))
            out.write("\n,")
            out.write(",".join([str(c.chips[i][j].droplet_count) if c.chips[i][j] else "" for j in range(8)]))
            out.write("\n")

        csv = out.getvalue()

        response.headers["Content-Type"] = "text/csv"
        h.set_download_response_header(request, response, "%s.csv" % c.batch.lot_num)
        return csv
Example #3
0
    def cluster_csv(self, id=None, show_only_gated=True, *args, **kwargs):
        from pyqlb.nstats.well import accepted_peaks
        qlwell = self.__qlwell_from_threshold_form(id)

        if show_only_gated != 'False':
            peaks = accepted_peaks(qlwell)
        else:
            peaks = qlwell.peaks

        from pyqlb.nstats.peaks import fam_amplitudes, fam_widths, vic_amplitudes, vic_widths, peak_times
        from pyqlb.nstats.well import well_observed_cluster_assignments

        response.headers['Content-Type'] = 'text/csv'
        h.set_download_response_header(request, response, "%s_%s%s.csv" % \
            (str(c.well.plate.plate.name), str(c.well.well_name), '' if show_only_gated != 'False' else '_all'))
        out = StringIO.StringIO()
        csvwriter = csv_pkg.writer(out)
        csvwriter.writerow(['Plate',c.well.plate.plate.name])
        csvwriter.writerow(['Well',c.well.well_name])
        csvwriter.writerow([])
        csvwriter.writerow(['Time','FAMAmplitude','FAMWidth','VICAmplitude','VICWidth','Cluster'])
        csvwriter.writerow([])

        pts = peak_times(peaks)
        fas = fam_amplitudes(peaks)
        fws = fam_widths(peaks)
        vas = vic_amplitudes(peaks)
        vws = vic_widths(peaks)
        cls = well_observed_cluster_assignments(qlwell, peaks)

        for row in zip(pts, fas, fws, vas, vws, cls):
            csvwriter.writerow(row)
        csv = out.getvalue()
        out.close()
        return csv
Example #4
0
    def batch_plate_template_download(self, id=None):
        plate = self.__load_batch_plate(id)
        box2 = Session.query(Box2).get(self.form_result['box2_id'])
        if not plate or not box2:
            abort(404)
            
        code = plate.batch.plate_type.code

        if self.form_result['qc_plate']:
            plate.qc_plate = self.form_result['qc_plate']
            Session.commit()

        # TODO FIXFIX or incorporate into model
        if plate.qc_plate:
            serial = 'QC'
        else:
            serial = box2.name.split(' ')[-1]
        # only mfgco supported right now
        if code == 'mfgco':
            qlt_file = "%s/carryover.qlt" % config['qlb.setup_template_store']
        elif code == 'fvtitr':
            qlt_file = "%s/fvbatch_QC.qlt" % config['qlb.setup_template_store']
        else:
            abort(404)
        
        response.headers['Content-Type'] = 'application/quantalife-template'
        h.set_download_response_header(request, response, "%s_%s.qlt" % (serial, plate.name))
        response.headers['Pragma'] = 'no-cache'
        response.headers['Cache-Control'] = 'no-cache'
        return forward(FileApp(qlt_file, response.headerlist))
Example #5
0
 def robocopy_generate(self):
     self.__setup_robocopy_context()
     box2 = Session.query(Box2).get(self.form_result['box2_id'])
     c.src_dir = box2.src_dir
     c.params = ' ' # reserve later to do QLP-only
     response.content_type = 'text/cmd'
     h.set_download_response_header(request, response, 'Robocopy %s.cmd' % box2.name)
     return render('/box2/robocopy.mako')
Example #6
0
    def save(self):
        if self.form_result['plate_setup_id']:
            ps = Session.query(PlateSetup).get(self.form_result['plate_setup_id'])
            prefix = ps.prefix
        elif self.form_result['plate_template_id']:
            pt = Session.query(PlateTemplate).get(self.form_result['plate_template_id'])
            prefix = pt.prefix
        else:
            prefix = 'output'
        
        response.headers['Content-Type'] = 'application/quantalife-template'
        h.set_download_response_header(request, response, "%s.qlt" % prefix)
        response.headers['Pragma'] = 'no-cache'

        # build a plate
        # TODO: add default fields
        plate = ExperimentMetadataQLPlate(channel_names=['FAM','VIC'],
                        host_datetime=datetime.now(),
                        host_machine='QTools',
                        host_user='******',
                        plate_template_id=self.form_result['plate_template_id'],
                        plate_setup_id=self.form_result['plate_setup_id'])
        
        for cell in sorted(self.form_result['cells'], key=lambda c: c['cell_name']):
            well = ExperimentMetadataQLWell(name=cell['cell_name'],
                                            num_channels=2,
                                            sample=cell['sample'],
                                            experiment_comment=cell['experiment_comment'],
                                            experiment_name=cell['experiment_name'],
                                            experiment_type=cell['experiment_type'],
                                            temperature=cell['temperature'],
                                            enzyme=cell['enzyme'],
                                            enzyme_conc=cell['enzyme_conc'],
                                            additive=cell['additive'],
                                            additive_conc=cell['additive_conc'],
                                            expected_cpd=cell['expected_cpd'],
                                            expected_cpul=cell['expected_cpul'],
                                            target_copy_num=cell['target_copy_num'],
                                            ref_copy_num=cell['ref_copy_num'],
                                            dg_cartridge=cell['cartridge'],
                                            supermix=cell['supermix'])
            
            well.channels[0].target = cell['fam_target']
            well.channels[0].type = cell['fam_type']
            well.channels[1].target = cell['vic_target']
            well.channels[1].type = cell['vic_type']

            plate.wells[str(cell['cell_name'])] = well
        
        # generate QLT
        # TODO: rowcol order

        writer = QLTWriter(rowcol_order=self.form_result['rowcol_order'],
                           fgcolorfunc=self.__qlt_fgcolorfunc,
                           bgcolorfunc=self.__qlt_bgcolorfunc)
        qlt = writer.getbytes(plate)
        return qlt
Example #7
0
    def download_file(self, id=None):
        self.__setup_box2_code_context(id)
        thefile = self.__file_id_query(c.box2.id, self.form_result['file_id'])
        if not thefile:
            abort(404)

        h.set_download_response_header(request, response, thefile.name)
        response.content_type = thefile.mime_type
        file_path = self.__upload_file_path(c.box2, thefile.path)
        response.headers['Pragma'] = 'no-cache'
        response.headers['Cache-Control'] = 'no-cache'
        return forward(FileApp(file_path, response.headerlist))
Example #8
0
    def validation_download(self):
        plate_template = Session.query(PlateTemplate).get(self.form_result['plate_template_id'])
        plate_type = Session.query(PlateType).filter_by(code=self.form_result['plate_type_code']).first()
        plate_template.plate_type_id = plate_type.id
        Session.commit()

        response.headers['Content-Type'] = 'application/quantalife-template'
        h.set_download_response_header(request, response, "%s.qlt" % plate_template.prefix)
        response.headers['Pragma'] = 'no-cache'

        # yeah, this is somewhat dangerous...
        template_path = "%s/%s" % (config['qlb.setup_template_store'], os.path.basename(self.form_result['template_name']))

        return forward(FileApp(template_path, response.headerlist))
Example #9
0
 def download(self, id=None, *args, **kwargs):
     if id is None:
         abort(404)
     
     qlbwell = Session.query(QLBWell).get(id)
     if not qlbwell:
         abort(404)
     
     if not qlbwell.file:
         abort(404)
     
     storage = QLStorageSource(config)
     response.headers['Content-Type'] = 'application/quantalife-raw'
     h.set_download_response_header(request, response, qlbwell.file.basename)
     return forward(FileApp(storage.qlbwell_path(qlbwell), response.headerlist))
Example #10
0
    def peak_csv(self, id=None, show_only_gated=True, *args, **kwargs):
        from qtools.lib.nstats.peaks import accepted_peaks
        qlwell = self.__qlwell_from_threshold_form(id)

        if show_only_gated != 'False':
            peaks = accepted_peaks(qlwell)
        else:
            peaks = qlwell.peaks

        from pyqlb.nstats.peaks import fam_amplitudes, fam_widths, fam_quality, vic_amplitudes, vic_widths, vic_quality, peak_times

        response.headers['Content-Type'] = 'text/csv'
        h.set_download_response_header(request, response, "%s_%s%s.csv" % \
            (str(c.well.plate.plate.name), str(c.well.well_name), '' if show_only_gated != 'False' else '_all'))
        out = StringIO.StringIO()
        csvwriter = csv_pkg.writer(out)
        csvwriter.writerow(['Plate',c.well.plate.plate.name])
        csvwriter.writerow(['Well',c.well.well_name])
        csvwriter.writerow([])
        csvwriter.writerow(['FAMThreshold',qlwell.channels[0].statistics.threshold])
        csvwriter.writerow(['VICThreshold',qlwell.channels[1].statistics.threshold])
        csvwriter.writerow(['WidthGate',qlwell.channels[0].statistics.min_width_gate,qlwell.channels[0].statistics.max_width_gate])
        csvwriter.writerow(['MinQualityGate',qlwell.channels[0].statistics.min_quality_gate])
        csvwriter.writerow([])
        csvwriter.writerow(['Time','FAMAmplitude','FAMWidth','FAMQuality','VICAmplitude','VICWidth','VICQuality'])
        csvwriter.writerow([])

        pts = peak_times(peaks)
        fas = fam_amplitudes(peaks)
        fws = fam_widths(peaks)
        fqs = fam_quality(peaks)
        vas = vic_amplitudes(peaks)
        vws = vic_widths(peaks)
        vqs = vic_quality(peaks)

        for row in zip(pts, fas, fws, fqs, vas, vws, vqs):
            csvwriter.writerow(row)
        csv = out.getvalue()
        out.close()
        return csv