📄 fits_asf.cpp
字号:
#include <stdio.h>
#include <vector>
#include "stdafx.h"
#include "ccsds_pro.h"
#include "fits_asf.h"
ZT_t::find_pointer ZT_t::s_ite = NULL;
/*****************************************************
** 函数名: LoadZT
** 输入: hxmtfile, s
** hxmtfile --- 文件名结构
** s --- 存放多个容器的结构体
** 输出:
** 函数执行成功返回0
** 调用说明:
** strUTC2time() .......把年月日是时分秒格式的时间字符串转换成对应的秒
** 功能描述:输入一个姿态文件,把文件中的每行数据的各个字段读入容器中
****************************************************************************************/
int LoadZT( const hxmt_file_t *hxmtfile , struct sci_intern *s )
{
FILE *fp = NULL;
char *buffer = NULL;
if( !hxmtfile || (fp = fopen(hxmtfile->filename.c_str(), "r")) == NULL )//打开文件
return -1;
if( (buffer = (char *)malloc(FREAD_BUFFER_SIZE)) == NULL ) {
fclose(fp);
return -ERROR_NOT_ENOUGH_MEMORY;
}
while( fgets(buffer, FREAD_BUFFER_SIZE, fp) )//从文件中逐行读取数据
{
ZT_t zt;//定义一个姿态数据结构,用于存放文件中一行数据的各个字段
float f;
char *p = NULL;
if( (p = strchr(buffer, '\t')) == NULL )//从第一行开始找到第一个空格
continue;
*p = '\0';
strUTC2time( buffer, &zt.utc);//第一个空格前的时间字符串赋值给zt.utc
sscanf( ++p, "%f", &f );//读取第二个空格前的浮点数到f
zt.trans_lon = f;
if( (p = strchr( p, '\t')) == NULL ) continue;
sscanf( ++p, "%f", &f );//读取第3个空格前的浮点数给f
zt.trans_lon_angle = f;
if( (p = strchr( p, '\t')) == NULL ) continue;
sscanf( ++p, "%f", &f );//读取第4个空格前的浮点数给f
zt.trans_lat = f;
if( (p = strchr( p, '\t')) == NULL ) continue;
sscanf( ++p, "%f", &f );//读取最后一个浮点数给f
zt.trans_lat_angle = f;
s->zt_table.push_back( zt );
}
std::sort( s->zt_table.begin(), s->zt_table.end() );
free( buffer );
fclose( fp );
return 0;
}
/*****************************************************
** 函数名: process_zt
** 输入: hxmtfile,
** hxmtfile --- 文件名结构
** 输出:
** 函数执行成功返回0
** 调用说明:
** get_sci_data() .......
** get_fits_filename()...
** close_fits_zt() ......
** open_fits_zt() .......
** write_fits_zt() ......
** 功能描述: 输入一个姿态文件,处理姿态文件中的数据,并生成相应的fits文件
****************************************************************************************/
int process_zt( const hxmt_file_t *hxmtfile )
{
int modetype;//模式
std::string fits_name;
fitsfile *fptr = NULL;
std::string pathfilename;
hxmt_file_t hxmt = *hxmtfile;
std::string prev_fitsname;
std::vector<ZT_t>::const_iterator end = get_sci_data()->zt_table.end();
for( std::vector<ZT_t>::const_iterator ite = get_sci_data()->zt_table.begin();
ite != end; ++ite )//循环处理姿态容器中的每一个数据
{
hxmt.start.time = ite->utc.time;
hxmt.start.usec = ite->utc.usec;
{
std::string new_fitsname;
get_fits_filename( &hxmt, new_fitsname, pathfilename, modetype, fits_name );//得到新的存放路径和fits文件名
if( new_fitsname != prev_fitsname ) {
prev_fitsname = new_fitsname;
close_fits_zt( fptr );
fptr = NULL;
if( 0 != open_fits_zt( &hxmt, &fptr) ) {
return -3;
}
}
}
write_fits_zt( fptr, ite, 1 );//往fits文件中写数据
}
close_fits_zt( fptr );
return 0;
}
/*****************************************************
** 函数名: open_fits_zt
** 输入: hxmtfile,
** hxmtfile --- 文件名结构
** 输出: *fptr
** *fptr ---
** 调用说明:
** get_fits_filename() .......得到文件名和保存路径以及模式
** DirExist1() .......判断路径是否存在
** CreateFilePath() .......创建一个新路径
** time2strUTC_fitshead() ....秒时间转换成对应的年月日时分秒格式的字符串
** 功能描述: 输入一个姿态文件,生成fits文件,并写入fits头中的关键字,通过fptr返回生成fits文件的结构
****************************************************************************************/
int open_fits_zt( const hxmt_file_t *hxmtfile, fitsfile **fptr )
{
fitsfile *fp;
int status = 0;
std::string filename;
std::string pathname;
int modetype;
std::string fits_name;
if( get_fits_filename(hxmtfile, filename, pathname, modetype, fits_name) )
return -1;
{
extern std::string product_dest_dir;//一级产品保存路径
std::string path = product_dest_dir + pathname + "\\";
if( !DirExist1(path.c_str()) ) {
extern FILE *arch_filep;
pathname += "\n";
fwrite(pathname.c_str(), sizeof(char), pathname.length(), arch_filep);//往id文件中写文件名
}
}
if( !CreateFilePath(filename.c_str()) )
return -2;
if( fits_open_file(&fp, filename.c_str(), READWRITE, &status) )
{
status = 0;
if( fits_create_file(&fp, filename.c_str(), &status) )
return status;
if( fits_create_img(fp, BYTE_IMG, 0, NULL, &status) )
return status;
// ffpcom(*fptr, "ALL TIME IN THIS FILE IS UTC", &status); /*增加必要的注释*/
timespec_t t;
time( &t.time );//系统当前时间
t.usec = 0;
char buf[40];
time2strUTC_fitshead( buf, sizeof(buf), &t );//秒时间转换成对应的年月日时分秒格式的字符串
/* 在第一个head中写入需要的关键字 */
if ( fits_update_key(fp, TSTRING , "DATE_CRT", buf, "FITS file creation date", &status) )
return status;
if ( fits_update_key(fp, TSTRING , "TELESCOP", "HXMT", "Telescope or mission name", &status) )
return status;
if ( fits_update_key(fp, TSTRING , "ORIGIN", "HDPS", "Origin of FITS file", &status) )
return status;
if ( fits_update_key(fp, TSTRING , "HDPSLEVL", "RAW", "HDPS level of data processing", &status) )
return status;
if ( fits_update_key(fp, TSTRING , "CREATOR", "POAC", "program that create this FITS file", &status) )
return status;
status = 0;
int tfields = 5; /* table will have 5 columns */
long nrows = 0;
char extname[] = "ATTITUDE_Binary"; /* extension name */
char *ttype[] = { "TIME", "TRANS_LON", "TRANS_LON_ANGLE", "TRANS_LAT", "TRANS_LAT_ANGLE" };
char *tform[] = { "19A", "1D", "1D", "1D", "1D" };
char *tunit[] = { "\0", "\0", "\0", "\0", "\0" };
if ( fits_create_tbl( fp, BINARY_TBL, nrows, tfields, ttype, tform, tunit, extname, &status) ) {
fits_close_file( fp, &status );//创建第2个head
return status;
}
}
*fptr = fp;
return 0;
}
/*****************************************************
** 函数名: write_fits_zt
** 输入: fptr, zt,n
** hxmtfile --- 文件名结构
** zt --- 姿态数据结构
** n ---
** 输出:
** 函数执行成功返回0
** 调用说明:
** time2strUTC_fitshead() ....秒时间转换成对应的年月日时分秒格式的字符串
** 功能描述: 输入先前生成的fits文件结构和姿态数据,把姿态数据写入fits文件中
****************************************************************************************/
int write_fits_zt( fitsfile *fptr, const ZT_t *zt, int n )
{
if( fptr == NULL )
return -1;
int status = 0;
unsigned int nrows = 0;
int hdutype;
if ( fits_movabs_hdu(fptr, 2, &hdutype, &status) ) //转到第2个head
return status;
if( fits_read_key(fptr, TINT, "NAXIS2", &nrows, NULL, &status) )
return status;
// for( int i = 0; i < n; i++, nrows++ )
{
if (fits_insert_rows(fptr, nrows, 1, &status))
return status;
int firstrow = nrows + 1;
int firstelem = 1;
void *var[1];
status = 0;
char strUTC[40];
time2strUTC_fitshead( strUTC, sizeof(strUTC), &zt->utc );
var[0] = (void *)strUTC;
/********************逐列写入数据*****************************/
fits_write_col(fptr, TSTRING, 1, firstrow, firstelem, n, var, &status);
fits_write_col(fptr, TDOUBLE, 2, firstrow, firstelem, n, (void *)&zt->trans_lon, &status);
fits_write_col(fptr, TDOUBLE, 3, firstrow, firstelem, n, (void *)&zt->trans_lon_angle, &status);
fits_write_col(fptr, TDOUBLE, 4, firstrow, firstelem, n, (void *)&zt->trans_lat, &status);
fits_write_col(fptr, TDOUBLE, 5, firstrow, firstelem, n, (void *)&zt->trans_lat_angle, &status);
}
return 0;
}
int close_fits_zt( fitsfile *fptr )//此函数关闭fits文件
{
int status = 0;
if( fits_close_file( fptr, &status) )
return status;
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -