📄 mcacaldb.java
字号:
currentStats.medianAFreeDeviation = Stats.meanDeviation(x, currentCodaCount);
for (int idx = 0; idx < currentCodaCount; idx++) {
x[idx] = inputDataList[idx].qFree;
}
currentStats.medianQFree = Stats.median(x, currentCodaCount);
currentStats.medianQFreeDeviation = Stats.meanDeviation(x, currentCodaCount);
return evaluateChannelStats(currentStats);
}
private boolean evaluateChannelStats(OutputStats stats) {
boolean status = true;
StringBuffer sb = new StringBuffer(80);
if (! rejectDisabled) {
// double qdif = Math.abs(stats.medianQFree - McaCalibrationTN.QFIX_DEFAULT)
if (stats.codaCount < 10) {
sb.append("ncoda<10; ");
status = false;
}
if ( stats.medianQFree < 0.2) {
sb.append("qfree<.2; ");
status = false;
}
if (Math.abs(stats.calibrFitAFix - stats.medianAFix) > 0.5) {
sb.append("adiff>.5; ");
status = false;
}
if (stats.calibrFitSlope < 1.0) {
sb.append("slope<1.; ");
status = false;
}
}
if (status) sb.append("ACCEPT");
else sb.append("REJECT");
stats.statusString = sb.toString();
return status;
}
protected boolean writeChannelStatsToDb() {
String seedchan = currentStats.stnChl.getSeedchan();
long clipAmp = CodaCalibrationTN.getDefaultClipAmp(seedchan);
long cutoffAmp = CodaCalibrationTN.getDefaultCutoffAmp(seedchan);
McaCalibrationTN mcaCalibr = new McaCalibrationTN(currentStats.stnChl, currentCalibrDateRange,
currentStats.codaCount, currentStats.medianAFix, McaCalibrationTN.QFIX_DEFAULT,
currentStats.medianAFree, currentStats.medianQFree,
currentStats.calibrFitSlope, clipAmp, cutoffAmp);
boolean status = mcaCalibr.store();
if (! status ) log.println("Error writing to db : " + currentStats.stnChl.toAbbrvStnChlString() );
return status;
}
private void printChannelStats() {
log.println();
log.println(currentStats.getHeaderString());
log.println(currentStats.toString());
}
private void printChannelMagResidualsHeader() {
log.println("\n IDX ID DEV NW AFX AFR QFR ML MC RMS - MAGRES +");
}
private void printChannelMagResiduals(InputData [] inputDataList) {
char [] cres = new char[21];
Arrays.fill(cres, ' ');
cres[10] = '|';
printChannelMagResidualsHeader();
int currentCodaCount = inputDataList.length;
for (int idx = 0; idx < currentCodaCount; idx++) {
StringBuffer sb = new StringBuffer(132);
Concatenate.format(sb, idx, 4).append(" ");
Concatenate.format(sb, inputDataList[idx].evid, 8).append(" ");
sb.append(inputDataList[idx].stnChl.getSubsource()).append(" :");
Concatenate.format(sb, inputDataList[idx].windows, 4).append(" ");
Concatenate.format(sb, inputDataList[idx].aFix, 5, 2).append(" ");
Concatenate.format(sb, inputDataList[idx].aFree, 5, 2).append(" ");
Concatenate.format(sb, inputDataList[idx].qFree, 5, 2).append(" : ");
Concatenate.format(sb, inputDataList[idx].ml, 5, 2).append(" ");
double calibratedMagnitude = inputDataList[idx].aFix - currentStats.medianAFix;
double residual = calibratedMagnitude - inputDataList[idx].ml;
int intRes = (int) ((residual + 1.05)/0.1);
if (intRes < 0) intRes = 0;
else if (intRes > 20) intRes = 20;
double value = Math.floor(inputDataList[idx].ml);
if (value < 0.) value = 0.;
else if (value > 6.) value = 6.;
char chr = Character.forDigit((int) value, 10);
cres[intRes] = chr;
Concatenate.format(sb, calibratedMagnitude, 5, 2).append(" ");
Concatenate.format(sb, residual, 5, 2).append(" |");
sb.append(new String(cres)).append("|");
log.println(sb.toString());
cres[intRes] = ' ';
cres[10] = '|';
}
}
// l1 norm fit of data to determine slope and intercept parameters
private void calcL1Norm(InputData [] inputDataList) {
double smallestResidualSum = 999999.;
double bestFitLineIntercept = 0.;
double bestFitLineSlope = 0.;
int currentCodaCount = inputDataList.length;
double [] x = new double[currentCodaCount];
for (int idx =0; idx < currentCodaCount; idx++) {
x[idx] = inputDataList[idx].qFree;
}
int [] is = IndexSort.getSortedIndexes(x);
double [] y = new double[currentCodaCount];
// DEBUG log.println(" idx sidx id dev cnt afix afree qfree mag");
for (int idx =0; idx < currentCodaCount; idx++) {
x[idx] = inputDataList[is[idx]].qFree;
y[idx] = inputDataList[is[idx]].aFree - inputDataList[is[idx]].ml;
/* DEBUG OUTPUT BELOW HERE
StringBuffer sb = new StringBuffer(132);
Concatenate.format(sb, idx, 4).append(" ");
Concatenate.format(sb, is[idx], 4).append(" ");
Concatenate.format(sb, inputDataList[is[idx]].evid, 8).append(" ");
sb.append(inputDataList[is[idx]].stnChl.getSubsource()).append(" :");
Concatenate.format(sb, inputDataList[is[idx]].windows, 4).append(" ");
Concatenate.format(sb, inputDataList[is[idx]].aFix, 5, 2).append(" ");
Concatenate.format(sb, inputDataList[is[idx]].aFree, 5, 2).append(" ");
Concatenate.format(sb, inputDataList[is[idx]].qFree, 5, 2).append(" : ");
Concatenate.format(sb, inputDataList[is[idx]].ml, 5, 2).append(" ");
sb.append(inputDataList[is[idx]].stnChl.toStnChlString());
log.println(sb.toString());
*/
}
for (int idx = 1; idx < currentCodaCount; idx++ ) {
for (int idx2 = 0; idx2 < idx; idx2++) {
double numerator = y[idx2]*x[idx] - y[idx]*x[idx2];
double denominator = x[idx] - x[idx2];
if (denominator < 0.001) denominator = 0.001;
double trialIntercept = numerator/denominator;
//double trialSlope = (trialIntercept - y[idx])/x[idx];
double trialSlope = (y[idx] - trialIntercept)/x[idx];
double sum = 0.;
for (int idx3 = 0; idx3 < currentCodaCount; idx3++) {
double residual = trialIntercept + x[idx3]*trialSlope - y[idx3];
sum += Math.abs(residual);
}
if (sum <= smallestResidualSum) {
bestFitLineIntercept = trialIntercept;
bestFitLineSlope = trialSlope;
smallestResidualSum = sum;
}
}
}
currentStats.calibrFitSlope = bestFitLineSlope;
currentStats.calibrFitAFix = bestFitLineIntercept + bestFitLineSlope * McaCalibrationTN.QFIX_DEFAULT;
}
protected int getDataFromDb(DataStnChl stnChl) {
return getDataFromDb(DataSource.getConnection(), stnChl);
}
protected int getDataFromDb(Connection conn, DataStnChl stnChl) {
currentInputDataCollection.clear(); // reuse existing collection
if (conn == null) {
System.err.println ("McaCalDb no connection is open.");
return 0;
}
try {
if (conn.isClosed()) {
System.err.println ("McaCalDb DataSource connection is closed");
return 0;
}
ResultSet rsdb = executeQuery(getJDBCStatement(conn), stnChl);
if (rsdb == null) return 0; // no data found
while (rsdb.next()) {
currentInputDataCollection.add(parseResultSet(rsdb));
}
rsdb.close();
}
catch (SQLException ex) {
System.err.println(ex);
ex.printStackTrace();
}
return currentInputDataCollection.size();
}
private String createSQLCodaQueryString() {
StringBuffer sb = new StringBuffer(512);
sb.append(SQL_CODA_QUERY_STRING);
if (currentInputDateRange.isLimited()) {
sb.append(" AND ");
sb.append(org.trinet.jdbc.table.Coda.toDateTimeConstraintSQLWhereClause("CODA",
currentInputDateRange.getMinDate(), currentInputDateRange.getMaxDate()));
}
sb.append(SQL_CODA_ORDER_BY_STRING);
if (processedChannelCount < 1) log.println ("getDataFromDb SQL: "+sb.toString()); // DEBUG
return sb.toString();
}
private Statement getJDBCStatement(Connection conn) {
try {
if (preparedDbStatement == null) {
preparedDbStatement = conn.prepareStatement(createSQLCodaQueryString());
}
}
catch (SQLException ex) {
System.err.println(ex);
ex.printStackTrace();
}
return preparedDbStatement;
}
private ResultSet executeQuery(Statement statement, DataStnChl stnChl) {
ResultSet resultSet = null;
PreparedStatement sm = (PreparedStatement) statement;
try {
sm.setString(1,stnChl.getNet());
sm.setString(2,stnChl.getSta());
sm.setString(3,stnChl.getSeedchan());
resultSet = sm.executeQuery();
}
catch (SQLException ex) {
System.err.println(ex);
ex.printStackTrace();
}
return resultSet;
}
protected InputData parseResultSet(ResultSet rsdb) throws java.sql.SQLException{
InputData inputData = new InputData();
inputData.coid = rsdb.getLong(1); // coda.COID
inputData.stnChl.setSta( rsdb.getString(2)); // coda.STA
inputData.stnChl.setNet( rsdb.getString(3)); // coda.NET
inputData.stnChl.setAuth( rsdb.getString(4)); // coda.AUTH
inputData.stnChl.setSubsource(rsdb.getString(5)); // coda.SUBSOURCE
inputData.stnChl.setSeedchan( rsdb.getString(6)); // coda.SEEDCHAN
inputData.stnChl.setLocation( rsdb.getString(7)); // coda.LOCATION
inputData.aFix = rsdb.getDouble(8); // coda.AFIX
inputData.aFree = rsdb.getDouble(9); // coda.AFREE
inputData.qFix = rsdb.getDouble(10); // coda.QFIX
inputData.qFree = rsdb.getDouble(11); // coda.QFREE
inputData.windows = rsdb.getInt(12); // coda.NSAMPLE
inputData.time = rsdb.getDouble(13); // coda.DATETIME
inputData.evid = rsdb.getLong(14); // origin.EVID
inputData.orid = rsdb.getLong(15); // assoccoo.ORID
inputData.magid = rsdb.getLong(16); // netmag.MAGNITUDE
inputData.ml = rsdb.getDouble(17); // netmag.MAGNITUDE
return inputData;
}
public static void main(String [] args) {
// alternative is configure with properties/resource file for debug settings, database info etc.
int nargs = args.length;
if (nargs < 1) {
System.err.println("syntax: McaCalDb hostName [startDateStr endDateStr]");
System.err.println("example: McaCalDb k2 2000/10/01 2000/12/31");
System.exit(0);
}
String hostName = args[0].trim();
String dbName = hostName + "db";
String dbConnect = "jdbc:oracle:thin:@" + hostName + ".gps.caltech.edu:1521:" + dbName;
System.out.println("Connection url: " + dbConnect);
DataSource ds = new DataSource(
dbConnect,
"oracle.jdbc.driver.OracleDriver",
"trinetdb",
"calgs",
true
);
EnvironmentInfo.setApplicationName("McaCalDb");
EnvironmentInfo.setNetworkCode("CI");
boolean status = false;
java.util.Date startDate = (nargs > 1) ? EpochTime.stringToDate(args[1], "yyyy/MM/dd") : null;
java.util.Date endDate = (nargs > 2) ? EpochTime.stringToDate(args[2], "yyyy/MM/dd") : null;
try {
McaCalDb calibrator = new McaCalDb(startDate, endDate);
status = calibrator.calibrate();
}
catch (IOException ex) {
ex.printStackTrace();
}
catch (Exception ex) {
ex.printStackTrace();
}
if (status) DataSource.commit();
else {
try {
DataSource.getConnection().rollback();
}
catch (java.sql.SQLException sqlEx) {
sqlEx.printStackTrace();
}
}
DataSource.close();
System.exit(0);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -