Changeset 3905 in Sophya for trunk/AddOn/TAcq/brproc.cc
- Timestamp:
- Oct 15, 2010, 11:02:36 PM (15 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/AddOn/TAcq/brproc.cc
r3888 r3905 32 32 33 33 //--------------------------------------------------------------------- 34 // Classe de traitement simple - calcul de spectres moyennes / voie 34 // Classe de traitement de spectres - 35 // Calcul de spectres moyennes,variance / voie + nettoyage 35 36 //--------------------------------------------------------------------- 36 37 /* --Methode-- */ … … 39 40 : BRBaseProcessor(memgr), outpath_(outpath), nmean_(nmean), 40 41 fgdatafft_(fgdatafft), fgsinglechannel_(fgsinglechan), 41 clnflg_(fgsinglechan?memgr_.NbFibres():2*memgr_.NbFibres()),42 nbpaq4mean_(fgsinglechan?memgr_.NbFibres():2*memgr_.NbFibres()), 42 43 nbadpaq_(fgsinglechan?memgr_.NbFibres():2*memgr_.NbFibres()) 43 44 { … … 59 60 60 61 numfile_=0; 61 nbpaq4mean_=0;62 62 totnbpaq_=0; 63 63 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; 64 74 SetVarianceLimits(); 65 75 … … 69 79 ofsdtp_ = new FitsInOutFile(dtfile,FitsInOutFile::Fits_Create); 70 80 dtp_ = new SwFitsDataTable(*ofsdtp_,1024,true); 71 int nchan=(fgsinglechannel_?memgr_.NbFibres():2*memgr_.NbFibres());72 81 char cnom[32]; 73 82 for(int i=0; i<nchan; i++) { 74 sprintf(cnom,"var %d",i);83 sprintf(cnom,"variance%d",i); 75 84 dtp_->AddFloatColumn(cnom); 76 85 } 86 /* 77 87 for(int i=0; i<nchan; i++) { 78 sprintf(cnom," varnorm%d",i);88 sprintf(cnom,"sigma%d",i); 79 89 dtp_->AddFloatColumn(cnom); 80 90 } 91 */ 81 92 xnt_=new double[nchan*2]; 93 82 94 } 83 95 … … 85 97 BRMeanSpecCalculator::~BRMeanSpecCalculator() 86 98 { 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(); 88 102 cout << " ---------------- BRMeanSpecCalculator()_Finalizing -------------------- " << endl; 89 103 for(size_t i=0; i<nbadpaq_.size(); i++) { … … 100 114 101 115 /* --Methode-- */ 102 void BRMeanSpecCalculator::ReadGainFitsFile(string filename) 116 void 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-- */ 140 void BRMeanSpecCalculator::ReadGainFitsFile(string filename, bool fgapp) 103 141 { 104 142 cout << " BRMeanSpecCalculator::ReadGainFitsFile() - reading file " << filename; 105 143 FitsInOutFile fis(filename, FitsInOutFile::Fits_RO); 106 144 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; 108 148 } 109 149 … … 111 151 { return (z.real()*z.real()+z.imag()*z.imag()); } 112 152 153 154 155 113 156 /* --Methode-- */ 114 157 int BRMeanSpecCalculator::Process() 115 158 { 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 119 170 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++) { 122 172 TwoByteComplex* zp=NULL; 123 173 if (fgsinglechannel_) { … … 128 178 if (i%2==1) zp=vpaq_[i/2].Data2C(); 129 179 } 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(); 137 183 } 138 184 } 139 185 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++) { 142 187 complex<ODT>* zp=NULL; 143 188 if (fgsinglechannel_) { … … 148 193 if (i%2==1) zp= reinterpret_cast< complex<ODT>* >(vprocpaq_[i/2]+memgr_.ProcPaqSize()/2) ; 149 194 } 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-- */ 212 void 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; 150 229 TVector< r_4 > spec = mspecmtx_.Row(i); 151 230 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 157 237 } 158 238 } 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-- */ 245 void 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_); 176 255 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(); 183 257 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]++; } 188 261 } 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-- */ 268 void 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 212 281 } 213 282 } 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) ]^2226 283 char nfile[64]; 227 284 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 */242 285 { 243 286 sprintf(nfile,"mspecmtx%d.fits",numfile_); … … 253 296 } 254 297 255 cout << numfile_ << "-BRMeanSpecCalculator::Save Spectra() NPaqProc="298 cout << numfile_ << "-BRMeanSpecCalculator::SaveMeanSpectra() NPaqProc=" 256 299 << 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; 258 303 mspecmtx_ = (r_4)(0.); 259 304 sigspecmtx_ = (r_4)(0.); 260 305 return; 306 } 307 308 /* --Methode-- */ 309 void 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; 261 318 } 262 319 … … 332 389 for(uint_4 k=0; k<inp.Size(); k++) inp(k)=(ODT)indata[k]; 333 390 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 ) 335 392 return; 336 393 }
Note:
See TracChangeset
for help on using the changeset viewer.