package org.cellocad.MIT.dnacompiler; import java.util.ArrayList; /** * Created by Bryan Der on 4/5/14. */ /** * Read data from files. * * Input promoters: * promoter name, OFF RPU, ON RPU, promoter DNA sequence. * * Output gene cassette(s): * output name, cassette DNA sequence (concatenation of ribozyme, rbs, cds, terminator would be typical). * */ public class InputOutputGateReader { //get the number of inputs, just used to initialize GateLibrary with a number of inputs public static int nInputs(String fin_inputs) { ArrayList<ArrayList<String>> inputs_list = Util.fileTokenizer(fin_inputs); ArrayList<String> input_names = new ArrayList<String>(); for(int i=inputs_list.size()-1; i>=0; --i) { if(inputs_list.get(i).get(0).substring(0,1).equals("#")) { //commented out continue; } input_names.add(inputs_list.get(i).get(0)); } return input_names.size(); } //get the number of outputs, just used to initialize GateLibrary with a number of outputs public static int nOutputs(String fin_outputs) { ArrayList<ArrayList<String>> outputs_list = Util.fileTokenizer(fin_outputs); ArrayList<String> output_names = new ArrayList<String>(); for(int i=outputs_list.size()-1; i>=0; --i) { if(outputs_list.get(i).get(0).substring(0,1).equals("#")) { //commented out continue; } output_names.add(outputs_list.get(i).get(0)); } return output_names.size(); } /** * * pTac 0.0204 8.7918 AACGATCGTTGGCTGTGTTGACAATTAATCATCGGCTCGTATAATGTGTGGAATTGTGAGCGCTCACAATT * pTet 0.1312 16.837 TACTCCACCGTTGGCTTTTTTCCCTATCAGTGATAGAGATTGACATCCCTATCAGTGATAGAGATAATGAGCAC * pBAD 0.013 7.801 ACTTTTCATACTCCCGCCATTCAGAGAAGAAACCAATTGTCCATATTGCATCAGACATTGCCGTCACTGCGTCTTTTACTGGCTCTTCTCGCTAACCAAACCGGTAACCCCGCTTATTAAAAGCATTCTGTAACAAAGCGGGACCAAAGCCATGACAAAAACGCGTAACAAAAGTGTCTATAATCACGGCAGAAAAGTCCACATTGATTATTTGCACGGCGTCACACTTTGCTATGCCATAGCATTTTTATCCATAAGATTAGCGGATCCTACCTGACGCTTTTTATCGCAACTCTCTACTGTTTCTCCATACCCGTTTTTTTGGGCTAGC * * * Sets the _INPUT_NAMES, _INPUTS_OFF, _INPUTS_ON, _INPUTS_SEQ in GateLibrary */ public static void readInputsFromFile(String fin_inputs, GateLibrary gate_library) { ArrayList<ArrayList<String>> inputs_list = Util.fileTokenizer(fin_inputs); ArrayList<String> input_names = new ArrayList<String>(); gate_library.get_INPUTS_ON().clear(); gate_library.get_INPUTS_OFF().clear(); //for(int i=0; i<inputs_list.size(); ++i) { for(int i=inputs_list.size()-1; i>=0; --i) { if(inputs_list.get(i).get(0).substring(0,1).equals("#")) { //commented out continue; } String name = inputs_list.get(i).get(0); Double off_rpu = Double.valueOf(inputs_list.get(i).get(1)); Double on_rpu = Double.valueOf(inputs_list.get(i).get(2)); String promoter_seq = inputs_list.get(i).get(3); gate_library.get_INPUTS_OFF().put(name, off_rpu); gate_library.get_INPUTS_ON().put(name, on_rpu); gate_library.get_INPUTS_SEQ().put(name, promoter_seq); input_names.add(name); } //TODO confirm that the correct input order is used for case, assign, structural //TODO ask Prashant how input order is determined for different verilog inputs... is it in the module definition, or in case statements, is it in the case condition? for(int i=0; i<input_names.size(); ++i) { gate_library.get_INPUT_NAMES()[i] = input_names.get(i); } } /** * * YFP CTGAAGCTGTCACCGGATGTGCTTTCCGGTCTGA... * RFP CTGAAGTGGTCGTGATCTGAAACTCGATCACCTG... * BFP CTGAAGTTCCAGTCGAGACCTGAAGTGGGTTTCC... * * * Sets the _OUTPUT_NAMES and _OUTPUT_SEQ in GateLibrary */ public static void readOutputsFromFile(String fin_outputs, GateLibrary gate_library) { ArrayList<ArrayList<String>> outputs_list = Util.fileTokenizer(fin_outputs); ArrayList<String> output_names = new ArrayList<String>(); for(int i=0; i<outputs_list.size(); ++i) { if(outputs_list.get(i).get(0).substring(0,1).equals("#")) { //commented out continue; } String name = outputs_list.get(i).get(0); String output_seq = outputs_list.get(i).get(1); output_names.add(name); gate_library.get_OUTPUTS_SEQ().put(name, output_seq); } for(int i=0; i<output_names.size(); ++i) { gate_library.get_OUTPUT_NAMES()[i] = output_names.get(i); } } /** * Actual experimental histograms are not able to be specified for inputs, so we just get a * default histogram for the input RPU geometric mean values. */ public static void makeHistogramsforInputRPUs(GateLibrary gate_library, String file_name_default) { HistogramBins hbins = new HistogramBins(); hbins.init(); for(int i=0; i< gate_library.get_INPUT_NAMES().length; ++i) { Double log_OFF = Math.log10(gate_library.get_INPUTS_OFF().get(gate_library.get_INPUT_NAMES()[i])); Double log_ON = Math.log10(gate_library.get_INPUTS_ON().get( gate_library.get_INPUT_NAMES()[i])); ArrayList<Double> hist_OFF = HistogramUtil.getDefaultHistgramAtSpecifiedMean(log_OFF, file_name_default); ArrayList<Double> hist_ON = HistogramUtil.getDefaultHistgramAtSpecifiedMean(log_ON, file_name_default); //normalize: sum of all fractional counts equals 1.0 double[] load_OFF = HistogramUtil.normalize(HistogramUtil.placeDataIntoBins(hist_OFF, hbins)); double[] load_ON = HistogramUtil.normalize(HistogramUtil.placeDataIntoBins(hist_ON, hbins)); double[] shifted_OFF = HistogramUtil.normalizeHistogramToNewMedian(load_OFF, gate_library.get_INPUTS_OFF().get(gate_library.get_INPUT_NAMES()[i]), hbins); double[] shifted_ON = HistogramUtil.normalizeHistogramToNewMedian(load_ON, gate_library.get_INPUTS_ON().get( gate_library.get_INPUT_NAMES()[i]), hbins); gate_library.get_INPUTS_HIST_OFF().put(gate_library.get_INPUT_NAMES()[i], shifted_OFF); gate_library.get_INPUTS_HIST_ON().put( gate_library.get_INPUT_NAMES()[i], shifted_ON); //compare the input median value to the histogram median value. Should be very close but not necessarily identical. //System.out.println("median " + gate_library.get_INPUT_NAMES()[i] + " OFF " + HistogramUtil.median(shifted_OFF, hbins)); //System.out.println("median " + gate_library.get_INPUT_NAMES()[i] + " ON " + HistogramUtil.median(shifted_ON, hbins)); } } }