Loading CMakeLists.txt +3 −0 Original line number Diff line number Diff line Loading @@ -88,8 +88,10 @@ if(SPICEQL_BUILD_LIB) ${CMAKE_CURRENT_SOURCE_DIR}/SpiceQL/db/apollo17.json ${CMAKE_CURRENT_SOURCE_DIR}/SpiceQL/db/base.json ${CMAKE_CURRENT_SOURCE_DIR}/SpiceQL/db/cassini.json ${CMAKE_CURRENT_SOURCE_DIR}/SpiceQL/db/chandrayaan1.json ${CMAKE_CURRENT_SOURCE_DIR}/SpiceQL/db/clem1.json ${CMAKE_CURRENT_SOURCE_DIR}/SpiceQL/db/galileo.json ${CMAKE_CURRENT_SOURCE_DIR}/SpiceQL/db/hayabusa.json ${CMAKE_CURRENT_SOURCE_DIR}/SpiceQL/db/hayabusa2.json ${CMAKE_CURRENT_SOURCE_DIR}/SpiceQL/db/juno.json ${CMAKE_CURRENT_SOURCE_DIR}/SpiceQL/db/kaguya.json Loading @@ -102,6 +104,7 @@ if(SPICEQL_BUILD_LIB) ${CMAKE_CURRENT_SOURCE_DIR}/SpiceQL/db/mgs.json ${CMAKE_CURRENT_SOURCE_DIR}/SpiceQL/db/mro.json ${CMAKE_CURRENT_SOURCE_DIR}/SpiceQL/db/msl.json ${CMAKE_CURRENT_SOURCE_DIR}/SpiceQL/db/newhorizons.json ${CMAKE_CURRENT_SOURCE_DIR}/SpiceQL/db/odyssey.json ${CMAKE_CURRENT_SOURCE_DIR}/SpiceQL/db/smart1.json ${CMAKE_CURRENT_SOURCE_DIR}/SpiceQL/db/tgo.json Loading SpiceQL/src/query.cpp +1 −1 Original line number Diff line number Diff line Loading @@ -142,7 +142,7 @@ namespace SpiceQL { for (json::json_pointer &ptr : kptrs) { SPDLOG_TRACE("Getting Latest Kernels from: {}", ptr.to_string()); SPDLOG_TRACE("JSON: {}", kernels[ptr]); SPDLOG_TRACE("JSON: {}", kernels[ptr].dump()); vector<vector<string>> kvect = json2DArrayTo2DVector(kernels[ptr]); vector<vector<string>> newLatest; Loading SpiceQL/src/spice_types.cpp +4 −1 Original line number Diff line number Diff line Loading @@ -279,12 +279,15 @@ namespace SpiceQL { string doubleEtToSclk(int frameCode, double et, string mission, bool searchKernels) { Config missionConf; json lsks; json sclks; if (searchKernels) { sclks = Inventory::search_for_kernelset(mission, {"lsk", "fk", "sclk"}); lsks = Inventory::search_for_kernelset("base", {"lsk"}); sclks = Inventory::search_for_kernelset(mission, {"fk", "sclk"}); } KernelSet lskSet(lsks); KernelSet sclkSet(sclks); SpiceChar sclk[100]; Loading SpiceQL/src/utils.cpp +1 −1 Original line number Diff line number Diff line Loading @@ -211,7 +211,7 @@ namespace SpiceQL { json ephemKernels = {}; if (searchKernels) { ephemKernels = Inventory::search_for_kernelsets({mission, observer, "base"}, {"sclk", "ck", "spk", "pck", "tspk", "fk", "lsk", "fk"}, ets.front(), ets.back(), ckQuality, spkQuality); ephemKernels = Inventory::search_for_kernelsets({mission, target, observer, "base"}, {"sclk", "ck", "spk", "pck", "tspk", "fk", "lsk", "fk"}, ets.front(), ets.back(), ckQuality, spkQuality); SPDLOG_DEBUG("{} Kernels : {}", mission, ephemKernels.dump(4)); } Loading fastapi/app/main.py +67 −6 Original line number Diff line number Diff line """Module providing SpiceQL endpoints""" from ast import literal_eval from typing import Any from fastapi import FastAPI from typing import Annotated, Any from fastapi import FastAPI, Query from pydantic import BaseModel, Field from starlette.responses import RedirectResponse import numpy as np Loading @@ -28,6 +28,19 @@ class ResponseModel(BaseModel): statusCode: int body: ResultModel | ErrorModel class TargetStatesRequestModel(BaseModel): target: str observer: str frame: str abcorr: str mission: str ets: Annotated[list[float], Query()] | float | str | None = None startEts: float | None = None exposureDuration: float | None = None numOfExposures: int | None = None ckQuality: str = "predicted" spkQuality: str = "predicted" # Create FastAPI instance app = FastAPI() Loading Loading @@ -61,10 +74,17 @@ async def getTargetStates( if ets is not None: if isinstance(ets, str): ets = literal_eval(ets) else: # getTargetStates requires an iterable ets. If not iterable, make it a list. try: iter(ets) except TypeError: ets = [ets] else: if all(v is not None for v in [startEts, exposureDuration, numOfExposures]): stopEts = (exposureDuration * numOfExposures) + startEts etsNpArray = np.arange(startEts, stopEts, exposureDuration) # If ets is a single value, np.arange yields an empty array ets = list(etsNpArray) else: raise Exception("Verify that a startEts, exposureDuration, and numOfExposures are being passed correctly.") Loading @@ -75,6 +95,46 @@ async def getTargetStates( body = ErrorModel(error=str(e)) return ResponseModel(statusCode=500, body=body) @app.post("/getTargetStates") async def getTargetStates(params: TargetStatesRequestModel): target = params.target observer = params.observer frame = params.frame abcorr = params.abcorr mission = params.mission ets = params.ets startEts = params.startEts exposureDuration = params.exposureDuration numOfExposures = params.numOfExposures ckQuality = params.ckQuality spkQuality = params.spkQuality try: if ets is not None: if isinstance(ets, str): ets = literal_eval(ets) else: # getTargetStates requires an iterable ets. If not iterable, make it a list. try: iter(ets) except TypeError: ets = [ets] else: if all(v is not None for v in [startEts, exposureDuration, numOfExposures]): stopEts = (exposureDuration * numOfExposures) + startEts etsNpArray = np.arange(startEts, stopEts, exposureDuration) # If ets is a single value, np.arange yields an empty array ets = list(etsNpArray) else: raise Exception("Verify that startEts, exposureDuration, and numOfExposures are being passed correctly.") result = pyspiceql.getTargetStates(ets, target, observer, frame, abcorr, mission, ckQuality, spkQuality, SEARCH_KERNELS_BOOL) body = ResultModel(result=result) return ResponseModel(statusCode=200, body=body) except Exception as e: body = ErrorModel(error=str(e)) return ResponseModel(statusCode=500, body=body) @app.get("/getTargetOrientations") async def getTargetOrientations( toFrame: int, Loading @@ -95,7 +155,7 @@ async def getTargetOrientations( etsNpArray = np.arange(startEts, stopEts, exposureDuration) ets = list(etsNpArray) else: raise Exception("Verify that a startEts, exposureDuration, and numOfExposures are being passed correctly.") raise Exception("Verify that startEts, exposureDuration, and numOfExposures are being passed correctly.") result = pyspiceql.getTargetOrientations(ets, toFrame, refFrame, mission, ckQuality, SEARCH_KERNELS_BOOL) body = ResultModel(result=result) return ResponseModel(statusCode=200, body=body) Loading @@ -103,6 +163,7 @@ async def getTargetOrientations( body = ErrorModel(error=str(e)) return ResponseModel(statusCode=500, body=body) @app.get("/strSclkToEt") async def strSclkToEt( frameCode: int, Loading Loading @@ -132,7 +193,7 @@ async def doubleSclkToEt( @app.get("/doubleEtToSclk") async def strSclkToEt( async def doubleEtToSclk( frameCode: int, et: float, mission: str): Loading Loading
CMakeLists.txt +3 −0 Original line number Diff line number Diff line Loading @@ -88,8 +88,10 @@ if(SPICEQL_BUILD_LIB) ${CMAKE_CURRENT_SOURCE_DIR}/SpiceQL/db/apollo17.json ${CMAKE_CURRENT_SOURCE_DIR}/SpiceQL/db/base.json ${CMAKE_CURRENT_SOURCE_DIR}/SpiceQL/db/cassini.json ${CMAKE_CURRENT_SOURCE_DIR}/SpiceQL/db/chandrayaan1.json ${CMAKE_CURRENT_SOURCE_DIR}/SpiceQL/db/clem1.json ${CMAKE_CURRENT_SOURCE_DIR}/SpiceQL/db/galileo.json ${CMAKE_CURRENT_SOURCE_DIR}/SpiceQL/db/hayabusa.json ${CMAKE_CURRENT_SOURCE_DIR}/SpiceQL/db/hayabusa2.json ${CMAKE_CURRENT_SOURCE_DIR}/SpiceQL/db/juno.json ${CMAKE_CURRENT_SOURCE_DIR}/SpiceQL/db/kaguya.json Loading @@ -102,6 +104,7 @@ if(SPICEQL_BUILD_LIB) ${CMAKE_CURRENT_SOURCE_DIR}/SpiceQL/db/mgs.json ${CMAKE_CURRENT_SOURCE_DIR}/SpiceQL/db/mro.json ${CMAKE_CURRENT_SOURCE_DIR}/SpiceQL/db/msl.json ${CMAKE_CURRENT_SOURCE_DIR}/SpiceQL/db/newhorizons.json ${CMAKE_CURRENT_SOURCE_DIR}/SpiceQL/db/odyssey.json ${CMAKE_CURRENT_SOURCE_DIR}/SpiceQL/db/smart1.json ${CMAKE_CURRENT_SOURCE_DIR}/SpiceQL/db/tgo.json Loading
SpiceQL/src/query.cpp +1 −1 Original line number Diff line number Diff line Loading @@ -142,7 +142,7 @@ namespace SpiceQL { for (json::json_pointer &ptr : kptrs) { SPDLOG_TRACE("Getting Latest Kernels from: {}", ptr.to_string()); SPDLOG_TRACE("JSON: {}", kernels[ptr]); SPDLOG_TRACE("JSON: {}", kernels[ptr].dump()); vector<vector<string>> kvect = json2DArrayTo2DVector(kernels[ptr]); vector<vector<string>> newLatest; Loading
SpiceQL/src/spice_types.cpp +4 −1 Original line number Diff line number Diff line Loading @@ -279,12 +279,15 @@ namespace SpiceQL { string doubleEtToSclk(int frameCode, double et, string mission, bool searchKernels) { Config missionConf; json lsks; json sclks; if (searchKernels) { sclks = Inventory::search_for_kernelset(mission, {"lsk", "fk", "sclk"}); lsks = Inventory::search_for_kernelset("base", {"lsk"}); sclks = Inventory::search_for_kernelset(mission, {"fk", "sclk"}); } KernelSet lskSet(lsks); KernelSet sclkSet(sclks); SpiceChar sclk[100]; Loading
SpiceQL/src/utils.cpp +1 −1 Original line number Diff line number Diff line Loading @@ -211,7 +211,7 @@ namespace SpiceQL { json ephemKernels = {}; if (searchKernels) { ephemKernels = Inventory::search_for_kernelsets({mission, observer, "base"}, {"sclk", "ck", "spk", "pck", "tspk", "fk", "lsk", "fk"}, ets.front(), ets.back(), ckQuality, spkQuality); ephemKernels = Inventory::search_for_kernelsets({mission, target, observer, "base"}, {"sclk", "ck", "spk", "pck", "tspk", "fk", "lsk", "fk"}, ets.front(), ets.back(), ckQuality, spkQuality); SPDLOG_DEBUG("{} Kernels : {}", mission, ephemKernels.dump(4)); } Loading
fastapi/app/main.py +67 −6 Original line number Diff line number Diff line """Module providing SpiceQL endpoints""" from ast import literal_eval from typing import Any from fastapi import FastAPI from typing import Annotated, Any from fastapi import FastAPI, Query from pydantic import BaseModel, Field from starlette.responses import RedirectResponse import numpy as np Loading @@ -28,6 +28,19 @@ class ResponseModel(BaseModel): statusCode: int body: ResultModel | ErrorModel class TargetStatesRequestModel(BaseModel): target: str observer: str frame: str abcorr: str mission: str ets: Annotated[list[float], Query()] | float | str | None = None startEts: float | None = None exposureDuration: float | None = None numOfExposures: int | None = None ckQuality: str = "predicted" spkQuality: str = "predicted" # Create FastAPI instance app = FastAPI() Loading Loading @@ -61,10 +74,17 @@ async def getTargetStates( if ets is not None: if isinstance(ets, str): ets = literal_eval(ets) else: # getTargetStates requires an iterable ets. If not iterable, make it a list. try: iter(ets) except TypeError: ets = [ets] else: if all(v is not None for v in [startEts, exposureDuration, numOfExposures]): stopEts = (exposureDuration * numOfExposures) + startEts etsNpArray = np.arange(startEts, stopEts, exposureDuration) # If ets is a single value, np.arange yields an empty array ets = list(etsNpArray) else: raise Exception("Verify that a startEts, exposureDuration, and numOfExposures are being passed correctly.") Loading @@ -75,6 +95,46 @@ async def getTargetStates( body = ErrorModel(error=str(e)) return ResponseModel(statusCode=500, body=body) @app.post("/getTargetStates") async def getTargetStates(params: TargetStatesRequestModel): target = params.target observer = params.observer frame = params.frame abcorr = params.abcorr mission = params.mission ets = params.ets startEts = params.startEts exposureDuration = params.exposureDuration numOfExposures = params.numOfExposures ckQuality = params.ckQuality spkQuality = params.spkQuality try: if ets is not None: if isinstance(ets, str): ets = literal_eval(ets) else: # getTargetStates requires an iterable ets. If not iterable, make it a list. try: iter(ets) except TypeError: ets = [ets] else: if all(v is not None for v in [startEts, exposureDuration, numOfExposures]): stopEts = (exposureDuration * numOfExposures) + startEts etsNpArray = np.arange(startEts, stopEts, exposureDuration) # If ets is a single value, np.arange yields an empty array ets = list(etsNpArray) else: raise Exception("Verify that startEts, exposureDuration, and numOfExposures are being passed correctly.") result = pyspiceql.getTargetStates(ets, target, observer, frame, abcorr, mission, ckQuality, spkQuality, SEARCH_KERNELS_BOOL) body = ResultModel(result=result) return ResponseModel(statusCode=200, body=body) except Exception as e: body = ErrorModel(error=str(e)) return ResponseModel(statusCode=500, body=body) @app.get("/getTargetOrientations") async def getTargetOrientations( toFrame: int, Loading @@ -95,7 +155,7 @@ async def getTargetOrientations( etsNpArray = np.arange(startEts, stopEts, exposureDuration) ets = list(etsNpArray) else: raise Exception("Verify that a startEts, exposureDuration, and numOfExposures are being passed correctly.") raise Exception("Verify that startEts, exposureDuration, and numOfExposures are being passed correctly.") result = pyspiceql.getTargetOrientations(ets, toFrame, refFrame, mission, ckQuality, SEARCH_KERNELS_BOOL) body = ResultModel(result=result) return ResponseModel(statusCode=200, body=body) Loading @@ -103,6 +163,7 @@ async def getTargetOrientations( body = ErrorModel(error=str(e)) return ResponseModel(statusCode=500, body=body) @app.get("/strSclkToEt") async def strSclkToEt( frameCode: int, Loading Loading @@ -132,7 +193,7 @@ async def doubleSclkToEt( @app.get("/doubleEtToSclk") async def strSclkToEt( async def doubleEtToSclk( frameCode: int, et: float, mission: str): Loading