Team:Amsterdam/maarten/toolscripts

From 2012.igem.org

(function() {

 var ua = navigator.userAgent,
     iStuff = ua.match(/iPhone/i) || ua.match(/iPad/i),
     typeOfCanvas = typeof HTMLCanvasElement,
     nativeCanvasSupport = (typeOfCanvas == 'object' || typeOfCanvas == 'function'),
     textSupport = nativeCanvasSupport 
       && (typeof document.createElement('canvas').getContext('2d').fillText == 'function');
 //I'm setting this based on the fact that ExCanvas provides text support for IE
 //and that as of today iPhone/iPad current text support is lame
 labelType = (!nativeCanvasSupport || (textSupport && !iStuff))? 'Native' : 'HTML';
 nativeTextSupport = labelType == 'Native';
 useGradients = nativeCanvasSupport;
 animate = !(iStuff || !nativeCanvasSupport);

})();

var Log = {

 elem: false,
 write: function(text){
   if (!this.elem) 
     this.elem = document.getElementById('log');
   this.elem.innerHTML = text;
   this.elem.style.left = (500 - this.elem.offsetWidth / 2) + 'px';
 }

};

function visualization(number){ $('#readout').empty() $('#inner-details').empty() $('#infovis').empty()

       $('#genbankInfo').empty()

json = JSON.parse(unescape($(':input[name=json'+number+']').val()))

   //init data
   //init Sunburst
   var sb = new $jit.Sunburst({
       //id container for the visualization
       injectInto: 'infovis',
       //Distance between levels
       levelDistance: 90,
       //Change node and edge styles such as
       //color, width and dimensions.
       Node: {
         overridable: true,
         type: useGradients? 'gradient-multipie' : 'multipie'
       },
       //Select canvas labels
       //'HTML', 'SVG' and 'Native' are possible options
       Label: {
         type: labelType
       },
       //Change styles when hovering and clicking nodes
       NodeStyles: {
         enable: true,
         type: 'Native',
         stylesClick: {
           'color': '#000000'
         },
       },
       //Add tooltips
       Tips: {
         enable: true,
         onShow: function(tip, node) {
var html = "
" + node.data.description + "
";
           var data = node.data;
           if("length" in data) {
             html += "Length of feature: " + data.length + "bp";
           }

if("type" in data){ html += "
Type of feature: " + data.type; }

           tip.innerHTML = html;
         }
       },
       //implement event handlers
       Events: {
         enable: true,
         onClick: function(node) {
           if(!node) return;
           //Build detailed information about the file/folder
           //and place it in the right column.
var html = "

" + node.name + "

", data = node.data;
           if("dna" in data) {
html += "Sequence:
" + data.dna + "
";
           }
           $jit.id('inner-details').innerHTML = html;
           //hide tip
           sb.tips.hide();
           //rotate
           //sb.rotate(node, animate? 'animate' : 'replot', {
             //duration: 1000,
             //transition: $jit.Trans.Quart.easeInOut
           //});
         }
       },
       // Only used when Label type is 'HTML' or 'SVG'
       // Add text to the labels. 
       // This method is only triggered on label creation
       onCreateLabel: function(domElement, node){
         var labels = sb.config.Label.type,
             aw = node.getData('length');
         if (labels === 'HTML' && (node._depth < 2 || aw > 2000)) {
           domElement.innerHTML = node.name;
         } else if (labels === 'SVG' && (node._depth < 2 || aw > 2000)) {
           domElement.firstChild.appendChild(document.createTextNode(node.name));
         }
       },
       // Only used when Label type is 'HTML' or 'SVG'
       // Change node styles when labels are placed
       // or moved.
       onPlaceLabel: function(domElement, node){
         var labels = sb.config.Label.type;
         if (labels === 'SVG') {
           var fch = domElement.firstChild;
           var style = fch.style;
           style.display = ;
           style.cursor = 'pointer';
           style.fontSize = "0.8em";
           fch.setAttribute('fill', "#fff");
         } else if (labels === 'HTML') {
           var style = domElement.style;
           style.display = ;
           style.cursor = 'pointer';
           style.fontSize = "0.8em";
           style.color = "#ddd";
           var left = parseInt(style.left);
           var w = domElement.offsetWidth;
           style.left = (left - w / 2) + 'px';
         }
       }
  });
   //load JSON data.
   sb.loadJSON(json);
   //compute positions and plot.
   sb.refresh();
   //end

}

function addForbiddenSequences(){ forbiddenSequences.addSite('Forbidden-EcoRI','GAATTC') forbiddenSequences.addSite('Forbidden-XbaI','GAATTC') forbiddenSequences.addSite('Forbidden-SpeI','ACTAGT') forbiddenSequences.addSite('Forbidden-PstI','CTGCAG') forbiddenSequences.addSite('Forbidden-NotI','GCGGCCGC') }

var forbiddenSequences = {

   forbiddenSequencesArray : {},

addSite : function(name,sequence){ forbiddenSequences.forbiddenSequencesArray[name] = sequence }, }

function checkOccurrence(target,sequence){ if (sequence.length > target.length){

       if (sequence.indexOf(target) == -1){
           return false
       } else{
           return true
       }

} else{ if (target.indexOf(sequence) == -1){

           return false
       } else{
           return true
       }

} }

function randomDNA(length){ chars = 'atgc' inForbiddenSite = true while (inForbiddenSite === true){ sequence = inForbiddenSite = false for (k=0; k<length; k++) { rnum = Math.floor(Math.random() * chars.length); sequence += chars.substring(rnum,rnum+1); } for (item in forbiddenSequences.forbiddenSequencesArray){ if (checkOccurrence(sequence,forbiddenSequences.forbiddenSequencesArray[item].toLowerCase()) === false){ continue } else{ inForbiddenSite = true break } } } return sequence }

function getMethyltransferases(){

   methyltransferases = new Array()
   sca1 = new Object()
   sca1.target = "AGTACT"
   sca1.sequence = "tccgggcgggactttggatatgtgatacagtcgtccgctgcactatggaatcgactctctacattctcacagagaggaaaagccttggacaccaggcttgcagacatcaagaaggccctggggaagccgtactacgaaacctcggatgtccttctttaccacggcgacagtcttgagctgctcaagtcaatgcctcagcagattttcgaccttaccgtaactagcccaccttacaatattggcaaagagtacgagggtgtactgtcgatcgaggaatacatttcctggtgcgagacatggatgtcgcgcgttcatagggcgaccagcgcaggcggcgcattttggctcaatgttgggtacgtccctgtcccgaaccaaggaaaagcagtcccgattccttacctcttgtgggacaagagtccgttctacatgatccaggaagttgtctggaattacggggcgggagtggcgtctcgaaaatcgttttccccgcgcaatgaaaagtttctctggtatgtgcgcgacccgctgaattattacttcgacctcgattcggtgcgcgacccaaatgtgaaataccccaaccagaaaaagaatgggaagctcaaatgcaacccgttggggaaaaatcccactgacgtttggcagttccccaaggttacgtcgggcgcgaagagatcaagcgtggagcgcaccgcccatccggcacaattcccgtctgctgtcattgaacgggtcatcaaggcgtgcagcccttccgacggcgtcatcctggacccattcctcggttccggaacgacctcgctgaccgccagaaagcaaggccggtgcagcgtcggtatcgaaatccgcgaagactacctcgacatcgcggtgggacgcctggaggcggaggcgcaatccctcttctag"
   sca1.description = "M.Sca1"

methyltransferases[0] = sca1 addForbiddenSequence(methyltransferases,'hasTarget')

   return methyltransferases 

}

function getZincFingers(){

   zincFingers = new Array()
   rawData = document.plasmidForm.zf.value
   rawData = rawData.split('>')
   rawData.reverse().pop()
   rawData.reverse()
   for (zf in rawData){
       zfFormatted = rawData[zf].split('\n')
       zfDescription = zfFormatted[0]
       zfTarget = zfDescription.split('|')[5]
       zfSequence = 
       for (i=1;i<zfFormatted.length;i++){
           zfSequence+=zfFormatted[i]
       }
       zfObject = new Object()
       zfObject.target = zfTarget
       zfObject.sequence = zfSequence
       zfObject.description = zfDescription
       zincFingers[zf] = zfObject
   }
   addForbiddenSequence(zincFingers,'hasTarget')
   return zincFingers

}

function getLinkers(){

   linkers = new Array()
   linker1 = new Object()
   linker1.sequence = "gcacccggc"
   linker1.description = "Linker 1"
   linkers[0] = linker1

addForbiddenSequence(linkers,'noTarget')

   return linkers

}

function getMycTags(){

   mycTags = new Array()
   mycTag1 = new Object()
   mycTag1.sequence = "gaacagaaactcatctctgaagaggatctg"
   mycTag1.description = "Myc Tag 1"
   mycTags[0] = mycTag1
   addForbiddenSequence(mycTags,'noTarget')
   return mycTags

}

function getTerminators(){

   terminators = new Array()
   terminator1 = new Object()
   terminator1.sequence = "tcacactggctcaccttcgggtgggcctttctgcgtttatatactagagagagaatataaaaagccagattattaatccggcttttttattattt"
   terminator1.description = "B0014 containing BOO12 and BOO11 terminators"

terminators[0] = terminator1 addForbiddenSequence(terminators,'noTarget')

   return terminators

}

function getRBS(){

   rbs = new Array()
   rbs1 = new Object()
   rbs1.sequence = "tcacacaggaaag"
   rbs1.description = "BBa_B0032"
   rbs[0] = rbs1

addForbiddenSequence(rbs,'noTarget')

   return rbs

}

function addForbiddenSequence(array,type){ if (type == 'hasTarget'){ for (item in array){ forbiddenSequences.addSite(array[item].description,array[item].target) } } else{ for (item in array){ forbiddenSequences.addSite(array[item].description,array[item].sequence) } }

}

function getDate(){

   today = new Date()
   dd = today.getDate()
   mm = today.getMonth()+1
   yyyy = today.getFullYear()
   if(dd<10){
       dd='0'+dd
   } 
   if(mm<10){
       mm='0'+mm
   } 
   today = dd+'-'+mm.substring(0,2)+'-'+yyyy;
   return today

}

function generateWhiteSpace(amount){

       output = 
       for (i=0;i<amount;i++){
           output += ' '
       }
       return output

}

function staticGenbank(name){ output = 'LOCUS'

       output += generateWhiteSpace(16)
       output += name
       output += generateWhiteSpace(8)
       output += memoryPlasmid.dna.length+' bp DNA '
       output += generateWhiteSpace(3)
       output += 'linear'
       output += generateWhiteSpace(7)
       output += getDate()+'\n'
       output += 'DEFINITION\n'
       output += 'ACCESSION\n'
       output += 'VERSION\n'
       output += 'SOURCE\n'
       output += '  ORGANISM\n'
       output += 'COMMENT\n'
       output += 'FEATURES'
       output += generateWhiteSpace(13)
       output += 'Location/Qualifiers\n'

return output }

function genbankRestriction(targetSites){ restrictionPlasmidOutput = staticGenbank('restriction_plasmid') restrictionOrigin = memoryPlasmid.features[1].sequence for (key in targetSites){ restrictionOrigin += randomDNA(120) restrictionPlasmidOutput += generateWhiteSpace(5) restrictionPlasmidOutput += 'misc_feature' restrictionPlasmidOutput += generateWhiteSpace(5) restrictionPlasmidOutput += restrictionOrigin.length+1+'...' restrictionOrigin += targetSites[key].zincFinger restrictionPlasmidOutput += restrictionOrigin.length+'\n' restrictionPlasmidOutput += generateWhiteSpace(10) restrictionPlasmidOutput += '/label=Zinc Finger '+targetSites[key].zincFingerDescription.split('|')[0]+' target site\n' restrictionOrigin += randomDNA(120) restrictionPlasmidOutput += generateWhiteSpace(5) restrictionPlasmidOutput += 'misc_feature' restrictionPlasmidOutput += generateWhiteSpace(5) restrictionPlasmidOutput += restrictionOrigin.length+1+'...' restrictionOrigin += targetSites[key].methyltransferase restrictionPlasmidOutput += restrictionOrigin.length+'\n' restrictionPlasmidOutput += generateWhiteSpace(10) restrictionPlasmidOutput += '/label='+targetSites[key].methyltransferaseDescription+'\n' restrictionOrigin += targetSites[key].methyltransferase restrictionOrigin += randomDNA(120) restrictionPlasmidOutput += generateWhiteSpace(5) restrictionPlasmidOutput += 'misc_feature' restrictionPlasmidOutput += generateWhiteSpace(5) restrictionPlasmidOutput += restrictionOrigin.length+1+'...'+restrictionOrigin.length+'\n' restrictionPlasmidOutput += generateWhiteSpace(10) restrictionPlasmidOutput += '/label=Zinc Finger '+targetSites[key].zincFingerDescription.split('|')[0]+' target site\n'

} restrictionOrigin = restrictionOrigin.toLowerCase()

       restrictionOrigin = restrictionOrigin.replace(/[atgc]{10}/g,'$& ').replace(/amp;/g,).split(' ')
       pos = 1
       newString = 
       restrictionPlasmidOutput += 'ORIGIN\n'
       for (i=0;i<restrictionOrigin.length;i++){
           newString = newString+' '+restrictionOrigin[i]
           if ((i+1)%6===0){
                whiteSpace = 
                for (j=0;j<9-pos.toString().length;j++){
                    whiteSpace+= ' '
                }
                newString = whiteSpace+pos + ' ' + newString
                restrictionPlasmidOutput+=newString+'\n'
                newString = 
           } else if ((i+1)%6==1){
                 if (i!=0){
                     pos+=60
                 }
             }
       }
       if (restrictionOrigin.length%6 != 0){
           newString = 
           whiteSpace = 
           for (j=0;j<9-pos.toString().length;j++){
               whiteSpace+= ' '
           }
           newString+=whiteSpace+pos
           for (i=0;i<(restrictionOrigin.length%6);i++){
               newString+=' '+restrictionOrigin[restrictionOrigin.length-restrictionOrigin.length%6+i]
           }
           restrictionPlasmidOutput+=newString+'\n'
       }

$('#genbankButtons').append('<input type="hidden" name="genbank-1" value="'+restrictionPlasmidOutput+'"/><input class="submit" type="submit" value="Restriction Plasmid Genbank" onclick="genbankOut(-1);return false"/>'); } function genbankOut(number){ $('#readout').empty() $('#inner-details').empty() $('#infovis').empty()

       $('#genbankInfo').empty()

outString = $(':input[name=genbank'+number+']').val()

$('#genbankInfo').append('Genbank file
<textarea name="genbankTextField" type="text" width="50%">'+outString+'</textarea>
')

} function genbankMemory(number){

       memoryPlasmidOutput = staticGenbank('memory_plasmid')
       for (item in memoryPlasmid.memoryObjects){

for (key in memoryPlasmid.memoryObjects[item]){ memoryPlasmidOutput += generateWhiteSpace(5) memoryPlasmidOutput += 'misc_feature' memoryPlasmidOutput += generateWhiteSpace(5) memoryPlasmidOutput += memoryPlasmid.memoryObjects[item][key].start+'...'+memoryPlasmid.memoryObjects[item][key].end+'\n' memoryPlasmidOutput += generateWhiteSpace(10) memoryPlasmidOutput += '/label='+memoryPlasmid.memoryObjects[item][key].description+'\n' }

       }
       origin = memoryPlasmid.dna
       origin = origin.replace(/[atgc]{10}/g,'$& ').replace(/amp;/g,).split(' ')
       pos = 1
       newString = 
       memoryPlasmidOutput += 'ORIGIN\n'
       for (i=0;i<origin.length;i++){
           newString = newString+' '+origin[i]
           if ((i+1)%6===0){
                whiteSpace = 
                for (j=0;j<9-pos.toString().length;j++){
                    whiteSpace+= ' '
                }
                newString = whiteSpace+pos + ' ' + newString
                memoryPlasmidOutput+=newString+'\n'
                newString = 
           } else if ((i+1)%6==1){
                 if (i!=0){
                     pos+=60
                 }
             }
       }
       if (origin.length%6 != 0){
           newString = 
           whiteSpace = 
           for (j=0;j<9-pos.toString().length;j++){
               whiteSpace+= ' '
           }
           newString+=whiteSpace+pos
           for (i=0;i<(origin.length%6);i++){
               newString+=' '+origin[origin.length-origin.length%6+i]
           }
           memoryPlasmidOutput+=newString+'\n'
       }
       $('#genbankButtons').append('<input type="hidden" name="genbank'+number+'" value="'+memoryPlasmidOutput+'"/><input class="submit" type="submit" value="Sensory Plasmid Genbank '+(number+1)+'" onclick="genbankOut('+number+');return false"/>');		

}

function formatPlasmidInput(backbone){

       backbone = backbone.split('\n')
       originBoolean = false
       backboneName = 
       sequence = 
       if (backbone[0].toLowerCase().indexOf('locus') != -1){
           for (i=0;i<backbone.length;i++){
               if (originBoolean === true){
                   if (backbone[i].indexOf('//') == -1){
                     appendThis = backbone[i].replace(/[0-9]|\s|\n|\t/g,)
                     sequence = sequence+appendThis
                   } else{
                       originalBoolean = false
                   }
               }
               if (backbone[i].indexOf('locus') != -1){
                   backboneName = backbone[i].split(/\s+|\t+/g)[1]
               }
               if (backbone[i].indexOf('origin') != -1){
                   originBoolean = true
               }
           }
       } else if (backbone[0][0] == '>'){
               for (i=0;i<backbone.length;i++){
                   if (backbone[i][0] != '>'){
                       appendThis = backbone[i].replace(/[0-9]|\s|\n|\t/g,)
                       sequence = sequence+appendThis
                   } else{
                       backboneName = backbone[i].replace('>',)
                   }
               }
       }
       memoryPlasmid.addFeature(1,sequence.length,'Backbone',sequence,backboneName,)
       return sequence

}

function feature(start,end,type,sequence,description,featureObject){ this.start = start; this.end = end; this.type = type;

   this.sequence = sequence;
   this.description = description;

this.featureObject = featureObject }

var restrictionPlasmid = { backboneName : , dna : , features : {},

   setBackboneName : function(backboneName){
       restrictionlasmid.backboneName = backboneName
   },

setDNA : function(dna){ restrictionPlasmid.dna = dna }, addFeature : function(start,end,type,sequence,description){ restrictionPlasmid.features[start] = new feature(start,end,type,sequence,description) }, addRecognitionAreaObject : function(zfTarget,mtaseTarget){

recognitionPlasmid.zfTarget = zfTarget recognitionPlasmid.mtaseTarget = mtaseTarget } }

var memoryPlasmid = {

   backboneName : ,

dna : , features : {}, memoryObjects : {},

   setBackboneName : function(backboneName){
       memoryPlasmid.backboneName = backboneName
   },

setDNA : function(dna){ memoryPlasmid.dna = dna }, addMemoryObject : function(sensor,rbs,zincFinger,linker,mycTag,methyltransferase,terminator){ memoryObject = new Object() memoryObject.sensor = sensor memoryObject.rbs = rbs memoryObject.zincFinger = zincFinger memoryObject.linker = linker memoryObject.mycTag = mycTag memoryObject.methyltransferase = methyltransferase memoryObject.terminator = terminator memoryPlasmid.memoryObjects[sensor.start] = memoryObject }, addFeature : function(start,end,type,sequence,description){ memoryPlasmid.features[start] = new feature(start,end,type,sequence,description) } }

function sensorObject(name,sequence){

       this.name = name
       this.sequence = sequence

}

function formatSensors(sensors){

       sensorArray = new Array()
       if (sensors.indexOf('LOCUS') != -1){
           sensors = sensors.split('LOCUS')
           sensors.reverse().pop()
           for (i=0;i<sensors.length;i++){
               originBoolean = false
               sensorName = 
               sequence = 
               sensor = sensors[i].split('\n')
               for (j=0;j<sensor.length;j++){
                   if (j===0){
                       sensorName = sensor[j]
                   }
                   if (originBoolean === true){
                       if (sensor[j].indexOf('//') == -1){
                           appendThis = sensor[j].replace(/[0-9]|\s|\n|\t/g,)
                           sequence += appendThis
                       } else {
                           originBoolean = false
                       }
                   }
                   if (sensor[j].indexOf('ORIGIN') != -1){
                       originBoolean = true
                   }
               }
               sensorArray[i] = new sensorObject(sensorName,sequence)
           }
       } else if (sensors[0] == '>'){
           sensors = sensors.split('//')
           sensors.pop()
           sensorName = 
           for (i=0;i<sensors.length;i++){
               sensor = sensors[i].split('\n')
               sequence = 
               for (j=0;j<sensor.length;j++){
                   if (sensor[j][0] != '>'){
                       appendThis = sensor[j].replace(/[0-9]|\s|\n|\t/g,)
                       sequence = sequence+appendThis
                   } else if (sensor[j][0] == '>'){
                       sensorName = sensor[j].replace('>',)
                   }  
               }
               sensorArray[i] = new sensorObject(sensorName,sequence)
           }
       }
       return sensorArray 

}

function reset(){

       $('#readout').empty()

$('#inner-details').empty() $('#infovis').empty()

       $('#genbankInfo').empty()
       $('#genbankButtons').empty()
       $('#visualizationButtons').empty()
       $('input[type=checkbox]').each(function() { 
           this.checked = false; 
       }); 

} function formatPartsregistryPromoters(){

       promoters = new Array()
       $("input:checkbox[name=promoter]:checked").each(function(){
           promoter = $(this).val().split(':')
           promoters.push(new sensorObject(promoter[0],promoter[2]))
       })
       return promoters

}

function configuratePlasmid(sensorArray,number){ memoryPlasmid.features = {} memoryPlasmid.memoryObjects = {}

       backbone = document.plasmidForm.plasmid.value.toLowerCase()
       methyltransferases = getMethyltransferases()
       zincFingers = getZincFingers()
       linkers = getLinkers()
       mycTags = getMycTags()
       rbs = getRBS()
       terminators = getTerminators()
       plasmidSequence = formatPlasmidInput(backbone)
       memoryPlasmid.setDNA(plasmidSequence)
       for (i=0;i<sensorArray.length;i++){

featureArray = new Array() featureArray[0] = new feature(memoryPlasmid.dna.length+1,memoryPlasmid.dna.length+sensorArray[i].sequence.length,'Sensor',sensorArray[i].sequence,sensorArray[i].name,sensorArray[i])

           memoryPlasmid.setDNA(memoryPlasmid.dna+sensorArray[i].sequence)
           j = Math.floor((Math.random()*rbs.length))
           featureArray[1] = new feature(memoryPlasmid.dna.length+1,memoryPlasmid.dna.length+rbs[j].sequence.length,'RBS',rbs[j].sequence,rbs[j].description,rbs[j])
           memoryPlasmid.setDNA(memoryPlasmid.dna+rbs[j].sequence+randomDNA(3))	
           memoryPlasmid.setDNA(memoryPlasmid.dna+'atg'+randomDNA(10))
           for (j=0;j<zincFingers.length;j++){
               if (checkOccurrence(zincFingers[j].target.toLowerCase(),memoryPlasmid.dna) === true || checkOccurrence(zincFingers[j].sequence.toLowerCase(),memoryPlasmid.dna) === true){
                   continue
               } else{
                   featureArray[2] = new feature(memoryPlasmid.dna.length+1,memoryPlasmid.dna.length+zincFingers[j].sequence.length,'Zinc Finger',zincFingers[j].sequence,'Zinc Finger '+zincFingers[j].description.split('|')[0],zincFingers[j])		
                   memoryPlasmid.setDNA(memoryPlasmid.dna+zincFingers[j].sequence)
                   break
               }
           }
           j = Math.floor((Math.random()*linkers.length))
           featureArray[3] = new feature(memoryPlasmid.dna.length+1,memoryPlasmid.dna.length+linkers[j].sequence.length,'Linker',linkers[j].sequence,linkers[j].description,linkers[j])

memoryPlasmid.setDNA(memoryPlasmid.dna+linkers[j].sequence)

           j = Math.floor((Math.random()*mycTags.length))
           featureArray[4] = new feature(memoryPlasmid.dna.length+1,memoryPlasmid.dna.length+mycTags[j].sequence.length,'Myc Tag',mycTags[j].sequence,mycTags[j].description,mycTags[j])

memoryPlasmid.setDNA(memoryPlasmid.dna+mycTags[j].sequence)

           j = Math.floor((Math.random()*methyltransferases.length))	

featureArray[5] = new feature(memoryPlasmid.dna.length+1,memoryPlasmid.dna.length+methyltransferases[j].sequence.length,'Methyltransferase',methyltransferases[j].sequence,methyltransferases[j].description,methyltransferases[j])

           memoryPlasmid.setDNA(memoryPlasmid.dna+methyltransferases[j].sequence)
           j = Math.floor((Math.random()*terminators.length))
           featureArray[6] = new feature(memoryPlasmid.dna.length+1,memoryPlasmid.dna.length+terminators[j].sequence.length,'Terminator',terminators[j].sequence,terminators[j].description,terminators[j])

memoryPlasmid.setDNA(memoryPlasmid.dna+terminators[j].sequence+randomDNA(10))

           memoryPlasmid.addMemoryObject(featureArray[0],featureArray[1],featureArray[2],featureArray[3],featureArray[4],featureArray[5],featureArray[6])

} restrictionPlasmid.setDNA(memoryPlasmid.features[1].sequence) for (item in memoryPlasmid.memoryObjects){ featureArray = new Array() mtaseStart = restrictionPlasmid.dna.length+1 mtaseEnd = restrictionPlasmid.dna.length+memoryPlasmid.memoryObjects[item].methyltransferase.featureObject.target.length mtaseType = 'Restriction Site' mtaseTarget = memoryPlasmid.memoryObjects[item].methyltransferase.featureObject.target.toLowerCase() mtaseDescription = memoryPlasmid.memoryObjects[item].methyltransferase.featureObject.description+' restriction site' featureArray[0] = new feature(mtaseStart,mtaseEnd,mtaseType,mtaseTarget,mtaseDescription) restrictionPlasmid.setDNA(restrictionPlasmid.dna+mtaseTarget) zfStart = restrictionPlasmid.dna.length+1 zfEnd = restrictionPlasmid.dna.length+memoryPlasmid.memoryObjects[item].zincFinger.featureObject.target.length zfType = 'Restriction Site' zfTarget = memoryPlasmid.memoryObjects[item].zincFinger.featureObject.target zfDescription = memoryPlasmid.memoryObjects[item].zincFinger.featureObject.description+' restriction site' featureArray[1] = new feature(zfStart,zfEnd,zfType,zfTarget,zfDescription) restrictionPlasmid.setDNA(restrictionPlasmid.dna+mtaseTarget) restrictionPlasmid.mtaseTarget = featureArray[0] restrictionPlasmid.zfTarget = featureArray[1] } json = createJSONMemory(number) genbankMemory(number) $('#visualizationButtons').append('<input type="hidden" name="json'+number+'" value="'+escape(JSON.stringify(json))+'"/><input class="submit" type="submit" value="Sensory Plasmid Visualization '+(number+1)+'" onclick="visualization('+number+');return false"/>'); }

function setup(){ $('#visualizationButtons').empty() $('#infovis').empty() $('#readout').empty() $('#genbankButtons').empty() $('#inner-details').empty()

               $('#genbankInfo').empty()

addForbiddenSequences() sensors = document.plasmidForm.sensors.value.toLowerCase() sensorArray = formatSensors(sensors)

       promoters = formatPartsregistryPromoters()
       sensorArray = promoters.concat(sensorArray)

tempArray = new Array() j = 0 number = 0 targetSites = new Array() for (sensor in sensorArray){ tempArray[j] = sensorArray[sensor] j++ if (j%5 === 0 && j !== 0){

configuratePlasmid(tempArray,number) number++ tempArray = new Array() j = 0 for (item in memoryPlasmid.memoryObjects){ site = new Object() site.zincFingerDescription = memoryPlasmid.memoryObjects[item].zincFinger.featureObject.description site.zincFinger = memoryPlasmid.memoryObjects[item].zincFinger.featureObject.target site.zincFingerLength = site.zincFinger.length site.methyltransferaseDescription = memoryPlasmid.memoryObjects[item].methyltransferase.featureObject.description site.methyltransferase = memoryPlasmid.memoryObjects[item].methyltransferase.featureObject.target site.methyltransferaseLength = site.methyltransferase.length site.sensor = memoryPlasmid.memoryObjects[item].sensor.description targetSites.push(site)

}

} } if (j%5 !== 0){ configuratePlasmid(tempArray,number) for (item in memoryPlasmid.memoryObjects){ site = new Object() site.zincFingerDescription = memoryPlasmid.memoryObjects[item].zincFinger.featureObject.description site.zincFinger = memoryPlasmid.memoryObjects[item].zincFinger.featureObject.target site.zincFingerLength = site.zincFinger.length site.methyltransferaseDescription = memoryPlasmid.memoryObjects[item].methyltransferase.featureObject.description site.methyltransferase = memoryPlasmid.memoryObjects[item].methyltransferase.featureObject.target site.methyltransferaseLength = site.methyltransferase.length site.sensor = memoryPlasmid.memoryObjects[item].sensor.description targetSites.push(site) } } genbankRestriction(targetSites) json = createJSONRestriction(targetSites) $('#visualizationButtons').append('<input type="hidden" name="json-1" value="'+escape(JSON.stringify(json))+'"/><input class="submit" type="submit" value="Restriction Plasmid Visualization" onclick="visualization(-1);return false"/>'); $('#visualizationButtons').append('

Fill in the underlying form with your band sizes, seperated by a comma, to see which sensor-specific methyltransferases have been cut
<input type="textfield" name="readout" value=""/><input class="submit" type="submit" value="Readout" onClick="getReadout();return false"/>'); }

function getReadout(){ $('#readout').empty() $('#inner-details').empty() $('#infovis').empty()

       $('#genbankInfo').empty()

inputArray = new Array() json = JSON.parse(unescape($(':input[name=json-1]').val())) inputs = $(':input[name=readout]').val() inputArray = inputs.split(',') totalLength = json.children[0].data.length uncutArray = new Array() i = 0 for (child in json.children){ if (child != 0){ totalLength+=json.children[child].data.length if (json.children[child].data.description.indexOf('Methyltransferase') != -1){ uncutArray[i] = [json.children[child].id,totalLength] i++ } } } bandsArray = new Array () j = 0 for (item in uncutArray){ i = 0 tempBandArray = new Array() tempBandArray[i] = [uncutArray[item][1],uncutArray[item][0]]

i++ for (bandArray in bandsArray){ for (band in bandsArray[bandArray]){ tempBandArray[i] = [uncutArray[item][1] - bandsArray[bandArray][band][0],uncutArray[item][0]] i++ } } bandsArray[j] = tempBandArray j++ } matchingBands = new Array() i = 0 for (input in inputArray){ difference = 100000000000 bandSize = inputArray[input] for (bandArray in bandsArray){ for (band in bandsArray[bandArray]){ if (bandSize > bandsArray[bandArray][band][0]){ tempDifference = bandSize - bandsArray[bandArray][band][0] } else{ tempDifference = bandsArray[bandArray][band][0] - bandSize } if (tempDifference < difference){ matchingBand = bandsArray[bandArray][band][1] difference = tempDifference } } } matchingBands[i] = matchingBand i++ } i = 0 sensedSignals = new Array() for (matchingBand in matchingBands){ for (child in json.children){ if (json.children[child].id == matchingBands[matchingBand]){ sensedSignals[i] = json.children[child].data.sensor i++ } }


} outString = for (signal in sensedSignals){ outString += sensedSignals[signal]+'
' } if (outString != ){

$('#readout').append('The bands belong to these signals (in order of input)
<font size="3">'+outString+'</font>
')

}

}

function createJSONRestriction(targetSites){ json = {

     "children": [], 
     "data": {
       "$type": "none",
     }, 
     "id": "Source", 
     "name": "Memory Plasmid"
   };

json.children[0] = {} json.children[0].data = {} json.children[0].data.description = memoryPlasmid.features[1].description json.children[0].data.$color = '#B2ABF4' json.children[0].data.length = memoryPlasmid.features[1].end - memoryPlasmid.features[1].start json.children[0].data.$angularWidth = 10000 json.children[0].data.type = memoryPlasmid.features[1].type json.children[0].data.dna = memoryPlasmid.dna json.children[0].children = [] json.children[0].name = memoryPlasmid.features[1].description json.children[0].id = memoryPlasmid.features[1].description totalLength = memoryPlasmid.dna.length i = 1 for (item in targetSites){ site = targetSites[item] json.children[i] = {} json.children[i].data = {} json.children[i].children = [] json.children[i].data.description = '120bp random DNA' json.children[i].data.$color = '#FFFF00' json.children[i].data.length = 120 json.children[i].data.$angularWidth = 1000 json.children[i].data.dna = randomDNA(120+i*10) json.children[i].name = '120bp DNA' json.children[i].id = i i++ json.children[i] = {} json.children[i].data = {} json.children[i].children = [] json.children[i].data.description = site.zincFingerDescription json.children[i].data.$color = '#FF0000' json.children[i].data.length = site.zincFingerLength json.children[i].data.$angularWidth = 1000 json.children[i].data.dna = site.zincFinger json.children[i].name = site.zincFingerDescription.split('|')[0]+'|'+site.zincFingerDescription.split('|')[1] json.children[i].id = i i++ json.children[i] = {} json.children[i].data = {} json.children[i].children = [] json.children[i].data.description = '120bp random DNA' json.children[i].data.$color = '#FFFF00' json.children[i].data.length = 120 json.children[i].data.$angularWidth = 1000 json.children[i].data.dna = randomDNA(120) json.children[i].name = '120bp DNA' json.children[i].id = i i++ json.children[i] = {} json.children[i].data = {} json.children[i].children = [] json.children[i].data.description = 'Methyltransferase: '+site.methyltransferaseDescription json.children[i].data.$color = '#0000CD' json.children[i].data.length = site.methyltransferaseLength json.children[i].data.$angularWidth = 1000 json.children[i].data.dna = site.methyltransferase json.children[i].data.sensor = site.sensor json.children[i].name = site.methyltransferaseDescription.split('|')[0] json.children[i].id = i i++ json.children[i] = {} json.children[i].data = {} json.children[i].children = [] json.children[i].data.description = '120bp random DNA' json.children[i].data.$color = '#FFFF00' json.children[i].data.length = 120 json.children[i].data.$angularWidth = 1000 json.children[i].data.dna = randomDNA(120) json.children[i].name = '120bp DNA' json.children[i].id = i i++ json.children[i] = {} json.children[i].data = {} json.children[i].children = [] json.children[i].data.description = site.zincFingerDescription json.children[i].data.$color = '#FF0000' json.children[i].data.length = site.zincFingerLength json.children[i].data.$angularWidth = 1000 json.children[i].data.dna = site.zincFinger json.children[i].name = site.zincFingerDescription.split('|')[0]+'|'+site.zincFingerDescription.split('|')[1] json.children[i].id = i i++ } return json }

function createJSONMemory(number){ var json = {} json = {

     "children": [], 
     "data": {
       "$type": "none",
     }, 
     "id": "Source", 
     "name": "Sensory Plasmid"
   };

json.children[0] = {} json.children[0].data = {} json.children[0].data.description = memoryPlasmid.features[1].description json.children[0].data.$color = '#B2ABF4' json.children[0].data.length = memoryPlasmid.features[1].end - memoryPlasmid.features[1].start json.children[0].data.$angularWidth = 10000 json.children[0].data.type = memoryPlasmid.features[1].type json.children[0].data.dna = memoryPlasmid.dna json.children[0].children = [] json.children[0].name = memoryPlasmid.features[1].description json.children[0].id = memoryPlasmid.features[1].description

   i = 1
   for (memoryObject in memoryPlasmid.memoryObjects){

for (item in memoryPlasmid.memoryObjects[memoryObject]){ json.children[i] = {} json.children[i].children = [] json.children[i].data = {} json.children[i].data.description = memoryPlasmid.memoryObjects[memoryObject][item].description type = memoryPlasmid.memoryObjects[memoryObject][item].type if (type == 'Sensor'){ color = '#00FFFF' } else if (type == 'RBS'){ color = '#FFFF00' } else if (type == 'Zinc Finger'){ color = '#800080' } else if (type == 'Linker'){ color = '#00FF00' } else if (type == 'Myc Tag'){ color = '#FF00FF' } else if (type == 'Methyltransferase'){ color = '#FFA500' } else if (type == 'Terminator'){ color = '#FF0000' } else{ color = '#B2ABF4' } json.children[i].data.$color = color json.children[i].data.length = memoryPlasmid.memoryObjects[memoryObject][item].end - memoryPlasmid.memoryObjects[memoryObject][item].start json.children[i].data.$angularWidth = 1000 json.children[i].data.type = type json.children[i].data.dna = memoryPlasmid.memoryObjects[memoryObject][item].sequence json.children[i].id = i if (memoryPlasmid.memoryObjects[memoryObject][item].description.length > 14){ json.children[i].name = memoryPlasmid.memoryObjects[memoryObject][item].description.substring(0,14) } else{ json.children[i].name = memoryPlasmid.memoryObjects[memoryObject][item].description } i++ } } return json

   //end

}