/*
* 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 uk.ac.diamond.scisoft.analysis.diffraction.powder;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import org.eclipse.january.dataset.Dataset;
import org.eclipse.january.dataset.DatasetFactory;
import org.eclipse.january.dataset.DatasetUtils;
import org.eclipse.january.dataset.FloatDataset;
import org.eclipse.january.dataset.IDataset;
import org.eclipse.january.dataset.IndexIterator;
import org.eclipse.january.dataset.IntegerDataset;
import org.eclipse.dawnsci.analysis.api.metadata.IDiffractionMetadata;
public class NonPixelSplittingIntegration2D extends AbstractPixelIntegration2D {
public NonPixelSplittingIntegration2D(IDiffractionMetadata metadata) {
super(metadata);
}
public NonPixelSplittingIntegration2D(IDiffractionMetadata metadata, int numBinsQ, int numBinsChi) {
super(metadata, numBinsQ,numBinsChi);
}
@Override
public List<Dataset> integrate(IDataset dataset) {
//TODO test shape of axis array
if (radialArray == null) {
generateRadialArray(dataset.getShape(), true);
}
if (azimuthalArray == null) {
generateAzimuthalArray(qSpace.getDetectorProperties().getBeamCentreCoords(), dataset.getShape());
}
List<Dataset> result = new ArrayList<Dataset>();
Dataset mt = mask;
if (mask != null && !Arrays.equals(mask.getShape(),dataset.getShape())) throw new IllegalArgumentException("Mask shape does not match dataset shape");
if (binEdges == null) {
binEdges = calculateBins(radialArray,mt,radialRange, nbins);
binsChi = calculateBins(azimuthalArray,mt,azimuthalRange, nBinsChi);
}
final double[] edgesQ = binEdges.getData();
final double loQ = edgesQ[0];
final double hiQ = edgesQ[nbins];
final double spanQ = (hiQ - loQ)/nbins;
final double[] edgesChi = binsChi.getData();
final double loChi = edgesChi[0];
final double hiChi = edgesChi[nBinsChi];
final double spanChi = (hiChi - loChi)/nBinsChi;
//TODO early exit if spans are z
IntegerDataset histo = (IntegerDataset) DatasetFactory.zeros(new int[]{nBinsChi,nbins}, Dataset.INT32);
FloatDataset intensity = (FloatDataset) DatasetFactory.zeros(new int[]{nBinsChi,nbins},Dataset.FLOAT32);
Dataset a = DatasetUtils.convertToDataset(radialArray[0]);
Dataset b = DatasetUtils.convertToDataset(dataset);
IndexIterator iter = a.getIterator();
while (iter.hasNext()) {
final double valq = a.getElementDoubleAbs(iter.index);
final double sig = b.getElementDoubleAbs(iter.index);
final double chi = azimuthalArray[0].getElementDoubleAbs(iter.index);
if (mt != null && !mt.getElementBooleanAbs(iter.index)) continue;
if (valq < loQ || valq > hiQ) {
continue;
}
if (chi < loChi || chi > hiChi) {
continue;
}
int qPos = (int) ((valq-loQ)/spanQ);
int chiPos = (int) ((chi-loChi)/spanChi);
if(qPos<nbins && chiPos<nBinsChi){
int cNum = histo.get(chiPos,qPos);
float cIn = intensity.get(chiPos,qPos);
histo.set(cNum+1, chiPos,qPos);
intensity.set(cIn+sig, chiPos,qPos);
}
}
processAndAddToResult(intensity, histo, result,radialRange, dataset.getName());
return result;
}
}