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

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

Ajout int lev a Print(ostream& int lev=0) de l'adaptateur , Reza 20/6/2006

File size: 7.4 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 "fitsmanager.h"
22#include "fitshandler.h"
23#include "fiosinit.h"
24
25////////////////////////////////////////////////////////////
26class NOMAdapter_FitsBT : public NObjMgrAdapter {
27public:
28 NOMAdapter_FitsBT(FitsBTNtuIntf* o = NULL);
29 virtual ~NOMAdapter_FitsBT();
30
31 virtual NObjMgrAdapter* Clone(AnyDataObj* o);
32 virtual string GetDataObjType();
33 virtual AnyDataObj* CloneDataObj(bool share=false);
34 virtual void SavePPF(POutPersist& s, string const & nom);
35 virtual void Print(ostream& os, int lev=0);
36 virtual NTupleInterface* GetNTupleInterface(bool& adel);
37
38protected:
39 FitsBTNtuIntf* mFBT;
40};
41
42////////////////////////////////////////////////////////////
43NOMAdapter_FitsBT::NOMAdapter_FitsBT(FitsBTNtuIntf* o)
44 : NObjMgrAdapter(o)
45{
46mFBT = o;
47}
48
49NOMAdapter_FitsBT::~NOMAdapter_FitsBT()
50{
51}
52
53NObjMgrAdapter* NOMAdapter_FitsBT::Clone(AnyDataObj* o)
54{
55FitsBTNtuIntf* g = dynamic_cast<FitsBTNtuIntf *>(o);
56if(g) return ( new NOMAdapter_FitsBT(g) );
57return ( new NObjMgrAdapter(o) );
58}
59
60string NOMAdapter_FitsBT::GetDataObjType()
61{
62return( "FitsBTNtuIntf " );
63}
64
65AnyDataObj* NOMAdapter_FitsBT::CloneDataObj(bool /*share*/)
66{
67return( new FitsBTNtuIntf(*mFBT) );
68}
69
70void NOMAdapter_FitsBT::SavePPF(POutPersist& pos, string const & nom)
71{
72cout<<"NOMAdapter_FitsBT::SavePPF: not implemented"<<endl;
73}
74
75void NOMAdapter_FitsBT::Print(ostream& os, int lev)
76{
77mFBT->Print(os, lev);
78}
79
80NTupleInterface* NOMAdapter_FitsBT::GetNTupleInterface(bool& adel)
81{
82adel = false;
83return(mFBT);
84}
85
86////////////////////////////////////////////////////////////
87////////////////////////////////////////////////////////////
88/////////////////////////////////////////////////////////////
89///////////////////////////////////////////////////////////
90extern "C" {
91void fitsbtadapter_init();
92void fitsbtadapter_end();
93}
94
95class fitsbtadapterExecutor : public CmdExecutor {
96public:
97 fitsbtadapterExecutor();
98 virtual ~fitsbtadapterExecutor();
99 virtual int Execute(string& keyw, vector<string>& args, string& toks);
100};
101
102///////////////////////////////////////////////////////////
103fitsbtadapterExecutor::fitsbtadapterExecutor()
104{
105FitsIOServerInit(); // On s'assure de l'initialisation du module FitsIOServer
106
107NamedObjMgr omg;
108PIACmd * mpiac = omg.GetImgApp()->CmdInterpreter();
109
110// On enregistre l'adaptateur
111Services2NObjMgr* serv = omg.GetServiceObj();
112serv->RegisterClass(new FitsBTNtuIntf, new NOMAdapter_FitsBT);
113
114// On enregistre la commande
115string hgrp = "FileIO";
116string kw = "fitsadapt";
117string usage = "fitsadapt: NTuple adaptor for Binary and ASCII Fits table\n" ;
118usage += "Usage: fitsadapt fitsfile [nomobj hdu buflen[,bufsens,lp]]";
119usage += "\n fitsfile : Fits file name";
120usage += "\n nomobj : Object name (needed if file name misleading as C++ variable)";
121usage += "\n hdu : Fits HDU (if <=0 take first binary/ascii table)";
122usage += "\n buflen[,bufsens,lp] : buffer length (sens) for fits reading (default is 100,1,0)";
123usage += "\n See also scanfits writefits readfits ";
124mpiac->RegisterCommand(kw, usage, this, hgrp);
125
126kw = "scanfits";
127usage = "scanfits: scan fits files and print information on each HDU\n" ;
128usage += "Usage: scanfits FileName [slev=0 ... 3]\n";
129usage += "slev=1,3: header keywords , slev=2,3: try to read each HDU";
130mpiac->RegisterCommand(kw, usage, this, hgrp);
131
132kw = "writefits";
133usage = "writefits: Write objects to a fits file \n" ;
134usage += "Usage: writefits nameobj/pattern FileName \n";
135usage += "(use FitsManager) .... ";
136usage += "See also scanfits readfits fitsadapt ";
137mpiac->RegisterCommand(kw, usage, this, hgrp);
138
139kw = "readfits";
140usage = "readfits: Read all HDU's of a fits file \n" ;
141usage += "Usage: readfits nameobj/pattern FileName \n";
142usage += "(use FitsManager) .... ";
143usage += "See also scanfits writefits fitsadapt ";
144mpiac->RegisterCommand(kw, usage, this, hgrp);
145}
146
147fitsbtadapterExecutor::~fitsbtadapterExecutor()
148{
149}
150
151int fitsbtadapterExecutor::Execute(string& kw, vector<string>& tokens, string&)
152{
153NamedObjMgr omg;
154if(kw == "fitsadapt") {
155 if(tokens.size()<1)
156 {cout<<"Usage: fitsadapt fitsfile [nomobj hdu buflen[,bufsens]]"<<endl;
157 return(0);}
158 int ihdu=0;
159 int_4 buflen=100, bufsens=1, lp=0;
160 string fname = tokens[0];
161 string nom_obj ="";
162 if(tokens.size()>1) nom_obj = tokens[1];
163 if(tokens.size()>2) sscanf(tokens[2].c_str(),"%d",&ihdu);
164 if(tokens.size()>3) sscanf(tokens[3].c_str(),"%d,%d,%d",&buflen,&bufsens,&lp);
165 FitsBTNtuIntf* fbt = new FitsBTNtuIntf(fname,ihdu,buflen,bufsens,lp);
166
167 if(nom_obj=="" || nom_obj=="!") nom_obj = omg.GetServiceObj()->FileName2Name(fname);
168 omg.AddObj(fbt,nom_obj);
169 }
170else if (kw == "scanfits") {
171 if(tokens.size() < 1) {
172 cout<<"Usage: scanfits FileName [slev] "<<endl;
173 return 1;
174 }
175 int slev = 0;
176 if(tokens.size() > 1) slev = atoi(tokens[1].c_str());
177 FitsManager::ScanFile(tokens[0], slev);
178 return 0;
179}
180else if (kw == "writefits") {
181 if(tokens.size() < 2) {
182 cout<<"Usage: writefits nameobj/pattern FileName "<<endl;
183 return 1;
184 }
185 vector<string> noms;
186 omg.GetObjList(tokens[0], noms);
187 if (noms.size() < 1) {
188 cout<<"writefits/Error: no object with this name "<<endl;
189 return 2;
190 }
191 cout << "writefits: Opening/Creating fits file " << tokens[1] << endl;
192 FitsInOutFile fos(tokens[1], FitsInOutFile::Fits_Create);
193 for(int kk=0; kk<noms.size(); kk++) {
194 AnyDataObj* co = omg.GetObj(noms[kk]);
195 if (co == NULL) continue;
196 fos.SetNextExtensionName(noms[kk]);
197 try {
198 FitsManager::Write(fos, *co);
199 cout << "writefits: Object " << noms[kk] << " written to HDU No " << fos.CurrentHDU() << endl;
200 }
201 catch (NotFoundExc & exc) {
202 cout << "writefits/Error writing object " << noms[kk] << " -> " << exc.Msg() << endl;
203 }
204 }
205 return 0;
206}
207else if (kw == "readfits") {
208 if(tokens.size() < 1) {
209 cout<<"Usage: readfits FileName "<<endl;
210 return 1;
211 }
212 cout << "readfits: Opening fits file " << tokens[0] << endl;
213 FitsInOutFile fis(tokens[0], FitsInOutFile::Fits_RO);
214 string bnom = omg.GetServiceObj()->FileName2Name(tokens[0]);
215 string nom = bnom;
216 char bun[16];
217 int kon = 0;
218 for(int k=0; k<fis.NbHDUs(); k++) {
219 try {
220 FitsHandlerInterface* fhi = FitsManager::Read(fis);
221 AnyDataObj* obj = fhi->DataObj();
222 if (obj) {
223 kon++;
224 if (kon > 1) {
225 sprintf(bun, "%d", kon);
226 nom = bnom + bun;
227 }
228 omg.AddObj(obj, nom, false);
229 cout << "readfits: " << (string)typeid(*obj).name()
230 << " read From HDU " << k+1 << " ->" << nom << endl;
231 }
232 else delete fhi;
233 //Reza, Jan 2006: Sinon, le fhi ne sera jamais supprime, tant pis
234 // Il ne prend pas beaucoup de place, une fois que son objet est delete
235 }
236 catch (NotFoundExc & exc) {
237 cout << "readfits/Error - HDU=" << k+1 << " : " << exc.Msg() << endl;
238 }
239 fis.MoveToNextHDU();
240 }
241 return 0;
242}
243 return(0);
244}
245
246///////////////////////////////////////////////////////////
247static fitsbtadapterExecutor * piafbtex = NULL;
248
249void fitsbtadapter_init()
250{
251if(piafbtex) delete piafbtex;
252piafbtex = new fitsbtadapterExecutor;
253}
254
255void fitsbtadapter_end()
256{
257if(piafbtex) delete piafbtex;
258piafbtex = NULL;
259}
Note: See TracBrowser for help on using the repository browser.