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

Last change on this file since 3963 was 3943, checked in by campagne, 15 years ago

release.txt

File size: 9.9 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 a remplir - pas de DataTable rempli si pas appele
66 virtual void DefineDataTable();
67
68 inline void SetVarianceLimits(double vmin=0., double vmax=9.e99)
69 { varmin_=vmin; varmax_=vmax; }
70
71 //POur definir le nbre de bandes de freequences pour calcul mean, variance, cut
72 //ibandlast incluse
73 void SetNumberOfBands(int numberOfBands = 1, int ibandfirst = 0, int ibandlast = 99999);
74
75
76// lecture des gains en fonction de la frequence depuis un fichier FITS
77// flag fgapp: Active ou desactive la renormalisation de coefficients de Fourier par les gains=f(frequence)
78 void ReadGainFitsFile(string filename, bool fgapp=true);
79
80protected:
81 virtual int Process(); // appele paquet par paquet
82// appele par Process() pour traiter un groupe de paquets correspondant a une fenetre en temps
83 virtual void ProcSpecWin(uint_8 numpaqstart, uint_8 numpaqend); // appele fenetre par fenetre
84 virtual void FlagBadPackets(uint_8 numpaqstart, uint_8 numpaqend);
85 virtual void SaveMeanSpectra(); // Pour sauver les spectres moyennes ( + sigma ) dans un fichier
86 virtual void SaveSpectraWindow(); // Pour sauver les spectres de la fenetre temporel ds un fichier
87
88
89 uint_4 nmean_; // Nombre de spectres pour le calcul des moyennes
90 string outpath_; // directory pour fichiers de sortie
91 bool fgdatafft_;
92 bool fgsinglechannel_;
93 uint_4 numfile_;
94 vector<uint_8> nbpaq4mean_;
95 uint_8 totnbpaq_;
96
97 TMatrix< r_4 > mspecmtx_; // Matrice des spectres moyennees
98 TMatrix< r_4 > sigspecmtx_; // Matrice des sigmas des spectres
99
100 TArray< r_4 > spec_window_; // fenetre en temps sur les spectres
101 uint_4 spwin_ext_sz_; // Taille de la zone d'extension en debut et en fin
102 TArray< uint_2 > clnflg_; // flag de nettoyage resultant de la routine FlagBadPackets()
103 uint_8 paqnum_w_start; // numero de paquet du debut de la fenetre en temps (inclusif)
104 uint_8 paqnum_w_end; // numero de paquet final de la fenetre en temps (non inclusif)
105
106 uint_4 nbtot_specwin_; // nombre total de fenetre de spectres traites
107 uint_4 nmaxfiles_specw_; // nombre maximum de fichier de fenetre_spectre
108
109
110 TMatrix< r_4 > sgain_; // gain en fonction de la frequence
111 bool fg_apply_gains_;
112
113 double varmin_, varmax_; // limites pour la coupure sur la variance
114 int ibandfirst_, ibandlast_; //limites pour les numero de bandes a utiliser pour les cut en varaince
115 int numberOfBands_; // nombre de bandes de frequences pour calcul mean, variance et cut
116
117 vector<uint_8> nbadpaq_;
118
119 FitsInOutFile* ofsdtp_; // Output fits stream for datatable
120 SwFitsDataTable* dtp_; // DataTable
121 double* xnt_;
122};
123
124//-------------------------------------------------------------------------
125// Classe WBRFFT : Calcul de TF sur donnees brutes (firmware RAW)
126// en utilisant FFTW et en effectuant une copie ds tableau local
127//-------------------------------------------------------------------------
128typedef unsigned char IDT ; // definition type de donnees en entree de WBRFFT
129typedef int_2 IIDT ; // definition type de donnees intermediaire
130typedef float ODT; // type de donnees en sortie (complex < ODT > )
131//----Classe WBRFFT----
132class WBRFFT {
133public:
134 WBRFFT(uint_4 sz=0);
135 virtual ~WBRFFT();
136
137 void SetInDataSize(uint_4 sz);
138 void DoFFT(IDT *indata, complex<ODT> * ofc);
139 static void PrintData(IDT *indata, complex<ODT> * ofc, uint_4 sz);
140
141 uint_4 sz_; // Taille tableau d'entree
142 TVector< ODT > inp;
143 TVector< complex<ODT> > outfc;
144 fftwf_plan myplan_;
145 static ZMutex* mtx_fftwp_; // Mutex de protection pour la creation du plan fftw
146};
147//--------------------
148
149//---------------------------------------------------------------------
150// Classe de thread de calcul de FFT sur donnees RAW
151//---------------------------------------------------------------------
152class BRFFTCalculator : public BRBaseProcessor
153{
154public:
155 BRFFTCalculator(RAcqMemZoneMgr& memgr, bool fgsinglechannel=false);
156 virtual ~BRFFTCalculator(); // Fait le nettoyage final , sauvegarde des objets ...
157
158protected:
159 virtual int Process();
160
161 bool fgsinglechannel_;
162 uint_8 totnbfftpaq_;
163 WBRFFT ffts_;
164};
165
166
167//-------------------------------------------------------------------------
168// **** OBSOLETE : BRProcA2C et BRProcB4C
169// Anciennes classes de traitement (Avant Nov2009) utilises par mcrd.cc
170//-------------------------------------------------------------------------
171//---------------------------------------------------------------------
172// Classe thread de traitement avec 2 voies par frame (donnees raw/FFT
173//---------------------------------------------------------------------
174
175/*-- Arguments du constructeur :
176 o mem : gestionnaire zones memoires avec contenant les "frames" avec 2 voies/frame
177 o path : Chemin et nom des fichiers PPF produits (on ajoute _numero.ppf )
178 o nmean : Nombre de frame (paquets) moyennes
179 o nmax : Nombre maxi de frames traites
180 o fghist = true -> fait aussi l'histo des valeurs des echantillons temps
181 o nfsmap>0 : fabrication de cartes (image 2D) des spectres,
182 avec nfsmap=nombre de frequences sommes
183 o fgnotrl = true -> fichiers fits / paquets sans trailer
184 o card : numero de carte , juste pour les impressions
185*/
186class BRProcA2C : public ZThread { // !!!! OBSOLETE !!!!
187public:
188 BRProcA2C(RAcqMemZoneMgr& mem, string& path, bool fgraw,
189 uint_4 nmean=10, uint_4 nmax=100, bool fgtshist=false,
190 uint_4 nfsmap=0, bool fgnotrl=false, int card=1);
191 virtual void run();
192 void Stop();
193 inline void STOP() { stop_ = true; }
194protected:
195 RAcqMemZoneMgr& memgr;
196 bool stop_;
197 bool fgraw_; // true -> raw data
198 uint_4 nmax_; // Nombre maxi de blocs MemZone traites
199 uint_4 nmean_; // Nombre de spectres pour le calcul des moyennes
200 uint_4 nfsmap_; // Binning en frequence pour les cartes 2D temps-freq
201 string path_;
202 bool fghist_; // if true, fill and save histogram with time sample values
203 bool fgnotrl_; // if true, don't check packet trailer - when using pre-june fits files
204 int card_; // Numeros de voies 2*card_-1, 2*card_
205};
206
207//---------------------------------------------------------------------
208// Classe thread de traitement 2 x 2 voies/paquet (Apres BRProcA2C)
209// !!!! OBSOLETE !!!!
210//---------------------------------------------------------------------
211/*-- Arguments du constructeur :
212 o mem1,mem2 : gestionnairea zones memoires avec contenant les donnees des 4 voies (2 voies/frame)
213 o path : Chemin et nom des fichiers PPF produits (on ajoute _numero.ppf )
214 o nmean : Nombre de frame (paquets) moyennes
215 o nmax : Nombre maxi de frames traites
216 o fgnotrl = true -> fichiers fits / paquets sans trailer
217 o card : numero de carte , juste pour les impressions
218*/
219
220class BRProcB4C : public ZThread { // !!!! OBSOLETE !!!!
221
222public:
223 BRProcB4C(RAcqMemZoneMgr& mem1, RAcqMemZoneMgr& mem2, string& path,
224 bool fgraw, uint_4 nmean=10, uint_4 nmax=100, bool fgnotrl=false);
225 virtual void run();
226 void Stop();
227 inline void STOP() { stop_ = true; }
228protected:
229 RAcqMemZoneMgr& memgr1;
230 RAcqMemZoneMgr& memgr2;
231 bool stop_;
232 bool fgraw_; // true -> raw data
233 uint_4 nmax_; // Nombre maxi de blocs MemZone traites
234 uint_4 nmean_; // Nombre de blocs pour le calcul des moyennes
235 string path_;
236 bool fgnotrl_; // if true, don't check packet trailer - when using pre-june fits files
237};
238
239
240
241#endif
Note: See TracBrowser for help on using the repository browser.