| 1 | #include "racquproc.h"
 | 
|---|
| 2 | 
 | 
|---|
| 3 | #include <stdlib.h>
 | 
|---|
| 4 | #include <unistd.h>
 | 
|---|
| 5 | #include <fstream>
 | 
|---|
| 6 | 
 | 
|---|
| 7 | #include "pexceptions.h"
 | 
|---|
| 8 | #include "tvector.h"
 | 
|---|
| 9 | #include "fioarr.h"
 | 
|---|
| 10 | #include "timestamp.h"
 | 
|---|
| 11 | #include "fftpserver.h"
 | 
|---|
| 12 | #include "fftwserver.h"
 | 
|---|
| 13 | 
 | 
|---|
| 14 | #include "FFTW/fftw3.h"
 | 
|---|
| 15 | 
 | 
|---|
| 16 | 
 | 
|---|
| 17 | #include "pciewrap.h"
 | 
|---|
| 18 | #include "brpaqu.h"
 | 
|---|
| 19 | #include "minifits.h"
 | 
|---|
| 20 | 
 | 
|---|
| 21 | 
 | 
|---|
| 22 | //-------------------------------------------------------
 | 
|---|
| 23 | // Classe thread de traitement 
 | 
|---|
| 24 | //-------------------------------------------------------
 | 
|---|
| 25 | 
 | 
|---|
| 26 | DataProc::DataProc(RAcqMemZoneMgr& mem, string& path, uint_4 nmean, uint_4 nmax)
 | 
|---|
| 27 |   :  memgr(mem) 
 | 
|---|
| 28 | {
 | 
|---|
| 29 |   nmax_ = nmax; 
 | 
|---|
| 30 |   nmean_ = nmean;
 | 
|---|
| 31 |   stop_ = false;        
 | 
|---|
| 32 |   path_ = path; 
 | 
|---|
| 33 | }
 | 
|---|
| 34 | 
 | 
|---|
| 35 | inline r_4 Zmod2(complex<r_4> z) 
 | 
|---|
| 36 | { return (z.real()*z.real()+z.imag()*z.imag()); }
 | 
|---|
| 37 | 
 | 
|---|
| 38 | void DataProc::run()
 | 
