Ejemplo n.º 1
0
long getFITSCards( FILE * FITSFile, long maxKeys, struct keyword * keys[])
/*  *    *    *    *    *    *    *    *    *    *    *    *    *    *    *  */
/* getFITSCards() reads file and table headers and returns an array of       */
/* keyword structures                                                        */
/*  *    *    *    *    *    *    *    *    *    *    *    *    *    *    *  */
{ long nCards = 0, nRead = 0, i = 0, cardType = FITSUNKNOWN;
  char aCard[90] = "";

  for (i = 0; i < maxKeys; i++) {
    nRead = fread( aCard, 80, 1, FITSFile);
    if (nRead != 1) 
      break;
    aCard[80] = EOS;
    cardType = parseCard( aCard, keys[i]);
    stripWhite( aCard);
    nCards++;
    if (cardType == FITSEND) 
      break;
  } /* end of for all cards in header */

  for (i = 0; (i + nCards) % 36 != 0; i++) 
    nRead = fread( aCard, 80, 1, FITSFile);

  return( nCards);
} /* end of getFITSCards */
Ejemplo n.º 2
0
char * addSlash( char * directoryName)
{
  if (directoryName == NULL) {
    fprintf( stderr, "addSlash: NULL directory Name\n");
    return("NULL directory Name");
  }

  stripWhite( directoryName);

  if (directoryName[ strlen( directoryName)-1] != '/')
    strcat( directoryName, "/");

  return(NULL);
} /* end of addSlash() */
Ejemplo n.º 3
0
void
GvFieldData::addEnumValue(const char *typeNameArg,
			  const char *valNameArg, int val)
{
    struct GvEnumEntry	*e = NULL;
    GvName typeName = stripWhite(typeNameArg);
    GvName valName = stripWhite(valNameArg);

    for (int i=0; i<enums.getLength(); i++) {
	e = (struct GvEnumEntry *) enums[i];
	if (e->typeName == typeName)
	    break;
	else
	    e = NULL;
    }
    if (e == NULL) {
	e = new GvEnumEntry(typeName);
	enums.append((void*) e);
    }
    if (e->num == e->arraySize) {
	e->arraySize += GvEnumEntry::growSize;
	int *ovals = e->vals;
	GvName *onames = e->names;
	e->vals = new int[e->arraySize];
	e->names = new GvName[e->arraySize];
	for (int i=0; i<e->num; i++) {
	    e->vals[i] = ovals[i];
	    e->names[i] = onames[i];
	}
	delete [] ovals;
	delete [] onames;
    }
    e->vals[e->num] = val;
    e->names[e->num] = valName;
    e->num++;
}
Ejemplo n.º 4
0
void
GvFieldData::getEnumData(const char *typeNameArg, int &num,
			 const int *&vals, const GvName *&names)
{
    GvName typeName = stripWhite(typeNameArg);

    for (int i=0; i<enums.getLength(); i++) {
	struct GvEnumEntry *e = (struct GvEnumEntry *) enums[i];
	if (e->typeName == typeName) {
	    num		= e->num;
	    vals	= e->vals;
	    names	= e->names;
	    return;
	}
    }
    num = 0;
    vals = NULL;
    names = NULL;
}
Ejemplo n.º 5
0
long getFileName( char * inDir, char * inName, char * inType, char * outName)
/*  *    *    *    *    *    *    *    *    *    *    *    *    *    *    *  */
/* makeFileName() make a file name from a directory and inName.  If the      */
/* the inName is blank, a file name based on the date is created             */
/*  *    *    *    *    *    *    *    *    *    *    *    *    *    *    *  */
{ long i, dummyMJD = 0, dirMade = 0;
  char dateStr[30] = "", mapStr[30] = "", tmpName[256] = "";

  if ( inDir == NULL)                       /* if null make standard dir */
    strcpy( tmpName, "");                   /* default directory */
  else if (strlen(inDir) == 0)              /* if no chars in name */
    strcpy( tmpName, "");                   /* default directory is current*/
  else
    strncpy( tmpName, inDir, 127);          /* else use input */

  i = strlen( tmpName);                    
  if (i > 0)
    if (tmpName[i-1] != '/')                /* divide directory and file */ 
      strcat( tmpName, "/");
  
  if (inName == NULL)                       /* if in Name not given */
    i = 0;
  else 
    i = strlen( inName);                    /* get length of name */

  if (i > 0 && i < 100)                     /* if input file name not null */
    strcat( tmpName, inName);  
  else {                                    /* else must make file name */
    mjd2AIPS( dummyMJD, dateStr, mapStr);   /* get today and obs first dates*/
    strncat( tmpName, &dateStr[4], 20);     /* use month day part of date */
    stripWhite(tmpName);
  }

  if (inType)                               /* if inType given */
    if (strlen(inType) > 0)
      strncat( tmpName, inType, 20);        /* append to output name */

  if (outName)
    strncpy( outName, tmpName, 100);

  return(dirMade);
} /* end of getFileName() */
Ejemplo n.º 6
0
long AIPS2mjd( char * dateStr)
/*  *    *    *    *    *    *    *    *    *    *    *    *    *    *    *  */
/* AIPS2mjd() takes an AIPS data string and returns the MJD for that string  */
/*  *    *    *    *    *    *    *    *    *    *    *    *    *    *    *  */
{ int i = 0, year = 0, month = 0, day = 0;
  long todayMJD = 0, oldFormat=1;
  char dateTemp[30];

  for (i = 0; i < 29 && dateStr[i] != '\0'; i ++)/* copy to scratch string */
    dateTemp[i] = dateStr[i];

  dateTemp[i] = '\0';                            /* terminate string */
  stripWhite( dateTemp);                         /* remove leading/trailing */

  if (dateTemp[0] == '\'' || dateTemp[0] == '"') /* remove leading ' */
    for (i = 1; i < 30 && dateTemp[i] != '\0'; i ++)
      dateTemp[i-1] = dateTemp[i];

  if (strlen( dateTemp) < 8)                     /* has at least 8 chars *?*/
    return(-1);                                  /* not expected string */

  for (i = 0; dateTemp[i] != '\0'; i ++) {       /* replace / and - with blank */
    if (dateTemp[i] == '/')                      /* old format */
      dateTemp[i] = ' ';
    if (dateTemp[i] == '-') {                    /* new format */
      dateTemp[i] = ' ';
      oldFormat=0;
    } /* end if new format */
  } /* end for i */

  if (oldFormat==1) 
    sscanf(dateTemp,"%d %d %d", &day, &month, &year);
  else
    sscanf(dateTemp,"%d %d %d", &year, &month, &day);

  todayMJD = dayMonthYear2mjd( day, month, year);
  return( todayMJD);
} /* end of AIPS2mjd() */
Ejemplo n.º 7
0
char * dateObs2DMjd( char * dateObs, double * dMjd)
{ int i = 0, day = 0, month = 0, year = 0;
  double utc = 0;
  long mjd = 0;
  char dateString[31] = "", timeString[31] = "";
  static long printCount = 0;

  *dMjd = 0;                            /* init output */

  if (dateObs)
    strncpy ( dateString, dateObs, 30);
  else
    return( "NULL date string");

  dateString[30] = EOS;                    /* maximum time string len */

  /* convert DATE_OBS= '2000-10-23T00:00:00' to '2000 10 23' */
  for (i = 0; i < strlen(dateString); i++)  
    if (dateString[i] == '-')
      dateString[i] = ' ';
    else if (dateString[i] == '_')
      dateString[i] = ' ';
    else if (dateString[i] == '\'')
      dateString[i] = ' ';
    else if (dateString[i] == 'T') {
      dateString[i] = EOS;
      strcpy( timeString, &dateString[i+1]);
    }

  stripWhite( dateString);

  if (strlen (dateString) < 3)
    return(NULL);

  sscanf( dateString, "%d %d %d", &year, &month, &day);
  mjd = dayMonthYear2mjd( day, month, year);

  for (i = 0; i < strlen(timeString); i++) {
    if (timeString[i] == '\'')
      timeString[i] = ' ';
    else if (isalpha(timeString[i])) {
      timeString[i] = EOS;
      break;
    }
  }

  /* find 12:34:56.78 and  convert to 12h34m56.78 */
  for (i = 0; i < strlen(timeString); i++)  
    if (timeString[i] == ':') {
      timeString[i] = 'h';
      timeString[i+3] = 'm';
      timeString[i+9] = EOS;
      break;
    }      

  for (i = 0; i < strlen(timeString); i++)  
    if (timeString[i] == '\'') 
      timeString[i] = EOS;

  stripWhite( timeString);

  str2rad( timeString, &utc);

  *dMjd = mjd + (utc/TWOPI);

  /* if out of range time and not many messages printed */
  if ((utc < 0 || utc > TWOPI) && printCount < 2) {
    fprintf( stderr, "dateObs2DMjd: %s -> %s %s => %8.2f\n", 
	     dateObs, dateString, timeString, *dMjd);
    printCount++;
  }
  return(NULL);
} /* end of dateObs2DMjd() */
Ejemplo n.º 8
0
char * fileName2DMjd( char * fileName, double * dMjd)
{ int i = 0, day = 0, month = 0, year = 0, j = 0, n = 0;
  double utc = 0;
  long mjd = 0;
  char dateString[50] = "", timeString[50] = "";

  if (fileName) {
    /* convert /home/gbtdata/HIOH/GO/2001_09_20_09:55:30A.fits */
    /* => 2001_09_20_09:55:30A.fits */
    for (i = 0; i < strlen( fileName); i++) {
      if (fileName[i] == '/')
	j = 0;
      else {
	dateString[j] = fileName[i];
	j++;
      }
    }
  }
  else
    return( "NULL date string");

  dateString[j] = EOS;
  n = strlen(dateString);

  /*convert 2001_09_20_09:55:30A.fits => 2001_09_20_09:55:30A => */
  for (i = 0; i < n; i++) {
    if (dateString[i] == '.') {
      dateString[i] = EOS;
      break;
    }
  }
  
  n = strlen(dateString);
  /*convert 2001_09_20_09:55:30A => 2001_09_20_09:55:30 */
  if (n > 1) {
    if (isalpha( dateString[n-1]))
      dateString[n-1] = EOS;
  }

  stripWhite( dateString);

  n = strlen(dateString);
  /* convert 2001_09_20_09:55:30A => 2001 09 20 09:55:30 */
  for (i = 0; i < n; i++)  
    if (dateString[i] == '_' || dateString[i] == '-')
      dateString[i] = ' ';

  stripWhite( dateString);

  sscanf( dateString, "%d %d %d %s", &year, &month, &day, timeString);
  mjd = dayMonthYear2mjd( day, month, year);

  stripWhite( timeString);

  /* find 12:34:56.78 and  convert to 12h34m56.78 */
  for (i = 0; i < strlen(timeString); i++)  
    if (timeString[i] == ':') {
      timeString[i] = 'h';
      timeString[i+3] = 'm';
      timeString[i+8] = EOS;
      break;
    }      

  for (i = 0; i < strlen(timeString); i++)  
    if (timeString[i] == '\'') 
      timeString[i] = EOS;

  stripWhite( timeString);

  str2rad( timeString, &utc);

  *dMjd = mjd + (utc/TWOPI);

  if (utc <= 0 || utc > TWOPI)
    fprintf( stderr, "fileName2DMjd: %s %s => %8.2f\n", 
	     dateString, timeString, *dMjd);
  return(NULL);
} /* end of fileName2DMjd() */
Ejemplo n.º 9
0
long card2Strs( char inCard[], char aKey[], char aStr[], char aCmt[])
/*  *    *    *    *    *    *    *    *    *    *    *    *    *    *    *  */
/* card2Strs() breaks up an input card into three fields, a keyword, a value */
/* and a comment.  Division is based on relations of FITS fields and "="     */
/*  *    *    *    *    *    *    *    *    *    *    *    *    *    *    *  */
{ long i, j, endI = 0, equalI = 0, dataIA = 0, dataIB = 0;
  char aCard[81] = "";

  strncpy( aCard, inCard, 80);
  aCard[80] = EOS;
  aStr[0] = EOS;
  aCmt[0] = EOS;
  stripWhite( aCard);

  for (i = 0; i < 8 && aCard[i] != ' ' && aCard[i] != '=' && aCard[i] != EOS;
       i ++) 
    aKey[i] = aCard[i];
  aKey[i] = EOS;
  endI = i;

  if (strncmp( aKey, "COMMENT", 7) == 0) {
    if (aStr[8] == '=')                           /* if a COMMENT = card */
      strncpy( aStr, &aCard[9], LENCOMMENT);
    else                                          /* else COMMENT foo card */
      strncpy( aStr, &aCard[8], LENCOMMENT);
    aStr[LENCOMMENT-1] = EOS;
    return(endI);
  } /* end if a comment card */

  for (i = endI; aCard[i] != '=' && aCard[i] != EOS; i ++);  /* find '=' */

  if (aCard[i] != '=') {                          /* if no = may be END card */
    strncpy( aCmt, &aCard[endI], LENCOMMENT);
    aCmt[LENCOMMENT-1] = EOS;
    return(endI);
  }
  else
    equalI = i;

  for (i = equalI + 1; i < equalI + 3; i++) /* find quote, after =  */
    if (aCard[i] == '\'') {
      dataIA = i;
      break;
    }

  if (dataIA > 0) {                  /* if a quoted string */
    j = 0;
    for (i = dataIA; aCard[i] != EOS && i < 40; i++) { /* for all chars*/
      aStr[j] = aCard[i];
      j++;
    }
    aStr[j] = EOS;
    for (i = 1; aStr[i] != EOS; i++) { /* for all chars*/
      if (aStr[i] == '\'' && aStr[i-1] != '\'') { /* if not 2 's */
        dataIB = i + dataIA;         /* record end of string */
        aStr[i+1]  = EOS;           /* terminate after ' */
        break;
      }
    }
  }
  else {                          /* not a quoted string, parsed by blanks */
    /* find first non-blank */
    for (i = equalI + 1; aCard[i] == ' '; i++);
    dataIA = i;                        /* found a non-blank or end of string */
    for (i = dataIA; i < 81 && aCard[i] != '\0' && aCard[i] != ' '; i ++)
      aStr[i-dataIA] = aCard[i];       /* move data to begin of string */
    aStr[i-dataIA] = EOS;              /* terminate data */
    dataIB = i;                        /* one char past end of data */
  }
      
  j = 0;
  if (dataIB > 0 && dataIB < strlen(aCard)) {
    /* find / between data and comment */
    for (i = dataIB; aCard[i] != EOS && aCard[i] != '/'; i ++);
    /* set past white space */
    for (i = i+1; aCard[i] != EOS && aCard[i] == ' '; i ++);
    for (i = i; aCard[i] != EOS; i ++) {
      aCmt[j] = aCard[i];
      j++;
    }
  }
  aCmt[j] = EOS;

  return (dataIB);
} /* end of card2Strs() */
Ejemplo n.º 10
0
long parseCard( char aCard[], struct keyword * pKey)
/*  *    *    *    *    *    *    *    *    *    *    *    *    *    *    *  */
/*  *    *    *    *    *    *    *    *    *    *    *    *    *    *    *  */
{ long i, lenStr = 0;

  card2Strs( aCard, pKey->key, pKey->str, pKey->cmt);
  pKey->dbl = 0.;                      /* int values to zero */
  stripWhite( pKey->str);
  stripWhite( pKey->cmt);

  if (strcmp("END", pKey->key) == 0 && strlen(pKey->key) == 3) {
    pKey->type = FITSEND;
  }
  else if (strncmp("COMMENT", pKey->key, 7) == 0 || 
           strncmp("HISTORY", pKey->key, 7) == 0) {
    pKey->type = FITSCOMMENT;
    strcpy(pKey->cmt, pKey->str);
  }
  else if (strncmp("SIMPLE", pKey->key, 6) == 0) {
    pKey->type = FITSLOGICAL;
    pKey->dbl = (pKey->str[1] == 'T') ? 1 : 0;
    pKey->str[0] = EOS;
  }
  else if (strncmp("EXTEND", pKey->key, 6) == 0) {
    pKey->type = FITSLOGICAL;
    pKey->dbl = (pKey->str[1] == 'T') ? 1 : 0;
    pKey->str[0] = EOS;
  }
  else if (aCard[8] != '=' )
    pKey->type = FITSUNKNOWN;
  else if (pKey->str[0] == '\'') {     /* if a quoted string */
    pKey->type = FITSSTRING;
    /* remove leading and trailing \' */
    for (i = 1; pKey->str[i] != EOS; i++)  
      pKey->str[i-1] = pKey->str[i];
    pKey->str[i-2] = EOS;
  }
  else { 
    pKey->type = FITSINTEGER;
    stripWhite( pKey->str);
    /* look for decimal/exponential */
    for (i = 0; i < strlen(pKey->str); i++)  
      if (pKey->str[i] == '.' || pKey->str[i] == 'E' || pKey->str[i] == 'e') {
        sscanf(pKey->str, "%le", &(pKey->dbl));
        pKey->type = FITSFLOAT;
        break;
      }
    /* if here, then not a float, is it a byte or integer */       
    lenStr = strlen(pKey->str);
    if ((lenStr < 80) && (lenStr > 2)) {   /* if a plausible length */
      if ((pKey->str[lenStr-1] == 'B')  ||     /* if a byte type */
	  (pKey->str[lenStr-1] == 'b')) { 
	pKey->type = FITSBYTE;
	pKey->str[lenStr-1] = EOS;
	/* this section checks for cards like
TFORM17 = '33554432B'          / NBIN*NCHAN*NPOL*NSBLK int, byte(B) or bit(X)
	*/
	pKey->dbl = atoi( pKey->str);         /* is a byte type field */
      }
    } /* end if a reasonable length */
    if (pKey->type == FITSINTEGER)          /* if an integer, convert string*/
      pKey->dbl = atoi( pKey->str);
  } /* end default numeric type */

  if (pKey->type == FITSSTRING) {      /* look for string like '05/30/95' */
    if (pKey->str[2] == '/' && pKey->str[5] == '/') {
      pKey->type = FITSDATE;
      pKey->dbl = AIPS2mjd( pKey->str);
    }
  }
  if (pKey->type == 100 && strncmp(pKey->key, "NAXIS", 5) == 0)
    printf( "%ld: %-8s = %s / %s\n", 
	    pKey->type, pKey->key, pKey->str, pKey->cmt);
  return (pKey->type);
} /* end of parseCard() */