Index: trunk/AddOn/TAcq/brproc.h
===================================================================
--- trunk/AddOn/TAcq/brproc.h	(revision 3777)
+++ trunk/AddOn/TAcq/brproc.h	(revision 3872)
@@ -5,4 +5,7 @@
 // Projet BAORadio - (C) LAL/IRFU  2008-2010
 // Classes de threads de traitememt donnees BAORadio 
+//  Principales classes utilisables 
+//  - BRMeanSpecCalculator (donnees FFT)
+//  - BRFFTCalculator (donnees RAW) 
 //----------------------------------------------------------------
 
@@ -19,116 +22,78 @@
 #include "ntuple.h"
 #include "datatable.h"
+#include "FFTW/fftw3.h"
 
 using namespace std;
 
 
-//---------------------------------------------------------------------
-// Classe de traitement - calcul de visibilite pour n fibres 
-//---------------------------------------------------------------------
-class BRVisibilityCalculator : public BRBaseProcessor, ParallelTaskInterface {
-public:	
-  BRVisibilityCalculator(RAcqMemZoneMgr& memgr, string outpath, uint_4 nmean=1000, size_t nthr=1);
-  virtual ~BRVisibilityCalculator(); // Fait le nettoyage final , sauvegarde des objets ...
-
-  // Pour definir le rang de l'objet lors d'un traitement avec plusieurs BRVisibilityCalculator en //
-  void DefineRank(uint_4 nbc, uint_4 cid);
-
-  // Pour limiter le calcul des visibilites a certaines fibres 
-  uint_4 SelectPairs(uint_4 pair1=0, uint_4 nbpairs=99999999);
-  // pour definir le binning en frequence pour la VisibDataTable 
-  int SelectFreqBinning(uint_4 freq1=0, uint_4 freq2=0, uint_4 nbfreq=1);
-
-  // Pour activer la verification des timetag
-  // Creation / sauvegarde d'une matrice de TimeTag / FrameCounter avec NCols=maxnpaq (nb de paquets/trigger)  
-  int ActivateTimeTagCheck(uint_8 maxnpaq);
-
-  // Methode d'execution standard du thread (on redefinit la methode de BRBaseProcessor)
-  virtual void run();  
-  // Methode de la classe ParallelTaskInterface 
-  virtual int    execute(int tid);
-
-  // Le nombre total d'operations effectuees
-  inline r_8 TotNbFLOP() { return nb_flop_; }
-
-protected:
-  virtual int Process(); 
-  virtual int FillVisibTable(double fcm, double ttm); 
-  virtual int CheckTimeTag(); 
-
-  ParallelExecutor paralex_;  // Pour l'execution en parallele  
-  size_t nparthr_;
-
-  uint_4 nmean_;  // Nombre de spectres pour le calcul des moyennes 
-  string outpath_;  // directory pour fichiers de sortie
-  uint_4 nbcalc_, calcid_;  // Nombre total de threads/objets BRVisibilityCalculator parallèles, l'identificateur de l'objet  
-
-  uint_4 pairst_, nbpairs_;   // Numero de la premiere paire, nombre de paires 
-  uint_4 jf1_,jf2_,djf_;  // binning en frequence pour la datatable
-
-  vector<TwoByteComplex*> vpdata_;
-  bool* fgallfibok;  
-
-  double moyfc_, moytt_;
-  TMatrix< complex<r_4> > vismtx_; 
-  TVector< uint_4 > chanum_;
-  //  FitsInOutFile dtfos_;
-  DataTable visdt_;
-
-  uint_4 numfile_;
-  uint_8 totnbpaq_;
-
-  r_8 nb_flop_;   // Nombre total d'operations effectuees
-
-  // Variables/objets pour la verifications des timetag
-  bool fgcktt_;  // true -> checktimetag 
-  int_8 mindeltatt_;       // difference minimum de deux timetag successifs 
-  TMatrix< uint_8 > fcmtx_; // matrices des framecounters
-  TMatrix< uint_8 > ttmtx_; // matrices des timetag 
-  vector< uint_8 > vlasttt_;  // dernieres valeurs de TimeTag / fibre
-  vector< uint_8 > vbadtt_;  // Number of bad TimeTag paquets per fiber 
-  vector< uint_8 > vnsamett_;  // Number of paquets having TimeTag <> TT_Fiber1 per fiber 
-  vector< uint_8 > vndiff5tt_;  // Number of paquets having |TimeTag-TT_Fiber1|>5 per fiber 
-
-};
-
-
-//-------------------------------------------------------------------------------
-// Classe Groupe (ensemble) de Calculateur de Visibilites, tourant en parallele
-//-------------------------------------------------------------------------------
-
-class BRVisCalcGroup {
-public:	
-  BRVisCalcGroup(size_t nbcalc, RAcqMemZoneMgr& memgr, string outpath, uint_4 nmean=1000, size_t nthr=1);
-  ~BRVisCalcGroup();
-  int SelectFreqBinning(uint_4 freq1=0, uint_4 freq2=0, uint_4 nbfreq=1);
-  inline int ActivateTimeTagCheck(uint_8 maxnpaq)
-  { return viscalcp_[0]->ActivateTimeTagCheck(maxnpaq); }
-
-  void start();
-  void join();
-protected:
-  vector<BRVisibilityCalculator *> viscalcp_; 
-  Timer tm_;
-};
  
 //---------------------------------------------------------------------
 // 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);
+  BRMeanSpecCalculator(RAcqMemZoneMgr& memgr, string outpath, uint_4 nmean=1000, 
+		       bool fgdatafft=true, bool fgsinglechan=false);
   virtual ~BRMeanSpecCalculator(); // Fait le nettoyage final , sauvegarde des objets ...
 
 protected:
   virtual int Process(); 
+  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 
 }; 
+
+//-------------------------------------------------------------------------
+// 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<ODT> * ofc);
+  static void PrintData(IDT *indata,  complex<ODT> * ofc, uint_4 sz);
+
+  uint_4 sz_;   // Taille tableau d'entree 
+  TVector< ODT > inp;
+  TVector< complex<ODT> > 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_;
+};
+
 
 //-------------------------------------------------------------------------
@@ -151,5 +116,5 @@
   o card : numero de carte , juste pour les impressions 
 */
-class BRProcA2C : public ZThread {
+class BRProcA2C : public ZThread {   // !!!! OBSOLETE  !!!!
 public:	
   BRProcA2C(RAcqMemZoneMgr& mem, string& path, bool fgraw, 
@@ -174,4 +139,5 @@
 //---------------------------------------------------------------------
 // Classe thread de traitement 2 x 2 voies/paquet (Apres BRProcA2C)
+//         !!!! OBSOLETE  !!!!   
 //---------------------------------------------------------------------
 /*-- Arguments du constructeur : 
@@ -184,5 +150,6 @@
 */
 
-class BRProcB4C : public ZThread {
+class BRProcB4C : public ZThread {  //   !!!! OBSOLETE  !!!!   
+
 public:	
   BRProcB4C(RAcqMemZoneMgr& mem1, RAcqMemZoneMgr& mem2, string& path, 
