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

Last change on this file since 3146 was 3068, checked in by ansari, 19 years ago

Ajout declaration NomgAdapter pour SwFitsDataTable et commande swfitstable - Reza 08/09/2006

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