scrtdd

Double-Difference location module for real-time and event catalogs.

Configuration

etc/defaults/global.cfg
etc/defaults/scrtdd.cfg
etc/global.cfg
etc/scrtdd.cfg
~/.seiscomp/global.cfg
~/.seiscomp/scrtdd.cfg

scrtdd inherits global options.

onlyPreferredOrigins

Type: boolean

Relocate only preferred origins. When disabled scrtdd listens to LOCATION group and tries to relocate any origin. When enabled scrtdd listens to EVENT group and tries to relocate the preferred origin of an event. Default is true.

automaticOrigins

Type: boolean

Allow relocation of automatic origins Default is true.

manualOrigins

Type: boolean

Allow relocation of manual origins Default is true.

workingDirectory

Type: path

Defines the directory used for storing processing files (waveforms cache and debugging files). Default is @ROOTDIR@/var/lib/rtdd.

saveProcessingFiles

Type: boolean

Store logs and processing files in the working directory (useful for debugging/troubleshooting or further analysis). Default is false.

activeProfiles

Type: list:string

Defines a list of active profiles for real-time/single-event processing.

performance.profileTimeAlive

Type: int

Unit: sec

Defines how long the real-time profile data should be kept in memory (in seconds). This is useful to release memory (catalog waveform data) after a period of inactivity, at the cost of having to reload the catalog (load and process waveforms) when a new origin arrives. A negative value force the profiles to stay always in memory. Default is 3600.

performance.cacheWaveforms

Type: boolean

Save catalog waveforms to local disk after they have been loaded the first time. This avoids re-reading them from the configured recordStream in the future since this operation is dramatically slow (unless the recordStream points to a local disk source, in which case there is no advantage over caching the waveforms). Note: It is safe to delete the cache folder, in which case the waveforms will be loaded and saved again on disk the next time the profile is loaded (they will be read again from the configured recordStream). Default is true.

performance.cachedWaveformLength

Type: double

Unit: sec

The waveform length to store in the disk cache (centered around pick time). Although the minimum required waveform length is inferred from the cross-correlation settings (the max between cross-correlation and SNR windows), this option allows to cache to disk a longer window, which become useful to skip the data re-downloading if the cross-correlation settings are changed in the future. Default is 10.

cron.delayTimes

Type: list:int

Unit: sec

Specifies a delay time in seconds, relative to origin time, to trigger the processing. This can be a single value or a list of delay times. The list case can be useful when a quick solution is wanted but more waveforms data becomes available at a later time. In this scenario multiple times are configured, so that a first solution is attempted early and a more refined one is computed later. Example: "60, 120, 300, 3600" Default is 10.

cron.logging

Type: boolean

Enables/disables updating of a cron log file. This file will be created at ~/.seiscomp3/log/[appname].sched and contains information about the scheduled events and the processing queue. Default is true.

Note

profile.* Each profile is a configuration set for a specific region. To enable a profile for real-time processing the profile name must be added to ‘activeProfile’ option. Origins within a profile region are relocated using that profile configuration. If an origin falls in multiple profile regions, the profile defined first in activeProfile option will be used. This allows for hierarchical regions, where special regions are defined first and a broader region is defined last.

Note

profile.$name.* $name is a placeholder for the name to be used and needs to be added to rtdd.activeProfiles to become active.

rtdd.activeProfiles = a,b
profile.a.value1 = ...
profile.b.value1 = ...
# c is not active because it has not been added
# to the list of rtdd.activeProfiles
profile.c.value1 = ...
profile.$name.regionType

Type: string

Type of region: RECTANGULAR or CIRCULAR Default is CIRCULAR.

profile.$name.region

Type: list:double

If regionType is RECTANGULAR then 4 comma separated values are expected: min_lat, min_lon, max_lat, max_lon. If regionType is CIRCULAR then 3 comma separated values are expected: lat, lon, radius in km. If left empty it represents a limitless region.

profile.$name.earthModelID

Type: string

This is the earthModelID label that is stored in the created origin e.g. the velocity model name of the profile

profile.$name.methodID

Type: string

This is the methodID label that is stored in the created origin. Default is RTDD.

Note

profile.$name.catalog.* Define a catalog for this profile. This is used in real-time (single-event mode) as the reference catalog to relocate new origins. There are two ways to define a catalog file: one is providing a single eventFile containing origin ids; the second way consists in providing three csv files eventFile, phaFile and stationFile.

