diff --git a/geomagio/residual/Absolute.py b/geomagio/residual/Absolute.py
index 1339ad5f6b8f8c29acaab411ca5320d63a442a71..ebdf59dab740d2ca9dd13dc840383672d35727e8 100644
--- a/geomagio/residual/Absolute.py
+++ b/geomagio/residual/Absolute.py
@@ -4,6 +4,9 @@ from obspy import UTCDateTime
 from pydantic import BaseModel
 from ..pydantic_utcdatetime import CustomUTCDateTimeType
 
+AbsoluteShiftDefault = 0
+AbsoluteValidDefault = True
+
 
 class Absolute(BaseModel):
     """Computed absolute and baseline measurement.
@@ -27,8 +30,8 @@ class Absolute(BaseModel):
     starttime: Optional[CustomUTCDateTimeType] = None
     endtime: Optional[CustomUTCDateTimeType] = None
 
-    shift: float = 0
-    valid: bool = True
+    shift: float = AbsoluteShiftDefault
+    valid: bool = AbsoluteValidDefault
 
     def is_valid(self) -> bool:
         return (
diff --git a/geomagio/residual/Calculation.py b/geomagio/residual/Calculation.py
index 6c415f0b6ceaecd663d6fd552cf2c6977de9b552..d74225c3f8bd18047044da655e48fdcb86ccca4b 100644
--- a/geomagio/residual/Calculation.py
+++ b/geomagio/residual/Calculation.py
@@ -2,7 +2,7 @@ from typing import List, Literal, Tuple
 
 import numpy as np
 
-from .Absolute import Absolute
+from .Absolute import Absolute, AbsoluteShiftDefault, AbsoluteValidDefault
 from .MeasurementType import (
     MeasurementType as mt,
     DECLINATION_TYPES,
@@ -59,7 +59,7 @@ def calculate(reading: Reading, adjust_reference: bool = True) -> Reading:
         h_baseline=absoluteH.baseline,
         measurements=reading.measurements,
         reference=reference,
-        shift=reading.absolutes[0].shift if reading.absolutes else 0,
+        shift=reading.absolutes[0].shift if reading.absolutes else AbsoluteShiftDefault,
     )
 
     d_computed = calculate_D_computed(
@@ -130,10 +130,22 @@ def calculate(reading: Reading, adjust_reference: bool = True) -> Reading:
     )
 
     # just persist Absolute.valid if passed to calculate
-    if reading.absolutes:
-        absoluteD.valid = reading.absolutes[0].valid
-        absoluteH.valid = reading.absolutes[1].valid
-        absoluteZ.valid = reading.absolutes[2].valid
+    if hasattr(reading.absolutes, "__iter__") and len(reading.absolutes) == 3:
+        absoluteD.valid = (
+            reading.absolutes[0].valid
+            if hasattr(reading.absolutes[0], "valid")
+            else AbsoluteValidDefault
+        )
+        absoluteH.valid = (
+            reading.absolutes[1].valid
+            if hasattr(reading.absolutes[1], "valid")
+            else AbsoluteValidDefault
+        )
+        absoluteZ.valid = (
+            reading.absolutes[2].valid
+            if hasattr(reading.absolutes[2], "valid")
+            else AbsoluteValidDefault
+        )
 
     # create new reading object
     calculated = Reading(
@@ -152,7 +164,7 @@ def calculate_D_absolute(
     azimuth: float,
     h_baseline: float,
     reference: Measurement,
-    shift: float = 0,
+    shift: float = AbsoluteShiftDefault,
 ) -> Tuple[Absolute, Diagnostics]:
     """Calculate D absolute.