MTIndexerModule.java
/**
* MTIndexerModule
*/
package gov.usgs.earthquake.momenttensor;
import java.math.BigDecimal;
import gov.usgs.earthquake.indexer.DefaultIndexerModule;
import gov.usgs.earthquake.indexer.IndexerModule;
import gov.usgs.earthquake.indexer.ProductSummary;
import gov.usgs.earthquake.product.Product;
/**
* Moment Tensor Indexer Module.
*
* Implements ANSS business logic for preferred moment tensors.
*
* Intended order is:
* <ol>
* <li>Mww (W-phase)</li>
* <li>Mwc from GCMT</li>
* <li>Mwc</li>
* <li>Mwb</li>
* <li>Other</li>
* <li>Mwb outside magnitude range [5.5, 7.0]</li>
* </ol>
*
* <hr>
*
* Uses {@link DefaultIndexerModule#getProductSummary(Product)} defaults,
* with the following additional weights:
*
* <ul>
* <li>
* <code>Event Source</code> comes from the product property
* <code>eventsource</code>
* </li>
* <li>
* <code>Magnitude</code> comes from the product property
* <code>derived-magnitude</code>
* </li>
* <li>
* <code>Type</code> comes from the product property
* <code>derived-magnitude-type</code>, or (if not found)
* from the product property <code>beachball-type</code>
* </li>
* </ul>
*
* <dl>
* <dt>Type is <code>Mww</code></dt>
* <dd><code>+60</code></dd>
*
* <dt>Type is <code>Mwc</code></dt>
* <dd><code>+2</code></dd>
*
* <dt>Type is <code>Mwb</code>
* <dd><code>+1</code></dd>
*
* <dt>Type is <code>Mwb</code>, and Magnitude outside the
* range <code>[5.5, 7.0]</code></dt>
* <dd><code>-100</code></dd>
*
* <dt>Event Source is <code>GCMT</code></dt>
* <dd><code>+56</code></dd>
* </dl>
*/
public class MTIndexerModule extends DefaultIndexerModule {
private static final String TYPE_MWW = "Mww";
private static final long TYPE_MWW_BONUS = 60L;
private static final String TYPE_MWC = "Mwc";
private static final long TYPE_MWC_BONUS = 2L;
private static final String TYPE_MWB = "Mwb";
private static final long TYPE_MWB_BONUS = 1L;
private static final long TYPE_OTHER_BONUS = 0L;
private static final String EVENT_SOURCE_GCMT = "gcmt";
private static final long EVENT_SOURCE_GCMT_BONUS = 56L;
private static final long MAG_OUTSIDE_RANGE_PENALTY = -100L;
private static final BigDecimal MAG_RANGE_MIN = new BigDecimal("5.5");
private static final BigDecimal MAG_RANGE_MAX = new BigDecimal("7.0");
/**
* Override IndexerModule api method.
*
* @return
* IndexerModule.LEVEL_SUPPORTED when type is <code>moment-tensor</code>;
* otherwise, IndexerModule.LEVEL_UNSUPPORTED.
*/
@Override
public int getSupportLevel(Product product) {
int supportLevel = IndexerModule.LEVEL_UNSUPPORTED;
String type = getBaseProductType(product.getId().getType());
// Support only moment tensor products
if ("moment-tensor".equals(type)) {
supportLevel = IndexerModule.LEVEL_SUPPORTED;
}
return supportLevel;
}
/**
* Calculate preferred weight for <code>moment-tensor</code> type product.
*
* @param summary "moment-tensor" type product summary.
* @return
* when type is <code>moment-tensor</code>, {@link IndexerModule#LEVEL_SUPPORTED};
* otherwise, {@link IndexerModule#LEVEL_UNSUPPORTED}
*/
@Override
protected long getPreferredWeight(ProductSummary summary)
throws Exception {
// Get the default preferred weight value from the parent class
long weight = super.getPreferredWeight(summary);
// points by type
String tensorType = summary.getProperties().get("derived-magnitude-type");
String eventSource = summary.getEventSource();
String derivedMagnitude = summary.getProperties().get("derived-magnitude");
BigDecimal magRange = derivedMagnitude == null ? null : new BigDecimal(derivedMagnitude);
if (tensorType == null) {
tensorType = summary.getProperties().get("beachball-type");
}
if (tensorType != null) {
// Add bonus
if (tensorType.equalsIgnoreCase(TYPE_MWW)) {
weight += TYPE_MWW_BONUS;
} else if (tensorType.equalsIgnoreCase(TYPE_MWC)) {
weight += TYPE_MWC_BONUS;
} else if (tensorType.equalsIgnoreCase(TYPE_MWB)) {
weight += TYPE_MWB_BONUS;
} else {
weight += TYPE_OTHER_BONUS;
}
// Subtract penalty
if (magRange != null
&& tensorType.equalsIgnoreCase(TYPE_MWB)
&& (magRange.compareTo(MAG_RANGE_MIN) == -1 || magRange.compareTo(MAG_RANGE_MAX) == 1)) {
weight += MAG_OUTSIDE_RANGE_PENALTY;
}
}
// Add gcmt bonus if required
if (eventSource != null && eventSource.equalsIgnoreCase(EVENT_SOURCE_GCMT)) {
weight += EVENT_SOURCE_GCMT_BONUS;
}
return weight;
}
}