/*- * Copyright 2017 Diamond Light Source Ltd. * * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html */ package uk.ac.diamond.scisoft.analysis.processing.operations.twod; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import org.eclipse.dawnsci.analysis.api.diffraction.DetectorProperties; import org.eclipse.dawnsci.analysis.api.diffraction.DiffractionCrystalEnvironment; import org.eclipse.dawnsci.analysis.api.metadata.IDiffractionMetadata; import org.eclipse.dawnsci.analysis.api.processing.OperationData; import org.eclipse.dawnsci.analysis.api.processing.OperationException; import org.eclipse.dawnsci.analysis.api.processing.OperationRank; import org.eclipse.dawnsci.analysis.api.processing.model.AbstractOperationModel; import org.eclipse.dawnsci.analysis.dataset.operations.AbstractOperation; import org.eclipse.january.IMonitor; import org.eclipse.january.dataset.IDataset; import uk.ac.diamond.scisoft.analysis.io.DiffractionMetadata; public class EnterDiffractionCalibrationOperation extends AbstractOperation<EnterDiffractionCalibrationModel, OperationData> { private volatile IDiffractionMetadata metadata; private PropertyChangeListener listener; @Override public String getId() { return "uk.ac.diamond.scisoft.analysis.processing.operations.twod.EnterDiffractionCalibrationOperation"; } @Override public OperationRank getInputRank() { return OperationRank.TWO; } @Override public OperationRank getOutputRank() { return OperationRank.TWO; } @Override protected OperationData process(IDataset input, IMonitor monitor) throws OperationException { input.setMetadata(getMeta(model,input)); return new OperationData(input); } private IDiffractionMetadata getMeta(EnterDiffractionCalibrationModel mod, IDataset input) { IDiffractionMetadata lmeta = metadata; if (lmeta == null) { synchronized(this) { lmeta = metadata; if (lmeta == null) { DetectorProperties dp = DetectorProperties.getDefaultDetectorProperties(input.getShape()); dp.setHPxSize(model.getPixelSize()); dp.setVPxSize(model.getPixelSize()); dp.setBeamCentreCoords(new double[]{model.getBeamCentreX(),model.getBeamCentreY()}); dp.setNormalAnglesInDegrees(model.getYaw(), model.getPitch(), model.getRoll()); dp.setBeamCentreDistance(model.getDetectorDistance()); DiffractionCrystalEnvironment de = new DiffractionCrystalEnvironment(1); de.setWavelengthFromEnergykeV(model.getEnergy()); DiffractionMetadata md = new DiffractionMetadata("", dp, de); metadata = lmeta = md; } } } return lmeta; } @Override public void setModel(EnterDiffractionCalibrationModel model) { super.setModel(model); if (listener == null) { listener = new PropertyChangeListener() { @Override public void propertyChange(PropertyChangeEvent evt) { metadata = null; } }; } else { ((AbstractOperationModel)this.model).removePropertyChangeListener(listener); } ((AbstractOperationModel)this.model).addPropertyChangeListener(listener); } }