diff --git a/docs/bandcode.md b/docs/bandcode.md new file mode 100644 index 0000000..ca9e899 --- /dev/null +++ b/docs/bandcode.md @@ -0,0 +1,27 @@ +# Frequency Band Channel Code Guidelines + +The first letter specifies the general sampling rate and the response band of the instrument. (The “A” code is reserved for +administrative functions such as miscellaneous state of health.) + +|Band Code |Band Type |Sample Rate (Hz) |Corner Period (Sec) | +|---|---|---|---| +|F |... | $\geq$ 1000 to $\lt$ 5000|$\geq$ 10 sec| +|G |... | $\geq$ 1000 to $\lt$ 5000|$\lt$ 10 sec| +|D |... | $\geq$ 250 to $\lt$ 1000|$\lt$ 10 sec| +|C |... | $\geq$ 250 to $\lt$ 1000|$\geq$ 10 sec| +|E |Extremely Short Period|$\geq$ 80 to $\lt$ 250|$\lt$ 10 sec| +|S |Short Period |$\geq$ 10 to $\lt$ 80|$\lt$ 10 sec| +|H |High Broad Band |$\geq$ 80 to $\lt$ 250|$\geq$ 10 sec| +|B |Broad Band |$\geq$ 10 to $\lt$ 80|$\geq$ 10 sec| +|M |Mid Period |$\geq$ 1 to $\lt$ 10 | | +|L |Long Period |$\geq$ 0.1 to $\lt$ 10| | +|V |Very Long Period |$\geq$ 0.01 to $\lt$ 1| | +|U |Ultra Long Period |$\geq$ 0.001 to $\lt$ 0.1| | +|R |Extremely Long Period |$\geq$ 0.0001 to $\lt$ 0.001| | +|P |On the order of 0.1 to 1 day|$\geq$ 0.00001 to $\lt$ 0.0001| | +|T |On the order of 1 to 10 days|$\geq$ 0.000001 to $\lt$ 0.00001| | +|Q |Greater than 10 days| $\lt$ 0.000001 | | +|A |Administrative Instrument Channel|variable| NA | +|O |Opaque Instrument Channel|variable| NA| + +[Updated 09-2020] diff --git a/docs/index.md b/docs/index.md index ab2bbb3..157f9d0 100644 --- a/docs/index.md +++ b/docs/index.md @@ -6,6 +6,7 @@ The IRIS stationxml-validator is a Java library and related command-line utility * [Validation tests](tests.md) * [Unit name overview for IRIS stationxml-validator](units.md) * [Rule restrictions](restrictions.md) +* [Band Code Dictionary](bandcode.md) * [Channel:Code orthogonal orientation guidelines](orientation.md) * [Contributing to the StationXML Validator](contribution.md) @@ -21,6 +22,7 @@ If you wish to compile the program, the source code is available. Follow the [in ## Using the Validator + The Validator's jar runs in both [Java](https://www.java.com/) 8 or 11 enviroments. A usage message will be printed if the stationxml-validator is run with no arguments are supplied: java -jar stationxml-validator-1.7.0.jar diff --git a/docs/tests.md b/docs/tests.md index b1172bb..79933f8 100644 --- a/docs/tests.md +++ b/docs/tests.md @@ -66,9 +66,10 @@ DICTIONARY: External reference, such as the units name list | | **`Channel Time Errors`** |||| | 310 | Channel:startDate must be included and must occur before Channel:endDate if included.
Channel:startDate must be **INCLUDED AND** < Channel:endDate **IF INCLUDED**
|Error||[F1_310](https://github.com/iris-edu/StationXML-Validator/blob/master/src/test/resources/F1_310.xml), [F2_310](https://github.com/iris-edu/StationXML-Validator/blob/master/src/test/resources/F2_310.xml)|[PASS](https://github.com/iris-edu/StationXML-Validator/blob/master/src/test/resources/Validator_Pass.xml)| | 320 | If Channel:Code[2]==(H | L | M | N) THEN Channel:Azimuth and Channel:Dip must be included. |Error|[C1](https://github.com/iris-edu/StationXML-Validator/wiki/Restrictions#channel), [C2](https://github.com/iris-edu/StationXML-Validator/wiki/Restrictions#channel)| [F1_320](https://github.com/iris-edu/StationXML-Validator/blob/master/src/test/resources/F1_320.xml)|[PASS](https://github.com/iris-edu/StationXML-Validator/blob/master/src/test/resources/Validator_Pass.xml)| -| 321 |If Channel:Code[2] == (H | L | M | N) then Stage[1]:InputUnit must equal *m/s* AND Stage[Last]:OutputUnits must equal count*|WARNING|[C1](https://github.com/iris-edu/StationXML-Validator/wiki/Restrictions#channel), [C2](https://github.com/iris-edu/StationXML-Validator/wiki/Restrictions#channel)| [F1_321](https://github.com/iris-edu/StationXML-Validator/blob/master/src/test/resources/F1_320.xml)|[PASS](https://github.com/iris-edu/StationXML-Validator/blob/master/src/test/resources/Validator_Pass.xml)| +| 321 |If Channel:Code[2] == (H | L | M | N) then Stage[1]:InputUnit must equal *m/s* AND Stage[Last]:OutputUnits must equal count*|WARNING|[C1](https://github.com/iris-edu/StationXML-Validator/wiki/Restrictions#channel), [C2](https://github.com/iris-edu/StationXML-Validator/wiki/Restrictions#channel)| [F1_321](https://github.com/iris-edu/StationXML-Validator/blob/master/src/test/resources/F1_321.xml)|[PASS](https://github.com/iris-edu/StationXML-Validator/blob/master/src/test/resources/Validator_Pass.xml)| |||||| | | **`Channel Orientation Errors`** |||| +| 330 |Channel:SampleRate must be assigned a float that inclusively correspounds to Channel:Code[1], which is outlined by the Band Code dictionary|WARNING|[C1](https://github.com/iris-edu/StationXML-Validator/wiki/Restrictions#channel), [C2](https://github.com/iris-edu/StationXML-Validator/wiki/Restrictions#channel)| [F1_321](https://github.com/iris-edu/StationXML-Validator/blob/master/src/test/resources/F1_330.xml)|[PASS](https://github.com/iris-edu/StationXML-Validator/blob/master/src/test/resources/Validator_Pass.xml)| | 332 |If Channel:Code[LAST]==N then Channel:Azimuth must be assigned (>=355.0 or <=5.0) or (>=175.0 and <=185.0) and Channel:Dip must be assigned (>=-5 AND <=5.0). |Warning|[C1](https://github.com/iris-edu/StationXML-Validator/wiki/Restrictions#channel), [C2](https://github.com/iris-edu/StationXML-Validator/wiki/Restrictions#channel)|[F1_332](https://github.com/iris-edu/StationXML-Validator/blob/master/src/test/resources/F1_332.xml)|[PASS](https://github.com/iris-edu/StationXML-Validator/blob/master/src/test/resources/Validator_Pass.xml), [P1_332](https://github.com/iris-edu/StationXML-Validator/blob/master/src/test/resources/P1_332.xml), [P2_332](https://github.com/iris-edu/StationXML-Validator/blob/master/src/test/resources/P2_332.xml), [P3_332](https://github.com/iris-edu/StationXML-Validator/blob/master/src/test/resources/P3_332.xml), [P4_332](https://github.com/iris-edu/StationXML-Validator/blob/master/src/test/resources/P4_332.xml)| | 333 |If Channel:Code[LAST]==E then Channel:Azimuth must be assigned (>=85.0 and <=95.0) or (>=265.0 and <=275.0) and Channel:Dip must be ASSIGNED (>=-5.0 and <=5.0). |Warning|[C1](https://github.com/iris-edu/StationXML-Validator/wiki/Restrictions#channel), [C2](https://github.com/iris-edu/StationXML-Validator/wiki/Restrictions#channel)|[F1_333](https://github.com/iris-edu/StationXML-Validator/blob/master/src/test/resources/F1_333.xml)|[PASS](https://github.com/iris-edu/StationXML-Validator/blob/master/src/test/resources/Validator_Pass.xml), [P1_332](https://github.com/iris-edu/StationXML-Validator/blob/master/src/test/resources/P1_332.xml), [P2_332](https://github.com/iris-edu/StationXML-Validator/blob/master/src/test/resources/P2_332.xml), [P3_332](https://github.com/iris-edu/StationXML-Validator/blob/master/src/test/resources/P3_332.xml), [P4_332](https://github.com/iris-edu/StationXML-Validator/blob/master/src/test/resources/P4_332.xml)| | 334 |If Channel:Code[LAST]==Z then Channel:Azimuth must be assigned (>=355.0 or <=5.0) and Channel:Dip must be assigned (>=-85.0 and <=-90.0) or (>=85.0 and <=90.0). |Warning|[C1](https://github.com/iris-edu/StationXML-Validator/wiki/Restrictions#channel), [C2](https://github.com/iris-edu/StationXML-Validator/wiki/Restrictions#channel)|[F1_334](https://github.com/iris-edu/StationXML-Validator/blob/master/src/test/resources/F1_334.xml)|[PASS](https://github.com/iris-edu/StationXML-Validator/blob/master/src/test/resources/Validator_Pass.xml), [P1_332](https://github.com/iris-edu/StationXML-Validator/blob/master/src/test/resources/P1_332.xml), [P2_332](https://github.com/iris-edu/StationXML-Validator/blob/master/src/test/resources/P2_332.xml), [P3_332](https://github.com/iris-edu/StationXML-Validator/blob/master/src/test/resources/P3_332.xml), [P4_332](https://github.com/iris-edu/StationXML-Validator/blob/master/src/test/resources/P4_332.xml)| diff --git a/src/main/java/edu/iris/dmc/station/RuleEngineRegistry.java b/src/main/java/edu/iris/dmc/station/RuleEngineRegistry.java index 388a844..4b0c173 100644 --- a/src/main/java/edu/iris/dmc/station/RuleEngineRegistry.java +++ b/src/main/java/edu/iris/dmc/station/RuleEngineRegistry.java @@ -13,6 +13,7 @@ import edu.iris.dmc.fdsn.station.model.Response; import edu.iris.dmc.fdsn.station.model.Station; import edu.iris.dmc.station.conditions.AzimuthDipCondition; +import edu.iris.dmc.station.conditions.BandCodeCondition; import edu.iris.dmc.station.conditions.CalibrationUnitCondition; import edu.iris.dmc.station.conditions.CodeCondition; import edu.iris.dmc.station.conditions.Condition; @@ -186,6 +187,12 @@ private void defaultChannelRules(Set set) { new Restriction[] { new ChannelCodeRestriction(), new ChannelTypeRestriction() }), Channel.class); } + if (!set.contains(330)) { + add(330, new BandCodeCondition(true, + "Channel:SampleRate must be assigned a float that inclusively correspounds to Channel:Code[1], which is outlined by the Band Code dictionary", + new Restriction[] { new ChannelCodeRestriction(), new ChannelTypeRestriction() }), + Channel.class); + } if (!set.contains(332)) { add(332, new OrientationCondition(true, "If Channel:Code[LAST]==N then Channel:Azimuth must be assigned (>=355.0 or <=5.0) or (>=175.0 and <=185.0) and Channel:Dip must be assigned (>=-5 AND <=5.0).", diff --git a/src/main/java/edu/iris/dmc/station/conditions/BandCodeCondition.java b/src/main/java/edu/iris/dmc/station/conditions/BandCodeCondition.java new file mode 100644 index 0000000..ca7d4b1 --- /dev/null +++ b/src/main/java/edu/iris/dmc/station/conditions/BandCodeCondition.java @@ -0,0 +1,180 @@ +package edu.iris.dmc.station.conditions; + +import edu.iris.dmc.fdsn.station.model.Channel; +import edu.iris.dmc.fdsn.station.model.Network; +import edu.iris.dmc.fdsn.station.model.ResponseStage; +import edu.iris.dmc.fdsn.station.model.SampleRate; +import edu.iris.dmc.fdsn.station.model.Station; +import edu.iris.dmc.station.exceptions.StationxmlException; +import edu.iris.dmc.station.restrictions.Restriction; +import edu.iris.dmc.station.rules.Message; +import edu.iris.dmc.station.rules.NestedMessage; +import edu.iris.dmc.station.rules.Result; + +public class BandCodeCondition extends AbstractCondition { + private Restriction[] restrictions; + + public BandCodeCondition(boolean required, String description, Restriction[] restrictions) { + super(required, description); + this.restrictions = restrictions; + } + + @Override + public Message evaluate(Network network) { + throw new IllegalArgumentException("Not supported!"); + } + + @Override + public Message evaluate(Station station) { + throw new IllegalArgumentException("Not supported!"); + } + + @Override + public Message evaluate(Channel channel) { + NestedMessage nestedMessage = new NestedMessage(); + boolean returnmessage = false; + String inputUnit =""; + String code = channel.getCode(); + try { + if(channel.getResponse().getStage().size()==0) { + throw new StationxmlException("Response is missing from input StationXML"); + } + for (Restriction r : this.restrictions) + if (r.qualifies(channel)) { + return Result.success(); + } + + Double samplerate = channel.getSampleRate().getValue(); + String bandcode = Character.toString(code.charAt(0)); + bandcode=bandcode.toUpperCase(); + switch (bandcode){ + case "F": + if(samplerate < 1000 || samplerate >= 5000) { + nestedMessage.add(Result.warning("Frequency Band " + bandcode +" must have a sample rate assigned between >= 1000 and < 5000")); + returnmessage = true; + break; + } + break; + case "G": + if(samplerate < 1000 || samplerate >= 5000) { + nestedMessage.add(Result.warning("Frequency Band " + bandcode +" must have a sample rate assigned between >= 1000 and < 5000")); + returnmessage = true; + break; + } + break; + case "D": + if(samplerate < 250 || samplerate >= 1000) { + nestedMessage.add(Result.warning("Frequency Band " + bandcode +" must have a sample rate assigned between >= 250 and < 1000")); + returnmessage = true; + break; + } + break; + case "C": + if(samplerate < 250 || samplerate >= 1000) { + nestedMessage.add(Result.warning("Frequency Band " + bandcode +" must have a sample rate assigned between >= 250 and < 1000")); + returnmessage = true; + break; + } + break; + case "E": + if(samplerate < 80 || samplerate >= 250) { + nestedMessage.add(Result.warning("Frequency Band " + bandcode +" must have a sample rate assigned between >= 80 and < 250")); + returnmessage = true; + break; + } + break; + case "H": + if(samplerate < 80 || samplerate >= 250) { + nestedMessage.add(Result.warning("Frequency Band " + bandcode +" must have a sample rate assigned between >= 80 and < 250")); + returnmessage = true; + break; + } + break; + case "S": + if(samplerate < 10.0 || samplerate >= 80.0) { + nestedMessage.add(Result.warning("Frequency Band " + bandcode +" must have a sample rate assigned between >= 10 and < 80")); + returnmessage = true; + break; + } + break; + case "B": + if(samplerate < 10.0 || samplerate >= 80.0) { + nestedMessage.add(Result.warning("Frequency Band " + bandcode +" must have a sample rate assigned between >= 10 and < 80")); + returnmessage = true; + break; + } + break; + case "M": + if(samplerate < 1 || samplerate >= 10) { + nestedMessage.add(Result.warning("Frequency Band " + bandcode +" must have a sample rate assigned between >= 1 and < 10")); + returnmessage = true; + break; + } + break; + case "L": + if(samplerate < 0.1 || samplerate >= 10) { + nestedMessage.add(Result.warning("Frequency Band " + bandcode +" must have a sample rate assigned between >= 0.1 and < 10")); + returnmessage = true; + break; + } + break; + case "V": + if(samplerate < 0.01 || samplerate >= 1) { + nestedMessage.add(Result.warning("Frequency Band " + bandcode +" must have a sample rate assigned between >= 0.01 and < 1")); + returnmessage = true; + break; + } + break; + case "U": + if(samplerate < 0.001 || samplerate >= 0.1) { + nestedMessage.add(Result.warning("Frequency Band " + bandcode +" must have a sample rate assigned between >= 0.001 and < 0.1")); + returnmessage = true; + break; + } + break; + case "R": + if(samplerate < 0.0001 || samplerate >= 0.001) { + nestedMessage.add(Result.warning("Frequency Band " + bandcode +" must have a sample rate assigned between >= 0.0001 and < 0.001")); + returnmessage = true; + break; + } + break; + case "P": + if(samplerate < 0.00001 || samplerate >= 0.0001) { + nestedMessage.add(Result.warning("Frequency Band " + bandcode +" must have a sample rate assigned between >= 0.00001 and < 0.0001")); + returnmessage = true; + break; + } + break; + case "T": + if(samplerate < 0.000001 || samplerate >= 0.00001) { + nestedMessage.add(Result.warning("Frequency Band " + bandcode +" must have a sample rate assigned between >= 0.000001 and < 0.00001")); + returnmessage = true; + break; + } + break; + case "Q": + if(samplerate >= 0.000001) { + nestedMessage.add(Result.warning("Frequency Band " + bandcode +" must have a sample rate assigned < 0.000001")); + returnmessage = true; + break; + } + break; + default: + break; + + } + } + catch(Exception e) { + + } + if(returnmessage==true) { + return nestedMessage; + }else { + return Result.success(); + } + } + +} + + diff --git a/src/main/java/edu/iris/dmc/station/conditions/DecimationAnalogFilterCondition.java b/src/main/java/edu/iris/dmc/station/conditions/DecimationAnalogFilterCondition.java index 4986ebc..9aa39a7 100644 --- a/src/main/java/edu/iris/dmc/station/conditions/DecimationAnalogFilterCondition.java +++ b/src/main/java/edu/iris/dmc/station/conditions/DecimationAnalogFilterCondition.java @@ -58,56 +58,56 @@ public Message evaluate(Channel channel, Response response) { if (stage.getPolesZeros()!=null && stage.getPolesZeros().getPzTransferFunctionType().equalsIgnoreCase("LAPLACE (RADIANS/SECOND)")) { if (stage.getDecimation()!= null) { if (stage.getNumber().intValue() < 10 ) { - nestedMessage.add(Result.error("Stage [" + String.format("%02d", stage.getNumber().intValue()) + "]" + nestedMessage.add(Result.error("Stage[" + String.format("%02d", stage.getNumber().intValue()) + "]" + " includes PolesZeros:PzTransferFunctionType:LAPLACE (RADIANS/SECOND)" - + " so decimation must not be included in stage [" +String.format("%02d", stage.getNumber().intValue()) + "].")); + + " so decimation must not be included in Stage[" +String.format("%02d", stage.getNumber().intValue()) + "].")); returnmessage=true; }else { - nestedMessage.add(Result.error("Stage [" + stage.getNumber().intValue() + "]" + nestedMessage.add(Result.error("Stage[" + stage.getNumber().intValue() + "]" + " includes PolesZeros:PzTransferFunctionType:LAPLACE (RADIANS/SECOND)" - + " so decimation must not be included in stage [" + stage.getNumber().intValue() + "].")); + + " so decimation must not be included in Stage[" + stage.getNumber().intValue() + "].")); returnmessage=true; } } }else if (stage.getPolesZeros()!=null && stage.getPolesZeros().getPzTransferFunctionType().equalsIgnoreCase("LAPLACE (HERTZ)")) { if (stage.getDecimation()!= null) { if (stage.getNumber().intValue() < 10 ) { - nestedMessage.add(Result.error("Stage [" + String.format("%02d", stage.getNumber().intValue()) + "]" + nestedMessage.add(Result.error("Stage[" + String.format("%02d", stage.getNumber().intValue()) + "]" + " includes PolesZeros:PzTransferFunctionType:LAPLACE (HERTZ)" - + " so decimation must not be included in stage [" + String.format("%02d", stage.getNumber().intValue()) + "].")); + + " so decimation must not be included in Stage[" + String.format("%02d", stage.getNumber().intValue()) + "].")); returnmessage=true; }else { - nestedMessage.add(Result.error("Stage [" + stage.getNumber().intValue() + "]" + nestedMessage.add(Result.error("Stage[" + stage.getNumber().intValue() + "]" + " includes PolesZeros:PzTransferFunctionType:LAPLACE (HERTZ)" - + " so decimation must not be included in stage [" + stage.getNumber().intValue() + "].")); + + " so decimation must not be included in Stage[" + stage.getNumber().intValue() + "].")); returnmessage=true; } } }else if (stage.getCoefficients() !=null && stage.getCoefficients().getCfTransferFunctionType().equalsIgnoreCase("ANALOG (RADIANS/SECOND)")) { if (stage.getDecimation()!= null) { if (stage.getNumber().intValue() < 10 ) { - nestedMessage.add(Result.error("Stage [" + String.format("%02d", stage.getNumber().intValue()) + "]" + nestedMessage.add(Result.error("Stage[" + String.format("%02d", stage.getNumber().intValue()) + "]" + " includes CoefficientsType:CfTransferFunctionType:ANALOG (RADIANS/SECOND)" - + " so decimation must not be included in stage [" + String.format("%02d", stage.getNumber().intValue()) + "].")); + + " so decimation must not be included in Stage[" + String.format("%02d", stage.getNumber().intValue()) + "].")); returnmessage=true; }else { - nestedMessage.add(Result.error("Stage [" + stage.getNumber().intValue() + "]" + nestedMessage.add(Result.error("Stage[" + stage.getNumber().intValue() + "]" + " includes PolesZeros:PzTransferFunctionType:ANALOG (RADIANS/SECOND)" - + " so decimation must not be included in stage [" + stage.getNumber().intValue() + "].")); + + " so decimation must not be included in Stage[" + stage.getNumber().intValue() + "].")); returnmessage=true; } } }else if (stage.getCoefficients() !=null && stage.getCoefficients().getCfTransferFunctionType().equalsIgnoreCase("ANALOG (HERTZ)")) { if (stage.getDecimation()!= null) { if (stage.getNumber().intValue() < 10 ) { - nestedMessage.add(Result.error("Stage [" + String.format("%02d", stage.getNumber().intValue()) + "]" + nestedMessage.add(Result.error("Stage[" + String.format("%02d", stage.getNumber().intValue()) + "]" + " includes CoefficientsType:CfTransferFunctionType:ANALOG (HERTZ)" - + " so decimation must not be included in stage [" + String.format("%02d", stage.getNumber().intValue()) + "].")); + + " so decimation must not be included in Stage[" + String.format("%02d", stage.getNumber().intValue()) + "].")); returnmessage=true; }else { - nestedMessage.add(Result.error("Stage [" + stage.getNumber().intValue() + "]" + nestedMessage.add(Result.error("Stage[" + stage.getNumber().intValue() + "]" + " includes CoefficientsType:CfTransferFunctionType:ANALOG (HERTZ)" - + " so decimation must not be included in stage [" + stage.getNumber().intValue() + "].")); + + " so decimation must not be included in Stage[" + stage.getNumber().intValue() + "].")); returnmessage=true; } } diff --git a/src/main/java/edu/iris/dmc/station/conditions/DecimationCondition.java b/src/main/java/edu/iris/dmc/station/conditions/DecimationCondition.java index 9b919e9..eefe10c 100644 --- a/src/main/java/edu/iris/dmc/station/conditions/DecimationCondition.java +++ b/src/main/java/edu/iris/dmc/station/conditions/DecimationCondition.java @@ -61,11 +61,11 @@ public Message evaluate(Channel channel, Response response) { Frequency sampleRate = decimation.getInputSampleRate(); if(sampleRate==null) { if (stage.getNumber().intValue() < 10 ) { - nestedMessage.add(Result.error("[stage " + String.format("%02d", stage.getNumber().intValue()) + nestedMessage.add(Result.error("Stage[" + String.format("%02d", stage.getNumber().intValue()) + "] must include Decimation:Samplerate")); returnmessage =true; }else { - nestedMessage.add(Result.error("[stage " + stage.getNumber().intValue() + nestedMessage.add(Result.error("Stage[" + stage.getNumber().intValue() + "] must include Decimation:Samplerate")); returnmessage =true; } @@ -75,13 +75,13 @@ public Message evaluate(Channel channel, Response response) { if (inputSampleRateByFactor != null) { if (Math.abs(inputSampleRate - inputSampleRateByFactor.doubleValue()) > 0.001) { if (stage.getNumber().intValue() < 10 ) { - nestedMessage.add(Result.error("[stage " + String.format("%02d", stage.getNumber().intValue()) - + "] Decimation:InputSampleRate "+ inputSampleRate +" != [stage "+ String.format("%02d", (stage.getNumber().intValue()-1)) + nestedMessage.add(Result.error("Stage[" + String.format("%02d", stage.getNumber().intValue()) + + "] Decimation:InputSampleRate "+ inputSampleRate +" != Stage["+ String.format("%02d", (stage.getNumber().intValue()-1)) + "] Decimation:InputSampleRate/Decimation:Factor "+inputSampleRateByFactor.doubleValue())); returnmessage =true; }else { - nestedMessage.add(Result.error("[stage " + stage.getNumber().intValue() - + "] Decimation:InputSampleRate "+ inputSampleRate +" != [stage "+ (stage.getNumber().intValue()-1) + nestedMessage.add(Result.error("Stage[" + stage.getNumber().intValue() + + "] Decimation:InputSampleRate "+ inputSampleRate +" != Stage["+ (stage.getNumber().intValue()-1) + "] Decimation:InputSampleRate/Decimation:Factor "+inputSampleRateByFactor.doubleValue())); returnmessage =true; } diff --git a/src/main/java/edu/iris/dmc/station/conditions/DecimationSampleRateCondition.java b/src/main/java/edu/iris/dmc/station/conditions/DecimationSampleRateCondition.java index 2ec209e..57c8937 100644 --- a/src/main/java/edu/iris/dmc/station/conditions/DecimationSampleRateCondition.java +++ b/src/main/java/edu/iris/dmc/station/conditions/DecimationSampleRateCondition.java @@ -65,10 +65,10 @@ public Message evaluate(Channel channel, Response response) { if (frequence == null) { if (stageindex < 10 ) { - return Result.error("[stage " + String.format("%02d", stageindex) + + return Result.error("Stage[" + String.format("%02d", stageindex) + "] Decimation:Frequency must not be null"); }else { - return Result.error("[stage " + stageindex + + return Result.error("Stage[" + stageindex + "] Decimation:Frequency must not be null"); } @@ -76,11 +76,11 @@ public Message evaluate(Channel channel, Response response) { } if (Math.abs(sampleRate.getValue() - (frequence.getValue() / factor.doubleValue())) > 0.0001) { if (stageindex < 10 ) { - return Result.error("Chan:Samplerate "+sampleRate.getValue() + " != [stage " + return Result.error("Chan:Samplerate "+sampleRate.getValue() + " != Stage[" + String.format("%02d", stageindex) + "] Decimation:Frequency/Decimation:Factor " + (frequence.getValue() / factor.doubleValue())); }else { - return Result.error("Channel:Samplerate: "+sampleRate.getValue() + " != [stage " + return Result.error("Channel:Samplerate: "+sampleRate.getValue() + " != Stage[" + stageindex + "] Decimation:Frequency/Decimation:Factor " + (frequence.getValue() / factor.doubleValue())); } diff --git a/src/main/java/edu/iris/dmc/station/conditions/DecimationStageGainCondition.java b/src/main/java/edu/iris/dmc/station/conditions/DecimationStageGainCondition.java index 6e4a1e2..c308270 100644 --- a/src/main/java/edu/iris/dmc/station/conditions/DecimationStageGainCondition.java +++ b/src/main/java/edu/iris/dmc/station/conditions/DecimationStageGainCondition.java @@ -55,11 +55,11 @@ public Message evaluate(Channel channel, Response response) { if (s.getDecimation() != null && s.getStageGain() != null) { if (s.getCoefficients() == null && s.getPolesZeros() == null && s.getFIR()==null && s.getResponseList()==null) { if (s.getNumber().intValue() < 10 ) { - nestedMessage.add(Result.error("[stage " + String.format("%02d", s.getNumber().intValue()) + nestedMessage.add(Result.error("Stage[" + String.format("%02d", s.getNumber().intValue()) + "] includes Decimation and StageGain but does not include a filter")); returnmessage =true; }else { - nestedMessage.add(Result.error("[stage " + s.getNumber().intValue() + nestedMessage.add(Result.error("Stage[" + s.getNumber().intValue() + "] includes Decimation and StageGain but does not include a filter")); returnmessage =true; } diff --git a/src/main/java/edu/iris/dmc/station/conditions/DecimationStageUnitCondition.java b/src/main/java/edu/iris/dmc/station/conditions/DecimationStageUnitCondition.java index 1d8e09e..58b13ec 100644 --- a/src/main/java/edu/iris/dmc/station/conditions/DecimationStageUnitCondition.java +++ b/src/main/java/edu/iris/dmc/station/conditions/DecimationStageUnitCondition.java @@ -81,12 +81,12 @@ public Message evaluate(Channel channel, Response response) { continue; }else { if (stage.getNumber().intValue() < 10 ) { - nestedMessage.add(Result.error("Stage [" + String.format("%02d", stage.getNumber().intValue()) + "] output unit " + nestedMessage.add(Result.error("Stage[" + String.format("%02d", stage.getNumber().intValue()) + "] output unit " + stageUnit.output.getName() + " must be count(s) because Stage[" + String.format("%02d",stage.getNumber().intValue()) + "].Decimation is included")); returnmessage=true; }else { - nestedMessage.add(Result.error("Stage [" + stage.getNumber().intValue() + "] output unit " + nestedMessage.add(Result.error("Stage[" + stage.getNumber().intValue() + "] output unit " + stageUnit.output.getName() + " must be count(s) because Stage[" + stage.getNumber().intValue() + "].Decimation is included")); returnmessage=true; diff --git a/src/main/java/edu/iris/dmc/station/conditions/DigitalFilterCondition.java b/src/main/java/edu/iris/dmc/station/conditions/DigitalFilterCondition.java index 01ab0d5..0ba91ae 100644 --- a/src/main/java/edu/iris/dmc/station/conditions/DigitalFilterCondition.java +++ b/src/main/java/edu/iris/dmc/station/conditions/DigitalFilterCondition.java @@ -55,11 +55,11 @@ public Message evaluate(Channel channel, Response response) { if (s.getCoefficients() != null && "DIGITAL".equals(s.getCoefficients().getCfTransferFunctionType())) { if (s.getDecimation() == null || s.getStageGain() == null) { if (s.getNumber().intValue() < 10 ) { - nestedMessage.add(Result.error("[stage " + String.format("%02d", s.getNumber().intValue()) + nestedMessage.add(Result.error("Stage[" + String.format("%02d", s.getNumber().intValue()) + "] must include StageGain and Decimation")); returnmessage =true; }else { - nestedMessage.add(Result.error("[stage " + s.getNumber().intValue() + nestedMessage.add(Result.error("Stage[" + s.getNumber().intValue() + "] must include StageGain and Decimation")); returnmessage =true; } @@ -70,11 +70,11 @@ public Message evaluate(Channel channel, Response response) { && "DIGITAL (Z-TRANSFORM)".equals(s.getPolesZeros().getPzTransferFunctionType())) { if (s.getDecimation() == null || s.getStageGain() == null) { if (s.getNumber().intValue() < 10 ) { - nestedMessage.add(Result.error("[stage " + String.format("%02d", s.getNumber().intValue()) + nestedMessage.add(Result.error("Stage[" + String.format("%02d", s.getNumber().intValue()) + "] must include StageGain and Decimation")); returnmessage =true; }else { - nestedMessage.add(Result.error("[stage " + s.getNumber().intValue() + nestedMessage.add(Result.error("Stage[" + s.getNumber().intValue() + "] must include StageGain and Decimation")); returnmessage =true; } @@ -85,11 +85,11 @@ public Message evaluate(Channel channel, Response response) { if (s.getDecimation() == null || s.getStageGain() == null) { nestedMessage.add(Result.error("Gain and|or decimation are missing")); if (s.getNumber().intValue() < 10 ) { - nestedMessage.add(Result.error("[stage " + String.format("%02d", s.getNumber().intValue()) + nestedMessage.add(Result.error("Stage[" + String.format("%02d", s.getNumber().intValue()) + "] must include StageGain and Decimation")); returnmessage =true; }else { - nestedMessage.add(Result.error("[stage " + s.getNumber().intValue() + nestedMessage.add(Result.error("Stage[" + s.getNumber().intValue() + "] must include StageGain and Decimation")); returnmessage =true; } diff --git a/src/main/java/edu/iris/dmc/station/conditions/LastStageUnitCondition.java b/src/main/java/edu/iris/dmc/station/conditions/LastStageUnitCondition.java index 6a90795..8b808fe 100644 --- a/src/main/java/edu/iris/dmc/station/conditions/LastStageUnitCondition.java +++ b/src/main/java/edu/iris/dmc/station/conditions/LastStageUnitCondition.java @@ -66,10 +66,10 @@ public Message evaluate(Channel channel, Response response) { if(stage.getNumber().intValue() == lastStage) { if (stage.getNumber().intValue() < 10 ) { - return Result.error("Stage [" + String.format("%02d", stage.getNumber().intValue()) + "] output unit " + return Result.error("Stage[" + String.format("%02d", stage.getNumber().intValue()) + "] output unit " + " must not be null"); }else { - return Result.error("Stage [" + stage.getNumber().intValue() + "] output unit " + return Result.error("Stage[" + stage.getNumber().intValue() + "] output unit " + " must not be null"); } }else { @@ -82,11 +82,11 @@ public Message evaluate(Channel channel, Response response) { continue; }else { if (stage.getNumber().intValue() < 10 ) { - return Result.error("Stage [" + String.format("%02d", stage.getNumber().intValue()) + "] output unit is " + return Result.error("Stage[" + String.format("%02d", stage.getNumber().intValue()) + "] output unit is " + stageUnit.output.getName() + " but must be count(s)" ); }else { - return Result.error("Stage [" + stage.getNumber().intValue() + "] output unit is " + return Result.error("Stage[" + stage.getNumber().intValue() + "] output unit is " + stageUnit.output.getName() + " but must be count(s)" ); } diff --git a/src/main/java/edu/iris/dmc/station/conditions/PolesZerosCondition.java b/src/main/java/edu/iris/dmc/station/conditions/PolesZerosCondition.java index 1b5d5c0..30707f5 100644 --- a/src/main/java/edu/iris/dmc/station/conditions/PolesZerosCondition.java +++ b/src/main/java/edu/iris/dmc/station/conditions/PolesZerosCondition.java @@ -76,24 +76,24 @@ public Message evaluate(Channel channel, Response response) { if(t) { if (s.getNumber().intValue() < 10 ) { - nestedMessage.add(Result.error("[stage " + String.format("%02d", s.getNumber().intValue()) - + "] Zero:number " + z.getNumber() +" Zero:Real==0 and Zero:Imaginary==0 InstrumentSensitivity:Frequency must not equal 0")); + nestedMessage.add(Result.error("Stage[" + String.format("%02d", s.getNumber().intValue()) + + "] Zero:number[" + z.getNumber() +"] Zero:Real==0 and Zero:Imaginary==0 InstrumentSensitivity:Frequency must not equal 0")); returnmessage =true; }else { - nestedMessage.add(Result.error("[stage " + s.getNumber().intValue() - + "] Zero:number " + z.getNumber() +" Zero:Real==0 and Zero:Imaginary==0 InstrumentSensitivity:Frequency must not equal 0")); + nestedMessage.add(Result.error("Stage[" + s.getNumber().intValue() + + "] Zero:number[" + z.getNumber() +"] Zero:Real==0 and Zero:Imaginary==0 InstrumentSensitivity:Frequency must not equal 0")); returnmessage =true; } }else { if (s.getNumber().intValue() < 10 ) { - nestedMessage.add(Result.error("[stage " + String.format("%02d", s.getNumber().intValue()) - + "] Zero:number " + z.getNumber() +" Zero:Real==0 and Zero:Imaginary==0 StageGain:Frequency must not equal 0")); + nestedMessage.add(Result.error("Stage[" + String.format("%02d", s.getNumber().intValue()) + + "] Zero:number[" + z.getNumber() +"] Zero:Real==0 and Zero:Imaginary==0 StageGain:Frequency must not equal 0")); returnmessage =true; }else { - nestedMessage.add(Result.error("[stage " + s.getNumber().intValue() - + "] Zero:number " + z.getNumber() +" Zero:Real==0 and Zero:Imaginary==0 StageGain:Frequency must not equal 0")); + nestedMessage.add(Result.error("Stage[" + s.getNumber().intValue() + + "] Zero:number[" + z.getNumber() +"] Zero:Real==0 and Zero:Imaginary==0 StageGain:Frequency must not equal 0")); returnmessage =true; } } diff --git a/src/main/java/edu/iris/dmc/station/conditions/PolesZerosSequenceCondition.java b/src/main/java/edu/iris/dmc/station/conditions/PolesZerosSequenceCondition.java index 7a35ecb..d44543f 100644 --- a/src/main/java/edu/iris/dmc/station/conditions/PolesZerosSequenceCondition.java +++ b/src/main/java/edu/iris/dmc/station/conditions/PolesZerosSequenceCondition.java @@ -67,11 +67,11 @@ public Message evaluate(Channel channel, Response response) { for (PoleZero z : s.getPolesZeros().getZero()) { if (z.getNumber().compareTo(BigInteger.valueOf(zeroInc))!=0) { if (s.getNumber().intValue() < 10 ) { - nestedMessage.add(Result.error("[stage " + String.format("%02d", s.getNumber().intValue()) + nestedMessage.add(Result.error("Stage[" + String.format("%02d", s.getNumber().intValue()) + "] Zero:number "+z.getNumber()+ " is out of sequence " +zeroInc+ " is expected")); returnmessage =true; }else { - nestedMessage.add(Result.error("[stage " + s.getNumber().intValue() + nestedMessage.add(Result.error("Stage[" + s.getNumber().intValue() + "] Zero:number "+z.getNumber()+ " is out of sequence "+zeroInc+ " is expected")); returnmessage =true; @@ -85,11 +85,11 @@ public Message evaluate(Channel channel, Response response) { for (PoleZero p : s.getPolesZeros().getPole()) { if (p.getNumber().compareTo(BigInteger.valueOf(poleInc))!=0) { if (s.getNumber().intValue() < 10 ) { - nestedMessage.add(Result.error("[stage " + String.format("%02d", s.getNumber().intValue()) + nestedMessage.add(Result.error("Stage[" + String.format("%02d", s.getNumber().intValue()) + "] Pole:number "+p.getNumber()+ " is out of sequence " +poleInc+ " is expected")); returnmessage =true; }else { - nestedMessage.add(Result.error("[stage " + s.getNumber().intValue() + nestedMessage.add(Result.error("Stage[" + s.getNumber().intValue() + "] Pole:number "+p.getNumber()+ " is out of sequence " +poleInc+ " is expected")); returnmessage =true; } diff --git a/src/main/java/edu/iris/dmc/station/conditions/PolynomialCondition.java b/src/main/java/edu/iris/dmc/station/conditions/PolynomialCondition.java index 448bcfe..2bb956e 100644 --- a/src/main/java/edu/iris/dmc/station/conditions/PolynomialCondition.java +++ b/src/main/java/edu/iris/dmc/station/conditions/PolynomialCondition.java @@ -49,12 +49,12 @@ public Message evaluate(Channel channel, Response response) { for (ResponseStage stage : response.getStage()) { if (stage.getPolynomial() != null) { if (response.getInstrumentPolynomial() == null) { - //Stage [N] polynomial requires that an InstrumentPolynomial be included + //Stage[N] polynomial requires that an InstrumentPolynomial be included if (stage.getNumber().intValue() < 10 ) { - return Result.error("[stage " + String.format("%02d", stage.getNumber().intValue()) + return Result.error("Stage[" + String.format("%02d", stage.getNumber().intValue()) + "] includes a Polynomial so InstrumentPolynomial must be included"); }else { - return Result.error("[stage " + stage.getNumber().intValue() + return Result.error("Stage[" + stage.getNumber().intValue() + "] includes a Polynomial so InstrumentPolynomial must be included"); } } diff --git a/src/main/java/edu/iris/dmc/station/conditions/StageGainNonZeroCondition.java b/src/main/java/edu/iris/dmc/station/conditions/StageGainNonZeroCondition.java index b806baa..22f134d 100644 --- a/src/main/java/edu/iris/dmc/station/conditions/StageGainNonZeroCondition.java +++ b/src/main/java/edu/iris/dmc/station/conditions/StageGainNonZeroCondition.java @@ -54,11 +54,11 @@ public Message evaluate(Channel channel, Response response) { if (stageGain == null) { if (stage.getPolynomial() == null) { if (stage.getNumber().intValue() < 10 ) { - nestedMessage.add(Result.error("[stage " + String.format("%02d", stage.getNumber().intValue()) + nestedMessage.add(Result.error("Stage[" + String.format("%02d", stage.getNumber().intValue()) + "] must include StageGain")); returnmessage =true; }else { - nestedMessage.add(Result.error("[stage " + stage.getNumber().intValue() + nestedMessage.add(Result.error("Stage[" + stage.getNumber().intValue() + "] must include StageGain")); returnmessage =true; } @@ -70,11 +70,11 @@ public Message evaluate(Channel channel, Response response) { } else { if (stage.getPolynomial() == null) { if (stage.getNumber().intValue() < 10 ) { - nestedMessage.add(Result.error("[stage " + String.format("%02d", stage.getNumber().intValue()) + nestedMessage.add(Result.error("Stage[" + String.format("%02d", stage.getNumber().intValue()) + "] StageGain:Value must not be 0")); returnmessage =true; }else { - nestedMessage.add(Result.error("[stage " + stage.getNumber().intValue() + nestedMessage.add(Result.error("Stage[" + stage.getNumber().intValue() + "] StageGain:Value must not be 0")); returnmessage =true; } diff --git a/src/main/java/edu/iris/dmc/station/conditions/StageUnitCondition.java b/src/main/java/edu/iris/dmc/station/conditions/StageUnitCondition.java index 4768b56..dda0bed 100644 --- a/src/main/java/edu/iris/dmc/station/conditions/StageUnitCondition.java +++ b/src/main/java/edu/iris/dmc/station/conditions/StageUnitCondition.java @@ -78,12 +78,12 @@ public Message evaluate(Channel channel, Response response) { } if (stage.getNumber().intValue() < 10 ) { - nestedMessage.add(Result.error("Stage [" + String.format("%02d", stage.getNumber().intValue()) + "] input unit " + stageUnit.input.getName() - + " must equal stage [" + String.format("%02d", prevstage) + "] output unit " + nestedMessage.add(Result.error("Stage[" + String.format("%02d", stage.getNumber().intValue()) + "] input unit " + stageUnit.input.getName() + + " must equal Stage[" + String.format("%02d", prevstage) + "] output unit " + current.output.getName())); }else { - nestedMessage.add(Result.error("stage [" + stage.getNumber().intValue() + "] input unit " + stageUnit.input.getName() - + " must equal stage [" + prevstage + "] output unit " + nestedMessage.add(Result.error("Stage[" + stage.getNumber().intValue() + "] input unit " + stageUnit.input.getName() + + " must equal Stage[" + prevstage + "] output unit " + current.output.getName())); } diff --git a/src/main/java/edu/iris/dmc/station/conditions/UnitCondition.java b/src/main/java/edu/iris/dmc/station/conditions/UnitCondition.java index 5c231bd..759ab98 100644 --- a/src/main/java/edu/iris/dmc/station/conditions/UnitCondition.java +++ b/src/main/java/edu/iris/dmc/station/conditions/UnitCondition.java @@ -62,32 +62,32 @@ public Message evaluate(Channel channel, Response response) { } Units[] units = getUnits(stage); if (units == null) { - nestedMessage.add(Result.error("stage [null units for stage " + stage.getNumber().intValue() + "]")); + nestedMessage.add(Result.error("Stage["+ stage.getNumber().intValue() + "]"+" contains null units" )); } else { Units inputUnits = units[0]; Units outputUnits = units[1]; if (inputUnits == null || inputUnits.getName() == null) { nestedMessage - .add(Result.error("Input unit cannot be null [stage " + stage.getNumber().intValue() + "]")); + .add(Result.error("Stage["+ stage.getNumber().intValue() + "]"+" input unit cannot be null")); } else { boolean result = UnitTable.contains(inputUnits.getName()); if (!result) { result = UnitTable.containsCaseInsensitive(inputUnits.getName()); if (result) { if (stage.getNumber().intValue() < 10 ) { - nestedMessage.add(Result.warning("[stage " + String.format("%02d", stage.getNumber().intValue()) + nestedMessage.add(Result.warning("Stage[" + String.format("%02d", stage.getNumber().intValue()) + "] invalid input units " + inputUnits.getName())); }else { - nestedMessage.add(Result.warning("[stage " + stage.getNumber().intValue() + nestedMessage.add(Result.warning("Stage[" + stage.getNumber().intValue() + "] invalid input units " + inputUnits.getName())); } } else { if (stage.getNumber().intValue() < 10 ) { - nestedMessage.add(Result.error("[stage " + String.format("%02d", stage.getNumber().intValue()) + nestedMessage.add(Result.error("Stage[" + String.format("%02d", stage.getNumber().intValue()) + "] invalid input units " + inputUnits.getName())); }else { - nestedMessage.add(Result.error("[stage " + stage.getNumber().intValue() + nestedMessage.add(Result.error("Stage[" + stage.getNumber().intValue() + "] invalid input units " + inputUnits.getName())); } } @@ -97,9 +97,9 @@ public Message evaluate(Channel channel, Response response) { if (outputUnits == null || outputUnits.getName() == null) { if (stage.getNumber().intValue() < 10 ) { nestedMessage.add( - Result.error("Output unit cannot be null [stage " + String.format("%02d", stage.getNumber().intValue()) + "]")); + Result.error("Stage["+ String.format("%02d",stage.getNumber().intValue()) + "]"+" output unit cannot be null")); }else { - Result.error("Output unit cannot be null [stage " + stage.getNumber().intValue() + "]"); + Result.error("Stage["+ stage.getNumber().intValue() + "]"+" output unit cannot be null"); } } else { boolean result = UnitTable.contains(outputUnits.getName()); @@ -107,18 +107,18 @@ public Message evaluate(Channel channel, Response response) { result = UnitTable.containsCaseInsensitive(outputUnits.getName().toLowerCase()); if (result) { if (stage.getNumber().intValue() < 10 ) { - nestedMessage.add(Result.warning("[stage " + String.format("%02d",stage.getNumber().intValue()) + nestedMessage.add(Result.warning("Stage[" + String.format("%02d",stage.getNumber().intValue()) + "] invalid output units " + outputUnits.getName())); }else { - nestedMessage.add(Result.warning("[stage " + stage.getNumber().intValue() + nestedMessage.add(Result.warning("Stage[" + stage.getNumber().intValue() + "] invalid output units " + outputUnits.getName())); } } else { if (stage.getNumber().intValue() < 10 ) { - nestedMessage.add(Result.error("[stage " + String.format("%02d", stage.getNumber().intValue()) + nestedMessage.add(Result.error("Stage[" + String.format("%02d", stage.getNumber().intValue()) + "] invalid output units " + outputUnits.getName())); }else { - nestedMessage.add(Result.error("[stage " + stage.getNumber().intValue() + nestedMessage.add(Result.error("Stage[" + stage.getNumber().intValue() + "] invalid output units " + outputUnits.getName())); } } diff --git a/src/test/java/edu/iris/dmc/station/conditions/Condition330Test.java b/src/test/java/edu/iris/dmc/station/conditions/Condition330Test.java index 098bdb0..a99cafe 100644 --- a/src/test/java/edu/iris/dmc/station/conditions/Condition330Test.java +++ b/src/test/java/edu/iris/dmc/station/conditions/Condition330Test.java @@ -9,12 +9,17 @@ import org.junit.jupiter.api.Test; 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.Station; import edu.iris.dmc.station.RuleEngineServiceTest; import edu.iris.dmc.station.exceptions.StationxmlException; +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.NestedMessage; public class Condition330Test { @@ -26,11 +31,40 @@ public void init() throws Exception { } @Test - public void throwsExceptionWithSpecificType() throws Exception { + public void fail() throws Exception { try (InputStream is = RuleEngineServiceTest.class.getClassLoader().getResourceAsStream("F1_330.xml")) { - Assertions.assertThrows(StationxmlException.class,() -> DocumentMarshaller.unmarshal(is)); + theDocument = DocumentMarshaller.unmarshal(is); + Restriction[] restrictions = new Restriction[] { new ChannelCodeRestriction(), new ChannelTypeRestriction() }; + + Network n = theDocument.getNetwork().get(0); + Station s = n.getStations().get(0); + Channel c = s.getChannels().get(0); + BandCodeCondition condition = new BandCodeCondition(true, "", restrictions); + + Message result = condition.evaluate(c); + NestedMessage nestedMessage=(NestedMessage) result; + assertTrue(nestedMessage.getNestedMessages().get(0).getDescription().contains("Frequency Band B must have a sample rate assigned between >= 10 and < 80")); + + } + + } + + @Test + public void fail2() throws Exception { + try (InputStream is = RuleEngineServiceTest.class.getClassLoader().getResourceAsStream("F2_330.xml")) { + theDocument = DocumentMarshaller.unmarshal(is); + Restriction[] restrictions = new Restriction[] { new ChannelCodeRestriction(), new ChannelTypeRestriction() }; + + Network n = theDocument.getNetwork().get(0); + Station s = n.getStations().get(0); + Channel c = s.getChannels().get(0); + BandCodeCondition condition = new BandCodeCondition(true, "", restrictions); + + Message result = condition.evaluate(c); + NestedMessage nestedMessage=(NestedMessage) result; + assertTrue(nestedMessage.getNestedMessages().get(0).getDescription().contains("Frequency Band F must have a sample rate assigned between >= 1000 and < 5000")); + } - } diff --git a/src/test/java/edu/iris/dmc/station/conditions/Condition403Test.java b/src/test/java/edu/iris/dmc/station/conditions/Condition403Test.java index 5e73d1e..33ac308 100644 --- a/src/test/java/edu/iris/dmc/station/conditions/Condition403Test.java +++ b/src/test/java/edu/iris/dmc/station/conditions/Condition403Test.java @@ -44,7 +44,7 @@ public void fail() throws Exception { Message result = condition.evaluate(c); NestedMessage nestedMessage=(NestedMessage) result; System.out.println(nestedMessage.getNestedMessages().get(0).getDescription()); - assertTrue(nestedMessage.getNestedMessages().get(0).getDescription().contains("Stage [03] input unit V must equal stage [01] output unit volt")); + assertTrue(nestedMessage.getNestedMessages().get(0).getDescription().contains("Stage[03] input unit V must equal Stage[01] output unit volt")); } } diff --git a/src/test/java/edu/iris/dmc/station/conditions/Condition403Test2.java b/src/test/java/edu/iris/dmc/station/conditions/Condition403Test2.java index 08d8c8a..45c910d 100644 --- a/src/test/java/edu/iris/dmc/station/conditions/Condition403Test2.java +++ b/src/test/java/edu/iris/dmc/station/conditions/Condition403Test2.java @@ -43,8 +43,8 @@ public void fail() throws Exception { Message result = condition.evaluate(c); NestedMessage nestedMessage=(NestedMessage)result; - assertTrue(nestedMessage.getNestedMessages().get(0).getDescription().contains("Stage [03] input unit Volts must equal stage[01] output unit V")); - assertTrue(nestedMessage.getNestedMessages().get(1).getDescription().contains("Stage [05] input unit C must equal stage[04] output unit COUNTS")); + assertTrue(nestedMessage.getNestedMessages().get(0).getDescription().contains("Stage[03] input unit Volts must equal Stage[01] output unit V")); + assertTrue(nestedMessage.getNestedMessages().get(1).getDescription().contains("Stage[05] input unit C must equal Stage[04] output unit COUNTS")); } diff --git a/src/test/java/edu/iris/dmc/station/conditions/Condition404Test.java b/src/test/java/edu/iris/dmc/station/conditions/Condition404Test.java index aa53c90..0710a26 100644 --- a/src/test/java/edu/iris/dmc/station/conditions/Condition404Test.java +++ b/src/test/java/edu/iris/dmc/station/conditions/Condition404Test.java @@ -43,8 +43,8 @@ public void fail() throws Exception { Message result = condition.evaluate(c); NestedMessage nestedMessage=(NestedMessage)result; - assertTrue(nestedMessage.getNestedMessages().get(0).getDescription().contains("[stage 03] must include StageGain and Decimation")); - assertTrue(nestedMessage.getNestedMessages().get(1).getDescription().contains("[stage 04] must include StageGain and Decimation")); + assertTrue(nestedMessage.getNestedMessages().get(0).getDescription().contains("Stage[03] must include StageGain and Decimation")); + assertTrue(nestedMessage.getNestedMessages().get(1).getDescription().contains("Stage[04] must include StageGain and Decimation")); } diff --git a/src/test/java/edu/iris/dmc/station/conditions/Condition404Test2.java b/src/test/java/edu/iris/dmc/station/conditions/Condition404Test2.java index a47b6b0..7841bc7 100644 --- a/src/test/java/edu/iris/dmc/station/conditions/Condition404Test2.java +++ b/src/test/java/edu/iris/dmc/station/conditions/Condition404Test2.java @@ -43,7 +43,7 @@ public void fail() throws Exception { Message result = condition.evaluate(c); NestedMessage nestedMessage=(NestedMessage)result; - assertTrue(nestedMessage.getNestedMessages().get(0).getDescription().contains("[stage 03] must include StageGain and Decimation")); + assertTrue(nestedMessage.getNestedMessages().get(0).getDescription().contains("Stage[03] must include StageGain and Decimation")); } diff --git a/src/test/java/edu/iris/dmc/station/conditions/Condition404Test4.java b/src/test/java/edu/iris/dmc/station/conditions/Condition404Test4.java index ee0bf92..ad2946b 100644 --- a/src/test/java/edu/iris/dmc/station/conditions/Condition404Test4.java +++ b/src/test/java/edu/iris/dmc/station/conditions/Condition404Test4.java @@ -43,7 +43,7 @@ public void fail() throws Exception { Message result = condition.evaluate(c); NestedMessage nestedMessage=(NestedMessage)result; - assertTrue(nestedMessage.getNestedMessages().get(0).getDescription().contains("[stage 01] must include StageGain and Decimation")); + assertTrue(nestedMessage.getNestedMessages().get(0).getDescription().contains("Stage[01] must include StageGain and Decimation")); } } diff --git a/src/test/java/edu/iris/dmc/station/conditions/Condition413Test.java b/src/test/java/edu/iris/dmc/station/conditions/Condition413Test.java index c86d86c..29bc2f5 100644 --- a/src/test/java/edu/iris/dmc/station/conditions/Condition413Test.java +++ b/src/test/java/edu/iris/dmc/station/conditions/Condition413Test.java @@ -44,7 +44,7 @@ public void fail() throws Exception { Message result = condition.evaluate(c); NestedMessage nestedMessage=(NestedMessage)result; - assertTrue(nestedMessage.getNestedMessages().get(0).getDescription().contains("[stage 01] StageGain:Value must not be 0")); + assertTrue(nestedMessage.getNestedMessages().get(0).getDescription().contains("Stage[01] StageGain:Value must not be 0")); } } diff --git a/src/test/java/edu/iris/dmc/station/conditions/Condition414Test.java b/src/test/java/edu/iris/dmc/station/conditions/Condition414Test.java index 37a7e4c..854c74b 100644 --- a/src/test/java/edu/iris/dmc/station/conditions/Condition414Test.java +++ b/src/test/java/edu/iris/dmc/station/conditions/Condition414Test.java @@ -44,8 +44,8 @@ public void fail() throws Exception { Message result = condition.evaluate(c); NestedMessage nestedMessage=(NestedMessage)result; - assertTrue(nestedMessage.getNestedMessages().get(0).getDescription().contains("[stage 01] Zero:number 0 Zero:Real==0 and Zero:Imaginary==0 StageGain:Frequency must not equal 0")); - assertTrue(nestedMessage.getNestedMessages().get(1).getDescription().contains("[stage 01] Zero:number 1 Zero:Real==0 and Zero:Imaginary==0 StageGain:Frequency must not equal 0")); + assertTrue(nestedMessage.getNestedMessages().get(0).getDescription().contains("Stage[01] Zero:number[0] Zero:Real==0 and Zero:Imaginary==0 StageGain:Frequency must not equal 0")); + assertTrue(nestedMessage.getNestedMessages().get(1).getDescription().contains("Stage[01] Zero:number[1] Zero:Real==0 and Zero:Imaginary==0 StageGain:Frequency must not equal 0")); } } diff --git a/src/test/java/edu/iris/dmc/station/conditions/Condition414Test2.java b/src/test/java/edu/iris/dmc/station/conditions/Condition414Test2.java index 34fffb3..41cdb73 100644 --- a/src/test/java/edu/iris/dmc/station/conditions/Condition414Test2.java +++ b/src/test/java/edu/iris/dmc/station/conditions/Condition414Test2.java @@ -44,8 +44,8 @@ public void fail() throws Exception { Message result = condition.evaluate(c); NestedMessage nestedMessage=(NestedMessage)result; - assertTrue(nestedMessage.getNestedMessages().get(0).getDescription().contains("[stage 01] Zero:number 0 Zero:Real==0 and Zero:Imaginary==0 InstrumentSensitivity:Frequency must not equal 0")); - assertTrue(nestedMessage.getNestedMessages().get(1).getDescription().contains("[stage 01] Zero:number 1 Zero:Real==0 and Zero:Imaginary==0 InstrumentSensitivity:Frequency must not equal 0")); + assertTrue(nestedMessage.getNestedMessages().get(0).getDescription().contains("Stage[01] Zero:number[0] Zero:Real==0 and Zero:Imaginary==0 InstrumentSensitivity:Frequency must not equal 0")); + assertTrue(nestedMessage.getNestedMessages().get(1).getDescription().contains("Stage[01] Zero:number[1] Zero:Real==0 and Zero:Imaginary==0 InstrumentSensitivity:Frequency must not equal 0")); } } diff --git a/src/test/java/edu/iris/dmc/station/conditions/Condition414Test3.java b/src/test/java/edu/iris/dmc/station/conditions/Condition414Test3.java index 1134cf7..639aa36 100644 --- a/src/test/java/edu/iris/dmc/station/conditions/Condition414Test3.java +++ b/src/test/java/edu/iris/dmc/station/conditions/Condition414Test3.java @@ -43,8 +43,8 @@ public void fail() throws Exception { Message result = condition.evaluate(c); NestedMessage nestedMessage=(NestedMessage)result; - assertTrue(nestedMessage.getNestedMessages().get(0).getDescription().contains("[stage 01] Zero:number 0 Zero:Real==0 and Zero:Imaginary==0 InstrumentSensitivity:Frequency must not equal 0")); - assertTrue(nestedMessage.getNestedMessages().get(1).getDescription().contains("[stage 01] Zero:number 1 Zero:Real==0 and Zero:Imaginary==0 InstrumentSensitivity:Frequency must not equal 0")); + assertTrue(nestedMessage.getNestedMessages().get(0).getDescription().contains("Stage[01] Zero:number[0] Zero:Real==0 and Zero:Imaginary==0 InstrumentSensitivity:Frequency must not equal 0")); + assertTrue(nestedMessage.getNestedMessages().get(1).getDescription().contains("Stage[01] Zero:number[1] Zero:Real==0 and Zero:Imaginary==0 InstrumentSensitivity:Frequency must not equal 0")); } diff --git a/src/test/java/edu/iris/dmc/station/conditions/Condition422Test.java b/src/test/java/edu/iris/dmc/station/conditions/Condition422Test.java index f7c9b30..cc9434e 100644 --- a/src/test/java/edu/iris/dmc/station/conditions/Condition422Test.java +++ b/src/test/java/edu/iris/dmc/station/conditions/Condition422Test.java @@ -43,7 +43,8 @@ public void fail() throws Exception { Message result = condition.evaluate(c); NestedMessage nestedMessage=(NestedMessage)result; - assertTrue(nestedMessage.getNestedMessages().get(0).getDescription().contains("[stage 05] Decimation:InputSampleRate 20.0 != [stage 04] Decimation:InputSampleRate/Decimation:Factor 10.0")); + System.out.println(nestedMessage.getNestedMessages().get(0).getDescription()); + assertTrue(nestedMessage.getNestedMessages().get(0).getDescription().contains("Stage[05] Decimation:InputSampleRate 20.0 != Stage[04] Decimation:InputSampleRate/Decimation:Factor 10.0")); } diff --git a/src/test/java/edu/iris/dmc/station/conditions/Condition423.java b/src/test/java/edu/iris/dmc/station/conditions/Condition423.java index 5084302..881a7ca 100644 --- a/src/test/java/edu/iris/dmc/station/conditions/Condition423.java +++ b/src/test/java/edu/iris/dmc/station/conditions/Condition423.java @@ -45,8 +45,8 @@ public void fail() throws Exception { NestedMessage nestedMessage=(NestedMessage)result; - assertTrue(nestedMessage.getNestedMessages().get(0).getDescription().contains("[stage 01] includes Decimation and StageGain but does not include a Filter")); - assertTrue(nestedMessage.getNestedMessages().get(1).getDescription().contains("[stage 07] includes Decimation and StageGain but does not include a Filter")); + assertTrue(nestedMessage.getNestedMessages().get(0).getDescription().contains("Stage[01] includes Decimation and StageGain but does not include a Filter")); + assertTrue(nestedMessage.getNestedMessages().get(1).getDescription().contains("Stage[07] includes Decimation and StageGain but does not include a Filter")); } } diff --git a/src/test/java/edu/iris/dmc/station/conditions/Condition424Test.java b/src/test/java/edu/iris/dmc/station/conditions/Condition424Test.java index cbbe870..b2a1a0c 100644 --- a/src/test/java/edu/iris/dmc/station/conditions/Condition424Test.java +++ b/src/test/java/edu/iris/dmc/station/conditions/Condition424Test.java @@ -44,7 +44,7 @@ public void fail() throws Exception { Message result = condition.evaluate(c); NestedMessage nestedMessage=(NestedMessage) result; System.out.println(nestedMessage.getNestedMessages().get(0).getDescription()); - assertTrue(nestedMessage.getNestedMessages().get(0).getDescription().contains("Stage [08] output unit M/S must be count(s) because Stage[08].Decimation is included")); + assertTrue(nestedMessage.getNestedMessages().get(0).getDescription().contains("Stage[08] output unit M/S must be count(s) because Stage[08].Decimation is included")); } } diff --git a/src/test/java/edu/iris/dmc/station/conditions/Condition425Test.java b/src/test/java/edu/iris/dmc/station/conditions/Condition425Test.java index 344c977..7585cd8 100644 --- a/src/test/java/edu/iris/dmc/station/conditions/Condition425Test.java +++ b/src/test/java/edu/iris/dmc/station/conditions/Condition425Test.java @@ -43,7 +43,7 @@ public void fail() throws Exception { Message result = condition.evaluate(c); NestedMessage nestedMessage=(NestedMessage) result; - assertTrue(nestedMessage.getNestedMessages().get(0).getDescription().contains("Stage [01] includes PolesZeros:PzTransferFunctionType:LAPLACE (RADIANS/SECOND) so decimation must not be included in stage [01]")); + assertTrue(nestedMessage.getNestedMessages().get(0).getDescription().contains("Stage[01] includes PolesZeros:PzTransferFunctionType:LAPLACE (RADIANS/SECOND) so decimation must not be included in Stage[01]")); } } @@ -63,7 +63,7 @@ public void fail2() throws Exception { Message result = condition.evaluate(c); NestedMessage nestedMessage=(NestedMessage) result; - assertTrue(nestedMessage.getNestedMessages().get(0).getDescription().contains("Stage [01] includes PolesZeros:PzTransferFunctionType:LAPLACE (HERTZ) so decimation must not be included in stage [01]")); + assertTrue(nestedMessage.getNestedMessages().get(0).getDescription().contains("Stage[01] includes PolesZeros:PzTransferFunctionType:LAPLACE (HERTZ) so decimation must not be included in Stage[01]")); } } @@ -84,8 +84,8 @@ public void fail3() throws Exception { Message result = condition.evaluate(c); NestedMessage nestedMessage=(NestedMessage) result; System.out.println(nestedMessage.getNestedMessages().get(0).getDescription()); - assertTrue(nestedMessage.getNestedMessages().get(0).getDescription().contains("Stage [04] includes CoefficientsType:CfTransferFunctionType:ANALOG (RADIANS/SECOND) so decimation must not be included in stage [04]")); - assertTrue(nestedMessage.getNestedMessages().get(1).getDescription().contains("Stage [10] includes CoefficientsType:CfTransferFunctionType:ANALOG (HERTZ) so decimation must not be included in stage [10]")); + assertTrue(nestedMessage.getNestedMessages().get(0).getDescription().contains("Stage[04] includes CoefficientsType:CfTransferFunctionType:ANALOG (RADIANS/SECOND) so decimation must not be included in Stage[04]")); + assertTrue(nestedMessage.getNestedMessages().get(1).getDescription().contains("Stage[10] includes CoefficientsType:CfTransferFunctionType:ANALOG (HERTZ) so decimation must not be included in Stage[10]")); } diff --git a/src/test/resources/F1_330.xml b/src/test/resources/F1_330.xml index 2957145..6906657 100644 --- a/src/test/resources/F1_330.xml +++ b/src/test/resources/F1_330.xml @@ -25,11 +25,11 @@ -122.31332 225.879999 0 - 361 - 10 + 359 + 0 CONTINUOUS GEOPHYSICAL - 2E01 + 9.0 0E00 V @@ -40,8 +40,8 @@ - 2.44648E5 - 1E0 + 1 + 4E01 PA No Abbreviation Referenced diff --git a/src/test/resources/F2_330.xml b/src/test/resources/F2_330.xml new file mode 100644 index 0000000..64ec9ac --- /dev/null +++ b/src/test/resources/F2_330.xml @@ -0,0 +1,624 @@ + + + + IRIS-DMC + IRIS-DMC + IRIS WEB SERVICE: fdsnws-station | version: 1.1.33 + http://service.iris.edu/fdsnws/station/1/query?net=XX&sta=VPASS&cha=BDF&starttime=2018-08-06T00:00:01&level=response&format=xml&includecomments=true&nodata=404 + 2018-08-06T20:17:16 + + [IRIS DMC] Station XML Validator Passing Test File + 1 + 1 + + 47.66157 + -122.31332 + 225.879999 + + Synthetic Test File, IRIS DMC, USA, 218 2018, Tim Ronan + + 2018-08-06T00:00:00 + 1 + 1 + + 47.66157 + -122.31332 + 225.879999 + 0 + 359 + 0 + CONTINUOUS + GEOPHYSICAL + 1E02 + 0E00 + + V + Volts + + + 50A (Infrasound), 0.2-50 Hz, 0.4 V/Pa-null + + + + 1 + 4E01 + + PA + No Abbreviation Referenced + + + COUNTS + Digital Counts + + + + + + PA + No Abbreviation Referenced + + + V + Volts + + LAPLACE (RADIANS/SECOND) + 314.1 + 1.00000 + + 0.00000 + 0.00000 + + + 0.00000 + 0.00000 + + + -0.170000 + 0.00000 + + + 0.00000 + 0.00000 + + + -314.000 + 0.00000 + + + -0.188000 + 0.00000 + + + -0.0440000 + 0.00000 + + + + 0.4 + 1.0 + + + + + 1.0 + 1.0 + + + + + + V + Volts + + + COUNTS + Digital Counts + + DIGITAL + 1.00000 + + + 512000.0 + 1 + 0 + 0.0 + 0.0 + + + 611621.0 + 1.0 + + + + + + COUNTS + Digital Counts + + + COUNTS + Digital Counts + + DIGITAL + 0.0000305176 + 0.000152588 + 0.000457764 + 0.00106812 + 0.00213623 + 0.00384521 + 0.00640869 + 0.0100708 + 0.0149536 + 0.0210571 + 0.0282593 + 0.0363159 + 0.0448608 + 0.0534058 + 0.0613403 + 0.0679321 + 0.0726318 + 0.0750732 + 0.0750732 + 0.0726318 + 0.0679321 + 0.0613403 + 0.0534058 + 0.0448608 + 0.0363159 + 0.0282593 + 0.0210571 + 0.0149536 + 0.0100708 + 0.00640869 + 0.00384521 + 0.00213623 + 0.00106812 + 0.000457764 + 0.000152588 + 0.0000305176 + + + 512000.0 + 8 + 0 + 3.418E-5 + 3.418E-5 + + + 1.0 + 1.0 + + + + + + COUNTS + Digital Counts + + + COUNTS + Digital Counts + + DIGITAL + 0.0312500 + 0.156250 + 0.312500 + 0.312500 + 0.156250 + 0.0312500 + + + 64000.0 + 2 + 0 + 3.9063E-5 + 3.9063E-5 + + + 1.0 + 1.0 + + + + + + COUNTS + Digital Counts + + + COUNTS + Digital Counts + + DIGITAL + 0.0156250 + 0.0937500 + 0.234375 + 0.312500 + 0.234375 + 0.0937500 + 0.0156250 + + + 32000.0 + 2 + 0 + 9.375E-5 + 9.375E-5 + + + 1.0 + 1.0 + + + + + + COUNTS + Digital Counts + + + COUNTS + Digital Counts + + DIGITAL + 0.00160000 + 0.00640000 + 0.0160000 + 0.0320000 + 0.0560000 + 0.0832000 + 0.108800 + 0.128000 + 0.136000 + 0.128000 + 0.108800 + 0.0832000 + 0.0560000 + 0.0320000 + 0.0160000 + 0.00640000 + 0.00160000 + + + 16000.0 + 5 + 0 + 5.0E-4 + 5.0E-4 + + + 1.0 + 1.0 + + + + + + COUNTS + Digital Counts + + + COUNTS + Digital Counts + + DIGITAL + 0.00160000 + 0.00640000 + 0.0160000 + 0.0320000 + 0.0560000 + 0.0832000 + 0.108800 + 0.128000 + 0.136000 + 0.128000 + 0.108800 + 0.0832000 + 0.0560000 + 0.0320000 + 0.0160000 + 0.00640000 + 0.00160000 + + + 3200.0 + 5 + 0 + 0.0025 + 0.0025 + + + 1.0 + 1.0 + + + + + + COUNTS + Digital Counts + + + COUNTS + Digital Counts + + DIGITAL + 0.0312500 + 0.156250 + 0.312500 + 0.312500 + 0.156250 + 0.0312500 + + + 640.0 + 2 + 0 + 0.0039062 + 0.0039062 + + + 1.0 + 1.0 + + + + + + COUNTS + Digital Counts + + + COUNTS + Digital Counts + + DIGITAL + 0.0156250 + 0.0937500 + 0.234375 + 0.312500 + 0.234375 + 0.0937500 + 0.0156250 + + + 320.0 + 2 + 0 + 0.009375 + 0.009375 + + + 1.0 + 1.0 + + + + + + COUNTS + Digital Counts + + + COUNTS + Digital Counts + + DIGITAL + 0.0000142825 + 0.0000487602 + 0.0000981347 + 0.000131000 + 0.00000934250 + -0.000371601 + -0.00101838 + -0.00172427 + -0.00178938 + -0.000497840 + 0.00249391 + 0.00662629 + 0.00961284 + 0.00850723 + 0.00102035 + -0.0127048 + -0.0277493 + -0.0356507 + -0.0269602 + 0.00484878 + 0.0580113 + 0.122066 + 0.180265 + 0.214714 + 0.214714 + 0.180265 + 0.122066 + 0.0580113 + 0.00484878 + -0.0269602 + -0.0356507 + -0.0277493 + -0.0127048 + 0.00102035 + 0.00850723 + 0.00961284 + 0.00662629 + 0.00249391 + -0.000497840 + -0.00178938 + -0.00172427 + -0.00101838 + -0.000371601 + 0.00000934250 + 0.000131000 + 0.0000981347 + 0.0000487602 + 0.0000142825 + + + 160.0 + 4 + 0 + 0.14688 + 0.14688 + + + 1.0 + 1.0 + + + + + + COUNTS + Digital Counts + + + COUNTS + Digital Counts + + DIGITAL + 0.00000 + -0.00000341752 + -0.0000178578 + -0.0000418767 + -0.0000474602 + 0.00000163656 + 0.0000859675 + 0.000110275 + 0.0000140070 + -0.0000980010 + -0.0000453905 + 0.000143680 + 0.000182139 + -0.0000701795 + -0.000279563 + -0.0000484710 + 0.000373328 + 0.000285676 + -0.000343437 + -0.000562736 + 0.000169962 + 0.000842347 + 0.000211212 + -0.000994499 + -0.000768220 + 0.000911179 + 0.00143478 + -0.000471474 + -0.00204921 + -0.000372799 + 0.00240642 + 0.00158944 + -0.00226673 + -0.00301565 + 0.00142968 + 0.00436788 + 0.000213523 + -0.00525571 + -0.00260752 + 0.00524705 + 0.00549470 + -0.00394666 + -0.00839709 + 0.00109986 + 0.0106478 + 0.00331466 + -0.0114571 + -0.00900786 + 0.0100128 + 0.0153434 + -0.00558380 + -0.0213365 + -0.00240468 + 0.0256716 + 0.0143909 + -0.0266602 + -0.0309250 + 0.0219005 + 0.0536113 + -0.00660299 + -0.0892570 + -0.0368818 + 0.186535 + 0.403778 + 0.403778 + 0.186535 + -0.0368818 + -0.0892570 + -0.00660299 + 0.0536113 + 0.0219005 + -0.0309250 + -0.0266602 + 0.0143909 + 0.0256716 + -0.00240468 + -0.0213365 + -0.00558380 + 0.0153434 + 0.0100128 + -0.00900786 + -0.0114571 + 0.00331466 + 0.0106478 + 0.00109986 + -0.00839709 + -0.00394666 + 0.00549470 + 0.00524705 + -0.00260752 + -0.00525571 + 0.000213523 + 0.00436788 + 0.00142968 + -0.00301565 + -0.00226673 + 0.00158944 + 0.00240642 + -0.000372799 + -0.00204921 + -0.000471474 + 0.00143478 + 0.000911179 + -0.000768220 + -0.000994499 + 0.000211212 + 0.000842347 + 0.000169962 + -0.000562736 + -0.000343437 + 0.000285676 + 0.000373328 + -0.0000484710 + -0.000279563 + -0.0000701795 + 0.000182139 + 0.000143680 + -0.0000453905 + -0.0000980010 + 0.0000140070 + 0.000110275 + 0.0000859675 + 0.00000163656 + -0.0000474602 + -0.0000418767 + -0.0000178578 + -0.00000341752 + 0.00000 + + + 40.0 + 2 + 0 + 1.5875 + 1.5875 + + + 1.0 + 1.0 + + + + + + +