// JavaScript Document
function init() //确保执行一次 { document.getElementById("barchart1").innerHTML="Loading..."; PSET=new Pset(1,1,1,1,1); NSET=new Nset(1,1); CCa=0; CCb=0; MA=25; MB=55; Bars=new Array(); lBars=new Array(); MLimit=300; dataready=0; uselog=0; UpdateData(); GenerateChart(); }
var f = [1, 2, 6, 24, 120, 720, 5040, 40320, 362880, 3628800, 39916800, 479001600, 6227020800, 87178291200, 1307674368000, 20922789888000, 355687428096000, 6402373705728000, 121645100408832000, 2432902008176640000, 51090942171709440000, 1124000727777607680000, 25852016738884976640000, 620448401733239439360000, 15511210043330985984000000, 403291461126605635584000000, 10888869450418352160768000000, 304888344611713860501504000000, 8841761993739701954543616000000, 265252859812191058636308480000000, 8222838654177922817725562880000000, 263130836933693530167218012160000000, 8683317618811886495518194401280000000, 295232799039604140847618609643520000000, 10333147966386144929666651337523200000000, 371993326789901217467999448150835200000000, 13763753091226345046315979581580902400000000, 523022617466601111760007224100074291200000000, 20397882081197443358640281739902897356800000000, 815915283247897734345611269596115894272000000000, 33452526613163807108170062053440751665152000000000, 1405006117752879898543142606244511569936384000000000, 60415263063373835637355132068513997507264512000000000, 2658271574788448768043625811014615890319638528000000000, 119622220865480194561963161495657715064383733760000000000, 5502622159812088949850305428800254892961651752960000000000, 258623241511168180642964355153611979969197632389120000000000, 12413915592536072670862289047373375038521486354677760000000000, 608281864034267560872252163321295376887552831379210240000000000, 30414093201713378043612608166064768844377641568960512000000000000, 1551118753287382280224243016469303211063259720016986112000000000000, 80658175170943878571660636856403766975289505440883277824000000000000, 4274883284060025564298013753389399649690343788366813724672000000000000, 230843697339241380472092742683027581083278564571807941132288000000000000, 12696403353658275925965100847566516959580321051449436762275840000000000000, 710998587804863451854045647463724949736497978881168458687447040000000000000, 40526919504877216755680601905432322134980384796226602145184481280000000000000, 2350561331282878571829474910515074683828862318181142924420699914240000000000000, 138683118545689835737939019720389406345902876772687432540821294940160000000000000, 8320987112741390144276341183223364380754172606361245952449277696409600000000000000, 507580213877224798800856812176625227226004528988036003099405939480985600000000000000, 31469973260387937525653122354950764088012280797258232192163168247821107200000000000000, 1982608315404440064116146708361898137544773690227268628106279599612729753600000000000000, 126886932185884164103433389335161480802865516174545192198801894375214704230400000000000000, 8247650592082470666723170306785496252186258551345437492922123134388955774976000000000000000, 544344939077443064003729240247842752644293064388798874532860126869671081148416000000000000000, 36471110918188685288249859096605464427167635314049524593701628500267962436943872000000000000000, 2480035542436830599600990418569171581047399201355367672371710738018221445712183296000000000000000, 171122452428141311372468338881272839092270544893520369393648040923257279754140647424000000000000000, 11978571669969891796072783721689098736458938142546425857555362864628009582789845319680000000000000000, 850478588567862317521167644239926010288584608120796235886430763388588680378079017697280000000000000000, 61234458376886086861524070385274672740778091784697328983823014963978384987221689274204160000000000000000, 4470115461512684340891257138125051110076800700282905015819080092370422104067183317016903680000000000000000, 330788544151938641225953028221253782145683251820934971170611926835411235700971565459250872320000000000000000, 24809140811395398091946477116594033660926243886570122837795894512655842677572867409443815424000000000000000000, 1885494701666050254987932260861146558230394535379329335672487982961844043495537923117729972224000000000000000000, 145183092028285869634070784086308284983740379224208358846781574688061991349156420080065207861248000000000000000000, 11324281178206297831457521158732046228731749579488251990048962825668835325234200766245086213177344000000000000000000, 894618213078297528685144171539831652069808216779571907213868063227837990693501860533361810841010176000000000000000000, 71569457046263802294811533723186532165584657342365752577109445058227039255480148842668944867280814080000000000000000000, 5797126020747367985879734231578109105412357244731625958745865049716390179693892056256184534249745940480000000000000000000, 475364333701284174842138206989404946643813294067993328617160934076743994734899148613007131808479167119360000000000000000000, 39455239697206586511897471180120610571436503407643446275224357528369751562996629334879591940103770870906880000000000000000000, 3314240134565353266999387579130131288000666286242049487118846032383059131291716864129885722968716753156177920000000000000000000, 281710411438055027694947944226061159480056634330574206405101912752560026159795933451040286452340924018275123200000000000000000000, 24227095383672732381765523203441259715284870552429381750838764496720162249742450276789464634901319465571660595200000000000000000000, 2107757298379527717213600518699389595229783738061356212322972511214654115727593174080683423236414793504734471782400000000000000000000, 185482642257398439114796845645546284380220968949399346684421580986889562184028199319100141244804501828416633516851200000000000000000000, 16507955160908461081216919262453619309839666236496541854913520707833171034378509739399912570787600662729080382999756800000000000000000000, 1485715964481761497309522733620825737885569961284688766942216863704985393094065876545992131370884059645617234469978112000000000000000000000, 135200152767840296255166568759495142147586866476906677791741734597153670771559994765685283954750449427751168336768008192000000000000000000000, 12438414054641307255475324325873553077577991715875414356840239582938137710983519518443046123837041347353107486982656753664000000000000000000000, 1156772507081641574759205162306240436214753229576413535186142281213246807121467315215203289516844845303838996289387078090752000000000000000000000, 108736615665674308027365285256786601004186803580182872307497374434045199869417927630229109214583415458560865651202385340530688000000000000000000000, 10329978488239059262599702099394727095397746340117372869212250571234293987594703124871765375385424468563282236864226607350415360000000000000000000000, 991677934870949689209571401541893801158183648651267795444376054838492222809091499987689476037000748982075094738965754305639874560000000000000000000000, 96192759682482119853328425949563698712343813919172976158104477319333745612481875498805879175589072651261284189679678167647067832320000000000000000000000, 9426890448883247745626185743057242473809693764078951663494238777294707070023223798882976159207729119823605850588608460429412647567360000000000000000000000, 933262154439441526816992388562667004907159682643816214685929638952175999932299156089414639761565182862536979208272237582511852109168640000000000000000000000, 93326215443944152681699238856266700490715968264381621468592963895217599993229915608941463976156518286253697920827223758251185210916864000000000000000000000000 ]; function factorial (n) {
if (n == 0 || n == 1) return 1; if (f[n] > 0) return f[n]; else return f[n] = factorial(n-1) * n;
}
function num2e(num,fix){ if (num==0) return 0;
var p = Math.floor(Math.log(num)/Math.LN10); var n = num * Math.pow(10, -p);
if ((p>-2)&(p<3)) return num.toFixed(fix); return n.toFixed(fix) + 'e' + p; }
function Num(Ca,Cb,Ps,Ns) // how much mol/L of Ca,Cb { //only a function var Pa=Ps.Pf*0.5*(Ns.Na*Ps.fa+Ns.Nb*Ps.fb)/(Ns.Na*Ps.fa); var Pb=Ps.Pf*0.5*(Ns.Na*Ps.fa+Ns.Nb*Ps.fb)/(Ns.Nb*Ps.fb); var Pa1=Pa*Ps.Pa_;var Pb1=Pb*Ps.Pb_; if (Pa1>1) Pa1=1; if (Pb1>1) Pb1=1; var fa=Ps.fa, fb=Ps.fb;
var Res=Ps.Pf*0.5*(Ns.Na*fa+Ns.Nb*fb)*Math.pow(Pa1,Cb-1)*Math.pow(Pb1,Ca-1)*Math.pow(1-Pa1,Ca*(fa-1)-Cb+1)*Math.pow(1-Pb1,Cb*(fb-1)-Ca+1) *factorial(Ca*fa-Ca)*factorial(Cb*fb-Cb)/factorial(Ca*fa-Ca-Cb+1)/factorial(Cb*fb-Ca-Cb+1)/factorial(Ca)/factorial(Cb);
return Res; }
function test()
{
document.getElementById("OU_Pc").innerHTML=factorial(30);
}
function Pset(pf,pb_,pa_,fa,fb) { this.Pf=pf; this.Pa_=pa_;//Pa*pa_ = Pa' this.Pb_=pb_; this.fa=fa; this.fb=fb; return this; }
function Nset(Na,Nb) { this.Na=Na; this.Nb=Nb; return this; }
function r1() {
}
function UpdateData() {
MA=parseFloat(document.getElementById("IN_MA").value);
if (MA<0) MA=0;
document.getElementById("IN_MA").value=MA.toFixed(2);
MB=parseFloat(document.getElementById("IN_MB").value); if (MB<0) MB=0; document.getElementById("IN_MB").value=MB.toFixed(2);
var mbig=MA; if (MB>MA) mbig=MB; MLimit=parseFloat(document.getElementById("IN_MLimit").value) if (MLimit<mbig) MLimit=mbig; if (MLimit>mbig*50) MLimit=mbig*50; document.getElementById("IN_MLimit").value=MLimit.toFixed(2);
PSET.fa=parseInt(document.getElementById("IN_fa").value); PSET.fb=parseInt(document.getElementById("IN_fb").value); if (PSET.fa<1) PSET.fa=1; if (PSET.fb<1) PSET.fb=1; if (PSET.fa>10) PSET.fa=10; if (PSET.fb>10) PSET.fb=10; document.getElementById("IN_fb").value=PSET.fb; document.getElementById("IN_fa").value=PSET.fa;
PSET.Pa_=parseFloat(document.getElementById("IN_Pa_").value); if (PSET.Pa_<0) PSET.Pa_=0; document.getElementById("IN_Pa_").value=num2e(PSET.Pa_,3);
PSET.Pb_=parseFloat(document.getElementById("IN_Pb_").value); if (PSET.Pb_<0) PSET.Pb_=0; document.getElementById("IN_Pb_").value=num2e(PSET.Pb_,3);
NSET.Na=parseFloat(document.getElementById("IN_Na").value); if (NSET.Na<0) NSET.Na=0; document.getElementById("IN_Na").value=num2e(NSET.Na,3);
NSET.Nb=parseFloat(document.getElementById("IN_Nb").value); if (NSET.Nb<0) NSET.Nb=0; document.getElementById("IN_Nb").value=num2e(NSET.Nb,3);
Kd=parseFloat(document.getElementById("IN_Kd").value); if (Kd<0) Kd=0; document.getElementById("IN_Kd").value=num2e(Kd,2);
/*
PSET.Pf=parseFloat(document.getElementById("IN_Pf").value);
if (PSET.Pf<0) PSET.Pf=0;
if (PSET.Pf>1) PSET.Pf=1;
*/
//you need to get Pc now Pc=2*Math.sqrt(NSET.Na*NSET.Nb*PSET.fa*PSET.fb/(PSET.fa-1)/(PSET.fb-1))/(NSET.Na*PSET.fa+NSET.Nb*PSET.fb); if (Pc!=NaN) { document.getElementById("OU_Pc").innerHTML="Pc = "+Pc.toFixed(3)+" ;"; } else { document.getElementById("OU_Pc").innerHTML=" Pc = - ;"; } // Then Pf as a out var alfun=NSET.Na*PSET.fa+NSET.Nb*PSET.fb; PSET.Pf=1+Kd/(alfun)-Math.sqrt((Kd+alfun)*(Kd+alfun)-4*NSET.Na*NSET.Nb*PSET.fa*PSET.fb)/alfun; if (PSET.Pf>1) PSET.Pf=1; document.getElementById("IN_Pf").value=num2e(PSET.Pf,3);
document.getElementById("OU_Pfc").innerHTML="Pf/Pc = "+(PSET.Pf/Pc).toFixed(3)+" ;"; if (PSET.Pf>=Pc) document.getElementById("OU_Pfc").style.color='#5C9085'; else document.getElementById("OU_Pfc").style.color='#000000';
}
function UpdateData2() { PSET.Pf=parseFloat(document.getElementById("IN_Pf").value); if (PSET.Pf<0) PSET.Pf=0; if (PSET.Pf>1) PSET.Pf=1; document.getElementById("IN_Pf").value=num2e(PSET.Pf,3);
var x=PSET.Pf*(NSET.Na*PSET.fa+NSET.Nb*PSET.fb)/2; Kd=(NSET.Na*PSET.fa-x)*(NSET.Nb*PSET.fb-x)/x; document.getElementById("IN_Kd").value=num2e(Kd,2);
//you need to get Pc now
Pc=2*Math.sqrt(NSET.Na*NSET.Nb*PSET.fa*PSET.fb/(PSET.fa-1)/(PSET.fb-1))/(NSET.Na*PSET.fa+NSET.Nb*PSET.fb);
if (Pc!=NaN)
{
document.getElementById("OU_Pc").innerHTML="Pc = "+Pc.toFixed(3)+" ;";
}
else
{
document.getElementById("OU_Pc").innerHTML=" Pc = - ;";
}
// Then Pf as a out
var alfun=NSET.Na*PSET.fa+NSET.Nb*PSET.fb;
PSET.Pf=1+Kd/(alfun)-Math.sqrt((Kd+alfun)*(Kd+alfun)-4*NSET.Na*NSET.Nb*PSET.fa*PSET.fb)/alfun;
if (PSET.Pf>1) PSET.Pf=1;
document.getElementById("IN_Pf").value=num2e(PSET.Pf,3);
document.getElementById("OU_Pfc").innerHTML="Pf/Pc = "+(PSET.Pf/Pc).toFixed(3)+" ;"; if (PSET.Pf>=Pc) document.getElementById("OU_Pfc").style.color='#5C9085'; else document.getElementById("OU_Pfc").style.color='#000000'; }
function Cal() { //checkfirst if (!isFinite(PSET.fa*PSET.fb*PSET.Pa_*PSET.Pb_*PSET.Pf*NSET.Na*NSET.Nb*CCa*CCb*MA*MB)) return;
Bars=null;
Bars=new Array();
lBars=null;
lBars=new Array();
dataready=0;
CCa=Math.floor((MLimit/MA)+1);
CCb=Math.floor((MLimit/MB)+1);
TotalMass=MA*NSET.Na+MB*NSET.Nb;
var tag=0; for (var i=0;i<CCa;i++) { for (var j=0;j<CCb;j++) { if ((i+j)==0) {continue;} if (i-1>(j*PSET.fb-j)) {continue;} if (j-1>(i*PSET.fa-i)) {continue;} if (MA*i+MB*j>MLimit) {continue;} Bars[tag]= [ MA*i+MB*j, (MA*i+MB*j)*Num(i,j,PSET,NSET)/TotalMass ]; tag++; } } if (MA<MB) { var tp=Bars[1]; Bars[1]=Bars[0]; Bars[0]=tp; } tag--; A=(Bars[tag][0]-Bars[0][0])/(Math.log(Bars[tag][0])-Math.log(Bars[0][0])); B=Bars[tag][0]-A*Math.log(Bars[tag][0]);// newpos=Alog(old)+B
tag++; for (var i=0;i<tag;i++) { lBars[i]= [ A*Math.log(Bars[i][0])+B, Bars[i][1] ]; }
dataready=1; }
function Draw2() { if (dataready==0) return; $('#barchart1').highcharts({
chart: { type: 'column',
zoomType: 'y'
},
credits: { enabled:false },
title: { text: 'Theoretical Molecular Weight Distribution',
style: { color:'#333333', fontSize: '25px' }
},
yAxis: {
title: { text:"Weight Fraction", style: { color:'#333333', fontSize: '20px' } }, labels: { formatter:function() { return (this.value*100).toFixed(1)+"%";
},
style: { color:'#333333', fontSize: '20px' } }
},
xAxis: { title: { text:"Molecular Weight(kDa)", style: { color:'#333333', fontSize: '20px' } }, labels: { formatter:function() { return Math.exp((this.value-B)/A).toFixed(2);
},
style: { color:'#333333', fontSize: '20px' } }
}, legend: { enabled: 0 },
plotOptions: {
series: { color: '#5C9085' }
},
tooltip:
{ shared: true,
useHTML: true, formatter: function ()
{
return "W: "+(Math.exp((this.x-B)/A)).toFixed(2)+'</br>'+"D: "+this.y;
}
},
series: [{ data: lBars,
pointPadding:0.3, animation:0,
},] });
}
function Draw1() { if (dataready==0) return; $('#barchart1').highcharts({
chart: { type: 'column',
zoomType: 'y'
},
credits: { enabled:false },
title: { text: 'Theoretical Molecular Weight Distribution',
style: { color:'#333333', fontSize: '25px' }
},
yAxis: {
title: { text:"Weight Fraction", style: { color:'#333333', fontSize: '20px' } }, labels: { formatter:function() { return (this.value*100).toFixed(1)+"%";
},
style: { color:'#333333', fontSize: '20px' } }
},
xAxis: { title: { text:"Molecular Weight(kDa)", style: { color:'#333333', fontSize: '20px' } }, labels: { formatter:function() { return this.value;
},
style: { color:'#333333', fontSize: '20px' } }
}, legend: { enabled: 0 },
plotOptions: {
series: { color: '#72AEA1' }
},
tooltip:
{ shared: true,
useHTML: true, formatter: function ()
{
return "W: "+(this.x).toFixed(2)+'<b></br>'+"D: "+this.y;
}
}, series: [{ data: Bars,
pointPadding:0.3, animation:0,
},] });
}
function GenerateChart() { //var f=new Array([1,9],[3,4],[5,8]);
if (!isFinite(PSET.fa*PSET.fb*PSET.Pa_*PSET.Pb_*PSET.Pf*NSET.Na*NSET.Nb*CCa*CCb*MA*MB)) {alert("Invalid Parameter!");return;}
Cal(); if (uselog==0) Draw1(); else Draw2(); }
function ChangeLog(btn) { if (uselog==0) { uselog=1; btn.innerHTML="Linear Coordinate"; if (dataready) Draw2(); } else { uselog=0; btn.innerHTML="Logarithmic Coordinate"; if (dataready) Draw1(); } }