diff options
Diffstat (limited to 'ast/specfluxframe.c')
-rw-r--r-- | ast/specfluxframe.c | 2189 |
1 files changed, 0 insertions, 2189 deletions
diff --git a/ast/specfluxframe.c b/ast/specfluxframe.c deleted file mode 100644 index ea00d49..0000000 --- a/ast/specfluxframe.c +++ /dev/null @@ -1,2189 +0,0 @@ -/* -*class++ -* Name: -* SpecFluxFrame - -* Purpose: -* Compound spectrum/flux Frame. - -* Constructor Function: -c astSpecFluxFrame -f AST_SPECFLUXFRAME - -* Description: -* A SpecFluxFrame combines a SpecFrame and a FluxFrame into a single -* 2-dimensional compound Frame. Such a Frame can for instance be used -* to describe a Plot of a spectrum in which the first axis represents -* spectral position and the second axis represents flux. - -* Inheritance: -* The SpecFluxFrame class inherits from the CmpFrame class. - -* Attributes: -* The SpecFluxFrame class does not define any new attributes beyond -* those which are applicable to all CmpFrames. However, the attributes -* of the component Frames can be accessed as if they were attributes -* of the SpecFluxFrame. For instance, the SpecFluxFrame will recognise -* the "StdOfRest" attribute and forward access requests to the component -* SpecFrame. An axis index can optionally be appended to the end of any -* attribute name, in which case the request to access the attribute will -* be forwarded to the primary Frame defining the specified axis. - -* Functions: -c The SpecFluxFrame class does not define any new functions beyond those -f The SpecFluxFrame class does not define any new routines beyond those -* which are applicable to all CmpFrames. - -* Copyright: -* Copyright (C) 1997-2006 Council for the Central Laboratory of the -* Research Councils - -* Licence: -* This program is free software: you can redistribute it and/or -* modify it under the terms of the GNU Lesser General Public -* License as published by the Free Software Foundation, either -* version 3 of the License, or (at your option) any later -* version. -* -* This program is distributed in the hope that it will be useful, -* but WITHOUT ANY WARRANTY; without even the implied warranty of -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -* GNU Lesser General Public License for more details. -* -* You should have received a copy of the GNU Lesser General -* License along with this program. If not, see -* <http://www.gnu.org/licenses/>. - -* Authors: -* DSB: David S. Berry (Starlink) - -* History: -* 8-DEC-2004 (DSB): -* Original version. -* 29-APR-2011 (DSB): -* Prevent astFindFrame from matching a subclass template against a -* superclass target. -*class-- -*/ - -/* Module Macros. */ -/* ============== */ -/* Set the name of the class we are implementing. This indicates to - the header files that define class interfaces that they should make - "protected" symbols available. */ -#define astCLASS SpecFluxFrame - -/* Define the first and last acceptable System values. */ -#define FIRST_SYSTEM AST__COMP -#define LAST_SYSTEM AST__COMP - -/* Include files. */ -/* ============== */ -/* Interface definitions. */ -/* ---------------------- */ - -#include "globals.h" /* Thread-safe global data access */ -#include "error.h" /* Error reporting facilities */ -#include "memory.h" /* Memory allocation facilities */ -#include "globals.h" /* Thread-safe global data access */ -#include "object.h" /* Base Object class */ -#include "mapping.h" /* Coordinate Mappings */ -#include "unitmap.h" /* Unit Mappings */ -#include "permmap.h" /* Coordinate permutation Mappings */ -#include "cmpmap.h" /* Compound Mappings */ -#include "axis.h" /* Coordinate axes */ -#include "cmpframe.h" /* Parent CmpFrame class */ -#include "tranmap.h" /* Separated transformation Mappings */ -#include "mathmap.h" /* Algebraic Mappings */ -#include "ratemap.h" /* Differential Mappings */ -#include "specframe.h" /* SpecFrame class */ -#include "fluxframe.h" /* FluxFrame class */ -#include "specfluxframe.h" /* Interface definition for this class */ - -/* Error code definitions. */ -/* ----------------------- */ -#include "ast_err.h" /* AST error codes */ - -/* C header files. */ -/* --------------- */ -#include <float.h> -#include <math.h> -#include <ctype.h> -#include <stdarg.h> -#include <stddef.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> - -/* Module Variables. */ -/* ================= */ - -/* Address of this static variable is used as a unique identifier for - member of this class. */ -static int class_check; - -/* Pointers to parent class methods which are extended by this class. */ -static int (* parent_match)( AstFrame *, AstFrame *, int, int **, int **, AstMapping **, AstFrame **, int * ); -static int (* parent_subframe)( AstFrame *, AstFrame *, int, const int *, const int *, AstMapping **, AstFrame **, int * ); -static const char *(* parent_gettitle)( AstFrame *, int * ); - -/* Define macros for accessing each item of thread specific global data. */ -#ifdef THREAD_SAFE - -/* Define how to initialise thread-specific globals. */ -#define GLOBAL_inits \ - globals->Class_Init = 0; \ - globals->GetTitle_Buff[ 0 ] = 0; - -/* Create the function that initialises global data for this module. */ -astMAKE_INITGLOBALS(SpecFluxFrame) - -/* Define macros for accessing each item of thread specific global data. */ -#define class_init astGLOBAL(SpecFluxFrame,Class_Init) -#define class_vtab astGLOBAL(SpecFluxFrame,Class_Vtab) -#define gettitle_buff astGLOBAL(SpecFluxFrame,GetTitle_Buff) - - - -/* If thread safety is not needed, declare and initialise globals at static - variables. */ -#else - -static char gettitle_buff[ 101 ]; - - -/* Define the class virtual function table and its initialisation flag - as static variables. */ -static AstSpecFluxFrameVtab class_vtab; /* Virtual function table */ -static int class_init = 0; /* Virtual function table initialised? */ - -#endif - -/* External Interface Function Prototypes. */ -/* ======================================= */ -/* The following functions have public prototypes only (i.e. no - protected prototypes), so we must provide local prototypes for use - within this module. */ -AstSpecFluxFrame *astSpecFluxFrameId_( void *, void *, const char *, ... ); - -/* Prototypes for Private Member Functions. */ -/* ======================================== */ -static AstFluxFrame *GetFluxFrame( AstSpecFluxFrame *, int, int * ); -static AstMapping *MakeMap2( AstSpecFluxFrame *, int * ); -static AstMapping *MakeMap3( AstSpecFluxFrame *, AstSpecFluxFrame *, int * ); -static AstMapping *MakeMapF( AstFluxFrame *, AstSpecFrame *, AstFluxFrame *, AstSpecFrame *, int * ); -static AstMapping *MakeMapI( AstFluxFrame *, AstSpecFrame *, AstFluxFrame *, AstSpecFrame *, int * ); -static AstSpecFrame *GetSpecFrame( AstSpecFluxFrame *, int, int * ); -static const char *GetTitle( AstFrame *, int * ); -static int MakeSFMapping( AstSpecFluxFrame *, AstSpecFluxFrame *, AstMapping **, int * ); -static int Match( AstFrame *, AstFrame *, int, int **, int **, AstMapping **, AstFrame **, int * ); -static int SubFrame( AstFrame *, AstFrame *, int, const int *, const int *, AstMapping **, AstFrame **, int * ); -static void Dump( AstObject *, AstChannel *, int * ); - -/* Member functions. */ -/* ================= */ - -static AstFluxFrame *GetFluxFrame( AstSpecFluxFrame *this, int std, int *status ){ -/* -* Name: -* GetFluxFrame - -* Purpose: -* Return a pointer to the FluxFrame in a FluxSpecFrame. - -* Type: -* Private function. - -* Synopsis: -* #include "specfluxframe.h" -* AstFluxFrame *GetFluxFrame( AstSpecFluxFrame *this, int std, int *status ) - -* Class Membership: -* SpecFluxFrame member function. - -* Description: -* Returns a pointer to the FluxFrame in a SpecFluxFrame. - -* Parameters: -* this -* Pointer to the SpecFluxFrame. -* std -* If non zero, then the returned FluxFrame is a standardised copy of -* the FluxFrame in the supplied SpecFluxFrame, in which the System has -* been set explicitly (rather than potentially being defaulted), and -* the Units have been cleared to use default units appropriate to -* the flux System. -* status -* Pointer to the inherited status variable. - -* Returned Value: -* A pointer to the FluxFrame. Should be freed using astAnnul when no -* longer needed. - -* Notes: -* NULL is returned if this function is invoked with the global error -* status set or if it should fail for any reason. -*/ - -/* Local Variables; */ - AstFluxFrame *ff; - AstFluxFrame *ret; - -/* Check the global error status. */ - if ( !astOK ) return NULL; - -/* The FluxFrame is always the second Frame in the parent CmpFrame. */ - ff = (AstFluxFrame *) ((AstCmpFrame *)this)->frame2; - -/* Produce a standardised copy of the FluxFrame if required, or clone the - above pointer otherwise. */ - if( std ) { - ret = astCopy( ff ); - astSetSystem( ret, astGetSystem( ff ) ); - astClearUnit( ret, 0 ); - } else { - ret = astClone( ff ); - } - -/* Annul the returned pointer if anything went wrong. */ - if( !astOK ) ret = astAnnul( ret ); - -/* Return the result. */ - return ret; -} - -static AstSpecFrame *GetSpecFrame( AstSpecFluxFrame *this, int std, int *status ){ -/* -* Name: -* GetSpecFrame - -* Purpose: -* Return a pointer to the SpecFrame in a FluxSpecFrame. - -* Type: -* Private function. - -* Synopsis: -* #include "specfluxframe.h" -* AstSpecFrame *GetSpecFrame( AstSpecFluxFrame *this, int std, int *status ) - -* Class Membership: -* SpecFluxFrame member function. - -* Description: -* Returns a pointer to the SpecFrame in a SpecFluxFrame. - -* Parameters: -* this -* Pointer to the SpecFluxFrame. -* std -* If non zero, then the returned SpecFrame is a standardised copy of -* the SpecFrame in the supplied SpecFluxFrame, in which the System -* and Units have been set explicitly to the values appropriate to the -* flux system in use in the FluxFrame in the supplied SpecFluxFrame. -* status -* Pointer to the inherited status variable. - -* Returned Value: -* A pointer to the FluxFrame. Should be freed using astAnnul when no -* longer needed. - -* Notes: -* NULL is returned if this function is invoked with the global error -* status set or if it should fail for any reason. -*/ - -/* Local Variables; */ - AstFluxFrame *ff; - AstSpecFrame *ret; - AstSpecFrame *sf; - -/* Check the global error status. */ - if ( !astOK ) return NULL; - -/* Get a pointer to the SpecFrame (the first Frame in the parent CmpFrame). */ - sf = (AstSpecFrame *) ((AstCmpFrame *)this)->frame1; - -/* If we want a standardised version of the SpecFrame... */ - if( std ) { - -/* The FluxFrame is always the second Frame in the parent CmpFrame. */ - ff = (AstFluxFrame *) ((AstCmpFrame *)this)->frame2; - -/* Produce a copy of the SpecFrame and set its System and Units - appropriate to the flux system (expressed in default units). */ - ret = astCopy( sf ); - astSetSystem( ret, astGetDensitySystem( ff ) ); - astSetUnit( ret, 0, astGetDensityUnit( ff ) ); - -/* If we are not standardising the SpecFrame, just return a clone of the - pointer in the parent CmpFrame. */ - } else { - ret = astClone( sf ); - } - -/* Annul the returned pointer if anything went wrong. */ - if( !astOK ) ret = astAnnul( ret ); - -/* Return the result. */ - return ret; -} - -static const char *GetTitle( AstFrame *this_frame, int *status ) { -/* -* Name: -* GetTitle - -* Purpose: -* Obtain a pointer to the Title string for a SpecFluxFrame. - -* Type: -* Private function. - -* Synopsis: -* #include "specfluxframe.h" -* const char *GetTitle( AstFrame *this_frame, int *status ) - -* Class Membership: -* SpecFluxFrame member function (over-rides the astGetTitle method -* inherited from the CmpFrame class). - -* Description: -* This function returns a pointer to the Title string for a SpecFluxFrame. -* A pointer to a suitable default string is returned if no Title value has -* previously been set. - -* Parameters: -* this -* Pointer to the SpecFluxFrame. -* status -* Pointer to the inherited status variable. - -* Returned Value: -* Pointer to a null-terminated character string containing the requested -* information. - -* Notes: -* - A NULL pointer will be returned if this function is invoked with the -* global error status set, or if it should fail for any reason. -*/ - -/* Local Variables: */ - astDECLARE_GLOBALS - AstSpecFluxFrame *this; - AstSpecFrame *sf; - AstFluxFrame *ff; - const char *result; - -/* Check the global error status. */ - if ( !astOK ) return NULL; - -/* Get a pointer to the thread specific global data structure. */ - astGET_GLOBALS(this_frame); - -/* Initialise. */ - result = NULL; - -/* Obtain a pointer to the SpecFluxFrame structure. */ - this = (AstSpecFluxFrame *) this_frame; - -/* See if a Title string has been set. If so, use the parent astGetTitle - method to obtain a pointer to it. */ - if ( astTestTitle( this ) ) { - result = (*parent_gettitle)( this_frame, status ); - -/* Otherwise, we will generate a default Title string. Obtain the values of the - SpecFrame's attributes that determine what this string will be. */ - } else { - ff = GetFluxFrame( this, 0, status ); - sf = GetSpecFrame( this, 0, status ); - - if( astOK ) { - sprintf( gettitle_buff, "%s versus %s", astGetLabel( ff, 0 ), - astGetLabel( sf, 0 ) ); - gettitle_buff[ 0 ] = toupper( gettitle_buff[ 0 ] ); - result = gettitle_buff; - } - - ff = astAnnul( ff ); - sf = astAnnul( sf ); - - } - -/* If an error occurred, clear the returned pointer value. */ - if ( !astOK ) result = NULL; - -/* Return the result. */ - return result; -} - -void astInitSpecFluxFrameVtab_( AstSpecFluxFrameVtab *vtab, const char *name, int *status ) { -/* -*+ -* Name: -* astInitSpecFluxFrameVtab - -* Purpose: -* Initialise a virtual function table for a SpecFluxFrame. - -* Type: -* Protected function. - -* Synopsis: -* #include "specfluxframe.h" -* void astInitSpecFluxFrameVtab( AstSpecFluxFrameVtab *vtab, const char *name ) - -* Class Membership: -* SpecFluxFrame vtab initialiser. - -* Description: -* This function initialises the component of a virtual function -* table which is used by the SpecFluxFrame class. - -* Parameters: -* vtab -* Pointer to the virtual function table. The components used by -* all ancestral classes will be initialised if they have not already -* been initialised. -* name -* Pointer to a constant null-terminated character string which contains -* the name of the class to which the virtual function table belongs (it -* is this pointer value that will subsequently be returned by the Object -* astClass function). -*- -*/ - -/* Local Variables: */ - astDECLARE_GLOBALS /* Pointer to thread-specific global data */ - AstObjectVtab *object; /* Pointer to Object component of Vtab */ - AstFrameVtab *frame; /* Pointer to Frame component of Vtab */ - AstMappingVtab *mapping; /* Pointer to Mapping component of Vtab */ - -/* Check the local error status. */ - if ( !astOK ) return; - -/* Get a pointer to the thread specific global data structure. */ - astGET_GLOBALS(NULL); - -/* Initialize the component of the virtual function table used by the - parent class. */ - astInitCmpFrameVtab( (AstCmpFrameVtab *) vtab, name ); - -/* Store a unique "magic" value in the virtual function table. This - will be used (by astIsASpecFluxFrame) to determine if an object belongs - to this class. We can conveniently use the address of the (static) - class_check variable to generate this unique value. */ - vtab->id.check = &class_check; - vtab->id.parent = &(((AstCmpFrameVtab *) vtab)->id); - -/* Initialise member function pointers. */ -/* ------------------------------------ */ -/* Store pointers to the member functions (implemented here) that - provide virtual methods for this class. */ - -/* Save the inherited pointers to methods that will be extended, and - replace them with pointers to the new member functions. */ - object = (AstObjectVtab *) vtab; - frame = (AstFrameVtab *) vtab; - mapping = (AstMappingVtab *) vtab; - -/* Store replacement pointers for methods which will be over-ridden by - new member functions implemented here. */ - - parent_match = frame->Match; - frame->Match = Match; - - parent_subframe = frame->SubFrame; - frame->SubFrame = SubFrame; - - parent_gettitle = frame->GetTitle; - frame->GetTitle = GetTitle; - -/* Declare the copy constructor, destructor and class dump - function. */ - astSetDump( vtab, Dump, "SpecFluxFrame", - "Compound spectral/flux coordinate system description" ); - -/* If we have just initialised the vtab for the current class, indicate - that the vtab is now initialised, and store a pointer to the class - identifier in the base "object" level of the vtab. */ - if( vtab == &class_vtab ) { - class_init = 1; - astSetVtabClassIdentifier( vtab, &(vtab->id) ); - } -} - -static AstMapping *MakeMap2( AstSpecFluxFrame *this, int *status ){ -/* -* Name: -* MakeMap2 - -* Purpose: -* Generate the second Mapping required by MakeSFMapping - -* Type: -* Private function. - -* Synopsis: -* #include "specfluxframe.h" -* AstMapping *MakeMap2( AstSpecFluxFrame *this, int *status ) - -* Class Membership: -* SpecFluxFrame member function. - -* Description: -* The second Mapping used by MakeSFMapping contains three Mappings in -* parallel which converts v1 (flux value) and x1 (spectral position) into -* default units, and passes the third axis (a copy of flux value) -* unchanged. - -* Parameters: -* this -* Pointer to the SpecFluxFrame to use. -* status -* Pointer to the inherited status variable. - -* Returned Value: -* A pointer to the required Mapping, or NULL if the Mapping cannot be -* created. The Mapping will have 3 inputs and 3 outputs. - -* Notes: -* NULL is returned if this function is invoked with the global error -* status set or if it should fail for any reason. -*/ - -/* Local Variables: */ - AstFrame *f1; - AstFrame *f2; - AstFrameSet *fs; - AstMapping *ax1_map; - AstMapping *ax2_map; - AstMapping *ax3_map; - AstMapping *ret; - AstMapping *tmap; - -/* Initialise. */ - ret = NULL; - -/* Check the global error status. */ - if ( !astOK ) return ret; - -/* Input 0 is the supplied FluxFrame value and output 0 is the corresponding - value in the default units for the FluxFrame system. Take a copy of the - supplied FluxFrame, and fix its System value (which may be a default value - based on the Units string), and then clear the Units so that it represents - default units for the System. */ - f1 = (AstFrame *) GetFluxFrame( this, 0, status ); - f2 = (AstFrame *) GetFluxFrame( this, 1, status ); - -/* Now, if conversion was possible, get the Mapping from the supplied - FluxFrame to the default units FluxFrame. */ - fs = astConvert( f1, f2, "" ); - f1 = astAnnul( f1 ); - f2 = astAnnul( f2 ); - - if( fs ) { - ax1_map = astGetMapping( fs, AST__BASE, AST__CURRENT ); - fs = astAnnul( fs ); - -/* Input 1 is the supplied SpecFrame value and output 1 is the corresponding - value in the spectral system used by the flux system (wavelength or - frequency). Take a copy of the supplied SpecFrame, and fix its System - value to wavelength or frequency (depending on the System value of the - FluxFrame), and set up units of Hz or Angstrom (these are the spectral - position units used within the default flux units for a FluxFrame). */ - f1 = (AstFrame *) GetSpecFrame( this, 0, status ); - f2 = (AstFrame *) GetSpecFrame( this, 1, status ); - -/* Now, if conversion was possible, get the Mapping from the supplied - SpecFrame to the required SpecFrame. */ - fs = astConvert( f1, f2, "" ); - f1 = astAnnul( f1 ); - f2 = astAnnul( f2 ); - - if( fs ) { - ax2_map = astGetMapping( fs, AST__BASE, AST__CURRENT ); - fs = astAnnul( fs ); - -/* Create a UnitMap for the 3rd axis. */ - ax3_map = (AstMapping *) astUnitMap( 1, "", status ); - -/* Create a parallel CmpMap containing the three Mappings. */ - tmap = (AstMapping *) astCmpMap( ax1_map, ax2_map, 0, "", status ); - ret = (AstMapping *) astCmpMap( tmap, ax3_map, 0, "", status ); - -/* Free remaining resources. */ - tmap = astAnnul( tmap ); - ax2_map = astAnnul( ax2_map ); - ax3_map = astAnnul( ax3_map ); - - } - ax1_map = astAnnul( ax1_map ); - } - -/* If an error has occurred, return NULL. */ - if( !astOK ) ret = astAnnul( ret ); - -/* Return the result */ - return ret; -} - -static AstMapping *MakeMap3( AstSpecFluxFrame *target, AstSpecFluxFrame *result, int *status ){ -/* -* Name: -* MakeMap3 - -* Purpose: -* Generate the third Mapping required by MakeSFMapping - -* Type: -* Private function. - -* Synopsis: -* #include "specfluxframe.h" -* AstMapping *MakeMap3( AstSpecFluxFrame *target, AstSpecFluxFrame *result, int *status ) - -* Class Membership: -* SpecFluxFrame member function. - -* Description: -* The third Mapping used by MakeSFMapping converts input (v1,x1) in -* default units to output (v2,x2) in default units. The third axis (x1) -* in original units is converted to x2 in original units. - -* Parameters: -* target -* Pointer to the first SpecFluxFrame. -* result -* Pointer to the second SpecFluxFrame. -* status -* Pointer to the inherited status variable. - -* Returned Value: -* A pointer to the required Mapping, or NULL if the Mapping cannot be -* created. The Mapping will have 3 inputs and 3 outputs. - -* Notes: -* NULL is returned if this function is invoked with the global error -* status set or if it should fail for any reason. -*/ - -/* Local Variables: */ - AstFluxFrame *ff2; - AstFluxFrame *ff1; - AstFrameSet *fs; - AstMapping *fmap; - AstMapping *imap; - AstMapping *mapa; - AstMapping *mapb; - AstMapping *ret; - AstSpecFrame *sf2; - AstSpecFrame *sf1; - -/* Initialise */ - ret = NULL; - -/* Check the global error status. */ - if ( !astOK ) return ret; - -/* The first two inputs and outputs are related by a TranMap which - converts between standardised (v1,x1) and standardised (v2,x2). Get - pointers to the standardised SpecFrames and FluxFrames in the two - supplied SpecFluxFrames. */ - ff1 = GetFluxFrame( target, 1, status ); - sf1 = GetSpecFrame( target, 1, status ); - ff2 = GetFluxFrame( result, 1, status ); - sf2 = GetSpecFrame( result, 1, status ); - -/* Create the Mapping which defines the forward transformation of the - required TranMap. The forward transformation of this Mapping goes from - (v1,x1) to (v2,x2). */ - fmap = MakeMapF( ff1, sf1, ff2, sf2, status ); - -/* Create the Mapping which defines the inverse transformation of the - required TranMap. The inverse transformation of this Mapping goes from - (v2,x2) to (v1,x1). */ - imap = MakeMapI( ff1, sf1, ff2, sf2, status ); - -/* Combine these into a TranMap */ - if( fmap && imap ) { - mapa = (AstMapping *) astTranMap( fmap, imap, "", status ); - } else { - mapa = NULL; - } - -/* Free resources. */ - ff1 = astAnnul( ff1 ); - sf1 = astAnnul( sf1 ); - ff2 = astAnnul( ff2 ); - sf2 = astAnnul( sf2 ); - if( fmap ) fmap = astAnnul( fmap ); - if( imap ) imap = astAnnul( imap ); - -/* The third input and output are related by a Mapping which converts - between supplied (x1) and supplied (x2). Get pointers to the original - unmodified SpecFrames in the two supplied SpecFluxFrames. */ - sf1 = GetSpecFrame( target, 0, status ); - sf2 = GetSpecFrame( result, 0, status ); - -/* Find the Mapping from the first to the second. */ - fs = astConvert( sf1, sf2, "" ); - if( fs ) { - mapb = astGetMapping( fs, AST__BASE, AST__CURRENT ); - fs = astAnnul( fs ); - } else { - mapb = NULL; - } - -/* Free resources. */ - sf1 = astAnnul( sf1 ); - sf2 = astAnnul( sf2 ); - -/* Combine the two Mappings in parallel. */ - if( mapa && mapb ) ret = (AstMapping *) astCmpMap( mapa, mapb, 0, "", status ); - if( mapa ) mapa = astAnnul( mapa ); - if( mapb ) mapb = astAnnul( mapb ); - -/* If an error has occurred, return NULL. */ - if( !astOK ) ret = astAnnul( ret ); - -/* Return the result */ - return ret; -} - -static AstMapping *MakeMapF( AstFluxFrame *v1, AstSpecFrame *x1, - AstFluxFrame *v2, AstSpecFrame *x2, int *status ){ -/* -* Name: -* MakeMapF - -* Purpose: -* Generate the forward part of the third Mapping required by MakeSFMapping - -* Type: -* Private function. - -* Synopsis: -* #include "specfluxframe.h" -* AstMapping *MakeMapF( AstFluxFrame *v1, AstSpecFrame *x1, -* AstFluxFrame *v2, AstSpecFrame *x2, int *status ) - -* Class Membership: -* SpecFluxFrame member function. - -* Description: -* Theis creates a 2-input 2-output Mapping which transforms -* input (v1,x1) in default units to output (v2,x2) in default units. - -* Parameters: -* v1 -* Pointer to the standardised input FluxFrame. -* x1 -* Pointer to the standardised input SpecFrame. -* v2 -* Pointer to the standardised output FluxFrame. -* x2 -* Pointer to the standardised output SpecFrame. -* status -* Pointer to the inherited status variable. - -* Returned Value: -* A pointer to the required Mapping, or NULL if the Mapping cannot be -* created. - -* Notes: -* NULL is returned if this function is invoked with the global error -* status set or if it should fail for any reason. -*/ - -/* Local Variables: */ - AstCmpMap *cmap1; - AstCmpMap *cmap2; - AstCmpMap *cmap3; - AstFrameSet *fs; - AstMapping *m; - AstMapping *ret; - AstMathMap *div; - AstPermMap *perm; - AstRateMap *rate; - AstUnitMap *unit; - const char *fwd[1]; - const char *inv[2]; - int inperm[ 2 ]; - int outperm[ 3 ]; - -/* Initialise */ - ret = NULL; - -/* Check the global error status. */ - if ( !astOK ) return ret; - -/* First create the required component Mappings. - --------------------------------------------- */ - -/* A Mapping which maps input spectral position (x1) into output spectral - position (x2). */ - fs = astConvert( x1, x2, "" ); - if( fs ) { - m = astGetMapping( fs, AST__BASE, AST__CURRENT ); - -/* A 1-input 1-output Mapping in which the input is spectral position (x1) - and the output is the rate of change of output spectral position (x2) - with respect to input spectral position (x1). */ - rate = astRateMap( m, 0, 0, "", status ); - -/* A MathMap which is used to divide the flux value (v1) by the absolute rate - of change of x2 wrt x1 */ - fwd[ 0 ] = "out=in0/abs(in1)"; - inv[ 0 ] = "in0"; - inv[ 1 ] = "in1"; - div = astMathMap( 2, 1, 1, fwd, 2, inv, "", status ); - -/* A 1D UnitMap used to copy v1. */ - unit = astUnitMap( 1, "", status ); - -/* A PermMap which is used to produce an extra output copy of x1. */ - inperm[ 0 ] = 0; - inperm[ 1 ] = 2; - outperm[ 0 ] = 0; - outperm[ 1 ] = 1; - outperm[ 2 ] = 1; - perm = astPermMap( 2, inperm, 3, outperm, NULL, "", status ); - -/* Now combine these component Mappings together. - --------------------------------------------- */ - -/* First put the UnitMap and the RateMap in parallel. This produces a 2-in - 2-out Mapping in which the inputs are (v1,x1) and the outputs are - (v1,dx2/dx1). */ - cmap1 = astCmpMap( unit, rate, 0, "", status ); - -/* Now put this in series with the dividing MathMap. This results in a - 2-in, 1-out Mapping in which the inputs are v1 and x1 and the single - output is v2. */ - cmap2 = astCmpMap( cmap1, div, 1, "", status ); - -/* Now put this in parallel with the x1->x2 Mapping. This results in a - 3-in, 2-out Mapping in which the inputs are (v1,x1,x1) and the outputs - are (v2,x2). */ - cmap3 = astCmpMap( cmap2, m, 0, "", status ); - -/* Finally put this in series with the PermMap. This results in a 2-in, - 2-out Mapping in which the inputs are (v1,x1) and the outputs are - (v2,x2). */ - ret = (AstMapping *) astCmpMap( perm, cmap3, 1, "", status ); - -/* Free resources. */ - fs = astAnnul( fs ); - m = astAnnul( m ); - rate = astAnnul( rate ); - div= astAnnul( div ); - unit = astAnnul( unit ); - perm = astAnnul( perm ); - cmap1 = astAnnul( cmap1 ); - cmap2 = astAnnul( cmap2 ); - cmap3 = astAnnul( cmap3 ); - } - -/* If an error has occurred, return NULL. */ - if( !astOK ) ret = astAnnul( ret ); - -/* Return the result */ - return ret; -} - -static AstMapping *MakeMapI( AstFluxFrame *v1, AstSpecFrame *x1, - AstFluxFrame *v2, AstSpecFrame *x2, int *status ){ -/* -* Name: -* MakeMapI - -* Purpose: -* Generate the inverse part of the third Mapping required by MakeSFMapping - -* Type: -* Private function. - -* Synopsis: -* #include "specfluxframe.h" -* AstMapping *MakeMapI( AstFluxFrame *v1, AstSpecFrame *x1, -* AstFluxFrame *v2, AstSpecFrame *x2 ) - -* Class Membership: -* SpecFluxFrame member function. - -* Description: -* This creates a 2-input 2-output Mapping in which the inverse -* transformation transforms "outputs" representing (v2,x2) into -* "inputs" representing (v1,x1). - -* Parameters: -* v1 -* Pointer to the standardised input FluxFrame. -* x1 -* Pointer to the standardised input SpecFrame. -* v2 -* Pointer to the standardised output FluxFrame. -* x2 -* Pointer to the standardised output SpecFrame. - -* Returned Value: -* A pointer to the required Mapping, or NULL if the Mapping cannot be -* created. - -* Notes: -* NULL is returned if this function is invoked with the global error -* status set or if it should fail for any reason. -*/ - -/* Local Variables: */ - AstCmpMap *cmap1; - AstCmpMap *cmap2; - AstCmpMap *cmap3; - AstCmpMap *cmap4; - AstCmpMap *cmap5; - AstFrameSet *fs; - AstMapping *m; - AstMapping *ret; - AstMathMap *mult; - AstPermMap *perm; - AstRateMap *rate; - AstUnitMap *unit; - const char *fwd[1]; - const char *inv[2]; - int inperm[ 2 ]; - int outperm[ 3 ]; - -/* Initialise */ - ret = NULL; - -/* Check the global error status. */ - if ( !astOK ) return ret; - -/* We create a CmpMap in which the forward transformation foes from - (v2,x2) to (v1,x1) and we finally invert this Mapping to get the - required Mapping in which the *inverse* transformation goes from - (v2,x2) to (v1,x1). - - First create the required component Mappings. - --------------------------------------------- */ - -/* A Mapping which maps spectral position x1 into spectral position x2. */ - fs = astConvert( x1, x2, "" ); - if( fs ) { - m = astGetMapping( fs, AST__BASE, AST__CURRENT ); - -/* A 1-input 1-output Mapping in which the input is spectral position x1 - and the output is the rate of change of spectral position x2 with - respect to spectral position x1. */ - rate = astRateMap( m, 0, 0, "", status ); - -/* Now invert "m" so that its forward transformation goes from x2 to x1. - The RateMap created above retains a copy of the original Invert flag - for "m" and uses it in preference to the current value when transforming - points. */ - astInvert( m ); - -/* A MathMap which is used to multiple the flux value v2 by the - absolute rate of change of x2 wrt x1 */ - fwd[ 0 ] = "out=in0*abs(in1)"; - inv[ 0 ] = "in0"; - inv[ 1 ] = "in1"; - mult = astMathMap( 2, 1, 1, fwd, 2, inv, "", status ); - -/* A 1D UnitMap used to copy various values. */ - unit = astUnitMap( 1, "", status ); - -/* A PermMap which is used to produce an extra copy of x1. */ - inperm[ 0 ] = 0; - inperm[ 1 ] = 2; - outperm[ 0 ] = 0; - outperm[ 1 ] = 1; - outperm[ 2 ] = 1; - perm = astPermMap( 2, inperm, 3, outperm, NULL, "", status ); - -/* Now combine these component Mappings together. - --------------------------------------------- */ - -/* First put the UnitMap and the RateMap in parallel. This produces a 2-in - 2-out Mapping in which the inputs are (v2,x1) and the outputs are - (v2,dx2/dx1). */ - cmap1 = astCmpMap( unit, rate, 0, "", status ); - -/* Now put this in series with the multiplying MathMap. This results in a - 2-in, 1-out Mapping in which the inputs are (v2,x1) and the single - output is v1. */ - cmap2 = astCmpMap( cmap1, mult, 1, "", status ); - -/* Now put this in parallel with the UnitMap to get a 3-in, 2-out Mapping - in which the inputs are (v2,x1,x1) and the outputs are (v1,x1). */ - cmap3 = astCmpMap( cmap2, unit, 0, "", status ); - -/* Now put this in series with the PermMap to get a 2-in, 2-out Mapping - in which the inputs are (v2,x1) and the outputs are (v1,x1). */ - cmap4 = astCmpMap( perm, cmap3, 1, "", status ); - -/* Now put the UnitMap in parallel with the (x2->x1 Mapping to get a - 2-in, 2-out Mapping in which the inputs are (v2,x2) and the outputs are - (v2,x1). */ - cmap5 = astCmpMap( unit, m, 0, "", status ); - -/* Finally put this in series with "cmap4" to get a 2-in 2-out Mapping - from (v2,x2) to (v1,x1). */ - ret = (AstMapping *) astCmpMap( cmap5, cmap4, 1, "", status ); - -/* Invert this so that the inverse transformation goes from (v2,x2) to - (v1,x1). */ - astInvert( ret ); - -/* Free resources. */ - fs = astAnnul( fs ); - m = astAnnul( m ); - rate = astAnnul( rate ); - mult = astAnnul( mult ); - unit = astAnnul( unit ); - perm = astAnnul( perm ); - cmap1 = astAnnul( cmap1 ); - cmap2 = astAnnul( cmap2 ); - cmap3 = astAnnul( cmap3 ); - cmap4 = astAnnul( cmap4 ); - cmap5 = astAnnul( cmap5 ); - } - -/* If an error has occurred, return NULL. */ - if( !astOK ) ret = astAnnul( ret ); - -/* Return the result */ - return ret; -} - -static int MakeSFMapping( AstSpecFluxFrame *target, AstSpecFluxFrame *result, - AstMapping **map, int *status ){ -/* -* Name: -* MakeSFMapping - -* Purpose: -* Generate a Mapping between two SpecFluxFrames. - -* Type: -* Private function. - -* Synopsis: -* #include "specfluxframe.h" -* int MakeSFMapping( AstSpecFluxFrame *target, AstSpecFluxFrame *result, -* AstMapping **map, int *status ) - -* Class Membership: -* SpecFluxFrame member function. - -* Description: -* This function takes two SpecFluxFrames and generates a Mapping that -* converts between them, taking account of differences in their -* coordinate systems, systems, units, etc. (but not allowing for any -* axis permutations). - -* Parameters: -* target -* Pointer to the first SpecFluxFrame. -* result -* Pointer to the second SpecFluxFrame. -* map -* Pointer to a location which is to receive a pointer to the -* returned Mapping. The forward transformation of this Mapping -* will convert from "target" coordinates to "result" -* coordinates, and the inverse transformation will convert in -* the opposite direction (all coordinate values in radians). -* status -* Pointer to the inherited status variable. - -* Returned Value: -* Non-zero if the Mapping could be generated, or zero if the two -* SpecFluxFrames are sufficiently un-related that no meaningful Mapping -* can be produced. - -* Notes: -* A value of zero is returned if this function is invoked with the -* global error status set or if it should fail for any reason. -*/ - -/* Local Variables: */ - AstMapping *map1; - AstMapping *map2; - AstMapping *map3; - AstMapping *map4; - AstMapping *map5; - AstMapping *tmap1; - AstMapping *tmap2; - AstMapping *tmap3; - AstMapping *tmap4; - int inperm[2]; - int match; - int outperm[3]; - -/* Check the global error status. */ - if ( !astOK ) return 0; - -/* Initialise the returned values. */ - match = 0; - *map = NULL; - -/* Initialise other things. */ - map1 = NULL; - map2 = NULL; - map3 = NULL; - map4 = NULL; - map5 = NULL; - tmap1 = NULL; - tmap2 = NULL; - tmap3 = NULL; - tmap4 = NULL; - -/* At the top level, the required Mapping consists of five Mappings in - series. Inputs 0 and 1 of the total Mapping correspond to the SpecFrame - and FluxFrame in the target SpecFluxFrame. These are referred to as X1 - and V1. Outputs 0 and 1 of the total Mapping correspond to the SpecFrame - and FluxFrame in the result SpecFluxFrame. These are referred to as X2 - and V2. */ - -/* Map1 is a PermMap which copies v1 to its first output and x1 to its - second and third outputs. The inverse transformation copies v1 from - its first output and x1 from its third output. */ - inperm[ 0 ] = 2; - inperm[ 1 ] = 0; - outperm[ 0 ] = 1; - outperm[ 1 ] = 0; - outperm[ 2 ] = 0; - map1 = (AstMapping *) astPermMap( 2, inperm, 3, outperm, NULL, "", status ); - -/* Map2 contains three Mappings in parallel which converts v1 and x1 into - default units, and passes the third axis unchanged. */ - map2 = MakeMap2( target, status ); - -/* Map3 converts ( v1,x1) in default units to (v2,x2) in default units. - The third axis (x1) in original units is convert to x2 in original - units. */ - map3 = map2 ? MakeMap3( target, result, status ) : NULL; - -/* Map4 converts (v2,x2) in default units to (v2,x2) in original units - and passes the third axis unchanged. This is similar to Map2 but based - on the result ratherthan the target, and in the opposite direction. */ - if( map3 ) { - map4 = MakeMap2( result, status ); - if( map4 ) astInvert( map4 ); - } else { - map4 = NULL; - } - -/* Map5 is a PermMap which is the inverse of Map1. */ - map5 = map4 ? astCopy( map1 ) : NULL; - if( map5 ) astInvert( map5 ); - -/* Combine all 6 Mappings in series. */ - if( map5 ) { - tmap1 = (AstMapping *) astCmpMap( map1, map2, 1, "", status ); - tmap2 = (AstMapping *) astCmpMap( tmap1, map3, 1, "", status ); - tmap3 = (AstMapping *) astCmpMap( tmap2, map4, 1, "", status ); - tmap4 = (AstMapping *) astCmpMap( tmap3, map5, 1, "", status ); - -/* Return the simplified total Mapping. */ - *map = astSimplify( tmap4 ); - match = 1; - } - -/* Free resources. */ - if( map1 ) map1 = astAnnul( map1 ); - if( map2 ) map2 = astAnnul( map2 ); - if( map3 ) map3 = astAnnul( map3 ); - if( map4 ) map4 = astAnnul( map4 ); - if( map5 ) map5 = astAnnul( map5 ); - if( tmap1 ) tmap1 = astAnnul( tmap1 ); - if( tmap2 ) tmap2 = astAnnul( tmap2 ); - if( tmap3 ) tmap3 = astAnnul( tmap3 ); - if( tmap4 ) tmap4 = astAnnul( tmap4 ); - -/* If an error occurred, annul the returned Mapping and clear the - returned values. */ - if ( !astOK ) { - *map = astAnnul( *map ); - match = 0; - } - -/* Return the result. */ - return match; -} - -static int Match( AstFrame *template_frame, AstFrame *target, int matchsub, - int **template_axes, int **target_axes, - AstMapping **map, AstFrame **result, int *status ) { -/* -* Name: -* Match - -* Purpose: -* Determine if conversion is possible between two coordinate systems. - -* Type: -* Private function. - -* Synopsis: -* #include "specfluxframe.h" -* int Match( AstFrame *template, AstFrame *target, int matchsub, -* int **template_axes, int **target_axes, -* AstMapping **map, AstFrame **result, int *status ) - -* Class Membership: -* SpecFluxFrame member function (over-rides the protected astMatch -* method inherited from the Frame class). - -* Description: -* This function matches a "template" SpecFluxFrame to a "target" Frame -* and determines whether it is possible to convert coordinates -* between them. If it is, a Mapping that performs the -* transformation is returned along with a new Frame that describes -* the coordinate system that results when this Mapping is applied -* to the "target" coordinate system. In addition, information is -* returned to allow the axes in this "result" Frame to be -* associated with the corresponding axes in the "target" Frame and -* "template" SpecFluxFrame from which they are derived. - -* Parameters: -* template -* Pointer to the template SpecFluxFrame. This describes the -* coordinate system (or set of possible coordinate systems) -* into which we wish to convert our coordinates. -* target -* Pointer to the target Frame. This describes the coordinate -* system in which we already have coordinates. -* matchsub -* If zero then a match only occurs if the template is of the same -* class as the target, or of a more specialised class. If non-zero -* then a match can occur even if this is not the case. -* template_axes -* Address of a location where a pointer to int will be returned -* if the requested coordinate conversion is possible. This -* pointer will point at a dynamically allocated array of -* integers with one element for each axis of the "result" Frame -* (see below). It must be freed by the caller (using astFree) -* when no longer required. -* -* For each axis in the result Frame, the corresponding element -* of this array will return the (zero-based) index of the -* template SpecFluxFrame axis from which it is derived. If it is not -* derived from any template axis, a value of -1 will be -* returned instead. -* target_axes -* Address of a location where a pointer to int will be returned -* if the requested coordinate conversion is possible. This -* pointer will point at a dynamically allocated array of -* integers with one element for each axis of the "result" Frame -* (see below). It must be freed by the caller (using astFree) -* when no longer required. -* -* For each axis in the result Frame, the corresponding element -* of this array will return the (zero-based) index of the -* target Frame axis from which it is derived. If it is not -* derived from any target axis, a value of -1 will be returned -* instead. -* map -* Address of a location where a pointer to a new Mapping will -* be returned if the requested coordinate conversion is -* possible. If returned, the forward transformation of this -* Mapping may be used to convert coordinates between the -* "target" Frame and the "result" Frame (see below) and the -* inverse transformation will convert in the opposite -* direction. -* result -* Address of a location where a pointer to a new Frame will be -* returned if the requested coordinate conversion is -* possible. If returned, this Frame describes the coordinate -* system that results from applying the returned Mapping -* (above) to the "target" coordinate system. In general, this -* Frame will combine attributes from (and will therefore be -* more specific than) both the target Frame and the template -* SpecFluxFrame. In particular, when the template allows the -* possibility of transformaing to any one of a set of -* alternative coordinate systems, the "result" Frame will -* indicate which of the alternatives was used. -* status -* Pointer to the inherited status variable. - -* Returned Value: -* A non-zero value is returned if the requested coordinate -* conversion is possible. Otherwise zero is returned (this will -* not in itself result in an error condition). - -* Notes: -* - By default, the "result" Frame will have its number of axes -* and axis order determined by the "template" SpecFluxFrame. However, -* if the PreserveAxes attribute of the template SpecFluxFrame is -* non-zero, then the axis count and axis order of the "target" -* Frame will be used instead. -* - A value of zero will be returned if this function is invoked -* with the global error status set, or if it should fail for any -* reason. -*/ - -/* Local Variables: */ - AstSpecFluxFrame *template; /* Pointer to template SpecFluxFrame structure */ - int match; /* Coordinate conversion possible? */ - int swap1; /* Template axes swapped? */ - int swap2; /* Target axes swapped? */ - int swap; /* Additional axis swap needed? */ - -/* Initialise the returned values. */ - *template_axes = NULL; - *target_axes = NULL; - *map = NULL; - *result = NULL; - match = 0; - -/* Check the global error status. */ - if ( !astOK ) return match; - -/* Obtain a pointer to the template SpecFluxFrame structure. */ - template = (AstSpecFluxFrame *) template_frame; - -/* If the target is not a SpecFluxFrame, use the results returned by the - parent Match method inherited from the CmpFrame class. */ - if( !astIsASpecFluxFrame( target ) ) { - match = (*parent_match)( template_frame, target, matchsub, template_axes, - target_axes, map, result, status ); - - -/* If the target is a SpecFluxFrame, see if we can convert between target - and template */ - } else { - -/* We must now decide how the order of the axes in the result Frame relates to - the order of axes in the target Frame. There are two factors involved. The - first depends on whether the axis permutation array for the template - SpecFluxFrame (whose method we are executing) causes an axis - reversal. Determine this by permuting axis index zero. */ - swap1 = ( astValidateAxis( template, 0, 1, "astMatch" ) != 0 ); - -/* The second factor depends on whether the axes of the target SpecFluxFrame - causes an axis reversal. Determine this by permuting axis index zero. */ - swap2 = ( astValidateAxis( target, 0, 1, "astMatch" ) != 0 ); - -/* Combine these to determine if an additional axis swap will be - needed. */ - swap = ( swap1 != swap2 ); - -/* Now check to see if this additional swap is permitted by the template's - Permute attribute. */ - match = ( !swap || astGetPermute( template ) ); - -/* Allocate the target and template axes arrays. */ - *template_axes = astMalloc( sizeof(int)*2 ); - *target_axes = astMalloc( sizeof(int)*2 ); - -/* If the Frames still match, we next set up the axis association - arrays. */ - if ( astOK && match ) { - -/* If the target axis order is to be preserved, then the target axis - association involves no permutation but the template axis - association may involve an axis swap. */ - if ( astGetPreserveAxes( template ) ) { - (*template_axes)[ 0 ] = swap; - (*template_axes)[ 1 ] = !swap; - (*target_axes)[ 0 ] = 0; - (*target_axes)[ 1 ] = 1; - -/* Otherwise, any swap applies to the target axis association - instead. */ - } else { - (*template_axes)[ 0 ] = 0; - (*template_axes)[ 1 ] = 1; - (*target_axes)[ 0 ] = swap; - (*target_axes)[ 1 ] = !swap; - } - -/* Use the target's "astSubFrame" method to create a new Frame (the - result Frame) with copies of the target axes in the required - order. This process also overlays the template attributes on to the - target Frame and returns a Mapping between the target and result - Frames which effects the required coordinate conversion. */ - match = astSubFrame( target, template, 2, *target_axes, *template_axes, - map, result ); - -/* If an error occurred, or conversion to the result Frame's - coordinate system was not possible, then free all memory, annul the - returned objects, and reset the returned value. */ - if ( !astOK || !match ) { - *template_axes = astFree( *template_axes ); - *target_axes = astFree( *target_axes ); - if( *map ) *map = astAnnul( *map ); - if( *result ) *result = astAnnul( *result ); - match = 0; - } - } - } - -/* Return the result. */ - return match; -} - -static int SubFrame( AstFrame *target_frame, AstFrame *template, - int result_naxes, const int *target_axes, - const int *template_axes, AstMapping **map, - AstFrame **result, int *status ) { -/* -* Name: -* SubFrame - -* Purpose: -* Select axes from a SpecFluxFrame and convert to the new coordinate system. - -* Type: -* Private function. - -* Synopsis: -* #include "specfluxframe.h" -* int SubFrame( AstFrame *target, AstFrame *template, -* int result_naxes, const int *target_axes, -* const int *template_axes, AstMapping **map, -* AstFrame **result, int *status ) - -* Class Membership: -* SpecFluxFrame member function (over-rides the protected astSubFrame -* method inherited from the Frame class). - -* Description: -* This function selects a requested sub-set (or super-set) of the -* axes from a "target" SpecFluxFrame and creates a new Frame with -* copies of the selected axes assembled in the requested order. It -* then optionally overlays the attributes of a "template" Frame on -* to the result. It returns both the resulting Frame and a Mapping -* that describes how to convert between the coordinate systems -* described by the target and result Frames. If necessary, this -* Mapping takes account of any differences in the Frames' -* attributes due to the influence of the template. - -* Parameters: -* target -* Pointer to the target SpecFluxFrame, from which axes are to be selected. -* template -* Pointer to the template Frame, from which new attributes for -* the result Frame are to be obtained. Optionally, this may be -* NULL, in which case no overlaying of template attributes will -* be performed. -* result_naxes -* Number of axes to be selected from the target Frame. This -* number may be greater than or less than the number of axes in -* this Frame (or equal). -* target_axes -* Pointer to an array of int with result_naxes elements, giving -* a list of the (zero-based) axis indices of the axes to be -* selected from the target SpecFluxFrame. The order in which these -* are given determines the order in which the axes appear in -* the result Frame. If any of the values in this array is set -* to -1, the corresponding result axis will not be derived from -* the target Frame, but will be assigned default attributes -* instead. -* template_axes -* Pointer to an array of int with result_naxes elements. This -* should contain a list of the template axes (given as -* zero-based axis indices) with which the axes of the result -* Frame are to be associated. This array determines which axes -* are used when overlaying axis-dependent attributes of the -* template on to the result. If any element of this array is -* set to -1, the corresponding result axis will not receive any -* template attributes. -* -* If the template argument is given as NULL, this array is not -* used and a NULL pointer may also be supplied here. -* map -* Address of a location to receive a pointer to the returned -* Mapping. The forward transformation of this Mapping will -* describe how to convert coordinates from the coordinate -* system described by the target SpecFluxFrame to that described by -* the result Frame. The inverse transformation will convert in -* the opposite direction. -* result -* Address of a location to receive a pointer to the result Frame. -* status -* Pointer to the inherited status variable. - -* Returned Value: -* A non-zero value is returned if coordinate conversion is -* possible between the target and the result Frame. Otherwise zero -* is returned and *map and *result are returned as NULL (but this -* will not in itself result in an error condition). In general, -* coordinate conversion should always be possible if no template -* Frame is supplied but may not always be possible otherwise. - -* Notes: -* - A value of zero will be returned if this function is invoked -* with the global error status set, or if it should fail for any -* reason. - -* Implementation Deficiencies: -* - It is not clear that the method of handling "extra" axes is -* the best one, nor is the method of setting the "following" flag -* necessarily correct. However, it is also not obvious that this -* feature will ever be needed, so improvements have been left -* until the requirement is clearer. -*/ - -/* Local Variables: */ - AstMapping *tmpmap; /* Temporary Mapping pointer */ - AstPermMap *permmap; /* Pointer to PermMap */ - AstSpecFluxFrame *target; /* Pointer to target SpecFluxFrame structure */ - int match; /* Coordinate conversion is possible? */ - int perm[ 2 ]; /* Permutation array for axis swap */ - int result_swap; /* Swap result SpecFluxFrame coordinates? */ - int target_swap; /* Swap target SpecFluxFrame coordinates? */ - -/* Initialise the returned values. */ - *map = NULL; - *result = NULL; - match = 0; - -/* Check the global error status. */ - if ( !astOK ) return match; - -/* If the template is not a SpecFluxFrame we use the parent SubFrame - method inherited form the CmpFrame class. */ - if( !template || !astIsASpecFluxFrame( template ) || result_naxes != 2 ) { - match = (*parent_subframe)( target_frame, template, result_naxes, - target_axes, template_axes, map, result, status ); - -/* Otherwise... */ - } else { - -/* Obtain a pointer to the target SpecFluxFrame structure. */ - target = (AstSpecFluxFrame *) target_frame; - -/* Form the result from a copy of the target and then permute its axes - into the order required. */ - *result = astCopy( target ); - astPermAxes( *result, target_axes ); - -/* Overlay the template attributes on to the result SpecFrame. */ - astOverlay( template, template_axes, *result ); - -/* Generate a Mapping that takes account of changes in the coordinate - system (system, units, etc.) between the target SpecFluxFrame and the - result SpecFluxFrame. If this Mapping can be generated, set "match" to - indicate that coordinate conversion is possible. */ - match = MakeSFMapping( target, (AstSpecFluxFrame *) *result, map, status ); - -/* If a Mapping has been obtained, it will expect coordinate values to be - supplied in (flux,spec) pairs. Test whether we need to swap the - order of the target SpecFluxFrame coordinates to conform with this. */ - if ( astOK && match ) { - target_swap = ( astValidateAxis( target, 0, 1, "astSubFrame" ) != 0 ); - -/* Coordinates will also be delivered in (flux,spec) pairs, so check - to see whether the result SpecFluxFrame coordinate order should be - swapped. */ - result_swap = ( target_swap != ( target_axes[ 0 ] != 0 ) ); - -/* If either set of coordinates needs swapping, create a PermMap that - will swap a pair of coordinates. */ - permmap = NULL; - if ( target_swap || result_swap ) { - perm[ 0 ] = 1; - perm[ 1 ] = 0; - permmap = astPermMap( 2, perm, 2, perm, NULL, "", status ); - } - -/* If necessary, prefix this PermMap to the main Mapping. */ - if ( target_swap ) { - tmpmap = (AstMapping *) astCmpMap( permmap, *map, 1, "", status ); - *map = astAnnul( *map ); - *map = tmpmap; - } - -/* Also, if necessary, append it to the main Mapping. */ - if ( result_swap ) { - tmpmap = (AstMapping *) astCmpMap( *map, permmap, 1, "", status ); - *map = astAnnul( *map ); - *map = tmpmap; - } - -/* Annul the pointer to the PermMap (if created). */ - if ( permmap ) permmap = astAnnul( permmap ); - } - } - -/* If an error occurred, clean up by annulling the result pointers and - returning appropriate null values. */ - if ( !astOK ) { - *map = astAnnul( *map ); - *result = astAnnul( *result ); - match = 0; - } - -/* Return the result. */ - return match; -} - -/* Functions which access class attributes. */ -/* ---------------------------------------- */ -/* Implement member functions to access the attributes associated with - the axes of a SpecFluxFrame using the private macros defined for this - purpose at the start of this file. */ - -/* Copy constructor. */ -/* ----------------- */ - -/* Destructor. */ -/* ----------- */ - -/* Dump function. */ -/* -------------- */ -static void Dump( AstObject *this_object, AstChannel *channel, int *status ) { -/* -* Name: -* Dump - -* Purpose: -* Dump function for SpecFluxFrame objects. - -* Type: -* Private function. - -* Synopsis: -* void Dump( AstObject *this, AstChannel *channel, int *status ) - -* Description: -* This function implements the Dump function which writes out data -* for the SpecFluxFrame class to an output Channel. - -* Parameters: -* this -* Pointer to the SpecFluxFrame whose data are being written. -* channel -* Pointer to the Channel to which the data are being written. -* status -* Pointer to the inherited status variable. -*/ - -/* Local Variables: */ - AstSpecFluxFrame *this; /* Pointer to the SpecFluxFrame structure */ - -/* Check the global error status. */ - if ( !astOK ) return; - -/* Obtain a pointer to the SpecFluxFrame structure. */ - this = (AstSpecFluxFrame *) this_object; - -/* Write out values representing the instance variables for the - SpecFluxFrame class. Accompany these with appropriate comment strings, - possibly depending on the values being written.*/ - -/* In the case of attributes, we first use the appropriate (private) - Test... member function to see if they are set. If so, we then use - the (private) Get... function to obtain the value to be written - out. - - For attributes which are not set, we use the astGet... method to - obtain the value instead. This will supply a default value - (possibly provided by a derived class which over-rides this method) - which is more useful to a human reader as it corresponds to the - actual default attribute value. Since "set" will be zero, these - values are for information only and will not be read back. */ - -} - -/* Standard class functions. */ -/* ========================= */ -/* Implement the astIsASpecFluxFrame and astCheckSpecFluxFrame functions using - the macros defined for this purpose in the "object.h" header file. */ -astMAKE_ISA(SpecFluxFrame,CmpFrame) -astMAKE_CHECK(SpecFluxFrame) - -AstSpecFluxFrame *astSpecFluxFrame_( void *frame1_void, void *frame2_void, - const char *options, int *status, ...) { -/* -*++ -* Name: -c astSpecFluxFrame -f AST_SPECFLUXFRAME - -* Purpose: -* Create a SpecFluxFrame. - -* Type: -* Public function. - -* Synopsis: -c #include "specfluxframe.h" -c AstSpecFluxFrame *astSpecFluxFrame( AstSpecFrame *frame1, AstFluxFrame *frame2, -c const char *options, ... ) -f RESULT = AST_SPECFLUXFRAME( FRAME1, FRAME2, OPTIONS, STATUS ) - -* Class Membership: -* SpecFluxFrame constructor. - -* Description: -* This function creates a new SpecFluxFrame and optionally initialises -* its attributes. -* -* A SpecFluxFrame combines a SpecFrame and a FluxFrame into a single -* 2-dimensional compound Frame. Such a Frame can for instance be used -* to describe a Plot of a spectrum in which the first axis represents -* spectral position and the second axis represents flux. - -* Parameters: -c frame1 -f FRAME1 = INTEGER (Given) -* Pointer to the SpecFrame. This will form the first axis in the -* new SpecFluxFrame. -c frame2 -f FRAME2 = INTEGER (Given) -* Pointer to the FluxFrame. This will form the second axis in the -* new SpecFluxFrame. The "SpecVal" attribute of this FluxFrame is -* not used by the SpecFluxFrame class and so may be set to AST__BAD -* when the FluxFrame is created. -c options -f OPTIONS = CHARACTER * ( * ) (Given) -c Pointer to a null-terminated string containing an optional -c comma-separated list of attribute assignments to be used for -c initialising the new SpecFluxFrame. The syntax used is identical to -c that for the astSet function and may include "printf" format -c specifiers identified by "%" symbols in the normal way. -f A character string containing an optional comma-separated -f list of attribute assignments to be used for initialising the -f new SpecFluxFrame. The syntax used is identical to that for the -f AST_SET routine. -c ... -c If the "options" string contains "%" format specifiers, then -c an optional list of additional arguments may follow it in -c order to supply values to be substituted for these -c specifiers. The rules for supplying these are identical to -c those for the astSet function (and for the C "printf" -c function). -f STATUS = INTEGER (Given and Returned) -f The global status. - -* Returned Value: -c astSpecFluxFrame() -f AST_SPECFLUXFRAME = INTEGER -* A pointer to the new SpecFluxFrame. - -* Notes: -* - The supplied Frame pointers are stored directly, rather than -* being used to create deep copies of the supplied Frames. This means -* that any subsequent changes made to the Frames via the supplied -* pointers will result in equivalent changes being visible in the -* SpecFluxFrame. -* - A null Object pointer (AST__NULL) will be returned if this -c function is invoked with the AST error status set, or if it -f function is invoked with STATUS set to an error value, or if it -* should fail for any reason. - -* Status Handling: -* The protected interface to this function includes an extra -* parameter at the end of the parameter list descirbed above. This -* parameter is a pointer to the integer inherited status -* variable: "int *status". - -*-- - -* Implementation Notes: -* - This function implements the basic SpecFluxFrame constructor which -* is available via the protected interface to the SpecFluxFrame class. -* A public interface is provided by the astSpecFluxFrameId_ function. -* - Because this function has a variable argument list, it is -* invoked by a macro that evaluates to a function pointer (not a -* function invocation) and no checking or casting of arguments is -* performed before the function is invoked. Because of this, the -* "frame1" and "frame2" parameters are of type (void *) and are -* converted and validated within the function itself. -*/ - -/* Local Variables: */ - astDECLARE_GLOBALS /* Pointer to thread-specific global data */ - AstSpecFluxFrame *new; /* Pointer to new SpecFluxFrame */ - AstFluxFrame *frame2; /* Pointer to FluxFrame structure */ - AstSpecFrame *frame1; /* Pointer to SpecFrame structure */ - va_list args; /* Variable argument list */ - -/* Get a pointer to the thread specific global data structure. */ - astGET_GLOBALS(NULL); - -/* Check the global status. */ - new = NULL; - if ( !astOK ) return new; - -/* Obtain and validate pointers to the Frame structures provided. */ - frame1 = astCheckSpecFrame( frame1_void ); - frame2 = astCheckFluxFrame( frame2_void ); - if ( astOK ) { - -/* Initialise the SpecFluxFrame, allocating memory and initialising the - virtual function table as well if necessary. */ - new = astInitSpecFluxFrame( NULL, sizeof( AstSpecFluxFrame ), !class_init, - &class_vtab, "SpecFluxFrame", frame1, frame2 ); - -/* If successful, note that the virtual function table has been - initialised. */ - if ( astOK ) { - class_init = 1; - -/* Obtain the variable argument list and pass it along with the - options string to the astVSet method to initialise the new - SpecFluxFrame's attributes. */ - va_start( args, status ); - astVSet( new, options, NULL, args ); - va_end( args ); - -/* If an error occurred, clean up by deleting the new object. */ - if ( !astOK ) new = astDelete( new ); - } - } - -/* Return a pointer to the new SpecFluxFrame. */ - return new; -} - -AstSpecFluxFrame *astSpecFluxFrameId_( void *frame1_void, void *frame2_void, - const char *options, ... ) { -/* -* Name: -* astSpecFluxFrameId_ - -* Purpose: -* Create a SpecFluxFrame. - -* Type: -* Private function. - -* Synopsis: -* #include "specfluxframe.h" -* AstSpecFluxFrame *astSpecFluxFrameId_( void *frame1_void, void *frame2_void, -* const char *options, ... ) - -* Class Membership: -* SpecFluxFrame constructor. - -* Description: -* This function implements the external (public) interface to the -* astSpecFluxFrame constructor function. It returns an ID value -* (instead of a true C pointer) to external users, and must be -* provided because astSpecFluxFrame_ has a variable argument list which -* cannot be encapsulated in a macro (where this conversion would -* otherwise occur). For the same reason, the "frame1" and "frame2" -* parameters are of type (void *) and are converted and validated -* within the function itself. -* -* The variable argument list also prevents this function from -* invoking astSpecFluxFrame_ directly, so it must be a -* re-implementation of it in all respects, except for the final -* conversion of the result to an ID value. - -* Parameters: -* As for astSpecFluxFrame_. - -* Returned Value: -* The ID value associated with the new SpecFluxFrame. -*/ - -/* Local Variables: */ - astDECLARE_GLOBALS /* Pointer to thread-specific global data */ - AstSpecFluxFrame *new; /* Pointer to new SpecFluxFrame */ - AstSpecFrame *frame1; /* Pointer to first Frame structure */ - AstFluxFrame *frame2; /* Pointer to second Frame structure */ - va_list args; /* Variable argument list */ - - int *status; /* Get a pointer to the thread specific global data structure. */ - astGET_GLOBALS(NULL); - -/* Pointer to inherited status value */ - -/* Get a pointer to the inherited status value. */ - status = astGetStatusPtr; - -/* Check the global status. */ - new = NULL; - if ( !astOK ) return new; - -/* Obtain the Frame pointers from the ID's supplied and validate the - pointers to ensure they identify valid Frames. */ - frame1 = astVerifySpecFrame( astMakePointer( frame1_void ) ); - frame2 = astVerifyFluxFrame( astMakePointer( frame2_void ) ); - if ( astOK ) { - -/* Initialise the SpecFluxFrame, allocating memory and initialising the - virtual function table as well if necessary. */ - new = astInitSpecFluxFrame( NULL, sizeof( AstSpecFluxFrame ), !class_init, - &class_vtab, "SpecFluxFrame", frame1, frame2 ); - -/* If successful, note that the virtual function table has been - initialised. */ - if ( astOK ) { - class_init = 1; - -/* Obtain the variable argument list and pass it along with the - options string to the astVSet method to initialise the new - SpecFluxFrame's attributes. */ - va_start( args, options ); - astVSet( new, options, NULL, args ); - va_end( args ); - -/* If an error occurred, clean up by deleting the new object. */ - if ( !astOK ) new = astDelete( new ); - } - } - -/* Return an ID value for the new SpecFluxFrame. */ - return astMakeId( new ); -} - -AstSpecFluxFrame *astInitSpecFluxFrame_( void *mem, size_t size, int init, - AstSpecFluxFrameVtab *vtab, const char *name, - AstSpecFrame *frame1, AstFluxFrame *frame2, int *status ) { -/* -*+ -* Name: -* astInitSpecFluxFrame - -* Purpose: -* Initialise a SpecFluxFrame. - -* Type: -* Protected function. - -* Synopsis: -* #include "specfluxframe.h" -* AstSpecFluxFrame *astInitSpecFluxFrame( void *mem, size_t size, int init, -* AstSpecFluxFrameVtab *vtab, const char *name, -* AstSpecFrame *frame1, AstFluxFrame *frame2 ) - -* Class Membership: -* SpecFluxFrame initialiser. - -* Description: -* This function is provided for use by class implementations to -* initialise a new SpecFluxFrame object. It allocates memory (if -* necessary) to accommodate the SpecFluxFrame plus any additional data -* associated with the derived class. It then initialises a -* SpecFluxFrame structure at the start of this memory. If the "init" -* flag is set, it also initialises the contents of a virtual -* function table for a SpecFluxFrame at the start of the memory passed -* via the "vtab" parameter. - -* Parameters: -* mem -* A pointer to the memory in which the SpecFluxFrame is to be -* created. This must be of sufficient size to accommodate the -* SpecFluxFrame data (sizeof(SpecFluxFrame)) plus any data used by the -* derived class. If a value of NULL is given, this function -* will allocate the memory itself using the "size" parameter to -* determine its size. -* size -* The amount of memory used by the SpecFluxFrame (plus derived class -* data). This will be used to allocate memory if a value of -* NULL is given for the "mem" parameter. This value is also -* stored in the SpecFluxFrame structure, so a valid value must be -* supplied even if not required for allocating memory. -* init -* A logical flag indicating if the SpecFluxFrame's virtual function -* table is to be initialised. If this value is non-zero, the -* virtual function table will be initialised by this function. -* vtab -* Pointer to the start of the virtual function table to be -* associated with the new SpecFluxFrame. -* name -* Pointer to a constant null-terminated character string which -* contains the name of the class to which the new object -* belongs (it is this pointer value that will subsequently be -* returned by the Object astClass function). -* frame1 -* Pointer to the SpecFrame -* frame2 -* Pointer to the FluxFrame - -* Returned Value: -* A pointer to the new SpecFluxFrame. - -* Notes: -* - A null pointer will be returned if this function is invoked -* with the global error status set, or if it should fail for any -* reason. -*- -*/ - -/* Local Variables: */ - AstSpecFluxFrame *new; /* Pointer to new SpecFluxFrame */ - -/* Check the global status. */ - if ( !astOK ) return NULL; - -/* If necessary, initialise the virtual function table. */ - if ( init ) astInitSpecFluxFrameVtab( vtab, name ); - -/* Initialise a Frame structure (the parent class) as the first - component within the SpecFluxFrame structure, allocating memory if - necessary. Set the number of Frame axes to zero, since all axis - information is stored within the component Frames. */ - new = astInitCmpFrame( mem, size, 0, (AstCmpFrameVtab *) vtab, name, - frame1, frame2 ); - if ( astOK ) { - - -/* If an error occurred, clean up by deleting the new object. */ - if ( !astOK ) new = astDelete( new ); - } - -/* Return a pointer to the new object. */ - return new; -} - -AstSpecFluxFrame *astLoadSpecFluxFrame_( void *mem, size_t size, - AstSpecFluxFrameVtab *vtab, const char *name, - AstChannel *channel, int *status ) { -/* -*+ -* Name: -* astLoadSpecFluxFrame - -* Purpose: -* Load a SpecFluxFrame. - -* Type: -* Protected function. - -* Synopsis: -* #include "specfluxframe.h" -* AstSpecFluxFrame *astLoadSpecFluxFrame( void *mem, size_t size, -* AstSpecFluxFrameVtab *vtab, const char *name, -* AstChannel *channel ) - -* Class Membership: -* SpecFluxFrame loader. - -* Description: -* This function is provided to load a new SpecFluxFrame using data read -* from a Channel. It first loads the data used by the parent class -* (which allocates memory if necessary) and then initialises a -* SpecFluxFrame structure in this memory, using data read from the -* input Channel. - -* Parameters: -* mem -* A pointer to the memory into which the SpecFluxFrame is to be -* loaded. This must be of sufficient size to accommodate the -* SpecFluxFrame data (sizeof(SpecFluxFrame)) plus any data used by -* derived classes. If a value of NULL is given, this function -* will allocate the memory itself using the "size" parameter to -* determine its size. -* size -* The amount of memory used by the SpecFluxFrame (plus derived class -* data). This will be used to allocate memory if a value of -* NULL is given for the "mem" parameter. This value is also -* stored in the SpecFluxFrame structure, so a valid value must be -* supplied even if not required for allocating memory. -* -* If the "vtab" parameter is NULL, the "size" value is ignored -* and sizeof(AstSpecFluxFrame) is used instead. -* vtab -* Pointer to the start of the virtual function table to be -* associated with the new SpecFluxFrame. If this is NULL, a pointer -* to the (static) virtual function table for the SpecFluxFrame class -* is used instead. -* name -* Pointer to a constant null-terminated character string which -* contains the name of the class to which the new object -* belongs (it is this pointer value that will subsequently be -* returned by the astGetClass method). -* -* If the "vtab" parameter is NULL, the "name" value is ignored -* and a pointer to the string "SpecFluxFrame" is used instead. - -* Returned Value: -* A pointer to the new SpecFluxFrame. - -* Notes: -* - A null pointer will be returned if this function is invoked -* with the global error status set, or if it should fail for any -* reason. -*- -*/ - -/* Local Constants: */ - astDECLARE_GLOBALS /* Pointer to thread-specific global data */ -#define KEY_LEN 50 /* Maximum length of a keyword */ - -/* Local Variables: */ - AstSpecFluxFrame *new; /* Pointer to the new SpecFluxFrame */ - -/* Initialise. */ - new = NULL; - -/* Get a pointer to the thread specific global data structure. */ - astGET_GLOBALS(channel); - -/* Check the global error status. */ - if ( !astOK ) return new; - -/* If a NULL virtual function table has been supplied, then this is - the first loader to be invoked for this SpecFluxFrame. In this case the - SpecFluxFrame belongs to this class, so supply appropriate values to be - passed to the parent class loader (and its parent, etc.). */ - if ( !vtab ) { - size = sizeof( AstSpecFluxFrame ); - vtab = &class_vtab; - name = "SpecFluxFrame"; - -/* If required, initialise the virtual function table for this class. */ - if ( !class_init ) { - astInitSpecFluxFrameVtab( vtab, name ); - class_init = 1; - } - } - -/* Invoke the parent class loader to load data for all the ancestral - classes of the current one, returning a pointer to the resulting - partly-built SpecFluxFrame. */ - new = astLoadCmpFrame( mem, size, (AstCmpFrameVtab *) vtab, name, - channel ); - - if ( astOK ) { - -/* Read input data. */ -/* ================ */ -/* Request the input Channel to read all the input data appropriate to - this class into the internal "values list". */ - astReadClassData( channel, "SpecFluxFrame" ); - -/* Now read each individual data item from this list and use it to - initialise the appropriate instance variable(s) for this class. */ - -/* In the case of attributes, we first read the "raw" input value, - supplying the "unset" value as the default. If a "set" value is - obtained, we then use the appropriate (private) Set... member - function to validate and set the value properly. */ -/* (none) */ - -/* If an error occurred, clean up by deleting the new SpecFluxFrame. */ - if ( !astOK ) new = astDelete( new ); - } - -/* Return the new SpecFluxFrame pointer. */ - return new; - -/* Undefine macros local to this function. */ -#undef KEY_LEN -} - -/* Virtual function interfaces. */ -/* ============================ */ -/* These provide the external interface to the virtual functions defined by - this class. Each simply checks the global error status and then locates and - executes the appropriate member function, using the function pointer stored - in the object's virtual function table (this pointer is located using the - astMEMBER macro defined in "object.h"). - - Note that the member function may not be the one defined here, as it may - have been over-ridden by a derived class. However, it should still have the - same interface. */ - - - - - |