Changeset 1467 in Sophya for trunk/ArchTOIPipe/ProcWSophya
- Timestamp:
- Apr 12, 2001, 3:14:22 PM (24 years ago)
- Location:
- trunk/ArchTOIPipe/ProcWSophya
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/ArchTOIPipe/ProcWSophya/simtoipr.cc
r1464 r1467 87 87 try { 88 88 Timer tm("SimpleDeglitcher::run()"); 89 Vector vin(wsize); 90 91 int wrec = maxpoints*2; 92 Vector vrec(wrec); 93 94 TVector<int_8> vfg(wsize); 95 int wsz2 = wsize/2; 89 96 // Le debut 90 Vector vin(wsize);91 TVector<int_8> vfg(wsize);92 97 int k; 93 for(k=0; k<ws ize; k++)98 for(k=0; k<wsz2; k++) 94 99 getData(0, k+snb, vin(k), vfg(k)); 95 100 96 double s = vin.Sum(); 97 double mean = s/wsize; 98 for(k=0; k<wsize; k++) { 99 if ( (vin(k) < range_min) || (vin(k) > range_max) ) { 100 vin(k) = mean; 101 vfg(k) |= 2; 102 out_range_nscount++; 103 } 104 } 105 s = vin.Sum(); 106 mean = s/wsize; 107 108 double s2 = vin.SumX2(); 109 double sigma = sqrt(s2/wsize-mean*mean); 101 int nokdebut = 0.; 102 double s = 0.; 103 double mean = 0.; 104 double s2 = 0.; 105 double sigma = 0.; 106 for(k=0; k<wsz2; k++) { 107 if ( vfg(k) != 0) continue; 108 if ( (vin(k) < range_min) || (vin(k) > range_max) ) continue; 109 s += vin(k); 110 s2 += vin(k)*vin(k); 111 nokdebut++; 112 } 113 if (nokdebut > 0) { 114 mean = s/nokdebut; 115 if (nokdebut > 1) sigma = sqrt(s2/nokdebut-mean*mean); 116 } 117 for(k=wsz2; k<wsize; k++) { 118 vin(k) = mean; 119 vfg(k) = 0; 120 } 121 122 for(k=0; k<wrec; k++) { 123 if ( (vin(k) < range_min) || (vin(k) > range_max) ) vrec(k)=mean; 124 else vrec(k)=vin(k); 125 } 126 127 bool fgokdebut = false; 128 110 129 int kgl = -1; 111 130 int ii,lastput; 112 131 bool fgglitch = false; 113 132 double valcur,valsub,valadd; 133 double lastvalok = mean; 114 134 uint_8 fgcur; 115 135 bool fgokcur=false; 116 136 // Boucle sur les sampleNum 117 137 118 for(k=0;k<=sne-snb;k++) { 138 int knext; 139 int kfin = sne-snb; 140 for(k=0;k<=kfin;k++) { 119 141 totnscount++; 120 142 // if (k%10000 == 0) cout << " DBG: K=" << k << endl; 143 knext = k+wsz2; 121 144 // Calcul mean-sigma 122 if (k >=wsize) {123 valsub = vin(k %wsize);124 getData(0, k +snb, vin(k%wsize), vfg(k%wsize));125 valadd = vin(k %wsize);126 if ( (valadd < range_min) || (valadd > range_max) ) 145 if (knext<=kfin) { 146 valsub = vin(knext%wsize); 147 getData(0, knext+snb, vin(knext%wsize), vfg(knext%wsize)); 148 valadd = vin(knext%wsize); 149 if ( (valadd < range_min) || (valadd > range_max) ) { 127 150 valadd = mean; 128 s += (valadd-valsub); 129 s2 += (valadd*valadd-valsub*valsub); 130 mean = s/wsize; 131 sigma = sqrt(s2/wsize-mean*mean); 132 } 151 fgokcur = false; 152 } 153 else fgokcur = true; 154 if ( (valsub < range_min) || (valsub > range_max) ) 155 valsub = mean; 156 if (!fgokdebut && fgokcur) { 157 s += valadd; 158 s2 += valadd*valadd; 159 nokdebut++; 160 mean = s/nokdebut; 161 if (nokdebut > 1) sigma = sqrt(s2/nokdebut-mean*mean); 162 if (nokdebut >= wsize) { 163 fgokdebut = true; 164 cout << " SimpleDeglitcher::DebugInfo - nokdebut=" << nokdebut 165 << " k=" << k << " knext=" << knext 166 << "\n ...DebugInfo mean=" << mean 167 << " sigma=" << sigma << " s=" << s << " s2=" << s2 << endl; 168 } 169 } 170 else { 171 s += (valadd-valsub); 172 s2 += (valadd*valadd-valsub*valsub); 173 mean = s/wsize; 174 sigma = sqrt(s2/wsize-mean*mean); 175 } 176 } 177 133 178 134 179 // On gere les sorties Mean et Sigma … … 140 185 putData(3, k+snb, vin(k%wsize), vfg(k%wsize)); 141 186 142 valcur = vin(k%wsize);143 187 if ( (valcur < range_min) || (valcur > range_max) ) { 144 188 vin(k%wsize) = valcur = mean; … … 146 190 out_range_nscount++; 147 191 } 192 valcur = vin(k%wsize); 193 fgcur = vfg(k%wsize); 148 194 149 195 if (!fgout) continue; // Pas de sortie out (deglitche) … … 158 204 // } 159 205 160 if (valcur < mean+nsig*sigma) { // inferieur au seuil 206 double curnsig = nsig; 207 if (fgglitch) curnsig /= 2.; 208 209 if (valcur < mean+curnsig*sigma) { // inferieur au seuil 161 210 if (fgglitch) { 162 211 if (k-kgl < maxpoints) { // On vient de detecter un glitch 163 212 glcount++; 213 double recval = vrec.Sum()/wrec; 164 214 for(ii=kgl; ii<k; ii++) { 165 putData(0, ii+snb, mean, vfg(ii%wsize)|5);215 putData(0, ii+snb, recval, vfg(ii%wsize)|5); 166 216 glnscount++; 167 217 } … … 178 228 lastput = snb+k; 179 229 kgl = -1; fgglitch = false; 230 vrec(k%wrec) = lastvalok = valcur; 180 231 } 181 232 else { // Superieur au seuil … … 186 237 lastput = snb+k; 187 238 fgglitch = false; 239 vrec(k%wrec) = lastvalok = valcur; 188 240 } 189 241 } … … 196 248 lastput = snb+k; 197 249 } 250 vrec(k%wrec) = lastvalok; 198 251 } 199 252 } … … 257 310 totnscount = 0; 258 311 coef = new double[wsz]; 312 for(int k=0; k<wsz; k++) coef[k] = 0.; 259 313 switch (fk) { 260 314 case UserFilter : 261 315 throw ParmError("SimpleFilter: Error in filter Kind (UserFilter)!"); 262 break;316 // break; 263 317 case MeanFilter : 264 318 for(int kk=0; kk<wsz; kk++) … … 271 325 case GaussFilter : 272 326 for(int kk=-(wsz/2); kk<=(wsz/2); kk++) 273 coef[kk ] = a*exp((double)(kk*kk)/(s*s));327 coef[kk+(wsz/2)] = a*exp(-(double)(kk*kk)/(s*s)); 274 328 break; 275 329 case DiffFilter : … … 280 334 default : 281 335 throw ParmError("SimpleFilter: Error in filter Kind (UnknownFilter)!"); 282 break;336 // break; 283 337 } 284 338 } … … 371 425 for(k=0;k<=sne-snb;k++) { 372 426 double sortie = 0; 373 for(int ii= 0; ii<wsize; ii++) {374 sortie += vin( ii)*coef[(ii+wsz2)%wsize];427 for(int ii=-wsz2; ii<=wsz2; ii++) { 428 sortie += vin((ii+k+wsize)%wsize)*coef[ii+wsz2]; 375 429 } 376 430 putData(0,k+snb,sortie,vfg(k%wsize)); … … 510 564 511 565 512 566 // --------------------------------------------------------------- 567 // -------------------- Classe SimpleFanOut ----------------------- 568 // --------------------------------------------------------------- 569 570 SimpleFanOut::SimpleFanOut(int nbinput, int mfanout) 571 { 572 if (nbinput < 1) 573 throw ParmError("SimpleFanOut::SimpleFanOut() NbInput < 1 !"); 574 if (mfanout < 1) 575 throw ParmError("SimpleFanOut::SimpleFanOut() M_FanOut < 1 !"); 576 577 nb_input = nbinput; 578 m_fanout = mfanout; 579 totnscount = 0; 580 } 581 582 SimpleFanOut::~SimpleFanOut() 583 { 584 } 585 586 587 void SimpleFanOut::PrintStatus(ostream & os) 588 { 589 os << "\n ------------------------------------------------------ \n" 590 << " SimpleFanOut::PrintStatus() - NbInput=" << NbInput() 591 << " M_FanOut=" << MFanOut() << endl; 592 TOIProcessor::PrintStatus(os); 593 os << endl; 594 os << " ProcessedSampleCount=" << ProcessedSampleCount() << endl; 595 os << " ------------------------------------------------------ " << endl; 596 } 597 598 void SimpleFanOut::init() { 599 cout << "SimpleFanOut::init NbInput=" << nb_input << endl; 600 char buff[64]; 601 for(int k=0; k<nb_input; k++) { 602 sprintf(buff,"in%d", k); 603 declareInput(buff); 604 for(int j=0; j<m_fanout; j++) { 605 sprintf(buff,"out%d_%d", k, j); 606 declareOutput(buff); 607 } 608 } 609 610 name = "SimpleFanOut"; 611 // upExtra = 1; 612 } 613 614 void SimpleFanOut::run() { 615 // TOIManager* mgr = TOIManager::getManager(); 616 int snb = getMinIn(); 617 int sne = getMaxIn(); 618 619 TVector<int_4> in_index(nb_input); 620 TMatrix<int_4> out_index(nb_input, m_fanout); 621 in_index = -1; 622 out_index = -1; 623 int nbconin = 0; 624 bool fggin = false; 625 char buff[64]; 626 for(int ki=0;ki<nb_input;ki++) { 627 sprintf(buff,"in%d", ki); 628 int idx = getInputTOIIndex(buff); 629 if (!checkInputTOIIndex(idx)) continue; 630 nbconin++; 631 in_index(ki) = idx; 632 bool fgout = false; 633 for(int jo=0; jo<m_fanout; jo++) { 634 sprintf(buff,"out%d_%d", ki, jo); 635 int odx = getOutputTOIIndex(buff); 636 if (checkOutputTOIIndex(odx)) { 637 out_index(ki, jo) = odx; 638 fgout = true; 639 } 640 } 641 if (!fgout) { 642 string msg_err = 643 "SimpleFanOut::run() - No connected Output for Input TOI (" 644 + getInName(ki) + ") !"; 645 cerr << msg_err << endl; 646 throw ParmError(msg_err); 647 } 648 } 649 if (nbconin == 0) { 650 cerr << " SimpleFanOut::run() - No Input TOI connected! " 651 << endl; 652 throw ParmError("SimpleFanOut::run() No Inout TOI connected!"); 653 } 654 655 /* 656 for(int ki=0;ki<nb_input;ki++) { 657 cout << " SimpleFanOut::run() In(" << ki << ") Index=" << in_index(ki) 658 << " Name=" << getInName(in_index(ki)) << endl; 659 for(int jo=0; jo<m_fanout; jo++) 660 cout << " .... Out(" << ki << "," << jo << ") Index=" << out_index(ki, jo) 661 << " Name=" << getOutName(out_index(ki, jo)) << endl; 662 } 663 */ 664 cout << " SimpleFanOut::run() SNRange=" << snb << " - " << sne << endl; 665 666 667 try { 668 Timer tm("SimpleFanOut::run()"); 669 double valin = 0.; 670 int_8 fgin = 0; 671 for(int k=snb;k<=sne;k++) { 672 for(int i=0;i<nb_input;i++) { 673 if (in_index(i) < 0) continue; 674 valin = 0; 675 fgin = 0; 676 getData(in_index(i), k, valin, fgin); 677 for(int j=0; j<m_fanout; j++) { 678 if (out_index(i, j) < 0) continue; 679 putData(out_index(i, j), k, valin, fgin); 680 } 681 } 682 totnscount++; 683 } // Boucle sur les num-sample 684 cout << " SimpleFanOut::run() - End of processing " 685 << " ProcessedSampleCount=" << ProcessedSampleCount() << endl; 686 } // Bloc try 687 688 catch (PException & exc) { 689 cerr << "SimpleFanOut: Catched Exception " << (string)typeid(exc).name() 690 << "\n .... Msg= " << exc.Msg() << endl; 691 } 692 } 693 694 695 -
trunk/ArchTOIPipe/ProcWSophya/simtoipr.h
r1454 r1467 115 115 116 116 117 // Classe SimpleFanOut 118 // Transforme recopie chaque entree sur M lignes de sortie 119 120 class SimpleFanOut : public TOIProcessor { 121 public: 122 SimpleFanOut(int nbinput, int mfanout); 123 ~SimpleFanOut(); 124 125 inline int NbInput() const { return nb_input; } 126 inline int MFanOut() const { return m_fanout; } 127 inline int_8 ProcessedSampleCount() const { return totnscount; } 128 129 virtual void PrintStatus(ostream & os) ; // const plus tard 130 131 virtual void init(); 132 virtual void run(); 133 134 protected: 135 int nb_input; 136 int m_fanout; 137 int_8 totnscount; // Nombre total d'echantillon processe 138 }; 139 117 140 #endif
Note:
See TracChangeset
for help on using the changeset viewer.