<div id='myDiv'></div>
<script>
function potential(r, lr, la, Cr, Ca, cutoff) {
var exp_r = r/lr;
var exp_a = r/la;
if (r > cutoff) {
return 0;
} else {
return Cr * Math.exp(-exp_r) - Ca * Math.exp(-exp_a);
}
}
function generate_data(x, lr, la, Cr, Ca, cutoff) {
var y = [];
x.forEach((xi, i) => {
y[i] = potential(xi, lr, la, Cr, Ca, cutoff);
});
return y;
}
var lr = 1.0;
var la = 2.0;
var Cr = 1.5;
var Ca = 1.0;
var cutoff = 6.0;
function calculate_radius(lr, la, Cr, Ca) {
return - lr*la/(lr - la) * Math.log(Cr*la/(Ca*lr));
}
var radius = calculate_radius(lr, la, Cr, Ca);
var n_samples = 200;
var x = [...Array(n_samples).keys()].map((s) => 5*la*s/(n_samples));
var y = generate_data(x, lr, la, Cr, Ca, cutoff);
var data_la = [1.5, 1.75, 2.0, 2.25, 2.5];
var sliderSteps = [];
for (i=0; i<data_la.length; i++) {
var la_new = data_la[i];
var la_new_name = la_new.toFixed(2);
var y_new = generate_data(x, lr, la_new, Cr, Ca, cutoff);
var radius_new = calculate_radius(lr, la_new, Cr, Ca);
var sliderstep = {
label: la_new_name,
method: 'animate',
args: [
{
data: [{x: x, y: y_new}],
mode: 'immediate',
layout: {
xaxis: {
tickvals: [0, radius_new, cutoff],
ticktext: ['0', 'R', 'cutoff'],
},
yaxis: {
color: "#FFF",
range: [-0.3*Ca, 1.1*(Cr - Ca)],
tickvals: [potential(radius, lr, la_new, Cr, Ca, cutoff), 0, Cr - Ca],
ticktext: ['V(R)', '0', 'C<sub>r</sub> - C<sub>a</sub>'],
},
},
},
],
};
sliderSteps.push(sliderstep);
}
var initial_step = 2;
console.log(sliderSteps);
var layout = {
xaxis: sliderSteps[initial_step]["args"][0]["layout"]["xaxis"],
yaxis: sliderSteps[initial_step]["args"][0]["layout"]["yaxis"],
title: "Morse Potential",
plot_bgcolor:"#FFF4",
paper_bgcolor:"#505050",
font: {
color: "#FFF",
},
margin: {
t: 60,
b: 60,
l: 60,
r: 60,
},
sliders: [{
pad: {1: 130, t:55},
currentvalue: {
visible: true,
prefix: 'Ratio interaction range to radius: ',
xanchor: 'right',
font: {size: 20, color: '#FFF'},
},
transition: {duration: 500},
steps: sliderSteps,
active: initial_step,
}],
};
var options = {staticPlot: true};
Plotly.newPlot('myDiv', {
data: [{
x: x,
y: y,
type: 'scatter',
line: {
color: "#FDBF35",
},
}],
layout: layout,
options: options,
});
</script>