package org.opensha2.calc;
import static org.opensha2.internal.TextUtils.LOG_INDENT;
import org.opensha2.calc.CalcConfig.Deagg.Bins;
import org.opensha2.calc.DeaggExport.EpsilonBins;
import org.opensha2.calc.DeaggExport.εBin;
import org.opensha2.gmm.Imt;
import com.google.common.collect.ImmutableList;
import java.util.List;
/**
* A deaggregation configuration container. This class provides a reusable
* builder that comes in handy when iterating over IMTs and only the return
* period and iml require updating. A unique config is required for each
* deaggregation performed.
*
* Note that this is a class of convenience and assumes that return period and
* IML are in agreement for the IMT of interest, i.e. one or the other has been
* correctly derived from the total curve in a hazard object.
*
* @author Peter Powers
*/
final class DeaggConfig {
final Bins bins;
final EpsilonBins εBins;
final double contributorLimit;
final Imt imt;
final DeaggDataset model;
final double iml;
final double rate;
final double returnPeriod;
final ExceedanceModel probabilityModel;
final double truncation;
private DeaggConfig(
Bins bins,
EpsilonBins εBins,
double contributorLimit,
Imt imt,
DeaggDataset model,
double iml,
double rate,
double returnPeriod,
ExceedanceModel probabilityModel,
double truncation) {
this.bins = bins;
this.εBins = εBins;
this.contributorLimit = contributorLimit;
this.imt = imt;
this.model = model;
this.iml = iml;
this.rate = rate;
this.returnPeriod = returnPeriod;
this.probabilityModel = probabilityModel;
this.truncation = truncation;
}
@Override
public String toString() {
return new StringBuilder("Deagg config:")
.append(LOG_INDENT)
.append("imt: ").append(imt.name()).append(" [").append(imt).append("]")
.append(LOG_INDENT)
.append("iml: ").append(iml).append(" ").append(imt.units())
.append(LOG_INDENT)
.append("rate: ").append(rate).append(" yr⁻¹")
.append(LOG_INDENT)
.append("returnPeriod: ").append(returnPeriod).append(" yrs")
.append(LOG_INDENT)
.append("probabilityModel: ").append(probabilityModel)
.append(" [trunc = ").append(truncation).append("]")
.toString();
}
static Builder builder(Hazard hazard) {
return new Builder()
.dataModel(
DeaggDataset.builder(hazard.config).build())
.probabilityModel(
hazard.config.hazard.exceedanceModel,
hazard.config.hazard.truncationLevel)
.settings(hazard.config.deagg);
}
/* Reusable builder */
static class Builder {
private Bins bins;
private EpsilonBins εBins;
private Double contributorLimit;
private Imt imt;
private DeaggDataset model;
private Double iml;
private Double rate;
private Double returnPeriod;
private ExceedanceModel probabilityModel;
private Double truncation;
Builder imt(Imt imt) {
this.imt = imt;
return this;
}
Builder settings(CalcConfig.Deagg settings) {
this.bins = settings.bins;
this.contributorLimit = settings.contributorLimit;
return this;
}
Builder dataModel(DeaggDataset model) {
this.model = model;
this.εBins = createEpsilonBins(model.rmε.levels(), model.rmε.levelΔ());
return this;
}
/*
* Supply the target iml along with corresponding annual rate and return
* period for the IMT of interest.
*/
Builder iml(double iml, double rate, double returnPeriod) {
this.iml = iml;
this.rate = rate;
this.returnPeriod = returnPeriod;
return this;
}
Builder probabilityModel(
ExceedanceModel probabilityModel,
double truncation) {
this.probabilityModel = probabilityModel;
this.truncation = truncation;
return this;
}
Builder contributorLimit(double contributorLimit) {
this.contributorLimit = contributorLimit;
return this;
}
DeaggConfig build() {
return new DeaggConfig(
bins,
εBins,
contributorLimit,
imt,
model,
iml,
rate,
returnPeriod,
probabilityModel,
truncation);
}
}
static EpsilonBins createEpsilonBins(List<Double> εLevels, double εDelta) {
double εDeltaBy2 = εDelta / 2.0;
ImmutableList.Builder<εBin> bins = ImmutableList.builder();
for (int i = 0; i < εLevels.size(); i++) {
Double min = (i == 0) ? null : εLevels.get(i) - εDeltaBy2;
Double max = (i == εLevels.size() - 1) ? null : εLevels.get(i) + εDeltaBy2;
bins.add(new εBin(i, min, max));
}
return new EpsilonBins(bins.build());
}
}