Compare commits
6 Commits
2.x.experi
...
1.1.40
| Author | SHA1 | Date | |
|---|---|---|---|
| 858d8dbd45 | |||
| 879ec1d657 | |||
| 3025f597c0 | |||
| 73107a4799 | |||
| a5da9a2527 | |||
| 21d935e35e |
@@ -28,6 +28,10 @@
|
|||||||
<attribute name="maven.pomderived" value="true"/>
|
<attribute name="maven.pomderived" value="true"/>
|
||||||
</attributes>
|
</attributes>
|
||||||
</classpathentry>
|
</classpathentry>
|
||||||
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
|
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.6">
|
||||||
|
<attributes>
|
||||||
|
<attribute name="maven.pomderived" value="true"/>
|
||||||
|
</attributes>
|
||||||
|
</classpathentry>
|
||||||
<classpathentry kind="output" path="target/classes"/>
|
<classpathentry kind="output" path="target/classes"/>
|
||||||
</classpath>
|
</classpath>
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
<groupId>ch.psi</groupId>
|
<groupId>ch.psi</groupId>
|
||||||
<artifactId>fda</artifactId>
|
<artifactId>fda</artifactId>
|
||||||
<version>1.1.38</version>
|
<version>1.1.40</version>
|
||||||
|
|
||||||
<dependencies>
|
<dependencies>
|
||||||
<dependency>
|
<dependency>
|
||||||
|
|||||||
@@ -510,6 +510,12 @@ public class Acquisition {
|
|||||||
}
|
}
|
||||||
|
|
||||||
JythonManipulation manipulation = new JythonManipulation(sm.getId(), sm.getScript(), mapping, sm.isReturnArray());
|
JythonManipulation manipulation = new JythonManipulation(sm.getId(), sm.getScript(), mapping, sm.isReturnArray());
|
||||||
|
|
||||||
|
if(configuration.getData()!=null){ // Safety
|
||||||
|
manipulation.setVariable("FILENAME", configuration.getData().getFileName());
|
||||||
|
manipulation.setVariable("DATAFILE", datafile.getAbsoluteFile());
|
||||||
|
}
|
||||||
|
|
||||||
this.manipulations.add(manipulation);
|
this.manipulations.add(manipulation);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -621,7 +627,9 @@ public class Acquisition {
|
|||||||
}
|
}
|
||||||
else if(a instanceof ShellAction){
|
else if(a instanceof ShellAction){
|
||||||
ShellAction sa = (ShellAction) a;
|
ShellAction sa = (ShellAction) a;
|
||||||
ch.psi.fda.core.actions.ShellAction action = new ch.psi.fda.core.actions.ShellAction(sa.getCommand());
|
String com = sa.getCommand().replaceAll("\\$\\{DATAFILE\\}", datafile.getAbsolutePath());
|
||||||
|
com = com.replaceAll("\\$\\{FILENAME\\}", datafile.getName().replaceAll("\\.\\w*$", ""));
|
||||||
|
ch.psi.fda.core.actions.ShellAction action = new ch.psi.fda.core.actions.ShellAction(com);
|
||||||
action.setCheckExitValue(sa.isCheckExitValue());
|
action.setCheckExitValue(sa.isCheckExitValue());
|
||||||
action.setExitValue(sa.getExitValue());
|
action.setExitValue(sa.getExitValue());
|
||||||
alist.add(action);
|
alist.add(action);
|
||||||
@@ -629,6 +637,9 @@ public class Acquisition {
|
|||||||
else if(a instanceof ScriptAction){
|
else if(a instanceof ScriptAction){
|
||||||
|
|
||||||
ScriptAction sa = (ScriptAction) a;
|
ScriptAction sa = (ScriptAction) a;
|
||||||
|
|
||||||
|
// TODO set global variables DATAFILE and FILENAME
|
||||||
|
|
||||||
// TODO create Jython Action
|
// TODO create Jython Action
|
||||||
List<JythonParameterMappingChannel> mapping = new ArrayList<JythonParameterMappingChannel>();
|
List<JythonParameterMappingChannel> mapping = new ArrayList<JythonParameterMappingChannel>();
|
||||||
for(ChannelParameterMapping ma: sa.getMapping()){
|
for(ChannelParameterMapping ma: sa.getMapping()){
|
||||||
@@ -645,7 +656,11 @@ public class Acquisition {
|
|||||||
logger.warning("Channel type ["+ma.getType()+"] is not supported for mapping");
|
logger.warning("Channel type ["+ma.getType()+"] is not supported for mapping");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
alist.add(new ch.psi.fda.core.actions.JythonAction(sa.getScript(), mapping));
|
|
||||||
|
ch.psi.fda.core.actions.JythonAction ja = new ch.psi.fda.core.actions.JythonAction(sa.getScript(), mapping);
|
||||||
|
ja.setVariable("FILENAME", datafile.getName().replaceAll("\\.\\w*$", ""));
|
||||||
|
ja.setVariable("DATAFILE", datafile.getAbsoluteFile());
|
||||||
|
alist.add(ja);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return(alist);
|
return(alist);
|
||||||
|
|||||||
@@ -21,7 +21,9 @@ package ch.psi.fda.core.actions;
|
|||||||
|
|
||||||
import gov.aps.jca.CAException;
|
import gov.aps.jca.CAException;
|
||||||
|
|
||||||
|
import java.util.HashMap;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
import java.util.logging.Logger;
|
import java.util.logging.Logger;
|
||||||
import java.util.regex.Matcher;
|
import java.util.regex.Matcher;
|
||||||
import java.util.regex.Pattern;
|
import java.util.regex.Pattern;
|
||||||
@@ -60,6 +62,8 @@ public class JythonAction implements Action {
|
|||||||
* Jython entry call
|
* Jython entry call
|
||||||
*/
|
*/
|
||||||
private String jythonCall;
|
private String jythonCall;
|
||||||
|
|
||||||
|
private Map<String,Object> gvariables = new HashMap<String,Object>();
|
||||||
|
|
||||||
public JythonAction(String script, List<JythonParameterMappingChannel> mapping){
|
public JythonAction(String script, List<JythonParameterMappingChannel> mapping){
|
||||||
|
|
||||||
@@ -76,7 +80,12 @@ public class JythonAction implements Action {
|
|||||||
String[] functionParameters = null;
|
String[] functionParameters = null;
|
||||||
if(matcher.find() && matcher.groupCount()==1){
|
if(matcher.find() && matcher.groupCount()==1){
|
||||||
logger.finest("Entry function '"+entryFunctionPattern+"' found - Identified parameters: "+matcher.group(1));
|
logger.finest("Entry function '"+entryFunctionPattern+"' found - Identified parameters: "+matcher.group(1));
|
||||||
functionParameters = matcher.group(1).split(" *, *");
|
if(matcher.group(1).matches(" *")){
|
||||||
|
functionParameters = new String[0];
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
functionParameters = matcher.group(1).split(" *, *");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
throw new IllegalArgumentException("Cannot determine entry function: "+entryFunctionPattern);
|
throw new IllegalArgumentException("Cannot determine entry function: "+entryFunctionPattern);
|
||||||
@@ -112,7 +121,7 @@ public class JythonAction implements Action {
|
|||||||
|
|
||||||
StringBuffer buffer = new StringBuffer();
|
StringBuffer buffer = new StringBuffer();
|
||||||
buffer.append(entryFunction);
|
buffer.append(entryFunction);
|
||||||
buffer.append("(");
|
buffer.append("( "); // Need to have trailing space as otherwise there will be a problem if no paramters are specified
|
||||||
for(JythonParameterMappingChannel b: mapping){
|
for(JythonParameterMappingChannel b: mapping){
|
||||||
// Create channel
|
// Create channel
|
||||||
|
|
||||||
@@ -142,6 +151,15 @@ public class JythonAction implements Action {
|
|||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public void execute() {
|
public void execute() {
|
||||||
|
|
||||||
|
// Set global variables - WORKAROUND gvariables
|
||||||
|
// This block is not in initialization as we want to assure that all invocations
|
||||||
|
// of this manipulation will get the same value (i.e. to prevent inconsistent behaviour
|
||||||
|
// if variable was changed during an execution of the manipulation)
|
||||||
|
for(String k: gvariables.keySet()){
|
||||||
|
engine.put(k, gvariables.get(k));
|
||||||
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
engine.eval(jythonCall);
|
engine.eval(jythonCall);
|
||||||
} catch (ScriptException e) {
|
} catch (ScriptException e) {
|
||||||
@@ -166,4 +184,13 @@ public class JythonAction implements Action {
|
|||||||
// Nothing to be done
|
// Nothing to be done
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Workaround to put variables into the jython engine.
|
||||||
|
* @param name
|
||||||
|
* @param value
|
||||||
|
*/
|
||||||
|
public void setVariable(String name, Object value){
|
||||||
|
gvariables.put(name, value);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -21,7 +21,9 @@ package ch.psi.fda.core.manipulator;
|
|||||||
|
|
||||||
import gov.aps.jca.CAException;
|
import gov.aps.jca.CAException;
|
||||||
|
|
||||||
|
import java.util.HashMap;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
import java.util.logging.Level;
|
import java.util.logging.Level;
|
||||||
import java.util.logging.Logger;
|
import java.util.logging.Logger;
|
||||||
import java.util.regex.Matcher;
|
import java.util.regex.Matcher;
|
||||||
@@ -102,6 +104,10 @@ public class JythonManipulation implements Manipulation{
|
|||||||
*/
|
*/
|
||||||
private String jythonCall;
|
private String jythonCall;
|
||||||
|
|
||||||
|
|
||||||
|
private Map<String,Object> gvariables = new HashMap<String,Object>();
|
||||||
|
|
||||||
|
|
||||||
public JythonManipulation(String id, String script, List<JythonParameterMapping> mapping){
|
public JythonManipulation(String id, String script, List<JythonParameterMapping> mapping){
|
||||||
this(id, script, mapping, false);
|
this(id, script, mapping, false);
|
||||||
}
|
}
|
||||||
@@ -232,12 +238,19 @@ public class JythonManipulation implements Manipulation{
|
|||||||
buffer.setCharAt(buffer.length()-1, ')');
|
buffer.setCharAt(buffer.length()-1, ')');
|
||||||
|
|
||||||
jythonCall = buffer.toString();
|
jythonCall = buffer.toString();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Object execute(DataMessage message){
|
public Object execute(DataMessage message){
|
||||||
|
|
||||||
|
// Set global variables - WORKAROUND gvariables
|
||||||
|
// This block is not in initialization as we want to assure that all invocations
|
||||||
|
// of this manipulation will get the same value (i.e. to prevent inconsistent behaviour
|
||||||
|
// if variable was changed during an execution of the manipulation)
|
||||||
|
for(String k: gvariables.keySet()){
|
||||||
|
engine.put(k, gvariables.get(k));
|
||||||
|
}
|
||||||
|
|
||||||
// Manipulate data
|
// Manipulate data
|
||||||
for(int i=0;i<parameterIndex.length;i++){
|
for(int i=0;i<parameterIndex.length;i++){
|
||||||
if(parameterIndex[i] != null){
|
if(parameterIndex[i] != null){
|
||||||
@@ -261,7 +274,8 @@ public class JythonManipulation implements Manipulation{
|
|||||||
return(((Integer)r).doubleValue());
|
return(((Integer)r).doubleValue());
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
return Double.NaN;
|
// return Double.NaN;
|
||||||
|
return r;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} catch (ScriptException e) {
|
} catch (ScriptException e) {
|
||||||
@@ -270,4 +284,13 @@ public class JythonManipulation implements Manipulation{
|
|||||||
return Double.NaN;
|
return Double.NaN;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Workaround to put variables into the jython engine.
|
||||||
|
* @param name
|
||||||
|
* @param value
|
||||||
|
*/
|
||||||
|
public void setVariable(String name, Object value){
|
||||||
|
gvariables.put(name, value);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@@ -47,6 +47,7 @@ import org.xml.sax.SAXException;
|
|||||||
import org.xml.sax.SAXParseException;
|
import org.xml.sax.SAXParseException;
|
||||||
|
|
||||||
import ch.psi.fda.model.v1.Configuration;
|
import ch.psi.fda.model.v1.Configuration;
|
||||||
|
import ch.psi.fda.model.v1.Data;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Manage the serialization and deserialization of the model
|
* Manage the serialization and deserialization of the model
|
||||||
@@ -111,6 +112,15 @@ public class ModelManager {
|
|||||||
|
|
||||||
try{
|
try{
|
||||||
Configuration model = (Configuration) u.unmarshal(bsource, Configuration.class).getValue();
|
Configuration model = (Configuration) u.unmarshal(bsource, Configuration.class).getValue();
|
||||||
|
|
||||||
|
// Ensure that the filename inside the xml file is always the file name
|
||||||
|
Data d = model.getData();
|
||||||
|
if(d==null){
|
||||||
|
d = new Data();
|
||||||
|
model.setData(d);
|
||||||
|
}
|
||||||
|
d.setFileName(file.getName().replaceAll("\\.xml$", ""));
|
||||||
|
|
||||||
return (model);
|
return (model);
|
||||||
}
|
}
|
||||||
catch(UnmarshalException e){
|
catch(UnmarshalException e){
|
||||||
@@ -142,6 +152,15 @@ public class ModelManager {
|
|||||||
|
|
||||||
try{
|
try{
|
||||||
Configuration model = (Configuration) u.unmarshal(new StreamSource(file), Configuration.class).getValue();
|
Configuration model = (Configuration) u.unmarshal(new StreamSource(file), Configuration.class).getValue();
|
||||||
|
|
||||||
|
// Ensure that the filename inside the xml file is always the file name
|
||||||
|
Data d = model.getData();
|
||||||
|
if(d==null){
|
||||||
|
d = new Data();
|
||||||
|
model.setData(d);
|
||||||
|
}
|
||||||
|
d.setFileName(file.getName().replaceAll("\\.xml$", ""));
|
||||||
|
|
||||||
return (model);
|
return (model);
|
||||||
}
|
}
|
||||||
catch(UnmarshalException e){
|
catch(UnmarshalException e){
|
||||||
@@ -173,6 +192,14 @@ public class ModelManager {
|
|||||||
Schema schema = sf.newSchema(new Source[]{s}); // Use schema reference provided in XML
|
Schema schema = sf.newSchema(new Source[]{s}); // Use schema reference provided in XML
|
||||||
m.setSchema(schema);
|
m.setSchema(schema);
|
||||||
|
|
||||||
|
// Set scan name equal to file name
|
||||||
|
Data d = model.getData();
|
||||||
|
if(d==null){
|
||||||
|
d = new Data();
|
||||||
|
model.setData(d);
|
||||||
|
}
|
||||||
|
d.setFileName(file.getName().replaceAll("\\.xml$", ""));
|
||||||
|
|
||||||
m.marshal( new JAXBElement<Configuration>(qname, Configuration.class, model ), file);
|
m.marshal( new JAXBElement<Configuration>(qname, Configuration.class, model ), file);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -141,7 +141,22 @@ public class Visualizer {
|
|||||||
// XYSeriesP series = ((LinePlot) xyfilter.getPlot()).getData().getSeries(xyfilter.getCount()); // TODO Does not work with multiple series filter per plot !!!!
|
// XYSeriesP series = ((LinePlot) xyfilter.getPlot()).getData().getSeries(xyfilter.getCount()); // TODO Does not work with multiple series filter per plot !!!!
|
||||||
XYSeriesP series = xyfilter.getActualSeries(); // TODO Does not work with multiple series filter per plot !!!!
|
XYSeriesP series = xyfilter.getActualSeries(); // TODO Does not work with multiple series filter per plot !!!!
|
||||||
// series.add((Double) m.getData().get(xyfilter.getIndexX()), (Double) m.getData().get(xyfilter.getIndexY()));
|
// series.add((Double) m.getData().get(xyfilter.getIndexX()), (Double) m.getData().get(xyfilter.getIndexY()));
|
||||||
series.add((Double) m.getData().get(xyfilter.getIndexX()), (Double) m.getData().get(xyfilter.getIndexY()), updateAtStreamElement);
|
|
||||||
|
|
||||||
|
// There might be other values than double in the data, therefore we have to check for it
|
||||||
|
Object dX = m.getData().get(xyfilter.getIndexX());
|
||||||
|
Object dY = m.getData().get(xyfilter.getIndexY());
|
||||||
|
Double dataX = Double.NaN;
|
||||||
|
Double dataY = Double.NaN;
|
||||||
|
if(dX instanceof Double){
|
||||||
|
dataX = (Double) dX;
|
||||||
|
}
|
||||||
|
if(dY instanceof Double){
|
||||||
|
dataY = (Double) dY;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Add Data to the series
|
||||||
|
series.add(dataX , dataY, updateAtStreamElement);
|
||||||
}
|
}
|
||||||
if(filter instanceof XYSeriesArrayDataFilter){
|
if(filter instanceof XYSeriesArrayDataFilter){
|
||||||
final XYSeriesArrayDataFilter xyfilter = (XYSeriesArrayDataFilter) filter;
|
final XYSeriesArrayDataFilter xyfilter = (XYSeriesArrayDataFilter) filter;
|
||||||
|
|||||||
@@ -75,6 +75,8 @@ public class ModelManagerTest {
|
|||||||
URL url = this.getClass().getClassLoader().getResource("home/scans/templates/scan1d.xml");
|
URL url = this.getClass().getClassLoader().getResource("home/scans/templates/scan1d.xml");
|
||||||
Configuration c = ModelManager.unmarshall(new File(new URI(url.toString())));
|
Configuration c = ModelManager.unmarshall(new File(new URI(url.toString())));
|
||||||
logger.info(""+c.getData().getFormat());
|
logger.info(""+c.getData().getFormat());
|
||||||
|
|
||||||
|
logger.info("FILENAME: "+c.getData().getFileName());
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -106,7 +108,7 @@ public class ModelManagerTest {
|
|||||||
Scan s = new Scan();
|
Scan s = new Scan();
|
||||||
c.setScan(s);
|
c.setScan(s);
|
||||||
|
|
||||||
ModelManager.marshall(c, new File(tmpDirectory+"/scan.xml"));
|
ModelManager.marshall(c, new File(tmpDirectory+"/scan1234.xml"));
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,17 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<configuration numberOfExecution="0" xmlns="http://www.psi.ch/~ebner/models/scan/1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.psi.ch/~ebner/models/scan/1.0 ../../src/model-v1.xsd">
|
||||||
|
<!--
|
||||||
|
1D Scan reading out scalar channels and the timestamp for each point
|
||||||
|
-->
|
||||||
|
<data format="txt"/>
|
||||||
|
<scan id="">
|
||||||
|
<preAction xsi:type="ShellAction" command="/bin/echo hello ${DATAFILE} ${FILENAME}"/>
|
||||||
|
<preAction xsi:type="ScriptAction">
|
||||||
|
<script>
|
||||||
|
def process( ):
|
||||||
|
print "filename __ %s" % FILENAME
|
||||||
|
print "data __ %s" % DATAFILE
|
||||||
|
</script>
|
||||||
|
</preAction>
|
||||||
|
</scan>
|
||||||
|
</configuration>
|
||||||
@@ -0,0 +1,44 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<configuration numberOfExecution="0" xmlns="http://www.psi.ch/~ebner/models/scan/1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.psi.ch/~ebner/models/scan/1.0 ../../src/model-v1.xsd">
|
||||||
|
<!--
|
||||||
|
1D Scan reading out scalar channels and the timestamp for each point
|
||||||
|
-->
|
||||||
|
<data format="txt"/>
|
||||||
|
<scan id="">
|
||||||
|
<dimension zigzag="true">
|
||||||
|
<positioner id="id0" name="MTEST-HW3:MOT1" settlingTime="0.1" xsi:type="LinearPositioner">
|
||||||
|
<start>0.0</start>
|
||||||
|
<end>8.0</end>
|
||||||
|
<stepSize>0.5</stepSize>
|
||||||
|
</positioner>
|
||||||
|
<detector id="idD0" xsi:type="ScalarDetector" name="MTEST-HW3:MOT1.RRBV"/>
|
||||||
|
<detector id="idD1" xsi:type="ScalarDetector" name="MTEST-HW3:MOT1.RBV"/>
|
||||||
|
<detector xsi:type="Timestamp" id="timestamp"/>
|
||||||
|
</dimension>
|
||||||
|
|
||||||
|
<manipulation id="man1" xsi:type="ScriptManipulation">
|
||||||
|
<mapping xsi:type="IDParameterMapping" variable="a" refid="idD1"/>
|
||||||
|
<script>
|
||||||
|
def process(a):
|
||||||
|
return [1,a]
|
||||||
|
</script>
|
||||||
|
</manipulation>
|
||||||
|
<manipulation id="man2" xsi:type="ScriptManipulation">
|
||||||
|
<mapping xsi:type="IDParameterMapping" variable="a" refid="man1"/>
|
||||||
|
<script>
|
||||||
|
def process(a):
|
||||||
|
print a[1]
|
||||||
|
print FILENAME
|
||||||
|
return 1.0
|
||||||
|
</script>
|
||||||
|
</manipulation>
|
||||||
|
</scan>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<visualization title="Line Plot One" xsi:type="LinePlot" x="id0" y="idD0"/>
|
||||||
|
<visualization title="Line Plot Two" xsi:type="LinePlot" x="id0" y="idD1"/>
|
||||||
|
<visualization title="Line Plot Two" xsi:type="LinePlot" x="id0" y="man1"/>
|
||||||
|
<visualization title="Line Plot Two" xsi:type="LinePlot" x="id0" y="man2"/>
|
||||||
|
<visualization xsi:type="LinePlot" x="id0" y="timestamp" title="Timestamp" />
|
||||||
|
</configuration>
|
||||||
Reference in New Issue
Block a user