def recenter(self):
        """
        Reset the reference position values to correspond to the center
        of the reference frame.
        Algorithm used here developed by Colin Cox - 27-Jan-2004.
        """
        if self.ctype1.find('TAN') < 0 or self.ctype2.find('TAN') < 0:
            print 'WCS.recenter() only supported for TAN projections.'
            raise TypeError

        # Check to see if WCS is already centered...
        if self.crpix1 == self.naxis1/2. and self.crpix2 == self.naxis2/2.:
            # No recentering necessary... return without changing WCS.
            return

        # This offset aligns the WCS to the center of the pixel, in accordance
        # with the 'align=center' option used by 'drizzle'.
        #_drz_off = -0.5
        _drz_off = 0.
        _cen = (self.naxis1/2.+ _drz_off,self.naxis2/2. + _drz_off)

        # Compute the RA and Dec for center pixel
        _cenrd = self.xy2rd(_cen)
        _cd = N.array([[self.cd11,self.cd12],[self.cd21,self.cd22]],type=N.Float64)
        _ra0 = DEGTORAD(self.crval1)
        _dec0 = DEGTORAD(self.crval2)
        _ra = DEGTORAD(_cenrd[0])
        _dec = DEGTORAD(_cenrd[1])

        # Set up some terms for use in the final result
        _dx = self.naxis1/2. - self.crpix1
        _dy = self.naxis2/2. - self.crpix2

        _dE,_dN = DEGTORAD(N.dot(_cd,(_dx,_dy)))
        _dE_dN = 1 + N.power(_dE,2) + N.power(_dN,2)
        _cosdec = N.cos(_dec)
        _sindec = N.sin(_dec)
        _cosdec0 = N.cos(_dec0)
        _sindec0 = N.sin(_dec0)

        _n1 = N.power(_cosdec,2) + _dE*_dE + _dN*_dN*N.power(_sindec,2)
        _dra_dE = (_cosdec0 - _dN*_sindec0)/_n1
        _dra_dN = _dE*_sindec0 /_n1

        _ddec_dE = -_dE*N.tan(_dec) / _dE_dN
        _ddec_dN = (1/_cosdec) * ((_cosdec0 / N.sqrt(_dE_dN)) - (_dN*N.sin(_dec) / _dE_dN))

        # Compute new CD matrix values now...
        _cd11n = _cosdec * (self.cd11*_dra_dE + self.cd21 * _dra_dN)
        _cd12n = _cosdec * (self.cd12*_dra_dE + self.cd22 * _dra_dN)
        _cd21n = self.cd11 * _ddec_dE + self.cd21 * _ddec_dN
        _cd22n = self.cd12 * _ddec_dE + self.cd22 * _ddec_dN

        _new_orient = RADTODEG(N.arctan2(_cd12n,_cd22n))

        # Update the values now...
        self.crpix1 = _cen[0]
        self.crpix2 = _cen[1]
        self.crval1 = RADTODEG(_ra)
        self.crval2 = RADTODEG(_dec)

        # Keep the same plate scale, only change the orientation
        self.rotateCD(_new_orient)

        # These would update the CD matrix with the new rotation
        # ALONG with the new plate scale which we do not want.
        self.cd11 = _cd11n
        self.cd12 = _cd12n
        self.cd21 = _cd21n
        self.cd22 = _cd22n
def recenter ( self ) : if self . ctype1 . find ( 'TAN' ) < 0 or self . ctype2 . find ( 'TAN' ) < 0 : print 'WCS.recenter() only supported for TAN projections.' raise TypeError if self . crpix1 == self . naxis1 / 2. and self . crpix2 == self . naxis2 / 2. : return _drz_off = 0. _cen = ( self . naxis1 / 2. + _drz_off , self . naxis2 / 2. + _drz_off ) _cenrd = self . xy2rd ( _cen ) _cd = N . array ( [ [ self . cd11 , self . cd12 ] , [ self . cd21 , self . cd22 ] ] , type = N . Float64 ) _ra0 = DEGTORAD ( self . crval1 ) _dec0 = DEGTORAD ( self . crval2 ) _ra = DEGTORAD ( _cenrd [ 0 ] ) _dec = DEGTORAD ( _cenrd [ 1 ] ) _dx = self . naxis1 / 2. - self . crpix1 _dy = self . naxis2 / 2. - self . crpix2 _dE , _dN = DEGTORAD ( N . dot ( _cd , ( _dx , _dy ) ) ) _dE_dN = 1 + N . power ( _dE , 2 ) + N . power ( _dN , 2 ) _cosdec = N . cos ( _dec ) _sindec = N . sin ( _dec ) _cosdec0 = N . cos ( _dec0 ) _sindec0 = N . sin ( _dec0 ) _n1 = N . power ( _cosdec , 2 ) + _dE * _dE + _dN * _dN * N . power ( _sindec , 2 ) _dra_dE = ( _cosdec0 - _dN * _sindec0 ) / _n1 _dra_dN = _dE * _sindec0 / _n1 _ddec_dE = - _dE * N . tan ( _dec ) / _dE_dN _ddec_dN = ( 1 / _cosdec ) * ( ( _cosdec0 / N . sqrt ( _dE_dN ) ) - ( _dN * N . sin ( _dec ) / _dE_dN ) ) _cd11n = _cosdec * ( self . cd11 * _dra_dE + self . cd21 * _dra_dN ) _cd12n = _cosdec * ( self . cd12 * _dra_dE + self . cd22 * _dra_dN ) _cd21n = self . cd11 * _ddec_dE + self . cd21 * _ddec_dN _cd22n = self . cd12 * _ddec_dE + self . cd22 * _ddec_dN _new_orient = RADTODEG ( N . arctan2 ( _cd12n , _cd22n ) ) self . crpix1 = _cen [ 0 ] self . crpix2 = _cen [ 1 ] self . crval1 = RADTODEG ( _ra ) self . crval2 = RADTODEG ( _dec ) self . rotateCD ( _new_orient ) self . cd11 = _cd11n self . cd12 = _cd12n self . cd21 = _cd21n self . cd22 = _cd22n
Reset the reference position values to correspond to the center
        of the reference frame.
        Algorithm used here developed by Colin Cox - 27-Jan-2004.