|---|
| 39 | {
 | 
|---|
| 40 |         
 | 
|---|
| 41 |   setRC(1);     
 | 
|---|
| 42 |   try {
 | 
|---|
| 43 |     TimeStamp ts; 
 | 
|---|
| 44 |     cout << " DataProc::run() - Starting " << ts << " NMaxMemZones=" << nmax_ << endl;  
 | 
|---|
| 45 |     char fname[512];
 | 
|---|
| 46 |     sprintf(fname,"%s/proc.log",path_.c_str());
 | 
|---|
| 47 |     ofstream filog(fname);
 | 
|---|
| 48 |     filog << " DataProc::run() - starting log file " << ts << endl;                    
 | 
|---|
| 49 | 
 | 
|---|
| 50 | // Initialisation pour clcul FFT 
 | 
|---|
| 51 |     TVector< complex<r_4> > cfour;  // composant TF
 | 
|---|
| 52 |     uint_4 paqsz = memgr.PaqSize();
 | 
|---|
| 53 |     BRPaquet pq(NULL, NULL, paqsz); 
 | 
|---|
| 54 |     TVector<r_4> vx(pq.DataSize());
 | 
|---|
| 55 |     vx = (r_4)(0.);
 | 
|---|
| 56 |     FFTPackServer ffts;
 | 
|---|
| 57 |     ffts.FFTForward(vx, cfour);
 | 
|---|
| 58 |     TVector<r_4> spectre;
 | 
|---|
| 59 |     spectre.ReSize(cfour.Size());
 | 
|---|
| 60 |     
 | 
|---|
| 61 |     fftwf_plan plan = fftwf_plan_dft_r2c_1d(pq.DataSize(), vx.Data(), 
 | 
|---|
| 62 |                                        (fftwf_complex *)cfour.Data(), FFTW_ESTIMATE); 
 | 
|---|
| 63 | 
 | 
|---|
| 64 |     uint_4 ifile = 0;                           
 | 
|---|
| 65 |     for (uint_4 kmz=0; kmz<nmax_; kmz++) {
 | 
|---|
| 66 |       int mid = memgr.FindMemZoneId(MemZA_Proc);
 | 
|---|
| 67 |       Byte* buff = memgr.GetMemZone(mid);
 | 
|---|
| 68 |       if (buff == NULL) {
 | 
|---|
| 69 |         cout << " DataProc::run()/ERROR memgr.GetMemZone(" << mid << ") -> NULL" << endl;
 | 
|---|
| 70 |         setRC(2);       
 | 
|---|
| 71 |         return; 
 | 
|---|
| 72 |       }
 | 
|---|
| 73 |       BRPaquet paq0(NULL, buff, paqsz); 
 | 
|---|
| 74 |       uint_4 nzm = 0;
 | 
|---|
| 75 |       for(uint_4 i=0; i<memgr.NbPaquets(); i++) {
 | 
|---|
| 76 |         BRPaquet paq(NULL, buff+i*paqsz, paqsz); 
 | 
|---|
| 77 |         Byte min = 255;
 | 
|---|
| 78 |         Byte max = 0;
 | 
|---|
| 79 |             
 | 
|---|
| 80 |         for(sa_size_t j=0; j<vx.Size(); j++) 
 | 
|---|
| 81 |           vx(j) = (r_4)(*(paq.Data()+j));
 | 
|---|
| 82 |         fftwf_execute(plan); 
 | 
|---|
| 83 |         //    ffts_.FFTForward(vx, cfour_);
 | 
|---|
| 84 |         for(sa_size_t j=0; j<spectre.Size(); j++) 
 | 
|---|
| 85 |           spectre(j) += Zmod2(cfour(j)); 
 | 
|---|
| 86 |         nzm++;
 | 
|---|
| 87 |       }
 | 
|---|
| 88 |       if (nzm >= nmean_) {
 | 
|---|
| 89 |         spectre /= (r_4)(nzm);
 | 
|---|
| 90 |         sprintf(fname,"%s/spectre%d.ppf",path_.c_str(),(int)ifile);
 | 
|---|
| 91 |         POutPersist po(fname);
 | 
|---|
| 92 |         po << spectre; 
 | 
|---|
| 93 |         spectre = (r_4)(0.);
 | 
|---|
| 94 |         nzm = 0;  ifile++; 
 | 
|---|
| 95 |         ts.SetNow();
 | 
|---|
| 96 |         filog << ts << " :  proc file  " << fname << endl;                     
 | 
|---|
| 97 |         cout << " DataProc::run() " << ts << " : created file  " << fname << endl;
 | 
|---|
| 98 |       }
 | 
|---|
| 99 |       
 | 
|---|
| 100 |       memgr.FreeMemZone(mid, MemZS_Proc);
 | 
|---|
| 101 |     }
 | 
|---|
| 102 |   }
 | 
|---|
| 103 |   catch (PException& exc) {
 | 
|---|
| 104 |     cout << " DataProc::run()/catched PException " << exc.Msg() << endl;
 | 
|---|
| 105 |     setRC(3);   
 | 
|---|
| 106 |     return; 
 | 
|---|
| 107 |   }
 | 
|---|
| 108 |   catch(...) {
 | 
|---|
| 109 |     cout << " DataProc::run()/catched unknown ... exception " << endl;
 | 
|---|
| 110 |     setRC(4);   
 | 
|---|
| 111 |     return; 
 | 
|---|
| 112 |   }
 | 
|---|
| 113 |   setRC(0);
 | 
|---|
| 114 |   return;
 | 
|---|
| 115 | }   
 | 
|---|