def post(self): plates_info = json_decode(self.get_argument('plates-info')) results = [] for pinfo in plates_info: plate_result = self._compute_pools(pinfo) plate = Plate(plate_result['plate_id']) # calculate estimated molar fraction for each element of pool amts = plate_result['comp_vals'] * plate_result['pool_vals'] pcts = amts / amts.sum() quant_process = QuantificationProcess( plate_result['quant-process-id']) pool_name = 'Pool from plate %s (%s)' % ( plate.external_id, datetime.now().strftime(quant_process.get_date_format())) input_compositions = [] for comp, _, _ in quant_process.concentrations: well = comp.container row = well.row - 1 column = well.column - 1 input_compositions.append( {'composition': comp, 'input_volume': plate_result['pool_vals'][row][column], 'percentage_of_output': pcts[row][column]}) robot = (Equipment(plate_result['robot']) if plate_result['robot'] is not None else None) process = PoolingProcess.create( self.current_user, quant_process, pool_name, plate_result['pool_vals'].sum(), input_compositions, plate_result['func_data'], robot=robot, destination=plate_result['destination']) results.append({'plate-id': plate.id, 'process-id': process.id}) self.write(json_encode(results))
def get(self): pool_type = 'shotgun_plate' plate_ids = self.get_arguments('plate_id') process_id = self.get_argument('process_id', None) input_plate = None pool_func_data = None pool_values = [] pool_blanks = [] plate_names = [] if process_id is not None: try: process = PoolingProcess(process_id) except LabControlUnknownIdError: raise HTTPError(404, reason="Pooling process %s doesn't exist" % process_id) plate = process.components[0][0].container.plate input_plate = plate.id pool_func_data = process.pooling_function_data content_type = type(plate.get_well(1, 1).composition) id_plate_type = PLATE_TYPES[content_type] plate_type_mapped = PLATE_TYPE_TO_POOL_TYPE[id_plate_type] if plate_type_mapped != pool_type: raise HTTPError(400, reason='Pooling process type does not ' 'match pooling type') _, pool_values, pool_blanks, plate_names = \ make_2D_arrays(plate, process.quantification_process) pool_values = pool_values.tolist() pool_blanks = pool_blanks.tolist() plate_names = plate_names.tolist() elif len(plate_ids) > 0: content_types = {type(Plate(pid).get_well(1, 1).composition) for pid in plate_ids} if len(content_types) > 1: raise HTTPError(400, reason='Plates contain different types ' 'of compositions') # check if the observed plates are the same type as the pooling # type (i.e., no shotgun plates for 16S pooling) content_type = content_types.pop() id_plate_type = PLATE_TYPES[content_type] plate_type_mapped = PLATE_TYPE_TO_POOL_TYPE[id_plate_type] if plate_type_mapped != pool_type: raise HTTPError(400, reason='Plate type does not match ' 'pooling type') pool_type_stripped = POOL_TYPE_PARAMS[pool_type]['abbreviation'] plate_type = POOL_TYPE_TO_PLATE_TYPE[pool_type] robots = (Equipment.list_equipment('EpMotion') + Equipment.list_equipment('echo')) template = POOL_TYPE_PARAMS[pool_type]['template'] self.render(template, plate_ids=plate_ids, robots=robots, pool_params=HTML_POOL_PARAMS, input_plate=input_plate, pool_func_data=pool_func_data, process_id=process_id, pool_values=pool_values, plate_type=plate_type, pool_blanks=pool_blanks, plate_names=plate_names, pool_type=pool_type_stripped)
def test_list_equipment(self): obs = Equipment.list_equipment() exp = [{ 'equipment_id': 15, 'external_id': '108379Z' }, { 'equipment_id': 16, 'external_id': '109375A' }, { 'equipment_id': 17, 'external_id': '311411B' }, { 'equipment_id': 2, 'external_id': 'BUZZ' }, { 'equipment_id': 10, 'external_id': 'Carmen' }, { 'equipment_id': 1, 'external_id': 'Echo550' }, { 'equipment_id': 9, 'external_id': 'HOWE' }, { 'equipment_id': 19, 'external_id': 'IGM-HiSeq4000' }, { 'equipment_id': 8, 'external_id': 'JER-E' }, { 'equipment_id': 11, 'external_id': 'KF1' }, { 'equipment_id': 12, 'external_id': 'KF2' }, { 'equipment_id': 13, 'external_id': 'KF3' }, { 'equipment_id': 14, 'external_id': 'KF4' }, { 'equipment_id': 18, 'external_id': 'KL-MiSeq' }, { 'equipment_id': 5, 'external_id': 'LUCY' }, { 'equipment_id': 20, 'external_id': 'Not applicable' }, { 'equipment_id': 4, 'external_id': 'PRICKLY' }, { 'equipment_id': 7, 'external_id': 'RIK-E' }, { 'equipment_id': 6, 'external_id': 'ROB-E' }] self.assertEqual(obs[:-1], exp) obs = Equipment.list_equipment('echo') exp = [{'equipment_id': 1, 'external_id': 'Echo550'}] self.assertEqual(obs, exp) obs = Equipment.list_equipment('mosquito') exp = [{ 'equipment_id': 2, 'external_id': 'BUZZ' }, { 'equipment_id': 4, 'external_id': 'PRICKLY' }, { 'equipment_id': 3, 'external_id': 'STINGER' }] self.assertEqual(obs, exp)
def post(self): equipment_type = self.get_argument('equipment_type') external_id = self.get_argument('external_id') equipment = Equipment.create(equipment_type, external_id) self.write({'equipment': equipment.id})
def get(self): equipment_types = Equipment.list_equipment_types() self.render('equipments.html', equipment_types=equipment_types)
def create_compression_process(user, gdna_plates): comp_process = GDNAPlateCompressionProcess.create( user, gdna_plates, 'Compressed test plate %s' % datetime.now(), Equipment(6)) compressed_plate = comp_process.plates[0] return comp_process, compressed_plate