added WebSimHelper, need to combine the simpleSim to heliosmatics.html
3
.gitignore
vendored
|
@ -15,6 +15,7 @@ root_data
|
|||
*.in
|
||||
*.out
|
||||
*.txt
|
||||
*.csv
|
||||
|
||||
Cleopatra/ExtractXSec
|
||||
Cleopatra/ExtractXSecFromText
|
||||
|
@ -26,3 +27,5 @@ Cleopatra/PlotSimulation
|
|||
Cleopatra/PlotTGraphTObjArray
|
||||
Cleopatra/SimAlpha
|
||||
Cleopatra/SimTransfer
|
||||
|
||||
__pycache__
|
|
@ -20,9 +20,8 @@
|
|||
#include "constant.h" // amu
|
||||
#include <stdlib.h> //atoi
|
||||
#include <algorithm>
|
||||
using namespace std;
|
||||
|
||||
string massData="/Cleopatra/mass20.txt";
|
||||
std::string massData="../Cleopatra/mass20.txt";
|
||||
|
||||
// about the mass**.txt
|
||||
// Mass Excess = (ATOMIC MASS - A)*amu | e.g. n : (1.088664.91585E-6-1)*amu
|
||||
|
@ -34,15 +33,17 @@ class Isotope {
|
|||
public:
|
||||
int A, Z;
|
||||
double Mass, MassError, BEA;
|
||||
string Name, Symbol;
|
||||
string dataSource;
|
||||
std::string Name, Symbol;
|
||||
std::string dataSource;
|
||||
|
||||
Isotope(){findHeliosPath();};
|
||||
Isotope(int a, int z){ findHeliosPath();SetIso(a,z); };
|
||||
Isotope(string name){ findHeliosPath(); SetIsoByName(name); };
|
||||
Isotope(){dataSource = massData;};
|
||||
Isotope(int a, int z){ dataSource = massData; SetIso(a,z); };
|
||||
Isotope(std::string name){ dataSource = massData; SetIsoByName(name); };
|
||||
|
||||
void SetMassTablePath(std::string path){ dataSource = path;}
|
||||
|
||||
void SetIso(int a, int z);
|
||||
void SetIsoByName(string name);
|
||||
void SetIsoByName(std::string name);
|
||||
|
||||
double CalSp(int Np, int Nn); // this for the Np-proton, Nn-neutron removal
|
||||
double CalSp2(int a, int z); // this is for (a,z) nucleus removal
|
||||
|
@ -59,10 +60,10 @@ public:
|
|||
|
||||
private:
|
||||
void FindMassByAZ(int a, int z); // give mass, massError, BEA, Name, Symbol;
|
||||
void FindMassByName(string name); // give Z, mass, massError, BEA;
|
||||
void FindMassByName(std::string name); // give Z, mass, massError, BEA;
|
||||
|
||||
int TwoJ(int nShell);
|
||||
string Orbital(int nShell);
|
||||
std::string Orbital(int nShell);
|
||||
int magic(int i){
|
||||
switch (i){
|
||||
case 0: return 2; break;
|
||||
|
@ -109,22 +110,8 @@ private:
|
|||
lineMass200 = 2774;
|
||||
}
|
||||
|
||||
char * heliosPath;
|
||||
bool isFindOnce;
|
||||
|
||||
void findHeliosPath(){
|
||||
heliosPath = getenv("HELIOSSYS");
|
||||
if( heliosPath ){
|
||||
dataSource = heliosPath;
|
||||
dataSource += "/analysis" + massData;
|
||||
}else{
|
||||
dataSource = ".." + massData;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
};
|
||||
|
||||
void Isotope::SetIso(int a, int z){
|
||||
|
@ -133,16 +120,16 @@ void Isotope::SetIso(int a, int z){
|
|||
FindMassByAZ(a,z);
|
||||
}
|
||||
|
||||
void Isotope::SetIsoByName(string name){
|
||||
void Isotope::SetIsoByName(std::string name){
|
||||
FindMassByName(name);
|
||||
}
|
||||
|
||||
void Isotope::FindMassByAZ(int A, int Z){
|
||||
string line;
|
||||
std::string line;
|
||||
int lineNum=0;
|
||||
int list_A, list_Z;
|
||||
|
||||
ifstream myfile;
|
||||
std::ifstream myfile;
|
||||
int flag=0;
|
||||
|
||||
setFileLines();
|
||||
|
@ -171,11 +158,11 @@ void Isotope::FindMassByAZ(int A, int Z){
|
|||
this->BEA = atof((line.substr(54,11)).c_str());
|
||||
this->Mass = list_Z*mp + (list_A-list_Z)*mn - this->BEA/1000*list_A;
|
||||
this->MassError = atof((line.substr(65,7)).c_str());
|
||||
string str = line.substr(20,2);
|
||||
std::string str = line.substr(20,2);
|
||||
str.erase(remove(str.begin(), str.end(), ' '), str.end());
|
||||
this->Symbol = str;
|
||||
|
||||
ostringstream ss;
|
||||
std::ostringstream ss;
|
||||
ss << A << this->Symbol;
|
||||
this->Name = ss.str();
|
||||
flag = 1;
|
||||
|
@ -202,7 +189,7 @@ void Isotope::FindMassByAZ(int A, int Z){
|
|||
}
|
||||
}
|
||||
|
||||
void Isotope::FindMassByName(string name){
|
||||
void Isotope::FindMassByName(std::string name){
|
||||
|
||||
// done seperate the Mass number and the name
|
||||
if( name == "n" ) {
|
||||
|
@ -220,7 +207,7 @@ void Isotope::FindMassByName(string name){
|
|||
if( name == "t" ) name = "3H";
|
||||
if( name == "a" ) name = "4He";
|
||||
|
||||
string temp = name;
|
||||
std::string temp = name;
|
||||
int lastDigit = 0;
|
||||
|
||||
for(int i=0; temp[i]; i++){
|
||||
|
@ -251,12 +238,12 @@ void Isotope::FindMassByName(string name){
|
|||
//printf(" Symbol = |%s| , Mass = %d\n", this->Symbol.c_str(), this->A);
|
||||
|
||||
// find the nucleus in the data
|
||||
string line;
|
||||
std::string line;
|
||||
int lineNum=0;
|
||||
int list_A;
|
||||
string list_symbol;
|
||||
std::string list_symbol;
|
||||
|
||||
ifstream myfile;
|
||||
std::ifstream myfile;
|
||||
int flag=0;
|
||||
|
||||
setFileLines();
|
||||
|
@ -289,11 +276,11 @@ void Isotope::FindMassByName(string name){
|
|||
this->Mass = this->Z*mp + (list_A-this->Z)*mn - this->BEA/1000*list_A;
|
||||
this->MassError = atof((line.substr(65,7)).c_str());
|
||||
|
||||
string str = line.substr(20,2);
|
||||
std::string str = line.substr(20,2);
|
||||
str.erase(remove(str.begin(), str.end(), ' '), str.end());
|
||||
this->Symbol = str;
|
||||
|
||||
ostringstream ss;
|
||||
std::ostringstream ss;
|
||||
ss << this->A << this->Symbol;
|
||||
this->Name = ss.str();
|
||||
flag = 1;
|
||||
|
@ -372,7 +359,7 @@ int Isotope::TwoJ(int nShell){
|
|||
return 0;
|
||||
}
|
||||
|
||||
string Isotope::Orbital(int nShell){
|
||||
std::string Isotope::Orbital(int nShell){
|
||||
|
||||
switch(nShell){
|
||||
case 0: return "0s1 "; break; //
|
||||
|
@ -416,7 +403,7 @@ void Isotope::ListShell(){
|
|||
int n = A-Z;
|
||||
int p = Z;
|
||||
|
||||
int k = min(n,p);
|
||||
int k = std::min(n,p);
|
||||
int nMagic = 0;
|
||||
for( int i = 0; i < 7; i++){
|
||||
if( magic(i) < k && k <= magic(i+1) ){
|
||||
|
@ -434,7 +421,7 @@ void Isotope::ListShell(){
|
|||
|
||||
printf("------------------ Core:%3s, inner Core:%3s \n", (core2.Name).c_str(), (core1.Name).c_str());
|
||||
printf(" || ");
|
||||
int t = max(n,p);
|
||||
int t = std::max(n,p);
|
||||
int nShell = 0;
|
||||
do{
|
||||
int occ = TwoJ(nShell)+1;
|
||||
|
@ -512,8 +499,6 @@ void Isotope::Print(){
|
|||
|
||||
if (Mass > 0){
|
||||
|
||||
findHeliosPath();
|
||||
|
||||
printf(" using mass data : %s \n", dataSource.c_str());
|
||||
printf(" mass of \e[47m\e[31m%s\e[m nucleus (Z,A)=(%3d,%3d) is \e[47m\e[31m%12.5f\e[m MeV, BE/A=%7.5f MeV\n", Name.c_str(), Z, A, Mass, BEA/1000.);
|
||||
printf(" total BE : %12.5f MeV\n",BEA*A/1000.);
|
||||
|
|
|
@ -22,7 +22,7 @@
|
|||
class TransferReaction {
|
||||
public:
|
||||
TransferReaction(){Inititization();};
|
||||
TransferReaction(string configFile, unsigned short ID = 0);
|
||||
TransferReaction(std::string configFile, unsigned short ID = 0);
|
||||
TransferReaction(int beamA, int beamZ,
|
||||
int targetA, int targetZ,
|
||||
int recoilA, int recoilZ, float beamEnergy_AMeV);
|
||||
|
@ -84,7 +84,7 @@ private:
|
|||
Recoil recoil;
|
||||
ReactionConfig config;
|
||||
|
||||
string nameA, namea, nameb, nameB;
|
||||
std::string nameA, namea, nameb, nameB;
|
||||
double thetaIN, phiIN;
|
||||
double mA, ma, mb, mB;
|
||||
|
||||
|
@ -108,7 +108,7 @@ private:
|
|||
|
||||
};
|
||||
|
||||
TransferReaction::TransferReaction(string configFile, unsigned short ID){
|
||||
TransferReaction::TransferReaction(std::string configFile, unsigned short ID){
|
||||
Inititization();
|
||||
SetReactionFromFile(configFile, ID);
|
||||
}
|
||||
|
@ -227,7 +227,7 @@ void TransferReaction::SetExB(double Ex){
|
|||
isReady = false;
|
||||
}
|
||||
|
||||
void TransferReaction::SetReactionFromFile(string configFile, unsigned short ID){
|
||||
void TransferReaction::SetReactionFromFile(std::string configFile, unsigned short ID){
|
||||
|
||||
if( config.LoadReactionConfig(configFile) ){
|
||||
|
||||
|
|
|
@ -34,8 +34,8 @@ int main(int argc, char *argv[]){
|
|||
double Ex = 0;
|
||||
double xRatio = 0.95;
|
||||
int nDiv = 1;
|
||||
string reactionTxt = "reactionConfig.txt";
|
||||
string detGeoTxt = "detectorGeo.txt";
|
||||
std::string reactionTxt = "reactionConfig.txt";
|
||||
std::string detGeoTxt = "detectorGeo.txt";
|
||||
int ID = 0;
|
||||
|
||||
if ( argc >= 2 ) Ex = atof(argv[1]);
|
||||
|
|
|
@ -94,7 +94,7 @@ void FindThetaCM(double Ex, int nDivision=1, double XRATION = 0.95,
|
|||
|
||||
int iDet = array.nDet;
|
||||
double length = array.detLength;
|
||||
vector<double> midPos;
|
||||
std::vector<double> midPos;
|
||||
|
||||
for(int i = 0; i < iDet; i++){
|
||||
if( array.firstPos > 0 ){
|
||||
|
|
|
@ -135,9 +135,9 @@ void Transfer(
|
|||
dwbaExList = (TMacro *) distFile->FindObjectAny("ExList");
|
||||
int numEx = dwbaExList->GetListOfLines()->GetSize() - 1 ;
|
||||
for(int i = 1; i <= numEx ; i++){
|
||||
string temp = dwbaExList->GetListOfLines()->At(i)->GetName();
|
||||
std::string temp = dwbaExList->GetListOfLines()->At(i)->GetName();
|
||||
if( temp[0] == '/' ) continue;
|
||||
vector<string> tempStr = AnalysisLib::SplitStr(temp, " ");
|
||||
std::vector<std::string> tempStr = AnalysisLib::SplitStr(temp, " ");
|
||||
exList.Add( atof(tempStr[0].c_str()), atof(tempStr[1].c_str()), 1.0, 0.00);
|
||||
}
|
||||
|
||||
|
@ -330,7 +330,7 @@ void Transfer(
|
|||
//--- cal modified f
|
||||
TObjArray * fxList = new TObjArray();
|
||||
TGraph ** fx = new TGraph*[numEx];
|
||||
vector<double> px, py;
|
||||
std::vector<double> px, py;
|
||||
int countfx = 0;
|
||||
for( int j = 0 ; j < numEx; j++){
|
||||
double a = helios.GetDetRadius();
|
||||
|
@ -692,8 +692,8 @@ int main (int argc, char *argv[]) {
|
|||
|
||||
//run Armory/Check_Simulation
|
||||
if( isPlot ){
|
||||
ifstream file_in;
|
||||
file_in.open("../Cleopatra/Check_Simulation.C", ios::in);
|
||||
std::ifstream file_in;
|
||||
file_in.open("../Cleopatra/Check_Simulation.C", std::ios::in);
|
||||
if( file_in){
|
||||
printf("---- running ../Cleopatra/Check_Simulation.C on %s \n", saveFileName.Data());
|
||||
TString cmd;
|
||||
|
|
|
@ -26,7 +26,7 @@ void PrintPotential(){
|
|||
|
||||
/// A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
|
||||
/// 1 1 1 1 0 0 1 1 0 0 1 1 1 0 0 1 1 0 0 0 0 1 0 1 1 1
|
||||
string potentialRef(string name){
|
||||
std::string potentialRef(std::string name){
|
||||
|
||||
//======== Deuteron
|
||||
if( name == "A" ){
|
||||
|
@ -1034,7 +1034,7 @@ bool BassaniPicardPotential(int A, int Z, double E){
|
|||
return true;
|
||||
}
|
||||
|
||||
bool CallPotential(string potName, int A, int Z, double E, int Zproj){
|
||||
bool CallPotential(std::string potName, int A, int Z, double E, int Zproj){
|
||||
bool okFlag = false;
|
||||
|
||||
if( potName == "A") okFlag = AnCaiPotential(A, Z, E);
|
||||
|
|
239
WebSimHelper/EnergyLevelsPlot.js
Normal file
|
@ -0,0 +1,239 @@
|
|||
let energy = [];
|
||||
let jpi = [];
|
||||
let Name;
|
||||
let A;
|
||||
let Sym;
|
||||
|
||||
function breakdownName(str) {
|
||||
const match = str.match(/^(\d+)([a-zA-Z]+)$/);
|
||||
if (match) {
|
||||
const numberPart = parseInt(match[1]);
|
||||
const stringPart = match[2];
|
||||
return { numberPart, stringPart };
|
||||
} else {
|
||||
return null; // If the input string doesn't match the expected format
|
||||
}
|
||||
}
|
||||
|
||||
let Sn = 999;
|
||||
let Sp = 999;
|
||||
let Sa = 999;
|
||||
|
||||
function GetData(){
|
||||
|
||||
Name = document.getElementById('ASym').value;
|
||||
let maxEx = parseFloat(document.getElementById('maxEx').value);
|
||||
|
||||
let str = 'displayIsoData.py?ASym=' + Name + "&maxEx=" + maxEx;
|
||||
|
||||
let client = new XMLHttpRequest();
|
||||
client.onreadystatechange = function() {
|
||||
let haha = client.responseText.split('\n');
|
||||
|
||||
jpi = [];
|
||||
energy = [];
|
||||
haha.forEach(line =>{
|
||||
|
||||
// console.log(line)
|
||||
if( line.includes("Sn:") ) {
|
||||
let pos1 = line.indexOf("Sn:");
|
||||
let pos2 = line.indexOf("MeV");
|
||||
Sn = parseFloat(line.substring(pos1+3, pos2));
|
||||
}
|
||||
if( line.includes("Sp:") ) {
|
||||
let pos1 = line.indexOf("Sp:");
|
||||
let pos2 = line.indexOf("MeV");
|
||||
Sp = parseFloat(line.substring(pos1+3, pos2));
|
||||
}
|
||||
if( line.includes("Sa:") ) {
|
||||
let pos1 = line.indexOf("Sa:");
|
||||
let pos2 = line.indexOf("MeV");
|
||||
Sa = parseFloat(line.substring(pos1+3, pos2));
|
||||
}
|
||||
|
||||
if( line.includes("<tr><td style=") && line.length != 0) {
|
||||
jpi.push(line.substring(95).slice(0,-10).trim());
|
||||
energy.push(parseFloat(line.substring(43,54).trim()));
|
||||
// console.log(jpi[jpi.length - 1] + ", " + energy[energy.length-1]);
|
||||
}
|
||||
});
|
||||
}
|
||||
client.open('GET', str, false);
|
||||
client.send();
|
||||
|
||||
}
|
||||
|
||||
function PlotLevels(){
|
||||
|
||||
GetData();
|
||||
|
||||
Plotly.purge("Plot_Levels");
|
||||
|
||||
if( energy.length == 0 ) return;
|
||||
|
||||
// console.log( Name + " | num. states : " + energy.length);
|
||||
|
||||
const plotWidth = 300;
|
||||
const plotHeight = 600;
|
||||
const yMin = -1;
|
||||
|
||||
let maxEx = parseFloat(document.getElementById('maxEx').value);
|
||||
const maxExExp = Math.max(...energy);
|
||||
|
||||
// console.log(maxExExp);
|
||||
|
||||
// let maxY = parseFloat(document.getElementById('plotRange').value);
|
||||
|
||||
const fig = {
|
||||
data: [],
|
||||
layout: {
|
||||
plot_bgcolor: 'white',
|
||||
width: plotWidth,
|
||||
height: plotHeight,
|
||||
margin: { l: 0, r: 0, t: 0, b: 0 },
|
||||
showlegend: false,
|
||||
xaxis: {
|
||||
showline: false,
|
||||
visible: false,
|
||||
range: [-1, 2.5]
|
||||
},
|
||||
yaxis: {
|
||||
range: [yMin, maxEx + 2],
|
||||
showline: false,
|
||||
visible: false
|
||||
},
|
||||
annotations: []
|
||||
}
|
||||
};
|
||||
|
||||
const l = energy.length;
|
||||
|
||||
const fontSize = 14;
|
||||
const fontSizeMeV = fontSize / plotHeight * (maxExExp + 1 - yMin);
|
||||
|
||||
let ypos = [];
|
||||
for( let i = 0; i < energy.length; i++) ypos.push(energy[i]);
|
||||
|
||||
let noOverlap = false;
|
||||
let loop = 0;
|
||||
|
||||
while (!noOverlap && loop < 2 * l) {
|
||||
for (let i = 1; i <= l; i++) {
|
||||
const diff = ypos[i] - ypos[i - 1];
|
||||
if (diff < fontSizeMeV) {
|
||||
ypos[i - 1] += (diff - fontSizeMeV) / 2;
|
||||
ypos[i] += (fontSizeMeV - diff) / 2;
|
||||
if (ypos[i - 1] < yMin + fontSizeMeV / 2) {
|
||||
ypos[i - 1] = yMin + fontSizeMeV / 2;
|
||||
ypos[i] = ypos[i - 1] + fontSizeMeV;
|
||||
}
|
||||
}
|
||||
}
|
||||
let count = 0;
|
||||
for (let i = 1; i <= l; i++) {
|
||||
const diff = ypos[i] - ypos[i - 1];
|
||||
if (diff > fontSizeMeV) {
|
||||
count++;
|
||||
}
|
||||
}
|
||||
if (count === l) {
|
||||
noOverlap = true;
|
||||
}
|
||||
loop++;
|
||||
}
|
||||
|
||||
for (let i = 0; i < l; i++) {
|
||||
fig.data.push({
|
||||
x: [0, 1],
|
||||
y: [energy[i], energy[i]],
|
||||
mode: 'lines',
|
||||
line: { color: 'black', width: 1 }
|
||||
});
|
||||
|
||||
fig.data.push({
|
||||
x: [1.03, 1.1, 1.19],
|
||||
y: [energy[i], ypos[i], ypos[i]],
|
||||
mode: 'lines',
|
||||
line: { color: 'gray', width: 1 }
|
||||
});
|
||||
|
||||
// console.log(energy[i]+ ", " + ypos[i]);
|
||||
|
||||
fig.layout.annotations.push({
|
||||
x: 1.2,
|
||||
y: ypos[i],
|
||||
text: `${energy[i].toFixed(3)}, ${jpi[i]}`,
|
||||
xanchor: 'left',
|
||||
font: { size: fontSize },
|
||||
showarrow: false
|
||||
});
|
||||
}
|
||||
|
||||
console.log("Sn: " + Sn);
|
||||
console.log("Sp: " + Sp);
|
||||
console.log("Sa: " + Sa);
|
||||
|
||||
let leftPos = -0.8;
|
||||
|
||||
fig.data.push({
|
||||
x: [leftPos, 1],
|
||||
y: [Sn, Sn],
|
||||
mode: 'lines',
|
||||
line: { color: 'blue', width: 1 }
|
||||
});
|
||||
fig.layout.annotations.push({
|
||||
x: leftPos,
|
||||
y: Sn + fontSizeMeV/2,
|
||||
text: `${'Sn:'+Sn.toFixed(3)}`,
|
||||
xanchor: 'left',
|
||||
font: { size: fontSize, color: 'blue' },
|
||||
showarrow: false
|
||||
});
|
||||
|
||||
fig.data.push({
|
||||
x: [leftPos, 1],
|
||||
y: [Sp, Sp],
|
||||
mode: 'lines',
|
||||
line: { color: 'red', width: 1 }
|
||||
});
|
||||
fig.layout.annotations.push({
|
||||
x: leftPos,
|
||||
y: Sp + fontSizeMeV/2,
|
||||
text: `${'Sp:'+Sp.toFixed(3)}`,
|
||||
xanchor: 'left',
|
||||
font: { size: fontSize, color: 'red' },
|
||||
showarrow: false
|
||||
});
|
||||
|
||||
fig.data.push({
|
||||
x: [leftPos, 1],
|
||||
y: [Sa, Sa],
|
||||
mode: 'lines',
|
||||
line: { color: 'purple', width: 1 }
|
||||
});
|
||||
fig.layout.annotations.push({
|
||||
x: leftPos,
|
||||
y: Sa + fontSizeMeV/2,
|
||||
text: `${'Sa:'+Sa.toFixed(3)}`,
|
||||
xanchor: 'left',
|
||||
font: { size: fontSize, color: 'purple' },
|
||||
showarrow: false
|
||||
});
|
||||
|
||||
// let NameYPos = (parseFloat(maxEx) + 2*fontSizeMeV);
|
||||
// console.log(NameYPos);
|
||||
|
||||
let name2 = breakdownName(Name);
|
||||
|
||||
fig.layout.annotations.push({
|
||||
x: 0.5,
|
||||
y: (maxEx + 1),
|
||||
text: "<sup>" + name2.numberPart +"</sup>" + name2.stringPart,
|
||||
font: { size: 2 * fontSize },
|
||||
showarrow: false
|
||||
});
|
||||
|
||||
// Create the plot
|
||||
Plotly.newPlot('Plot_Levels', fig.data, fig.layout);
|
||||
|
||||
}
|
55
WebSimHelper/README.md
Normal file
|
@ -0,0 +1,55 @@
|
|||
# Introduction
|
||||
|
||||
This is a web inteface for the HELIOS/SOLARIS simulation. Its purpose is NOT to replace the Simulation_Helper.C in the origin digios repository.
|
||||
It is simply provide a more easy accessible way to do simulation.
|
||||
|
||||
# Installation in Apache2
|
||||
|
||||
Assume the parant SOLARIS_ANALYSIS is in the home folder
|
||||
add a symbolic link
|
||||
|
||||
```sh
|
||||
$cd /var/www/html
|
||||
$ln -s ~/SOLARIS_ANALYSIS SOLARIS
|
||||
```
|
||||
|
||||
I want localhost/SOLARIS map to /var/www/html/SOLARIS/WebSimHelper, in the apache config
|
||||
|
||||
```sh
|
||||
$cd /etc/apache2/sit-available
|
||||
$touch SOLARIS.conf
|
||||
```
|
||||
|
||||
inside SOLARIS.conf
|
||||
|
||||
```sh
|
||||
<VirtualHost *:80>
|
||||
ServerAdmin rtang@anl.gov
|
||||
DocumentRoot /var/www/html/
|
||||
ServerName localhost
|
||||
|
||||
#map localhost/SOLARIS to /var/www/html/SOLARIS/WebSimHelper
|
||||
Alias /SOLARIS /var/www/html/SOLARIS/WebSimHelper
|
||||
|
||||
#set the directory properties
|
||||
<Directory /var/www/html/>
|
||||
Options Indexes FollowSymLinks
|
||||
AllowOverride None
|
||||
Require all granted
|
||||
Options +ExecCGI
|
||||
AddHandler cgi-script .cgi .py
|
||||
</Directory>
|
||||
|
||||
ErrorLog ${APACHE_LOG_DIR}/error.log
|
||||
CustomLog ${APACHE_LOG_DIR}/access.log combined
|
||||
|
||||
</VirtualHost>
|
||||
```
|
||||
|
||||
then enable the site
|
||||
|
||||
```sh
|
||||
$sudo a2ensite SOLARIS.conf
|
||||
$sudo systemctl restart apach2.service
|
||||
```
|
||||
|
29
WebSimHelper/displayIsoData.py
Executable file
|
@ -0,0 +1,29 @@
|
|||
#!/usr/bin/env /usr/bin/python3
|
||||
|
||||
import isotopeLib
|
||||
import cgi
|
||||
|
||||
form = cgi.FieldStorage()
|
||||
|
||||
ASym = form.getvalue('ASym')
|
||||
maxEx = form.getvalue('maxEx')
|
||||
|
||||
print( "Content-type:text/html\r\n\r\n")
|
||||
print("<html>")
|
||||
print("<style> body { font-family: courier, courier new, serif; color: #F7CF3C; } </style>")
|
||||
print("<body>")
|
||||
|
||||
isotopeLib.PrintIsoWeb(ASym)
|
||||
|
||||
if maxEx == "can be omitted" or float(maxEx) <= 0:
|
||||
maxEx = -1
|
||||
else:
|
||||
isotopeLib.PrintIsoExWeb(ASym, float(maxEx))
|
||||
|
||||
|
||||
print("</body>")
|
||||
print("</html>")
|
||||
|
||||
|
||||
|
||||
|
470
WebSimHelper/heliosmatics.html
Normal file
|
@ -0,0 +1,470 @@
|
|||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<title>Heliosmatics</title>
|
||||
<meta name="description" content="HELIOSmatics was first built by Ben P. Kay in MS Excel around 2010. Later, it was modified by Ryan Tang. Now, it migrates to web.">
|
||||
<link rel="icon" type="image/x-icon" href="logos/SOLARIS_favicon.png">
|
||||
<script src="https://cdn.plot.ly/plotly-2.16.1.min.js"></script>
|
||||
<meta name="viewport" content="width=device-width, height=device-height, initial-scale=1.0, user-scalable=no, user-scalable=0"/>
|
||||
</head>
|
||||
<style>
|
||||
body{
|
||||
font-family: Arial, Helvetica, sans-serif;
|
||||
background : #6DB33E;
|
||||
}
|
||||
.column{
|
||||
float : left;
|
||||
width: 650px;
|
||||
padding: 0px;
|
||||
}
|
||||
.row:after {
|
||||
content: "";
|
||||
display: table;
|
||||
clear: both;
|
||||
}
|
||||
.plotStyle{
|
||||
width:650px;
|
||||
height:600px;
|
||||
}
|
||||
.slider{
|
||||
width : 400px;
|
||||
}
|
||||
.plotSlider{
|
||||
width: 400px;
|
||||
}
|
||||
|
||||
hr {
|
||||
height:4px;
|
||||
background-color:#F7CF3C;
|
||||
border-style:none;
|
||||
border-width:none;
|
||||
}
|
||||
@media screen and (max-width: 1000px) {
|
||||
.column {
|
||||
width: 100%;
|
||||
}
|
||||
.plotStyle{
|
||||
width:400px;
|
||||
height: 370px;
|
||||
}
|
||||
.slider{
|
||||
width: 200px;
|
||||
}
|
||||
.plotSlider{
|
||||
width: 180px;
|
||||
}
|
||||
img {
|
||||
height: 50px;
|
||||
}
|
||||
}
|
||||
</style>
|
||||
|
||||
<body>
|
||||
|
||||
<h1>HELIOSmatics</h1>
|
||||
|
||||
<button onclick="CopyInputs()">Copy settings to clipboard</button>
|
||||
|
||||
<h1 id='reactionName' style="color: #1363A7"> 24F(d,p)25F@10MeV/u</h1>
|
||||
|
||||
<table>
|
||||
<tr>
|
||||
<td style="text-align:right"> Beam (A):</td>
|
||||
<td><Input type="text" style="width:60px" value="24F" id="beam" enterkeyhint="done"/></td>
|
||||
<td style="text-align:right"> Beam Ex:</td>
|
||||
<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>
|
||||
<td><Input type="text" style="width:60px" value="d" id="target" enterkeyhint="done"/></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td style="text-align:right"> Light (b):</td>
|
||||
<td><Input type="text" style="width:60px" value="p" id="light" enterkeyhint="done"/></td>
|
||||
<td style="text-align:right"> Q-value:</td>
|
||||
<td id='Q-value'>2.057</td>
|
||||
<td>MeV</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td style="text-align:right"> Heavy (B):</td>
|
||||
<td id='heavyName'>25F</td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
<p style="font: 12px" id='heavySp'></p>
|
||||
|
||||
<p></p>
|
||||
|
||||
<table>
|
||||
<tr>
|
||||
<td>
|
||||
<input type="radio" name="SSType" id='HELIOS' value="HELIOS"/>HELIOS
|
||||
</td>
|
||||
<td>
|
||||
<input type="radio" name="SSType" id='SOLARIS' value="SOLARIS" checked="checked"/>SOLARIS
|
||||
</td>
|
||||
<td>
|
||||
<input type="radio" name="SSType" id='ISS' value="ISS"/>ISS
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
<p></p>
|
||||
|
||||
<table>
|
||||
<tr>
|
||||
<td style="text-align:right"> B-field (abs.):</td>
|
||||
<td><Input type="text" style="width:60px" value="2" id='BField' enterkeyhint="done"/></td>
|
||||
<td>T</td>
|
||||
<td><Input type="range" min="0" max="6" step="0.05" value="2" class="slider" id='BRange'/> </td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td style="text-align:right"> Beam Energy:</td>
|
||||
<td><Input type="text" style="width:60px" value="10" id='KEA' enterkeyhint="done"/></td>
|
||||
<td>MeV/u</td>
|
||||
<td><Input type="range" min="0" max="20" step="0.1" value="10" class="slider" id='KEARange'/> </td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td></td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
<td id='minKEA'> </td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
<p></p>
|
||||
|
||||
<table id="ExTable", style="border:1px solid; text-align:center;">
|
||||
<tr>
|
||||
<th style="width:85px"> E<sub>x</sub> [MeV]</th>
|
||||
<th style="width:85px"> θ<sub>cm</sub>[deg]</th>
|
||||
<th style="width:70px">E<sub>b</sub>[MeV]</th>
|
||||
<th style="width:70px">Z<sub>b0</sub>[mm]</th>
|
||||
<th style="width:70px">Z<sub>b</sub>[mm]</th>
|
||||
<th style="width:70px">2ρ<sub>b</sub>[mm]</th>
|
||||
<th style="width:70px">θLab<sub>b</sub>[deg]</th>
|
||||
<th style="width:60px">T<sub>b</sub>[ns]</th>
|
||||
<th style="width:70px">E<sub>B</sub>[MeV]</th>
|
||||
<th style="width:90px">θLab<sub>B</sub>[deg]</th>
|
||||
<th style="width:80px">Z<sub>B0</sub>/2[mm]</th>
|
||||
<th style="width:70px">2ρ<sub>B</sub>[mm]</th>
|
||||
</tr>
|
||||
</tr>
|
||||
<td><input type="text" id='Ex1' name="Ex" size="8" value="0" enterkeyhint="done"/></td>
|
||||
<td><input type="text" id='theta1' name="thetaCM" size="8" value="10" enterkeyhint="done"/></td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
</tr>
|
||||
</tr>
|
||||
<td><input type="text" id='Ex2' name="Ex" size="8" value="1" enterkeyhint="done"/></td>
|
||||
<td><input type="text" id='theta2' name="thetaCM" size="8" value="40" enterkeyhint="done"/></td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><button type="button" onclick="addRow()" style="width:85px">Add E<sub>x</sub></button></td>
|
||||
<td><button type="button" onclick="deleteRow()">Remove E<sub>x</sub></button></td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
<p></p>
|
||||
|
||||
<table>
|
||||
<tr>
|
||||
<td style="text-align:right"> θ<sub>CM</sub>:</td>
|
||||
<td><Input type="text" style="width:60px" value="0" id='thetaCM' enterkeyhint="done"/></td>
|
||||
<td>deg</td>
|
||||
<td><Input type="range" min="0" max="50" step="0.1" value="0" class="slider" id='thetaCMRange'/> </td>
|
||||
</tr>
|
||||
<td style="text-align:right"> Array Pos:</td>
|
||||
<td><Input type="text" style="width:60px" value="-100" id='posArray' enterkeyhint="done"/></td>
|
||||
<td>mm</td>
|
||||
<td><Input type="range" min="-500" max="1000" step="1" value="-100" class="slider" id='posArrayRange'/> </td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td style="text-align:right"> Recoil Pos:</td>
|
||||
<td><Input type="text" style="width:60px" value="1500" id='posRecoil' enterkeyhint="done"/></td>
|
||||
<td>mm</td>
|
||||
<td><Input type="range" min="0" max="2000" step="1" value="1500" class="slider" id='posRecoilRange'/> </td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
<table>
|
||||
<tr>
|
||||
<td style="text-align:right" > Recoil radius, inner [mm]:</td>
|
||||
<td><Input type="text" style="width:40px" value="10" id='innerRecoil' enterkeyhint="done"/></td>
|
||||
<td style="text-align:right" > outter [mm]:</td>
|
||||
<td><Input type="text" style="width:40px" value="45" id='outterRecoil' enterkeyhint="done"/></td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
<p></p>
|
||||
|
||||
|
||||
<div class="row">
|
||||
<div class="column">
|
||||
<table cellspacing="0" cellpadding="0">
|
||||
<tr>
|
||||
<td>
|
||||
<div id="Plot_EZ" class="plotStyle"></div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr> <td> </td></tr>
|
||||
<tr>
|
||||
<td> zRange can be changed by Array position.</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<table>
|
||||
<tr>
|
||||
<td>eRange:</td>
|
||||
<td><Input type="text" style="width:60px" value="12" id='eRange' enterkeyhint="done"/></td>
|
||||
<td>MeV</td>
|
||||
<td><Input type="range" min="1" max="30" step="0.1" value="12" class="plotSlider" id='eRangeSlider'/></td>
|
||||
</tr>
|
||||
</table>
|
||||
</td>
|
||||
</tr>
|
||||
<tr> <td> </td></tr>
|
||||
</table>
|
||||
</div>
|
||||
<div class="column">
|
||||
<table cellspacing="0" cellpadding="0">
|
||||
<tr>
|
||||
<td>
|
||||
<div id="Plot_RZ" class="plotStyle"></div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr> <td> </td></tr>
|
||||
<tr>
|
||||
<td>
|
||||
<table>
|
||||
<tr>
|
||||
<td>zRange(Min):</td>
|
||||
<td><Input type="text" style="width:60px" value="-200" id='zRange1' enterkeyhint="done"/></td>
|
||||
<td>mm</td>
|
||||
<td><Input type="range" min="-2000" max="4000" step="1" value="-200" class="plotSlider" id='zRange1Slider'/></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>zRange(Max):</td>
|
||||
<td><Input type="text" style="width:60px" value="2000" id='zRange2' enterkeyhint="done"/></td>
|
||||
<td>mm</td>
|
||||
<td><Input type="range" min="-2000" max="4000" step="1" value="2000" class="plotSlider" id='zRange2Slider'/></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>rRange:</td>
|
||||
<td><Input type="text" style="width:60px" value="50" id='rRange' enterkeyhint="done"/></td>
|
||||
<td>mm</td>
|
||||
<td><Input type="range" min="1" max="400" step="1" value="50" class="plotSlider" id='rRangeSlider'/></td>
|
||||
</tr>
|
||||
</table>
|
||||
</td>
|
||||
</tr>
|
||||
<tr> <td> </td></tr>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<p id="n0"></p>
|
||||
<p id="n1"></p>
|
||||
<p id="n2"></p>
|
||||
<p id="n3"></p>
|
||||
|
||||
<hr>
|
||||
|
||||
<h1>θ<sub>CM</sub> Calculator</h1>
|
||||
|
||||
The calculation only give θ<sub>CM</sub> after the bending.
|
||||
<p></p>
|
||||
|
||||
<table>
|
||||
<tr>
|
||||
<td>Ex [MeV] : </td>
|
||||
<td><Input type="text" style="width:60px" value="0" id='Ex0' enterkeyhint="done"/></td>
|
||||
<td>θ<sub>CM</sub> Gate [deg] : </td>
|
||||
<td><Input type="text" style="width:60px" value="10" id='thetaCMGate' enterkeyhint="done"/></td>
|
||||
<td>X Gate [%] : </td>
|
||||
<td><Input type="text" style="width:60px" value="95" id='XGate' enterkeyhint="done"/></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<table id='thetaCMTable' style="border:1px solid; text-align:center;">
|
||||
<tr>
|
||||
<td style="width:30px"><b>ID</b></td>
|
||||
<td style="width:120px"><b>pos<sub>0</sub>(gated)</b></td>
|
||||
<td style="width:120px"><b>pos<sub>1</sub>(gated)</b></td>
|
||||
<td style="width:60px"><b>θ<sub>1</sub>[deg]</b></td>
|
||||
<td style="width:60px"><b>θ<sub>2</sub>[deg]</b></td>
|
||||
<td style="width:60px"><b>θ<sub>avg</sub>[deg]</b></td>
|
||||
<td style="width:60px"><b>Δθ[deg]</b></td>
|
||||
<td style="width:100px"><b>sin(θ<sub>avg</sub>)Δθ</b></td>
|
||||
</tr>
|
||||
</table>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
<!-- ===================================================== -->
|
||||
|
||||
<!--
|
||||
<hr>
|
||||
|
||||
<h1> DWBA and Monte Carlo Simulation (under construction...)</h1>
|
||||
|
||||
<table id='DWBATable' style="border:1px solid; text-align:center;">
|
||||
<tr>
|
||||
<td> E<sub>x</sub> [MeV]</td>
|
||||
<td> J<sup>π</sup></td>
|
||||
<td> Orbital </td>
|
||||
</tr>
|
||||
</tr>
|
||||
<td id='dwba1'>0</td>
|
||||
<td><input type="text" name="Jpi" size="5" value="3/2+" enterkeyhint="done"/></td>
|
||||
<td><input type="text" name="Orb" size="5" value="0d3/2" enterkeyhint="done"/></td>
|
||||
</tr>
|
||||
</tr>
|
||||
<td id='dwba2'>0</td>
|
||||
<td><input type="text" name="Jpi" size="5" value="1/2+" enterkeyhint="done"/></td>
|
||||
<td><input type="text" name="Orb" size="5" value="1s1/2" enterkeyhint="done"/></td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
<p></p>
|
||||
<input type="checkbox" name="DWBA" value="On"/>Cal. DWBA
|
||||
|
||||
<table>
|
||||
<tr>
|
||||
<td>Incoming Channel</td>
|
||||
<td>
|
||||
<select name="op1">
|
||||
<option value="A" selected>D | An & Cai (2006), E < 183, 12 < A < 238</option>
|
||||
<option value="H">D | Han, Shi, & Shen, (2006), E < 200 | 12 < A < 209</option>
|
||||
<option value="B">D | Bojowald et al., (1988), 50 < E < 80 | 27 < A < 208</option>
|
||||
<option value="K">P | Koning & Delaroche, (2009), E < 200 | 24 < A < 209 | Iso.Dep.</option>
|
||||
<option value="V">P | Varner et al., (1991), 16 < E < 65 | 4 < A < 209</option>
|
||||
<option value="M">P | Menet et al., (1971), 30 < E < 60 | 40 < A </option>
|
||||
<option value="x">A=3 | Xu, Guo, Han, & Shen, (2011), E < 250 | 20 < A < 209 </option>
|
||||
<option value="l">A=3 | Liang, Li, & Cai, (2009), E < 270 | All masses </option>
|
||||
<option value="x">A=4 | Su & Han, (2015), E < 398 | 20 < A < 209 </option>
|
||||
</select>
|
||||
<td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Outgoing Channel</td>
|
||||
<td>
|
||||
<select name="op2">
|
||||
<option value="A">D | An & Cai (2006), E < 183, 12 < A < 238</option>
|
||||
<option value="H">D | Han, Shi, & Shen, (2006), E < 200 | 12 < A < 209</option>
|
||||
<option value="B">D | Bojowald et al., (1988), 50 < E < 80 | 27 < A < 208</option>
|
||||
<option value="K" selected>P | Koning & Delaroche, (2009), E < 200 | 24 < A < 209 | Iso.Dep.</option>
|
||||
<option value="V">P | Varner et al., (1991), 16 < E < 65 | 4 < A < 209</option>
|
||||
<option value="M">P | Menet et al., (1971), 30 < E < 60 | 40 < A </option>
|
||||
<option value="x">A=3 | Xu, Guo, Han, & Shen, (2011), E < 250 | 20 < A < 209 </option>
|
||||
<option value="l">A=3 | Liang, Li, & Cai, (2009), E < 270 | All masses </option>
|
||||
<option value="x">A=4 | Su & Han, (2015), E < 398 | 20 < A < 209 </option>
|
||||
</select>
|
||||
<td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
<h3> Plot config (still working on):</h3>
|
||||
|
||||
<input type="checkbox" name="plot" value="pEZ" checked/>E vs Z<br>
|
||||
<input type="checkbox" name="plot" value="pExCal" checked/>Ex (cal.)<br>
|
||||
<input type="checkbox" name="plot" value="pThetaCM" checked/>ThetaCM<br>
|
||||
<input type="checkbox" name="plot" value="pThetaCM_Z" checked/>ThetaCM vs Z<br>
|
||||
<input type="checkbox" name="plot" value="pRecoilXY" checked/>Recoil X vs Y<br>
|
||||
<input type="checkbox" name="plot" value="pRecoilRThetaCM"/>Recoil-R vs ThetaCM<br>
|
||||
<input type="checkbox" name="plot" value="pRecoilRZ"/>Recoil R vs Z<br>
|
||||
<input type="checkbox" name="plot" value="pArrayXY"/>Array X vs Y<br>
|
||||
|
||||
<p></p>
|
||||
|
||||
<input type="checkbox" name="gate" value="hit==1" checked/>Array Hit<br>
|
||||
<input type="checkbox" name="gate" value="loop<=1" checked/>Loop = 1<br>
|
||||
<input type="checkbox" name="gate" value="thetaCM>10" checked/> ThetaCM > 10 deg<br>
|
||||
|
||||
<p></p>
|
||||
|
||||
<input type = "submit" value = "Run Simulation" style="width:200px;height:60px;font-size:20px" />
|
||||
|
||||
<p></p>
|
||||
<iframe style="border:none;"></iframe>
|
||||
-->
|
||||
|
||||
<!-- ===================================================== -->
|
||||
|
||||
<hr>
|
||||
<p></p>
|
||||
HELIOSmatics was first built by Ben P. Kay in MS Excel around 2010. It was modified by Ryan Tang later. And now it migrated to the web on Dec, 2022.
|
||||
<br>
|
||||
The calculation can be found in the source code (heliosmatics.js or press F12)
|
||||
|
||||
<p></p>
|
||||
|
||||
<!--
|
||||
<hr>
|
||||
Experimental 3D model
|
||||
<div id="Plot_3D" class="plotStyle"></div>
|
||||
-->
|
||||
|
||||
</body>
|
||||
|
||||
<!-- ######################################################################################### -->
|
||||
|
||||
<script src="heliosmatics.js"></script>
|
||||
|
||||
<script>
|
||||
|
||||
function CopyInputs(){
|
||||
let inputs = document.getElementsByTagName("input");
|
||||
let copyText = "====HELIOSMATICS|";
|
||||
for(let i = 0; i < inputs.length; i++){
|
||||
if( inputs[i].type == 'text'){
|
||||
//console.log(inputs[i].id.substring(0,2));
|
||||
if( inputs[i].id.substring(0,2) == 'Ex' || inputs[i].id.substring(0,5) == 'theta' ) {
|
||||
continue;
|
||||
}
|
||||
if( inputs[i].id == 'innerRecoil'){
|
||||
break;
|
||||
}
|
||||
copyText += inputs[i].value + ", ";
|
||||
}
|
||||
}
|
||||
|
||||
copyText += document.getElementById('heavyName').innerHTML;
|
||||
|
||||
//console.log(copyText);
|
||||
|
||||
navigator.clipboard.writeText(copyText).then(
|
||||
() => {
|
||||
alert('Setting copied to clipboard.\nCan paste it in Monte Carlo simulation.\n' + copyText);
|
||||
}).catch(
|
||||
() =>{
|
||||
alert('Cannot copy.');
|
||||
});
|
||||
|
||||
//window.open('simpleSim.html');
|
||||
|
||||
}
|
||||
|
||||
</script>
|
||||
|
||||
</html>
|
1159
WebSimHelper/heliosmatics.js
Normal file
196
WebSimHelper/index.html
Normal file
|
@ -0,0 +1,196 @@
|
|||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<title>SOLARIS Si-Array Mode Simulation </title>
|
||||
<meta name="description" content="SOLARIS Si-Array mode simulation. This is ported from the original Heliosmatics in MS excel, Monte Carlo simulation using CERN ROOT, and DWBA simulation using the Peolemy.">
|
||||
<link rel="icon" type="image/x-icon" href="logos/SOLARIS_favicon.png">
|
||||
</head>
|
||||
<meta charset="utf-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||
<script src="https://cdn.plot.ly/plotly-2.16.1.min.js"></script>
|
||||
<style>
|
||||
|
||||
:root{
|
||||
--navWidth: 300px;
|
||||
}
|
||||
|
||||
body {
|
||||
font-family: Arial, Helvetica, sans-serif;
|
||||
}
|
||||
/* table, th, td { */
|
||||
/* border: 1px solid black; */
|
||||
/* } */
|
||||
table.center{
|
||||
margin-left: auto;
|
||||
margin-right: auto;
|
||||
}
|
||||
header {
|
||||
background-color: #F7CF3C;
|
||||
padding: 10px;
|
||||
text-align: center;
|
||||
font-size: 35px;
|
||||
color: black;
|
||||
}
|
||||
nav {
|
||||
float: left;
|
||||
width : var(--navWidth);
|
||||
height: 100vh;
|
||||
/* background: #6DB33E; */
|
||||
background: #1363A7;
|
||||
padding: 0px;
|
||||
}
|
||||
article {
|
||||
float: none;
|
||||
padding: 0px;
|
||||
margin-left: var(--navWidth);
|
||||
height: 1000px;
|
||||
height : 100vh;
|
||||
/* background: #1363A7; */
|
||||
background: #6DB33E;
|
||||
}
|
||||
a {
|
||||
color : #F7CF3C;
|
||||
}
|
||||
|
||||
.column1{
|
||||
float : left;
|
||||
width : 50%;
|
||||
text-align:right;
|
||||
}
|
||||
.column2{
|
||||
float : right;
|
||||
width : 50%;
|
||||
text-align: left;
|
||||
}
|
||||
.row:after {
|
||||
content: "";
|
||||
display: table;
|
||||
clear: both;
|
||||
}
|
||||
|
||||
@media (max-width: 1000px) {
|
||||
.column1 {
|
||||
width: 100%;
|
||||
height: 40%;
|
||||
text-align:center;
|
||||
}
|
||||
.column2 {
|
||||
width: 100%;
|
||||
text-align:center;
|
||||
}
|
||||
nav {
|
||||
width: 100%;
|
||||
height: auto;
|
||||
margin-left : 0;
|
||||
}
|
||||
article {
|
||||
float: left;
|
||||
margin-left : 0px;
|
||||
width: 100%;
|
||||
height: 100vh;
|
||||
margin-left : 0;
|
||||
}
|
||||
}
|
||||
|
||||
</style>
|
||||
<body>
|
||||
|
||||
<header>
|
||||
<div class="row">
|
||||
<div class="column1"">
|
||||
<img src="logos/SOLARIS_logo.png" width="300">
|
||||
</div>
|
||||
<div class="column2">
|
||||
<span style="font-size:70px;">Simulation</span>
|
||||
</div>
|
||||
</div>
|
||||
</header>
|
||||
|
||||
<section>
|
||||
|
||||
<nav id="nav">
|
||||
<div class="visit-counter"></div>
|
||||
<p></p>
|
||||
<table class="center">
|
||||
<tr>
|
||||
<td style="text-align:right"><a href="heliosmatics.html" target="uploaded">HELIOSmatics</a></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td style="text-align:right"><a href="simpleSim.html" target="uploaded">DWBA and Monte Carlo Simulation</a></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td style="text-align:right"><a href="miscCal.html" target="uploaded">Misc. Calulations</a></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td style="text-align:right"><a href="instruction.html" target="uploaded">Intructions & Credits</a></td>
|
||||
</tr>
|
||||
|
||||
<table>
|
||||
|
||||
<p></p><!-- ////////////////////////////////////////// -->
|
||||
|
||||
<form action = "displayIsoData.py" method = "POST" target = "NuclearData">
|
||||
<table class="center">
|
||||
<tr>
|
||||
<td style="text-align:right">Isotopes Name:</td>
|
||||
<td><input type = "text" name = "ASym" id="ASym" size="13" value="24F" enterkeyhint="done"/></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td style="text-align:right">Max Ex [MeV]:</td>
|
||||
<td><input type = "text" name = "maxEx" id="maxEx" size="13" value="can be omitted" enterkeyhint="done"/></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td></td>
|
||||
<td><button onclick="PlotLevels()" style="width: 130px;">Get Isotopes Data</button></td>
|
||||
</tr>
|
||||
</table>
|
||||
</form>
|
||||
<div id="Plot_Levels" class="plotStyle"></div>
|
||||
<iframe name="NuclearData" style="border:none;width:100%;height:100%" ></iframe>
|
||||
|
||||
</nav>
|
||||
|
||||
<!-- ////////////////////////////////////////// -->
|
||||
<article id="article" >
|
||||
<iframe id="main" name="uploaded" style="border:none;width:100%;" src="heliosmatics.html"></iframe>
|
||||
</article>
|
||||
</section>
|
||||
|
||||
|
||||
<script src="EnergyLevelsPlot.js"></script>
|
||||
|
||||
<script>
|
||||
|
||||
let frame = document.getElementById("main");
|
||||
let frameNav = document.getElementById("nav");
|
||||
let frameArticle = document.getElementById("article");
|
||||
|
||||
let x = window.matchMedia("(max-width: 1000px)");
|
||||
|
||||
adjustHeight();
|
||||
|
||||
x.addListener(adjustHeight);
|
||||
|
||||
function adjustHeight(){
|
||||
let hhh = frame.contentWindow.document.body.scrollHeight * 1.1 + 'px';
|
||||
|
||||
frame.style.height = hhh;
|
||||
frameArticle.style.height = hhh;
|
||||
|
||||
if( x.matches){
|
||||
frameNav.style.height = "40%";
|
||||
}else{
|
||||
frameNav.style.height = hhh;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
frame.onload = adjustHeight;
|
||||
|
||||
|
||||
|
||||
</script>
|
||||
|
||||
</body>
|
||||
</html>
|
76
WebSimHelper/instruction.html
Normal file
|
@ -0,0 +1,76 @@
|
|||
<!DOCTYPE html>
|
||||
<html>
|
||||
<body>
|
||||
<style>
|
||||
body{
|
||||
//color : #767A4C;
|
||||
font-family: Arial, Helvetica, sans-serif;
|
||||
}
|
||||
a {
|
||||
//color : #F7CF3C;
|
||||
color : #1363A7;
|
||||
}
|
||||
hr {
|
||||
height:4px;
|
||||
background-color:#F7CF3C;
|
||||
border-style:none;
|
||||
border-width:none;
|
||||
}
|
||||
img {
|
||||
height: 100px;
|
||||
}
|
||||
@media screen and (max-width: 1000px) {
|
||||
img {
|
||||
height: 50px;
|
||||
}
|
||||
}
|
||||
|
||||
</style>
|
||||
<h1>Intructions:</h1>
|
||||
<p>
|
||||
<ul>
|
||||
<li>Use the <a href="heliosmatics.html" target="uploaded">HELIOSmatics</a> to check the detector and field settings.</li>
|
||||
<li>The easiest way to do DWBA and Monte Carlo Simulation is use the <a href="simpleSim.html" target="uploaded">Simplied Interface</a>
|
||||
<li>The kenimatic calculation is documented in <a href="https://wiki.anl.gov/wiki_heliosdaq/images/3/3f/Kinematics_of_HELIOS.pdf" target="_blank" >Here</a>.</li>
|
||||
<li>The DWBA calucation is using Ptolemy. <a href="https://www.phy.anl.gov/theory/research/ptolemy/" target="_blank">Here</a> for more detail. </li>
|
||||
<li>Past calculations can be found <a href="files/" target="uploaded">Here</a>. Clear every Monday.</li>
|
||||
</ul>
|
||||
</p>
|
||||
|
||||
<hr>
|
||||
<h1>Credits:</h1>
|
||||
|
||||
<h4>This page is created and hosted by Fox's Lab (FSU) in collabortion with SOLARIS (FRIB).</h4>
|
||||
<h4>The SOLARIS project is based on HELIOS (ANL) and is leaded by ANL.</h4>
|
||||
<h4>The ISS (ISOLDE Solenoidal Spectrometer) is located as CERN.</h4>
|
||||
|
||||
<a href="https://fsunuc.physics.fsu.edu" target="_blank"><img src="logos/FSU_logo_640.png"></a>
|
||||
<a href="https://fribs.msu.edu/news/2021/solaris.html" target="_blank"><img src="logos/FRIB_logo.jpg"></a>
|
||||
<a href="https://home.cern/science/experiments/isolde" target="_blank"><img src="logos/CERN_logo.svg"></a>
|
||||
<a href="https://www.anl.gov/phy" target="_blank"><img src="logos/ANL_logo.gif"></a>
|
||||
|
||||
<a href="https://www.anl.gov/phy/solaris" target="_blank"><img src="logos/SOLARIS_logo.png"></a>
|
||||
<a href="https://isolde-solenoidal-spectrometer.web.cern.ch/" target="_blank"><img src="logos/ISS_logo.png"></a>
|
||||
<a href="https://www.anl.gov/phy/helical-orbit-spectrometer" target="_blank"><img src="logos/HELIOS_logo.jpg"></a>
|
||||
|
||||
<p></p>
|
||||
The simulation was started from Ben Kay (ANL) around 2010 using excel spreadsheet.
|
||||
<br>
|
||||
Ryan Tang (former ANL postdoc, now at FSU) developed a Monte Carlo simulation with DWBA using CERN ROOT framework.
|
||||
<br>
|
||||
And the whole simulation migrated to here at Dec, 2022.
|
||||
|
||||
<p></p>
|
||||
Contact: Ryan Tang (rtang at fsu.edu)
|
||||
<p> any suggestions and feedback are very welcome.</p>
|
||||
|
||||
<hr>
|
||||
<h2> Todo : </h2>
|
||||
<ul>
|
||||
<li>File name of the images of past calculations include reaction</li>
|
||||
<li>Change the legend position of the DWBA calcualtion</li>
|
||||
<li>A 3-D simulation? </li>
|
||||
</ul>
|
||||
|
||||
</body>
|
||||
</html>
|
185
WebSimHelper/isotopeLib.py
Executable file
|
@ -0,0 +1,185 @@
|
|||
#!/usr/bin/env /usr/bin/python3
|
||||
|
||||
import pandas as pd
|
||||
import urllib.request
|
||||
import re
|
||||
import numpy
|
||||
|
||||
me = 0.51099895000 # +- 15
|
||||
mp = 938.27208816 # +- 29
|
||||
mn = 939.56542052 # +- 54
|
||||
ma = 3727.37915
|
||||
|
||||
livechart = "https://nds.iaea.org/relnsd/v0/data?"
|
||||
|
||||
def lc_read_csv(url):
|
||||
req = urllib.request.Request(url)
|
||||
req.add_header('User-Agent', 'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:77.0) Gecko/20100101 Firefox/77.0')
|
||||
return pd.read_csv(urllib.request.urlopen(req))
|
||||
|
||||
# Read the saved CSV file back into a DataFrame
|
||||
try :
|
||||
haha = pd.read_csv('IAEA_NuclearData.csv')
|
||||
except FileNotFoundError:
|
||||
# the service URL
|
||||
url = livechart + "fields=ground_states&nuclides=all"
|
||||
haha = lc_read_csv(url)
|
||||
haha.insert(0, 'A', haha['z'] + haha['n'])
|
||||
haha.to_csv('IAEA_NuclearData.csv', index=False)
|
||||
haha = pd.read_csv('IAEA_NuclearData.csv')
|
||||
|
||||
# print(haha.columns)
|
||||
## ['A', 'z', 'n', 'symbol', 'radius', 'unc_r', 'abundance', 'unc_a',
|
||||
## 'energy_shift', 'energy', 'unc_e', 'ripl_shift', 'jp', 'half_life',
|
||||
## 'operator_hl', 'unc_hl', 'unit_hl', 'half_life_sec', 'unc_hls',
|
||||
## 'decay_1', 'decay_1_%', 'unc_1', 'decay_2', 'decay_2_%', 'unc_2',
|
||||
## 'decay_3', 'decay_3_%', 'unc_3', 'isospin', 'magnetic_dipole', 'unc_md',
|
||||
## 'electric_quadrupole', 'unc_eq', 'qbm', 'unc_qb', 'qbm_n', 'unc_qbmn',
|
||||
## 'qa', 'unc_qa', 'qec', 'unc_qec', 'sn', 'unc_sn', 'sp', 'unc_sp',
|
||||
## 'binding', 'unc_ba', 'atomic_mass', 'unc_am', 'massexcess', 'unc_me',
|
||||
## 'me_systematics', 'discovery', 'ENSDFpublicationcut-off',
|
||||
## 'ENSDFauthors', 'Extraction_date']
|
||||
|
||||
|
||||
def GetExList(ASym : str, maxEx : float):
|
||||
try:
|
||||
exList = lc_read_csv(livechart + "fields=levels&nuclides=" + ASym)
|
||||
exJpi = exList[['energy', 'jp']]
|
||||
exJpi = exJpi[exJpi['energy'] < (maxEx * 1000)]
|
||||
return exJpi
|
||||
except:
|
||||
return pd.DataFrame()
|
||||
|
||||
def BreakDownName(ASym : str):
|
||||
match = re.match(r'(\d+)(\D+)', ASym)
|
||||
return [int(match.group(1)), match.group(2) ]
|
||||
|
||||
def GetAZ(ASym : str):
|
||||
[A, sym] = BreakDownName(ASym)
|
||||
try:
|
||||
dudu = haha[(haha['symbol']==sym) & (haha['A']==A)]
|
||||
Z = int(dudu['z'].iloc[0])
|
||||
return [A, Z]
|
||||
except:
|
||||
return [A, numpy.nan]
|
||||
|
||||
def GetBindingPerA(ASym : str) -> float:
|
||||
[A, sym] = BreakDownName(ASym)
|
||||
try:
|
||||
dudu = haha[(haha['symbol']==sym) & (haha['A']==A)]
|
||||
Z = int(dudu['z'].iloc[0])
|
||||
N = A - Z
|
||||
return dudu['binding'].iloc[0]/1000
|
||||
except:
|
||||
return numpy.nan
|
||||
|
||||
def GetMassFromSym(ASym : str) -> float:
|
||||
[A, sym] = BreakDownName(ASym)
|
||||
try:
|
||||
dudu = haha[(haha['symbol']==sym) & (haha['A']==A)]
|
||||
Z = int(dudu['z'].iloc[0])
|
||||
N = A - Z
|
||||
binding = dudu['binding'].iloc[0]/1000
|
||||
return Z*mp + N*mn - binding*A
|
||||
except:
|
||||
return numpy.nan
|
||||
|
||||
def GetMassFromAZ(A : int, Z : int) -> float:
|
||||
try:
|
||||
dudu = haha[(haha['z']==Z) & (haha['A']==A)]
|
||||
Z = int(dudu['z'].iloc[0])
|
||||
N = A - Z
|
||||
binding = dudu['binding'].iloc[0]/1000
|
||||
return Z*mp + N*mn - binding*A
|
||||
except:
|
||||
return numpy.nan
|
||||
|
||||
def GetSymbol(A : int, Z : int) -> str:
|
||||
try:
|
||||
dudu = haha[(haha['z']==Z) & (haha['A']==A)]
|
||||
return "%d%s" % (A , dudu['symbol'].iloc[0])
|
||||
except:
|
||||
return "0x"
|
||||
|
||||
def GetJpi(ASym : str):
|
||||
[A, sym] = BreakDownName(ASym)
|
||||
try:
|
||||
dudu = haha[(haha['symbol']==sym) & (haha['A']==A)]
|
||||
return dudu['jp'].iloc[0]
|
||||
except:
|
||||
return "unknown"
|
||||
|
||||
def GetHalfLife(ASym : str) -> float:
|
||||
[A, sym] = BreakDownName(ASym)
|
||||
try:
|
||||
dudu = haha[(haha['symbol']==sym) & (haha['A']==A)]
|
||||
return dudu['half_life_sec'].iloc[0]
|
||||
except:
|
||||
return "unknown"
|
||||
|
||||
def GetSn(ASym : str) -> float:
|
||||
[A, Z] = GetAZ(ASym)
|
||||
if numpy.isnan(Z) :
|
||||
return numpy.nan
|
||||
else:
|
||||
mass0 = GetMassFromAZ(A, Z)
|
||||
mass1 = GetMassFromAZ(A-1, Z)
|
||||
return mass1 + mn - mass0
|
||||
|
||||
def GetSp(ASym : str):
|
||||
[A, Z] = GetAZ(ASym)
|
||||
if numpy.isnan(Z) :
|
||||
return numpy.nan
|
||||
else:
|
||||
mass0 = GetMassFromAZ(A, Z)
|
||||
mass1 = GetMassFromAZ(A-1, Z-1)
|
||||
return mass1 + mp - mass0
|
||||
|
||||
def GetSa(ASym : str):
|
||||
[A, Z] = GetAZ(ASym)
|
||||
if numpy.isnan(Z) :
|
||||
return numpy.nan
|
||||
else:
|
||||
mass0 = GetMassFromAZ(A, Z)
|
||||
mass1 = GetMassFromAZ(A-4, Z-2)
|
||||
return mass1 + ma - mass0
|
||||
|
||||
def PrintIso(ASym: str):
|
||||
[A, Z] = GetAZ(ASym)
|
||||
print("========================= ", ASym)
|
||||
print("A : %d, Z : %d, N : %d" % (A, Z, A-Z))
|
||||
print(" Jpi : ", GetJpi(ASym))
|
||||
print("half-live : %.2f sec" % (GetHalfLife(ASym)))
|
||||
print(" Mass : %9.2f MeV" % (GetMassFromSym(ASym) ))
|
||||
print(" Binding : %9.2f MeV/A" % (GetBindingPerA(ASym)))
|
||||
print(" Binding : %9.2f MeV" % (GetBindingPerA(ASym) * A))
|
||||
print(" Sn: %9.2f MeV" % GetSn(ASym))
|
||||
print(" Sp: %9.2f MeV" % GetSp(ASym))
|
||||
print(" Sa: %9.2f MeV" % GetSa(ASym))
|
||||
print("=============================")
|
||||
|
||||
def PrintIsoWeb(ASym : str):
|
||||
[A, Z] = GetAZ(ASym)
|
||||
print("<br>========================= ", ASym)
|
||||
print("<br>A : %d, Z : %d, N : %d" % (A, Z, A-Z))
|
||||
print("<br> Jpi : ", GetJpi(ASym))
|
||||
print("<br>half-live : %.2f sec" % (GetHalfLife(ASym)))
|
||||
print("<br> Mass : %9.2f MeV" % (GetMassFromSym(ASym) ))
|
||||
print("<br> Binding : %9.2f MeV/A" % (GetBindingPerA(ASym)))
|
||||
print("<br> Binding : %9.2f MeV" % (GetBindingPerA(ASym) * A))
|
||||
print("<br> Sn: %9.2f MeV" % GetSn(ASym))
|
||||
print("<br> Sp: %9.2f MeV" % GetSp(ASym))
|
||||
print("<br> Sa: %9.2f MeV" % GetSa(ASym))
|
||||
print("<br>=============================")
|
||||
|
||||
|
||||
def PrintIsoExWeb(ASym : str, maxEx : float):
|
||||
exList = GetExList(ASym, maxEx)
|
||||
if exList.empty:
|
||||
print("<br> cannot find Ex data")
|
||||
else:
|
||||
print("<table>")
|
||||
for i in range(0,len(exList)):
|
||||
print("<tr><td style=\"text-align:right\" width=80>%9.3f</td><td style=\"text-align:right\" width=100>%s</td></tr>" % (exList['energy'].iloc[i]/1000, exList['jp'].iloc[i].replace(' ', ',')))
|
||||
print("</table>")
|
||||
|
BIN
WebSimHelper/logos/ANL_logo.gif
Normal file
After Width: | Height: | Size: 7.2 KiB |
1
WebSimHelper/logos/CERN_logo.svg
Normal file
|
@ -0,0 +1 @@
|
|||
<svg height="316.227766" viewBox="0 0 14.41662 14.41666" width="316.227766" xmlns="http://www.w3.org/2000/svg"><path d="m171.53706 206.16631c0-.26917-.2353-.35454-.41945-.35454-.12453 0-.20567.008-.26247.0134-.008.19756-.0162.37924-.0162.57433v.14887c.0268.004.15346.003.18133.002.22331-.005.51682-.0759.51682-.38453m4.66831-.97296c.50271.61665.91016 1.59279.96943 2.40947h.008l.4191-4.32823h.23636s-.26811 2.79788-.4244 4.18818c-.19543 1.74131-.44379 2.46415-.91898 3.22474l-.0727-.33126c.37006-.65017.47589-1.21779.52387-1.51659.15064-.93098-.0646-2.20169-.71332-3.19334-.72672-1.11125-2.026-1.92864-3.62091-1.92864-1.31021 0-2.44863.57573-3.24308 1.47426l-.19262-.1524c.84102-.95462 2.0634-1.56351 3.4357-1.56351 1.43898 0 2.72027.64664 3.5934 1.71732m-2.32798 2.39748-.0885-.00071c-.10866-.14675-1.24425-1.33138-1.34267-1.43616-.002.10019-.003.30833-.003.51082 0 .26882.0205.6791.0324.901-.0275-.005-.0681-.01-.11536-.01-.048 0-.0871.004-.11853.01.0222-.2861.0282-.75036.0282-1.1871 0-.34078-.005-.52775-.009-.69991l.0885.001c.11465.12453 1.24389 1.29293 1.34232 1.3977.002-.0998.003-.27657.003-.47907 0-.26881-.0205-.67945-.0324-.90099.0275.005.0681.01.11535.01.048 0 .0871-.004.11889-.01-.0226.2861-.0286.75036-.0286 1.1871 0 .34078.005.5341.009.70626m-2.04858-.0342c-.0247 0-.11818.001-.16969.009-.10689-.16298-.44944-.67663-.68262-.91616-.007 0-.13759 0-.13759 0v.21519c0 .23283.0106.46814.0215.70097-.0459-.008-.12911-.009-.14605-.009-.0173 0-.10054.001-.1464.009.0109-.23283.0215-.46814.0215-.70097v-.46531c0-.23284-.0106-.46849-.0215-.70097.10301.008.23283.0134.33584.0134.10302 0 .20567-.0134.30833-.0134.30586 0 .58632.0903.58632.43074 0 .36018-.35913.49001-.5648.51682.13265.1651.60748.74365.76447.91969-.054-.008-.14464-.009-.16933-.009m-1.58962.009c-.097-.005-.23213-.009-.36019-.0113-.0737-.001-.14569-.002-.20214-.002h-.024c-.1651 0-.41839.005-.58349.0134.0109-.23566.0219-.47096.0219-.70379v-.46532c0-.23283-.0109-.46813-.0219-.69814.16228.008.4131.0134.57538.0134s.46531-.007.55915-.0134c-.004.0254-.007.0554-.007.0921 0 .037.004.0751.007.0935-.1785-.0134-.49671-.0353-.84843-.0353-.003.11642-.008.60995-.008.67769.31926 0 .52387-.0138.68368-.0268-.005.0268-.008.0755-.008.10231 0 .0272.003.0674.008.0945-.18662-.019-.60466-.0247-.68368-.0247-.005.0907-.00071.67628.003.72566.19791-.003.70485-.0183.88935-.0353-.003.0205-.006.0628-.006.10407 0 .0409.002.0709.006.0995m-1.73037 2.69028c-.32244-.65581-.46885-1.32186-.48825-1.95897.0822 0 .1771.003.25894.003.0286.60996.16651 1.36772.64347 2.19146-.17216-.0631-.30163-.14676-.41416-.23566m-1.43263-3.62479c0-.58173.43991-.96908 1.03822-.96908.23283 0 .49918.072.6477.13547-.031.0688-.0564.15981-.0674.2166l-.0162.006c-.115-.12736-.29986-.23777-.57361-.23777-.34749 0-.74719.28116-.74719.84208 0 .5461.40746.83608.77153.83608.32737 0 .48366-.1524.62441-.27129l.0109.0109-.0399.21202c-.0646.0487-.28822.18803-.62442.18803-.60925 0-1.02411-.38382-1.02411-.96873m4.8461-4.27002c.7112.19967 1.3776.56515 1.90747 1.05904-.15275-.0406-.30868-.0737-.46708-.0984-.74506-.58878-1.71485-.94015-2.72803-.94015-2.39395 0-4.35327 1.95227-4.35327 4.35187 0 2.39959 1.95227 4.35151 4.35186 4.35151 2.3996 0 4.35152-1.95192 4.35152-4.35151 0-.92816-.34961-1.85561-.82974-2.51072.11466.0346.25436.0935.41522.18873.32491.49283.62654 1.29752.88477 2.53189.27093 1.29505 1.66476 7.49794 1.81539 8.16822h1.68734v-12.71341l-7.03545-.0434zm-2.32022 9.05439c.34537.29881.89218.67487 1.56845.91793-.0564.0603-.11782.12559-.18309.19473-.67557-.26705-1.33632-.68192-1.84961-1.24036.14428.0487.30339.0928.46425.1277m-5.06095-10.72056v14.41662h4.30248l4.25627-4.52614-.006-.005c-.68439.4826-1.55293.74471-2.4892.74471-1.73532 0-3.26461-1.02941-3.92783-2.3107l-.007.005.90276 3.04624h-.24448s-.44803-1.54376-.83044-2.88925c-.28928-1.01847-.46778-1.77306-.46531-2.44264.008-2.30328 1.81892-4.41501 4.22769-4.57094.066-.005.27093-.0258.57608-.0261 1.85526-.001 7.57203.0427 8.1213.0469v-1.48802zm11.37956 10.37802.0649.29492c-.77823.84067-1.96956 1.47073-3.35668 1.47073-.29704 0-.60713-.0289-.95215-.10195.0702-.0744.13723-.14605.20038-.21308.22154.0392.47625.0653.73766.0653 1.34902.00071 2.52765-.60642 3.30588-1.51588m-.72285-4.21147c.0219 1.27142-.56056 2.13466-.744 2.43382-.15981.26105-.54187.76412-1.27706 1.54481-.92745.98496-3.82623 4.06612-4.01955 4.27144h7.86095l-1.81257-8.25077z" fill="#1e59ae" transform="translate(-164.54114 -200.69462)"/></svg>
|
After Width: | Height: | Size: 4.3 KiB |
BIN
WebSimHelper/logos/FRIB_logo.jpg
Normal file
After Width: | Height: | Size: 18 KiB |
BIN
WebSimHelper/logos/FSU_logo_640.png
Normal file
After Width: | Height: | Size: 600 KiB |
BIN
WebSimHelper/logos/HELIOS_logo.jpg
Normal file
After Width: | Height: | Size: 93 KiB |
BIN
WebSimHelper/logos/ISS_logo.png
Normal file
After Width: | Height: | Size: 5.5 KiB |
BIN
WebSimHelper/logos/SOLARIS_favicon.png
Normal file
After Width: | Height: | Size: 80 KiB |
BIN
WebSimHelper/logos/SOLARIS_logo.png
Normal file
After Width: | Height: | Size: 215 KiB |
43
WebSimHelper/massProxy.py
Executable file
|
@ -0,0 +1,43 @@
|
|||
#!/usr/bin/python3
|
||||
|
||||
import isotopeLib
|
||||
import cgi
|
||||
|
||||
form = cgi.FieldStorage()
|
||||
|
||||
ASym = form.getvalue('ASym')
|
||||
A=form.getvalue('A')
|
||||
Z=form.getvalue('Z')
|
||||
|
||||
|
||||
print( "Content-type:text/html\r\n\r\n")
|
||||
|
||||
if 'ASym' in form :
|
||||
|
||||
if ASym == "p" : ASym = "1H"
|
||||
if ASym == "d" : ASym = "2H"
|
||||
if ASym == "t" : ASym = "3H"
|
||||
if ASym == "a" : ASym = "4He"
|
||||
|
||||
[A,Z] = isotopeLib.GetAZ(ASym)
|
||||
|
||||
if 'A' in form:
|
||||
ASym = isotopeLib.GetSymbol(float(A), float(Z))
|
||||
|
||||
#===================================
|
||||
# print(A)
|
||||
# print(Z)
|
||||
# print(isotopeLib.GetMassFromSym(ASym))
|
||||
# print(ASym)
|
||||
# print(isotopeLib.GetSn(ASym))
|
||||
# print(isotopeLib.GetSp(ASym))
|
||||
# print(isotopeLib.GetSa(ASym))
|
||||
|
||||
print(A , ",",
|
||||
Z , ",",
|
||||
format(isotopeLib.GetMassFromSym(ASym), '.2f'), ",",
|
||||
ASym, ",",
|
||||
format(isotopeLib.GetSn(ASym), '.2f'), ",",
|
||||
format(isotopeLib.GetSp(ASym), '.2f'), ",",
|
||||
format(isotopeLib.GetSa(ASym), '.2f')
|
||||
)
|
287
WebSimHelper/miscCal.html
Normal file
|
@ -0,0 +1,287 @@
|
|||
<!DOCTYOE html>
|
||||
<html>
|
||||
|
||||
<style>
|
||||
body{
|
||||
font-family: Arial, Helvetica, sans-serif;
|
||||
}
|
||||
table{
|
||||
border-collapse: collapse;
|
||||
border : 1px solid;
|
||||
}
|
||||
|
||||
td{
|
||||
padding : 4px;
|
||||
}
|
||||
|
||||
</style>
|
||||
|
||||
<body>
|
||||
|
||||
|
||||
<h1> enA, pnA, pps convertor </h1>
|
||||
|
||||
<table id="convertor">
|
||||
<tr>
|
||||
<td style="text-align:right">Charge state:</td>
|
||||
<td><input type="text" id="ChargeState" size="10" value="6" enterkeyhint="done"/> </td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td style="text-align:right">Attenuation:</td>
|
||||
<td><input type="text" id="att" size="10" value="1e+4" enterkeyhint="done" /> </td>
|
||||
</tr>
|
||||
<tr style="text-align:center">
|
||||
<td>enA </td>
|
||||
<td>pnA </td>
|
||||
<td>pps </td>
|
||||
<td>att. pps </td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><input type="text" id='enA' size="10" value="6" enterkeyhint="done"/></td>
|
||||
<td><input type="text" id="pnA" size="10" enterkeyhint="done"/></td>
|
||||
<td><input type="text" id="pps" size="10" enterkeyhint="done"/></td>
|
||||
<td width="100"></td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
<h1> Yield Calculator </h1>
|
||||
|
||||
<table id="yieldTable">
|
||||
<tr>
|
||||
<td style="text-align:right"> Integrated Xsec </td>
|
||||
<td><Input type="text" id="Xsec" size="10" value="4" enterkeyhint="done"/></td>
|
||||
<td>mb</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td style="text-align:right"> Beam intensity </td>
|
||||
<td><Input type="text" id="BeamPPS" size="10" value="1e5" enterkeyhint="done"/></td>
|
||||
<td>pps</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td style="text-align:right"> Target thickness </td>
|
||||
<td><Input type="text" id="thickness" size="10" value="100" enterkeyhint="done"/></td>
|
||||
<td>ug/cm2</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td style="text-align:right"> Target molar mass </td>
|
||||
<td><Input type="text" id="molar" size="10" value="16" enterkeyhint="done"/></td>
|
||||
<td>g/mol</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td style="text-align:right"> Nucleus/molecule </td>
|
||||
<td><Input type="text" id="ddd" size="10" value="2" enterkeyhint="done"/></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td style="text-align:right"> Num of nucleus per area </td>
|
||||
<td></td>
|
||||
<td>count/cm2</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td style="text-align:right"> Yield per sec </td>
|
||||
<td></td>
|
||||
<td>count/sec</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td style="text-align:right"> Spectroscopic factor </td>
|
||||
<td><Input type="text" id="SF" size="10" value="0.6" enterkeyhint="done"/></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td style="text-align:right"> Wanted Count </td>
|
||||
<td><Input type="text" id="wantedCount" size="10" value="1000" enterkeyhint="done"/></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td style="text-align:right"> stat. uncertainty </td>
|
||||
<td></td>
|
||||
<td>%</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td style="text-align:right"> Beam Time required </td>
|
||||
<td></td>
|
||||
<td>day</td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
</body>
|
||||
|
||||
<script>
|
||||
|
||||
function toSci(xx, digi){
|
||||
//return xx.toExponential(digi).replace(/e\+?/, ' x 10^');
|
||||
return xx.toExponential(digi);
|
||||
}
|
||||
|
||||
function convert(type){
|
||||
let chargeState = document.getElementById('ChargeState').value;
|
||||
let attenuation = document.getElementById('att').value;
|
||||
let eee = 6241510000;
|
||||
|
||||
let table = document.getElementById('convertor');
|
||||
|
||||
if ( type == 1 ){
|
||||
let enA = document.getElementById('enA').value;
|
||||
let pnA = enA/chargeState;
|
||||
let pps = pnA*eee;
|
||||
var att = pps/attenuation;
|
||||
document.getElementById('pnA').value = pnA;
|
||||
document.getElementById('pps').value = toSci(pps,3);
|
||||
}
|
||||
|
||||
if ( type == 2 ){
|
||||
let pnA = document.getElementById('pnA').value;
|
||||
let enA = pnA*chargeState;
|
||||
let pps = pnA*eee;
|
||||
var att = pps/attenuation;
|
||||
document.getElementById('enA').value = enA;
|
||||
document.getElementById('pps').value = toSci(pps,3);
|
||||
}
|
||||
|
||||
if ( type == 3 ){
|
||||
let pps = document.getElementById('pps').value;
|
||||
let pnA = pps/eee;
|
||||
let enA = pnA*chargeState;
|
||||
var att = pps/attenuation;
|
||||
document.getElementById('enA').value = enA;
|
||||
document.getElementById('pnA').value = pnA;
|
||||
}
|
||||
|
||||
table.rows[3].cells[3].innerHTML = '<span style="color:#FF0000">' + toSci(att,3) + '</span>';
|
||||
|
||||
}
|
||||
|
||||
function yieldCal(type){
|
||||
let NA = 6.0221409e+23;
|
||||
let mb2cm = 1e-27;
|
||||
|
||||
let xsec = document.getElementById('Xsec').value;
|
||||
let beamPPS = document.getElementById('BeamPPS').value;
|
||||
let thickness = document.getElementById('thickness').value;
|
||||
let molar = document.getElementById('molar').value;
|
||||
let nParticle = document.getElementById('ddd').value;
|
||||
let SF = document.getElementById('SF').value;
|
||||
let wantedCount = document.getElementById('wantedCount').value;
|
||||
|
||||
let table = document.getElementById('yieldTable');
|
||||
|
||||
let nTarget = thickness * NA * nParticle / molar / 1e6;
|
||||
let yield = xsec * beamPPS * nTarget * mb2cm;
|
||||
|
||||
table.rows[5].cells[1].innerHTML = toSci(nTarget, 3);
|
||||
table.rows[6].cells[1].innerHTML = yield.toPrecision(4);
|
||||
|
||||
let error = Math.sqrt(wantedCount)/wantedCount*100;
|
||||
table.rows[9].cells[1].innerHTML = error.toPrecision(4);
|
||||
|
||||
let day = wantedCount / SF /yield /60/60/24;
|
||||
//table.rows[10].cells[1].innerHTML = day.toPrecision(4);
|
||||
table.rows[10].cells[1].innerHTML = '<span style="color:#FF0000">' + day.toPrecision(4) + '</span>';
|
||||
|
||||
}
|
||||
|
||||
convert(1);
|
||||
yieldCal(1);
|
||||
|
||||
|
||||
document.getElementById('enA').addEventListener('keypress',
|
||||
function(e){
|
||||
//alert( e.keyCode );
|
||||
if(e.keyCode == 13 ){
|
||||
convert(1);
|
||||
}
|
||||
}, false
|
||||
);
|
||||
|
||||
|
||||
document.getElementById('pnA').addEventListener('keypress',
|
||||
function(e){
|
||||
if(e.keyCode == 13){
|
||||
convert(2);
|
||||
}
|
||||
}, false
|
||||
);
|
||||
|
||||
|
||||
document.getElementById('pps').addEventListener('keypress',
|
||||
function(e){
|
||||
if(e.keyCode == 13){
|
||||
convert(3);
|
||||
}
|
||||
}, false
|
||||
);
|
||||
|
||||
document.getElementById('att').addEventListener('keypress',
|
||||
function(e){
|
||||
if(e.keyCode == 13){
|
||||
convert(1);
|
||||
}
|
||||
}, false
|
||||
);
|
||||
|
||||
|
||||
document.getElementById('ChargeState').addEventListener('keypress',
|
||||
function(e){
|
||||
if(e.keyCode == 13){
|
||||
convert(1);
|
||||
}
|
||||
}, false
|
||||
);
|
||||
|
||||
|
||||
document.getElementById('Xsec').addEventListener('keypress',
|
||||
function(e){
|
||||
if(e.keyCode == 13){
|
||||
yieldCal(0);
|
||||
}
|
||||
}, false
|
||||
);
|
||||
|
||||
document.getElementById('BeamPPS').addEventListener('keypress',
|
||||
function(e){
|
||||
if(e.keyCode == 13){
|
||||
yieldCal(1);
|
||||
}
|
||||
}, false
|
||||
);
|
||||
|
||||
document.getElementById('thickness').addEventListener('keypress',
|
||||
function(e){
|
||||
if(e.keyCode == 13){
|
||||
yieldCal(2);
|
||||
}
|
||||
}, false
|
||||
);
|
||||
|
||||
document.getElementById('molar').addEventListener('keypress',
|
||||
function(e){
|
||||
if(e.keyCode == 13){
|
||||
yieldCal(3);
|
||||
}
|
||||
}, false
|
||||
);
|
||||
|
||||
document.getElementById('ddd').addEventListener('keypress',
|
||||
function(e){
|
||||
if(e.keyCode == 13){
|
||||
yieldCal(4);
|
||||
}
|
||||
}, false
|
||||
);
|
||||
|
||||
document.getElementById('SF').addEventListener('keypress',
|
||||
function(e){
|
||||
if(e.keyCode == 13){
|
||||
yieldCal(5);
|
||||
}
|
||||
}, false
|
||||
);
|
||||
|
||||
document.getElementById('wantedCount').addEventListener('keypress',
|
||||
function(e){
|
||||
if(e.keyCode == 13){
|
||||
yieldCal(6);
|
||||
}
|
||||
}, false
|
||||
);
|
||||
</script>
|
||||
|
||||
|
||||
</html>
|
529
WebSimHelper/simpleSim.html
Normal file
|
@ -0,0 +1,529 @@
|
|||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<title>DWBA and Monte Carlo Simulation</title>
|
||||
<link rel="icon" type="image/x-icon" href="logos/SOLARIS_favicon.png">
|
||||
</head>
|
||||
<style>
|
||||
body {
|
||||
font-family: Arial, Helvetica, sans-serif;
|
||||
background: #6DB33E;
|
||||
}
|
||||
</style>
|
||||
<body>
|
||||
|
||||
<h1>DWBA and Monte Carlo Simulation</h1>
|
||||
|
||||
<button onclick="GetClipBoard()">Paste Settings from clipboard</button>
|
||||
|
||||
<form action = "simpleInput.py" method = "POST" target = "uploaded">
|
||||
|
||||
<h3>Reaction: </h3>
|
||||
|
||||
<table>
|
||||
<tr>
|
||||
<td>Beam Energy</td>
|
||||
<td><input type = "text" name = "KEA" size="6" value="10" /></td>
|
||||
<td style="text-align:left">MeV/u</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Beam </td>
|
||||
<td><input type = "text" name = "beam_AZ" size="6" value="16O"/></td>
|
||||
<td style="text-align:right">J<sup>π</sup></td>
|
||||
<td><input type = "text" id="beam_Jpi" name = "beam_Jpi" size="5" value="0+"/><td>
|
||||
<td style="text-align:right">Ex:</td>
|
||||
<td><input type = "text" name = "beam_Ex" size="6" value="0.00"/></td>
|
||||
<td style="text-align:left">MeV</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Target</td>
|
||||
<td><input type = "text" name = "target_AZ" size="6" value="d"/></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Light recoil</td>
|
||||
<td><input type = "text" name = "lRecoil_AZ" size="6" value="p"/></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td> Number of events </td>
|
||||
<td><input type = "text" name = "numEvent" size="6" value="100000"/></td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
<h3>Detector:</h3>
|
||||
|
||||
<table>
|
||||
<tr>
|
||||
<input type="radio" name="SSType" value="HELIOS"/>HELIOS
|
||||
<br>
|
||||
<input type="radio" name="SSType" value="SOLARIS" checked="checked"/>SOLARIS
|
||||
<br>
|
||||
<input type="radio" name="SSType" value="ISS"/>ISS
|
||||
</tr>
|
||||
<tr>
|
||||
<td>B-field </td>
|
||||
<td><input type = "text" name = "BField" size="5" value="-2.5"/></td>
|
||||
<td style="text-align:left">T (minus sign = field point to upstream)</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Array Pos.</td>
|
||||
<td><input type = "text" name = "posArray" size="5" value="-100"/></td>
|
||||
<td style="text-align:left">mm (negative for upstream)</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Recoil Pos.</td>
|
||||
<td><input type = "text" name = "posRecoil" size="5" value="500"/></td>
|
||||
<td style="text-align:left">mm (negative for upstream)</td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
<h3>DWBA and E<sub>x</sub> List:</h3>
|
||||
|
||||
<p><b style="color:red;">For 2-nucleon transfer</b>, <b>Orbital</b> take the form NL=X, where N is number of node, X is momentum number. n and L are related by Σ<sub>i</sub> (2n<sub>i</sub>+l<sub>i</sub>) = 2N + X + 2n + l, where n<sub>i</sub> and l<sub>i</sub> are the principle number and orbital angular momentum of the each transfered nucleon, and n and l are the internal quanta of the 2-nucleon. e.g. (t,p) reaction to 0f orbtial, the left-hand side would be n<sub>i</sub> = 0 and l<sub>i</sub> = 3 and the sum is 3+3 = 6 = 2N + X + 2n+l. Assume n = l = 0, we have 6 = 2N+L. Thus, 3L=0, 2L=2,1L=4, 0L=6. </p>
|
||||
|
||||
TODO: guess the orbital
|
||||
<br>
|
||||
<input type="checkbox" id="pos" onclick="checkParity()" checked/>Positive parity</td>
|
||||
<input type="checkbox" id="neg" onclick="checkParity()" checked/>Negative parity</td>
|
||||
<input type="checkbox" id="unk" onclick="checkParity()" checked/>Unknown parity</td>
|
||||
<br>
|
||||
<button type="button" onclick="addStates()">Add known states</button>
|
||||
Isotope: <input type="text" id="AZ" size="5" value="17O"/>
|
||||
Max Ex: <input type="text" id="maxEx" size="5" value="5"/>MeV
|
||||
|
||||
<p id='waiting'></p>
|
||||
|
||||
<table id="ExTable">
|
||||
<tr>
|
||||
<td><b> E<sub>x</sub> [MeV] </b></td>
|
||||
<td><b> J<sup>π</sup></b></td>
|
||||
<td><b> Orbital </b></td>
|
||||
</tr>
|
||||
</tr>
|
||||
<td><input type="text" name="Ex" size="5" value="0"/></td>
|
||||
<td><input type="text" name="Jpi" size="5" value="3/2+"/></td>
|
||||
<td><input type="text" name="Orb" size="6" value="0d3/2"/></td>
|
||||
<td><button type="button" onclick="addRow(this)">Insert Ex</button></td>
|
||||
<td><button type="button" onclick="deleteRow(this)">Remove Ex</button></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td></td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
<td><button type="button" onclick="copyEx()">Copy Ex</button></td>
|
||||
<td><button type="button" onclick="pasteEx()"> Paste Ex </button></td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
<p></p>
|
||||
<input type="checkbox" name="DWBA" value="On"/>Cal. DWBA
|
||||
<!--<input type="checkbox" name="onlyDWBA" value="On"/>ONLY Cal. DWBA (tetsing)-->
|
||||
|
||||
<table>
|
||||
<tr>
|
||||
<td>Incoming Channel</td>
|
||||
<td>
|
||||
<select name="op1">
|
||||
<option value="A" selected>D | An & Cai (2006) E < 183, 12 < A < 238</option>
|
||||
<option value="H">D | Han, Shi, & Shen (2006) E < 200, 12 < A < 209</option>
|
||||
<option value="B">D | Bojowald et al. (1988) 50 < E < 80, 27 < A < 208</option>
|
||||
<option value="D">D | Daehnick, Childs, Vrcelj (1980) 11.8 < E < 80, 27 < A < 238 (REL) </option>
|
||||
<option value="C">D | Daehnick, Childs, Vrcelj (1980) 11.8 < E < 80, 27 < A < 238 (NON-REL) </option>
|
||||
<option value="L">D | Lohr and Haeberli (1974) 9 < E < 13, 40 < A </option>
|
||||
<option value="Q">D | Perey and Perey (1963) 12 < E < 25, 40 < A </option>
|
||||
<option value="Z">D | Zhang, Pang, Lou (2016) 5 < E < 170, A < 18, spe 6-7Li </option>
|
||||
<option value="K">P | Koning & Delaroche (2009) E < 200, 24 < A < 209 | Iso.Dep.</option>
|
||||
<option value="V">P | Varner et al. (1991) 16 < E < 65, 4 < A < 209</option>
|
||||
<option value="M">P | Menet et al. (1971) 30 < E < 60, 40 < A </option>
|
||||
<option value="G">P | Becchetti and Greenlees (1969) E < 50, 40 < A </option>
|
||||
<option value="P">P | Perey (1963) E < 20, 30 < A < 100 </option>
|
||||
<option value="x">A=3 | Xu, Guo, Han, & Shen (2011) E < 250, 20 < A < 209 </option>
|
||||
<option value="l">A=3 | Liang, Li, & Cai (2009) E < 270, All masses </option>
|
||||
<option value="p">A=3 | Pang et al. (2009) all E, all masses, Iso. Dep. </option>
|
||||
<option value="c">A=3 | Li, Liang, Cai (2007), E < 40, 48 < A < 232, Tritons </option>
|
||||
<option value="t">A=3 | Trost et al. (1987) 10 < E < 220, 10 < A < 208 </option>
|
||||
<option value="h">A=3 | Hyakutake et al. (1980) 90 < E < 120, About 58 < A < 92 </option>
|
||||
<option value="b">A=3 | Becchetti and Greenlees (1971), E < 40, 40 < A, Iso. Dep. </option>
|
||||
<option value="s">A=4 | Su & Han (2015) E < 398, 20 < A < 209 </option>
|
||||
<option value="a">A=4 | Avrigeanu et al. (2009) </option>
|
||||
<option value="f">A=4 | Bassani and Picard (1969) 24 < E < 31, A = 90 </option>
|
||||
</select>
|
||||
<td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Outgoing Channel</td>
|
||||
<td>
|
||||
<select name="op2">
|
||||
<option value="A">D | An & Cai (2006) E < 183, 12 < A < 238</option>
|
||||
<option value="H">D | Han, Shi, & Shen (2006) E < 200, 12 < A < 209</option>
|
||||
<option value="B">D | Bojowald et al. (1988) 50 < E < 80, 27 < A < 208</option>
|
||||
<option value="D">D | Daehnick, Childs, Vrcelj (1980) 11.8 < E < 80, 27 < A < 238 (REL) </option>
|
||||
<option value="C">D | Daehnick, Childs, Vrcelj (1980) 11.8 < E < 80, 27 < A < 238 (NON-REL) </option>
|
||||
<option value="L">D | Lohr and Haeberli (1974) 9 < E < 13, 40 < A </option>
|
||||
<option value="Q">D | Perey and Perey (1963) 12 < E < 25, 40 < A </option>
|
||||
<option value="Z">D | Zhang, Pang, Lou (2016) 5 < E < 170, A < 18, spe 6-7Li </option>
|
||||
<option value="K" selected>P | Koning & Delaroche (2009) E < 200, 24 < A < 209, Iso.Dep.</option>
|
||||
<option value="V">P | Varner et al. (1991) 16 < E < 65, 4 < A < 209</option>
|
||||
<option value="M">P | Menet et al. (1971) 30 < E < 60, 40 < A </option>
|
||||
<option value="G">P | Becchetti and Greenlees (1969) E < 50, 40 < A </option>
|
||||
<option value="P">P | Perey (1963) E < 20, 30 < A < 100 </option>
|
||||
<option value="x">A=3 | Xu, Guo, Han, & Shen (2011) E < 250, 20 < A < 209 </option>
|
||||
<option value="l">A=3 | Liang, Li, & Cai (2009) E < 270, All masses </option>
|
||||
<option value="p">A=3 | Pang et al. (2009) all E | all masses, Iso. Dep. </option>
|
||||
<option value="c">A=3 | Li, Liang, Cai (2007), E < 40, 48 < A < 232, Tritons </option>
|
||||
<option value="t">A=3 | Trost et al. (1987) 10 < E < 220, 10 < A < 208 </option>
|
||||
<option value="h">A=3 | Hyakutake et al. (1980) 90 < E < 120, About 58 < A < 92 </option>
|
||||
<option value="b">A=3 | Becchetti and Greenlees (1971), E < 40, 40 < A, Iso. Dep. </option>
|
||||
<option value="s">A=4 | Su & Han (2015) E < 398, 20 < A < 209 </option>
|
||||
<option value="a">A=4 | Avrigeanu et al. (2009) </option>
|
||||
<option value="f">A=4 | Bassani and Picard (1969) 24 < E < 31, A = 90 </option>
|
||||
</select>
|
||||
<td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
<table>
|
||||
<tr>
|
||||
<input type="checkbox" name="onlyDWBA" value="On"/>Only DWBA and Don't Sim. Angle range (for only DWBA)
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Min [deg]: </td>
|
||||
<td><input type = "text" name = "minAng" size="6" value="0" /></td>
|
||||
<td>Max [deg]: </td>
|
||||
<td><input type = "text" name = "maxAng" size="6" value="90"/></td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
<h3> Plot config:</h3>
|
||||
|
||||
<table>
|
||||
<tr>
|
||||
<td><input type="checkbox" name="plot" value="pEZ" checked/>E vs Z</td>
|
||||
<td><input type="checkbox" name="plot" value="pExCal" checked/>Ex (cal.)</td>
|
||||
<td><input type="checkbox" name="plot" value="pThetaCM" checked/>ThetaCM</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><input type="checkbox" name="plot" value="pThetaCM_Z" checked/>ThetaCM vs Z</td>
|
||||
<td><input type="checkbox" name="plot" value="pRecoilXY" checked/>Recoil X vs Y</td>
|
||||
<td><input type="checkbox" name="plot" value="pRecoilRThetaCM"/>Recoil-R vs ThetaCM</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><input type="checkbox" name="plot" value="pRecoilRZ"/>Recoil R vs Z</td>
|
||||
<td><input type="checkbox" name="plot" value="pTDiffZ"/>Time diff vs Z</td>
|
||||
<td><input type="checkbox" name="plot" value="pArrayXY"/>Array X vs Y</td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
<p></p>
|
||||
|
||||
<input type="checkbox" name="gate" value="hit==1" checked/>Array Hit<br>
|
||||
<input type="checkbox" name="gate" value="loop<=1" checked/>Loop = 1<br>
|
||||
<input type="checkbox" name="gate" value="thetaCM>10" checked/> ThetaCM > 10 deg<br>
|
||||
|
||||
<p></p>
|
||||
|
||||
<input type = "submit" value = "Run DWBA and Simulation" style="width:200px;height:60px;" formtarget="_blank"/>
|
||||
</form>
|
||||
|
||||
<hr style="height:4px;background-color:#F7CF3C; border-style:none; border-width:none">
|
||||
|
||||
<h2>Advanced control</h2>
|
||||
|
||||
<!-- ////////////////////////////////////////// -->
|
||||
<table>
|
||||
<tr>
|
||||
<td>Download Sample files:</td>
|
||||
<td style="text-align:left">
|
||||
<a href="sample_files/reactionConfig_sample.txt" download="reactionConfig.txt">Reaction File</a>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td></td>
|
||||
<td style="text-align:left">
|
||||
<a href="sample_files/detectorGeo_SOLARIS_sample.txt" download="detectorGeo_SOLAIRS.txt">DetectorGeo (SOLARIS) File</a>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td></td>
|
||||
<td style="text-align:left">
|
||||
<a href="sample_files/detectorGeo_HELIOS_sample.txt" download="detectorGeo_HELIOS.txt">DetectorGeo (HELIOS) File</a>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td></td>
|
||||
<td style="text-align:left">
|
||||
<a href="sample_files/Ex_sample.txt" download="Ex.txt">Ex File</a>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td></td>
|
||||
<td style="text-align:left">
|
||||
<a href="sample_files/DWBA_sample.txt" download="DWBA">DWBA File</a>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td></td>
|
||||
<td style="text-align:left">
|
||||
<a href="sample_files/PlotConfig_sample.txt" download="PlotConfig.txt">Plot Config File</a>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
<p></p><!-- ////////////////////////////////////////// -->
|
||||
<form enctype = "multipart/form-data" action = "Simulation_gateway.py" method = "post" target="uploaded">
|
||||
<table>
|
||||
<tr>
|
||||
<td style="text-align:right" width="200">Reaction File </td>
|
||||
<td><input type = "file" name = "filename1" /> </td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td style="text-align:right" width="200">DetectorGeo File </th>
|
||||
<td><input type = "file" name = "filename2" /> </td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td style="text-align:right" width="200">Ex File </th>
|
||||
<td><input type = "file" name = "filename3" /> </td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td style="text-align:right" width="200">DWBA File ^ </th>
|
||||
<td><input type = "file" name = "filename4" /> </td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td style="text-align:right" width="200">*.in File ^ </th>
|
||||
<td><input type = "file" name = "filename4a" /> </td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td style="text-align:right" width="200">Plot Config File # </th>
|
||||
<td><input type = "file" name = "filename5" /> </td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>^ can be alone <br># can be omitted</th>
|
||||
<td><input type = "submit" value = "Upload & Run Simulation" style="height:50px; width:200px" formtarget="_blank"/> </td>
|
||||
</tr>
|
||||
</table>
|
||||
</form>
|
||||
|
||||
<ul>
|
||||
<li>File name can be customized.</li>
|
||||
<li>For kinematic simulation, only the reactionConfig.txt, detectorGeo.txt, and Ex.txt are needed.</li>
|
||||
<li>For DWBA calculation, only the DWBA file is needed.</li>
|
||||
<li>If reactionConfig.txt, detectorGeo.txt, and DWBA file are presented, will do DWBA and use the result for simulation.</li>
|
||||
<li>When the DWBA file is presented, the kinematic simulation will use the DWBA result and also the excitation energy. i.e. the user provide Ex.txt will not be used.</li>
|
||||
<li>User can use a customs in File for DWBA calculation. Once the in File exist, it ignores the DWBA file.</li>
|
||||
<li>To change DWBA angular range, download the in file, edit it. But becareful, DWBA for kinematic simulation must be 0 -180 deg.</li>
|
||||
</ul>
|
||||
|
||||
<hr style="height:4px;background-color:#F7CF3C; border-style:none; border-width:none">
|
||||
The source code for calculation can be found in <a href="https://github.com/calemhoffman/digios/tree/master/analysis/Cleopatra/Transfer.C" target="_blank">Here</a>
|
||||
|
||||
</body>
|
||||
|
||||
|
||||
<script>
|
||||
|
||||
function GetClipBoard(){
|
||||
navigator.clipboard.readText().then(
|
||||
function(result){
|
||||
//console.log(result);
|
||||
if( result.substring(0,16) == "====HELIOSMATICS" ){
|
||||
let haha = result.substring(17).split(', ');
|
||||
console.log(haha);
|
||||
//alert(haha);
|
||||
document.getElementsByName('beam_AZ')[0].value = haha[0];
|
||||
document.getElementsByName('beam_Ex')[0].value = haha[1];
|
||||
document.getElementsByName('target_AZ')[0].value = haha[2];
|
||||
document.getElementsByName('lRecoil_AZ')[0].value = haha[3];
|
||||
document.getElementsByName('KEA')[0].value = haha[5];
|
||||
document.getElementsByName('BField')[0].value = haha[4];
|
||||
document.getElementsByName('posArray')[0].value = haha[6];
|
||||
document.getElementsByName('posRecoil')[0].value = haha[7];
|
||||
|
||||
document.getElementById('AZ').value = haha[8];
|
||||
|
||||
}
|
||||
}
|
||||
);
|
||||
|
||||
}
|
||||
|
||||
function copyEx(){
|
||||
let inputs = document.getElementsByTagName("input");
|
||||
let copyText = "====ExList|";
|
||||
for(let i = 0; i < inputs.length; i++){
|
||||
if( inputs[i].type == 'text'){
|
||||
if( inputs[i].name == "Ex" || inputs[i].name == "Jpi" || inputs[i].name == "Orb" ){
|
||||
//if( inputs[i].value == "" ) continue;
|
||||
copyText += inputs[i].value;
|
||||
if(inputs[i].name == "Orb") {
|
||||
copyText += "|";
|
||||
}else{
|
||||
copyText += ",";
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
//console.log(copyText);
|
||||
|
||||
navigator.clipboard.writeText(copyText).then(
|
||||
() => {
|
||||
alert('Ex are copied to clipboard.\n' + copyText);
|
||||
}).catch(
|
||||
() =>{
|
||||
alert('Cannot copy.');
|
||||
});
|
||||
}
|
||||
|
||||
function pasteEx(){
|
||||
navigator.clipboard.readText().then(
|
||||
function(result){
|
||||
//console.log(result);
|
||||
if( result.substring(0,10) == "====ExList" ){
|
||||
let haha = result.substring(11).split('|');
|
||||
//console.log(haha);
|
||||
let table = document.getElementById("ExTable");
|
||||
let nRow = table.rows.length;
|
||||
//console.log(nRow);
|
||||
//remove all Row except the 1st
|
||||
for( let i = nRow; i > 2; i--){
|
||||
table.deleteRow(i - 2);
|
||||
}
|
||||
|
||||
for( let i = 0; i < haha.length; i++){
|
||||
if( haha[i] == "" ) continue;
|
||||
|
||||
let kaka = haha[i].split(',');
|
||||
//console.log(kaka);
|
||||
|
||||
nRow = table.rows.length;
|
||||
let row = table.insertRow(nRow-1);
|
||||
row.innerHTML = '<td><input type="text" name="Ex" size="5" value="' + kaka[0] + '"/></td> \
|
||||
<td><input type="text" name="Jpi" size="5" value="' + kaka[1] + '"/></td> \
|
||||
<td><input type="text" name="Orb" size="6" value="' + kaka[2] + '"/></td>\
|
||||
<td><button type="button" onclick="addRow(this)">Insert Ex</button></td> \
|
||||
<td><button type="button" onclick="deleteRow(this)">Remove Ex</button></td>';
|
||||
}
|
||||
|
||||
}else{
|
||||
alert("Setting not fond in clipboard.");
|
||||
}
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
let parity;
|
||||
function checkParity(){
|
||||
parity = 0;
|
||||
if( document.getElementById('pos').checked == true ) parity += 1;
|
||||
if( document.getElementById('neg').checked == true ) parity += 2;
|
||||
if( document.getElementById('unk').checked == true ) parity += 4;
|
||||
//console.log(parity);
|
||||
}
|
||||
|
||||
checkParity();
|
||||
|
||||
function addStates(){
|
||||
let AZ = document.getElementById('AZ').value;
|
||||
let maxEx = document.getElementById('maxEx').value;
|
||||
let beamJpi = document.getElementById('beam_Jpi').value;
|
||||
|
||||
let str = 'get_nuclear_data.py?isotopes_name=' + AZ + '&maxEx='+maxEx;
|
||||
|
||||
let table = document.getElementById("ExTable");
|
||||
|
||||
const client = new XMLHttpRequest();
|
||||
|
||||
client.addEventListener('loadstart',
|
||||
function(e){
|
||||
document.getElementById('waiting').innerHTML = "wait....retrieving data from IAEA..";
|
||||
}
|
||||
);
|
||||
|
||||
client.addEventListener('error',
|
||||
function(e){
|
||||
document.getElementById('waiting').innerHTML = "Error.";
|
||||
}
|
||||
);
|
||||
|
||||
client.addEventListener('loadend',
|
||||
function(e){
|
||||
let result = client.responseText.split(/\r?\n/);
|
||||
|
||||
//clear table
|
||||
let nRow = table.rows.length;
|
||||
for( let j = nRow; j > 2; j--){
|
||||
table.deleteRow(j - 2);
|
||||
}
|
||||
|
||||
document.getElementById('waiting').innerHTML = "";
|
||||
let count = 0;
|
||||
|
||||
for( let i = 0; i < result.length; i++){
|
||||
if( i < 17 ) continue;
|
||||
if( result[i] == "</table>" ) break;
|
||||
|
||||
let kaka = result[i].split(' ').filter(n => n);
|
||||
|
||||
let ex = parseFloat(kaka[3])/1000.;
|
||||
let jpi = kaka[7]?.replace('(', '')?.replace(')', '');
|
||||
console.log(ex + ", " + jpi);
|
||||
|
||||
//check parity
|
||||
if( (((parity >> 2) & 1) != 1) && kaka[7].slice(-1) == ")" ) continue;
|
||||
if( (((parity >> 2) & 1) != 1) && jpi == "," ) continue;
|
||||
if( (((parity) & 1) != 1) && jpi.slice(-1) == "+" ) continue;
|
||||
if( (((parity >> 1) & 1) != 1) && jpi.slice(-1) == "-" ) continue;
|
||||
|
||||
count ++;
|
||||
nRow = table.rows.length;
|
||||
let row = table.insertRow(nRow-1);
|
||||
row.innerHTML = '<td><input type="text" name="Ex" size="5" value="' + ex.toFixed(3) + '"/></td> \
|
||||
<td><input type="text" name="Jpi" size="5" value="' + jpi + '"/></td> \
|
||||
<td><input type="text" name="Orb" size="6" /></td> \
|
||||
<td><button type="button" onclick="addRow(this)">Insert Ex</button></td> \
|
||||
<td><button type="button" onclick="deleteRow(this)">Remove Ex</button></td> \
|
||||
<td>'+ kaka[7] +'</td>';
|
||||
|
||||
}
|
||||
if( count == 0 ){
|
||||
document.getElementById('waiting').innerHTML = "no states found.";
|
||||
nRow = table.rows.length;
|
||||
let row = table.insertRow(nRow-1);
|
||||
row.innerHTML = '<td><input type="text" name="Ex" size="5" value="0"/></td> \
|
||||
<td><input type="text" name="Jpi" size="5" value="1/2+"/></td> \
|
||||
<td><input type="text" name="Orb" size="6" value="1s1/2"/></td> \
|
||||
<td><button type="button" onclick="addRow(this)">Insert Ex</button></td> \
|
||||
<td><button type="button" onclick="deleteRow(this)">Remove Ex</button></td>';
|
||||
}
|
||||
}
|
||||
);
|
||||
|
||||
client.open('GET', str);
|
||||
client.send();
|
||||
|
||||
}
|
||||
|
||||
//document.getElementById("ExTable").find('tr').click( () => {alert( $this.index);} );
|
||||
|
||||
function addRow(ele) {
|
||||
|
||||
let iRow = ele.closest('tr').sectionRowIndex;
|
||||
|
||||
let table = document.getElementById("ExTable");
|
||||
let row = table.insertRow(iRow+1);
|
||||
row.innerHTML = '<td><input type="text" name="Ex" size="5" /></td> \
|
||||
<td><input type="text" name="Jpi" size="5"/></td> \
|
||||
<td><input type="text" name="Orb" size="6"/></td> \
|
||||
<td><button type="button" onclick="addRow(this)">Insert Ex</button></td> \
|
||||
<td><button type="button" onclick="deleteRow(this)">Remove Ex</button></td>';
|
||||
}
|
||||
|
||||
function deleteRow(ele){
|
||||
let table = document.getElementById("ExTable");
|
||||
let nRow = table.rows.length;
|
||||
let iRow = ele.closest('tr').sectionRowIndex;
|
||||
if ( nRow > 3){
|
||||
table.deleteRow(iRow);
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
</html>
|