private IRunnableDevice<ScanModel> createGridScan( final IRunnableDevice<?> detector, List<ScanMetadata> scanMetadata, int... size) throws Exception { // Create scan points for a grid and make a generator GridModel gmodel = new GridModel(); gmodel.setFastAxisName("xNex"); gmodel.setFastAxisPoints(size[size.length - 1]); gmodel.setSlowAxisName("yNex"); gmodel.setSlowAxisPoints(size[size.length - 2]); gmodel.setBoundingBox(new BoundingBox(0, 0, 3, 3)); IPointGenerator<?> gen = gservice.createGenerator(gmodel); // We add the outer scans, if any if (size.length > 2) { for (int dim = size.length - 3; dim > -1; dim--) { final StepModel model; if (size[dim] - 1 > 0) { model = new StepModel("neXusScannable" + (dim + 1), 10, 20, 9.99d / (size[dim] - 1)); } else { model = new StepModel( "neXusScannable" + (dim + 1), 10, 20, 30); // Will generate one value at 10 } final IPointGenerator<?> step = gservice.createGenerator(model); gen = gservice.createCompoundGenerator(step, gen); } } // Create the model for a scan. final ScanModel smodel = new ScanModel(); smodel.setPositionIterable(gen); smodel.setDetectors(detector); smodel.setScanMetadata(scanMetadata); // Create a file to scan into. smodel.setFilePath(output.getAbsolutePath()); System.out.println("File writing to " + smodel.getFilePath()); // Create a scan and run it without publishing events IRunnableDevice<ScanModel> scanner = dservice.createRunnableDevice(smodel, null); final IPointGenerator<?> fgen = gen; ((IRunnableEventDevice<ScanModel>) scanner) .addRunListener( new IRunListener() { @Override public void runWillPerform(RunEvent evt) throws ScanningException { try { System.out.println("Running acquisition scan of size " + fgen.size()); } catch (GeneratorException e) { throw new ScanningException(e); } } }); return scanner; }