package org.dawnsci.surfacescatter;
import java.beans.PropertyChangeListener;
import java.util.ArrayList;
import java.beans.PropertyChangeListener;
import java.beans.PropertyChangeSupport;
import org.eclipse.dawnsci.analysis.api.roi.IROI;
import org.eclipse.dawnsci.analysis.api.roi.IRectangularROI;
import org.eclipse.dawnsci.analysis.dataset.roi.RectangularROI;
import org.eclipse.january.dataset.Dataset;
import org.eclipse.january.dataset.DatasetFactory;
import org.eclipse.january.dataset.DoubleDataset;
import org.eclipse.january.dataset.IDataset;
import org.eclipse.january.dataset.Maths;
import uk.ac.diamond.scisoft.analysis.io.DataSetProvider;
public class DataModel {
private ArrayList<Double> xList;
private ArrayList<Double> yList;
private ArrayList<Double> yListError;
private ArrayList<Double> yListFhkl;
private ArrayList<Double> yListFhklError;
private ArrayList<Double> yListRaw;
private ArrayList<Double> yListRawError;
private ArrayList<Double> zList;
private final PropertyChangeSupport propertyChangeSupport = new PropertyChangeSupport(this);
private ArrayList<IDataset> outputDatArray;
private ArrayList<IDataset> backgroundDatArray;
private IDataset slicerBackground;
private RectangularROI backgroundBox;
private int[][] backgroundLenPt;
private IROI backgroundROI;
private String name;
private int[][] initialLenPt;
private IDataset initialDataset;
private IDataset yIDatasetMax;
private IDataset yIDatasetFhklMax;
private IDataset yIDatasetMin;
private IDataset yIDatasetFhklMin;
private ArrayList<double[]> locationList;
private double[] seedLocation;
public ArrayList<Double> getyListRaw() {
return yListRaw;
}
public void setyListRaw(ArrayList<Double> yListRaw) {
this.yListRaw = yListRaw;
}
public ArrayList<Double> getyListRawError() {
return yListRawError;
}
public void setyListRawError(ArrayList<Double> yListRawError) {
this.yListRawError = yListRawError;
}
public IROI getBackgroundROI(){
return backgroundROI;
}
public void setBackgroundROI(IROI backgroundROI){
IRectangularROI bounds = backgroundROI.getBounds();
int[] len = bounds.getIntLengths();
int[] pt = bounds.getIntPoint();
int[][] lenpt = new int[2][];
lenpt[0]=len;
lenpt[1]=pt;
firePropertyChange("backgroundROI", this.backgroundROI, this.backgroundROI= backgroundROI);
this.setBackgroundLenPt(lenpt);
firePropertyChange("backgroundLenPt", this.backgroundLenPt, this.backgroundLenPt= lenpt);
}
public ArrayList<IDataset> getOutputDatArray() {
return outputDatArray;
}
public void setOutputDatArray(ArrayList<IDataset> outputDatArray) {
this.outputDatArray = outputDatArray;
}
public ArrayList<IDataset> getBackgroundDatArray() {
return backgroundDatArray;
}
public void setBackgroundDatArray(ArrayList<IDataset> backgroundDatArray) {
this.backgroundDatArray = backgroundDatArray;
}
public void addOutputDatArray(IDataset in){
if (outputDatArray==null){
outputDatArray = new ArrayList<IDataset>();
}
ArrayList<IDataset> outputDatArray1 = new ArrayList<IDataset>();
outputDatArray1 = (ArrayList<IDataset>) outputDatArray.clone();
outputDatArray1.add(in);
firePropertyChange("outputDatArray", this.outputDatArray,
this.outputDatArray= outputDatArray1);
}
public void addOutputDatArray(int l, int k, IDataset in){
if (outputDatArray==null){
outputDatArray = new ArrayList<IDataset>();
for (int i = 0; i < l; i++) {
outputDatArray.add(DatasetFactory.zeros(new int[] {2,2}));
}
}
ArrayList<IDataset> outputDatArray1 = new ArrayList<IDataset>();
outputDatArray1 = (ArrayList<IDataset>) outputDatArray.clone();
outputDatArray1.set(k,in);
firePropertyChange("outputDatArray", this.outputDatArray,
this.outputDatArray= outputDatArray1);
}
public void addBackgroundDatArray(IDataset in){
if (backgroundDatArray==null){
backgroundDatArray = new ArrayList<IDataset>();
}
ArrayList<IDataset> backgroundDatArray1 = new ArrayList<IDataset>();
backgroundDatArray1 = (ArrayList<IDataset>) backgroundDatArray.clone();
backgroundDatArray1.add(in);
firePropertyChange("backgroundDatArray", this.backgroundDatArray,
this.backgroundDatArray= backgroundDatArray1);
}
public ArrayList<Double> getzList() {
return zList;
}
public void setzList(ArrayList<Double> zList) {
this.zList = zList;
firePropertyChange("zList", this.zList,
this.zList= zList);
}
public ArrayList<Double> getyList() {
return yList;
}
public void setyList(ArrayList<Double> yList) {
this.yList = yList;
yListError = new ArrayList<Double>();
for(int i = 0; i <yList.size(); i++){
if (yList.get(i) >= 0){
yListError.add(Math.sqrt(yList.get(i)));
}
else{
yListError.add(0.0001);
}
}
firePropertyChange("yList", this.yList,
this.yList= yList);
}
public ArrayList<Double> getxList() {
return xList;
}
public void setxList(ArrayList<Double> xList) {
this.xList = xList;
firePropertyChange("xList", this.xList,
this.xList= xList);
}
public void addyList(double y){
if (yList==null){
yList = new ArrayList<Double>();
}
if (yListError==null){
yListError = new ArrayList<Double>();
}
ArrayList<Double> yList1 = new ArrayList<Double>();
yList1 = (ArrayList<Double>) yList.clone();
yList1.add(y);
ArrayList<Double> yListError2 = new ArrayList<Double>();
yListError2 = (ArrayList<Double>) yListError.clone();
if(y>=0){
yListError2.add(Math.sqrt(y));
}
else{
yListError2.add(0.00001);
}
yListError = yListError2;
firePropertyChange("yList", this.yList,
this.yList= yList1);
}
public void addyList(int l, int k, double y){
if (yList==null){
yList = new ArrayList<Double>();
for (int i = 0; i < l; i++) {
yList.add((double) 1000000000);
}
}
if (yList.isEmpty()){
yList = new ArrayList<Double>();
for (int i = 0; i < l; i++) {
yList.add((double) 1000000000);
}
}
if (yListError==null){
yListError = new ArrayList<Double>();
for (int i = 0; i < l; i++) {
yListError.add((double) 1000000000);
}
}
if (yListError.isEmpty()){
yListError = new ArrayList<Double>();
for (int i = 0; i < l; i++) {
yListError.add((double) 1000000000);
}
}
ArrayList<Double> yList2 = new ArrayList<Double>();
yList2 = (ArrayList<Double>) yListError.clone();
if(y>=0){
yList2.set(k,Math.sqrt(y));
}
else{
yList2.set(k, 0.00001);
}
yListError = yList2;
ArrayList<Double> yList1 = new ArrayList<Double>();
yList1 = (ArrayList<Double>) yList.clone();
yList1.set(k, y);
firePropertyChange("yList", this.yList,
this.yList= yList1);
}
public void addyListFhkl(double y){
if (yListFhkl==null){
yListFhkl = new ArrayList<Double>();
}
if (yListFhklError==null){
yListFhklError = new ArrayList<Double>();
}
ArrayList<Double> yListFhklError1 = new ArrayList<Double>();
yListFhklError1 = (ArrayList<Double>) yListFhklError.clone();
if(y>=0){
yListFhklError1.add(Math.sqrt(y));
}
else{
yListFhklError1.add(0.00001);
}
yListFhklError = yListFhklError1;
ArrayList<Double> yList1 = new ArrayList<Double>();
yList1 = (ArrayList<Double>) yListFhkl.clone();
yList1.add(y);
firePropertyChange("yListFhkl", this.yListFhkl,
this.yListFhkl= yList1);
}
public void addyListFhkl(int l, int k, double y){
if (yListFhkl==null){
yListFhkl = new ArrayList<Double>();
for (int i = 0; i < l; i++) {
yListFhkl.add((double) 1000000000);
}
}
if (yListFhkl.isEmpty()){
yListFhkl = new ArrayList<Double>();
for (int i = 0; i < l; i++) {
yListFhkl.add((double) 1000000000);
}
}
if (yListFhklError==null){
yListFhklError = new ArrayList<Double>();
for (int i = 0; i < l; i++) {
yListFhklError.add((double) 1000000000);
}
}
if (yListFhklError.isEmpty()){
yListFhklError = new ArrayList<Double>();
for (int i = 0; i < l; i++) {
yListFhklError.add((double) 1000000000);
}
}
ArrayList<Double> yList1 = new ArrayList<Double>();
yList1 = (ArrayList<Double>) yListFhkl.clone();
yList1.set(k,y);
ArrayList<Double> yList2 = new ArrayList<Double>();
yList2 = (ArrayList<Double>) yListFhklError.clone();
if(y>=0){
yList2.set(k, Math.sqrt(y));
}
else{
yList2.set(k,0.00001);
}
yListFhklError = yList2;
firePropertyChange("yListFhkl", this.yListFhkl,
this.yListFhkl= yList1);
}
public void addxList(double x){
if (xList==null){
xList = new ArrayList<Double>();
}
ArrayList<Double> xList1 = new ArrayList<Double>();
xList1 = (ArrayList<Double>) xList.clone();
xList1.add(x);
firePropertyChange("xList", this.xList,
this.xList= xList1);
}
public void addxList(int l, int k, double x){
if (xList==null){
xList = new ArrayList<Double>();
for (int i = 0; i < l; i++) {
xList.add((double) 1000000000);
}
}
if (xList.isEmpty()){
xList = new ArrayList<Double>();
for (int i = 0; i < l; i++) {
xList.add((double) 1000000000);
}
}
ArrayList<Double> xList1 = new ArrayList<Double>();
xList1 = (ArrayList<Double>) xList.clone();
xList1.set(k, x);
firePropertyChange("xList", this.xList,
this.xList= xList1);
}
public void addzList(double z){
if (zList==null){
zList = new ArrayList<Double>();
}
ArrayList<Double> zList1 = new ArrayList<Double>();
zList1 = (ArrayList<Double>) zList.clone();
zList1.add(z);
firePropertyChange("zList", this.zList,
this.zList= zList1);
}
public void resetX(){
xList =null;
}
public void resetY(){
yList =null;
}
public void resetYFhkl(){
yListFhkl =null;
}
public void resetZ(){
zList =null;
}
public void resetAll(){
zList =null;
xList =null;
yList =null;
yListFhkl =null;
yListFhklError = null;
yListError = null;
yListRaw =null;
yListRawError = null;
outputDatArray =null;
backgroundDatArray = null;
initialDataset = null;
initialLenPt = null;
locationList = null;
}
public IDataset yIDataset(){
if (yList==null){
yList = new ArrayList<Double>();
}
ArrayList<Double> yListc = (ArrayList<Double>) yList.clone();
ArrayList<Double> zero = new ArrayList<Double>();
zero.add((double)1000000000);
yListc.removeAll(zero);
IDataset yOut = DatasetFactory.ones(new int[] {1});
try{
yOut = DatasetFactory.createFromList(yListc);
}
catch(Exception n){
// IDataset yOut = DatasetFactory.ones(new int[] {1});
}
Dataset errors = DatasetFactory.zeros(DoubleDataset.class, yOut.getShape());
for(int i =0; i< yOut.getSize(); i++){
double y = yOut.getDouble(i);
if(y >= 0){
errors.set(Math.sqrt(y), i);
}
else{
errors.set(0.001, i);
}
}
yOut.setErrors(errors);
return yOut;
}
public IDataset yRawIDataset(){
if (yListRaw==null){
yListRaw = new ArrayList<Double>();
}
ArrayList<Double> yListRawc = (ArrayList<Double>) yListRaw.clone();
ArrayList<Double> zero = new ArrayList<Double>();
zero.add((double)1000000000);
yListRawc.removeAll(zero);
IDataset yOut = DatasetFactory.ones(new int[] {1});
try{
yOut = DatasetFactory.createFromList(yListRawc);
}
catch(Exception n){
// IDataset yOut = DatasetFactory.ones(new int[] {1});
}
for(int i =0; i< yOut.getSize(); i++){
if(yOut.getDouble(i) >= 0){
yOut.setErrors(Maths.sqrt(yOut));
}
else{
yOut.setErrors(0.001);
}
}
return yOut;
}
public IDataset yIDatasetError(){
if (yListError==null){
yListError = new ArrayList<Double>();
}
ArrayList<Double> yListc = (ArrayList<Double>) yListError.clone();
ArrayList<Double> zero = new ArrayList<Double>();
zero.add((double) 1000000000);
yListc.removeAll(zero);
IDataset yOut = DatasetFactory.ones(new int[] {1});
try{
yOut = DatasetFactory.createFromList(yListc);
}
catch(Exception x){
}
return yOut;
}
public IDataset yRawIDatasetError(){
if (yListRawError==null){
yListRawError = new ArrayList<Double>();
}
ArrayList<Double> yListc = (ArrayList<Double>) yListRawError.clone();
ArrayList<Double> zero = new ArrayList<Double>();
zero.add((double) 1000000000);
yListc.removeAll(zero);
IDataset yOut = DatasetFactory.ones(new int[] {1});
try{
yOut = DatasetFactory.createFromList(yListc);
}
catch(Exception x){
}
return yOut;
}
public IDataset yIDatasetFhkl(){
if (yListFhkl==null){
yListFhkl = new ArrayList<Double>();
}
ArrayList<Double> yListFhklc = (ArrayList<Double>) yListFhkl.clone();
ArrayList<Double> zero = new ArrayList<Double>();
zero.add((double) 1000000000);
yListFhklc.removeAll(zero);
IDataset yOut = DatasetFactory.ones(new int[] {1});
try{
yOut = DatasetFactory.createFromList(yListFhklc);
}
catch(Exception x){
}
IDataset yOutError = yOut.clone();
for(int i =0; i< yOut.getSize(); i++){
if(yOutError.getDouble(i) <= 0){
yOutError.set((double) 0.001, i);
}
}
yOut.setErrors(Maths.sqrt(yOutError));
return yOut;
}
public IDataset yIDatasetFhklError(){
if (yListFhklError==null){
yListFhklError = new ArrayList<Double>();
}
ArrayList<Double> yListFhklc = (ArrayList<Double>) yListFhklError.clone();
ArrayList<Double> zero = new ArrayList<Double>();
zero.add((double) 1000000000);
yListFhklc.removeAll(zero);
IDataset yOut = DatasetFactory.ones(new int[] {1});
try{
yOut = DatasetFactory.createFromList(yListFhklc);
}
catch(Exception n){
}
return yOut;
}
public IDataset xIDataset(){
if (xList==null){
xList = new ArrayList<Double>();
}
ArrayList<Double> xListc = (ArrayList<Double>) xList.clone();
ArrayList<Double> zero = new ArrayList<Double>();
zero.add((double) 1000000000);
xListc.removeAll(zero);
IDataset xOut = DatasetFactory.ones(new int[] {1});
try{
xOut = DatasetFactory.createFromList(xListc);
}
catch(Exception n){
}
return xOut;
}
public IDataset backupDataset(){
IDataset backup = DatasetFactory.createRange(0, 200, 1, Dataset.FLOAT64);
return backup;
}
public ArrayList<Double> backupList(){
IDataset backup1 = DatasetFactory.createRange(0, 200, 1, Dataset.FLOAT64);
ArrayList<Double> backup = new ArrayList<>();
for(int i=0; i<200;i++){
backup.add((double) backup1.getInt(i));
}
return backup;
}
public void addPropertyChangeListener(PropertyChangeListener listener) {
propertyChangeSupport.addPropertyChangeListener(listener);
}
public void removePropertyChangeListener(String propertyName,
PropertyChangeListener listener) {
propertyChangeSupport.removePropertyChangeListener(propertyName,
listener);
}
protected void firePropertyChange(String propertyName, Object oldValue,
Object newValue) {
propertyChangeSupport.firePropertyChange(propertyName, oldValue,
newValue);
}
public IDataset getSlicerBackground() {
return slicerBackground;
}
public void setSlicerBackground(IDataset slicerBackground) {
this.slicerBackground = slicerBackground;
}
public int[][] getBackgroundLenPt() {
return backgroundLenPt;
}
public void setBackgroundLenPt(int[][] backgroundLenPt) {
this.backgroundLenPt = backgroundLenPt;
}
public RectangularROI getBackgroundBox() {
return backgroundBox;
}
public void setBackgroundBox(RectangularROI backgroundBox) {
this.backgroundBox = backgroundBox;
}
public ArrayList<Double> getyListFhkl() {
return yListFhkl;
}
public void setyListFhkl(ArrayList<Double> yListFhkl) {
this.yListFhkl = yListFhkl;
yListFhklError = new ArrayList<Double>();
ArrayList<Double> yListFhklClone = new ArrayList<Double>();
yListFhklClone = (ArrayList<Double>) yListFhkl.clone();
for(int i =0; i< yListFhklClone.size(); i++){
if(yListFhklClone.get(i) <= 0){
yListFhklClone.set(i, (double) 0.001);
}
}
for(int i = 0; i <yListFhkl.size(); i++){
yListFhklError.add(Math.sqrt(yListFhklClone.get(i)));
}
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int[][] getInitialLenPt() {
return initialLenPt;
}
public void setInitialLenPt(int[][] initialLenPt) {
this.initialLenPt = initialLenPt;
}
public IDataset getInitialDataset() {
return initialDataset;
}
public void setInitialDataset(IDataset initialDataset) {
this.initialDataset = initialDataset;
}
public ArrayList<Double> getyListError() {
return yListError;
}
public void setyListError(ArrayList<Double> yListError) {
this.yListError = yListError;
}
public ArrayList<Double> getyListFhklError() {
return yListFhklError;
}
public void setyListFhklError(ArrayList<Double> yListFhklError) {
this.yListFhklError = yListFhklError;
}
public IDataset getYIDatasetMax(){
yIDatasetMax = Maths.add(yIDataset(), yIDatasetError());
return yIDatasetMax;
}
public IDataset getYIDatasetFhklMax(){
yIDatasetFhklMax = Maths.add(yIDatasetFhkl(), yIDatasetFhklError());
return yIDatasetFhklMax;
}
public IDataset getYIDatasetMin(){
yIDatasetMin = Maths.subtract(yIDataset(), yIDatasetError());
return yIDatasetMin;
}
public IDataset getYIDatasetFhklMin(){
yIDatasetFhklMin = Maths.subtract(yIDatasetFhkl(), yIDatasetFhklError());
return yIDatasetFhklMin;
}
public ArrayList<double[]> getLocationList() {
return locationList;
}
public void setLocationList(ArrayList<double[]> locationList) {
this.locationList = locationList;
}
public void addLocationList(int l , int k, int[] in){
double[] inDouble = new double[in.length];
for (int i = 0; i<in.length; i++){
inDouble[i] = (double)in[i];
}
addLocationList(l, k, inDouble);
}
public void addLocationList(int l, int k, double[] location){
if (locationList==null || locationList.isEmpty()){
locationList = new ArrayList<double[]>();
for (int i = 0; i < l; i++) {
locationList.add(new double[]{0,0,0,0,0,0,0,0});
}
}
ArrayList<double[]> locationList1 = new ArrayList<double[]>();
locationList1 = (ArrayList<double[]>) locationList.clone();
locationList1.set(k, location);
firePropertyChange("locationList", this.locationList,
this.locationList= locationList1);
}
public double[] getSeedLocation() {
return seedLocation;
}
public void setSeedLocation(double[] seedLocation) {
this.seedLocation = seedLocation;
}
public void addYListRaw(int l,
int k,
double y){
//
// dataArrayListManager(yListRaw,
// yListRawError,
// l,
// k,
// y);
firePropertyChange("yListRaw", this.yListRaw,
this.yListRaw= yListRaw);
if (yListRaw==null){
yListRaw = new ArrayList<Double>();
for (int i = 0; i < l; i++) {
yListRaw.add((double)1000000000);
}
}
if (yListRaw.size() == 0){
yListRaw = new ArrayList<Double>();
for (int i = 0; i < l; i++) {
yListRaw.add((double)1000000000);
}
}
if (yListRawError==null){
yListRawError = new ArrayList<Double>();
for (int i = 0; i < l; i++) {
yListRawError.add((double)1000000000);
}
}
if (yListRawError.size() == 0){
yListRawError = new ArrayList<Double>();
for (int i = 0; i < l; i++) {
yListRawError.add((double)1000000000);
}
}
ArrayList<Double> yList1 = new ArrayList<Double>();
yList1 = (ArrayList<Double>) yListRaw.clone();
yList1.set(k,y);
yListRaw = yList1;
ArrayList<Double> yList2 = new ArrayList<Double>();
yList2 = (ArrayList<Double>) yListRawError.clone();
yList2.set(k,Math.sqrt(y));
yListRawError = yList2;
firePropertyChange("yListRaw", this.yListRaw,
this.yListRaw= yListRaw);
}
public void addYListRaw(double y){
addToDataArray(yListRaw, yListRawError, y);
firePropertyChange("yListRaw", this.yListRaw,
this.yListRaw= yListRaw);
}
public void addToDataArray(ArrayList<Double> dataArray,
ArrayList<Double> dataArrayError,
double y){
if (dataArray==null){
dataArray = new ArrayList<Double>();
}
if (dataArrayError==null){
dataArrayError = new ArrayList<Double>();
}
ArrayList<Double> dataArrayError1 = new ArrayList<Double>();
dataArrayError1 = (ArrayList<Double>) dataArrayError.clone();
dataArrayError1.add(Math.sqrt(y));
dataArrayError = dataArrayError1;
ArrayList<Double> yList1 = new ArrayList<Double>();
yList1 = (ArrayList<Double>) dataArray.clone();
yList1.add(y);
dataArray= yList1;
}
public void dataArrayListManager(ArrayList<Double> dataArray,
ArrayList<Double> dataArrayError,
int l,
int k,
double y){
if (dataArray==null){
dataArray = new ArrayList<Double>();
for (int i = 0; i < l; i++) {
dataArray.add((double)1000000000);
}
}
if (dataArray.size() == 0){
dataArray = new ArrayList<Double>();
for (int i = 0; i < l; i++) {
dataArray.add((double)1000000000);
}
}
if (dataArrayError==null){
dataArrayError = new ArrayList<Double>();
for (int i = 0; i < l; i++) {
dataArrayError.add((double)1000000000);
}
}
if (dataArrayError.size() == 0){
dataArrayError = new ArrayList<Double>();
for (int i = 0; i < l; i++) {
dataArrayError.add((double)1000000000);
}
}
ArrayList<Double> yList1 = new ArrayList<Double>();
yList1 = (ArrayList<Double>) dataArray.clone();
yList1.set(k,y);
dataArray = yList1;
ArrayList<Double> yList2 = new ArrayList<Double>();
yList2 = (ArrayList<Double>) dataArrayError.clone();
yList2.set(k,Math.sqrt(y));
dataArrayError = yList2;
}
}