source: Sophya/trunk/AddOn/TAcq/brproc.h@ 3998

Last change on this file since 3998 was 3993, checked in by ansari, 14 years ago

Ajout possibilite de faire un DataTable (NTuple) avec la puissance spectrale dans plusieurs bandes en fonction du temps, Reza 13/05/2011

File size: 10.8 KB
Line 
1#ifndef BRPROC_H_SEEN
2#define BRPROC_H_SEEN
3
4//----------------------------------------------------------------
5// Projet BAORadio - (C) LAL/IRFU 2008-2011
6// Classes de threads de traitememt donnees BAORadio
7// Principales classes utilisables
8// - BRMeanSpecCalculator (donnees FFT ou RAW apres BRFFTCalculator)
9// - BRFFTCalculator (donnees RAW)
10//----------------------------------------------------------------
11
12
13#include <string>
14#include <vector>
15#include <iostream>
16
17#include "racqumem.h"
18#include "brbaseproc.h"
19#include "parlex.h"
20#include "sopnamsp.h"
21#include "tvector.h"
22#include "ntuple.h"
23#include "datatable.h"
24#include "swfitsdtable.h"
25#include "FFTW/fftw3.h"
26
27using namespace std;
28
29
30
31//---------------------------------------------------------------------
32// Classe de traitement simple - calcul de spectres moyennes / voie
33// a partir de donnees de type FFT (firmware FFT ou firmware RAW
34// apres traitement par BRFFTCalculator)
35// Peut servir egalement comme classe de base, apres heritage et
36// redefinition des methodes ProcSpecWin() et/ou FlagBadPackets()
37//---------------------------------------------------------------------
38
39class BRMeanSpecCalculator : public BRBaseProcessor
40{
41public:
42 BRMeanSpecCalculator(RAcqMemZoneMgr& memgr, string outpath, uint_4 nmean=1000,
43 bool fgdatafft=true, bool fgsinglechan=false);
44 virtual ~BRMeanSpecCalculator(); // Fait le nettoyage final , sauvegarde des objets ...
45
46 //JEC 19/1/11
47 static inline r_4 Zmod2(complex<r_4> z){ return (z.real()*z.real()+z.imag()*z.imag()); }
48
49// Definit la taille de la fenetre temporelle (winsz = nb de paquets) des spectres a traiter
50// Cette zone est etendu de wszext paquet en debut et en fin de paquet
51 void SetSpectraWindowSize(uint_4 winsz=15, uint_4 wszext=3);
52// Taille de la fenetre en temps (nb de paquets a traiter en bloc
53 inline sa_size_t GetSpectraWindowSize() { return spec_window_.SizeZ()-2*spwin_ext_sz_; }
54// Taille de la zone d'extension de la fenetre de chaque cote
55 inline sa_size_t GetSpecWinExtensionSize() { return spwin_ext_sz_; }
56// La taille de recouvrement est le double de la taille de la zone d'extension
57 inline sa_size_t GetSpecWinOverlapSize() { return 2*spwin_ext_sz_; }
58// Retourne l'index (selon Z) dans le tableau des spectres en fonction du numero de paquet
59 inline sa_size_t PaqNumToArrayIndex(uint_8 numpaq) { return numpaq%spec_window_.SizeZ() ; }
60 inline int GetNumberOfBands() { return numberOfBands_; }
61
62// Pour definir le nombre maximum de fichiers de fenetres de spectres a sauver sur fichiers
63 inline void SetMaxNbSpecWinFiles(uint_4 nmax=0) { nmaxfiles_specw_=nmax; }
64
65// Pour definir le datatable (moyenne spectre paquet par paquet)
66// Le DataTable est rempli par FlagBadPackets - Pas de DataTable rempli si pas appele
67 virtual void DefinePerPaquetDataTable();
68
69// Pour definir le datatable puissance spectrale moyennee ou filtree en fonction du temps
70 virtual void DefineTimeAvgPowerDataTable(int first=1, int last=-1, int nband=1);
71
72 inline void SetVarianceLimits(double vmin=0., double vmax=9.e99)
73 { varmin_=vmin; varmax_=vmax; }
74
75 //POur definir le nbre de bandes de freequences pour calcul mean, variance, cut
76 //ibandlast incluse
77 void SetNumberOfBands(int numberOfBands = 1, int ibandfirst = 0, int ibandlast = 99999);
78
79
80// lecture des gains en fonction de la frequence depuis un fichier FITS
81// flag fgapp: Active ou desactive la renormalisation de coefficients de Fourier par les gains=f(frequence)
82 void ReadGainFitsFile(string filename, bool fgapp=true);
83
84protected:
85 virtual int Process(); // appele paquet par paquet
86// appele par Process() pour traiter un groupe de paquets correspondant a une fenetre en temps
87 virtual void ProcSpecWin(uint_8 numpaqstart, uint_8 numpaqend); // appele fenetre par fenetre
88 virtual void FlagBadPackets(uint_8 numpaqstart, uint_8 numpaqend);
89 virtual void SaveMeanSpectra(); // Pour sauver les spectres moyennes ( + sigma ) dans un fichier
90 virtual void SaveSpectraWindow(); // Pour sauver les spectres de la fenetre temporel ds un fichier
91 virtual void FillPwrTmDTable(TMatrix< r_4 >& specmtx); // pour remplir la puissance spectrale en fonction du temps
92
93 uint_4 nmean_; // Nombre de spectres pour le calcul des moyennes
94 string outpath_; // directory pour fichiers de sortie
95 bool fgdatafft_;
96 bool fgsinglechannel_;
97 uint_4 numfile_;
98 vector<uint_8> nbpaq4mean_;
99 uint_8 totnbpaq_;
100
101 TMatrix< r_4 > mspecmtx_; // Matrice des spectres moyennees
102 TMatrix< r_4 > sigspecmtx_; // Matrice des sigmas des spectres
103 double moyfc_, moytt_; // FrameCounter/TimeTag moyen pour chaque matrice
104 uint_8 nbpmoyttfc_; // Nombre de TimeTag/FrameCounter somme
105
106 TArray< r_4 > spec_window_; // fenetre en temps sur les spectres
107 uint_4 spwin_ext_sz_; // Taille de la zone d'extension en debut et en fin
108 TArray< uint_2 > clnflg_; // flag de nettoyage resultant de la routine FlagBadPackets()
109 uint_8 paqnum_w_start; // numero de paquet du debut de la fenetre en temps (inclusif)
110 uint_8 paqnum_w_end; // numero de paquet final de la fenetre en temps (non inclusif)
111
112 uint_4 nbtot_specwin_; // nombre total de fenetre de spectres traites
113 uint_4 nmaxfiles_specw_; // nombre maximum de fichier de fenetre_spectre
114
115
116 TMatrix< r_4 > sgain_; // gain en fonction de la frequence
117 bool fg_apply_gains_;
118
119 double varmin_, varmax_; // limites pour la coupure sur la variance
120 int ibandfirst_, ibandlast_; //limites pour les numero de bandes a utiliser pour les cut en varaince
121 int numberOfBands_; // nombre de bandes de frequences pour calcul mean, variance et cut
122
123 vector<uint_8> nbadpaq_;
124
125 // DataTable for paquet/paquet mean/variance for frequency bands
126 FitsInOutFile* ofsdtp_; // Output fits stream for datatable
127 SwFitsDataTable* dtp_; // per paquet DataTable
128 double* xnt_;
129 // DataTable for time averaged spectrum mean per frequency band
130 FitsInOutFile* ofsdtpms_; // Output fits stream for datatable for time averaged spectrum
131 SwFitsDataTable* dtpms_; // DataTable for time averaged spectrum
132 double* xntms_;
133 int firstfreqms_, lastfreqms_, nbandms_;
134};
135
136//-------------------------------------------------------------------------
137// Classe WBRFFT : Calcul de TF sur donnees brutes (firmware RAW)
138// en utilisant FFTW et en effectuant une copie ds tableau local
139//-------------------------------------------------------------------------
140typedef unsigned char IDT ; // definition type de donnees en entree de WBRFFT
141typedef int_2 IIDT ; // definition type de donnees intermediaire
142typedef float ODT; // type de donnees en sortie (complex < ODT > )
143//----Classe WBRFFT----
144class WBRFFT {
145public:
146 WBRFFT(uint_4 sz=0);
147 virtual ~WBRFFT();
148
149 void SetInDataSize(uint_4 sz);
150 void DoFFT(IDT *indata, complex<ODT> * ofc);
151 static void PrintData(IDT *indata, complex<ODT> * ofc, uint_4 sz);
152
153 uint_4 sz_; // Taille tableau d'entree
154 TVector< ODT > inp;
155 TVector< complex<ODT> > outfc;
156 fftwf_plan myplan_;
157 static ZMutex* mtx_fftwp_; // Mutex de protection pour la creation du plan fftw
158};
159//--------------------
160
161//---------------------------------------------------------------------
162// Classe de thread de calcul de FFT sur donnees RAW
163//---------------------------------------------------------------------
164class BRFFTCalculator : public BRBaseProcessor
165{
166public:
167 BRFFTCalculator(RAcqMemZoneMgr& memgr, bool fgsinglechannel=false);
168 virtual ~BRFFTCalculator(); // Fait le nettoyage final , sauvegarde des objets ...
169
170protected:
171 virtual int Process();
172
173 bool fgsinglechannel_;
174 uint_8 totnbfftpaq_;
175 WBRFFT ffts_;
176};
177
178
179//-------------------------------------------------------------------------
180// **** OBSOLETE : BRProcA2C et BRProcB4C
181// Anciennes classes de traitement (Avant Nov2009) utilises par mcrd.cc
182//-------------------------------------------------------------------------
183//---------------------------------------------------------------------
184// Classe thread de traitement avec 2 voies par frame (donnees raw/FFT
185//---------------------------------------------------------------------
186
187/*-- Arguments du constructeur :
188 o mem : gestionnaire zones memoires avec contenant les "frames" avec 2 voies/frame
189 o path : Chemin et nom des fichiers PPF produits (on ajoute _numero.ppf )
190 o nmean : Nombre de frame (paquets) moyennes
191 o nmax : Nombre maxi de frames traites
192 o fghist = true -> fait aussi l'histo des valeurs des echantillons temps
193 o nfsmap>0 : fabrication de cartes (image 2D) des spectres,
194 avec nfsmap=nombre de frequences sommes
195 o fgnotrl = true -> fichiers fits / paquets sans trailer
196 o card : numero de carte , juste pour les impressions
197*/
198class BRProcA2C : public ZThread { // !!!! OBSOLETE !!!!
199public:
200 BRProcA2C(RAcqMemZoneMgr& mem, string& path, bool fgraw,
201 uint_4 nmean=10, uint_4 nmax=100, bool fgtshist=false,
202 uint_4 nfsmap=0, bool fgnotrl=false, int card=1);
203 virtual void run();
204 void Stop();
205 inline void STOP() { stop_ = true; }
206protected:
207 RAcqMemZoneMgr& memgr;
208 bool stop_;
209 bool fgraw_; // true -> raw data
210 uint_4 nmax_; // Nombre maxi de blocs MemZone traites
211 uint_4 nmean_; // Nombre de spectres pour le calcul des moyennes
212 uint_4 nfsmap_; // Binning en frequence pour les cartes 2D temps-freq
213 string path_;
214 bool fghist_; // if true, fill and save histogram with time sample values
215 bool fgnotrl_; // if true, don't check packet trailer - when using pre-june fits files
216 int card_; // Numeros de voies 2*card_-1, 2*card_
217};
218
219//---------------------------------------------------------------------
220// Classe thread de traitement 2 x 2 voies/paquet (Apres BRProcA2C)
221// !!!! OBSOLETE !!!!
222//---------------------------------------------------------------------
223/*-- Arguments du constructeur :
224 o mem1,mem2 : gestionnairea zones memoires avec contenant les donnees des 4 voies (2 voies/frame)
225 o path : Chemin et nom des fichiers PPF produits (on ajoute _numero.ppf )
226 o nmean : Nombre de frame (paquets) moyennes
227 o nmax : Nombre maxi de frames traites
228 o fgnotrl = true -> fichiers fits / paquets sans trailer
229 o card : numero de carte , juste pour les impressions
230*/
231
232class BRProcB4C : public ZThread { // !!!! OBSOLETE !!!!
233
234public:
235 BRProcB4C(RAcqMemZoneMgr& mem1, RAcqMemZoneMgr& mem2, string& path,
236 bool fgraw, uint_4 nmean=10, uint_4 nmax=100, bool fgnotrl=false);
237 virtual void run();
238 void Stop();
239 inline void STOP() { stop_ = true; }
240protected:
241 RAcqMemZoneMgr& memgr1;
242 RAcqMemZoneMgr& memgr2;
243 bool stop_;
244 bool fgraw_; // true -> raw data
245 uint_4 nmax_; // Nombre maxi de blocs MemZone traites
246 uint_4 nmean_; // Nombre de blocs pour le calcul des moyennes
247 string path_;
248 bool fgnotrl_; // if true, don't check packet trailer - when using pre-june fits files
249};
250
251
252
253#endif
Note: See TracBrowser for help on using the repository browser.