source: Sophya/trunk/AddOn/TAcq/brdiskw.cc@ 3938

Last change on this file since 3938 was 3688, checked in by ansari, 16 years ago

Introduction de la classe FitsCubeWriter - Reza 28/11/2009

File size: 3.6 KB
Line 
1#include "brdiskw.h"
2#include <exception>
3#include "timestamp.h"
4#include "ctimer.h"
5
6using namespace SOPHYA;
7//----------------------------------------------------------------
8// Projet BAORadio - (C) LAL/IRFU 2008-2010
9// Classes de threads ecriture de donnees traitees BAORadio
10//----------------------------------------------------------------
11
12//----------------------------------------------------------------
13// ---- Classe FitsCubeWriter :
14// Ecriture de fichier FITS BAORadio 3D (plusieurs fibres dans un fichier)
15//----------------------------------------------------------------
16
17/* --Methode-- */
18FitsCubeWriter::FitsCubeWriter(RAcqMemZoneMgr& mmgr, string outpath, uint_4 nblocperfile)
19 : memgr_(mmgr), outpath_(outpath), nblocperfile_(nblocperfile)
20{
21 stop_ = false;
22 numfile_=0;
23 totnbyteswrt_=0;
24}
25
26/* --Methode-- */
27void FitsCubeWriter::run()
28{
29 try {
30 TimeStamp ts;
31 Timer tm("FitsCubeWriter", false);
32
33 uint_4 paqsz = memgr_.PaqSize();
34 cout << " FitsCubeWriter::run() - Starting NBloc/File=" << nblocperfile_ << " PaqSz=" << paqsz << endl;
35 vector<Byte*> fbuff;
36 for(size_t fib=0; fib<(size_t)memgr_.NbFibres(); fib++) fbuff.push_back(NULL);
37
38 size_t npaqperfile = memgr_.NbPaquets()*nblocperfile_; // Nombre de paquets ecrits dans un fichier
39
40 bool fgrun=true;
41 MiniFITSFile mff;
42 uint_4 numblk=0;
43 char fname[1024];
44 while (fgrun) {
45 if (stop_) break;
46 if (memgr_.GetRunState() == MemZR_Stopped) break;
47 int mid = memgr_.FindMemZoneId(MemZA_Save);
48 Byte* buffg = memgr_.GetMemZone(mid);
49 if (buffg == NULL) {
50 cout << "FitsCubeWriter::run()/ERROR memgr.GetMemZone(" << mid << ") -> NULL" << endl;
51 setRC(7); fgrun=false;
52 break;
53 }
54 if (numblk%nblocperfile_ == 0) {
55 if (mff.IsOpen()) {
56 mff.Close();
57 cout << " FitsCubeWriter::run() " << numfile_ << " End write file" << fname << endl;
58 }
59 sprintf(fname,"%ssig3d%d.fits",outpath_.c_str(),(int)numfile_);
60 mff.Open(fname, MF_Write);
61 mff.setDTypeNaxis(MF_Byte, paqsz, memgr_.NbFibres(), npaqperfile);
62 numfile_++;
63 }
64 for(size_t fib=0; fib<(size_t)memgr_.NbFibres(); fib++) {
65 fbuff[fib] = memgr_.GetMemZone(mid,fib);
66 if (fbuff[fib] == NULL) { // cela ne devrait pas arriver
67 cout << "FitsCubeWriter::run()/ERROR memgr.GetMemZone(" << mid << "," << fib << ") -> NULL" << endl;
68 setRC(9); fgrun=false;
69 break;
70 }
71 for(size_t jp=0; jp<memgr_.NbPaquets(); jp++) {
72 mff.WriteB(fbuff[fib],paqsz); // ecriture
73 totnbyteswrt_+=paqsz;
74 }
75 } // Fin de la boucle sur les fibres
76 memgr_.FreeMemZone(mid, MemZS_Saved);
77 numblk++;
78 } // Fin de boucle sur les zones a traiter
79 //------------------------------------
80 cout << " ------------------ FitsCubeWriter::run() END ----------------- " << endl;
81 // ts.SetNow();
82 tm.SplitQ();
83 // cout << " END writing : " << ts ;
84 cout << " TotalDiskWrite= " << totnbyteswrt_/(1024*1024) << " MBytes Disk-Write rate= "
85 << (double)(totnbyteswrt_)/1024./tm.PartialElapsedTimems() << " MB/s" << endl;
86 // cout << " FitsCubeWriter::run()/Timing: \n"; tm.Print();
87 cout << " --------------------------------------------------------------- " << endl;
88 }
89 catch (MiniFITSException& exc) {
90 cout << " FitsCubeWriter::run()/catched MiniFITSException " << exc.Msg() << endl;
91 setRC(5);
92 return;
93 }
94 catch (std::exception& exc) {
95 cout << " FitsCubeWriter::run()/catched std::exception : " << exc.what() << endl;
96 setRC(5);
97 return;
98 }
99 catch(...) {
100 cout << " FitsCubeWriter::run()/catched unknown ... exception " << endl;
101 setRC(5);
102 return;
103 }
104
105}
Note: See TracBrowser for help on using the repository browser.