profile.$name.catalog.eventFile

Type: path

Path to event file to be used for this profile. If this file contains just one column called "origin", then each line must be an existing origin id. In this case neither phase.csv nor station.csv files are required. Alternatively the event file must be in the format generated by --dump-catalog and phase.csv and station.csv files should be configured too

profile.$name.catalog.phaFile

Type: path

Path to catalog picks file to be used for this profile

profile.$name.catalog.stationFile

Type: path

Path to the stations file to be used for this profile

profile.$name.catalog.P-Phases

Type: list:string

Defines a priority list of accepted P phases. Phases not in the list will be discarded. If multiple phases exist for the same event/station pair, the first one in the list will be used. Default is Pg,P.

profile.$name.catalog.S-Phases

Type: list:string

Defines a priority list of accepted S phases. Phases not in this list will be discarded. If multiple phases exist for the same event/station pair, the first one in the list will be used. Default is Sg,S.

Note

profile.$name.doubleDifferenceSystem.* These options control the creation of the double-difference equation system, that is which events and phases are used in the system. Among the selected events all possible event pairs are considered and for each pair, when a phase exists for both paired events at a common station, an equation is added to the system.

Note

profile.$name.doubleDifferenceSystem.eventFiltering.* Exclude poorly connected events from the DD system: not enough phases and/or neighbours

profile.$name.doubleDifferenceSystem.eventFiltering.minNumPhases

Type: int

Minimum number of phases at common stations required by event pairs. Event pairs not satisfying this condition will not be used. Default is 4.

profile.$name.doubleDifferenceSystem.eventFiltering.minNumNeighbours

Type: int

Minimum number of neighbours required by an event. Events not satisfying this condition will not be used. Default is 4.

Note

profile.$name.doubleDifferenceSystem.phaseFiltering.* Exclude not optimal phases from the DD system.

profile.$name.doubleDifferenceSystem.phaseFiltering.minStationToEventPairDistRatio

Type: double

Minimum ratio between event-station to inter-event distance allowed. Phases belonging to stations not satisfying this condition will not be used. Default is 5.

profile.$name.doubleDifferenceSystem.phaseFiltering.minStationDistance

Type: double

Unit: km

Minimum distance (km) between event and station required for a phase to be used. Phases belonging to stations not satisfying this condition will not be used.

profile.$name.doubleDifferenceSystem.phaseFiltering.maxStationDistance

Type: double

Unit: km

Max distance (km) between event and station allowed for a phase to be used. Phases belonging to stations not satisfying this condition will not be used. A value of 0 or less disables this limit.

profile.$name.doubleDifferenceSystem.phaseFiltering.maxNumPhases

Type: int

Maximum number of phases per event pair. If this value is set, closer stations will have higher precedence over further ones. A value of 0 disables this limit.

Note

profile.$name.doubleDifferenceSystem.eventPairSelection.* This option controls how neighbouring events are selected. In the simpliest form ‘numEllipsoids’ is set to 0 and the neighbours are selected on the nearest neighbour basis within a search distance of ‘maxEllipsoidSize’. This is the preferred choice for multi-event mode. When ‘numEllipsoids’ is not 0, the ellipsoid selection algorithm is used. From Waldhauser 2009: “to assure a spatially homogeneous subsampling, reference events are selected within each of five concentric, vertically elongated ellipsoidal layers of increasing thickness. The dimension of the ellipsoid is based on the assumed error in the routine locations and the maximum interevent distance over which model errors can still be effectively minimized (see Waldhauser, 2001). The layers are twice as thick at the poles than they are at the equator to accommodate the generally larger error in the depth of the routine location of a new event. Each layer is split up into its eight quadrants (or cells), and the neighboring events are selected from each of the 40 cells.” Neighbours are selected for each ellipsoid/quadrant combination in a round robin fashion until ‘maxNumNeigh’ is reached.

Note

profile.$name.doubleDifferenceSystem.eventPairSelection.singleEvent.* Configuration for single-event relocation

profile.$name.doubleDifferenceSystem.eventPairSelection.singleEvent.maxNumNeighbours

Type: int

Maximum number of neighbors per event. Useful to reduce computation time when relocating a large number events. A value of 0 disables this limit Default is 80.

