/*
* Copyright (c) 2012 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 org.eclipse.dawnsci.analysis.dataset.metadata;
import java.io.Serializable;
import java.util.Arrays;
import org.eclipse.dawnsci.analysis.api.io.IDataHolder;
import org.eclipse.january.dataset.DatasetFactory;
import org.eclipse.january.dataset.DoubleDataset;
import org.eclipse.january.dataset.IDataset;
import org.eclipse.january.dataset.ILazyDataset;
import org.eclipse.january.metadata.ARPESMetadata;
public class ARPESMetadataImpl implements ARPESMetadata {
private static final String NX_ARPES_MANIPULATOR_SAAZIMUTHAL = "/entry1/instrument/manipulator/saazimuthal";
private static final String NX_ARPES_MANIPULATOR_SATILT = "/entry1/instrument/manipulator/satilt";
private static final String NX_ARPES_MANIPULATOR_SAPOLAR = "/entry1/instrument/manipulator/sapolar";
private static final String NX_ARPES_ANALYSER_ENERGIES = "/entry1/instrument/analyser/energies";
private static final String NX_ARPES_ANALYSER_ANGLES = "/entry1/instrument/analyser/angles";
private static final String NX_ARPES_SAMPLE_TEMPERATURE = "/entry1/sample/temperature";
private static final String NX_ARPES_MONOCHROMATOR_ENERGY = "/entry1/instrument/monochromator/energy";
private static final String NX_ARPES_ANALYSER_PASS_ENERGY = "/entry1/instrument/analyser/pass_energy";
private static final String NX_ARPES_ANALYSER_DATA = "/entry1/instrument/analyser/data";
private static double getFirstValue(IDataHolder dh, String item) throws Exception {
Serializable v = dh.getMetadata().getMetaValue(item);
if (v != null) {
return Double.parseDouble((String) v);
}
ILazyDataset l = dh.getLazyDataset(item);
int r = l.getRank();
int[] stop = new int[r];
Arrays.fill(stop, 1);
IDataset d = l.getSlice(null, stop, null);
return d.getDouble(new int[r]);
}
public static ILazyDataset getFromDataHolder(IDataHolder dh) {
// TODO this needs to be fixed up a little to be useful, but this will do to start.
// Add ARPES specific metadata where required.
if (dh.contains(NX_ARPES_ANALYSER_DATA)) {
ILazyDataset data = dh.getLazyDataset(NX_ARPES_ANALYSER_DATA);
ARPESMetadataImpl arpesMetadata = new ARPESMetadataImpl();
try {
arpesMetadata.setPassEnergy(Double.parseDouble((String) dh.getMetadata().getMetaValue(
NX_ARPES_ANALYSER_PASS_ENERGY)));
} catch (Exception e) {
System.out.println(e);
}
try {
arpesMetadata.setPhotonEnergy(getFirstValue(dh, NX_ARPES_MONOCHROMATOR_ENERGY));
} catch (Exception e) {
System.out.println(e);
}
try {
arpesMetadata.setTemperature(getFirstValue(dh, NX_ARPES_SAMPLE_TEMPERATURE));
} catch (Exception e) {
System.out.println(e);
}
if (dh.contains(NX_ARPES_ANALYSER_ANGLES)) {
arpesMetadata.setAnalyserAngles(dh.getLazyDataset(NX_ARPES_ANALYSER_ANGLES));
} else {
arpesMetadata.setAnalyserAngles(DatasetFactory.zeros(DoubleDataset.class, 1));
}
if (dh.contains(NX_ARPES_ANALYSER_ENERGIES)) {
arpesMetadata.setKineticEnergies(dh.getLazyDataset(NX_ARPES_ANALYSER_ENERGIES));
} else {
arpesMetadata.setKineticEnergies(DatasetFactory.zeros(DoubleDataset.class, 1));
}
if (dh.contains(NX_ARPES_MANIPULATOR_SAPOLAR)) {
arpesMetadata.setPolarAngles(dh.getLazyDataset(NX_ARPES_MANIPULATOR_SAPOLAR));
} else {
arpesMetadata.setPolarAngles(DatasetFactory.zeros(DoubleDataset.class, 1));
}
if (dh.contains(NX_ARPES_MANIPULATOR_SATILT)) {
arpesMetadata.setTiltAngles(dh.getLazyDataset(NX_ARPES_MANIPULATOR_SATILT));
} else {
arpesMetadata.setTiltAngles(DatasetFactory.zeros(DoubleDataset.class, 1));
}
if (dh.contains(NX_ARPES_MANIPULATOR_SAAZIMUTHAL)) {
arpesMetadata.setAzimuthalAngles(dh.getLazyDataset(NX_ARPES_MANIPULATOR_SAAZIMUTHAL));
} else {
arpesMetadata.setAzimuthalAngles(DatasetFactory.zeros(DoubleDataset.class, 1));
}
data.addMetadata(arpesMetadata);
return data;
}
return null;
}
double photonEnergy = 0.0;
double workFunction = 0.0;
double passEnergy = 0.0;
double temperature = 0.0;
double energyAxisGlobalOffset = 0.0;
double angleAxisGlobalOffset = 0.0;
ILazyDataset kineticEnergies = null;
ILazyDataset analyserAngles = null;
ILazyDataset polarAngles = null;
ILazyDataset tiltAngles = null;
ILazyDataset azimuthalAngles = null;
ILazyDataset energyAxisOffset = null;
ILazyDataset bindingEnergies = null;
ILazyDataset photoelectronMomentum = null;
public ARPESMetadataImpl() {
}
public ARPESMetadataImpl(ARPESMetadata metadata) {
super();
this.photonEnergy = metadata.getPhotonEnergy();
this.workFunction = metadata.getWorkFunction();
this.kineticEnergies = metadata.getKineticEnergies();
this.analyserAngles = getView(metadata.getAnalyserAngles());
this.polarAngles = getView(metadata.getPolarAngles());
this.tiltAngles = getView(metadata.getTiltAngles());
this.azimuthalAngles = getView(metadata.getAzimuthalAngles());
this.energyAxisOffset = getView(metadata.getEnergyAxisOffset());
this.bindingEnergies = getView(metadata.getBindingEnergies());
this.photoelectronMomentum = getView(metadata.getPhotoelectronMomentum());
}
@Override
public void initialize() {
}
private ILazyDataset getView(ILazyDataset l) {
return l == null ? null : l.getSliceView();
}
@Override
public double getPhotonEnergy() {
return photonEnergy;
}
public void setPhotonEnergy(double photonEnergy) {
this.photonEnergy = photonEnergy;
}
@Override
public double getWorkFunction() {
return workFunction;
}
public void setWorkFunction(double workFunction) {
this.workFunction = workFunction;
}
@Override
public double getPassEnergy() {
return passEnergy;
}
public void setPassEnergy(double passEnergy) {
this.passEnergy = passEnergy;
}
@Override
public double getTemperature() {
return temperature;
}
public void setTemperature(double temperature) {
this.temperature = temperature;
}
@Override
public double getEnergyAxisGlobalOffset() {
return energyAxisGlobalOffset;
}
public void setEnergyAxisGlobalOffset(double energyAxisGlobalOffset) {
this.energyAxisGlobalOffset = energyAxisGlobalOffset;
}
@Override
public double getAngleAxisGlobalOffset() {
return angleAxisGlobalOffset;
}
public void setAngleAxisGlobalOffset(double angleAxisGlobalOffset) {
this.angleAxisGlobalOffset = angleAxisGlobalOffset;
}
@Override
public ILazyDataset getKineticEnergies() {
return kineticEnergies;
}
public void setKineticEnergies(ILazyDataset kineticEnergies) {
this.kineticEnergies = kineticEnergies;
}
@Override
public ILazyDataset getAnalyserAngles() {
return analyserAngles;
}
public void setAnalyserAngles(ILazyDataset analyserAngles) {
this.analyserAngles = analyserAngles;
}
@Override
public ILazyDataset getPolarAngles() {
return polarAngles;
}
public void setPolarAngles(ILazyDataset polarAngles) {
this.polarAngles = polarAngles;
}
// public void setPolarAngles(double staticPolarAngle) {
// polarAngles = DatasetFactory.createFromObject(staticPolarAngle);
// }
@Override
public ILazyDataset getTiltAngles() {
return tiltAngles;
}
public void setTiltAngles(ILazyDataset tiltAngles) {
this.tiltAngles = tiltAngles;
}
@Override
public ILazyDataset getAzimuthalAngles() {
return azimuthalAngles;
}
public void setAzimuthalAngles(ILazyDataset azimuthalAngles) {
this.azimuthalAngles = azimuthalAngles;
}
@Override
public ILazyDataset getEnergyAxisOffset() {
return energyAxisOffset;
}
public void setEnergyAxisOffset(ILazyDataset energyAxisOffset) {
this.energyAxisOffset = energyAxisOffset;
}
@Override
public ILazyDataset getBindingEnergies() {
return bindingEnergies;
}
public void setBindingEnergies(ILazyDataset bindingEnergies) {
this.bindingEnergies = bindingEnergies;
}
@Override
public ILazyDataset getPhotoelectronMomentum() {
return photoelectronMomentum;
}
public void setPhotoelectronMomentum(ILazyDataset photoelectronMomentum) {
this.photoelectronMomentum = photoelectronMomentum;
}
@Override
public ARPESMetadataImpl clone() {
return new ARPESMetadataImpl(this);
}
}