code: def fit_ahrs(A, H, Aoff, Arot, Hoff, Hrot):
      
      Acal = np.dot(A - Aoff, Arot)
      Hcal = np.dot(H - Hoff, Hrot)
  
      # invert axis for DOM upside down
      for i in (1, 2):
          Acal[i] = -Acal[i]
          Hcal[i] = -Hcal[i]
  
      roll = arctan2(-Acal[1], -Acal[2])
      pitch = arctan2(Acal[0], np.sqrt(Acal[1] * Acal[1] + Acal[2] * Acal[2]))
      yaw = arctan2(
          Hcal[2] * sin(roll) - Hcal[1] * cos(roll),
          sum((
              Hcal[0] * cos(pitch), Hcal[1] * sin(pitch) * sin(roll),
              Hcal[2] * sin(pitch) * cos(roll)
          ))
      )
  
      yaw = np.degrees(yaw)
      while yaw < 0:
          yaw += 360
      # yaw = (yaw + magnetic_declination + 360 ) % 360
      roll = np.degrees(roll)
      pitch = np.degrees(pitch)
      return yaw, pitch, roll
docs: Calculate yaw, pitch and roll for given A/H and calibration set.
  
      Author: Vladimir Kulikovsky
  
      Parameters
      ----------
      A: list, tuple or numpy.array of shape (3,)
      H: list, tuple or numpy.array of shape (3,)
      Aoff: numpy.array of shape(3,)
      Arot: numpy.array of shape(3, 3)
      Hoff: numpy.array of shape(3,)
      Hrot: numpy.array of shape(3, 3)
  
      Returns
      -------
      yaw, pitch, roll