Set up your own search¶
You run Qseek with the qseek command and a JSON configuration file. The configuration describes your stations, waveform data, velocity model and search volume. The quick start shows a complete example.
Create a configuration¶
Print the default configuration into a new file:
Open my-search.json and set at least these fields; everything else keeps its default:
stations: your station metadata.data_provider: your waveform data.octree: the search volume around your seismicity.image_functionwith itsphase_map: the phase annotation.ray_tracers: the travel times in your velocity model.
The minimal configuration shows these fields together, and the configuration overview explains every module.
Default configuration
{
"project_dir": ".",
"stations": {
"pyrocko_station_yamls": [],
"station_xmls": [],
"blacklist": [],
"stations": [],
"max_distance": null
},
"data_provider": {
"provider": "SDSArchive",
"channel_selector": null,
"archive": "./sds-archive",
"start_time": null,
"end_time": null,
"channel_orientations": "ENZ0123",
"n_threads": 4,
"queue_size": 16
},
"pre_processing": [
{
"process": "resample",
"stations": [],
"sampling_frequency": 100.0,
"n_threads": 8
},
{
"process": "bandpass",
"stations": [],
"corners": 4,
"bandpass": [
0.5,
30.0
],
"demean": true,
"zero_phase": true
}
],
"octree": {
"location": {
"lat": 0.0,
"lon": 0.0,
"east_shift": 0.0,
"north_shift": 0.0,
"elevation": 0.0,
"depth": 0.0
},
"root_node_size": 1000.0,
"n_levels": 5,
"east_bounds": [
-10000.0,
10000.0
],
"north_bounds": [
-10000.0,
10000.0
],
"depth_bounds": [
0.0,
20000.0
]
},
"image_function": {
"image": "SeisBench",
"picker": {
"threshold_p": 0.1,
"threshold_s": 0.1,
"search_window_seconds": 5.0,
"peak_separation_seconds": 0.1
},
"model": "PhaseNet",
"pretrained": "original",
"window_overlap_samples": 2000,
"torch_use_cuda": true,
"torch_cpu_threads": 4,
"batch_size": 128,
"stack_method": "avg",
"sampling_rate": 100.0,
"phase_map": {
"P": "cake:P",
"S": "cake:S"
},
"weights": {
"P": 1.0,
"S": 1.0
}
},
"ray_tracers": [
{
"tracer": "FastMarching3D",
"phase": "fm3d:P",
"interpolation_method": "cubic",
"nthreads": 0,
"velocity_model": {
"model": "Constant3DVelocityModel",
"grid_spacing": "octree",
"velocity": 5000.0
},
"implementation": "eikonalfm"
},
{
"tracer": "CakeTracer",
"phases": {
"cake:P": {
"definition": "P,p"
},
"cake:S": {
"definition": "S,s"
}
},
"earthmodel": {
"filename": "~/.cache/qseek/velocity_models/default.nd",
"format": "nd",
"crust2_profile": "",
"raw_file_data": null
}
},
{
"tracer": "ConstantVelocityTracer",
"phase": "constant:P",
"velocity": 5000.0
},
{
"tracer": "FastMarching",
"velocity_model": {
"filename": "~/.cache/qseek/velocity_models/default.nd",
"format": "nd",
"crust2_profile": "",
"raw_file_data": null
},
"interpolation_method": "linear",
"nthreads": 0,
"implementation": "eikonalfm",
"phases": [
"fm:P",
"fm:S"
]
}
],
"distance_weights": {
"distance_taper": "mean_interstation",
"required_closest_stations": 4,
"waterlevel": 0.0
},
"station_corrections": null,
"magnitudes": [],
"features": [],
"webserver": {
"host": "0.0.0.0",
"port": "auto"
},
"callbacks": [],
"callback_scripts": [],
"detection_threshold": "MAD",
"min_stations": 3,
"ignore_boundary": "without_surface",
"ignore_boundary_width": "root_node_size",
"node_interpolation": true,
"detection_blinding": "PT1S",
"window_length": "PT5M",
"n_threads": 28,
"save_images": false,
"created": "2026-10-01T21:10:51.073089Z"
}
Start the search¶
Start the search in the directory of the configuration file, since Qseek resolves relative paths from the directory where you start it:
Qseek creates the run directory my-search/, named after the configuration file, in the project_dir of the configuration. project_dir defaults to ., the directory where you start the search. Qseek writes the detections into the run directory while the search runs; if the search stops, continue it.
When the search has detections, look at the run directory and explore the results. The command line reference lists all qseek commands.