added beamRate.py for FRIB, added nuclearChart.html
This commit is contained in:
parent
73dedbebd1
commit
63821fc099
35
beamRate.py
Executable file
35
beamRate.py
Executable file
|
@ -0,0 +1,35 @@
|
|||
#!/usr/bin/python3
|
||||
#run as python3 frib_rate.py -1 0
|
||||
#y1 is PAC2
|
||||
#y is ultimate
|
||||
|
||||
import ssl
|
||||
ssl._create_default_https_context = ssl._create_unverified_context
|
||||
|
||||
import sys
|
||||
import urllib.request
|
||||
|
||||
import cgi, cgitb
|
||||
|
||||
form = cgi.FieldStorage()
|
||||
A=form.getvalue('A')
|
||||
Z=form.getvalue('Z')
|
||||
I=form.getvalue('I')
|
||||
|
||||
print( "Content-type:text/html\r\n\r\n")
|
||||
|
||||
#print("==== requesting FRIB rate for A = %s, Z = %s " % (A, Z))
|
||||
|
||||
url = "https://groups.nscl.msu.edu/frib/rates/source/frib_yieldY.php?a="+A + "&z=" + Z + "&y=y"
|
||||
|
||||
fp = urllib.request.urlopen(url)
|
||||
|
||||
list = fp.read().decode("utf8").split(",")
|
||||
|
||||
#for haha in list:
|
||||
# print(haha)
|
||||
|
||||
print(list[5])
|
||||
|
||||
|
||||
|
|
@ -75,6 +75,7 @@
|
|||
<td><Input type="text" style="width:60px" value="0" id="beamEx" enterkeyhint="done"/></td>
|
||||
<td>MeV</td>
|
||||
<td id='beamSp'></td>
|
||||
<td id="beamYield"></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td style="text-align:right"> Target (a):</td>
|
||||
|
|
|
@ -47,6 +47,7 @@ function deleteRow(){
|
|||
|
||||
var beam = []; //A, Z, Mass, Name, Sn, Sp, Sa
|
||||
var beamMass;
|
||||
var yield;
|
||||
var target= [];
|
||||
var light=[];
|
||||
var heavy=[]; //A, Z, Mass, Name, Sn, Sp, Sa
|
||||
|
@ -110,6 +111,17 @@ var color = ['rgb(31,119,180)', // muted blue
|
|||
'rgb(118,189,34)', // curry yellow-green
|
||||
'rgb(23,190,207)']; // blue-teal
|
||||
|
||||
function GetYield(A,Z){
|
||||
let str = 'beamRate.py?A=' + A + '&Z=' + Z;
|
||||
let client = new XMLHttpRequest();
|
||||
client.onreadystatechange = function() {
|
||||
let haha = client.responseText.split(",");
|
||||
yield = haha[0]
|
||||
}
|
||||
client.open('GET', str, false);
|
||||
client.send();
|
||||
}
|
||||
|
||||
function GetMassFromSym(AZ, id){
|
||||
let str = 'massProxy.py?AZ=' + AZ;
|
||||
|
||||
|
@ -124,6 +136,7 @@ function GetMassFromSym(AZ, id){
|
|||
beam[4] = parseFloat(mass[4]);
|
||||
beam[5] = parseFloat(mass[5]);
|
||||
beam[6] = parseFloat(mass[6]);
|
||||
GetYield(beam[0], beam[1]);
|
||||
}
|
||||
if( id == 1 ){
|
||||
target[0] = parseInt(mass[0]);
|
||||
|
@ -175,6 +188,8 @@ function GetMass(){
|
|||
document.getElementById('heavyName').innerHTML = heavy[3];
|
||||
document.getElementById('heavySp').innerHTML = 'Sn: ' + heavy[4] + ' MeV, Sp: ' + heavy[5] + ' MeV, Sa : ' + heavy[6] + ' MeV';
|
||||
|
||||
//document.getElementById('beamSp').innerHTML = "haah";
|
||||
document.getElementById('beamYield').innerHTML = "FRIB ultimate yield : " + yield + " pps";
|
||||
//document.getElementById('n0').innerHTML = beam[0] + "," + beam[1] + "," + beam[2]
|
||||
//document.getElementById('n1').innerHTML = target[0] + "," + target[1] + "," + target[2]
|
||||
//document.getElementById('n2').innerHTML = light[0] + "," + light[1] + "," + light[2]
|
||||
|
@ -1126,7 +1141,6 @@ function Plot3D(){
|
|||
|
||||
}
|
||||
|
||||
|
||||
GetMass();
|
||||
CalConstants();
|
||||
SetSSType();
|
||||
|
|
16
index.html
16
index.html
|
@ -16,9 +16,9 @@
|
|||
body {
|
||||
font-family: Arial, Helvetica, sans-serif;
|
||||
}
|
||||
table, th, td {
|
||||
//border: 1px solid black;
|
||||
}
|
||||
/* table, th, td { */
|
||||
/* border: 1px solid black; */
|
||||
/* } */
|
||||
table.center{
|
||||
margin-left: auto;
|
||||
margin-right: auto;
|
||||
|
@ -34,7 +34,7 @@
|
|||
float: left;
|
||||
width : var(--navWidth);
|
||||
height: 100vh;
|
||||
//background: #6DB33E;
|
||||
/* background: #6DB33E; */
|
||||
background: #1363A7;
|
||||
padding: 0px;
|
||||
}
|
||||
|
@ -43,7 +43,7 @@
|
|||
padding: 0px;
|
||||
margin-left: var(--navWidth);
|
||||
height : 100vh;
|
||||
//background: #1363A7;
|
||||
/* background: #1363A7; */
|
||||
background: #6DB33E;
|
||||
}
|
||||
a {
|
||||
|
@ -122,6 +122,12 @@
|
|||
<tr>
|
||||
<td style="text-align:right"><a href="instruction.html" target="uploaded">Intructions & Credits</a></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td style="text-align:right">Woods-Saxon (to be done)</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td style="text-align:right"><a href="nuclearChart.html" target="uploaded">Nuclides Chart (to be done)</a></td>
|
||||
</tr>
|
||||
|
||||
<table>
|
||||
|
||||
|
|
33
nuclearChart.html
Normal file
33
nuclearChart.html
Normal file
|
@ -0,0 +1,33 @@
|
|||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<!-- Load the Paper.js library -->
|
||||
<script src="https://cdnjs.cloudflare.com/ajax/libs/paper.js/0.12.17/paper-full.js" type="text/javascript" charset="utf-8"></script>
|
||||
<!-- <script type="text/javascript" src="https://unpkg.com/paper@0.12.0/dist/paper-full.min.js"></script> -->
|
||||
<!-- Define inlined PaperScript associate it with myCanvas -->
|
||||
<!-- <script type="text/paperscript" canvas="beamLine" src="test_paper.js"></script> -->
|
||||
|
||||
|
||||
<style>
|
||||
|
||||
body{
|
||||
background-color : white;
|
||||
}
|
||||
/*canvas{*/
|
||||
/* width: 99%;
|
||||
height:98%; */
|
||||
/* border: 1px solid black; */
|
||||
/*}*/
|
||||
#beamLine{
|
||||
position: absolute;
|
||||
z-index: 0;
|
||||
}
|
||||
|
||||
</style>
|
||||
|
||||
</head>
|
||||
<body>
|
||||
<canvas id="nuclearChart" ></canvas>
|
||||
<script type="text/javascript" src="nuclearChart.js"></script>
|
||||
</body>
|
||||
</html>
|
229
nuclearChart.js
Normal file
229
nuclearChart.js
Normal file
|
@ -0,0 +1,229 @@
|
|||
|
||||
const mp = 938.27208816;
|
||||
const mn = 939.56542052;
|
||||
|
||||
class Isotope {
|
||||
constructor(A, Z, BE, symbol){
|
||||
this.A = A;
|
||||
this.Z = Z;
|
||||
this.N = A - Z;
|
||||
this.BE = BE;
|
||||
this.symbol = symbol;
|
||||
this.mass = Z*mp +this.N*mn - BE*A/1000.;
|
||||
this.stable = false;
|
||||
};
|
||||
Print(){
|
||||
console.log(this.A + this.symbol);
|
||||
};
|
||||
}
|
||||
|
||||
const size = 30; // size of each ele square
|
||||
const maxN = 177;
|
||||
const maxZ = 118;
|
||||
|
||||
const padX = 100;
|
||||
const padY = 100;
|
||||
const startY = size*maxZ;
|
||||
const startX = 0;
|
||||
|
||||
var AllIso = []; // 2D AllIso[N][Z]
|
||||
for( let i = 0; i <= maxN; i++){
|
||||
const row = [];
|
||||
for( let j = 0; j <= maxZ; j++){
|
||||
row.push(new Isotope(NaN, NaN, NaN, NaN, NaN));
|
||||
}
|
||||
AllIso.push(row);
|
||||
}
|
||||
|
||||
function readLocalFile(){
|
||||
var xhr = new XMLHttpRequest();
|
||||
xhr.onreadystatechange = function () {
|
||||
if (xhr.readyState === XMLHttpRequest.DONE) {
|
||||
if (xhr.status === 200) {
|
||||
//console.log(xhr.responseText);
|
||||
let lines = xhr.responseText.split('\n').slice(36);
|
||||
lines.forEach(element => {
|
||||
let z = parseInt(element.substring(11,15));
|
||||
let a = parseInt(element.substring(16,20));
|
||||
let sym = element.substring(20,22).trim();
|
||||
let be = parseFloat(element.substring(56,67).trim());
|
||||
const iso = new Isotope(a, z, be, sym);
|
||||
if( !isNaN(a) && !isNaN(z)) AllIso[a-z][z] = iso;
|
||||
});
|
||||
} else {
|
||||
console.error('Error reading the file:', xhr.statusText);
|
||||
}
|
||||
}
|
||||
};
|
||||
xhr.open('GET', 'Cleopatra/mass20.txt', false);
|
||||
xhr.send();
|
||||
}
|
||||
|
||||
|
||||
|
||||
function makeElement(x,y, A, text, fillColor){
|
||||
var square = new paper.Path.Rectangle({
|
||||
point: [x + size*0.1/2, y + size*0.1/2],
|
||||
size: [size*0.9, size*0.9],
|
||||
fillColor: fillColor, // Filling color of the square
|
||||
//strokeColor: 'black', // Border color of the square
|
||||
//strokeWidth: 1 // Border width of the square
|
||||
});
|
||||
|
||||
// Create a text item inside the square
|
||||
var textItemA = new paper.PointText({
|
||||
point: [x + size / 2 - 2, y + size / 2 + 5], // Center of the square
|
||||
content: A,
|
||||
justification: 'right',
|
||||
fontSize: size * 0.2, // Adjust font size based on the size of the square
|
||||
fillColor: 'black' // Color of the text
|
||||
});
|
||||
|
||||
var textItem = new paper.PointText({
|
||||
point: [x + size / 2 - 2, y + size / 2 + 5], // Center of the square
|
||||
content: text,
|
||||
justification: 'left',
|
||||
fontSize: size * 0.3, // Adjust font size based on the size of the square
|
||||
fillColor: 'black' // Color of the text
|
||||
});
|
||||
|
||||
// Group the square and text together
|
||||
var group = new paper.Group([square, textItem, textItemA]);
|
||||
|
||||
textItemA.position.y -= 5;
|
||||
|
||||
// Add event handlers for mouseenter and mouseleave events
|
||||
group.onMouseEnter = function (event) {
|
||||
square.fillColor = 'orange'; // Change the filling color when hovering over
|
||||
};
|
||||
|
||||
group.onMouseLeave = function (event) {
|
||||
square.fillColor = fillColor; // Restore the original filling color when the mouse leaves
|
||||
};
|
||||
|
||||
return group; // Return the group containing the square and text
|
||||
}
|
||||
|
||||
function checkBounded(num1, num2, num3) {
|
||||
const numbers = [num1, num2, num3];
|
||||
|
||||
let countNaN = 0;
|
||||
for (const num of numbers) {
|
||||
if(!isNaN(num) && num < 0) {
|
||||
return false;
|
||||
}else{
|
||||
countNaN ++;
|
||||
}
|
||||
}
|
||||
if( countNaN == 3) {
|
||||
return true;
|
||||
}else{
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
//####################################
|
||||
window.onload = function(){
|
||||
|
||||
paper.setup('nuclearChart');
|
||||
const project = paper.project;
|
||||
|
||||
project.view.viewSize = new paper.Size( maxN * size + padX*2, maxZ*size + padY*2);
|
||||
|
||||
readLocalFile();
|
||||
|
||||
for( let i = 0; i <= maxN; i++){
|
||||
for( let j = 0; j <= maxZ; j++){
|
||||
let iso = AllIso[i][j];
|
||||
if( !isNaN(iso.A) ){
|
||||
// iso.Print();
|
||||
|
||||
let Sp = NaN;
|
||||
let Sn = NaN;
|
||||
let Sa = NaN;
|
||||
|
||||
if( j > 1) Sp = AllIso[i][j-1].mass + mp - iso.mass;
|
||||
if( i > 1) Sn = AllIso[i-1][j].mass + mn - iso.mass;
|
||||
if( i > 2 && j > 2) Sa = AllIso[i-2][j-2].mass + AllIso[2][2].mass - iso.mass;
|
||||
|
||||
//if( iso.Z > 55 && iso.N >= 82 ) console.log( iso.A + iso.symbol + " | " + Sp + "," + Sn + "," + Sa);
|
||||
if( checkBounded(Sp, Sn, 1) ){
|
||||
let Qbm = NaN;
|
||||
let Qbp = NaN;
|
||||
let Qec = NaN;
|
||||
|
||||
if( i > 0 && j < maxZ ) Qbm = iso.mass - AllIso[i-1][j+1].mass - 0.511;
|
||||
if( j > 0 && i < maxN ) Qbp = iso.mass - AllIso[i+1][j-1].mass - 0.511;
|
||||
if( j > 0 && i < maxN ) Qec = iso.mass - AllIso[i+1][j-1].mass + 0.511;
|
||||
|
||||
//if( iso.Z > 55 && iso.N >= 82 )console.log( iso.A + iso.symbol + " | " + iso.mass + " | " + Qbm + "," + Qbp + "," + Qec);
|
||||
if( Qbm > 0 || Qbp > 0 || Qec > 0 || (iso.Z > 83 && Sa < 0 ) || (iso.Z < 20 && Sa < 0 ) ){
|
||||
makeElement(startX + i * size + padX, startY - j*size + padY, AllIso[i][j].A, AllIso[i][j].symbol, 'white');
|
||||
}else{
|
||||
makeElement(startX + i * size + padX, startY - j*size + padY, AllIso[i][j].A, AllIso[i][j].symbol, 'grey');
|
||||
}
|
||||
|
||||
}else{
|
||||
makeElement(startX + i * size + padX, startY - j*size + padY, AllIso[i][j].A, AllIso[i][j].symbol, 'white');
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//Draw magic line
|
||||
var magic = [2, 8, 20, 28, 40, 50, 82, 126];
|
||||
for( let i = 0; i < 8; i++){
|
||||
let haha1 = new paper.Path();
|
||||
haha1.strokeColor = 'black';
|
||||
haha1.strokeWidth = 1;
|
||||
|
||||
let minY = maxZ;
|
||||
let maxY = 0;
|
||||
for( let Z = 0; Z < maxZ; Z ++){
|
||||
if( AllIso[magic[i]][Z].A > 0 ){
|
||||
if( minY > Z) minY = Z;
|
||||
if( maxY < Z) maxY = Z;
|
||||
}
|
||||
}
|
||||
minY -= 1;
|
||||
|
||||
haha1.moveTo(new paper.Point(startX + padX + magic[i]*size, startY - minY*size + padY));
|
||||
haha1.lineTo(new paper.Point(startX + padX + magic[i]*size, startY - maxY*size + padY));
|
||||
|
||||
let haha2 = new paper.Path();
|
||||
haha2.strokeColor = 'black';
|
||||
haha2.strokeWidth = 1;
|
||||
haha2.moveTo(new paper.Point(startX + padX + (magic[i]+1)*size, startY - minY*size + padY));
|
||||
haha2.lineTo(new paper.Point(startX + padX + (magic[i]+1)*size, startY - maxY*size + padY));
|
||||
|
||||
let minX = maxN;
|
||||
let maxX = 0;
|
||||
for( let N = 0; N < maxN; N ++){
|
||||
if( AllIso[N][magic[i]].A > 0 ){
|
||||
if( minX > N) minX = N;
|
||||
if( maxX < N) maxX = N;
|
||||
}
|
||||
}
|
||||
maxX += 1;
|
||||
|
||||
let haha3 = new paper.Path();
|
||||
haha3.strokeColor = 'black';
|
||||
haha3.strokeWidth = 1;
|
||||
haha3.moveTo(new paper.Point( startX + minX*size + padX, padY + startY - (magic[i]-1)*size));
|
||||
haha3.lineTo(new paper.Point( startX + maxX*size + padX, padY + startY - (magic[i]-1)*size));
|
||||
|
||||
let haha4 = new paper.Path();
|
||||
haha4.strokeColor = 'black';
|
||||
haha4.strokeWidth = 1;
|
||||
haha4.moveTo(new paper.Point( startX + minX*size + padX, padY + startY - (magic[i])*size));
|
||||
haha4.lineTo(new paper.Point( startX + maxX*size + padX, padY + startY - (magic[i])*size));
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
paper.view.draw();
|
||||
}
|
Loading…
Reference in New Issue
Block a user