Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 12 additions & 0 deletions pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -197,6 +197,18 @@
<groupId>edu.iris.dmc</groupId>
<artifactId>stationxml-seed-converter</artifactId>
<version>2.1.3</version>
<exclusions>
<exclusion>
<groupId>edu.iris.dmc</groupId>
<artifactId>java-4-seed</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>edu.iris.dmc</groupId>
<artifactId>java-4-seed</artifactId>
<version>1.1.0</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
Expand Down
13 changes: 7 additions & 6 deletions src/main/java/edu/iris/dmc/station/RuleEngineRegistry.java
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
import edu.iris.dmc.station.conditions.AzimuthDipCondition;
import edu.iris.dmc.station.conditions.CalibrationUnitCondition;
import edu.iris.dmc.station.conditions.CodeCondition;
import edu.iris.dmc.station.conditions.ComplexConjugateCondition;
import edu.iris.dmc.station.conditions.Condition;
import edu.iris.dmc.station.conditions.DecimationAnalogFilterCondition;
import edu.iris.dmc.station.conditions.DecimationCondition;
Expand All @@ -37,7 +38,6 @@
import edu.iris.dmc.station.conditions.OrientationConditionE;
import edu.iris.dmc.station.conditions.OrientationConditionZ;
import edu.iris.dmc.station.conditions.PolesZerosCondition;
import edu.iris.dmc.station.conditions.PolesZerosSequenceCondition;
import edu.iris.dmc.station.conditions.PolynomialCondition;
import edu.iris.dmc.station.conditions.ResponseListCondition;
import edu.iris.dmc.station.conditions.SampleRateCondition;
Expand Down Expand Up @@ -276,11 +276,12 @@ private void defaultResponseRules(Set<Integer> s) {
"Response must include InstrumentSensitivity if no Polynomial stages are included.",
new ChannelCodeRestriction(), new ChannelTypeRestriction()), Response.class);
}
//if (!s.contains(417)) {
// add(417, new PolesZerosSequenceCondition(false,
// "If Stage[N]:PolesZeros contains Zeros and Poles then Zero:Number and Pole:Number must start at 0 and be sequential.",
// new ChannelCodeRestriction(), new ChannelTypeRestriction()), Response.class);
//}
if (!s.contains(417)) {
add(417, new ComplexConjugateCondition(false,
"If Stage[N] of type PolesZeros contains a Pole or Zero with nonzero Imaginary component then Stage[N]:PolesZeros:Poles or Stage[N]:PolesZeros:Zeros must also include its complex conjugate.",
new ChannelCodeRestriction(), new ChannelTypeRestriction(), new ResponsePolynomialRestriction()),
Response.class);
}

