def calculate_harmonics(forward_volume, back_volume, n_order=8):
# match the markers
matched_markers = MatchedMarkerVolumes(ct_volume, forward_volume, sorting_method='radial', ReferenceMarkers=11,
WarpSearchData=True, ReverseGradientData=back_volume)
matched_markers.MatchedCentroids.to_csv('MatchedMarkerVolume.csv')
# calculate B fields
B_fields = ConvertMatchedMarkersToBz(matched_markers.MatchedCentroids, forward_volume.dicom_data)
# calculate harmonics
# B0
B0_data = B_fields.MagneticFields[['x', 'y', 'z', 'B0']]
B0_data = B0_data.rename(
columns={"B0": "Bz"}) # spherical harmonics code expects to receieve one field called Bz
B0_Harmonics = SphericalHarmonicFit(B0_data, n_order=n_order, r_outer=150)
# Gx
GradXdata = B_fields.MagneticFields[['x', 'y', 'z', 'B_Gx']]
GradXdata = GradXdata.rename(
columns={"B_Gx": "Bz"}) # spherical harmonics code expects to receieve one field called Bz
G_x_Harmonics = SphericalHarmonicFit(GradXdata, n_order=n_order, r_outer=150)
G_x_Harmonics.harmonics.to_csv('G_x_harmonics.csv')
# Gy
GradYdata = B_fields.MagneticFields[['x', 'y', 'z', 'B_Gy']]
GradYdata = GradYdata.rename(
columns={"B_Gy": "Bz"}) # spherical harmonics code expects to receieve one field called Bz
G_y_Harmonics = SphericalHarmonicFit(GradYdata, n_order=n_order, r_outer=150)
G_y_Harmonics.harmonics.to_csv('G_y_harmonics.csv')
# G_z
GradZdata = B_fields.MagneticFields[['x', 'y', 'z', 'B_Gz']]
GradZdata = GradZdata.rename(
columns={"B_Gz": "Bz"}) # spherical harmonics code expects to receieve one field called Bz
G_z_Harmonics = SphericalHarmonicFit(GradZdata, n_order=n_order, r_outer=150)
G_z_Harmonics.harmonics.to_csv('G_z_harmonics.csv')
return B0_Harmonics, G_x_Harmonics, G_y_Harmonics, G_z_Harmonics