comparison CreateAssemblyPicklists_script.py @ 1:196e13c09881 draft

planemo upload for repository https://github.com/Edinburgh-Genome-Foundry/Plateo commit fe52aec22c97cd357d1b6c40c2954d27ebad87d3-dirty
author tduigou
date Wed, 06 Aug 2025 14:38:40 +0000
parents 4bde3e90ee98
children
comparison
equal deleted inserted replaced
0:4bde3e90ee98 1:196e13c09881
55 new_path = path.replace("__sq__", "'") 55 new_path = path.replace("__sq__", "'")
56 if new_path != path: 56 if new_path != path:
57 os.rename(path, new_path) 57 os.rename(path, new_path)
58 fixed_paths.append(new_path) 58 fixed_paths.append(new_path)
59 return fixed_paths 59 return fixed_paths
60
61
62 def parse_optional_float(x):
63 if x == '':
64 return None
65 return float(x)
60 66
61 67
62 def did_you_mean(name, other_names, limit=5, min_score=50): # test 68 def did_you_mean(name, other_names, limit=5, min_score=50): # test
63 results = process.extract(name, list(other_names), limit=limit) 69 results = process.extract(name, list(other_names), limit=limit)
64 return [e for (e, score) in results if score >= min_score] 70 return [e for (e, score) in results if score >= min_score]
376 382
377 parser = argparse.ArgumentParser(description="Generate picklist for DNA assembly.") 383 parser = argparse.ArgumentParser(description="Generate picklist for DNA assembly.")
378 parser.add_argument("--parts_files", help="Directory with parts data or file with part sizes") 384 parser.add_argument("--parts_files", help="Directory with parts data or file with part sizes")
379 parser.add_argument("--picklist", type=str, help="Path to the assembly plan CSV or Excel file") 385 parser.add_argument("--picklist", type=str, help="Path to the assembly plan CSV or Excel file")
380 parser.add_argument("--source_plate", help="Source plate file (CSV or Excel)") 386 parser.add_argument("--source_plate", help="Source plate file (CSV or Excel)")
381 parser.add_argument("--backbone_name", help="Name of the backbone") 387 parser.add_argument("--backbone_name", required=False, help="Name of the backbone")
382 parser.add_argument("--result_zip", help="Name of the output zip file") 388 parser.add_argument("--result_zip", help="Name of the output zip file")
383 parser.add_argument("--part_backbone_ratio", type=float, help="Part to backbone molar ratio") 389 parser.add_argument("--part_backbone_ratio", type=parse_optional_float, required=False, help="Part to backbone molar ratio")
384 parser.add_argument("--quantity_unit", choices=["fmol", "nM", "ng"], help="Quantity unit") 390 parser.add_argument("--quantity_unit", choices=["fmol", "nM", "ng"], help="Quantity unit")
385 parser.add_argument("--part_quantity", type=float, help="Quantity of each part") 391 parser.add_argument("--part_quantity", type=float, help="Quantity of each part")
386 parser.add_argument("--buffer_volume", type=float, help="Buffer volume in µL") 392 parser.add_argument("--buffer_volume", type=float, help="Buffer volume in µL")
387 parser.add_argument("--total_volume", type=float, help="Total reaction volume in µL") 393 parser.add_argument("--total_volume", type=float, help="Total reaction volume in µL")
388 parser.add_argument("--dispenser", choices=["labcyte_echo", "tecan_evo"], help="Dispenser machine") 394 parser.add_argument("--dispenser", choices=["labcyte_echo", "tecan_evo"], help="Dispenser machine")
484 complement_to=total_volume * 1e-6, # convert uL to L 490 complement_to=total_volume * 1e-6, # convert uL to L
485 buffer_volume=buffer_volume * 1e-6, 491 buffer_volume=buffer_volume * 1e-6,
486 volume_rounding=2.5e-9, # not using parameter from form 492 volume_rounding=2.5e-9, # not using parameter from form
487 minimal_dispense_volume=5e-9, # Echo machine's minimum dispense - 493 minimal_dispense_volume=5e-9, # Echo machine's minimum dispense -
488 ) 494 )
489 backbone_name_list = backbone_name.split(",") 495 if backbone_name != '' and backbone_name != 'Non':
496 backbone_name_list = backbone_name.split(",")
490 source_plate = plate_from_content_spreadsheet(source_plate_path) 497 source_plate = plate_from_content_spreadsheet(source_plate_path)
491 498
492 for well in source_plate.iter_wells(): 499 for well in source_plate.iter_wells():
493 if well.is_empty: 500 if well.is_empty:
494 continue 501 continue
495 quantities = well.content.quantities 502 quantities = well.content.quantities
496 part, quantity = list(quantities.items())[0] 503 part, quantity = list(quantities.items())[0]
497 quantities.pop(part) 504 quantities.pop(part)
498 quantities[part.replace(" ", "_")] = quantity 505 quantities[part.replace(" ", "_")] = quantity
499 506
500 if part in backbone_name_list: 507 if backbone_name != '' and backbone_name != 'Non':
501 # This section multiplies the backbone concentration with the 508 if part in backbone_name_list:
502 # part:backbone molar ratio. This tricks the calculator into making 509 # This section multiplies the backbone concentration with the
503 # a picklist with the desired ratio. 510 # part:backbone molar ratio. This tricks the calculator into making
504 # For example, a part:backbone = 2:1 will multiply the 511 # a picklist with the desired ratio.
505 # backbone concentration by 2, therefore half as much of it will be 512 # For example, a part:backbone = 2:1 will multiply the
506 # added to the well. 513 # backbone concentration by 2, therefore half as much of it will be
507 quantities[part.replace(" ", "_")] = quantity * part_backbone_ratio 514 # added to the well.
508 else: 515 quantities[part.replace(" ", "_")] = quantity * part_backbone_ratio
509 quantities[part.replace(" ", "_")] = quantity 516 else:
517 quantities[part.replace(" ", "_")] = quantity
510 518
511 source_plate.name = "Source" 519 source_plate.name = "Source"
512 if destination_plate: 520 if destination_plate:
513 dest_filelike = file_to_filelike_object(destination_plate) 521 dest_filelike = file_to_filelike_object(destination_plate)
514 destination_plate = plate_from_content_spreadsheet(destination_plate) 522 destination_plate = plate_from_content_spreadsheet(destination_plate)