Skip to content
Snippets Groups Projects
  • Lucio Zambon's avatar
    Update 19 files · 94836396
    Lucio Zambon authored
    - /blm.js
    - /blm2d.js
    - /bpm2d.js
    - /component.php
    - /elettra_lattice.php
    - /fermi_lattice.php
    - /magnet.php
    - /open.svg
    - /panther.js
    - /panther.php
    - /panther_conf.js
    - /panther_lattice.json
    - /panther2d.js
    - /panther2d.php
    - /save.svg
    - /updater.php
    - /elettra_lattice.json
    - /fermi_lattice.json
    - /README.md
    94836396
fermi_lattice.php 4.82 KiB
<?php
$f = file('./lattice/Fermi_CM_coord.csv'); // extracted from //sincro-share/Private/FERMI_CM/Fermi_CM.xls
$blmSrcs = array(
	'http://puma-01.elettra.eu/rchan.php?json&valueOnly&src=srv-tango-srf-01.fcs.elettra.trieste.it:20000/f/radiation_protection/blm_master_linac.01(BlmConfiguration)',
	'http://puma-01.elettra.eu/rchan.php?json&valueOnly&src=srv-tango-srf-01.fcs.elettra.trieste.it:20000/f/radiation_protection/blm_master_linac.02(BlmConfiguration)',
	'http://puma-01.elettra.eu/rchan.php?json&valueOnly&src=srv-tango-srf-01.fcs.elettra.trieste.it:20000/f/radiation_protection/blm_master_uh.01(BlmConfiguration)'
);
$blm = array();
foreach ($blmSrcs as $b) {
	$data = json_decode(file_get_contents($b), false);
	foreach ($data as $d) {
		$k = explode('/BLM_', strtoupper($d));
		$end = substr($k[1], -2);
		$v = ($end=='_L' || $end=='_R')? substr($k[1], 0, -2): (($end=='DN' || $end=='UP')? substr($k[1], 0, -3): $k[1]);
		$blm[$k[1]] = $v;
	}
}
$components = array(
	"Q" => "quadrupolefermi",
	"CBPM" => "bpm",
	"BPM" => "bpm",
	/*"ACCT0" => "cavitylinac",
	"ACCT" => "cavitylinac",
	"ACCBT" => "cavitylinac",
	"ID" => "wiggler",
	"UND" => "undulator",*/
	"CHV" => "correctorfermi",
	"CH" => "correctorfermi",
	"CV" => "correctorfermi"
);

// ----------------------------------------------------------------
// emit diff
function eval_diff($a, $b) {
	$old_error_reporting = error_reporting(E_ALL);
	require_once('../../lib/diff.php');
	error_reporting($old_error_reporting);
	$diff = new diff;
	$text = $diff->inline($b,$a,2);
	echo '<h3>Differences between JSON lattice and references</h3>'.count($diff->changes).' changes';
	echo $text;
}

function component_diff() {
	global $latticeFile;
	echo '<h3>Supported components</h3><table>';
	$json = json_decode(file_get_contents($latticeFile), true);
	$comp = array();
	foreach ($json as $devname=>$device) {
		foreach ($device as $kseg=>$segment) {
			foreach ($segment['magnets'] as $m) $comp[$m['type']] = true;
		}
	}
	foreach ($comp as $component=>$v) {
		if (strpos($component, '_FLSC')!==false) continue;
		echo "<tr><td>$component </td><td> ".(file_exists("./components/{$component}.js")? "OK": "missing")."</td></tr>\n";
	}
	die("</table>");
}

$bending = array();
$json = file('./fermi_lattice.json');
foreach ($json as $r) if (strpos($r, "bending")!==false) {
	$b = explode('"name": "', $r);
	$n = explode('"', $b[1]);
	$bending[$n[0]] = rtrim($r);
}
$buf = '{<br>	"linac": [<br>		{<br>';
$table = '<head>
	<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/css/bootstrap.min.css">
</head >
<table class="table table-hover table-striped">
';
$magnets = 0;
foreach($f as $i=>$r) {
	if ($i<1) {continue;}
	$c = explode(';', strtr($r, array(','=>'.')));
	$comp = explode('_', $c[0]);
	if ($i==2) {$x = round($c[2]); $z = -round($c[3]); $buf .= '			"start": {"x": '.$x.', "z": '.($z+60000).'},<br>			"chamber": {"type": "chamber"},<br>			"magnets": [<br>'; }
	if ($comp[0]=='B' && $c[1] != 'DRIFT') {
		$x = round($c[2]);
		$z = -round($c[3]);
		if ($magnets>0) $buf = substr($buf, 0, strlen($buf)-5).'<br>';
		$buf .= '			]<br>		},<br>		{<br>			"start": {"x": '.$x.', "z": '.($z+60000).'},<br>'.$bending[$c[0]].'<br>			"chamber": {"type": "chamber"},<br>			"magnets": [<br>';
		if (($i = array_search($c[0], $blm))!==false) {$buf .= '				{"type": "blm", "position": 100, "name": "BLM_'.$i.'"},<br>'; unset($blm[$i]);}
		if (($i = array_search($c[0], $blm))!==false) {$buf .= '				{"type": "blm", "position": 100, "name": "BLM_'.$i.'"},<br>'; unset($blm[$i]);}
		$magnets = 0;
	}
	else if ($comp[0]!='DR' && !empty($comp[0])) {
		$magnets++;
		$name = $c[0];
		if (strpos($name, '(')!==false) {$n = explode('(', $c[0]); $name = trim($n[0]);} 
		$buf .= '				{"type": "'.strtr($comp[0], $components).'", "position": '.round(sqrt(($x-$c[2])**2+($z+$c[3])**2)).', "name": "'.$c[0].'"},<br>';
		if (($i = array_search($name, $blm))!==false) {$buf .= '				{"type": "blm", "position": '.round(sqrt(($x-$c[2])**2+($z+$c[3])**2)).', "name": "BLM_'.$i.'"},<br>'; unset($blm[$i]);}
		if (($i = array_search($name, $blm))!==false) {$buf .= '				{"type": "blm", "position": '.round(sqrt(($x-$c[2])**2+($z+$c[3])**2)).', "name": "BLM_'.$i.'"},<br>'; unset($blm[$i]);}
	}
	$table .= "<tr><td>{$comp[0]}</dt><td>{$c[1]}</dt><td>".round($c[2])."</dt><td>".round($c[3])."</dt><td>".round($c[6]*1000)."</dt><td>$r</td></tr>\n";
}
$buf = substr($buf, 0, strlen($buf)-5).'<br>			]<br>		}<br>	]<br>}<br>';
$table .= "</table>\n<br><br><br><br>";
if ($_REQUEST['json']=='diff') {
	$b = explode("\n", strtr($buf, array('<br>'=>"\n", '<pre>'=>'', '</pre>'=>'', "},\n			]"=>"}\n			]")));
	foreach ($b as $i=>$j) $b[$i] = rtrim($j);
	eval_diff($json, $b);
	component_diff();
}
foreach ($blm as $k=>$v) {
	echo "$k $v ".(strpos($buf, $v)===false? "NOK": "ok")."<br>\n";
}

if (isset($_REQUEST['table'])) echo "$table\n<br><br><br><br>";
echo "<pre>$buf</pre>";

?>