XraySim/xraysim/xraysim.run.js

172 lines
5.4 KiB
JavaScript

var http = require('http'),
path = require('path'),
fs = require('fs');
print=console.log
var URL = 'localhost:6666'
function POST(url, data, cb) {
var params,headers;
if (data && data.params && data.data != undefined) {
params=data.params;
headers=data.headers;
data=data.data;
}
var ishttps= url.match(/https:/);
url=url.replace(/http[s]?:\/\//,'');
var parts = url.split(':'),
path = parts[0].split('/').slice(1).join('/'),
host = parts[0].split('/')[0],
port = parts[1]||(ishttps?'443':'80');
if (params) {
var o=params,sep='';
params='/?';
for(var p in o) {
params = params + sep + p + '='+o[p];
sep='&';
}
} else params='';
var post_data = typeof data == 'string'?data:JSON.stringify(data);
var post_options = {
host: host,
port: port,
path: '/'+path+params,
method: 'POST',
keepAlive: true,
headers: headers || {
'Content-Type': 'application/json', // ?? 'application/x-www-form-urlencoded',
// 'Content-Length': Buffer.byteLength(post_data)
'Content-Length': post_data.length,
}
};
// console.log('POST', post_options,post_data)
var post_req = (ishttps?https:http).request(post_options, function(res) {
res.setEncoding('utf8');
var data='';
res.on('data', function (chunk) {
data += chunk;
// console.log('Response: ' + chunk);
});
res.on('end', function () {
try {
var result=JSON.parse(data);
// console.log('POST: ',result);
} catch (e) { print(data); result=e; }
if (cb) cb(result);
});
});
post_req.on('error',function (err) {
if (cb) cb(err); else console.log(url,err)
});
post_req.setNoDelay();
// console.log('POST: ',post_data);
// post the data
post_req.write(post_data);
post_req.end();
}
function test() {
var req = {
command : 'sim1',
parts : [
{name:'plate1metal',density:5,data:fs.readFileSync('../demo3/plate1_metal.stl','utf8') },
{name:'plate1fibre',density:2,data:fs.readFileSync('../demo3/plate1_fibre.stl','utf8') },
],
arguments : {
energy : 0.1,
width : 1000,
height : 1000
}
}
var body = JSON.stringify(req)
print(body.length)
POST(URL,body, function (result) {
if (result instanceof Error) return print(result);
var image = result.image
image.data=new Uint32Array(image.data);
print(image)
})
}
function savePGM(name, image, range) {
var header = 'P2\n'+image.width+' '+image.height+'\n'+range+'\n',
data = [],
min = image.min,
max = image.max,
scale = range/(image.max-image.min)
// auto scale
for (var i=0;i<image.data.length;) {
var row = []
for(var k=0;k<8;k++) {
row.push(((image.data[i]-min)*scale)|0)
i++;
if (i==image.data.length) break;
}
data.push(row.join(' '))
}
fs.writeFileSync(name,header+data.join('\n'),"utf8");
}
function usage () {
print("usage: xraysim [-ip URL] [-s(ourcePos) x y z] [-d(etPos) x y z] [-D(etUpVec) x y z");
print(" [-S(scale) min max range (linear)] [-e(nergy) MeV]");
print(" [-p pixelsize] [-w(idth) pixels] [-h(eight) pixels] ");
print(" [-r(otate-z) degree] [-R(otate) x y z]");
print(" [-o out.pgm|tif(f)]");
print(" [-u density g/cm3] file.stl [-u density file2.stl ..]");
}
function sim() {
var arguments = {},
densities = [],
output = 'xray.pgm',
parts = []
for(var i=2;i<process.argv.length;i++) {
var arg=process.argv[i];
switch (arg) {
case '-help': return usage();
case '-e': arguments.energy=process.argv[++i]; break;
case '-r': arguments.rotate=process.argv[++i]; break;
case '-R': arguments.Rotate = [process.argv[++i],process.argv[++i],process.argv[++i]]; break;
case '-w': arguments.width=process.argv[++i]; break;
case '-h': arguments.height=process.argv[++i]; break;
case '-u': densities.push(process.argv[++i]); break;
case '-p': arguments.pixelSize=process.argv[++i]; break;
case '-o': output=process.argv[++i]; break;
case '-ip': URL=process.argv[++i]; break;
case '-s': arguments.sourcePos = [process.argv[++i],process.argv[++i],process.argv[++i]]; break;
case '-d': arguments.detectorPos = [process.argv[++i],process.argv[++i],process.argv[++i]]; break;
case '-D': arguments.detectorUpVec = [process.argv[++i],process.argv[++i],process.argv[++i]]; break;
case '-S': arguments.scale = [process.argv[++i],process.argv[++i],process.argv[++i]]; break;
default:
if (arg[0]!='-') {
parts.push(arg);
}
}
}
if (parts.length > 1 && parts.length != densities.length) throw "Parts and densities have different lengths";
for(var i=0;i<parts.length;i++) {
parts[i]={
name:path.basename(parts[i]),
density:densities[i]||1,
data:fs.readFileSync(parts[i],'utf8')
}
}
var req = {
command:'sim1',
parts:parts,
arguments:arguments
}
var body = JSON.stringify(req)
print('sending request body',body.length)
POST(URL,body, function (result) {
if (result instanceof Error) return print(result);
print(result.stdout)
var image = result.image
image.data=new Uint32Array(image.data);
// print(image)
savePGM(output,image,(req.arguments.scale && req.arguments.scale[2]) || 65535)
})
}
sim()