profile.$name.doubleDifferenceSystem.eventPairSelection.singleEvent.numEllipsoids

Type: int

Number of concentric ellipsoidal layers to use in neighboring events selection. If ‘maxNumNeigh’ is not set this parameter does not have effects. If ‘maxNumNeigh’ is set and ‘numEllipsoids’ is not 0, the optimal ‘maxNumNeigh’ value is ‘numEllipsoids’ * 8. Default is 5.

profile.$name.doubleDifferenceSystem.eventPairSelection.singleEvent.maxEllipsoidSize

Type: double

Unit: km

Horizontal axis length (km) of the outermost boundary. Each inner concentric layer axis will be of size/2 of the previous one. Please, note that the horizontal axis size is half of the vertical one. Default is 5.

Note

profile.$name.doubleDifferenceSystem.eventPairSelection.multiEvent.* Configuration for multi-event relocation

profile.$name.doubleDifferenceSystem.eventPairSelection.multiEvent.maxNumNeighbours

Type: int

Maximum number of neighbors per event. Useful to reduce computation time when relocating a large number events. A value of 0 or less disables this limit Default is 30.

profile.$name.doubleDifferenceSystem.eventPairSelection.multiEvent.numEllipsoids

Type: int

Number of concentric ellipsoidal layers to use in neighboring events selection. If ‘maxNumNeigh’ is not set this parameter does not have effects. If ‘maxNumNeigh’ is set and ‘numEllipsoids’ is not 0, the optimal ‘maxNumNeigh’ value is ‘numEllipsoids’ * 8. Default is 0.

profile.$name.doubleDifferenceSystem.eventPairSelection.multiEvent.maxEllipsoidSize

Type: double

Unit: km

Horizontal axis length (km) of the outermost boundary. Each inner concentric layer axis will be of size/2 of the previous one. Please, note that the horizontal axis size is half of the vertical one. Default is 5.

Note

profile.$name.crossCorrelation.* cross-correlation is used to improve the differential travel times used in the double-difference system. The differential travel times are computed as difference between the phase absolute travel time of two events’ phases and consequently rely on the accuracy and consistency across pick times. The cross-correlation is used to improve those differential times by cross-correlating the phases waveforms and using the detected lag as differential time for every phase pair whose correlation coefficient exceeds the configured threshold. This lag then replaces the absolute travel time difference value in the double-difference system. The phase pairs with low correlation coefficient maintain the differential time derived from the absolute travel time difference. The cross-correlation step is not mandatory and can be disabled using either ‘maxStationDistance’ or ‘maxInterEventDistance’

profile.$name.crossCorrelation.maxStationDistance

Type: double

Unit: km

By default all phase pairs in the double-difference system are cross-correlated. However this parameter allows to set the maximum allowed distance (km) between event and station for a cross-correlation to happen. Phases belonging to further stations will not be used in cross-correlation. Setting it to -1 removes the limits. Settings it to 0 disables the cross-correlations. Default is 0.

profile.$name.crossCorrelation.maxInterEventDistance

Type: double

Unit: km

By default all phase pairs in the double-difference system are cross-correlated. However this parameter allows to set the maximum allowed distance (km) between events for a cross-correlation to happen. Phases of event pairs whose inter-event distance if further than this value will not be used in cross-correlation. Setting it to -1 removes the limits. Settings it to 0 disables the cross-correlations. Default is -1.

profile.$name.crossCorrelation.detectMissingPhasesAutoOrigin

Type: boolean

Whether cross-correlation is used to detect phases at stations with no associated picks. This option applies to automatic origins. If the background catalog contains events with high quality picks, those can serve as template for detecting picks on real-time events. In multi-event mode this option is not used. Default is true.

profile.$name.crossCorrelation.detectMissingPhasesManualOrigin

Type: boolean

Whether cross-correlation is used to detect phases at stations with no associated picks. This option applies to manual origins. If the background catalog contains events with high quality picks, those can serve as template for detecting picks on real-time events. This option also affects the multi-event mode. Default is false.

profile.$name.crossCorrelation.compatibleChannels

Type: string

Cross-correlation is computed on phases with the same channel code (e.g. HH. EH, HG, etc), however here it is possible to force the cross-correlation between different channel codes. The value is a list separated by ‘;’ and each element is a list (again) of compatible channels separated by ‘,’ for example: "HH,EH;HG,HN"

