VMCTools

static VMCTools.readVMCImageAndGeoCube(VMCImageFileName)
Parameters:

VMCImageFileName (str) – file name (and path) of the VMC image file. It is assumed the .IMG and .GEO have the same file name.

Returns:

VMC image as PDS3Image and flattened NumPy array, and the VMC geocube as PDS3Image as list of five flattened NumPy arrays.

Return type:

planetaryimage.pds3image.PDS3Image, NumPy array, planetaryimage.pds3image.PDS3Image, list [NumPy array x 5]

Description: Read the content of a VMC image (.IMG) and corresponding geo-cube (.GEO).

The VMCImage is a PDS3Image object (planetaryimage module), with several attributes. The image attribute contains the uncalibrated image. For more easy manipulation, the image is also returned as flattened NumPy array.

The VMCGeoCube is a PDS3Image object, with several attributes. The data attribute contains the planes:

VMCGeoCube.data [0] Incidence Angle
VMCGeoCube.data [1] Emission Angle
VMCGeoCube.data [2] Phase Angle
VMCGeoCube.data [3] Latitude
VMCGeoCube.data [4] Longitude

For more easy manipulation, each plane is returned as a flattened NumPy array, and the five arrays are packed in the VMCGeoArraysFlattened list.

The longitude values stored in the .GEO files go from -180˚ to +180˚. In this function the longitude values are transformed so that they run between 0˚ to +360˚. In this plot it is shown the transformation is done correctly.

_images/longitudeTransformationCheck.png
static VMCTools.VMCPhotometry(VMCImage, VMCImageFlattened, VMCGeoCube, VMCGeoArraysFlattened, incidenceAngleLimit=89, emissionAngleLimit=89, applyLambertLaw=True, silent=False)
Parameters:
  • VMCImage (planetaryimage.pds3image.PDS3Image) –

    PDS3Image object (planetaryimage module) from reading a VMC .IMG file.

  • VMCImageFlattened (1D NumPy array) – flattened 1D array of the calibrated radiance factors of the entire VMC image.

  • VMCGeoCube (planetaryimage.pds3image.PDS3Image) –

    PDS3Image object (planetaryimage module) from reading a VMC .GEO file.

  • VMCGeoArraysFlattened (list [NumPy array x 5], see description of readVMCImageAndGeoCube()) – flattened 1D array of the calibrated radiance factors of the entire VMC image.

  • emissionAngleLimit (float) – valid pixels must have emission angle smaller or equal to incidenceAngleLimit .

  • incidenceAngleLimit (float) – valid pixels must have incidence angle smaller or equal to incidenceAngleLimit .

  • applyLambertLaw (bool) – apply Lambert limbdarkening law only, default = True (at this time, no other law has been programmed yet).

  • silent (bool) – print information on run, default = False.

Returns:

calibrated VMC image, flattened calibrated VMC image, average incidence angle, standard deviation incidence angle, average emission angle, standard emission incidence angle, average phase angle, standard deviation phase angle, radiance scaling factor

Return type:

2D NumPy array (512x512), 1d NumPy array, float, float, float, float, float, float,

Description: This method is used to calibrate a VMC image. The calibrated radiance factor \(RF_{x,y}\) for a valid (= on Venus disk with incidence angle < incidenceAngleLimit and emission angle < emissionAngleLimit) pixel \((x,y)\) in a VMC image is:

\(RF_{x,y} = \pi \beta R_{observed - x,y} \frac {d_{Venus}}{S_{Sun}}\)

where \(\beta\) is the calibration correction factor (see Shalygina et al. 2015, their Table 1), \(R_{observed - x,y}\) is the value at the pixel in ADU times the radiance scaling factor read from the VMC image header (VMCImage.label ['RADIANCE_SCALING_FACTOR'].value, when read with planetaryimage module in Python) in \(W/m^2/\mu m/ster/ADU\), \(d_{Venus}\) is the distance of Venus to the Sun in AU and \(S_{Sun}\) the solar flux in \(W/m^2/\mu m\) at 1AU (see Lee et al. 2015 their Equation 2).

The \(\beta\) factor is 2.34 for orbits before 2639 and 1 for later orbits.

For \(S_{Sun}\) (from Lee et al. 2015 their Equation 1):

\(S_{Sun} = \frac {\int S_{irradiance}(\lambda) T(\lambda) d\lambda}{\int T (\lambda) d\lambda}\)

The \(S_{irradiance}\) is determined using the Solar Spectra website and the transmission function \(T (\lamda)\) is taken from a parametrisation of the UV part of the transmission function of the VMC camera as published by Markiewicz et al. 2007 their Figure 3.

This results in a value of \(S_{Sun} = 1081 W/m^2/\mu m\).

The value of \(d_{Venus} = 0.723AU\) to within 1% in \(d_{Venus}^2\) over the orbit of Venus.

Finally, a Lambert limb-darkening law is applied.

The calibration is only done for pixels that fall on the Venus disk, which have valid longitudes attached to them and an incidence angle of less than or equal to the limit set by the user (default = 89˚).

