Changeset 3905 in Sophya for trunk/AddOn/TAcq/brproc.cc


Ignore:
Timestamp:
Oct 15, 2010, 11:02:36 PM (15 years ago)
Author:
ansari
Message:

implementation de la fenetre en temps pour les spectres ds BRMeanSpecCalculator, Reza 15/10/2010

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/AddOn/TAcq/brproc.cc

    r3888 r3905  
    3232
    3333//---------------------------------------------------------------------
    34 // Classe de traitement simple - calcul de spectres moyennes / voie
     34// Classe de traitement de spectres -
     35// Calcul de spectres moyennes,variance / voie + nettoyage
    3536//---------------------------------------------------------------------
    3637/* --Methode-- */
     
    3940  : BRBaseProcessor(memgr), outpath_(outpath), nmean_(nmean),
    4041    fgdatafft_(fgdatafft), fgsinglechannel_(fgsinglechan),
    41     clnflg_(fgsinglechan?memgr_.NbFibres():2*memgr_.NbFibres()),
     42    nbpaq4mean_(fgsinglechan?memgr_.NbFibres():2*memgr_.NbFibres()),
    4243    nbadpaq_(fgsinglechan?memgr_.NbFibres():2*memgr_.NbFibres())
    4344{
     
    5960
    6061  numfile_=0;
    61   nbpaq4mean_=0;
    6262  totnbpaq_=0;
    6363
     64  size_t nchan=(fgsinglechannel_?memgr_.NbFibres():2*memgr_.NbFibres());
     65 
     66  for(size_t i=0; i<nchan; i++) {
     67    nbpaq4mean_[i]=nbadpaq_[i]=0;
     68  }
     69
     70  // Definition des tailles de fenetres de spectres, etc ...
     71  SetSpectraWindowSize();
     72  SetMaxNbSepcWinFiles();
     73  nbtot_specwin_=0;
    6474  SetVarianceLimits();
    6575
     
    6979  ofsdtp_ = new FitsInOutFile(dtfile,FitsInOutFile::Fits_Create);
    7080  dtp_ = new SwFitsDataTable(*ofsdtp_,1024,true);
    71   int nchan=(fgsinglechannel_?memgr_.NbFibres():2*memgr_.NbFibres());
    7281  char cnom[32];
    7382  for(int i=0; i<nchan; i++) {
    74     sprintf(cnom,"var%d",i);
     83    sprintf(cnom,"variance%d",i);
    7584    dtp_->AddFloatColumn(cnom);   
    7685  }
     86  /*
    7787  for(int i=0; i<nchan; i++) {
    78     sprintf(cnom,"varnorm%d",i);
     88    sprintf(cnom,"sigma%d",i);
    7989    dtp_->AddFloatColumn(cnom);   
    8090  }
     91  */
    8192  xnt_=new double[nchan*2];
     93
    8294}
    8395
     
    8597BRMeanSpecCalculator::~BRMeanSpecCalculator()
    8698{
    87   if (nbpaq4mean_>1)  SaveSpectra();
     99  uint_8 npqm=0;
     100  for(size_t i=0; i<nbpaq4mean_.size(); i++)  npqm+=nbpaq4mean_[i];
     101  if (npqm>nmean_*nbpaq4mean_.size()/10)  SaveMeanSpectra();
    88102  cout << " ---------------- BRMeanSpecCalculator()_Finalizing -------------------- " << endl;
    89103  for(size_t i=0; i<nbadpaq_.size(); i++) {
     
    100114
    101115/* --Methode-- */
    102 void BRMeanSpecCalculator::ReadGainFitsFile(string filename)
     116void BRMeanSpecCalculator::SetSpectraWindowSize(uint_4 winsz, uint_4 wszext)
     117{
     118  if (winsz < 3) {
     119    winsz=1;  wszext=0;
     120  } 
     121  if (wszext>=winsz/2) wszext=winsz/2;
     122  sa_size_t sz[5]={0,0,0,0,0};
     123  sz[0]=mspecmtx_.NCols();
     124  sz[1]=mspecmtx_.NRows();
     125  sz[2]=winsz+2*wszext;
     126  spec_window_.SetSize(3,sz);
     127  spwin_ext_sz_=wszext;
     128  sz[0]=mspecmtx_.NRows();
     129  sz[1]=winsz+2*wszext; 
     130  clnflg_.SetSize(2,sz);
     131  cout << "BRMeanSpecCalculator::SetSpectraWindowSize()/Info: SpectraWindowSize()=" << GetSpectraWindowSize()
     132       << " ExtensionSize=" << GetSpecWinExtensionSize() << " Overlap=" << GetSpecWinOverlapSize()
     133       << " ArraySize=" << spec_window_.SizeZ() << endl;
     134
     135  paqnum_w_start=spwin_ext_sz_;  // premiere initialisation du numero de paquet
     136  return;
     137}
     138
     139/* --Methode-- */
     140void BRMeanSpecCalculator::ReadGainFitsFile(string filename, bool fgapp)
    103141{
    104142  cout << " BRMeanSpecCalculator::ReadGainFitsFile() - reading file " << filename;
    105143  FitsInOutFile fis(filename, FitsInOutFile::Fits_RO);
    106144  fis >> sgain_;
    107   cout << " MeanGain=" << sgain_.Sum()/sgain_.Size() << endl;
     145  fg_apply_gains_=fgapp;
     146  cout << " MeanGain=" << sgain_.Sum()/sgain_.Size() << " ApplyGains="
     147       << ((fg_apply_gains_)?"true":"false") << endl;
    108148}
    109149
     
    111151{ return (z.real()*z.real()+z.imag()*z.imag()); }
    112152
     153
     154
     155
    113156/* --Methode-- */
    114157int BRMeanSpecCalculator::Process()
    115158{
    116   if (nbpaq4mean_==nmean_)  SaveSpectra();
    117   FlagBadPackets();
    118    
     159  // Cette methode remplit le tableau spec_window_ avec les spectres (renormalise avec
     160  // les gains si demande) et appelle la methode du traitement de la fenetre temporelle
     161  // des spectres le cas echeant ProcSpecWin()
     162
     163  int_8 nbpaqdec = (int_8)totnbpaq_-(int_8)GetSpecWinOverlapSize();
     164  if ((nbpaqdec>0)&&(nbpaqdec%GetSpectraWindowSize()==0)) {
     165    paqnum_w_end=totnbpaq_-GetSpecWinExtensionSize();
     166    ProcSpecWin(paqnum_w_start, paqnum_w_end);
     167    paqnum_w_start=totnbpaq_-GetSpecWinExtensionSize();
     168  }
     169
    119170  if (fgdatafft_) {  // Donnees firmware FFT
    120     for(sa_size_t i=0; i<(size_t)mspecmtx_.NRows(); i++) {
    121       if (clnflg_[i])  { nbadpaq_[i]++;  continue; }   // si le paquet a ete flagge mauvais ( clnflg_[i] <> 0 )
     171    for(sa_size_t i=0; i<spec_window_.SizeY(); i++) {
    122172      TwoByteComplex* zp=NULL;
    123173      if (fgsinglechannel_) {
     
    128178        if (i%2==1)  zp=vpaq_[i/2].Data2C();
    129179      }
    130       TVector< r_4 > spec = mspecmtx_.Row(i);
    131       TVector< r_4 > sspec = sigspecmtx_.Row(i);
    132       for(sa_size_t f=1; f<spec.Size(); f++) {
    133         r_4 m2zf=zp[f].module2F();;
    134         spec(f) += m2zf;
    135         sspec(f) += m2zf*m2zf;
    136       }
     180      sa_size_t kz=PaqNumToArrayIndex(totnbpaq_);
     181      for(sa_size_t f=0; f<spec_window_.SizeX(); f++)
     182        spec_window_(f,i,kz) = zp[f].module2F();
    137183    }
    138184  }
    139185  else {  // Donnees RAW qui ont du etre processe par BRFFTCalculator
    140     for(sa_size_t i=0; i<(size_t)mspecmtx_.NRows(); i++) {
    141       if (clnflg_[i])  { nbadpaq_[i]++;  continue; }   // si le paquet a ete flagge mauvais ( clnflg_[i] <> 0 )
     186    for(sa_size_t i=0; i<spec_window_.SizeY(); i++) {
    142187      complex<ODT>* zp=NULL;
    143188      if (fgsinglechannel_) {
     
    148193        if (i%2==1)  zp= reinterpret_cast< complex<ODT>* >(vprocpaq_[i/2]+memgr_.ProcPaqSize()/2) ;
    149194      }
     195      sa_size_t kz=PaqNumToArrayIndex(totnbpaq_);
     196      for(sa_size_t f=0; f<spec_window_.SizeX(); f++)
     197        spec_window_(f,i,kz) = Zmod2(zp[f]);
     198    }
     199  }
     200  if (fg_apply_gains_) {   // Application des gains, si demande
     201    sa_size_t kz=PaqNumToArrayIndex(totnbpaq_);
     202    for(sa_size_t i=0; i<spec_window_.SizeY(); i++)
     203      (spec_window_(Range::all(), Range(i), Range(kz))).Div(sgain_.Row(i));
     204  }
     205
     206  totnbpaq_++;
     207  return 0;
     208}
     209
     210
     211/* --Methode-- */
     212void BRMeanSpecCalculator::ProcSpecWin(uint_8 numpaqstart, uint_8 numpaqend)
     213{
     214  //DBG  cout << "BRMeanSpecCalculator::ProcSpecWin()/Debug: numpaqstart=" << numpaqstart
     215  //DBG     << " numpaqend=" << numpaqend << endl;
     216
     217  // On appelle la routine de nettoyage qui doit flagger les mauvais paquets
     218  FlagBadPackets(numpaqstart, numpaqend);
     219
     220  // Boucle sur les numeros de paquets de la fenetre en temps
     221  for (uint_8 jp=numpaqstart; jp<numpaqend; jp++) {
     222    // On sauvegarde les spectres moyennes si necessaire
     223    if ((nbpaq4mean_[0]>0)&&(nbpaq4mean_[0]%nmean_ == 0))  SaveMeanSpectra();
     224    //  On peut aussi acceder aux spectres et flags pour (jpmin -),(jpmax+) GetSpecWinExtensionSize()
     225    sa_size_t kz=PaqNumToArrayIndex(jp);
     226    // Boucle sur les numeros de voie (canaux)
     227    for(sa_size_t i=0; i<spec_window_.SizeY(); i++)  {
     228      if ( clnflg_(i,kz) != 0)  continue;
    150229      TVector< r_4 > spec = mspecmtx_.Row(i);
    151230      TVector< r_4 > sspec = sigspecmtx_.Row(i);
    152       for(sa_size_t f=1; f<spec.Size(); f++)  {
    153         r_4 m2zf=Zmod2(zp[f]);
    154         spec(f) += m2zf;
    155         sspec(f) += (m2zf*m2zf);       
    156       }     
     231      // Calcul de spectres moyennes et variance
     232      for(sa_size_t f=1; f<spec.Size(); f++)  {   // boucle sur les frequences
     233        spec(f) += spec_window_(f,i,kz);
     234        sspec(f) += spec_window_(f,i,kz)*spec_window_(f,i,kz); 
     235      }
     236      nbpaq4mean_[i]++;  // compteur de paquets OK pour la moyenne
    157237    }
    158238  }
    159   nbpaq4mean_++;   totnbpaq_++;
    160   return 0;
    161 }
    162 
    163 /* --Methode-- */
    164 void BRMeanSpecCalculator::FlagBadPackets()
    165 {
    166   if (fgdatafft_) {  // Donnees firmware FFT
    167     for(sa_size_t i=0; i<(size_t)mspecmtx_.NRows(); i++) {
    168       TwoByteComplex* zp=NULL;
    169       if (fgsinglechannel_) {
    170         zp=vpaq_[i].Data1C();
    171       }
    172       else {
    173         zp=vpaq_[i/2].Data1C();
    174         if (i%2==1)  zp=vpaq_[i/2].Data2C();
    175       }
     239  if (nbtot_specwin_<nmaxfiles_specw_)  SaveSpectraWindow();
     240  nbtot_specwin_++;
     241  return;
     242}
     243
     244/* --Methode-- */
     245void BRMeanSpecCalculator::FlagBadPackets(uint_8 numpaqstart, uint_8 numpaqend)
     246{
     247  // Boucle sur les numeros de paquets de la fenetre en temps
     248  for (uint_8 jp=numpaqstart; jp<numpaqend; jp++) {
     249    //  On peut aussi acceder aux spectres et flags pour (jpmin -),(jpmax+) GetSpecWinExtensionSize()
     250    sa_size_t kz=PaqNumToArrayIndex(jp);
     251    // Boucle sur les numeros de voie (canaux)
     252    for(sa_size_t i=0; i<spec_window_.SizeY(); i++)  {
     253      double mean, sigma;
     254      sa_size_t kz=PaqNumToArrayIndex(totnbpaq_);
    176255      double variance=0.;
    177       double varnorm=0.;
    178       for(sa_size_t f=1; f<mspecmtx_.NCols(); f++) {
    179         double modsq=(double)zp[f].module2F();
    180         variance+=modsq;
    181         varnorm+=modsq/sgain_(i,f);
    182       }
     256      variance=spec_window_(Range(1,Range::lastIndex()), Range(i), Range(kz)).Sum();
    183257      xnt_[i]=variance;
    184       xnt_[i+mspecmtx_.NRows()]=varnorm;
    185       clnflg_[i]=0;
    186       if (varnorm<varmin_) clnflg_[i]=1;
    187       else if (varnorm>varmax_) clnflg_[i]=2;
     258      clnflg_(i,kz)=0;
     259      if (variance<varmin_) { clnflg_(i,kz)=1;  nbadpaq_[i]++; }
     260      else if (variance>varmax_) { clnflg_(i,kz)=2;  nbadpaq_[i]++; }
    188261    }
    189   }
    190   else {  // Donnees RAW qui ont du etre processe par BRFFTCalculator
    191     for(sa_size_t i=0; i<(size_t)mspecmtx_.NRows(); i++) {
    192       complex<ODT>* zp=NULL;
    193       if (fgsinglechannel_) {
    194         zp=reinterpret_cast< complex<ODT>* > (vprocpaq_[i]);
    195       }
    196       else {
    197         zp=reinterpret_cast< complex<ODT>* > (vprocpaq_[i/2]);
    198         if (i%2==1)  zp= reinterpret_cast< complex<ODT>* >(vprocpaq_[i/2]+memgr_.ProcPaqSize()/2) ;
    199       }
    200       double variance=0.;
    201       double varnorm=0.;
    202       for(sa_size_t f=1; f<mspecmtx_.NCols(); f++) {
    203         double modsq=(double)Zmod2(zp[f]);
    204         variance+=modsq;
    205         varnorm+=modsq/sgain_(i,f);
    206       }
    207       xnt_[i]=variance;
    208       xnt_[i+mspecmtx_.NRows()]=varnorm;
    209       clnflg_[i]=0;
    210       if (varnorm<varmin_) clnflg_[i]=1;
    211       else if (varnorm>varmax_) clnflg_[i]=2;
     262  dtp_->AddRow(xnt_);
     263  }
     264  return;
     265}
     266
     267/* --Methode-- */
     268void BRMeanSpecCalculator::SaveMeanSpectra()
     269{
     270  for(sa_size_t ir=0; ir<mspecmtx_.NRows(); ir++) {
     271    char buff[32];
     272    sprintf(buff,"NPAQSUM_%d",(int)ir);
     273    mspecmtx_.Info()["NPAQSUM"] = nbpaq4mean_[0];
     274    mspecmtx_.Info()[buff] = nbpaq4mean_[ir];
     275    sigspecmtx_.Info()["NPAQSUM"] = nbpaq4mean_[0];
     276    sigspecmtx_.Info()[buff] = nbpaq4mean_[ir];
     277    if (nbpaq4mean_[ir] > 0) {
     278      mspecmtx_.Row(ir)  /= (r_4)nbpaq4mean_[ir];
     279      sigspecmtx_.Row(ir) /= (r_4)nbpaq4mean_[ir];
     280      sigspecmtx_.Row(ir) -= (mspecmtx_.Row(ir) && mspecmtx_.Row(ir));  // Mean(X^2) - [ Mean(X) ]^2
    212281    }
    213282  }
    214   dtp_->AddRow(xnt_);
    215   return;
    216 }
    217 
    218 /* --Methode-- */
    219 void BRMeanSpecCalculator::SaveSpectra()
    220 {
    221   mspecmtx_.Info()["NPAQSUM"] = nbpaq4mean_;
    222   mspecmtx_ /= (double)nbpaq4mean_;
    223   sigspecmtx_.Info()["NPAQSUM"] = nbpaq4mean_;
    224   sigspecmtx_ /= (double)nbpaq4mean_;
    225   sigspecmtx_ -= (mspecmtx_ && mspecmtx_);  // Mean(X^2) - [ Mean(X) ]^2
    226283  char nfile[64];
    227284  string flnm;
    228   /*
    229   {
    230   sprintf(nfile,"mspecmtx%d.ppf",numfile_);
    231   flnm=outpath_+nfile;
    232   POutPersist po(flnm);
    233   po << mspecmtx_;
    234   }
    235   {
    236   sprintf(nfile,"sigspecmtx%d.ppf",numfile_);
    237   flnm=outpath_+nfile;
    238   POutPersist po(flnm);
    239   po << sigspecmtx_;
    240   }
    241   */
    242285  {
    243286  sprintf(nfile,"mspecmtx%d.fits",numfile_);
     
    253296  }
    254297
    255   cout << numfile_ << "-BRMeanSpecCalculator::SaveSpectra() NPaqProc="
     298  cout << numfile_ << "-BRMeanSpecCalculator::SaveMeanSpectra() NPaqProc="
    256299       << totnbpaq_ << "  -> Mean/Sig spectra Matrix in " << flnm << " /sigspec...ppf" << endl;
    257   numfile_++;  nbpaq4mean_=0;
     300  numfile_++; 
     301
     302  for(size_t i=0; i<nbpaq4mean_.size(); i++) nbpaq4mean_[i]=0;
    258303  mspecmtx_ = (r_4)(0.);
    259304  sigspecmtx_ = (r_4)(0.);
    260305  return;
     306}
     307
     308/* --Methode-- */
     309void BRMeanSpecCalculator::SaveSpectraWindow()
     310{
     311  char nfile[64];
     312  string flnm;
     313  sprintf(nfile,"specwin%d.fits",nbtot_specwin_);
     314  flnm="!"+outpath_+nfile;
     315  FitsInOutFile fos(flnm,FitsInOutFile::Fits_Create);
     316  fos << spec_window_;
     317  cout << " SaveSpectraWindow() " << nbtot_specwin_ << "- file " << nfile << " created " << endl;
    261318}
    262319
     
    332389  for(uint_4 k=0; k<inp.Size(); k++)   inp(k)=(ODT)indata[k];
    333390  fftwf_execute(myplan_);
    334   for(uint_4 k=0; k<outfc.Size(); k++)   ofc[k]=outfc(k);
     391  for(uint_4 k=0; k<outfc.Size(); k++)   ofc[k]=outfc(k)/(ODT)sz_;   // on renormalise les coeff FFT ( / sz )
    335392  return;
    336393}
Note: See TracChangeset for help on using the changeset viewer.