profile.$name.crossCorrelation.p-phase.minCCCoef

Type: double

Min cross-correlation coefficient accepted to use a differential travel time. Default is 0.50.

profile.$name.crossCorrelation.p-phase.start

Type: double

Unit: sec

Start of data window to cross-correlate with respect to pick time (+/- secs). Default is -0.50.

profile.$name.crossCorrelation.p-phase.end

Type: double

Unit: sec

End of data window to cross-correlate with respect to pick time (+/- secs). Default is 0.50.

profile.$name.crossCorrelation.p-phase.maxDelay

Type: double

Unit: sec

Maximum data windows lag accepted (secs).. Default is 0.50.

profile.$name.crossCorrelation.p-phase.components

Type: list:string

Priority list of components to be used in cross-correlation (e.g. Z, N, E, 1, 2, 3). If the component exists for a pair of phases it is used for the cross-correlation, otherwise the next component in the list is tried. Special values are ‘H’, which computes the L2 norm of the 2 horizontal components and ‘T’ (and ‘R’), which computes the transversal (and radial) component with respect with the event location to which the phase belongs to. If empty the component where the phase was picked is used. Default is Z.

profile.$name.crossCorrelation.s-phase.minCCCoef

Type: double

Min cross-correlation coefficient accepted to use a differential travel time. Default is 0.50.

profile.$name.crossCorrelation.s-phase.start

Type: double

Unit: sec

Start of data window to cross-correlate with respect to pick time (+/- secs). Default is -0.50.

profile.$name.crossCorrelation.s-phase.end

Type: double

Unit: sec

End of data window to cross-correlate with respect to pick time (+/- secs). Default is 0.75.

profile.$name.crossCorrelation.s-phase.maxDelay

Type: double

Unit: sec

Maximum data windows lag accepted (secs). Default is 0.50.

profile.$name.crossCorrelation.s-phase.components

Type: list:string

Priority list of components to be used in cross-correlation (e.g. Z, N, E, 1, 2, 3). If the component exists for a pair of phases it is used for the cross-correlation, otherwise the next component in the list is tried. Special values are ‘H’, which computes the L2 norm of the 2 horizontal components and ‘T’ (and ‘R’), which computes the transversal (and radial) component with respect with the event location to which the phase belongs to. If empty the component where the phase was picked is used. Default is H.

Note

profile.$name.crossCorrelation.waveformFiltering.* Filter waveforms before performing the cross-correlation

profile.$name.crossCorrelation.waveformFiltering.filterString

Type: string

SeisComP string based filter definition. Set to "" to disable filtering. Default is "ITAPER(1)>>BW_HLP(2,1,20)".

profile.$name.crossCorrelation.waveformFiltering.margin

Type: double

Unit: sec

Extra seconds to add to the waveform ends before applying the filter. Useful to initialize the filter and to discard potential filter artifacts at the beginning and end of trace Default is 1.

profile.$name.crossCorrelation.waveformFiltering.resampling

Type: double

Unit: Hz

Resample all traces at this samplig interval (hz) Set it to 0 disable resampling. If the event phases are picked on different channels for the same station(s), this option has to be used to allow a common sampling rate. Default is 0.

Note

profile.$name.crossCorrelation.snr.* Exclude phases from cross-correlation when the Signal to Noise Ratio (SNR) is below a configured threshold. Useful to avoid that low quality phases (e.g. automatic) generate low quality cross-correlation differential travel times. Set ‘minSnr’ to 0 to disable this feature.

profile.$name.crossCorrelation.snr.minSnr

Type: double

Minimum SNR value required for a P or S pick to be used in cross-correlation. Default is 2.

profile.$name.crossCorrelation.snr.noiseStart

Type: double

Unit: sec

Start of noise window with respect to pick time (+/- secs). Default is -3.

profile.$name.crossCorrelation.snr.noiseEnd

Type: double

Unit: sec

End of noise window with respect to pick time (+/- secs). Default is -0.350.

profile.$name.crossCorrelation.snr.signalStart

Type: double

Unit: sec

Start of signal window with respect to pick time (+/- secs). Default is -0.350.

profile.$name.crossCorrelation.snr.signalEnd

Type: double

Unit: sec

