source: Sophya/trunk/SophyaExt/FitsIOServer/fitsbntbllineRW.cc@ 3493

Last change on this file since 3493 was 2615, checked in by cmv, 21 years ago

using namespace sophya enleve de machdefs.h, nouveau sopnamsp.h cmv 10/09/2004

File size: 4.6 KB
Line 
1#include "sopnamsp.h"
2#include "pexceptions.h"
3#include "fitsbntbllineRW.h"
4#include "utils.h"
5///////////////////////////////////////////////////////////
6//
7//
8///////////////////////////////////////////////////////////
9
10
11#define LONNOM 31
12
13
14FITS_BntblLineReader::FITS_BntblLineReader()
15{
16 InitNull();
17}
18
19FITS_BntblLineReader::FITS_BntblLineReader(const char inputfile[],int hdunum)
20
21{
22 InitNull();
23 inFits_ = new FitsInFile (inputfile);
24 inFits_->ReadHeader(hdunum);
25
26 // if (!fn->IsFitsTable())
27 if (!inFits_->IsFitsTable())
28 {
29 throw PException("FITS_BntblLineReader: the fits file seems not to be a bintable nor ASCII table");
30 }
31
32 //
33 int nbcols, nbentries;
34 // nbcols = fn->NbColsFromFits();
35 nbcols = inFits_->NbColsFromFits();
36 nbentries = 0;
37 int k;
38 // for (k=0; k<nbcols; k++) nbentries=max( nbentries, fn->NentriesFromFits(k) );
39 for (k=0; k<nbcols; k++) nbentries=max( nbentries, inFits_->NentriesFromFits(k) );
40
41 //
42 // pour mettre les colonnes dans l'ordre double, float, int, char :
43 // tableau de correspondance
44 // DfitsCol(j)= numero dans le fichier fits de la jeme variable double du
45 // xntuple;
46 // FfitsCol(j)= numero dans le fichier fits de la jeme variable float du
47 // xntuple;
48 // etc.
49 vector<int> DfitsCol;
50 vector<int> FfitsCol;
51 vector<int> IfitsCol;
52 vector<int> SfitsCol;
53 vector<int> LfitsCol;
54 vector<int> BfitsCol;
55 for (k=0; k<nbcols;k++)
56 {
57 FitsFile::FitsDataType ss= inFits_->ColTypeFromFits(k);
58
59 if (ss == FitsFile::FitsDataType_double) DfitsCol.push_back(k);
60 else if (ss == FitsFile::FitsDataType_float) FfitsCol.push_back(k);
61 else if (ss == FitsFile::FitsDataType_int) IfitsCol.push_back(k);
62 else if (ss == FitsFile::FitsDataType_long) LfitsCol.push_back(k);
63 else if (ss == FitsFile::FitsDataType_byte) BfitsCol.push_back(k);
64 else if (ss == FitsFile::FitsDataType_char) SfitsCol.push_back(k);
65 else {
66 cout << " FITS_XNTuple: colonne fits " << k << " type= " << (int) ss << endl;
67 throw IOExc("type de champ inconnu");
68 }
69 }
70 vector<string> ColN(nbcols);
71 int compt=0;
72 for (k=0; k<DfitsCol.size(); k++)
73 {
74 ColN[compt++] = inFits_->ColNameFromFits(DfitsCol[k]);
75 }
76 for (k=0; k<FfitsCol.size(); k++)
77 {
78 ColN[compt++] = inFits_->ColNameFromFits(FfitsCol[k]);
79 }
80 for (k=0; k<IfitsCol.size(); k++)
81 {
82 ColN[compt++] = inFits_->ColNameFromFits(IfitsCol[k]);
83 }
84 for (k=0; k<LfitsCol.size(); k++)
85 {
86 ColN[compt++] = inFits_->ColNameFromFits(LfitsCol[k]);
87 }
88 for (k=0; k<BfitsCol.size(); k++)
89 {
90 ColN[compt++] = inFits_->ColNameFromFits(BfitsCol[k]);
91 }
92 for (k=0; k<SfitsCol.size(); k++)
93 {
94 ColN[compt++] = inFits_->ColNameFromFits(SfitsCol[k]);
95 }
96
97 ligne_.setFormat(DfitsCol.size(), FfitsCol.size(), IfitsCol.size(), LfitsCol.size(), BfitsCol.size(),SfitsCol.size(), ColN);
98}
99
100
101FITS_BntblLineReader::~FITS_BntblLineReader()
102{
103 if (inFits_ != NULL) delete inFits_;
104}
105
106BnTblLine& FITS_BntblLineReader::ReadNextLine()
107{
108 inFits_->GetBinTabLine(nextLineToBeRead_++, ligne_);
109 return ligne_;
110}
111
112
113
114
115FITS_BntblLineWriter::FITS_BntblLineWriter(char inputfile[],int dc, int fc,int ic, int lc, int bc, int cc, vector<string> names,DVList* ptr_dvl, FitsFile::WriteMode wrm)
116{
117 int k;
118 int nbcols = dc+fc+ic+cc+lc+bc;
119 if (nbcols != names.size())
120 {
121 cout << " WARNING: BnTblLineWriter:: length of vector of column names not equal to total number of columns" << endl;
122 }
123 InitNull();
124 outFits_ = new FitsOutFile (inputfile, wrm);
125 string types;
126 vector<int> StringSizes(cc);
127 for (k=0; k<dc;k++)
128 {
129 types+='D';
130 }
131 for (k=0; k<fc;k++)
132 {
133 types+='E';
134 }
135 for (k=0; k<ic;k++)
136 {
137 types+='J';
138 }
139 for (k=0; k<lc;k++)
140 {
141 types+='J';
142 }
143 for (k=0; k<bc;k++)
144 {
145 types+='B';
146 }
147 for (k=0; k<cc;k++)
148 {
149 types+='A';
150 StringSizes[k] = names[dc+fc+ic+lc+bc+k].length();
151 }
152 string extname("Lines_on_Binary_tbl");
153
154 outFits_->makeHeaderBntblOnFits(types, names, 1, nbcols, ptr_dvl, extname,StringSizes);
155 ligne_.setFormat(dc, fc, ic,lc,bc,cc, names);
156
157}
158
159FITS_BntblLineWriter::~FITS_BntblLineWriter()
160{
161 // if (dvl_ != NULL) delete dvl_;
162 if (outFits_ != NULL) delete outFits_;
163}
164
165void FITS_BntblLineWriter::WriteNextLine( BnTblLine& WorkLine)
166{
167 if (! ligne_.sameFormat(WorkLine) )
168 {
169 throw PException(" FITS_BntblLineWriter:: line to be written does not match the header");
170 }
171 outFits_->PutBinTabLine(nextLineToBeWritten_++, WorkLine);
172
173}
Note: See TracBrowser for help on using the repository browser.