package org.cellocad.MIT.dnacompiler;
/**
* Created by Bryan Der on 6/26/15.
*/
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
public class BuildCircuitsUtil {
/**
*
* @param unique_lcs
* @param gate_library
* @param part_library
* @return list of assigned circuits each of which has a different repressor-to-gate assignment (removes assignments that only vary the RBS)
*/
public static ArrayList<LogicCircuit> getUniqueRepressorAssignments(ArrayList<LogicCircuit> unique_lcs, GateLibrary gate_library, PartLibrary part_library) {
HashMap<String, LogicCircuit> unique_repressor_assignments = new HashMap<>();
for(int i=0; i<unique_lcs.size(); ++i) {
LogicCircuit lc = unique_lcs.get(i);
//bug fix for sequential circuit
for(Gate g: lc.get_Gates()) {
if(g.Type == Gate.GateType.INPUT) {
continue;
}
for(Wire w: g.get_variable_wires().get("x")) {
for(Wire wi: lc.get_Wires()) {
if(w.Index == wi.Index) {
w.To = wi.To;
}
}
}
}
//unique assignments are determined by the alphabetical ordering of transcription units
PlasmidUtil.setGateParts(lc, gate_library, part_library);
PlasmidUtil.setTxnUnits(lc, gate_library);
ArrayList<String> tus = new ArrayList<String>();
String asn = "";
for(Gate g: lc.get_logic_gates()) {
Evaluate.refreshGateAttributes(g, gate_library);
ArrayList<String> promoter_names = new ArrayList<>();
String cds = "";
//WARNING: hard-coded for NOR gates, which only have 1 txn unit per gate
for(Part p: g.get_txn_units().get(0)) {
if(p.get_type().equalsIgnoreCase("promoter")) {
promoter_names.add( p.get_name() );
}
if(p.get_type().equalsIgnoreCase("cds")) {
cds = p.get_name();
}
}
Collections.sort(promoter_names);
String tu = "";
for(String s: promoter_names) {
tu += s;
}
tu += cds;
tus.add(tu);
}
Collections.sort(tus);
//txn unit string is determined by promoter names followed by CDS name
asn = "";
for(String s: tus) {
asn += s + "_";
}
if(!unique_repressor_assignments.containsKey(asn)) {
if(!asn.contains("LmrA") && !asn.contains("PsrA")) {
//System.out.println("Unique Assignment Name: " + asn);
unique_repressor_assignments.put(asn, lc);
}
}
}
return new ArrayList<>(unique_repressor_assignments.values());
}
/**
* The txn unit names are promoter(s), RBS, CDS... RBS variants count as unique assignments
*
* @param unique_lcs
* @param gate_library
* @param part_library
* @return
*/
public static ArrayList<LogicCircuit> removeIdenticalTUs(ArrayList<LogicCircuit> unique_lcs, GateLibrary gate_library, PartLibrary part_library) {
HashMap<String, LogicCircuit> unique_repressor_assignments = new HashMap<>();
for(int i=0; i<unique_lcs.size(); ++i) {
LogicCircuit lc = unique_lcs.get(i);
//bug fix for sequential circuit
for(Gate g: lc.get_Gates()) {
if(g.Type == Gate.GateType.INPUT) {
continue;
}
for(Wire w: g.get_variable_wires().get("x")) {
for(Wire wi: lc.get_Wires()) {
if(w.Index == wi.Index) {
w.To = wi.To;
}
}
}
}
PlasmidUtil.setGateParts(lc, gate_library, part_library);
PlasmidUtil.setTxnUnits(lc, gate_library);
ArrayList<String> tus = new ArrayList<String>();
String asn = "";
for(Gate g: lc.get_logic_gates()) {
Evaluate.refreshGateAttributes(g, gate_library);
asn += g.Name;
ArrayList<String> promoter_names = new ArrayList<>();
String rbs = "";
String cds = "";
for(Part p: g.get_txn_units().get(0)) {
if(p.get_type().equalsIgnoreCase("promoter")) {
promoter_names.add( p.get_name() );
}
if(p.get_type().equalsIgnoreCase("rbs")) {
rbs = p.get_name();
}
if(p.get_type().equalsIgnoreCase("cds")) {
cds = p.get_name();
}
}
Collections.sort(promoter_names);
String tu = "";
for(String s: promoter_names) {
tu += s;
}
tu += rbs;
tu += cds;
tus.add(tu);
}
Collections.sort(tus);
asn = "";
for(String s: tus) {
asn += s + "_";
}
if(!unique_repressor_assignments.containsKey(asn)) {
if(!asn.contains("LmrA") && !asn.contains("PsrA")) {
//System.out.println("Unique Assignment Name: " + asn);
unique_repressor_assignments.put(asn, lc);
}
}
}
return new ArrayList<>(unique_repressor_assignments.values());
}
public static void setGate_name_map() {
_gate_name_map.put("NOR_an0-AmeR", "F1_AmeR");
_gate_name_map.put("NOR_js2-AmtR", "A1_AmtR");
_gate_name_map.put("NOR_an1-AmtR", "A1_AmtR");
_gate_name_map.put("NOR_js2-BetI", "E1_BetI");
_gate_name_map.put("NOR_an0-BM3R1", "B1_BM3R1");
_gate_name_map.put("NOR_an1-BM3R1", "B2_BM3R1");
_gate_name_map.put("NOR_js2-BM3R1", "B3_BM3R1");
_gate_name_map.put("NOR_js2-HlyIIR", "H1_HlyIIR");
_gate_name_map.put("NOR_an1-IcaRA", "I1_IcaRA");
_gate_name_map.put("NOR_js2-LitR", "L1_LitR");
_gate_name_map.put("NOR_x-LmrA", "N1_LmrA");
_gate_name_map.put("NOR_an0-PhlF", "P1_PhlF");
_gate_name_map.put("NOR_an1-PhlF", "P2_PhlF");
_gate_name_map.put("NOR_js2-PhlF", "P3_PhlF");
_gate_name_map.put("NOR_x-PsrA", "R1_PsrA");
_gate_name_map.put("NOR_an2-QacR", "Q1_QacR");
_gate_name_map.put("NOR_an1-QacR", "Q2_QacR");
_gate_name_map.put("NOR_an1-SrpR", "S1_SrpR");
_gate_name_map.put("NOR_an2-SrpR", "S2_SrpR");
_gate_name_map.put("NOR_an3-SrpR", "S3_SrpR");
_gate_name_map.put("NOR_an0-SrpR", "S4_SrpR");
_gate_name_map.put("NOR_js2-SrpR", "S2_SrpR");
}
public static HashMap<String, String> _gate_name_map = new HashMap();
}