org.omscentral.modules.analysis.esp.EnsembleData Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of oms Show documentation
Show all versions of oms Show documentation
Object Modeling System (OMS) is a pure Java object-oriented framework.
OMS v3.+ is a highly interoperable and lightweight modeling framework for component-based model and simulation development on multiple platforms.
/*
* $Id: EnsembleData.java 50798ee5e25c 2013-01-09 [email protected] $
*
* This file is part of the Object Modeling System (OMS),
* 2007-2012, Olaf David and others, Colorado State University.
*
* OMS is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, version 2.1.
*
* OMS is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with OMS. If not, see .
*/
package org.omscentral.modules.analysis.esp;
import java.util.ArrayList;
public class EnsembleData {
static public int VOLUME = 1;
static public int PEAK = 2;
static public int YEAR = 3;
private TimeSeriesCookie initialization; // contains data for plotting
private ArrayList forecasts; // array of TimeSeries with data for plotting
private ArrayList historic; // array of TimeSeries with no data; used to keep track of historic years
private ArrayList input; // array of TimeSeries with no data; used to keep track of input files
private ArrayList output; // array of TimeSeries with init + forecast data for analysis
private ArrayList stats; // array of EnsembleListLabel
private ArrayList statsInVolumeOrder;
private ArrayList statsInPeakOrder;
private String name;
private int sortOrder = VOLUME;
public EnsembleData(String name, ESPTimeSeries initialization,
ArrayList forecasts, ArrayList output, ArrayList historic) {
this.name = name;
this.initialization = initialization;
this.historic = historic;
this.output = output;
setForecasts(forecasts);
}
public EnsembleData(String name, ESPTimeSeries init, ArrayList forecasts, ArrayList historic) {
this.name = name;
this.initialization = init;
this.historic = historic;
setForecasts(forecasts);
}
private void PROCESS_trace(ModelDateTime analysisStart, ModelDateTime analysisEnd) {
// int analysis_dateCount = (int)(analysisEnd.getJulian() - analysisStart.getJulian()) + 1;
for (int j = 0; j < forecasts.size(); j++) {
EnsembleListLabel ts = (stats.get(j));
ESPTimeSeries trace = (output.get(j));
double[] trace_data = trace.getVals();
double[] trace_dates = trace.getDates();
ts.setTraceVolume(0.0);
ts.setTracePeak(0.0);
// danger: Olaf changed this!!!!!!!!!!!!!
int offset = (int)(analysisStart.getJulian()) - (int)(trace.getStart().getJulian())-1;
int length = (int)(analysisEnd.getJulian()) - (int)(analysisStart.getJulian());
// System.out.println("length " + length + " offset " + offset + " trace.length " + trace_data.length + " " +
// trace);
for (int k = 0; k < length; k++) {
double tmp = trace_data[k + offset];
ts.setTraceVolume(tmp + ts.getTraceVolume());
if (ts.getTracePeak() < tmp) {
ts.setTracePeak(tmp);
ts.setTimeToPeak(trace_dates[k + offset]);
}
}
}
statsInVolumeOrder = new ArrayList (stats.size());
statsInPeakOrder = new ArrayList (stats.size());
/*
* Make copies
*/
for (int i = 0; i < stats.size(); i++) {
statsInVolumeOrder.add(i, stats.get(i));
statsInPeakOrder.add(i, stats.get(i));
}
sort(statsInVolumeOrder, statsInPeakOrder);
}
public static void sort(ArrayList statsInVolumeOrder,
ArrayList statsInPeakOrder) {
/*
* Sort by volumes
*/
for (int i = 0; i < statsInVolumeOrder.size() - 1; i++) {
EnsembleListLabel tsi = (statsInVolumeOrder.get(i));
for (int j = i+1; j < statsInVolumeOrder.size(); j++) {
EnsembleListLabel tsj = (statsInVolumeOrder.get(j));
if (tsj.getTraceVolume() > tsi.getTraceVolume()) {
statsInVolumeOrder.set(j, tsi);
statsInVolumeOrder.set(i, tsj);
tsi = tsj;
}
}
}
/*
* Generate volume probabilities
* Formula is P = (100.0) m / (n + 1.0) (Linsley, Kohler, and Paulhus page 249)
*/
double n = (double)(statsInVolumeOrder.size() + 1);
for (int i = 0; i < statsInVolumeOrder.size(); i++) {
double m = (double)(i + 1);
EnsembleListLabel tsi = (statsInVolumeOrder.get(i));
double prob = 100 * m / n;
tsi.setVolumeRank(i+1);
tsi.setActVolumeProb(prob);
tsi.setRoundVolumeProb(fivePercentRound(prob));
}
/*
System.out.println("\nVolume");
for (int i = 0; i < stats.size(); i++) {
EnsembleListLabel tsi = (EnsembleListLabel)(statsInVolumeOrder.get(i));
System.out.println ("EnsembleData.Sort statsInVolumeOrder = " + tsi + " volume = " + tsi.getTraceVolume() + " peak = " + tsi.getTracePeak() + " time to peak = " + tsi.getTimeToPeak());
}
*/
/*
* Sort by peak
*/
for (int i = 0; i < statsInPeakOrder.size() - 1; i++) {
EnsembleListLabel tsi = (statsInPeakOrder.get(i));
for (int j = i+1; j < statsInPeakOrder.size(); j++) {
EnsembleListLabel tsj = (statsInPeakOrder.get(j));
if (tsj.getTracePeak() > tsi.getTracePeak()) {
statsInPeakOrder.set(j, tsi);
statsInPeakOrder.set(i, tsj);
tsi = tsj;
}
}
}
/*
System.out.println("\nPeak");
for (int i = 0; i < stats.size(); i++) {
EnsembleListLabel tsi = (EnsembleListLabel)(statsInPeakOrder.get(i));
System.out.println ("EnsembleData.Sort statsInPeakOrder = " + tsi + " volume = " + tsi.getTraceVolume() + " peak = " + tsi.getTracePeak() + " time to peak = " + tsi.getTimeToPeak());
}
*/
/*
* Generate peak probabilities
* Formula is P = (100.0) m / (n + 1.0) (Linsley, Kohler, and Paulhus page 249)
*/
n = (double)(statsInPeakOrder.size() + 1);
for (int i = 0; i < statsInPeakOrder.size(); i++) {
double m = (double)(i + 1);
EnsembleListLabel tsi = statsInPeakOrder.get(i);
double prob = 100 * m / n;
tsi.setPeakRank(i+1);
tsi.setActPeakProb(prob);
tsi.setRoundPeakProb(fivePercentRound(prob));
}
}
public static double fivePercentRound(double p) {
if (p > 92.5) {
return (95.0);
} else if (p > 87.5) {
return (90.0);
} else if (p > 82.5) {
return (85.0);
} else if (p > 77.5) {
return (80.0);
} else if (p > 72.5) {
return (75.0);
} else if (p > 67.5) {
return (70.0);
} else if (p > 62.5) {
return (65.0);
} else if (p > 57.5) {
return (60.0);
} else if (p > 52.5) {
return (55.0);
} else if (p > 47.5) {
return (50.0);
} else if (p > 42.5) {
return (45.0);
} else if (p > 37.5) {
return (40.0);
} else if (p > 32.5) {
return (35.0);
} else if (p > 27.5) {
return (30.0);
} else if (p > 22.5) {
return (25.0);
} else if (p > 17.5) {
return (20.0);
} else if (p > 12.5) {
return (15.0);
} else if (p > 7.5) {
return (10.0);
} else {
return (5.0);
}
}
public ModelDateTime getInitializationStart() {
return this.initialization.getStart();
}
public ModelDateTime getInitializationEnd() {
return this.initialization.getEnd();
}
public ModelDateTime getForecastStart() {
ESPTimeSeries forecast = forecasts.get(0);
return forecast.getStart();
}
public ModelDateTime getForecastEnd() {
ESPTimeSeries forecast = forecasts.get(0);
return forecast.getEnd();
}
public TimeSeriesCookie getInitialization() {
return this.initialization;
}
public void setInitialization(TimeSeriesCookie initialization) {
this.initialization = initialization;
}
public ArrayList getHistoric() {
return this.historic;
}
public void setHistoric(ArrayList historic) {
this.historic = historic;
}
public String getName() {
return this.name;
}
public void setName(String name) {
this.name = name;
}
public ArrayList getForecasts() {
return this.forecasts;
}
public void setForecasts(ArrayList forecasts) {
this.forecasts = forecasts;
if (forecasts != null) {
int size = forecasts.size();
this.stats = new ArrayList(size);
for (int i = 0; i < size; i++) {
ESPTimeSeries ts = forecasts.get(i);
this.stats.add(new EnsembleListLabel(ts, this));
}
}
}
public ArrayList getInput() {
return this.input;
}
/**
* Setter for property input.
* @param input New value of property input.
*/
public void setInput(ArrayList input) {
this.input = input;
}
/**
* Getter for property output.
* @return Value of property output.
*/
public ArrayList getOutput() {
return this.output;
}
/**
* Setter for property output.
* @param output New value of property output.
*/
public void setOutput(ArrayList output) {
this.output = output;
}
public void setAnalysisPeriod(ModelDateTime start_date, ModelDateTime end_date) {
PROCESS_trace(start_date, end_date);
}
/**
* Getter for property stats.
* @return Value of property stats.
*/
public ArrayList getStats() {
return this.stats;
}
/**
* Getter for property statsInVolumeOrder.
* @return Value of property statsInVolumeOrder.
*/
public ArrayList getStatsInVolumeOrder() {
return this.statsInVolumeOrder;
}
/**
* Getter for property statsInPeakOrder.
* @return Value of property statsInPeakOrder.
*/
public ArrayList getStatsInPeakOrder() {
return this.statsInPeakOrder;
}
// public static EnsembleData load (String file_name) {
// EnsembleData ed = null;
//
// try {
// DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
// factory.setNamespaceAware(true);
// DocumentBuilder builder = factory.newDocumentBuilder();
// Document doc = builder.parse(file_name);
//
// Node node = OuiProjectXml.selectSingleNode(doc, "/ESP");
// ed = new EnsembleData(OuiProjectXml.getElementContent(node, "@name", null), null, null, null);
//
//
///*
// * Read ESP meta data from the xml file
// */
// ed.setInitialization(TimeSeries.getTimeSeriesFromXmlNode(OuiProjectXml.selectSingleNode(doc, "/ESP/initialization/TimeSeries")));
//// initialization.dump();
//
// ed.setHistoric(getArrayListFromXmlNode (OuiProjectXml.selectSingleNode(doc, "/ESP/historic")));
// ed.setInput(getArrayListFromXmlNode (OuiProjectXml.selectSingleNode(doc, "/ESP/input")));
// ed.setOutput(getArrayListFromXmlNode (OuiProjectXml.selectSingleNode(doc, "/ESP/output")));
// ed.setForecasts(getArrayListFromXmlNode (OuiProjectXml.selectSingleNode(doc, "/ESP/forecasts")));
///*
// * Read the trace data
// */
// MmsOuiEspReader.readEsp(ed);
//
// } catch (Exception E) {
// System.err.println(E.getMessage());
// }
//
// return ed;
// }
//
// public static ArrayList getArrayListFromXmlNode (Node node) {
// NodeList nl = OuiProjectXml.selectNodes(node, "TimeSeries");
//
// ArrayList al = new ArrayList(nl.getLength());
// for (int i = 0; i < nl.getLength(); i++) {
// TimeSeries ts = TimeSeries.getTimeSeriesFromXmlNode(nl.item(i));
//// ts.dump();
// al.add(i, ts);
// }
//
// return al;
// }
//
// public void save (String file_name) {
// Format format = new Format("%.2f");
// PrintWriter out = null;
//
// System.out.println ("EnsembleData.save: writing file " + file_name);
//
// try {
// out = new PrintWriter(new FileWriter(file_name));
//
// out.println ("");
// out.println ("");
//
// out.println (" ");
// out.println (" " + initialization.getXmlBlock());
// out.println (" ");
//
// writeArrayListBlock(out, "forecasts", forecasts);
// writeArrayListBlock(out, "historic", historic);
// writeArrayListBlock(out, "input", input);
// writeArrayListBlock(out, "output", output);
//
// out.println (" ");
//
// } catch (Exception e) {
// e.printStackTrace();
//
// } finally {
// if (out!= null) out.close();
// }
// }
// private void writeArrayListBlock(PrintWriter out, String name, ArrayList list) {
// out.println(" <" + name + ">");
// Iterator it = list.iterator();
// while (it.hasNext()) {
// TimeSeries ts = (TimeSeries)(it.next());
// out.println(" " + ts.getXmlBlock());
// }
// out.println(" " + name + ">");
// }
/**
* Getter for property sortOrder.
* @return Value of property sortOrder.
*/
public int getSortOrder() {
return this.sortOrder;
}
/**
* Setter for property sortOrder.
* @param sortOrder New value of property sortOrder.
*/
public void setSortOrder(int sortOrder) {
this.sortOrder = sortOrder;
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy