def test_aca_targ_transforms(): """ Observation request: ID=13928,TARGET=(191.321250,27.125556,{Haro 9}),DURATION=(17000.000000), PRIORITY=9,SI=ACIS-S,GRATING=NONE,SI_MODE=TE_0045A,ACA_MODE=DEFAULT, TARGET_OFFSET=(0.002500,-0.004167), DITHER=(ON,0.002222,0.360000,0.000000,0.002222,0.509100,0.000000), SEGMENT=(1,15300.000000),PRECEDING=(13632),MIN_ACQ=1,MIN_GUIDE=1 ACA (PCAD): As-planned pointing from starcheck Q1,Q2,Q3,Q4: -0.18142595 -0.37811633 -0.89077416 0.17502588 """ # Attitude quaternion for the as-run PCAD attitude q_aca = Quat([-0.18142595, -0.37811633, -0.89077416, 0.17502588]) # Target coordinates and quaternion, using the PCAD roll ra_targ, dec_targ = 191.321250, 27.125556 # Offsets from OR (Target DY, DZ) in degrees y_off, z_off = 0.002500, -0.004167 q_targ = chandra_aca.calc_targ_from_aca(q_aca, y_off, z_off) assert np.allclose(ra_targ, q_targ.ra, atol=1e-5, rtol=0) assert np.allclose(dec_targ, q_targ.dec, atol=1e-5, rtol=0) q_aca_rt = chandra_aca.calc_aca_from_targ(q_targ, y_off, z_off) dq = q_aca_rt.inv() * q_aca assert np.degrees(np.abs(dq.q[0] * 2)) < 30 / 3600. assert np.degrees(np.abs(dq.q[1] * 2)) < 1 / 3600. assert np.degrees(np.abs(dq.q[2] * 2)) < 1 / 3600.
def run(self): SC = self.SC obsid = SC.obsid if SC.characteristics is None: self.add_message('warning', 'no Characteristics provided') elif SC.obsreqs is None: self.add_message('warning', 'no OR list provided') elif obsid not in SC.obsreqs: self.add_message('error', 'obsid {} not in OR list'.format(obsid)) elif 'target_ra' not in SC.obsreqs[obsid]: self.add_message('error', 'obsid {} does not have RA/Dec in OR'.format(obsid)) else: obsreq = SC.obsreqs[obsid] # Gather inputs for doing conversion from spacecraft target attitude # to science target attitude y_off, z_off = obsreq['target_offset_y'], obsreq['target_offset_z'] targ = SkyCoord(obsreq['target_ra'], obsreq['target_dec'], unit='deg') pcad = Quat([SC.targ_q1, SC.targ_q2, SC.targ_q3, SC.targ_q4]) detector = SC.detector si_align = SC.characteristics['odb_si_align'][detector] q_targ = chandra_aca.calc_targ_from_aca(pcad, y_off, z_off, si_align) cmd_targ = SkyCoord(q_targ.ra, q_targ.dec, unit='deg') sep = targ.separation(cmd_targ) if sep > 1. * u.arcsec: message = ('science target attitude RA={:.5f} Dec={:.5f} different ' 'from OR list by {:.1f}' .format(q_targ.ra, q_targ.dec, sep.to('arcsec'))) self.add_message('error', message)