NEWS.md

gmsp 0.7.1

Corrected domain normalisation in TSL2PS()

Spectral-match algorithm graduated to the exported API

gmsp 0.6.0

runStage0: spectral record selection pipeline

runMatch V4: band-conditioned suite scaling

gmsp 0.5.1

Parallel process architecture

gmsp 0.5.0

Database process products

gmsp 0.4.7

Time-series crop helpers

Constructor cleanup

gmsp 0.4.6

New exported functions

Table contract helpers

r TSL2PS(TSL, xi = c(0.02, 0.05, 0.10), output = "PSW", D50 = TRUE, D100 = TRUE)

Downstream scripts that currently loop over damping ratios can call TSL2PS() once and group or filter by xi.

D100 spectra extension

r TSL2PS(TSL, output = "PSW", D50 = TRUE, D100 = TRUE, nTheta = 180L)

output = "PSL" adds rows with OCID = "D100". output = "PSW" adds PSA.D100, PSV.D100, and SD.D100. Scripts that already consume PSA.D50, PSV.D50, or SD.D50 should explicitly include the matching D100 columns when they opt in. Downstream configs/scripts that currently enumerate D50, such as spectra.D50, DIR_TARGET = "D50", or plot/export direction lists, should add D100 explicitly only for runs that request D100 = TRUE. D100 uses the same rotation grid as D50. It is the maximum over rotated horizontal spectra for each period and spectral ID; the maximizing angle can vary by Tn and by PSA / PSV / SD. The implementation returns spectra only, not the D100 angle. When D50 = TRUE and D100 = TRUE, both derived components are computed from one rotated response matrix. * The downstream contract stays canonical TSL2PS(). Do not migrate scripts to TS2PS(), TS2PSA(), RotD50, or RotD100 names. The implementation plan is recorded in dev/SoT/PLAN-TSL2PS-D100.md.

API cleanup

```r # before readTS(SEL = SEL, recordsDir = RecordsDir, kind = "VT") readAT(SEL, recordsDir = RecordsDir)

# after readTS(.x = SEL, path = RecordsDir, kind = "VT") readAT(.x = SEL, path = RecordsDir) ```

Positional calls with both arguments, such as readAT(SEL, RecordsDir), remain valid. The same .x / path rule applies to readVT() and readDT(); do not update callers to keep recordsDir =. buildMaster() has been removed from the exported package surface. It joined project-local database index tables and encoded source-precedence decisions that belong in downstream project scripts, not in the signal processing library. Project pipelines should own their master-table builder locally and pass the resulting selection tables to readTS() / readAT(). buildRawFileTable() now uses path.records for the records root and path.index for the index root:

```r # before buildRawFileTable(recordsDir = RecordsDir, indexDir = IndexDir, owners = Owner)

# after buildRawFileTable(path.records = RecordsDir, path.index = IndexDir, owners = Owner) ```

Positional calls with both paths remain valid. Named callers must not keep recordsDir = or indexDir =. * buildRawRecordTable() and buildRawIntensityTable() now use the same path argument contract as buildRawFileTable():

```r # before buildRawRecordTable(recordsDir = RecordsDir, indexDir = IndexDir, owners = Owner) buildRawIntensityTable(recordsDir = RecordsDir, indexDir = IndexDir, owners = Owner)

# after buildRawRecordTable(path.records = RecordsDir, path.index = IndexDir, owners = Owner) buildRawIntensityTable(path.records = RecordsDir, path.index = IndexDir, owners = Owner) ```

Named callers must not keep recordsDir = or indexDir =. * Single-path raw/archive helpers now use path:

r archiveRawOwner(path = StationDir) getRawIntensities(path = StationDir) writeSelection(DT, name = "subset", path = SelectionDir)

Named callers must not keep stationDir = or selectionDir =. * parseRecord() and extractRecord() now use .x for the one-record metadata subset and path for the records root:

```r # before parseRecord(masterRows = Rows, recordsDir = RecordsDir) extractRecord(masterRows = Rows, recordsDir = RecordsDir)

# after parseRecord(.x = Rows, path = RecordsDir) extractRecord(.x = Rows, path = RecordsDir) ```

