#ifndef BRPROC_H_SEEN #define BRPROC_H_SEEN //---------------------------------------------------------------- // Projet BAORadio - (C) LAL/IRFU 2008-2010 // Classes de threads de traitememt donnees BAORadio // Principales classes utilisables // - BRMeanSpecCalculator (donnees FFT) // - BRFFTCalculator (donnees RAW) //---------------------------------------------------------------- #include #include #include #include "racqumem.h" #include "brbaseproc.h" #include "parlex.h" #include "sopnamsp.h" #include "tvector.h" #include "ntuple.h" #include "datatable.h" #include "swfitsdtable.h" #include "FFTW/fftw3.h" using namespace std; //--------------------------------------------------------------------- // Classe de traitement simple - calcul de spectres moyennes / voie // a partir de donnees de type FFT (firmware FFT) //--------------------------------------------------------------------- class BRMeanSpecCalculator : public BRBaseProcessor { public: BRMeanSpecCalculator(RAcqMemZoneMgr& memgr, string outpath, uint_4 nmean=1000, bool fgdatafft=true, bool fgsinglechan=false); virtual ~BRMeanSpecCalculator(); // Fait le nettoyage final , sauvegarde des objets ... inline void SetVarianceLimits(double vmin=0., double vmax=9.e99) { varmin_=vmin; varmax_=vmax; } protected: virtual int Process(); virtual void FlagBadPackets(); virtual void SaveSpectra(); uint_4 nmean_; // Nombre de spectres pour le calcul des moyennes string outpath_; // directory pour fichiers de sortie bool fgdatafft_; bool fgsinglechannel_; uint_4 numfile_; uint_8 nbpaq4mean_; uint_8 totnbpaq_; TMatrix< r_4 > mspecmtx_; // Matrice des spectres moyennees TMatrix< r_4 > sigspecmtx_; // Matrice des sigmas des spectres vector clnflg_; // resultat de la routine "cleaner" double varmin_, varmax_; // limites pour la coupure sur la variance vector nbadpaq_; FitsInOutFile* ofsdtp_; // Output fits stream for datatable SwFitsDataTable* dtp_; // DataTable double* xnt_; }; //------------------------------------------------------------------------- // Classe WBRFFT : Calcul de TF sur donnees brutes (firmware RAW) // en utilisant FFTW et en effectuant une copie ds tableau local //------------------------------------------------------------------------- typedef unsigned char IDT ; // definition type de donnees en entree de WBRFFT typedef int_2 IIDT ; // definition type de donnees intermediaire typedef float ODT; // type de donnees en sortie (complex < ODT > ) //----Classe WBRFFT---- class WBRFFT { public: WBRFFT(uint_4 sz=0); virtual ~WBRFFT(); void SetInDataSize(uint_4 sz); void DoFFT(IDT *indata, complex * ofc); static void PrintData(IDT *indata, complex * ofc, uint_4 sz); uint_4 sz_; // Taille tableau d'entree TVector< ODT > inp; TVector< complex > outfc; fftwf_plan myplan_; static ZMutex* mtx_fftwp_; // Mutex de protection pour la creation du plan fftw }; //-------------------- //--------------------------------------------------------------------- // Classe de thread de calcul de FFT sur donnees RAW //--------------------------------------------------------------------- class BRFFTCalculator : public BRBaseProcessor { public: BRFFTCalculator(RAcqMemZoneMgr& memgr, bool fgsinglechannel=false); virtual ~BRFFTCalculator(); // Fait le nettoyage final , sauvegarde des objets ... protected: virtual int Process(); bool fgsinglechannel_; uint_8 totnbfftpaq_; WBRFFT ffts_; }; //------------------------------------------------------------------------- // **** OBSOLETE : BRProcA2C et BRProcB4C // Anciennes classes de traitement (Avant Nov2009) utilises par mcrd.cc //------------------------------------------------------------------------- //--------------------------------------------------------------------- // Classe thread de traitement avec 2 voies par frame (donnees raw/FFT //--------------------------------------------------------------------- /*-- Arguments du constructeur : o mem : gestionnaire zones memoires avec contenant les "frames" avec 2 voies/frame o path : Chemin et nom des fichiers PPF produits (on ajoute _numero.ppf ) o nmean : Nombre de frame (paquets) moyennes o nmax : Nombre maxi de frames traites o fghist = true -> fait aussi l'histo des valeurs des echantillons temps o nfsmap>0 : fabrication de cartes (image 2D) des spectres, avec nfsmap=nombre de frequences sommes o fgnotrl = true -> fichiers fits / paquets sans trailer o card : numero de carte , juste pour les impressions */ class BRProcA2C : public ZThread { // !!!! OBSOLETE !!!! public: BRProcA2C(RAcqMemZoneMgr& mem, string& path, bool fgraw, uint_4 nmean=10, uint_4 nmax=100, bool fgtshist=false, uint_4 nfsmap=0, bool fgnotrl=false, int card=1); virtual void run(); void Stop(); inline void STOP() { stop_ = true; } protected: RAcqMemZoneMgr& memgr; bool stop_; bool fgraw_; // true -> raw data uint_4 nmax_; // Nombre maxi de blocs MemZone traites uint_4 nmean_; // Nombre de spectres pour le calcul des moyennes uint_4 nfsmap_; // Binning en frequence pour les cartes 2D temps-freq string path_; bool fghist_; // if true, fill and save histogram with time sample values bool fgnotrl_; // if true, don't check packet trailer - when using pre-june fits files int card_; // Numeros de voies 2*card_-1, 2*card_ }; //--------------------------------------------------------------------- // Classe thread de traitement 2 x 2 voies/paquet (Apres BRProcA2C) // !!!! OBSOLETE !!!! //--------------------------------------------------------------------- /*-- Arguments du constructeur : o mem1,mem2 : gestionnairea zones memoires avec contenant les donnees des 4 voies (2 voies/frame) o path : Chemin et nom des fichiers PPF produits (on ajoute _numero.ppf ) o nmean : Nombre de frame (paquets) moyennes o nmax : Nombre maxi de frames traites o fgnotrl = true -> fichiers fits / paquets sans trailer o card : numero de carte , juste pour les impressions */ class BRProcB4C : public ZThread { // !!!! OBSOLETE !!!! public: BRProcB4C(RAcqMemZoneMgr& mem1, RAcqMemZoneMgr& mem2, string& path, bool fgraw, uint_4 nmean=10, uint_4 nmax=100, bool fgnotrl=false); virtual void run(); void Stop(); inline void STOP() { stop_ = true; } protected: RAcqMemZoneMgr& memgr1; RAcqMemZoneMgr& memgr2; bool stop_; bool fgraw_; // true -> raw data uint_4 nmax_; // Nombre maxi de blocs MemZone traites uint_4 nmean_; // Nombre de blocs pour le calcul des moyennes string path_; bool fgnotrl_; // if true, don't check packet trailer - when using pre-june fits files }; #endif