source: Sophya/trunk/AddOn/TAcq/brproc.cc@ 3640

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

Correction et ameliorations multiples - en particulier mcrd.cc, brproc.cc et brfitsrd.cc, Reza 27/05/2009

File size: 6.2 KB
Line 
1#include "racquproc.h"
2
3#include <stdlib.h>
4#include <unistd.h>
5#include <fstream>
6#include <signal.h>
7
8#include "pexceptions.h"
9#include "tvector.h"
10#include "fioarr.h"
11#include "timestamp.h"
12#include "ctimer.h"
13#include "fftpserver.h"
14#include "fftwserver.h"
15
16#include "FFTW/fftw3.h"
17
18
19#include "pciewrap.h"
20#include "brpaqu.h"
21#include "brproc.h"
22
23
24//---------------------------------------------------------------
25// Classe thread de traitement donnees ADC avec 2 voies par frame
26//---------------------------------------------------------------
27
28BRProcARaw2C::BRProcARaw2C(RAcqMemZoneMgr& mem, string& path, uint_4 nmean,
29 uint_4 step, uint_4 nmax, bool fgnotrl)
30 : memgr(mem)
31{
32 nmax_ = nmax;
33 nmean_ = nmean;
34 step_ = step;
35 stop_ = false;
36 path_ = path;
37 fgnotrl_ = fgnotrl;
38}
39
40void BRProcARaw2C::Stop()
41{
42 stop_=true;
43 // cout <<" BRProcARaw2C::Stop ... > STOP " << endl;
44}
45
46
47static inline r_4 Zmod2(complex<r_4> z)
48{ return (z.real()*z.real()+z.imag()*z.imag()); }
49
50void BRProcARaw2C::run()
51{
52 setRC(1);
53 try {
54 Timer tm("BRProcARaw2C", false);
55 TimeStamp ts;
56 BRPaqChecker pcheck(~fgnotrl_); // Verification/comptage des paquets
57
58 size_t totnbytesout = 0;
59 size_t totnbytesproc = 0;
60
61 cout << " BRProcARaw2C::run() - Starting " << ts << " NMaxMemZones=" << nmax_
62 << " NMean=" << nmean_ << " Step=" << step_ << endl;
63 cout << " BRProcARaw2C::run()... - Output Data Path: " << path_ << endl;
64 char fname[512];
65// sprintf(fname,"%s/proc.log",path_.c_str());
66// ofstream filog(fname);
67// filog << " BRProcARaw2C::run() - starting log file " << ts << endl;
68// filog << " ... NMaxMemZones=" << nmax_ << " NMean=" << nmean_ << " Step=" << step_ << endl;
69
70// Initialisation pour calcul FFT
71 TVector< complex<r_4> > cfour1; // composant TF
72 uint_4 paqsz = memgr.PaqSize();
73 uint_4 procpaqsz = memgr.ProcPaqSize();
74 BRPaquet pq(NULL, NULL, paqsz);
75 TVector<r_4> vx(pq.DataSize()/2);
76 vx = (r_4)(0.);
77 FFTPackServer ffts;
78 ffts.FFTForward(vx, cfour1);
79 TVector< complex<r_4> > cfour2(cfour1.Size());
80
81 TVector<r_4> spectreV1(cfour1.Size());
82 TVector<r_4> spectreV2(cfour1.Size());
83 TVector< complex<r_4> > visiV12( cfour1.Size() );
84
85
86 fftwf_plan plan1 = fftwf_plan_dft_r2c_1d(vx.Size(), vx.Data(),
87 (fftwf_complex*)cfour1.Data(), FFTW_ESTIMATE);
88 fftwf_plan plan2 = fftwf_plan_dft_r2c_1d(vx.Size(), vx.Data(),
89 (fftwf_complex*)cfour2.Data(), FFTW_ESTIMATE);
90
91 uint_4 ifile = 0;
92 uint_4 nzm = 0;
93 for (uint_4 kmz=0; kmz<nmax_; kmz++) {
94 if (stop_) break;
95 int mid = memgr.FindMemZoneId(MemZA_ProcA);
96 Byte* buff = memgr.GetMemZone(mid);
97 if (buff == NULL) {
98 cout << " BRProcARaw2C::run()/ERROR memgr.GetMemZone(" << mid << ") -> NULL" << endl;
99 break;
100 }
101 Byte* procbuff = memgr.GetProcMemZone(mid);
102 if (procbuff == NULL) {
103 cout << " BRProcARaw2C::run()/ERROR memgr.GetProcMemZone(" << mid << ") -> NULL" << endl;
104 break;
105 }
106
107 for(uint_4 i=0; i<memgr.NbPaquets(); i+=step_) {
108 BRPaquet paq(NULL, buff+i*paqsz, paqsz);
109 if (!pcheck.Check(paq)) continue; // on ne traite que les paquets OK
110
111// Traitement voie 1
112 for(sa_size_t j=0; j<vx.Size(); j++)
113 vx(j) = (r_4)(*(paq.Data1()+j))-127.5;
114// fftwf_complex* coeff1 = (fftwf_complex*)(procbuff+i*procpaqsz);
115 fftwf_execute(plan1);
116// complex<r_4>* zp1 = (complex<r_4>*)(coeff1);
117// ffts.FFTForward(vx, cfour1);
118 for(sa_size_t j=0; j<spectreV1.Size(); j++)
119 spectreV1(j) += Zmod2(cfour1(j));
120 memcpy(procbuff+i*procpaqsz, cfour1.Data(), sizeof(complex<r_4>)*cfour1.Size());
121// Traitement voie 2
122 for(sa_size_t j=0; j<vx.Size(); j++)
123 vx(j) = (r_4)(*(paq.Data2()+j))-127.5;
124
125 fftwf_execute(plan2);
126
127 for(sa_size_t j=0; j<spectreV2.Size(); j++)
128 spectreV2(j) += Zmod2(cfour2(j)); // Zmod2(zp2[j]);
129 memcpy(procbuff+i*procpaqsz+procpaqsz/2, cfour2.Data(), sizeof(complex<r_4>)*cfour2.Size());
130
131// Calcul correlation (visibilite V1 * V2)
132 for(sa_size_t j=0; j<visiV12.Size(); j++)
133 visiV12(j)+=cfour1(j)*conj(cfour2(j));
134// for(sa_size_t j=0; j<visiV12.Size(); j++) visiV12(j)+=zp1[j]*zp2[j];
135 nzm++;
136 totnbytesproc += paq.DataSize();
137 totnbytesout += (2*sizeof(complex<r_4>)*cfour1.Size());
138
139 } // Fin de boucle sur les paquets d'une zone
140 if ((nzm >= nmean_) || ((kmz==(nmax_-1))&&(nzm>1))) {
141 spectreV1 /= (r_4)(nzm);
142 spectreV2 /= (r_4)(nzm);
143
144 visiV12 /= complex<r_4>((r_4)nzm, 0.);
145
146 spectreV1.Info()["NPaqMoy"] = nzm;
147 spectreV2.Info()["NPaqMoy"] = nzm;
148 visiV12.Info()["NPaqMoy"] = nzm;
149 {
150 sprintf(fname,"%s_%d.ppf",path_.c_str(),(int)ifile);
151 POutPersist po(fname);
152 po << PPFNameTag("specV1") << spectreV1;
153 po << PPFNameTag("specV2") << spectreV2;
154 po << PPFNameTag("visiV12") << visiV12;
155 }
156 spectreV1 = (r_4)(0.);
157 spectreV2 = (r_4)(0.);
158 visiV12 = complex<r_4>(0., 0.);
159 nzm = 0; ifile++;
160// ts.SetNow();
161// filog << ts << " : proc file " << fname << endl;
162 cout << " BRProcARaw2C::run() created file " << fname << endl;
163 }
164
165 memgr.FreeMemZone(mid, MemZS_ProcA);
166 } // Fin de boucle sur les zones a traiter
167 cout << " ------------------ BRProcARaw2C::run() END ----------------- " << endl;
168 ts.SetNow();
169 tm.SplitQ();
170 cout << " TotalProc= " << totnbytesproc/(1024*1024) << " MBytes, rate= "
171 << (double)(totnbytesproc)/1024./tm.PartialElapsedTimems() << " MB/s"
172 << " ProcDataOut=" << totnbytesout/(1024*1024) << " MB" << endl;
173 cout << pcheck;
174 cout << " BRProcARaw2C::run()/Timing: \n";
175 tm.Print();
176 cout << " ---------------------------------------------------------- " << endl;
177
178 }
179 catch (PException& exc) {
180 cout << " BRProcARaw2C::run()/catched PException " << exc.Msg() << endl;
181 setRC(3);
182 return;
183 }
184 catch(...) {
185 cout << " BRProcARaw2C::run()/catched unknown ... exception " << endl;
186 setRC(4);
187 return;
188 }
189 setRC(0);
190 return;
191}
192
193
194
195
Note: See TracBrowser for help on using the repository browser.