### Types of external processors

This document lists all of the external types available in SOD. Each external type has a corresponding Java interface that must be implemented as part of its use. You can also see a simple implementation of each interface linked from each type. The simple implementations don't actually do any work, but they show the general structure an external of that type will need to take. Finally, each type has a link to its entry in the ingredient listing. This shows where you need to insert the external into your recipe.

To decide which external is right for your goals, go through the types listed here from the top. They're grouped by arm and then in their order inside of the arm. This means that they're also listed in the order that SOD applies them, so using one earlier in the list will allow SOD to do less work to get to it which means if it's rejecting things it'll save work overall and if not, at least it'll get to its job earlier.

Each type has a short description of the data available at that point in SOD's processing structure. If it includes the data you need to do you work, then implement that external.

### Event Arm

#### OriginSubsetter

Usage
  Operates on a single earthquake. This includes magnitude estimates, a location estimate, origin time and other basic information about an earthquake
Interface
  OriginSubsetter.java
Example
  OriginSubsetterExample.java
Ingredient
  externalOriginSubsetter

### Network Arm

Each successive item here has the information from the previous step. A station knows about its network and a channel about its station and so forth.

#### NetworkSubsetter

Usage
  Makes decisions and works on a seismic network. That includes the time the network was active, its name, operator, code and description
Interface
  NetworkSubsetter.java
Example
  NetworkSubsetterExample.java
Ingredient
  externalNetworkSubsetter

#### StationSubsetter

Usage
  A station in a network. A grouping of recording instruments. It contains a location, the time the instruments were active, a code, name, comment and operator.
Interface
  StationSubsetter.java
Example
  StationSubsetterExample.java
Ingredient
  externalStationSubsetter

#### ChannelSubsetter

Usage
  All of the information in the network arm is available here. The channel provides its effective time, code, orientation, nominal sampling and has all of the information from its site, station, and network.
Interface
  ChannelSubsetter.java
Example
  ChannelSubsetterExample.java
Ingredient
  externalChannelSubsetter

### Waveform Arm

The waveform arm operates on the combination of the items coming out of the event and network arms. Therefore each item here has an event and a piece of network information. As with the network arm each succesive item has all of the information from its previous steps.

#### EventStationSubsetter

Usage
  Works on the combination of an event and station. Existing subsetters check on things like the station's distance from the event and things like that.
Interface
  EventStationSubsetter.java
Example
  EventStationSubsetterExample.java
Ingredient
  externalEventStationSubsetter

#### EventChannelSubsetter

Usage
  Works on the combination of event and channel.
Interface
  EventChannelSubsetter.java
Example
  EventChannelSubsetterExample.java
Ingredient
  externalEventChannelSubsetter

#### Request

Usage
  Checks on the properties of a given request.
Interface
  Request.java
Example
  RequestExample.java
Ingredient
  externalRequest

#### AvailableDataSubsetter

Usage
  Checks the results of asking the server what data it has available for the generated request for acceptability.
Interface
  AvailableDataSubsetter.java
Example
  AvailableDataSubsetterExample.java
Ingredient
  externalAvailableDataSubsetter

#### WaveformProcess

Usage
  Operates on the returned seismograms.
Interface
  WaveformProcess.java
Example
  WaveformProcessExample.java
Ingredient
  externalWaveformProcess

### Waveform Vector Arm

The waveform vector arm takes the place of the waveform arm and still operates on the combination of the items coming out of the event and network arms. However instead of operating on a single channel at a time, it operates on a vector of channels. Therefore if you want to check on some property between the channels in the vector, this would be the place to look.

#### EventVectorSubsetter

Usage
  Looks at the earthquake in combination with a vector of channels
Interface
  EventVectorSubsetter.java
Example
  EventVectorSubsetterExample.java
Ingredient
  externalEventVectorSubsetter

#### VectorRequest

Usage
  Checks on the requests for all channels in the vector
Interface
  VectorRequest.java
Example
  VectorRequestExample.java
Ingredient
  externalVectorRequest

#### VectorAvailableDataSubsetter

Usage
  Checks the available data for the entire vector
Interface
  VectorAvailableDataSubsetter.java
Example
  VectorAvailableDataSubsetterExample.java
Ingredient
  externalVectorAvailableDataSubsetter

#### WaveformVectorProcess

Usage
  Works on all seismograms in the vector at once
Interface
  WaveformVectorProcess.java
Example
  WaveformVectorProcessExample.java
Ingredient
  externalWaveformVectorProcess