{"id":27302713,"url":"https://github.com/savage13/fern","last_synced_at":"2025-04-12T02:48:21.821Z","repository":{"id":136250323,"uuid":"199519512","full_name":"savage13/fern","owner":"savage13","description":"fern - Federated Earthquake data Retrieval via Network","archived":false,"fork":false,"pushed_at":"2020-02-12T15:31:14.000Z","size":759,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":3,"default_branch":"master","last_synced_at":"2024-01-27T07:09:45.737Z","etag":null,"topics":["iris","isc","miniseed","sac","seismology","usgs"],"latest_commit_sha":null,"homepage":"https://savage13.github.io/fern/","language":"C","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/savage13.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"License","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null}},"created_at":"2019-07-29T20:04:17.000Z","updated_at":"2020-02-12T15:31:16.000Z","dependencies_parsed_at":null,"dependency_job_id":"c6620e2b-f0b9-4728-ae0d-da2d02e283f2","html_url":"https://github.com/savage13/fern","commit_stats":{"total_commits":43,"total_committers":2,"mean_commits":21.5,"dds":"0.046511627906976716","last_synced_commit":"eb0e71fc32976f8a0e24a2b6214cd5b018dea402"},"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/savage13%2Ffern","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/savage13%2Ffern/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/savage13%2Ffern/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/savage13%2Ffern/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/savage13","download_url":"https://codeload.github.com/savage13/fern/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248508785,"owners_count":21115865,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["iris","isc","miniseed","sac","seismology","usgs"],"created_at":"2025-04-12T02:48:21.160Z","updated_at":"2025-04-12T02:48:21.813Z","avatar_url":"https://github.com/savage13.png","language":"C","funding_links":[],"categories":[],"sub_categories":[],"readme":"libfern Documentation\n=====================\n\nOverview\n--------\n\nThe libfern library, assocated fern binary, and inferface in sac provides a interface to:\n   - event searches\n   - download data (miniseed format)\n   - station searches\n   - apply station meta-data\n   - apply event meta-data\n   - search for available data\n   - convert miniseed to sac\n   - write miniseed and sac files\n\nExamples using fern and libfern\n---------------------------\n- [Event Search](#Event-Search)\n- [Station Search](#Station-Search)\n- [Search based on Event](#Search-based-on-Event)\n- [Data Availability Search](#Data-Availability-Search)\n- [Data Download to miniseed](#Data-Download-to-miniseed)\n- [Data Download to sac](#Data-Download-to-sac)\n- [Event Search with libfern](#event-fern)\n- [Station Search with libfern](#event-fern)\n- [Data Download with libfern](#data-fern)\n\n### \u003ca name=\"Event-Search\"\u003eEvent Search\u003c/a\u003e\n\nDescription        | Argument\n-------------------|---------\nEvent Search       | `-E`\nMagntiude: 9 - 10  | `-m 9/10`\nTime: 1950 - 2020  | `-t 1950/01/01 2020/01/01`\n\n~~~~~{.sh}\n    fern -E -m 9/10 -t 1950/01/01 2020/01/01\n    Origin              Lat.   Lon.    Depth  Mag.     Agency EventID\n    2011-03-11T05:46:24  38.30  142.37  29.00 9.10 mww US/official - usgs:official20110311054624120_30\n    2004-12-26T00:58:53   3.29   95.98  30.00 9.10 mw  US/official - usgs:official20041226005853450_30\n    1964-03-28T03:36:16  60.91 -147.34  25.00 9.20 mw  iscgem/official - usgs:official19640328033616_30\n    1960-05-22T19:11:20 -38.14  -73.41  25.00 9.50 mw  iscgem/official - usgs:official19600522191120_30\n    1952-11-04T16:58:30  52.62  159.78  21.60 9.00 mw  iscgem/official - usgs:official19521104165830_30\n~~~~~\n\n### \u003ca name=\"Station-Search\"\u003eStation Search\u003c/a\u003e\n\nDescription                   | Argument\n------------------------------|---------\nStation Search                | `-S`\nTime: 1999/01/01 - 1999/01/02 | `-t 1999/01/01 +1day`\nNetwork: IU                   | `-n IU`\nverbose: On                   | `-v`\n\n~~~~~{.sh}\n    fern -S -t 1999/01/01 +1day -n IU\n    Net Sta   Lat.     Lon.      Elev.   SiteName\n    IU  ADK    51.8823 -176.6842  130.00 Adak, Aleutian Islands, Alaska\n    IU  AFI   -13.9093 -171.7773  706.00 Afiamalu, Samoa\n    IU  ANMO   34.9459 -106.4572 1850.00 Albuquerque, New Mexico, USA\n    ...\n    IU  XMAS    2.0448 -157.4457   20.00 Kiritimati Island, Republic of Kiribati\n    IU  YAK    62.0310  129.6805  110.00 Yakutsk, Russia\n    IU  YSS    46.9587  142.7604  150.00 Yuzhno Sakhalinsk, Russia\n~~~~~\n\n### \u003ca name=\"Search-based-on-Event\"\u003eSearch based on Event\u003c/a\u003e\n\nDescription                             | Argument\n----------------------------------------|---------\nEvent search                            | `-E`\nStart time  160th day in 1994           | `-t 1994/160`\nMagntiude 8 - 10                        | `-m 8/10`\nStation search                          | `-S`\nTime: event origin time                 | `-e usgs:usp0006dzc`\nNetwork: IU, XE                         | `-n IU,XE`\nRadial search from event to 35 degrees  | `-r0/35 -e usgs:usp0006dzc`\n\n~~~~~{.sh}\n    fern -E -t 1994/160 +1d -m 8/10\n    Origin              Lat.   Lon.    Depth  Mag.     Agency EventID\n    1994-06-09T00:33:16 -13.84  -67.55 631.30 8.20 mw  US/HRV - usgs:usp0006dzc\n\n    fern -S -e usgs:usp0006dzc -n IU,XE -r0/35\n    Net Sta   Lat.     Lon.      Elev.   SiteName\n    IU  BOCO    4.5869  -74.0432 3160.00 Bogota, Colombia\n    IU  SJG    18.1091  -66.1500  420.00 San Juan, Puerto Rico\n    XE  CHIT  -20.0756  -66.8851 3862.00 -\n    ...\n    XE  SICA  -17.2924  -67.7490 4065.00 -\n    XE  TACA  -18.8279  -66.7331 3810.00 -\n    XE  YUNZ  -19.1581  -65.0700 2896.00 -\n\n    # Equivalent to the following\n    fern -S -t 1994-06-09T00:33:16 +0m  -n IU,XE -O -67.55/-13.84  -r0/35\n    Net Sta   Lat.     Lon.      Elev.   SiteName\n    IU  BOCO    4.5869  -74.0432 3160.00 Bogota, Colombia\n    IU  SJG    18.1091  -66.1500  420.00 San Juan, Puerto Rico\n    XE  CHIT  -20.0756  -66.8851 3862.00 -\n    ...\n    XE  SICA  -17.2924  -67.7490 4065.00 -\n    XE  TACA  -18.8279  -66.7331 3810.00 -\n    XE  YUNZ  -19.1581  -65.0700 2896.00 -\n~~~~~\n\n### \u003ca name=\"Data-Availability-Search\"\u003eData Availability Search\u003c/a\u003e\n\nDescription                             | Argument\n----------------------------------------|---------\nStart time: Event origin time           | `-e usgs:usp0006dzc`\nEnd time: Event origin time +30 minutes | `-e usgs:usp0006dzc -d +30m`\nNetwork: XE                             | `-n XE`\nChannel: BHZ                            | `-c BHZ`\n\n~~~{.sh}\n    fern -D available  -e 'usgs:usp0006dzc' -n XE -d +30m -c BHZ\n    ## REQUEST 1/ 1\n    DATACENTER=IRISDMC,http://ds.iris.edu\n    XE CHIT -- BHZ 1994-06-09T00:33:16 1994-06-09T01:03:16\n    XE CHUQ -- BHZ 1994-06-09T00:33:16 1994-06-09T01:03:16\n    XE COLL -- BHZ 1994-06-09T00:33:16 1994-06-09T01:03:16\n    ...\n    XE SICA -- BHZ 1994-06-09T00:33:16 1994-06-09T01:03:16\n    XE TACA -- BHZ 1994-06-09T00:33:16 1994-06-09T01:03:16\n    XE YUNZ -- BHZ 1994-06-09T00:33:16 1994-06-09T01:03:16\n~~~\n\n### \u003ca name=\"Data-Download-to-miniseed\"\u003eData Download to miniseed\u003c/a\u003e\n\nDescription                             | Argument\n----------------------------------------|---------\nDownload miniseed data                  | `-D miniseed`\nStart time from event origin            | `-e usgs:usp0006dzc`\nEnd time from event origin + 30 minutes | `-e usgs:usp0006dzc -d +30m`\nNetwork: XE                             | `-n XE`\nChannel: BHZ                            | `-n BHZ`\n\n~~~{.sh}\n    fern -D miniseed   -e 'usgs:usp0006dzc' -n XE -d +30m -c BHZ\n    Data Center: IRISDMC,http://ds.iris.edu\n            Writing data to fdsnws.2019.07.20.10.56.28.IRISDMC.mseed [968.00 KiB]\n~~~\n\n### \u003ca name=\"Data-Download-to-sac\"\u003eData Download to sac\u003c/a\u003e\n\nDescription                             | Argument\n----------------------------------------|---------\nDownload miniseed data                  | `-D sac`\nStart time from event origin            | `-e usgs:usp0006dzc`\nEnd time from event origin + 30 minutes | `-e usgs:usp0006dzc -d +30m`\nNetwork: XE                             | `-n XE`\nChannel: BHZ                            | `-n BHZ`\nStation: DOOR                           | `-s DOOR`\n\n~~~{.sh}\n    fern -D sac   -e 'usgs:usp0006dzc' -n XE -v -d +30m -c BHZ -s DOOR\n    Data Center: IRISDMC,http://ds.iris.edu\n    Working on file: XE.DOOR..BHZ.M.1994.160.003321.sac [ OK ]\n            Writing data to XE.DOOR..BHZ.M.1994.160.003321.sac [ 70.73 KiB]\n~~~\n\n#### Meta Data Insertion\n**Station meta data** is autoomatically set if sac conversion is requested:\n    - Station Latitude (stla)\n    - Station Longitude (stlo)\n    - Station Elevation (stel)\n    - Station Depth (stdp) , always 0.0\n    - Component Azimuth (cmpaz)\n    - Component Inclination (cmpinc)\n\n**Event meta data** is automatically set of an event parameter is used and sac conversion is requested:\n    - Event Latitude (evla)\n    - Event Longitude (evlo)\n    - Event Depth (evdp)\n    - Event Elevation (evel), always 0.0\n    - Event Name (kevnm)\n    - Origin Time (kzdate, kztime)\n    - Reference Time (iztype) set to IO, i.e. event origin time\n    - All other times are shifted to the reference time\n    - The following are computed:\n      - Distance (dist)\n      - Great Circle Arc (gcarc)\n      - Azimuth  (az)\n      - Back azimuth (baz)\n\nExamples using libfern\n----------------------\n\n#### \u003ca name=\"event-fern\"\u003eEvent Search with libfern\u003c/a\u003e\n\n```c\n// Contstruct a request\n//  Magnitude: 8 - 10\n//  Time:      1994/160 - 1994/161\n//  Depth:     400.0 - 700.0 km\n//  Verbose:   On\nrequest *r = event_req_new();\nrequest_set_url(r, \"https://earthquake.usgs.gov/fdsnws/event/1/query?\");\nevent_req_set_mag(r, 8.0, 10.0);\nevent_req_set_depth(r, 400.0, 700.0);\nevent_req_set_time_range(r,\n                         timespec64_from_yjhmsf(1994, 160, 0, 0, 0, 0),\n                         timespec64_from_yjhmsf(1994, 161, 0, 0, 0, 0));\nrequest_set_verbose(r, 1);\n\n// Get request and check result\nresult *res = request_get(r);\nif(!result_is_ok(res)) {\n    return -1;\n}\n// Parse quake xml output\nint verbose = 1;\nchar catalog[5] = \"usgs\";\nEvent **ev = quake_xml_parse(result_data(res), result_len(res), verbose, catalog);\n\n// Print out the events\nevents_write(ev, stdout);\n```\n\n#### \u003ca name=\"station-fern\"\u003eStation Search with libfern\u003c/a\u003e\n\n```c\n// Construct a request\n// Time:     1994/160 - 1994/161\n// Network:  XE\n// Channel:  BH?\n// Region:   -180/180/-90/0\nrequest *r = station_req_new();\nstation_req_set_time_range(r,\n                           timespec64_from_yjhmsf(1994, 160, 0, 0, 0, 0),\n                           timespec64_from_yjhmsf(1994, 161, 0, 0, 0, 0));\nstation_req_set_network(r, \"XE\");\nstation_req_set_channel(r, \"BH?\");\nstation_req_set_region(r, -180.0, 180.0, -90.0, 0.0);\nrequest_set_verbose(r, 1);\n// Get request and check result\nresult *res = request_get(r);\nif(!result_is_ok(res)) {\n    return -1;\n}\n// Parse station xml output\nint verbose   = 1;\nint epochs    = 1;\nint show_time = 1;\nstation **st = station_xml_parse(result_data(res), result_len(res), epochs, verbose);\nif(st == NULL) {\n    return -1;\n}\n// Print out the stations\nstations_write(st, show_time, stdout);\n```\n\n#### \u003ca name=\"data-fern\"\u003eData Download with libfern\u003c/a\u003e\n\n```c\nsize_t i = 0;\n// Create a Data Request\n// Origin(Lon, Lat):  -67.55, -13.84  (Deep Bolivia Event 1994)\n// Time:              1994/160 00:33:16 - 1994/160 01:03:16\n// Network:           IU,XE\n// Radius:            0 - 35 degrees\nfprintf(stderr, \"Data Download init\\n\");\nEvent *ev = event_from_id(\"usgs:usp0006dzc\");\nfprintf(stderr, \"event: %p\\n\", ev);\nif(!ev) {\n    fprintf(stderr, \"event undefined: %p\\n\", ev);\n    return -1;\n}\nrequest *r = data_avail_new();\ndata_avail_set_origin(r, -67.55, -13.84);\n// Alternative using an event (Location)\n// data_avail_set_origin(r, event_lon(ev), event_lat(ev));\ndata_avail_set_radius(r, 0.0, 35.0);\ndata_avail_set_network(r, \"IU,XE\");\ndata_avail_set_channel(r, \"BHZ\");\ndata_avail_set_station(r, \"DOOR\");\ndata_avail_set_time_range(r,\n                          timespec64_from_yjhmsf(1994, 160, 0, 33, 16, 0),\n                          timespec64_from_yjhmsf(1994, 160, 1, 03, 16, 0));\n// Alternative using the event (time)\n// duration d = { 0, 0 };\n// duration_parse(\u0026d, \"30m\");\n// timespec64 start = event_time(ev);\n// timespec64 end   = timespec64_add_duration(start, \u0026dur);\n// data_avail_set_time(r, start, end);\nrequest_set_verbose(r, 1);\n// Get request and check result\nresult *res = request_get(r);\nif(!result_is_ok(res)) {\n    printf(\"request is not ok\\n\");\n    return -1;\n}\nfprintf(stderr, \"request is ok\\n\");\n// Parse the result into a data request\ndata_request *dr = data_request_parse( result_data(res) );\n// Print a formatted data request\ndata_request_write(dr, stdout);\n// Write the data request to an actual file (optional)\n// data_request_write_to_file(dr, \"data.request\");\n// The request can be split into multiple pieces based on request size in MB\n//    Optional, but can be useful for long duration requests that last longer\n//     than a traditional earthquake record.  It is ok, the libmseed library can\n//    magically merge the request files back together again, provided there\n//    are no data gaps.\n// data_request_chunks(dr, 100);\n// Download the data !!!\n// Download the all of the requests\nMS3TraceList *mst3k = NULL;\nint save_files  = 1;\nint unpack_data = 1;\nmst3k = data_request_download(dr, \"data.request\", \"miniseed_prefix\",\n                              save_files, unpack_data);\n// Convert miniseed trace list to sac files\nsac **s = NULL;\ns = miniseed_trace_list_to_sac(mst3k);\n// Insert station meta data for sac files\nint verbose = 1;\nsac_array_fill_meta_data(s, verbose);\n// Or from a file\n// sac_fill_meta_data_from_file(s, verbose, \"station.xml\");\n// sac_fill_meta_data_from_file(s, verbose, \"station.json\");\n// Insert event meta data if event is available\n// Use the Bolivian Event from above\nsac_array_fill_meta_data_from_event(s, ev, verbose);\n// Calculate distance, azimuth, ...\nfor(i = 0; i \u003c xarray_length(s); i++) {\n    update_distaz(s[i]);  // Function in sacio\n}\n// Write out sac files\n//   A filename is defined in an extra meta data sac header\n//   The extra meta data is not written out to the file\nint nerr = 0;\nfor(i = 0; i \u003c xarray_length(s); i++) {\n    sac_write(s[i], s[i]-\u003em-\u003efilename, \u0026nerr);\n }\n```\n\nRequirements\n------------\n\n- libmseed - https://github.com/iris-edu/libmseed\n- libsacio (IRIS/LLNL) - http://ds.iris.edu/ds/nodes/dmc/forms/sac/\n- libsacio (BSD) - http://https://github.com/savage13/sacio\n- libcurl - https://curl.haxx.se/libcurl/ (On most systems)\n- libxml2 - http://www.xmlsoft.org/ (On most systems)\n- cJSON - https://github.com/DaveGamble/cJSON (Included)\n- 64-bit time https://github.com/evalEmpire/y2038 (Included)\n\nDownloading and installing\n--------------------------\n\nPlease report issues to the project.\n\nIf you would like to contribute to the project please file Pull Requests and/or create issues for discussion at the libfern project.\n\nLicense\n-------\n\nLicensed under the Apache License, Version 2.0 (the \"License\"); you may not use this software except in compliance with the License. You may obtain a copy of the License at\n\nhttp://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsavage13%2Ffern","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fsavage13%2Ffern","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsavage13%2Ffern/lists"}