Ignore:
Timestamp:
Apr 12, 2001, 3:14:22 PM (24 years ago)
Author:
ansari
Message:

Debug de SimpleDeglitcher, ajout de SimpleFanOut , Reza 12/4/2001

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/ArchTOIPipe/ProcWSophya/simtoipr.cc

    r1464 r1467  
    8787  try {
    8888    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;
    8996    // Le debut
    90     Vector vin(wsize);
    91     TVector<int_8> vfg(wsize);
    9297    int k;
    93     for(k=0; k<wsize; k++)
     98    for(k=0; k<wsz2; k++)
    9499      getData(0, k+snb, vin(k), vfg(k));
    95100
    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
    110129    int kgl = -1;
    111130    int ii,lastput;
    112131    bool fgglitch = false;
    113132    double valcur,valsub,valadd;
     133    double lastvalok = mean;
    114134    uint_8 fgcur;
    115 
     135    bool fgokcur=false;
    116136    // Boucle sur les sampleNum
    117137
    118     for(k=0;k<=sne-snb;k++) {
     138    int knext;
     139    int kfin = sne-snb;
     140    for(k=0;k<=kfin;k++) {
    119141      totnscount++;
    120142//       if (k%10000 == 0) cout << " DBG: K=" << k << endl;
     143      knext = k+wsz2;
    121144      // 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) ) {
    127150          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
    133178
    134179      //  On gere les sorties Mean et Sigma
     
    140185        putData(3, k+snb, vin(k%wsize), vfg(k%wsize));
    141186
    142       valcur = vin(k%wsize);
    143187      if ( (valcur < range_min) || (valcur > range_max) ) {
    144188        vin(k%wsize) = valcur = mean;
     
    146190        out_range_nscount++;
    147191      }
     192      valcur = vin(k%wsize);
     193      fgcur = vfg(k%wsize);
    148194       
    149195      if (!fgout)   continue;  // Pas de sortie out (deglitche)
     
    158204//            }
    159205
    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
    161210        if (fgglitch) { 
    162211          if (k-kgl < maxpoints) {   // On vient de detecter un glitch
    163212            glcount++;
     213            double recval = vrec.Sum()/wrec;
    164214            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);
    166216              glnscount++;
    167217            }
     
    178228        lastput = snb+k;
    179229        kgl = -1;  fgglitch = false;
     230        vrec(k%wrec) = lastvalok = valcur;
    180231      }
    181232      else {  // Superieur au seuil
     
    186237            lastput = snb+k;
    187238            fgglitch = false; 
     239            vrec(k%wrec) = lastvalok = valcur;     
    188240          }
    189241        }
     
    196248            lastput = snb+k;
    197249          }
     250          vrec(k%wrec) = lastvalok;         
    198251        }
    199252      }
     
    257310  totnscount = 0;
    258311  coef = new double[wsz];
     312  for(int k=0; k<wsz; k++) coef[k] = 0.;
    259313  switch (fk) {
    260314    case UserFilter :
    261315      throw ParmError("SimpleFilter: Error in filter Kind (UserFilter)!");
    262       break;
     316      //      break;
    263317    case MeanFilter :
    264318      for(int kk=0; kk<wsz; kk++)
     
    271325    case GaussFilter :
    272326      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));
    274328      break;
    275329    case DiffFilter :
     
    280334    default :
    281335      throw ParmError("SimpleFilter: Error in filter Kind (UnknownFilter)!");
    282       break;
     336      //      break;
    283337  }
    284338}
     
    371425    for(k=0;k<=sne-snb;k++) {
    372426      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];
    375429      }
    376430      putData(0,k+snb,sortie,vfg(k%wsize));
     
    510564
    511565
    512 
     566// ---------------------------------------------------------------
     567// -------------------- Classe SimpleFanOut -----------------------
     568// ---------------------------------------------------------------
     569
     570SimpleFanOut::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
     582SimpleFanOut::~SimpleFanOut()
     583{
     584}
     585
     586
     587void 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
     598void 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
     614void 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
Note: See TracChangeset for help on using the changeset viewer.