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

Last change on this file since 2201 was 2201, checked in by lemeur, 23 years ago

acces au dvlist du fichier fits en lecture

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