source: Sophya/trunk/SophyaPI/ProgPI/fitsbtadapter.cc@ 4042

Last change on this file since 4042 was 3449, checked in by ansari, 18 years ago

1/ Ajout de l'option -nobsz a la commande readfits
2/ Ajout de la commande de lecture array from fits : rdfitsarr

Reza , 31/01/2008

File size: 11.7 KB
Line 
1/* Interface Fits BINARY/ASCII Table cmv 21/05/2001 */
2/* Ajout commandes generique lecture/ecriture FITS */
3/* Reza , Jan 2006 */
4
5
6#include "sopnamsp.h"
7#include "machdefs.h"
8#include <stdlib.h>
9#include <stdio.h>
10#include <typeinfo>
11#include <iostream>
12#include <string.h>
13#include <string>
14
15#include "nobjmgr.h"
16#include "servnobjm.h"
17#include "nomgadapter.h"
18#include "pistdimgapp.h"
19#include "fbtntintf.h"
20
21#include "nomhistadapter.h"
22#include "swfitsdtable.h"
23
24#include "fitsmanager.h"
25#include "fitshandler.h"
26#include "fiosinit.h"
27
28////////////////////////////////////////////////////////////
29class NOMAdapter_FitsBT : public NObjMgrAdapter {
30public:
31 NOMAdapter_FitsBT(FitsBTNtuIntf* o = NULL);
32 virtual ~NOMAdapter_FitsBT();
33
34 virtual NObjMgrAdapter* Clone(AnyDataObj* o);
35 virtual string GetDataObjType();
36 virtual AnyDataObj* CloneDataObj(bool share=false);
37 virtual void SavePPF(POutPersist& s, string const & nom);
38 virtual void Print(ostream& os, int lev=0);
39 virtual NTupleInterface* GetNTupleInterface(bool& adel);
40
41protected:
42 FitsBTNtuIntf* mFBT;
43};
44
45////////////////////////////////////////////////////////////
46NOMAdapter_FitsBT::NOMAdapter_FitsBT(FitsBTNtuIntf* o)
47 : NObjMgrAdapter(o)
48{
49mFBT = o;
50}
51
52NOMAdapter_FitsBT::~NOMAdapter_FitsBT()
53{
54}
55
56NObjMgrAdapter* NOMAdapter_FitsBT::Clone(AnyDataObj* o)
57{
58FitsBTNtuIntf* g = dynamic_cast<FitsBTNtuIntf *>(o);
59if(g) return ( new NOMAdapter_FitsBT(g) );
60return ( new NObjMgrAdapter(o) );
61}
62
63string NOMAdapter_FitsBT::GetDataObjType()
64{
65return( "FitsBTNtuIntf " );
66}
67
68AnyDataObj* NOMAdapter_FitsBT::CloneDataObj(bool /*share*/)
69{
70return( new FitsBTNtuIntf(*mFBT) );
71}
72
73void NOMAdapter_FitsBT::SavePPF(POutPersist& pos, string const & nom)
74{
75cout<<"NOMAdapter_FitsBT::SavePPF: not implemented"<<endl;
76}
77
78void NOMAdapter_FitsBT::Print(ostream& os, int lev)
79{
80mFBT->Print(os, lev);
81}
82
83NTupleInterface* NOMAdapter_FitsBT::GetNTupleInterface(bool& adel)
84{
85adel = false;
86return(mFBT);
87}
88
89////////////////////////////////////////////////////////////
90////////////////////////////////////////////////////////////
91/////////////////////////////////////////////////////////////
92///////////////////////////////////////////////////////////
93extern "C" {
94void fitsbtadapter_init();
95void fitsbtadapter_end();
96}
97
98class fitsbtadapterExecutor : public CmdExecutor {
99public:
100 fitsbtadapterExecutor();
101 virtual ~fitsbtadapterExecutor();
102 virtual int Execute(string& keyw, vector<string>& args, string& toks);
103};
104
105///////////////////////////////////////////////////////////
106fitsbtadapterExecutor::fitsbtadapterExecutor()
107{
108FitsIOServerInit(); // On s'assure de l'initialisation du module FitsIOServer
109
110NamedObjMgr omg;
111PIACmd * mpiac = omg.GetImgApp()->CmdInterpreter();
112
113// On enregistre l'adaptateur
114Services2NObjMgr* serv = omg.GetServiceObj();
115serv->RegisterClass(new FitsBTNtuIntf, new NOMAdapter_FitsBT);
116// ainsi que pour l'adaptateur de SwFitsDataTable
117serv->RegisterClass(new SwFitsDataTable, new NOMAdapter_DataTable );
118
119// On enregistre la commande
120string hgrp = "FileIO";
121string kw = "fitsadapt";
122string usage = "fitsadapt: NTuple adaptor for Binary and ASCII Fits table\n" ;
123usage += "Usage: fitsadapt fitsfile [nomobj hdu buflen[,bufsens,lp]]";
124usage += "\n fitsfile : Fits file name";
125usage += "\n nomobj : Object name (needed if file name misleading as C++ variable)";
126usage += "\n hdu : Fits HDU (if <=0 take first binary/ascii table)";
127usage += "\n buflen[,bufsens,lp] : buffer length (sens) for fits reading (default is 100,1,0)";
128usage += "\n See also scanfits writefits readfits ";
129mpiac->RegisterCommand(kw, usage, this, hgrp);
130
131kw = "scanfits";
132usage = "scanfits: scan fits files and print information on each HDU\n" ;
133usage += "Usage: scanfits FileName [slev=0...3]\n";
134usage += "slev=1,3: header keywords , slev=2,3: try to read each HDU\n";
135usage += "See also: readfits writefits fitsadapt ";
136mpiac->RegisterCommand(kw, usage, this, hgrp);
137
138kw = "writefits";
139usage = "writefits: Write objects to a fits file \n" ;
140usage += "Usage: writefits nameobj/pattern FileName \n";
141usage += "See also: scanfits readfits fitsadapt ";
142mpiac->RegisterCommand(kw, usage, this, hgrp);
143
144kw = "savefits";
145usage = "savefits: alias for writefits \n" ;
146mpiac->RegisterCommand(kw, usage, this, hgrp);
147
148kw = "readfits";
149usage = "readfits: Read one or all HDU's of a fits file \n" ;
150usage += "Usage: readfits [-nobsz] FileName [num_hdu] \n";
151usage += " num_hdu=1,..,NbHDU (uses FitsManager) \n";
152usage += " -nobsz: Ignore HDU BSCALE/BZERO values -> BSCALE=1, BZERO=0 \n";
153usage += "See also rdfitsarr scanfits writefits fitsadapt swfitstable ";
154mpiac->RegisterCommand(kw, usage, this, hgrp);
155
156kw = "openfits";
157usage = "openfits: alias for readfits \n" ;
158mpiac->RegisterCommand(kw, usage, this, hgrp);
159
160kw = "rdfitsarr";
161usage = "rdfitsarr: Read a single IMAGE HDU of a fits file as an array \n" ;
162usage += "Usage: rdfitsarr FileName [arrType=D] [num_hdu=1] [arrName] [compd]\n";
163usage += " ArrType= I/L/F/D: Array data type (int_4, int_8, r_4, r_8)\n";
164usage += " compd : call array.CompactTrailingDimensions()\n";
165usage += "See also readfits ";
166mpiac->RegisterCommand(kw, usage, this, hgrp);
167
168
169kw = "swfitstable";
170usage = "swfitstable: Creates/read an SwFitsDataTable from a fits file\n" ;
171usage += " SwFitsDataTable is a table which uses the BINARY-TBL\n";
172usage += " of the fits file as swap space - useful for large tables\n";
173usage += "Usage: swfitstable FileName [num_hdu=2] [segsize=512]\n";
174usage += "See also: readfits scanfits";
175mpiac->RegisterCommand(kw, usage, this, hgrp);
176}
177
178fitsbtadapterExecutor::~fitsbtadapterExecutor()
179{
180}
181
182int fitsbtadapterExecutor::Execute(string& kw, vector<string>& tokens, string&)
183{
184NamedObjMgr omg;
185if(kw == "fitsadapt") {
186 if(tokens.size()<1)
187 {cout<<"Usage: fitsadapt fitsfile [nomobj hdu buflen[,bufsens]]"<<endl;
188 return(0);}
189 int ihdu=0;
190 int_4 buflen=100, bufsens=1, lp=0;
191 string fname = tokens[0];
192 string nom_obj ="";
193 if(tokens.size()>1) nom_obj = tokens[1];
194 if(tokens.size()>2) sscanf(tokens[2].c_str(),"%d",&ihdu);
195 if(tokens.size()>3) sscanf(tokens[3].c_str(),"%d,%d,%d",&buflen,&bufsens,&lp);
196 FitsBTNtuIntf* fbt = new FitsBTNtuIntf(fname,ihdu,buflen,bufsens,lp);
197
198 if(nom_obj=="" || nom_obj=="!") nom_obj = omg.GetServiceObj()->FileName2Name(fname);
199 omg.AddObj(fbt,nom_obj);
200 }
201else if (kw == "scanfits") {
202 if(tokens.size() < 1) {
203 cout<<"Usage: scanfits FileName [slev] "<<endl;
204 return 1;
205 }
206 int slev = 0;
207 if(tokens.size() > 1) slev = atoi(tokens[1].c_str());
208 FitsManager::ScanFile(tokens[0], slev);
209 return 0;
210}
211else if (kw == "swfitstable") {
212 if(tokens.size() < 1) {
213 cout<<"Usage: swfitstable FileName [num_hdu=2] [segsize=512]"<<endl;
214 return 1;
215 }
216 int numhdu = 2;
217 if(tokens.size() > 1) numhdu = atoi(tokens[1].c_str());
218 int segsize = 512;
219 if(tokens.size() > 2) segsize = atoi(tokens[2].c_str());
220 SwFitsDataTable* swfd = new SwFitsDataTable(tokens[0], numhdu, segsize);
221 if (swfd != NULL) {
222 string nom = omg.GetServiceObj()->FileName2Name(tokens[0]);
223 omg.AddObj(swfd, nom, false);
224 cout << "swfitstable: SwFitsDataTable object" << nom << " from"
225 << tokens[0] << " HDU=" << numhdu << endl;
226 }
227 return 0;
228}
229else if ((kw == "writefits") || (kw == "savefits")) {
230 if(tokens.size() < 2) {
231 cout<<"Usage: writefits nameobj/pattern FileName "<<endl;
232 return 1;
233 }
234 vector<string> noms;
235 omg.GetObjList(tokens[0], noms);
236 if (noms.size() < 1) {
237 cout<<"writefits/Error: no object with this name "<<endl;
238 return 2;
239 }
240 cout << "writefits: Opening/Creating fits file " << tokens[1] << endl;
241 FitsInOutFile fos(tokens[1], FitsInOutFile::Fits_Create);
242 for(int kk=0; kk<noms.size(); kk++) {
243 AnyDataObj* co = omg.GetObj(noms[kk]);
244 if (co == NULL) continue;
245 fos.SetNextExtensionName(noms[kk]);
246 try {
247 FitsManager::Write(fos, *co);
248 cout << "writefits: Object " << noms[kk] << " written to HDU No " << fos.CurrentHDU() << endl;
249 }
250 catch (NotFoundExc & exc) {
251 cout << "writefits/Error writing object " << noms[kk] << " -> " << exc.Msg() << endl;
252 }
253 }
254 return 0;
255}
256
257
258else if ((kw == "readfits") || (kw == "openfits")) {
259 if ((tokens.size()<1) || ((tokens[0]=="-nobsz")&&(tokens.size()<2))) {
260 cout<<"Usage: readfits [-nobsz] FileName [num_hdu]"<<endl;
261 return 1;
262 }
263 int offa = 0;
264 bool fgnobsz = false;
265 if (tokens[0] == "-nobsz") {
266 fgnobsz = true; offa = 1;
267 }
268 cout << "readfits: Opening fits file " << tokens[offa];
269 FitsInOutFile fis(tokens[offa], FitsInOutFile::Fits_RO);
270 if (fgnobsz) fis.SetBScaleBZero();
271 int k1 = 1;
272 int k2 = fis.NbHDUs();
273 if (fis.CurrentHDU() > 1) k1 = k2 = fis.CurrentHDU();
274 bool fgshdu = false;
275 if (tokens.size() > (offa+1)) { // Numero de HDU specifie
276 k2 = k1 = atoi(tokens[offa+1].c_str());
277 fgshdu = true;
278 cout << " - HDU Num " << k1 << endl;
279 }
280 else cout << " - HDU's " << k1 << "-" << k2 << endl;
281
282 string bnom = omg.GetServiceObj()->FileName2Name(tokens[offa]);
283 string nom = bnom;
284 char bun[16];
285 int kon = 0;
286 for(int k=k1; k<=k2; k++) {
287 try {
288 if (fgshdu) fis.MoveAbsToHDU(k);
289 FitsHandlerInterface* fhi = FitsManager::Read(fis);
290 AnyDataObj* obj = fhi->DataObj();
291 if (obj) {
292 kon++;
293 if (kon > 1) {
294 sprintf(bun, "%d", kon);
295 nom = bnom + bun;
296 }
297 omg.AddObj(obj, nom, false);
298 cout << "readfits: " << (string)typeid(*obj).name()
299 << " read From HDU " << k << " ->" << nom << endl;
300 }
301 else delete fhi;
302 //Reza, Jan 2006: Sinon, le fhi ne sera jamais supprime, tant pis
303 // Il ne prend pas beaucoup de place, une fois que son objet est delete
304 }
305 catch (NotFoundExc & exc) {
306 cout << "readfits/Error - HDU=" << k+1 << " : " << exc.Msg() << endl;
307 }
308 if (k<k2) fis.MoveToNextHDU();
309 }
310 return 0;
311}
312//-- Lecture d'un tableau depuis fits avec possibilite de specification type
313else if (kw == "rdfitsarr") {
314 if (tokens.size()<1) {
315 cout << "Usage: rdfitsarr FileName [arrType=D] [num_hdu=1] [arrName] [compd]" << endl;
316 return 1;
317 }
318 char atype = 'D';
319 if (tokens.size()>1) atype = tokens[1][0];
320 if ((atype != 'I')&&(atype != 'L')&&(atype != 'F')&&(atype != 'D')) atype = 'D';
321 int ihdu = 1;
322 if (tokens.size()>2) ihdu = atoi(tokens[2].c_str());
323 cout << "rdfitsarr: Opening fits file " << tokens[0] << " HDU=" << ihdu << endl;
324 FitsInOutFile fis(tokens[0], FitsInOutFile::Fits_RO);
325 fis.MoveAbsToHDU(ihdu);
326 string arrname = "arr";
327 if (tokens.size()>3) arrname = tokens[3];
328 else arrname = omg.GetServiceObj()->FileName2Name(tokens[0]);
329 bool fgcompd = false;
330 if ((tokens.size()>4)&&(tokens[4]=="compd")) fgcompd = true;
331
332 switch (atype) {
333 case 'I' :
334 {
335 TArray<int_4> * arr = new TArray<int_4>;
336 FitsManager::Read(fis, (*arr));
337 if (fgcompd) arr->CompactTrailingDimensions();
338 omg.AddObj(arr, arrname, false);
339 }
340 break;
341 case 'L' :
342 {
343 TArray<int_8> * arr = new TArray<int_8>;
344 FitsManager::Read(fis, (*arr));
345 if (fgcompd) arr->CompactTrailingDimensions();
346 omg.AddObj(arr, arrname, false);
347 }
348 break;
349 case 'F' :
350 {
351 TArray<r_4> * arr = new TArray<r_4>;
352 FitsManager::Read(fis, (*arr));
353 if (fgcompd) arr->CompactTrailingDimensions();
354 omg.AddObj(arr, arrname, false);
355 }
356 break;
357 case 'D' :
358 {
359 TArray<r_8> * arr = new TArray<r_8>;
360 FitsManager::Read(fis, (*arr));
361 if (fgcompd) arr->CompactTrailingDimensions();
362 omg.AddObj(arr, arrname, false);
363 }
364 break;
365
366 }
367}
368
369 return(0);
370}
371
372///////////////////////////////////////////////////////////
373static fitsbtadapterExecutor * piafbtex = NULL;
374
375void fitsbtadapter_init()
376{
377if(piafbtex) delete piafbtex;
378piafbtex = new fitsbtadapterExecutor;
379}
380
381void fitsbtadapter_end()
382{
383if(piafbtex) delete piafbtex;
384piafbtex = NULL;
385}
Note: See TracBrowser for help on using the repository browser.