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

Last change on this file since 3436 was 3424, checked in by ansari, 18 years ago

Definition openfits/savefits comme alias de readfits/writefits - Reza 08/12/2007

File size: 9.3 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 FileName [num_hdu] \n";
151usage += " num_hdu=1,..,NbHDU (uses FitsManager) \n";
152usage += "See also scanfits writefits fitsadapt swfitstable ";
153mpiac->RegisterCommand(kw, usage, this, hgrp);
154
155kw = "openfits";
156usage = "openfits: alias for readfits \n" ;
157mpiac->RegisterCommand(kw, usage, this, hgrp);
158
159kw = "swfitstable";
160usage = "swfitstable: Creates/read an SwFitsDataTable from a fits file\n" ;
161usage += " SwFitsDataTable is a table which uses the BINARY-TBL\n";
162usage += " of the fits file as swap space - useful for large tables\n";
163usage += "Usage: swfitstable FileName [num_hdu=2] [segsize=512]\n";
164usage += "See also: readfits scanfits";
165mpiac->RegisterCommand(kw, usage, this, hgrp);
166}
167
168fitsbtadapterExecutor::~fitsbtadapterExecutor()
169{
170}
171
172int fitsbtadapterExecutor::Execute(string& kw, vector<string>& tokens, string&)
173{
174NamedObjMgr omg;
175if(kw == "fitsadapt") {
176 if(tokens.size()<1)
177 {cout<<"Usage: fitsadapt fitsfile [nomobj hdu buflen[,bufsens]]"<<endl;
178 return(0);}
179 int ihdu=0;
180 int_4 buflen=100, bufsens=1, lp=0;
181 string fname = tokens[0];
182 string nom_obj ="";
183 if(tokens.size()>1) nom_obj = tokens[1];
184 if(tokens.size()>2) sscanf(tokens[2].c_str(),"%d",&ihdu);
185 if(tokens.size()>3) sscanf(tokens[3].c_str(),"%d,%d,%d",&buflen,&bufsens,&lp);
186 FitsBTNtuIntf* fbt = new FitsBTNtuIntf(fname,ihdu,buflen,bufsens,lp);
187
188 if(nom_obj=="" || nom_obj=="!") nom_obj = omg.GetServiceObj()->FileName2Name(fname);
189 omg.AddObj(fbt,nom_obj);
190 }
191else if (kw == "scanfits") {
192 if(tokens.size() < 1) {
193 cout<<"Usage: scanfits FileName [slev] "<<endl;
194 return 1;
195 }
196 int slev = 0;
197 if(tokens.size() > 1) slev = atoi(tokens[1].c_str());
198 FitsManager::ScanFile(tokens[0], slev);
199 return 0;
200}
201else if (kw == "swfitstable") {
202 if(tokens.size() < 1) {
203 cout<<"Usage: swfitstable FileName [num_hdu=2] [segsize=512]"<<endl;
204 return 1;
205 }
206 int numhdu = 2;
207 if(tokens.size() > 1) numhdu = atoi(tokens[1].c_str());
208 int segsize = 512;
209 if(tokens.size() > 2) segsize = atoi(tokens[2].c_str());
210 SwFitsDataTable* swfd = new SwFitsDataTable(tokens[0], numhdu, segsize);
211 if (swfd != NULL) {
212 string nom = omg.GetServiceObj()->FileName2Name(tokens[0]);
213 omg.AddObj(swfd, nom, false);
214 cout << "swfitstable: SwFitsDataTable object" << nom << " from"
215 << tokens[0] << " HDU=" << numhdu << endl;
216 }
217 return 0;
218}
219else if ((kw == "writefits") || (kw == "savefits")) {
220 if(tokens.size() < 2) {
221 cout<<"Usage: writefits nameobj/pattern FileName "<<endl;
222 return 1;
223 }
224 vector<string> noms;
225 omg.GetObjList(tokens[0], noms);
226 if (noms.size() < 1) {
227 cout<<"writefits/Error: no object with this name "<<endl;
228 return 2;
229 }
230 cout << "writefits: Opening/Creating fits file " << tokens[1] << endl;
231 FitsInOutFile fos(tokens[1], FitsInOutFile::Fits_Create);
232 for(int kk=0; kk<noms.size(); kk++) {
233 AnyDataObj* co = omg.GetObj(noms[kk]);
234 if (co == NULL) continue;
235 fos.SetNextExtensionName(noms[kk]);
236 try {
237 FitsManager::Write(fos, *co);
238 cout << "writefits: Object " << noms[kk] << " written to HDU No " << fos.CurrentHDU() << endl;
239 }
240 catch (NotFoundExc & exc) {
241 cout << "writefits/Error writing object " << noms[kk] << " -> " << exc.Msg() << endl;
242 }
243 }
244 return 0;
245}
246else if ((kw == "readfits") || (kw == "openfits")) {
247 if(tokens.size() < 1) {
248 cout<<"Usage: readfits FileName [num_hdu]"<<endl;
249 return 1;
250 }
251 cout << "readfits: Opening fits file " << tokens[0];
252 FitsInOutFile fis(tokens[0], FitsInOutFile::Fits_RO);
253 int k1 = 1;
254 int k2 = fis.NbHDUs();
255 if (fis.CurrentHDU() > 1) k1 = k2 = fis.CurrentHDU();
256 bool fgshdu = false;
257 if (tokens.size() > 1) { // Numero de HDU specifie
258 k2 = k1 = atoi(tokens[1].c_str());
259 fgshdu = true;
260 cout << " - HDU Num " << k1 << endl;
261 }
262 else cout << " - HDU's " << k1 << "-" << k2 << endl;
263
264 string bnom = omg.GetServiceObj()->FileName2Name(tokens[0]);
265 string nom = bnom;
266 char bun[16];
267 int kon = 0;
268 for(int k=k1; k<=k2; k++) {
269 try {
270 if (fgshdu) fis.MoveAbsToHDU(k);
271 FitsHandlerInterface* fhi = FitsManager::Read(fis);
272 AnyDataObj* obj = fhi->DataObj();
273 if (obj) {
274 kon++;
275 if (kon > 1) {
276 sprintf(bun, "%d", kon);
277 nom = bnom + bun;
278 }
279 omg.AddObj(obj, nom, false);
280 cout << "readfits: " << (string)typeid(*obj).name()
281 << " read From HDU " << k << " ->" << nom << endl;
282 }
283 else delete fhi;
284 //Reza, Jan 2006: Sinon, le fhi ne sera jamais supprime, tant pis
285 // Il ne prend pas beaucoup de place, une fois que son objet est delete
286 }
287 catch (NotFoundExc & exc) {
288 cout << "readfits/Error - HDU=" << k+1 << " : " << exc.Msg() << endl;
289 }
290 if (k<k2) fis.MoveToNextHDU();
291 }
292 return 0;
293}
294 return(0);
295}
296
297///////////////////////////////////////////////////////////
298static fitsbtadapterExecutor * piafbtex = NULL;
299
300void fitsbtadapter_init()
301{
302if(piafbtex) delete piafbtex;
303piafbtex = new fitsbtadapterExecutor;
304}
305
306void fitsbtadapter_end()
307{
308if(piafbtex) delete piafbtex;
309piafbtex = NULL;
310}
Note: See TracBrowser for help on using the repository browser.