Positional calls with both arguments, such as extractRecord(Rows, RecordsDir), remain valid. Named callers must not keep masterRows = or recordsDir =. * auditParsers() now uses .x for the record metadata table, owner for one OwnerID, and path for the records root:

```r # before auditParsers(OwnerID = Owner, master = Master, recordsDir = RecordsDir)

# after auditParsers(.x = Master, owner = Owner, path = RecordsDir) ```

Named callers must not keep OwnerID =, master =, or recordsDir =. Positional calls must use the new order auditParsers(Master, Owner, RecordsDir). * AT2TS(), VT2TS(), and DT2TS() now expose time as an input-column selector and always return canonical TSL columns t, s, ID, and OCID. The old COL.t and COL.s arguments are removed. time is not an output-column name; it is only the name of the time column in the input table. Scripts should migrate as follows:

```r # before AT2TS(Wide, Units = "mm", COL.t = "time", COL.s = "signal", Output = "TSL")

# after AT2TS(Wide, units.source = "mm", time = "time", output = "TSL") ```

Downstream code must consume the returned TSL as t and s. For example, .SDcols = c("time", "signal") should become .SDcols = c("t", "s"). Calls that already used a column named t and did not pass COL.t/COL.s do not need a script change. The constructor family also normalizes the approved public argument names: Units -> units.source, TargetUnits -> units.target, Output -> output, Verbose -> verbose, Audit -> audit, isRawData -> isRaw, Resample -> resample, FlatZeros -> flatZeros, TrimZeros -> trimZeros, Detrend -> detrend, and Regularize -> regularize. VT2TS() and DT2TS() additionally use Derivate -> derivate and LowPass -> lowPass. regularize() is no longer public API. Time-grid regularization is handled inside AT2TS(), VT2TS(), DT2TS(), TS2IMF(), and TSL2PS() via the internal helper .regularize(). External scripts should pass time = "..." to the constructor when the input time column is not named t; they should not call regularize() directly. * setSTFT() is no longer public API. STFT strategy selection is now the internal helper .setSTFT() used by AT2TS(), VT2TS(), DT2TS(), and auditSTFT(). External scripts should configure the public constructors instead of calling the STFT strategy helper directly.

gmsp 0.4.5

New exported functions

Compatibility

gmsp 0.4.4

Breaking changes — units contract

KIND (acceleration / velocity / displacement) is determined by the function called, not by a suffix of the Units string. Provider string parsers .parseUnits() and .parseKind() continue to accept heterogeneous raw strings (e.g. "cm/sec2", "G", "GALS") — those operate at the ingestion layer and pre-normalize to canonical before flowing into the public API.

Migration: callers passing Units = "mm/s" switch to Units = "mm"; same for displacement. Callers passing Units = "g" to VT2TS()/DT2TS() must move to AT2TS().

Validated by a Ship-of-Theseus harness (inst/dev/sot/compare_units_contract.R): Stage A 42/42 (canonical inputs byte-identical to prior gmsp via identical()), Stage A-bis 3/3 (current verbose ≡ canonical, documents migration), Stage C-bis 9/9 (illegal inputs error correctly). Verify mode (post-swap-in, in-place edit vs captured baseline) 51/51 PASS.

New exported functions

Blasting / velocity-record support

Bug fixes

Documentation

gmsp 0.4.0

First CRAN submission. Consolidates the standalone gmdb package (provider-format parsers and per-record indexing) into gmsp so the full strong-motion record pipeline — from raw provider file to processed AT / VT / DT time series — lives in one place.

New exported functions (merged from gmdb)

Breaking changes

Validated end-to-end by a Ship-of-Theseus harness: Stage A (explicit-path identity) 16/16 across 4 real provider fixtures (IGP, NGAW, NWZ, UCR); Stage A-bis (no-arg corner-case errors) 10/10. Pipeline regression 22/22 against the Phase 1 baseline.

Callers that passed either argument explicitly (none observed in the gmsp ecosystem) will now get unused argument. The default behaviour is unchanged.

Documentation

Internal

gmsp 0.3.0

Final pre-merge release of the standalone signal-processing package. Public API: AT2TS(), VT2TS(), DT2TS(), TS2IMF(), getIntensity(), getND(), regularize().



Try the gmsp package in your browser

Any scripts or data that you put into this service are public.

gmsp documentation built on July 18, 2026, 5:07 p.m.