use of org.eclipse.scanning.api.event.scan.ProcessingRequest in project gda-core by openGDA.
the class ScanRequestConverter method convertToScanRequest.
/**
* Convert an IMappingExperimentBean to a ScanRequest so that it can be run by the
* GDA9 scanning framework.
* <p>
* This will include setting the mapping scan axes with the names from the mapping axis manager.
* <p>
* This method is made <code>public</code> to allow testing.
*
* @param mappingBean
* the IMappingExperimentBean to be converted
* @return the ScanRequest
*/
public ScanRequest convertToScanRequest(IMappingExperimentBean mappingBean) {
final ScanRequest scanRequest = new ScanRequest();
final IMappingScanRegion scanRegion = mappingBean.getScanDefinition().getMappingScanRegion();
final IMapPathModel mapPath = getMapPathAndConfigureScanAxes(scanRegion);
// Build the list of models for the scan
// first get the models for any outer scannables to be included
final List<IScanPointGeneratorModel> models = mappingBean.getScanDefinition().getOuterScannables().stream().filter(IScanModelWrapper<IScanPointGeneratorModel>::isIncludeInScan).map(IScanModelWrapper<IScanPointGeneratorModel>::getModel).filter(Objects::nonNull).collect(// use array list as we're going to add an element
toCollection(ArrayList::new));
// then add the actual map path model last, it's the inner most model
models.add(mapPath);
// Convert the list of models into a compound model
final CompoundModel compoundModel = new CompoundModel(models);
// Add the ROI for the mapping region
final ScanRegion region = new ScanRegion(scanRegion.getRegion().toROI(), mapPath.getxAxisName(), mapPath.getyAxisName());
// Convert to a List of ScanRegion<IROI> containing one item to avoid unsafe varargs warning
compoundModel.setRegions(Arrays.asList(region));
// Set the model on the scan request
scanRequest.setCompoundModel(compoundModel);
// set the scan start position (scannables not in the scan that are set to a certain value before the scan starts)
final Map<String, Object> beamlineConfiguration = mappingBean.getBeamlineConfiguration();
if (beamlineConfiguration != null) {
scanRequest.setStartPosition(new MapPosition(beamlineConfiguration));
}
// add the required detectors to the scan
for (IScanModelWrapper<IDetectorModel> detectorWrapper : mappingBean.getDetectorParameters()) {
if (detectorWrapper.isIncludeInScan()) {
IDetectorModel detectorModel = detectorWrapper.getModel();
scanRequest.putDetector(detectorModel.getName(), detectorModel);
}
}
// set the per-scan and per-point monitors according to the mapping bean
configureMonitors(mappingBean, scanRequest);
// set the scripts to run before and after the scan, if any
if (mappingBean.getScriptFiles() != null) {
final IScriptFiles scriptFiles = mappingBean.getScriptFiles();
scanRequest.setBeforeScript(createScriptRequest(scriptFiles.getBeforeScanScript()));
scanRequest.setAfterScript(createScriptRequest(scriptFiles.getAfterScanScript()));
scanRequest.setAlwaysRunAfterScript(scriptFiles.isAlwaysRunAfterScript());
}
// add the sample metadata
if (mappingBean.getSampleMetadata() != null) {
setSampleMetadata(mappingBean, scanRequest);
}
// Add required processing
Map<String, Collection<Object>> processingRequest = mappingBean.getProcessingRequest();
ProcessingRequest r = new ProcessingRequest();
r.setRequest(processingRequest);
scanRequest.setProcessingRequest(r);
// Add template files
final List<TemplateFileWrapper> templateFiles = mappingBean.getTemplateFiles();
if (templateFiles != null && !templateFiles.isEmpty()) {
final Set<String> existingTemplateFilePaths = scanRequest.getTemplateFilePaths();
final Set<String> allTemplateFilePaths = new TreeSet<>();
Optional.ofNullable(existingTemplateFilePaths).ifPresent(allTemplateFilePaths::addAll);
templateFiles.stream().filter(TemplateFileWrapper::isActive).forEach(fp -> allTemplateFilePaths.add(fp.getFilePath()));
scanRequest.setTemplateFilePaths(allTemplateFilePaths);
}
// Add alternative output directory if selected and valid
if (mappingBean.isUseAlternativeDirectory()) {
final String outputDirString = mappingBean.getAlternativeDirectory();
final File outputDir = new File(outputDirString);
if (outputDir.isDirectory()) {
scanRequest.setFilePath(outputDirString);
} else {
logger.warn("Cannot write output to {}: it is not a directory", outputDirString);
}
}
return scanRequest;
}
use of org.eclipse.scanning.api.event.scan.ProcessingRequest in project gda-core by openGDA.
the class SavuProcessingRequestHandlerTest method testSavuProcessingRequest.
@Test
public void testSavuProcessingRequest() throws Exception {
ProcessingRequestHandler handler = new SavuProcessingRequestHandler();
URL file1 = new URL("file:/lev1/lev2");
URL file2 = new URL("file:/lev3/lev4");
List<URL> paths = new ArrayList<>();
paths.add(file1);
paths.add(file2);
SavuProcessingRequest request = new SavuProcessingRequest.Builder().withValue(paths).build();
ScanRequest scanRequest = new ScanRequest();
scanRequest.setProcessingRequest(new ProcessingRequest());
scanRequest.getProcessingRequest().setRequest(new HashMap<>());
handler.handle(request, scanRequest);
Collection<Object> translated = scanRequest.getProcessingRequest().getRequest().get(request.getKey());
Assert.assertEquals(2, translated.size());
Assert.assertTrue(translated.contains(file1.getPath()));
Assert.assertTrue(translated.contains(file2.getPath()));
}
use of org.eclipse.scanning.api.event.scan.ProcessingRequest in project gda-core by openGDA.
the class ScanRequestConverterTest method testProcessingRequestIncludedCorrectly.
@Test
public void testProcessingRequestIncludedCorrectly() throws Exception {
ConfigWrapper wrapper = new ConfigWrapper();
String appName = "test";
String pathToConfig = "/path/to/config";
wrapper.setAppName(appName);
wrapper.setPathToConfig(pathToConfig);
wrapper.setActive(true);
mappingBean.addProcessingRequest(wrapper);
// Act - convert mapping bean to scan request
final ScanRequest scanRequest = scanRequestConverter.convertToScanRequest(mappingBean);
// Assert
ProcessingRequest processingRequest = scanRequest.getProcessingRequest();
testProcessingRequest(appName, pathToConfig, processingRequest);
// Act again - merge scan request into new mapping bean
scanRequestConverter.mergeIntoMappingBean(scanRequest, newMappingBean);
// Assert again - check the new mapping bean is the same as the old one
ProcessingRequest r = new ProcessingRequest();
r.setRequest(newMappingBean.getProcessingRequest());
testProcessingRequest(appName, pathToConfig, r);
}
use of org.eclipse.scanning.api.event.scan.ProcessingRequest in project gda-core by openGDA.
the class ApplyNexusTemplateTest method testApplyNexusTemplateRequest.
@Test
public void testApplyNexusTemplateRequest() throws Exception {
ProcessingRequestHandler handler = new ApplyNexusTemplateHandler();
List<URL> paths = new ArrayList<>();
paths.add(file1);
paths.add(file2);
ApplyNexusTemplatesRequest request = new ApplyNexusTemplatesRequest.Builder().withValue(paths).build();
ScanRequest scanRequest = new ScanRequest();
scanRequest.setProcessingRequest(new ProcessingRequest());
scanRequest.getProcessingRequest().setRequest(new HashMap<>());
handler.handle(request, scanRequest);
Set<String> translated = scanRequest.getTemplateFilePaths();
Assert.assertEquals(2, translated.size());
Assert.assertTrue(translated.contains(file1.getPath()));
Assert.assertTrue(translated.contains(file2.getPath()));
}
use of org.eclipse.scanning.api.event.scan.ProcessingRequest in project gda-core by openGDA.
the class ProcessingRequestHandlerServiceTest method testUnknownRequest.
@Test
public void testUnknownRequest() {
ProcessingRequestPair<Double> customPair = new ProcessingRequestPair<Double>() {
@Override
public String getKey() {
return "WeightedProcess";
}
@Override
public List<Double> getValue() {
List<Double> weights = new ArrayList<>();
weights.add(1.2);
weights.add(3.7);
return weights;
}
};
ScanRequest scanRequest = new ScanRequest();
scanRequest.setProcessingRequest(new ProcessingRequest());
scanRequest.getProcessingRequest().setRequest(new HashMap<>());
service.handle(customPair, scanRequest);
Assert.assertEquals(0, scanRequest.getProcessingRequest().getRequest().size());
}
Aggregations