End of signal window with respect to pick time (+/- secs). Default is 1.

Note

profile.$name.solver.* These options control the double-difference system solver. The solution to the double-difference system is found through an iterative process: a double-difference system is built from the origin initial locations and solved. Then the hypocenters are updated based on these initial solutions and a new system is built and solved again multiple times until ‘algoIterations’ iterations is reached.

profile.$name.solver.solverType

Type: string

Solver algorithm to use: either LSMR or LSQR Default is LSMR.

profile.$name.solver.algoIterations

Type: int

This parameter control how many iterations the solver performs Default is 20.

Note

profile.$name.solver.downWeightingByResidual.* At each iteration the solver down-weighs the system equations accordingly to their residuals of the previous iteration, which scales differential time accordingly to their quality. This option value expresses the standard deviations of the double-difference residuals beyond which the observations are dropped. For residuals below this value, the weighing scheme follows the Waldhauser/Ellsworth paper. A value of 0 disables downweighting.

profile.$name.solver.downWeightingByResidual.startingValue

Type: double

Value for the first iteration of the solver. Default is 10.

profile.$name.solver.downWeightingByResidual.finalValue

Type: double

Value for the last iteration of the solver. Default is 3.

Note

profile.$name.solver.dampingFactor.* Setting a value different than 0 enables the solver to use a damped (regularized) least squares system. A too high value prevents the solver from changing the events locations, while a too low value allows the event cluster(s) to shift away from their initial absolute location, which might result in a larger events RMS.

profile.$name.solver.dampingFactor.startingValue

Type: double

Value for the first iteration of the solver. Default is 0.3.

profile.$name.solver.dampingFactor.finalValue

Type: double

Value for the last iteration of the solver. Default is 0.3.

Note

profile.$name.solver.absoluteLocationConstraint.* When a value greater than 0 is used, the double-difference system is modified to solve for both absolute and relative locations. Additional equations are added, which constrain the absolute travel time residuals. Here you can set the weight to be given to these equations. When using this feature the dampingFactor should be decreased. A good starting point for testing the optimal values, is absoluteLocationConstraint=0.3 and dampingFactor=0.01

profile.$name.solver.absoluteLocationConstraint.startingValue

Type: double

Value for the first iteration of the solver. Default is 0.0.

profile.$name.solver.absoluteLocationConstraint.finalValue

Type: double

Value for the last iteration of the solver. Default is 0.0.

Note

profile.$name.solver.aPrioriWeights.* Those options allow the double-difference equations to have different starting weights. By default they are equally weighted and the residual itselfs drive the re-weighting (see downWeightingByResidual option). So these settings shouldn’t be strictly necessary but it could be interesting to experiment with them

profile.$name.solver.aPrioriWeights.usePickUncertainties

Type: boolean

Observation weights are scaled based on pick uncertainties. This should be enabled only if uncertainties are used for manual picks otherwise there is no way to properly access pick quality and consequently the observation weight. Default is false.

profile.$name.solver.aPrioriWeights.absoluteTTObsWeight

Type: double

Starting weight for observations coming from difference in absolute travel times. Useful to give more weight to xcorr observations than absolute travel time ones. Default is 1.0.

profile.$name.solver.aPrioriWeights.xcorrObsWeight

Type: double

Starting weight for observations coming from lag measured via cross-correlation. Useful to give more weight to cross-correlation observations than absolute travel time ones. Default is 1.0.

Note

profile.$name.solver.travelTimeTable.* Travel time table used by the solver. ‘tableType’ specifies the format and it can be any format available in SeisComP (e.g. ‘LOCSAT’, ‘libtau’) or ‘ConstVel’ or ‘NonLinLoc’. ‘ConstVel’ is a simple constant velocity model while ‘NonLinLoc’ allows to use NonLinLoc grid files. When ‘ConstVel’ is selected, then ‘tableModel’ specifies P;S velocity in Km/s e.g. “5.8;3.6” for P=5.8[Km/s] and S=3.6[Km/s]. When ‘NonLinLoc’ is selected, then ‘tableModel’ is the path to velocity, time and angle grid files. The path format is “path_to_velocity_grids;path_to_time_grids;path_to_angle_grids;” E.g. “/path/name.PHASE.mod;/path/name.PHASE.STATION.time;/path/name.PHASE.STATION.angle”. PHASE and STATION are placeholders and they will be replaced with actual values when looking for the grid file of a specific phase and station. Valid placeholders are NETWORK,STATION,LOCATION,PHASE