if (!s.contains(420)) {
add(420, new MissingDecimationCondition(true,
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,122 @@
package edu.iris.dmc.station.conditions;

import edu.iris.dmc.fdsn.station.model.*;
import edu.iris.dmc.station.restrictions.Restriction;
import edu.iris.dmc.station.rules.Message;
import edu.iris.dmc.station.rules.Result;

import java.text.DecimalFormat;
import java.util.*;
import java.util.concurrent.ConcurrentHashMap;
import java.util.logging.Logger;

public class ComplexConjugateCondition extends ChannelRestrictedCondition {

private static final Logger LOGGER = Logger.getLogger(ComplexConjugateCondition.class.getName());

private final DecimalFormat df = new DecimalFormat("#.#####");

public ComplexConjugateCondition(boolean required, String description, Restriction... restrictions) {
super(required, description, restrictions);
}

@Override
public Message evaluate(Network network) {
throw new IllegalArgumentException("method not supported!");
}

@Override
public Message evaluate(Station station) {
throw new IllegalArgumentException("method not supported!");
}

@Override
public Message evaluate(Channel channel) {
if (channel == null) {
return Result.success();
}
return evaluate(channel, channel.getResponse());
}

@Override
public Message evaluate(Channel channel, Response response) {

if (isRestricted(channel)) {
return Result.success();
}
if (this.required) {
if (response == null) {
return Result.error("expected response but was null");
}
}
if (response.getStage() != null && !response.getStage().isEmpty()) {
List<ResponseStage> stages = response.getStage();
int stage = 1;
for (ResponseStage s : stages) {
if (s.getPolesZeros() != null) {
if (s.getPolesZeros().getZero() != null) {
Map<Double, Set<Double>> conjugatePairMap = new ConcurrentHashMap<>();
// first, collect potential conjugate pairs
for (PoleZero z : s.getPolesZeros().getZero()) {
double realValue = z.getReal().getValue();
double imaginaryValue = z.getImaginary().getValue();
if (imaginaryValue == 0.) {
continue;
}
if (!conjugatePairMap.containsKey(z.getReal().getValue())) {
conjugatePairMap.put(realValue, new HashSet<>());
}
conjugatePairMap.get(realValue).add(imaginaryValue);
}
// now, check existence of conjugate pairs
for (Double key : conjugatePairMap.keySet()) {
Set<Double> pairs = conjugatePairMap.get(key);
for (Double imaginaryValue : pairs) {
Double conjugate = -1 * imaginaryValue;
if (!pairs.contains(conjugate)){
// stage 2 zero with real term -2.31400 and nonzero imaginary term -3.17000 has no conjugate pair
return Result.error("stage " + s.getNumber() + " zero with real term " +
df.format(key) + " and nonzero imaginary term " +
df.format(imaginaryValue) + " has no conjugate pair");
}
}
}
}
if (s.getPolesZeros().getPole() != null) {
Map<Double, Set<Double>> conjugatePairMap = new ConcurrentHashMap<>();
// first, collect potential conjugate pairs
for (PoleZero p : s.getPolesZeros().getPole()) {
double realValue = p.getReal().getValue();
double imaginaryValue = p.getImaginary().getValue();
if (imaginaryValue == 0.) {
continue;
}
if (!conjugatePairMap.containsKey(p.getReal().getValue())) {
conjugatePairMap.put(realValue, new HashSet<>());
}
conjugatePairMap.get(realValue).add(imaginaryValue);
}
// now, check existence of conjugate pairs
for (Double key : conjugatePairMap.keySet()) {
Set<Double> pairs = conjugatePairMap.get(key);
for (Double imaginaryValue : pairs) {
Double conjugate = -1 * imaginaryValue;
if (!pairs.contains(conjugate)){
// stage 2 pole with real term -2.31400 and nonzero imaginary term -3.17000 has no conjugate pair
return Result.error("stage " + s.getNumber() + " pole with real term " +
df.format(key) + " and nonzero imaginary term " +
df.format(imaginaryValue) + " has no conjugate pair");
}
}
}
}
}
stage++;
}

}

return Result.success();
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,73 @@
package edu.iris.dmc.station.conditions;

import edu.iris.dmc.DocumentMarshaller;
import edu.iris.dmc.fdsn.station.model.Channel;
import edu.iris.dmc.fdsn.station.model.FDSNStationXML;
import edu.iris.dmc.fdsn.station.model.Network;
import edu.iris.dmc.fdsn.station.model.Response;
import edu.iris.dmc.station.RuleEngineServiceTest;
import edu.iris.dmc.station.restrictions.ChannelCodeRestriction;
import edu.iris.dmc.station.restrictions.ChannelTypeRestriction;
import edu.iris.dmc.station.restrictions.Restriction;
import edu.iris.dmc.station.rules.Message;
import edu.iris.dmc.station.rules.Success;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;

import java.io.IOException;
import java.io.InputStream;

public class Condition417Test {

private FDSNStationXML theDocument;

@Before
public void init() throws Exception {

}

@Test
public void fail() throws Exception {
// dummy file with zero value with unmatched imaginary value
try (InputStream is = RuleEngineServiceTest.class.getClassLoader().getResourceAsStream("F1_417.xml")) {
theDocument = DocumentMarshaller.unmarshal(is);

Network iu = theDocument.getNetwork().get(0);
Channel bhz00 = iu.getStations().get(0).getChannels().get(0);

Restriction[] restrictions = new Restriction[] { new ChannelCodeRestriction(),
new ChannelTypeRestriction() };

ComplexConjugateCondition condition = new ComplexConjugateCondition(true, "", restrictions);

Response response = bhz00.getResponse();
Message result = condition.evaluate(bhz00, response);
Assert.assertTrue(result instanceof edu.iris.dmc.station.rules.Error);
}catch(IOException e){
e.printStackTrace();
}

}

@Test
public void pass() throws Exception {
// this file includes complex conjugate values and should pass examination
try (InputStream is = RuleEngineServiceTest.class.getClassLoader().getResourceAsStream("AUMCQBHZ_stageNOSEQUENCE.xml")) {
theDocument = DocumentMarshaller.unmarshal(is);

Network iu = theDocument.getNetwork().get(0);
Channel bhz00 = iu.getStations().get(0).getChannels().get(0);

Restriction[] restrictions = new Restriction[] { new ChannelCodeRestriction(),
new ChannelTypeRestriction() };

ComplexConjugateCondition condition = new ComplexConjugateCondition(true, "", restrictions);
Response response = bhz00.getResponse();
Message result = condition.evaluate(bhz00, response);
System.out.println(result);
Assert.assertTrue(result instanceof Success);
}

}
}
Loading