The first four input variables come from reading a VMC image with the readVMCImageAndGeoCube() method of this class.

static VMCTools.getWindAdvectedBox(latitudeVeRaSounding, longitudeVeRaSounding, timeDifferenceHours, oneSigmaZonalWind=20, oneSigmaMeridionalWind=12)
Parameters:
  • latitudeVeRaSounding (float) – latitude (˚) of the VeRa sounding location.

  • longitudeVeRaSounding (float) – longitude (˚) of the VeRa sounding location.

  • timeDifferenceHours (float) – difference in hours between the VeRa sounding and the VMC image acquisition.

  • oneSigmaZonalWind (float) – the standard deviation for the zonal wind. Default is 20m/s from Khatunstev et al. (2013) Figure 10a.

  • oneSigmaMeridionalWind (float) – the standard deviation for the meridional wind. Default is 12m/s from Khatunstev et al. (2013) Figure 10b.

Returns:

latitudeCentre, latitudeLimits, longitudeCentre, longitudeLimits.

Return type:

float, list [float, float], float, list [ [float, float], [float, float] ]

Description: Given the latitude and longitude of the VeRa sounding, as well as the time difference between the VeRa sounding and the VMC image, determine the latitude-longitude box where the atmosphere of the VeRa sounding was positioned at the time of the VMC image recording.

The parametrisation is based on Khatuntsev et al. (2013) figures 10a (zonal) and 10b (meridional). The uncertainties (standard deviation) oneSigmaZonalWind and oneSigmaMeridionalWind are estimated based on the grey areas in those figures.

Parametrisation of the wind profiles.

Khatuntsev et al. (2013) report on the zonal and meridional wind profiles measured from VEX orbits up to 2299 (10-year period) and present the result in their figures 10(a) and (b): Mean zonal (a) and meridional (b) profiles of the wind speed derived over the period of 10 venusian years by manual cloud tracking. Error bars correspond to 99.9999% 5σ-x confidence interval based on the standard deviation of the weighted mean. Standard deviations are presented by shadowed areas.

They present the formulae (their Equations (1) and (2)) with which the winds have been calculated by comparing two images:

\[U = \frac {(\lambda_2 - \lambda_1) (R+h) cos (\theta)}{\Delta t}\]
\[V = \frac {(\theta_2 - \theta_1) (R + h)}{\Delta t}\]

where the indices \(1\) and \(2\) refer to the first and second image, \(\lambda\) is the longitude and \(\theta\) the latitude. Since \(U\) is negative (see table below), it means the wind blows the clouds in the direction of smaller Venus longitudes.

From my (physical) notebook entry on 19-03-2015: the average zonal wind is determined from figure 10a in Khatuntsev et al. (2013) and can be parametrised as (\(U\) in units of m/s):

Parametrised average zonal wind

Latitude range (˚)

wind parametrisation (m/s)

notes

(-75˚, -50˚]

\(U({\theta})\) = -94 + (\({\theta}\) + 50) * (65.6/-25)

also use for latitudes down to -90˚.

(-50˚, -40˚]

\(U({\theta})\) = -101.5 + (\({\theta}\) + 40) * (7.5/-10)

(-40˚, -15˚]

\(U({\theta})\) = -93 + (\({\theta}\) + 15) * (-8.5/-35)

(-15˚, 0˚]

\(v{\theta})\) = -93

_images/Khatuntsev_2013_Figure10a_ZonalWind.jpg

Khatuntsev et al. (2013) Figure 10a. Zonal wind parametrisation.

From my (physical) notebook entry on 24-04-2015: the average meridional wind is determined from figure 10b in Khatuntsev et al. (2013) and can be parametrised as (\(V\) in units of m/s):

Parametrised average meridional wind

Latitude range (˚)

wind parametrisation (m/s)

(-90˚, -75˚]

\(V({\theta})\)) = 0

(-75˚, -50˚]

\(V({\theta})\)) = -9.58 + ( \({\theta}\) + 50 ) * (9.38/-25)

(-50˚, -20˚]

\(V({\theta})\)) = -6.5 + ( \({\theta}\) + 20 ) * (-3.08/-30)

(-20˚, 0˚]

\(V({\theta})\)) = -3.26 + ( \({\theta}\) + 0 ) * (-3.24/-20)

_images/Khatuntsev_2013_Figure10b_MeridionalWind.jpg

Khatuntsev et al. (2013) Figure 10b. Meridional wind parametrisation.

VMCTools.getColourForVEXMissionSection()
Parameters:

orbitOrImageID (str or int) – ID of a VMC image, for example ‘V2811_0080_UV2’

Returns:

colour string for use in matplotlib.

Return type:

str

Description: Define the colours for each Venus Express mission section for making scatter plots. The information about the orbit IDs per mission section comes from the file /Users/maarten/Science/Venus/Temperature-UV_Analysis_2024/Data/VEX/VEX-SCIOPS-LI-053_1_1_VEX_Orbit_Date_DOY_Listing_2014Sep15.numbers, see also the link to Venus Express at the ESA PSA