profile.$name.solver.travelTimeTable.tableType

Type: string

Travel time table format type (e.g. LOCSAT, libtau, ConstVel, NonLinLoc). Default is libtau.

profile.$name.solver.travelTimeTable.tableModel

Type: string

The model to be used. The format depends on tableType. Default is iasp91.

Note

profile.$name.solver.airQuakes.* Air-quakes are origins whose depth shift above the range of the velocity model (typically 0) during the inversion. These options define how the air-quakes are handled. `elevationThreshold` defines the elevation above which an origin is considered an air-quake. `action` control how the air-quakes are handled; “NONE”: no special action is performed. “RESET”: reset air-quake location and time to the previous solver iteration, before it became an air-quake. “RESET_DEPTH” similar to RESET but only the depth is restored”

profile.$name.solver.airQuakes.elevationThreshold

Type: double

Unit: meter

Elevation above which origins are considered air-quakes Default is 0.

profile.$name.solver.airQuakes.action

Type: string

Possible values are NONE, RESET, RESET_DEPTH. Default is NONE.

Command Line

Generic

Verbosity

Messaging

Database

Records

Mode

--reloc-catalog profile

Relocate the catalog passed as argument in multi-event mode. The input can be a single file (containing seiscomp origin ids) or a file triplet (station.csv,event.csv,phase.csv). For events stored in a XML file add the --ep option.

-O, --origin-id origin-id

Relocate the origin (or multiple comma-separated origins) and send a message. Each origin will be processed according tothe matching profile region unless the --profile option is used.

--ep scxml-file

Event parameters XML file for offline processing of contained origins (implies --test option). Each contained origin will be processed in signle-event mode unless --reloc-catalog is provided, which enable multi-evet mode.

--eval-xcorr profile

Evaluate cross-correlation settings for the given profile.

--dump-clusters profile

Find clusters in the catalog passed as argument and save them in the working directory. The catalog can be a single file (containing seiscomp origin ids) or a file triplet (station.csv,event.csv,phase.csv). Use in combination with --profile.

--dump-wf profile

Dump processed waveforms of the catalog passed as argument in the current working directory. The catalog can be a single file (containing seiscomp origin ids) or a file triplet (station.csv,event.csv,phase.csv). Use in combination with --profile.

--load-profile-wf profile

Load catalog waveforms from the configured recordstream and save them into the profile working directory.

--send-reload-profile-msg

Send a message to any running scrtdd module requesting to reload a specific profile passed as argument.

Catalog

--dump-catalog catalog-file

Dump the seiscomp event/origin id file passed as argument into a catalog file triplet (station.csv,event.csv,phase.csv).

--dump-catalog-options type,evalmode,includeCreator,excludeCreator,region

Allows the --dump-catalog option to accept event ids besides origin ids. For each event id an origin will be selected following the provided options whose format is: ‘type,evalmode,include Creator,excludeCreator,region’, where type=preferred|last|first evalmode=any|onlyManual|onlyAutomatic includeCreator=any|author|methodID excludeCreator=none|author|methodID region=any|profileName e.g. to select preferred origins of the input event ids that lie within the region defined for ‘myProfile’ use ‘preferred,any,any,none ,myProfile’

--merge-catalogs catalog-files

Merge in a single catalog all the catalog file triplets (station1.csv,event1.csv,phase1.csv,sta tion2.csv,event2.csv,phase2.csv,…) passed as arguments.

--merge-catalogs-keepid catalog-files

Similar to the --merge-catalogs option but events keep their ids. If multiple events share the same id, subsequent events will be discarded.

ModeOptions

--profile profile

To be used in combination with other options: select the profile configuration to use.

--xmlout

Enable XML output when combined with --reloc-catalog or --oring-id options.

--xcorr-cache

Specify a file containing precomputed cross-correlation values.

--test

Test mode, no messages are sent

--cache-wf-all

All waveforms will be saved to disk cache, even temporarily ones. Normally only catalog phase waveforms are cached to disk. This is useful to speed up debugging/testing when the same origins are repeatedly processed.

-x, --expiry hours

Defines the time span in hours after which objects expire.