33from datetime import datetime
44from typing import TYPE_CHECKING
55
6+ import pyarrow as pa
7+ from deltalake import DeltaTable , QueryBuilder
8+ from emmet .core .mpid import AlphaID
69from emmet .core .tasks import CoreTaskDoc
10+ from emmet .core .trajectory import RelaxTrajectory
711
812from mp_api .client .core import BaseRester , MPRestError
913from mp_api .client .core .utils import validate_ids
@@ -16,6 +20,7 @@ class TaskRester(BaseRester):
1620 suffix : str = "materials/tasks"
1721 document_model : type [BaseModel ] = CoreTaskDoc # type: ignore
1822 primary_key : str = "task_id"
23+ delta_backed = True
1924
2025 def get_trajectory (self , task_id ):
2126 """Returns a Trajectory object containing the geometry of the
@@ -26,16 +31,30 @@ def get_trajectory(self, task_id):
2631 task_id (str): Task ID
2732
2833 """
29- traj_data = self ._query_resource_data (
30- {"task_ids" : [task_id ]}, suburl = "trajectory/" , use_document_model = False
31- )[0 ].get (
32- "trajectories" , None
33- ) # type: ignore
34+ as_alpha = str (AlphaID (task_id , padlen = 8 )).split ("-" )[- 1 ]
3435
35- if traj_data is None :
36+ traj_tbl = DeltaTable (
37+ "s3a://materialsproject-parsed/core/trajectories/" ,
38+ storage_options = {"AWS_SKIP_SIGNATURE" : "true" , "AWS_REGION" : "us-east-1" },
39+ )
40+
41+ traj_data = pa .table (
42+ QueryBuilder ()
43+ .register ("traj" , traj_tbl )
44+ .execute (
45+ f"""
46+ SELECT *
47+ FROM traj
48+ WHERE identifier='{ as_alpha } '
49+ """
50+ )
51+ .read_all ()
52+ ).to_pylist (maps_as_pydicts = "strict" )
53+
54+ if not traj_data :
3655 raise MPRestError (f"No trajectory data for { task_id } found" )
3756
38- return traj_data
57+ return RelaxTrajectory ( ** traj_data [ 0 ]). to_pmg ()
3958
4059 def search (
4160 self ,
0 commit comments