To calculate expected flux (per AIA pixel) given a temperature and emission measure ( expected_AIA_flux() in flare_physics_utils.py):
F = EM/R(T)
where F is the flux in units DN s-1 px-1, EM has units (cm-3) and R(T) is the response fuction of a given channel at a given temperature, in units DN cm5 s-1 px-1.
The response function on a given day can be obtained with sswidl’s get_aia_response.pro.
To properly calculate the pixel size, use the Sun-Earth distance on the date in question (see arcsec_to_cm() in sunpy_map_utils.py): angular_diameter_arcsec=radians_to_arcseconds * diameter/distance. One square AIA pixel will be about 5.36×1017cm2.
Divide the response function at temperature log10 T (MK) by this pixel area. Units of R(T)/pixel_area are: DN cm3 s-1, which means the units of the predicted flux are now simply DN s-1.
Given observed fluxes, the EM can also be calculated from the above equation (see EM_loci_curves() in flare_physics_utils.py)
Examples
NuSTAR observation of 2020-09-12, orbit 8, with temperature and emission measure calculated by spectral fit between 20:37 and 20:50 (courtesy S. Paterson). Note this is for the entire flare as seen by NuSTAR, extent unknown.
obs_params['EM_spec_cm-3']=1.03e43
obs_params['EM_err_cm-3']=[7.17e42,1.32e43]
obs_params['T_spec_MK']=3.244
obs_params['T_err_MK']=[3.195,3.347]
Compare expected AIA fluxes (dashed lines) with observed fluxes in one pixel at peak of AIA event, at the brightest part of the flare as seen in AIA 211:
obstime='2020-09-12 20:51:00'
testfluxes=get_datavec(df, pd.to_datetime(obstime))
maxloc=argmax2D(testfluxes[4]) #211
obs_fluxes=[f[maxloc] for f in testfluxes] #location corresponding to brightest pixel in AIA 211
obs_fluxes
[6.198385031134314,
27.573456549919502,
498.955343496757,
1216.220135844588,
398.1122242168047,
5.860411883536379]
Here, the loci curves given by the actual observed fluxes in only a single pixel show EM about one order of magnitude greater than what is predicted based on the T and EM from the spectral fit for the whole flare!
Now compare with a pixel not in the flare area:
minloc=argmin2D(testfluxes[4])
outside_fluxes=[f[minloc] for f in testfluxes] #now the dimmest pixel
outside_fluxes
[1.1825562246404253,
2.7573456549919504,
191.98281753783036,
78.0141205558206,
13.09806451968708,
0.3447301107962576]
Let’s assume that even though this flare is small, it’s still going to show up in more than one AIA pixel. Instead of the usual mask, take only the top 50% contour in the 211 difference image as the mask:
percent=50
mask50=make_contour_mask(211,contour=[percent],plot=False)
np.sum(~mask50) #number of pixels being considered
7
obs_fluxes #from difference image now
[29.38421407745588,
180.84673903206203,
3380.5521036341333,
5035.8296055020155,
1857.4968614776121,
32.470292787569235]
This is ~ 10x higher than fluxes from a single pixel.
References
M. Kuhar et al, 2017 ApJ 835 6 equation 3
Boerner, P. F., Testa, P., Warren, H., Weber, M. A., & Schrijver, C. J. 2014, Sol. Phys., 289, 2377