source: BAORadio/AmasNancay/trunk/mergeAnaFiles.cc @ 611

Last change on this file since 611 was 611, checked in by torrento, 13 years ago

Add pic analysis files and emptydir function for proc_specmfib

File size: 54.2 KB
Line 
1// Utilisation de SOPHYA pour faciliter les tests ...
2#include "sopnamsp.h"
3#include "machdefs.h"
4#include <dirent.h>
5#include <matharr.h>
6
7// include standard c/c++
8#include <regex.h>
9#include <stdio.h>
10#include <stdlib.h>
11#include <limits>
12#include <iostream>
13#include <fstream>
14#include <string>
15#include <vector>
16#include <map>
17#include <functional>
18#include <algorithm>
19#include <numeric>
20#include <list>
21#include <exception>
22
23// include sophya mesure ressource CPU/memoire ...
24#include "resusage.h"
25#include "ctimer.h"
26#include "timing.h"
27#include "timestamp.h"
28#include "strutilxx.h"
29#include "ntuple.h"
30#include "fioarr.h"
31#include "tarrinit.h"
32#include "histinit.h"
33#include "fitsioserver.h"
34#include "fiosinit.h"
35#include "ppersist.h"
36
37//-----------------------------------------------
38//Usage
39//
40//./Objs/mergeAnaFiles -act meanRawDiffOnOff -inPath /sps/baoradio/AmasNancay/JEC/ -src NGC4383 -ppfFile dataRaw -debug 1000 -mxcycles 10
41//./Objs/mergeAnaFiles -src Abell85 -act meanCalibBAODiffOnOff -mxcycles 500 -calibfreq 1410 -inPath /sps/baoradio/AmasNancay/JEC/ -ppfFile dataRaw -debug 1 >& mergeAna-500.log
42//
43//
44//-----------------------------------------------
45const sa_size_t NUMBER_OF_CHANNELS = 2;
46const sa_size_t NUMBER_OF_FREQ     = 8192;
47const r_4    LOWER_FREQUENCY       = 1250.0; //MHz
48const r_4    TOTAL_BANDWIDTH       = 250.0;  //MHz
49//Input parameters
50struct Param {
51  int debuglev_;      //debug
52  string inPath_;     //root directory of the input files
53  string outPath_;    //output files are located here
54  string sourceName_; //source name & subdirectory of the input files
55  string ppfFile_;    //generic name of the input files
56  int nSliceInFreq_;  //used by reduceSpectra() fnc
57  string calibFreq_;  //freq. value used for calibration
58  r_4 rcalibFreq_;    //float version
59  string calibBandFreq_;  //band of freq. used for calibration
60  r_4 rcalibBandFreq_;    //float version
61  int maxNumberCycles_;//maximum number of cycles to be treated
62} para;
63//--------------------------------------------------------------
64//Utility functions
65// template <class T>
66// void MeanSigma(TArray<T> const & a, T & mean, T & sig){
67//   if (a.NbDimensions() < 1)
68//     throw RangeCheckError("MathArray<T>::MeanSigma(TArray<T> const & a..) Not Allocated Array a !");
69//   const T * pe;
70//   sa_size_t j,k;
71//   mean=0.;
72//   sig = 0.;
73//   T valok;
74//   if (a.AvgStep() > 0)   {  // regularly spaced elements
75//     sa_size_t step = a.AvgStep();
76//     sa_size_t maxx = a.Size()*step;
77//     pe = a.Data();
78//     for(k=0; k<maxx; k+=step )  {
79//       valok = pe[k];
80//       mean += valok;  sig += valok*valok;
81//     }
82//   }
83//   else {    // Non regular data spacing ...
84//     int_4 ka = a.MaxSizeKA();
85//     sa_size_t step = a.Step(ka);
86//     sa_size_t gpas = a.Size(ka)*step;
87//     sa_size_t naxa = a.Size()/a.Size(ka);
88//     for(j=0; j<naxa; j++)  {
89//       pe = a.DataBlock().Begin()+a.Offset(ka,j);
90//       for(k=0; k<gpas; k+=step) {
91//      valok = pe[k];
92//      mean += valok;  sig += valok*valok;
93//       }
94//     }
95//   }
96//   T dsz = (T)(a.Size());
97//   mean /= dsz;
98//   if (dsz > 1.5) {
99//     sig = sig/dsz - mean*mean;
100//     sig *= (dsz/(dsz-1));
101//     if (sig >= 0.) sig = sqrt(sig);
102//   }
103//   else sig = 0.;
104// }
105
106
107sa_size_t freqToChan(r_4 f){
108  return (sa_size_t)((f-LOWER_FREQUENCY)/TOTAL_BANDWIDTH*NUMBER_OF_FREQ);
109}
110//--------
111//COMPUTE the mean value on a freq. range for all channels
112//--------
113void meanInRange(const TMatrix<r_4> mtx, 
114                 sa_size_t chLow,
115                 sa_size_t chHigh, 
116                 TVector<r_4>& vec){
117 
118  sa_size_t nr = mtx.NRows();
119 
120  for (sa_size_t ir=0; ir<nr; ir++){
121    TVector<r_4> tmp(mtx(Range(ir),Range(chLow,chHigh)),false);
122    r_8 mean, sigma;
123    MeanSigma(tmp,mean,sigma);
124    vec(ir) = mean;
125  }
126}
127//---------
128class median_of_empty_list_exception:public std::exception{
129    virtual const char* what() const throw() {
130    return "Attempt to take the median of an empty list of numbers.  "
131      "The median of an empty list is undefined.";
132  }
133};
134template<class RandAccessIter>
135double median(RandAccessIter begin, RandAccessIter end) 
136  throw(median_of_empty_list_exception){
137  if(begin == end){ throw median_of_empty_list_exception(); }
138  std::size_t size = end - begin;
139  std::size_t middleIdx = size/2;
140  RandAccessIter target = begin + middleIdx;
141  std::nth_element(begin, target, end);
142   
143  if(size % 2 != 0){ //Odd number of elements
144    return *target;
145  }else{            //Even number of elements
146    double a = *target;
147    RandAccessIter targetNeighbor= target-1;
148    std::nth_element(begin, targetNeighbor, end);
149    return (a+*targetNeighbor)/2.0;
150  }
151}
152
153//-------------
154//JEC 25/10/11 Perform a median filtering with a sliding window of "halfwidth" half width
155//             It takes care of the edges and is based on the median function (above)
156void medianFiltering(const TMatrix<r_4> mtx, 
157                     sa_size_t halfwidth,
158                     TMatrix<r_4>& vec) {
159 
160  sa_size_t nr = mtx.NRows();
161  sa_size_t nc = mtx.NCols();
162  sa_size_t chMin = 0;
163  sa_size_t chMax = nc-1;
164 
165  for (sa_size_t ir=0; ir<nr; ir++){
166    for (sa_size_t ic=0; ic<nc; ic++) {
167      sa_size_t chLow = ic-halfwidth;
168      chLow = (chLow >= chMin) ? chLow : chMin;
169      sa_size_t chHigh = ic+halfwidth;
170      chHigh = ( chHigh <= chMax ) ? chHigh : chMax;
171      TVector<r_4> tmp(mtx(Range(ir),Range(chLow,chHigh)),false);
172      vector<r_4> val;
173      tmp.FillTo(val);
174      vec(ir,ic) = median(val.begin(),val.end());
175    }
176  }
177}
178//-------------
179void split(const string& str, const string& delimiters , vector<string>& tokens) {
180    // Skip delimiters at beginning.
181    string::size_type lastPos = str.find_first_not_of(delimiters, 0);
182    // Find first "non-delimiter".
183    string::size_type pos     = str.find_first_of(delimiters, lastPos);
184
185    while (string::npos != pos || string::npos != lastPos)
186    {
187        // Found a token, add it to the vector.
188        tokens.push_back(str.substr(lastPos, pos - lastPos));
189        // Skip delimiters.  Note the "not_of"
190        lastPos = str.find_first_not_of(delimiters, pos);
191        // Find next "non-delimiter"
192        pos = str.find_first_of(delimiters, lastPos);
193    }
194}
195//--------------------------------------------------------------
196char *regexp (const char *string, const char *patrn, int *begin, int *end) {   
197        int i, w=0, len;                 
198        char *word = NULL;
199        regex_t rgT;
200        regmatch_t match;
201        regcomp(&rgT,patrn,REG_EXTENDED);
202        if ((regexec(&rgT,string,1,&match,0)) == 0) {
203                *begin = (int)match.rm_so;
204                *end = (int)match.rm_eo;
205                len = *end-*begin;
206                word=(char*)malloc(len+1);
207                for (i=*begin; i<*end; i++) {
208                        word[w] = string[i];
209                        w++; }
210                word[w]=0;
211        }
212        regfree(&rgT);
213        return word;
214}
215//-------
216sa_size_t round_sa(r_4 r) {
217  return static_cast<sa_size_t>((r > 0.0) ? (r + 0.5) : (r - 0.5));
218}
219//-----
220string StringToLower(string strToConvert){
221  //change each element of the string to lower case
222  for(unsigned int i=0;i<strToConvert.length();i++) {
223    strToConvert[i] = tolower(strToConvert[i]);
224  }
225  return strToConvert;//return the converted string
226}
227//-----
228bool stringCompare( const string &left, const string &right ){
229   if( left.size() < right.size() )
230      return true;
231   for( string::const_iterator lit = left.begin(), rit = right.begin(); lit != left.end() && rit != right.end(); ++lit, ++rit )
232      if( tolower( *lit ) < tolower( *rit ) )
233         return true;
234      else if( tolower( *lit ) > tolower( *rit ) )
235         return false;
236   return false;
237}
238//-----
239list<string> ListOfFileInDir(string dir, string filePettern) throw(string) {
240  list<string> theList;
241
242
243  DIR *dip;
244  struct dirent *dit;
245  string msg;  string fileName;
246  string fullFileName;
247  size_t found;
248
249  if ((dip=opendir(dir.c_str())) == NULL ) {
250    msg = "opendir failed on directory "+dir;
251    throw msg;
252  }
253  while ( (dit = readdir(dip)) != NULL ) {
254    fileName = dit->d_name;
255    found=fileName.find(filePettern);
256    if (found != string::npos) {
257      fullFileName = dir + "/";
258      fullFileName += fileName;
259      theList.push_back(fullFileName);
260    }
261  }//eo while
262  if (closedir(dip) == -1) {
263    msg = "closedir failed on directory "+dir;
264    throw msg;
265  }
266 
267  theList.sort(stringCompare);
268
269  return theList;
270
271}
272//
273class  StringMatch : public unary_function<string,bool> {
274public:
275  StringMatch(const string& pattern): pattern_(pattern){}
276  bool operator()(const string& aStr) const {
277
278
279    int b,e;
280    regexp(aStr.c_str(),pattern_.c_str(),&b,&e);
281
282//     cout << "investigate " << aStr << " to find " << pattern_
283//       << "[" <<b<<","<<e<<"]"
284//       << endl;
285
286   
287    if (b != 0) return false;
288    if (e != (int)aStr.size()) return false;
289    return true;
290
291  }
292private:
293  string pattern_;
294};
295//-------------------------------------------------------
296//Rebin in frequence + compute mean and sigma
297void reduceSpectra(const TMatrix<r_4>& specMtxInPut, 
298                    TMatrix<r_4>& meanMtx, 
299                    TMatrix<r_4>& sigmaMtx) {
300  sa_size_t nSliceFreq = para.nSliceInFreq_;
301  sa_size_t deltaFreq =  NUMBER_OF_FREQ/nSliceFreq;
302  for (sa_size_t iSlice=0; iSlice<nSliceFreq; iSlice++){
303    sa_size_t freqLow= iSlice*deltaFreq;
304    sa_size_t freqHigh= freqLow + deltaFreq -1;
305    for (sa_size_t iCh=0; iCh<NUMBER_OF_CHANNELS; ++iCh){
306      TVector<r_4> reducedRow;
307      reducedRow = specMtxInPut.SubMatrix(Range(iCh),Range(freqLow,freqHigh)).CompactAllDimensions();
308      double mean; 
309      double sigma;
310      MeanSigma(reducedRow,mean,sigma);
311      meanMtx(iCh,iSlice) = mean;
312      sigmaMtx(iCh,iSlice) = sigma;
313    }//eo loop on channels
314  }//eo loop on slices
315}
316//-------------------------------------------------------
317//Compute the mean of Diff ON-OFF BAO-calibrated spectra and also the mean/sigma of rebinned spectra
318//
319void meanCalibBAODiffOnOffCycles() throw(string) {
320
321  list<string> listOfFiles;
322  string directoryName;
323  directoryName = para.inPath_ + "/" + para.sourceName_;
324
325  //Make the listing of the directory
326  listOfFiles = ListOfFileInDir(directoryName,para.ppfFile_);
327 
328  list<string>::const_iterator iFile, iFileEnd, iSpec, iSpecEnd;
329  iFileEnd = listOfFiles.end();
330
331  //mean ON-OFF over the list of cycles
332  TMatrix<r_4> meanDiffONOFFovOFF_noCalib(NUMBER_OF_CHANNELS,NUMBER_OF_FREQ);     //set to 0
333  TMatrix<r_4> meanDiffONOFF_noCalib(NUMBER_OF_CHANNELS,NUMBER_OF_FREQ);          //set to 0
334  TMatrix<r_4> meanDiffONOFF_perRunCalib(NUMBER_OF_CHANNELS,NUMBER_OF_FREQ);      //set to 0
335  TMatrix<r_4> meanDiffONOFF_perCycleCalib(NUMBER_OF_CHANNELS,NUMBER_OF_FREQ);    //set to 0
336  static const int NINFO=25;
337  char* onffTupleName[NINFO]={"cycle"
338                              ,"onoffRaw0","onoffRaw1"
339                              ,"onoffRun0","onoffRun1"
340                              ,"onoffCycle0","onoffCycle1"
341                              ,"onoffRaw01420","onoffRaw11420"
342                              ,"onoffRun01420","onoffRun11420"
343                              ,"onoffCycle01420","onoffCycle11420"
344                              ,"onoffRaw01420side","onoffRaw11420side"
345                              ,"onoffRun01420side","onoffRun11420side"
346                              ,"onoffCycle01420side","onoffCycle11420side"
347                              ,"onoffRaw0f14101415","onoffRaw1f14101415"
348                              ,"offRaw0f14101415","offRaw1f14101415"
349                              ,"onRaw0f14101415","onRaw1f14101415"
350  };
351  NTuple onoffevolution(NINFO,onffTupleName);
352  r_4 xnt[NINFO];
353
354  //Lower and Higher freq. arround the Calibration Freq. bin to perform mean follow up
355  sa_size_t chCalibLow  = freqToChan(para.rcalibFreq_ - (para.rcalibBandFreq_*0.5));
356  sa_size_t chCalibHigh = freqToChan(para.rcalibFreq_ + (para.rcalibBandFreq_*0.5));
357  //Lower and Higher freq.  just arround 1420.4MHz Freq. bin to perform mean follow up
358  sa_size_t ch1420Low  = freqToChan(1420.4-0.2);
359  sa_size_t ch1420High = freqToChan(1420.4+0.2);
360
361  //Lower and Higher freq. on the sides of 1420.4Mhz Freq. bin to perform mean follow up
362  sa_size_t ch1420aLow  = freqToChan(1418);
363  sa_size_t ch1420aHigh = freqToChan(1419);
364  sa_size_t ch1420bLow  = freqToChan(1422);
365  sa_size_t ch1420bHigh = freqToChan(1423);
366 
367  //1400-1420Mhz
368  sa_size_t ch1400 = freqToChan(1400);
369  //  sa_size_t ch1405 = freqToChan(1400);
370  sa_size_t ch1410 = freqToChan(1410);
371  sa_size_t ch1415 = freqToChan(1415);
372  sa_size_t ch1420 = freqToChan(1420);
373
374  if (para.debuglev_>0){
375    cout << "freq. band for follow up [" <<  chCalibLow << ", "<< chCalibHigh << "]" << endl;
376    cout << "freq. band for follow up [" <<  ch1420Low << ", "<< ch1420High << "]" << endl;
377    cout << "freq. band for follow up [" <<  ch1420aLow << ", "<< ch1420aHigh << "]" << endl;
378    cout << "freq. band for follow up [" <<  ch1420bLow << ", "<< ch1420bHigh << "]" << endl;
379  }
380 
381  //Loop on files/run
382
383  int totalNumberCycles=0; //total number of cycles for normalisation
384  for (iFile = listOfFiles.begin(); iFile != iFileEnd; ++iFile) {
385    if (para.debuglev_>90){
386      cout << "load file <" << *iFile << ">" << endl;
387    }
388
389    vector<string> tokens;
390    split(*iFile,"_",tokens);
391    string dateOfRun = tokens[1];
392    if (para.debuglev_>90){
393      cout << "date <" << dateOfRun << ">" << endl;
394    }
395    vector<string> tokens2;
396    split(tokens[2],".",tokens2);
397    string srcLower = tokens2[0];
398
399    PInPersist fin(*iFile);
400    vector<string> vec = fin.GetNameTags();
401
402    vector<string> modeList;
403    modeList.push_back("On");
404    modeList.push_back("Off");
405    vector<string>::const_iterator iMode;
406   
407    map<string, list<int> > cycleModeCollect;
408   
409    for (iMode = modeList.begin(); iMode!=modeList.end(); ++iMode) {
410      list<string> listOfSpectra;
411      //Keep only required PPF objects
412      string matchstr = "specRaw"+(*iMode)+"[0-9]+"; 
413      std::remove_copy_if(
414                          vec.begin(), vec.end(), back_inserter(listOfSpectra),
415                          not1(StringMatch(matchstr))
416                          );
417     
418      listOfSpectra.sort(stringCompare);
419      iSpecEnd = listOfSpectra.end();
420     
421      matchstr = "[0-9]+";
422      //Loop of spectra matrix
423      list<int> listOfCycles;
424      for (iSpec = listOfSpectra.begin(); iSpec!=iSpecEnd;  ++iSpec){
425        int b,e;
426        regexp(iSpec->c_str(),matchstr.c_str(),&b,&e);
427        if (para.debuglev_>90){
428          cout << " spactra <" << *iSpec << ">" << endl;
429          cout << " cycle " << iSpec->substr(b) << endl;
430        }
431        listOfCycles.push_back(atoi((iSpec->substr(b)).c_str()));
432      }//end loop spectra
433      cycleModeCollect[*iMode] = listOfCycles;
434    }//end of mode   
435
436    //Take the Intersection of the list Of cycles in mode Off and On   
437    list<int> commonCycles;
438    set_intersection(cycleModeCollect["On"].begin(),
439                     cycleModeCollect["On"].end(),
440                     cycleModeCollect["Off"].begin(),
441                     cycleModeCollect["Off"].end(),
442                     back_inserter(commonCycles)
443                     );
444   
445    if (para.debuglev_>90){
446      cout << "Liste of cycles common to On & Off: <";
447      for (list<int>::iterator i=commonCycles.begin(); i!=commonCycles.end(); ++i){
448        cout << *i << " ";
449      }
450      cout << ">" << endl;
451    }
452   
453    //
454    //Load BAO Calibration factors "per Cycle and Channels"
455    //Compute the mean per Cycle to
456    //  fill factors "per Run and Channels" with the same cycle list
457    //
458    //
459    //TODO improve the code....
460
461    TMatrix<r_4> calibBAOfactors_Off_Cycle_Ch0;
462    TMatrix<r_4> calibBAOfactors_Off_Cycle_Ch1;
463    TMatrix<r_4> calibBAOfactors_On_Cycle_Ch0;
464    TMatrix<r_4> calibBAOfactors_On_Cycle_Ch1;
465   
466    string calibFileName;
467    ifstream ifs;
468    sa_size_t nr,nc; //values read
469
470    //OFF Cycle per Channel
471    calibFileName = directoryName + "/" 
472      + "calib_" + dateOfRun + "_" + srcLower + "_Off_" 
473      + para.calibFreq_ +"MHz-Ch0Cycles.txt";
474    if(para.debuglev_>0) cout << "Read Calib file " << calibFileName << endl;
475    ifs.open(calibFileName.c_str());
476    if ( ! ifs.is_open() ) {
477
478      throw calibFileName + " cannot be opened...";
479    }   
480    calibBAOfactors_Off_Cycle_Ch0.ReadASCII(ifs,nr,nc);
481    if(para.debuglev_>9){
482      cout << "(nr,nc): "<< nr << "," << nc << endl;
483      calibBAOfactors_Off_Cycle_Ch0.Print(cout);
484      cout << endl;
485    }
486
487    TMatrix<r_4> calibBAOfactors_Off_Run_Ch0(nr,nc);
488    calibBAOfactors_Off_Run_Ch0.Column(0) = calibBAOfactors_Off_Cycle_Ch0.Column(0);
489    {//Compute the mean
490      TVector<r_4> coef(calibBAOfactors_Off_Cycle_Ch0(Range::all(),Range::last()),false);
491      double mean,sigma;
492      MeanSigma(coef,mean,sigma);
493      calibBAOfactors_Off_Run_Ch0.Column(1).SetCst(mean);
494    }
495    if(para.debuglev_>9){
496      cout << "Fill calib. with mean value " << endl; 
497      calibBAOfactors_Off_Run_Ch0.Print(cout);
498      cout << endl;
499    }
500    ifs.close();
501
502    //
503    calibFileName = directoryName + "/" 
504      + "calib_" + dateOfRun + "_" + srcLower + "_Off_" 
505      + para.calibFreq_ +"MHz-Ch1Cycles.txt";
506    if(para.debuglev_>0) cout << "Read Calib file " << calibFileName << endl;
507    ifs.open(calibFileName.c_str());
508    if ( ! ifs.is_open() ) {
509
510      throw calibFileName + " cannot be opened...";
511    }   
512    calibBAOfactors_Off_Cycle_Ch1.ReadASCII(ifs,nr,nc);
513    if(para.debuglev_>9){
514      cout << "(nr,nc): "<< nr << "," << nc << endl;
515      calibBAOfactors_Off_Cycle_Ch1.Print(cout);
516      cout << endl;
517    }
518    TMatrix<r_4> calibBAOfactors_Off_Run_Ch1(nr,nc);
519    calibBAOfactors_Off_Run_Ch1.Column(0) = calibBAOfactors_Off_Cycle_Ch1.Column(0);
520    {//Compute the mean
521      TVector<r_4> coef(calibBAOfactors_Off_Cycle_Ch1(Range::all(),Range::last()),false);
522      double mean,sigma;
523      MeanSigma(coef,mean,sigma);
524      //      cout << "Mean: " << mean << " sigma " << sigma << endl;
525      calibBAOfactors_Off_Run_Ch1.Column(1).SetCst(mean);
526    }
527    if(para.debuglev_>9){
528      cout << "Fill calib. with mean value " << endl; 
529      calibBAOfactors_Off_Run_Ch1.Print(cout);
530      cout << endl;
531    }
532    ifs.close();
533
534    //ON Cycle per Channel
535    calibFileName = directoryName + "/" 
536      + "calib_" + dateOfRun + "_" + srcLower + "_On_" 
537      + para.calibFreq_ +"MHz-Ch0Cycles.txt";
538    if(para.debuglev_>0) cout << "Read Calib file " << calibFileName << endl;
539    ifs.open(calibFileName.c_str());
540    if ( ! ifs.is_open() ) {
541
542      throw calibFileName + " cannot be opened...";
543    }   
544    calibBAOfactors_On_Cycle_Ch0.ReadASCII(ifs,nr,nc);
545    if(para.debuglev_>9){
546      cout << "(nr,nc): "<< nr << "," << nc << endl;
547      calibBAOfactors_On_Cycle_Ch0.Print(cout);
548      cout << endl;     
549    }
550
551    TMatrix<r_4> calibBAOfactors_On_Run_Ch0(nr,nc);
552    calibBAOfactors_On_Run_Ch0.Column(0) = calibBAOfactors_On_Cycle_Ch0.Column(0);
553    {//Compute the mean
554      TVector<r_4> coef(calibBAOfactors_On_Cycle_Ch0(Range::all(),Range::last()),false);
555      double mean,sigma;
556      MeanSigma(coef,mean,sigma);
557      //      cout << "Mean: " << mean << " sigma " << sigma << endl;
558      calibBAOfactors_On_Run_Ch0.Column(1).SetCst(mean);
559    }
560    if(para.debuglev_>9){
561      cout << "Fill calib. with mean value " << endl; 
562      calibBAOfactors_On_Run_Ch0.Print(cout);
563      cout << endl;
564    }
565    ifs.close();
566
567   
568    calibFileName = directoryName + "/" 
569      + "calib_" + dateOfRun + "_" + srcLower + "_On_" 
570      + para.calibFreq_ +"MHz-Ch1Cycles.txt";
571    if(para.debuglev_>0) cout << "Read Calib file " << calibFileName << endl;
572    ifs.open(calibFileName.c_str());
573    if ( ! ifs.is_open() ) {
574      throw calibFileName + " cannot be opened...";
575    }   
576    calibBAOfactors_On_Cycle_Ch1.ReadASCII(ifs,nr,nc);
577    if(para.debuglev_>9){
578      cout << "(nr,nc): "<< nr << "," << nc << endl;
579      calibBAOfactors_On_Cycle_Ch1.Print(cout);
580      cout << endl;
581    }
582    TMatrix<r_4> calibBAOfactors_On_Run_Ch1(nr,nc);
583    calibBAOfactors_On_Run_Ch1.Column(0) = calibBAOfactors_On_Cycle_Ch1.Column(0);
584    {//Compute the mean
585      TVector<r_4> coef(calibBAOfactors_On_Cycle_Ch1(Range::all(),Range::last()),false);
586      double mean,sigma;
587      MeanSigma(coef,mean,sigma);
588      //      cout << "Mean: " << mean << " sigma " << sigma << endl;
589      calibBAOfactors_On_Run_Ch1.Column(1).SetCst(mean);
590    }
591    if(para.debuglev_>9){
592      cout << "Fill calib. with mean value " << endl; 
593      calibBAOfactors_On_Run_Ch1.Print(cout);
594      cout << endl;
595    }
596
597    ifs.close();
598   
599    //link <cycle> - <calibration coefficient>
600    //We cannot rely on identical cycle list of the OFF and ON calibration
601    map<int,r_4> calibBAO_Off_Run_Ch0;
602    map<int,r_4> calibBAO_Off_Run_Ch1;
603    map<int,r_4> calibBAO_On_Run_Ch0;
604    map<int,r_4> calibBAO_On_Run_Ch1;
605
606    map<int,r_4> calibBAO_Off_Cycle_Ch0;
607    map<int,r_4> calibBAO_Off_Cycle_Ch1;
608    map<int,r_4> calibBAO_On_Cycle_Ch0;
609    map<int,r_4> calibBAO_On_Cycle_Ch1;
610
611    //per Run based BAO coefficients
612    nr = calibBAOfactors_Off_Run_Ch0.NRows();
613    for (sa_size_t ir=0; ir<nr; ++ir){
614      cout << "Calib. Off Run Ch0 cycle ["<< calibBAOfactors_Off_Run_Ch0(ir,0)<<"], val "
615           << calibBAOfactors_Off_Run_Ch0(ir,1) << endl;
616
617      calibBAO_Off_Run_Ch0[(int)calibBAOfactors_Off_Run_Ch0(ir,0)]
618        = calibBAOfactors_Off_Run_Ch0(ir,1);
619      calibBAO_Off_Cycle_Ch0[(int)calibBAOfactors_Off_Cycle_Ch0(ir,0)]
620        = calibBAOfactors_Off_Cycle_Ch0(ir,1);
621      calibBAO_Off_Run_Ch1[(int)calibBAOfactors_Off_Run_Ch1(ir,0)]
622        = calibBAOfactors_Off_Run_Ch1(ir,1);
623      calibBAO_Off_Cycle_Ch1[(int)calibBAOfactors_Off_Cycle_Ch1(ir,0)]
624        = calibBAOfactors_Off_Cycle_Ch1(ir,1);
625    }//eo loop on coef Off
626   
627    nr = calibBAOfactors_On_Run_Ch0.NRows();
628    for (sa_size_t ir=0; ir<nr; ++ir){
629      calibBAO_On_Run_Ch0[(int)calibBAOfactors_On_Run_Ch0(ir,0)]
630        = calibBAOfactors_On_Run_Ch0(ir,1);
631      calibBAO_On_Cycle_Ch0[(int)calibBAOfactors_On_Cycle_Ch0(ir,0)]
632        = calibBAOfactors_On_Cycle_Ch0(ir,1);
633      calibBAO_On_Run_Ch1[(int)calibBAOfactors_On_Run_Ch1(ir,0)]
634        = calibBAOfactors_On_Run_Ch1(ir,1);
635      calibBAO_On_Cycle_Ch1[(int)calibBAOfactors_On_Cycle_Ch1(ir,0)]
636        = calibBAOfactors_On_Cycle_Ch1(ir,1);
637    }//eo loop on coef On
638     
639    //Loop on cyles
640    for (list<int>::iterator ic=commonCycles.begin(); ic!=commonCycles.end(); ++ic){
641
642      //Look if the cycle has been calibrated...
643      bool isCycleCalibrated = 
644        ( calibBAO_On_Run_Ch0.count(*ic)    *
645          calibBAO_On_Run_Ch1.count(*ic)    *
646          calibBAO_Off_Run_Ch0.count(*ic)   *
647          calibBAO_Off_Run_Ch1.count(*ic)   *
648          calibBAO_On_Cycle_Ch0.count(*ic)  *
649          calibBAO_On_Cycle_Ch1.count(*ic)  *
650          calibBAO_Off_Cycle_Ch0.count(*ic) *
651          calibBAO_Off_Cycle_Ch1.count(*ic) ) != 0 ? true : false;
652
653      if(para.debuglev_>9) {
654        cout << "Calibration coefficients for cycle "<<*ic << endl; 
655        if (isCycleCalibrated) {
656          cout << "Cycle calibrated " << endl;
657          cout << "Off Run Ch0 " << calibBAO_Off_Run_Ch0[*ic] << " "
658               << "Ch1 " << calibBAO_Off_Run_Ch1[*ic] << "\n"
659               << "On Run Ch0 " << calibBAO_On_Run_Ch0[*ic] << " "
660               << "Ch1 " << calibBAO_On_Run_Ch1[*ic] << "\n"
661               << "Off Cycle Ch0 " << calibBAO_Off_Cycle_Ch0[*ic] << " "
662               << "Ch1 " << calibBAO_Off_Cycle_Ch1[*ic] << "\n"
663               << "On Cycle Ch0 " << calibBAO_On_Cycle_Ch0[*ic] << " "
664               << "Ch1 " << calibBAO_On_Cycle_Ch1[*ic] << endl;
665        } else {
666          cout << "Cycle << " << *ic <<" NOT calibrated for file " << *iFile << endl;
667        }
668      }//debug
669
670
671      if ( ! isCycleCalibrated ) continue;
672     
673      string ppftag;
674      //load ON phase
675      stringstream cycle;
676      cycle << *ic;
677     
678      ppftag = "specRawOn"+cycle.str();
679      TMatrix<r_4> aSpecOn(NUMBER_OF_CHANNELS,NUMBER_OF_FREQ);
680      fin.GetObject(aSpecOn,ppftag);
681
682      TMatrix<r_4> aSpecOn_BAOCalibRun(aSpecOn,false);
683      aSpecOn_BAOCalibRun(Range(0),Range::all()) /= calibBAO_On_Run_Ch0[*ic];
684      aSpecOn_BAOCalibRun(Range(1),Range::all()) /= calibBAO_On_Run_Ch1[*ic];
685
686      TMatrix<r_4> aSpecOn_BAOCalibCycle(aSpecOn,false);
687      aSpecOn_BAOCalibCycle(Range(0),Range::all()) /= calibBAO_On_Cycle_Ch0[*ic];
688      aSpecOn_BAOCalibCycle(Range(1),Range::all()) /= calibBAO_On_Cycle_Ch1[*ic];
689     
690      //Load OFF phase
691      ppftag = "specRawOff"+cycle.str();
692      TMatrix<r_4> aSpecOff(NUMBER_OF_CHANNELS,NUMBER_OF_FREQ);
693      fin.GetObject(aSpecOff,ppftag);
694
695      TMatrix<r_4> aSpecOff_BAOCalibRun(aSpecOff,false);
696      aSpecOff_BAOCalibRun(Range(0),Range::all()) /= calibBAO_Off_Run_Ch0[*ic];
697      aSpecOff_BAOCalibRun(Range(1),Range::all()) /= calibBAO_Off_Run_Ch1[*ic];
698
699      TMatrix<r_4> aSpecOff_BAOCalibCycle(aSpecOff,false);
700      aSpecOff_BAOCalibCycle(Range(0),Range::all()) /= calibBAO_Off_Cycle_Ch0[*ic];
701      aSpecOff_BAOCalibCycle(Range(1),Range::all()) /= calibBAO_Off_Cycle_Ch1[*ic];
702
703
704      //Perform the difference ON-OFF with the different calibration options
705      TMatrix<r_4> diffOnOff_noCalib = aSpecOn - aSpecOff;
706      meanDiffONOFF_noCalib += diffOnOff_noCalib;
707     
708      //JEC 29/10/11 add ON-OFF/OFF
709      TMatrix<r_4> diffOnOffOvOff_noCalib(diffOnOff_noCalib,false); //do not share data
710      TMatrix<r_4> aSpecOffFiltered(NUMBER_OF_CHANNELS,NUMBER_OF_FREQ);
711      sa_size_t halfWidth = 35; //number of freq. bin for the 1/2 width of the filtering window
712      medianFiltering(aSpecOff,halfWidth,aSpecOffFiltered);
713     
714      diffOnOffOvOff_noCalib.Div(aSpecOffFiltered); //division in place
715      meanDiffONOFFovOFF_noCalib += diffOnOffOvOff_noCalib;
716
717      TMatrix<r_4> diffOnOff_perRunCalib = aSpecOn_BAOCalibRun - aSpecOff_BAOCalibRun;
718      meanDiffONOFF_perRunCalib += diffOnOff_perRunCalib;
719
720      TMatrix<r_4> diffOnOff_perCycleCalib = aSpecOn_BAOCalibCycle - aSpecOff_BAOCalibCycle;
721      meanDiffONOFF_perCycleCalib += diffOnOff_perCycleCalib;
722
723      totalNumberCycles++;
724
725      //Fill NTuple
726      xnt[0] = totalNumberCycles;
727 
728      //Follow up arround the Calibration Freq.
729      TVector<r_4> meanInRange_CalibFreq_noCalib(NUMBER_OF_CHANNELS);
730      meanInRange(diffOnOff_noCalib,chCalibLow,chCalibHigh,meanInRange_CalibFreq_noCalib);
731      xnt[1] = meanInRange_CalibFreq_noCalib(0);
732      xnt[2] = meanInRange_CalibFreq_noCalib(1);
733
734      TVector<r_4> meanInRange_CalibFreq_perRunCalib(NUMBER_OF_CHANNELS);
735      meanInRange(diffOnOff_perRunCalib,chCalibLow,chCalibHigh,meanInRange_CalibFreq_perRunCalib);
736      xnt[3] = meanInRange_CalibFreq_perRunCalib(0);
737      xnt[4] = meanInRange_CalibFreq_perRunCalib(1);
738
739      TVector<r_4> meanInRange_CalibFreq_perCycleCalib(NUMBER_OF_CHANNELS);
740      meanInRange(diffOnOff_perCycleCalib,chCalibLow,chCalibHigh,meanInRange_CalibFreq_perCycleCalib);
741      xnt[5] = meanInRange_CalibFreq_perCycleCalib(0);
742      xnt[6] = meanInRange_CalibFreq_perCycleCalib(1);
743
744
745      //Follow up arround the 1420.4MHz Freq.
746      TVector<r_4> meanInRange_1420Freq_noCalib(NUMBER_OF_CHANNELS);
747      meanInRange(diffOnOff_noCalib,ch1420Low,ch1420High,meanInRange_1420Freq_noCalib);
748      xnt[7] = meanInRange_1420Freq_noCalib(0);
749      xnt[8] = meanInRange_1420Freq_noCalib(1);
750
751      TVector<r_4> meanInRange_1420Freq_perRunCalib(NUMBER_OF_CHANNELS);
752      meanInRange(diffOnOff_perRunCalib,ch1420Low,ch1420High,meanInRange_1420Freq_perRunCalib);
753      xnt[9] = meanInRange_1420Freq_perRunCalib(0);
754      xnt[10] = meanInRange_1420Freq_perRunCalib(1);
755
756      TVector<r_4> meanInRange_1420Freq_perCycleCalib(NUMBER_OF_CHANNELS);
757      meanInRange(diffOnOff_perCycleCalib,ch1420Low,ch1420High,meanInRange_1420Freq_perCycleCalib);
758      xnt[11] = meanInRange_1420Freq_perCycleCalib(0);
759      xnt[12] = meanInRange_1420Freq_perCycleCalib(1);
760
761
762      //Follow up below the 1420.4MHz Freq.
763      TVector<r_4> meanInRange_1420aFreq_noCalib(NUMBER_OF_CHANNELS);
764      meanInRange(diffOnOff_noCalib,ch1420aLow,ch1420aHigh,meanInRange_1420aFreq_noCalib);
765      TVector<r_4> meanInRange_1420bFreq_noCalib(NUMBER_OF_CHANNELS);
766      meanInRange(diffOnOff_noCalib,ch1420bLow,ch1420bHigh,meanInRange_1420bFreq_noCalib);
767
768      xnt[13] = (meanInRange_1420aFreq_noCalib(0) + meanInRange_1420bFreq_noCalib(0))/2.;
769      xnt[14] = (meanInRange_1420aFreq_noCalib(1) + meanInRange_1420bFreq_noCalib(1))/2.;
770
771
772      TVector<r_4> meanInRange_1420aFreq_perRun(NUMBER_OF_CHANNELS);
773      meanInRange(diffOnOff_perRunCalib,ch1420aLow,ch1420aHigh,meanInRange_1420aFreq_perRun);
774      TVector<r_4> meanInRange_1420bFreq_perRun(NUMBER_OF_CHANNELS);
775      meanInRange(diffOnOff_perRunCalib,ch1420bLow,ch1420bHigh,meanInRange_1420bFreq_perRun);
776
777      xnt[15] = (meanInRange_1420aFreq_perRun(0) + meanInRange_1420bFreq_perRun(0))/2.;
778      xnt[16] = (meanInRange_1420aFreq_perRun(1) + meanInRange_1420bFreq_perRun(1))/2.;
779
780
781      TVector<r_4> meanInRange_1420aFreq_perCycle(NUMBER_OF_CHANNELS);
782      meanInRange(diffOnOff_perCycleCalib,ch1420aLow,ch1420aHigh,meanInRange_1420aFreq_perCycle);
783      TVector<r_4> meanInRange_1420bFreq_perCycle(NUMBER_OF_CHANNELS);
784      meanInRange(diffOnOff_perCycleCalib,ch1420bLow,ch1420bHigh,meanInRange_1420bFreq_perCycle);
785
786      xnt[17] = (meanInRange_1420aFreq_perCycle(0) + meanInRange_1420bFreq_perCycle(0))/2.;
787      xnt[18] = (meanInRange_1420aFreq_perCycle(1) + meanInRange_1420bFreq_perCycle(1))/2.;
788
789
790      //JEC 25/10/11 follow 1400-1420 MHz bande protege et n'inclue pas le 1420.4Mhz de la Galaxie
791      TVector<r_4> meanInRange_1400a1420Freq_noCalib(NUMBER_OF_CHANNELS);
792      meanInRange(diffOnOff_noCalib,ch1400,ch1420,meanInRange_1400a1420Freq_noCalib);
793      xnt[19] = meanInRange_1400a1420Freq_noCalib(0);
794      xnt[20] = meanInRange_1400a1420Freq_noCalib(1);
795
796      //JEC 18/11/11 follow up the 1400-1420MHz OFF only
797      TMatrix<r_4> aSpecOffovOff(aSpecOff,false);
798      aSpecOffovOff.Div(aSpecOffFiltered);
799
800      TVector<r_4> meanInRange_1410a1415Freq_OFF_noCalib(NUMBER_OF_CHANNELS);
801      //      meanInRange(aSpecOff,ch1410,ch1415,meanInRange_1410a1415Freq_OFF_noCalib);
802      meanInRange(aSpecOffovOff,ch1410,ch1415,meanInRange_1410a1415Freq_OFF_noCalib);
803
804      xnt[21] = meanInRange_1410a1415Freq_OFF_noCalib(0);
805      xnt[22] = meanInRange_1410a1415Freq_OFF_noCalib(1);
806
807      TMatrix<r_4> aSpecOnovOff(aSpecOn,false);
808      aSpecOnovOff.Div(aSpecOffFiltered);
809
810      TVector<r_4> meanInRange_1410a1415Freq_ON_noCalib(NUMBER_OF_CHANNELS);
811      //meanInRange(aSpecOn,ch1410,ch1415,meanInRange_1410a1415Freq_ON_noCalib);
812      meanInRange(aSpecOnovOff,ch1410,ch1415,meanInRange_1410a1415Freq_ON_noCalib);
813
814      xnt[23] = meanInRange_1410a1415Freq_ON_noCalib(0);
815      xnt[24] = meanInRange_1410a1415Freq_ON_noCalib(1);
816     
817      //store infos to Ntuple
818      onoffevolution.Fill(xnt);
819
820      //Quit if enough
821      if (totalNumberCycles >= para.maxNumberCycles_) break;   
822
823    }//eo loop on cycles
824    if (totalNumberCycles >= para.maxNumberCycles_) break;         
825 
826  }//eo loop on spectra in a file
827  cout << "End of jobs: we have treated " << totalNumberCycles << " cycles" << endl;
828  //Normalisation
829  if(totalNumberCycles > 0){
830    //JEC 29/10 add ON-OFF/OFF
831    meanDiffONOFFovOFF_noCalib  /= (r_4)totalNumberCycles;
832    meanDiffONOFF_noCalib       /= (r_4)totalNumberCycles;
833    meanDiffONOFF_perRunCalib   /= (r_4)totalNumberCycles;
834    meanDiffONOFF_perCycleCalib /= (r_4)totalNumberCycles;
835  } 
836 
837  //Compute the reduced version of the mean and sigma
838  TMatrix<r_4> meanRedMtx_noCalib(NUMBER_OF_CHANNELS,para.nSliceInFreq_);
839  TMatrix<r_4> sigmaRedMtx_noCalib(NUMBER_OF_CHANNELS,para.nSliceInFreq_);
840  reduceSpectra(meanDiffONOFF_noCalib,meanRedMtx_noCalib,sigmaRedMtx_noCalib);
841
842  TMatrix<r_4> meanRedMtx_perRunCalib(NUMBER_OF_CHANNELS,para.nSliceInFreq_);
843  TMatrix<r_4> sigmaRedMtx_perRunCalib(NUMBER_OF_CHANNELS,para.nSliceInFreq_);
844  reduceSpectra(meanDiffONOFF_perRunCalib,meanRedMtx_perRunCalib,sigmaRedMtx_perRunCalib);
845
846  TMatrix<r_4> meanRedMtx_perCycleCalib(NUMBER_OF_CHANNELS,para.nSliceInFreq_);
847  TMatrix<r_4> sigmaRedMtx_perCycleCalib(NUMBER_OF_CHANNELS,para.nSliceInFreq_);
848  reduceSpectra(meanDiffONOFF_perCycleCalib,meanRedMtx_perCycleCalib,sigmaRedMtx_perCycleCalib);
849
850  {//save the results
851    stringstream tmp;
852    tmp << totalNumberCycles;
853    string fileName = para.outPath_+"/onoffsurvey_"+StringToLower(para.sourceName_)+"-"+tmp.str()+"Cycles.ppf";
854
855    POutPersist fos(fileName);
856    cout << "Save output in " << fileName << endl;
857
858    string tag = "meanNoCalib";
859    fos << PPFNameTag(tag) << meanDiffONOFF_noCalib;
860   
861    //JEC 29/10/11
862    tag = "meanOvOffNoCalib";
863    fos << PPFNameTag(tag) << meanDiffONOFFovOFF_noCalib;
864
865    tag = "meanPerRunCalib";
866    fos << PPFNameTag(tag) << meanDiffONOFF_perRunCalib;
867    tag = "meanPerCycleCalib";
868    fos << PPFNameTag(tag) << meanDiffONOFF_perCycleCalib;
869
870    tag = "redmeanNoCalib";
871    fos << PPFNameTag(tag) << meanRedMtx_noCalib;
872    tag = "redsigmaNoCalib";
873    fos << PPFNameTag(tag) << sigmaRedMtx_noCalib;
874
875    tag = "redmeanPerRunCalib";
876    fos << PPFNameTag(tag) << meanRedMtx_perRunCalib;
877    tag = "redsigmaPerRunCalib";
878    fos << PPFNameTag(tag) << sigmaRedMtx_perRunCalib;
879
880    tag = "redmeanPerCycleCalib";
881    fos << PPFNameTag(tag) << meanRedMtx_perCycleCalib;
882    tag = "redsigmaPerCycleCalib";
883    fos << PPFNameTag(tag) << sigmaRedMtx_perCycleCalib;
884   
885    tag = "onoffevol";
886    fos << PPFNameTag(tag) << onoffevolution;
887 
888  }//end of save
889
890
891}
892//JEC 14/11/11 New meanRawDiffOnOffCycles START
893//-------------------------------------------------------
894//Compute the mean of Diff ON-OFF/OFF from Raw spectra
895//Used like:
896//
897void meanRawDiffOnOffCycles() throw(string) {
898  list<string> listOfFiles;
899  string directoryName;
900  directoryName = para.inPath_ + "/" + para.sourceName_;
901
902  //Make the listing of the directory
903  listOfFiles = ListOfFileInDir(directoryName,para.ppfFile_);
904 
905  list<string>::const_iterator iFile, iFileEnd, iSpec, iSpecEnd;
906  iFileEnd = listOfFiles.end();
907
908  //mean ON-OFF over the list of cycles
909  TMatrix<r_4> meanDiffONOFF_noCalib(NUMBER_OF_CHANNELS,NUMBER_OF_FREQ);      //(ON-OFF)/GAIN
910  TMatrix<r_4> meanDiffONOFFovOFF_noCalib(NUMBER_OF_CHANNELS,NUMBER_OF_FREQ); //(ON-OFF)/Filtered_OFF
911  TMatrix<r_4> meanONovOFF_noCalib(NUMBER_OF_CHANNELS,NUMBER_OF_FREQ); //  ON/Filtered_OFF
912  TMatrix<r_4> meanOFFovOFF_noCalib(NUMBER_OF_CHANNELS,NUMBER_OF_FREQ); // OFF/Filtered_OFF
913  //Tuple only for RAW things to follow
914  static const int NINFO=11;
915  char* onffTupleName[NINFO]={"cycle"
916                              ,"onoffRaw01420","onoffRaw11420"
917                              ,"onoffRaw01420side","onoffRaw11420side"
918                              ,"onoffRaw0f14101415","onoffRaw1f14101415"
919                              ,"offRaw0f14101415","offRaw1f14101415"
920                              ,"onRaw0f14101415","onRaw1f14101415"
921  };
922  NTuple onoffevolution(NINFO,onffTupleName);
923  r_4 xnt[NINFO];
924
925  //Lower and Higher freq.  just arround 1420.4MHz Freq. bin to perform mean follow up
926  sa_size_t ch1420Low  = freqToChan(1420.4-0.2);
927  sa_size_t ch1420High = freqToChan(1420.4+0.2);
928
929  //Lower and Higher freq. on the sides of 1420.4Mhz Freq. bin to perform mean follow up
930  sa_size_t ch1420aLow  = freqToChan(1418);
931  sa_size_t ch1420aHigh = freqToChan(1419);
932  sa_size_t ch1420bLow  = freqToChan(1422);
933  sa_size_t ch1420bHigh = freqToChan(1423);
934 
935  //1400-1420Mhz
936  sa_size_t ch1400 = freqToChan(1400);
937  //  sa_size_t ch1405 = freqToChan(1400);
938  sa_size_t ch1410 = freqToChan(1410);
939  sa_size_t ch1415 = freqToChan(1415);
940  sa_size_t ch1420 = freqToChan(1420);
941
942  if (para.debuglev_>0){
943    cout << "freq. band for follow up [" <<  ch1420Low << ", "<< ch1420High << "]" << endl;
944    cout << "freq. band for follow up [" <<  ch1420aLow << ", "<< ch1420aHigh << "]" << endl;
945    cout << "freq. band for follow up [" <<  ch1420bLow << ", "<< ch1420bHigh << "]" << endl;
946  }
947
948  int totalNumberCycles=0; //total number of cycles
949
950  //Loop on files
951  for (iFile = listOfFiles.begin(); iFile != iFileEnd; ++iFile) {
952    if (para.debuglev_>90){
953      cout << "load file <" << *iFile << ">" << endl;
954    }
955
956    vector<string> tokens;
957    split(*iFile,"_",tokens);
958    string dateOfRun = tokens[1];
959    if (para.debuglev_>90){
960      cout << "date <" << dateOfRun << ">" << endl;
961    }
962    vector<string> tokens2;
963    split(tokens[2],".",tokens2);
964    string srcLower = tokens2[0];
965
966    PInPersist fin(*iFile);
967    vector<string> vec = fin.GetNameTags();
968
969    vector<string> modeList;
970    modeList.push_back("On");
971    modeList.push_back("Off");
972    vector<string>::const_iterator iMode;
973   
974    map<string, list<int> > cycleModeCollect;
975   
976    for (iMode = modeList.begin(); iMode!=modeList.end(); ++iMode) {
977      list<string> listOfSpectra;
978      //Keep only required PPF objects
979      string matchstr = "specRaw"+(*iMode)+"[0-9]+"; 
980      std::remove_copy_if(
981                          vec.begin(), vec.end(), back_inserter(listOfSpectra),
982                          not1(StringMatch(matchstr))
983                          );
984     
985      listOfSpectra.sort(stringCompare);
986      iSpecEnd = listOfSpectra.end();
987     
988      matchstr = "[0-9]+";
989      //Loop of spectra matrix
990      list<int> listOfCycles;
991      for (iSpec = listOfSpectra.begin(); iSpec!=iSpecEnd;  ++iSpec){
992        int b,e;
993        regexp(iSpec->c_str(),matchstr.c_str(),&b,&e);
994        if (para.debuglev_>90){
995          cout << " spectra <" << *iSpec << ">" << endl;
996          cout << " cycle " << iSpec->substr(b) << endl;
997        }
998        listOfCycles.push_back(atoi((iSpec->substr(b)).c_str()));
999      }//end loop spectra
1000      cycleModeCollect[*iMode] = listOfCycles;
1001    }//end of mode   
1002
1003    //Take the Intersection of the list Of cycles in mode Off and On   
1004    list<int> commonCycles;
1005    set_intersection(cycleModeCollect["On"].begin(),
1006                     cycleModeCollect["On"].end(),
1007                     cycleModeCollect["Off"].begin(),
1008                     cycleModeCollect["Off"].end(),
1009                     back_inserter(commonCycles)
1010                     );
1011   
1012    if (para.debuglev_>90){
1013      cout << "Liste of cycles common to On & Off: <";
1014      for (list<int>::iterator i=commonCycles.begin(); i!=commonCycles.end(); ++i){
1015        cout << *i << " ";
1016      }
1017      cout << ">" << endl;
1018    }
1019
1020    //Loop on cyles
1021    for (list<int>::iterator ic=commonCycles.begin(); ic!=commonCycles.end(); ++ic){
1022     
1023      // AST 28.11.11 remove non-calibrated cycles for Abell1205 and Abell2440
1024      if ( *ic == 1 && srcLower == "abell1205" ) {
1025          if ( dateOfRun == "20110502" || dateOfRun == "20110607" || dateOfRun == "20110818" ) {
1026            cout << "Skipping non-calibrated cycle " << *ic << endl;
1027            continue;
1028          }
1029      } else if ( *ic == 1 && srcLower == "abell2440" ) {
1030          if ( dateOfRun == "20110516" ) {
1031            cout << "Skipping non-calibrated cycle " << *ic << endl;
1032            continue;
1033          }
1034      } else if ( *ic == 3 && srcLower == "abell1205" ) {
1035          if ( dateOfRun == "20110810" ) {
1036            cout << "Skipping non-calibrated cycle " << *ic << endl;
1037            continue;
1038          }
1039      }
1040
1041      string ppftag;
1042      //load ON phase
1043      stringstream cycle;
1044      cycle << *ic;
1045      ppftag = "specRawOn"+cycle.str();
1046      TMatrix<r_4> aSpecOn(NUMBER_OF_CHANNELS,NUMBER_OF_FREQ);
1047      fin.GetObject(aSpecOn,ppftag);
1048
1049      //Load OFF phase
1050      ppftag = "specRawOff"+cycle.str();
1051      TMatrix<r_4> aSpecOff(NUMBER_OF_CHANNELS,NUMBER_OF_FREQ);
1052      fin.GetObject(aSpecOff,ppftag);
1053     
1054      //Perform the difference ON-OFF
1055      TMatrix<r_4> diffOnOff_noCalib = aSpecOn - aSpecOff;
1056
1057      meanDiffONOFF_noCalib += diffOnOff_noCalib;
1058     
1059      //JEC 29/10/11 add ON-OFF/OFF
1060      TMatrix<r_4> diffOnOffOvOff_noCalib(diffOnOff_noCalib,false); //do not share data
1061      TMatrix<r_4> aSpecOffFiltered(NUMBER_OF_CHANNELS,NUMBER_OF_FREQ);
1062      sa_size_t halfWidth = 35; //number of freq. bin for the 1/2 width of the filtering window
1063      medianFiltering(aSpecOff,halfWidth,aSpecOffFiltered);
1064     
1065      diffOnOffOvOff_noCalib.Div(aSpecOffFiltered); //division in place
1066      meanDiffONOFFovOFF_noCalib += diffOnOffOvOff_noCalib;
1067
1068      //JEC 15/11/11 add ON/OFF and OFF/OFF
1069      TMatrix<r_4> onOvOff(aSpecOn,false);
1070      onOvOff.Div(aSpecOffFiltered);
1071      meanONovOFF_noCalib += onOvOff;
1072     
1073      TMatrix<r_4> offOvOff(aSpecOff,false);
1074      offOvOff.Div(aSpecOffFiltered);
1075      meanOFFovOFF_noCalib += offOvOff;
1076
1077      totalNumberCycles++;
1078
1079      //Fill NTuple
1080      xnt[0] = totalNumberCycles;
1081 
1082      //Follow up arround the 1420.4MHz Freq.
1083      TVector<r_4> meanInRange_1420Freq_noCalib(NUMBER_OF_CHANNELS);
1084      meanInRange(diffOnOffOvOff_noCalib,ch1420Low,ch1420High,meanInRange_1420Freq_noCalib);
1085      xnt[1] = meanInRange_1420Freq_noCalib(0);
1086      xnt[2] = meanInRange_1420Freq_noCalib(1);
1087
1088
1089      //Follow up below the 1420.4MHz Freq.
1090      TVector<r_4> meanInRange_1420aFreq_noCalib(NUMBER_OF_CHANNELS);
1091      meanInRange(diffOnOffOvOff_noCalib,ch1420aLow,ch1420aHigh,meanInRange_1420aFreq_noCalib);
1092      TVector<r_4> meanInRange_1420bFreq_noCalib(NUMBER_OF_CHANNELS);
1093      meanInRange(diffOnOffOvOff_noCalib,ch1420bLow,ch1420bHigh,meanInRange_1420bFreq_noCalib);
1094
1095      xnt[3] = (meanInRange_1420aFreq_noCalib(0) + meanInRange_1420bFreq_noCalib(0))/2.;
1096      xnt[4] = (meanInRange_1420aFreq_noCalib(1) + meanInRange_1420bFreq_noCalib(1))/2.;
1097
1098
1099      //JEC 25/10/11 follow 1400-1420 MHz bande protege et n'inclue pas le 1420.4Mhz de la Galaxie
1100      TVector<r_4> meanInRange_1400a1420Freq_noCalib(NUMBER_OF_CHANNELS);
1101      meanInRange(diffOnOffOvOff_noCalib,ch1400,ch1420,meanInRange_1400a1420Freq_noCalib);
1102      xnt[5] = meanInRange_1400a1420Freq_noCalib(0);
1103      xnt[6] = meanInRange_1400a1420Freq_noCalib(1);
1104
1105      //JEC 18/11/11 follow up the 1400-1420MHz OFF only
1106      TMatrix<r_4> aSpecOffovOff(aSpecOff,false);
1107      aSpecOffovOff.Div(aSpecOffFiltered);
1108
1109      TVector<r_4> meanInRange_1410a1415Freq_OFF_noCalib(NUMBER_OF_CHANNELS);
1110      meanInRange(aSpecOffovOff,ch1410,ch1415,meanInRange_1410a1415Freq_OFF_noCalib);
1111
1112      xnt[7] = meanInRange_1410a1415Freq_OFF_noCalib(0);
1113      xnt[8] = meanInRange_1410a1415Freq_OFF_noCalib(1);
1114
1115      TMatrix<r_4> aSpecOnovOff(aSpecOn,false);
1116      aSpecOnovOff.Div(aSpecOffFiltered);
1117
1118      TVector<r_4> meanInRange_1410a1415Freq_ON_noCalib(NUMBER_OF_CHANNELS);
1119      meanInRange(aSpecOnovOff,ch1410,ch1415,meanInRange_1410a1415Freq_ON_noCalib);
1120
1121      xnt[9] = meanInRange_1410a1415Freq_ON_noCalib(0);
1122      xnt[10] = meanInRange_1410a1415Freq_ON_noCalib(1);
1123     
1124      //store infos to Ntuple
1125      onoffevolution.Fill(xnt);
1126
1127      //Quit if enough
1128      if (totalNumberCycles >= para.maxNumberCycles_) break;   
1129    }//end of cycles
1130
1131    if (totalNumberCycles >= para.maxNumberCycles_) break;         
1132
1133  }//end files
1134  cout << "End of jobs: we have treated " << totalNumberCycles << " cycles" << endl;
1135  //Normalisation
1136  if(totalNumberCycles > 0){
1137    meanDiffONOFFovOFF_noCalib  /= (r_4)totalNumberCycles;
1138    meanDiffONOFF_noCalib       /= (r_4)totalNumberCycles;
1139    meanONovOFF_noCalib         /= (r_4)totalNumberCycles;
1140    meanOFFovOFF_noCalib        /= (r_4)totalNumberCycles;
1141  } 
1142
1143  {//save results
1144    stringstream tmp;
1145    tmp << totalNumberCycles;
1146    string fileName = para.outPath_+"/rawOnOffDiff_"+StringToLower(para.sourceName_)+"-"+tmp.str()+"Cycles.ppf";
1147
1148    POutPersist fos(fileName);
1149    cout << "Save output in " << fileName << endl;
1150
1151    string tag = "meanNoCalib";
1152    fos << PPFNameTag(tag) << meanDiffONOFF_noCalib;
1153   
1154    tag = "meanOvOffNoCalib";
1155    fos << PPFNameTag(tag) << meanDiffONOFFovOFF_noCalib;
1156   
1157    tag = "meanOnovOffNoCalib";
1158    fos << PPFNameTag(tag) << meanONovOFF_noCalib;
1159
1160    tag = "meanOffovOffNoCalib";
1161    fos << PPFNameTag(tag) << meanOFFovOFF_noCalib;
1162
1163    tag = "onoffevol";
1164    fos << PPFNameTag(tag) << onoffevolution;
1165
1166  }//end save
1167
1168
1169}
1170//JEC 14/11/11 New meanRawDiffOnOffCycles END
1171//-------------------------------------------------------
1172//JEC 14/11/11 Obsolete START
1173//-------------------------------------------------------
1174//Compute the mean of Diff ON-OFF Raw spectra and also the mean/sigma of rebinned spectra
1175//Used like:
1176//
1177// void meanRawDiffOnOffCycles() throw(string) {
1178//   list<string> listOfFiles;
1179//   string directoryName;
1180//   directoryName = para.inPath_ + "/" + para.sourceName_;
1181
1182//   //Make the listing of the directory
1183//   listOfFiles = ListOfFileInDir(directoryName,para.ppfFile_);
1184 
1185//   list<string>::const_iterator iFile, iFileEnd, iSpec, iSpecEnd;
1186//   iFileEnd = listOfFiles.end();
1187 
1188//   StringMatch match("specONOFFRaw[0-9]+"); //Tag of the PPF objects
1189//   TMatrix<r_4> meanOfSpectra(NUMBER_OF_CHANNELS,NUMBER_OF_FREQ);
1190//   uint_4 nSpectra=0;
1191//   //Loop on files
1192//   for (iFile = listOfFiles.begin(); iFile != iFileEnd; ++iFile) {
1193//     if (para.debuglev_>90){
1194//       cout << "load file <" << *iFile << ">" << endl;
1195//     }
1196//     PInPersist fin(*iFile);
1197//     vector<string> vec = fin.GetNameTags();
1198//     list<string> listOfSpectra;
1199//     //Keep only required PPF objects
1200//     std::remove_copy_if(
1201//                      vec.begin(), vec.end(), back_inserter(listOfSpectra),
1202//                      not1(match)
1203//                      );
1204   
1205//     listOfSpectra.sort(stringCompare);
1206//     iSpecEnd = listOfSpectra.end();
1207//     //Loop of spectra matrix
1208//     for (iSpec = listOfSpectra.begin(); iSpec !=iSpecEnd;  ++iSpec){
1209//       if (para.debuglev_>90){
1210//      cout << " spactra <" << *iSpec << ">" << endl;
1211//       }
1212//       TMatrix<r_4> aSpec(NUMBER_OF_CHANNELS,NUMBER_OF_FREQ);
1213//       fin.GetObject(aSpec,*iSpec);
1214//       //How to see if the GetObject is ok?? Ask Reza
1215//       nSpectra++;
1216//       meanOfSpectra+=aSpec;
1217//     }//eo loop on spectra in a file
1218//   }//eo loop on files
1219 
1220//   //Normalisation
1221//   if(nSpectra>0)meanOfSpectra/=(r_4)(nSpectra);
1222
1223//   //Compute the reduced version of the mean and sigma
1224//   TMatrix<r_4> meanRedMtx(NUMBER_OF_CHANNELS,para.nSliceInFreq_);
1225//   TMatrix<r_4> sigmaRedMtx(NUMBER_OF_CHANNELS,para.nSliceInFreq_);
1226//   reduceSpectra(meanOfSpectra,meanRedMtx,sigmaRedMtx);
1227
1228//   {//Save the result
1229//     stringstream tmp;
1230//     tmp << nSpectra;
1231//     string fileName = para.outPath_+"/meanDiffOnOffRaw_"+StringToLower(para.sourceName_)+"-"+tmp.str()+"Cycles.ppf";
1232//     cout << "Save mean based on " <<  nSpectra << " cycles " << endl;
1233//     POutPersist fos(fileName);
1234
1235//     string tag = "mean";
1236//     fos << PPFNameTag(tag) << meanOfSpectra;
1237//     tag = "meanred";
1238//     fos << PPFNameTag(tag) << meanRedMtx;
1239//     tag = "sigmared";
1240//     fos << PPFNameTag(tag) << sigmaRedMtx;
1241//   }
1242// }
1243//JEC 14/11/11 Obsolete END
1244//-------------------------------------------------------
1245//Compute the median of Diff ON-OFF Raw spectra and also the mean/sigma of rebinned spectra
1246//Used like:
1247//
1248void medianRawDiffOnOffCycles() throw(string) {
1249  list<string> listOfFiles;
1250  string directoryName;
1251  directoryName = para.inPath_ + "/" + para.sourceName_;
1252
1253  //Make the listing of the directory
1254  listOfFiles = ListOfFileInDir(directoryName,para.ppfFile_);
1255 
1256  list<string>::const_iterator iFile, iFileEnd, iSpec, iSpecEnd;
1257  iFileEnd = listOfFiles.end();
1258 
1259
1260  TArray<r_4> tableOfSpectra(NUMBER_OF_FREQ,NUMBER_OF_CHANNELS,para.maxNumberCycles_); //para.maxNumberCycles_ should be large enough...
1261
1262  StringMatch match("specONOFFRaw[0-9]+"); //Tag of the PPF objects
1263  uint_4 nSpectra=0;
1264  //Loop on files
1265  for (iFile = listOfFiles.begin(); iFile != iFileEnd; ++iFile) {
1266    if (para.debuglev_>90){
1267      cout << "load file <" << *iFile << ">" << endl;
1268    }
1269    PInPersist fin(*iFile);
1270    vector<string> vec = fin.GetNameTags();
1271    list<string> listOfSpectra;
1272    //Keep only required PPF objects
1273    std::remove_copy_if(
1274                        vec.begin(), vec.end(), back_inserter(listOfSpectra),
1275                        not1(match)
1276                        );
1277   
1278    listOfSpectra.sort(stringCompare);
1279    iSpecEnd = listOfSpectra.end();
1280    //Loop of spectra matrix
1281    for (iSpec = listOfSpectra.begin(); iSpec !=iSpecEnd && (sa_size_t)nSpectra < para.maxNumberCycles_ ;  ++iSpec){
1282      if (para.debuglev_>90){
1283        cout << " spactra <" << *iSpec << ">" << endl;
1284      }
1285      TMatrix<r_4> aSpec(NUMBER_OF_CHANNELS,NUMBER_OF_FREQ);
1286      fin.GetObject(aSpec,*iSpec);
1287
1288      tableOfSpectra(Range::all(),Range::all(),Range(nSpectra)) = aSpec;
1289
1290      nSpectra++;
1291    }//eo loop on spectra in a file
1292  }//eo loop on files
1293 
1294
1295 
1296  TMatrix<r_4> medianOfSpectra(NUMBER_OF_CHANNELS,NUMBER_OF_FREQ);
1297  //Compute the median for each freq. and Channel
1298  for (sa_size_t iCh=0; iCh<NUMBER_OF_CHANNELS; iCh++){
1299    for (sa_size_t freq =0; freq<NUMBER_OF_FREQ; freq++){
1300      TVector<r_4> tmp0(tableOfSpectra(Range(freq),Range(iCh),Range(0,nSpectra-1)).CompactAllDimensions());
1301      vector<r_4> tmp;
1302      tmp0.FillTo(tmp);
1303      medianOfSpectra(iCh,freq) = median(tmp.begin(),tmp.end());
1304    }
1305  }
1306
1307
1308  //Compute the reduced version of the mean and sigma
1309  TMatrix<r_4> meanRedMtx(NUMBER_OF_CHANNELS,para.nSliceInFreq_);
1310  TMatrix<r_4> sigmaRedMtx(NUMBER_OF_CHANNELS,para.nSliceInFreq_);
1311  reduceSpectra(medianOfSpectra,meanRedMtx,sigmaRedMtx);
1312
1313
1314  sa_size_t f1320=freqToChan(1320.);
1315  sa_size_t f1345=freqToChan(1345.);
1316  sa_size_t f1355=freqToChan(1355.);
1317  sa_size_t f1380=freqToChan(1380.);
1318  //Compute baseline arround 1350Mhz on [1320-1345] U [1355-1380]
1319  if (para.debuglev_>9){
1320    cout << "Compute baseline arround 1350Mhz on [1320-1345] U [1355-1380]" << endl;
1321  }
1322  TVector<r_4>meanMed(NUMBER_OF_CHANNELS);
1323  for (sa_size_t iCh=0; iCh<NUMBER_OF_CHANNELS; ++iCh){
1324    double meanMed1;
1325    double sigmaMed1;
1326    TVector<r_4> band1;
1327    band1 = medianOfSpectra(Range(iCh),Range(f1320,f1345)).CompactAllDimensions();
1328    MeanSigma(band1,meanMed1,sigmaMed1);
1329    double meanMed2;
1330    double sigmaMed2;
1331    TVector<r_4> band2;
1332    band2 = medianOfSpectra(Range(iCh),Range(f1355,f1380)).CompactAllDimensions();
1333    MeanSigma(band2,meanMed2,sigmaMed2);
1334    meanMed(iCh) = (meanMed1+meanMed2)*0.5;
1335  } 
1336  meanMed.Print(cout);
1337  cout << endl;
1338
1339 
1340  //Compute the sigma in the range 1320MHz-1380MHz
1341  if (para.debuglev_>9){
1342    cout << "Compute the sigma in the range 1320MHz-1380MHz" << endl;
1343  }
1344  TVector<r_4>sigmaMed(NUMBER_OF_CHANNELS);
1345  sa_size_t redf1320=(sa_size_t)((1320.0-LOWER_FREQUENCY)/TOTAL_BANDWIDTH*para.nSliceInFreq_);
1346  sa_size_t redf1380=(sa_size_t)((1380.0-LOWER_FREQUENCY)/TOTAL_BANDWIDTH*para.nSliceInFreq_);
1347
1348  for (sa_size_t iCh=0; iCh<NUMBER_OF_CHANNELS; ++iCh){
1349    double meanSigma;
1350    double sigmaSigma;
1351    TVector<r_4> band;
1352    band = sigmaRedMtx(Range(iCh),Range(redf1320,redf1380)).CompactAllDimensions();
1353    MeanSigma(band,meanSigma,sigmaSigma);
1354    meanSigma *= sqrt(para.nSliceInFreq_); //to scale to orignal spectra
1355    sigmaMed(iCh) = meanSigma;
1356  }
1357  sigmaMed.Print(cout);
1358  cout << endl;
1359
1360 
1361 
1362  if (para.debuglev_>9){
1363    cout << "Compute medianOfSpectraNorm" << endl;
1364  }
1365  TMatrix<r_4> medianOfSpectraNorm(medianOfSpectra,false); //do not share the data...
1366  for (sa_size_t iCh=0; iCh<NUMBER_OF_CHANNELS; ++iCh){
1367    medianOfSpectraNorm.Row(iCh) -= meanMed(iCh);
1368    medianOfSpectraNorm.Row(iCh) /= sigmaMed(iCh);
1369  }
1370
1371 
1372
1373  {//Save the result
1374    stringstream tmp;
1375    tmp << nSpectra;
1376    string fileName = para.outPath_+"/medianDiffOnOffRaw_"+StringToLower(para.sourceName_)+"-"+tmp.str()+"Cycles.ppf";
1377    cout << "Save median based on " <<  nSpectra << " cycles " << endl;
1378    POutPersist fos(fileName);
1379
1380    string tag = "median";
1381    fos << PPFNameTag(tag) << medianOfSpectra;
1382
1383    tag = "medianNorm";
1384    fos << PPFNameTag(tag) << medianOfSpectraNorm;
1385   
1386
1387    tag = "meanmedred";
1388    fos << PPFNameTag(tag) << meanRedMtx;
1389    tag = "sigmamedred";
1390    fos << PPFNameTag(tag) << sigmaRedMtx;
1391    tag = "cycleVsfreq";
1392   
1393    TArray<r_4> tarr(tableOfSpectra(Range::all(),Range::all(),Range(0,nSpectra-1)));
1394    fos << PPFNameTag(tag) << tarr;
1395  }
1396}
1397
1398//-------------------------------------------------------
1399int main(int narg, char* arg[]) {
1400 
1401  int rc = 0; //return code
1402  string msg; //message used in Exceptions
1403
1404
1405
1406  //default value for initial parameters (see Para structure on top of the file)
1407  string debuglev = "0";
1408  string action = "meanDiffOnOff";
1409  string inputPath = "."; 
1410  string outputPath = "."; 
1411  string sourceName = "Abell85";
1412  string ppfFile;
1413  string nSliceInFreq = "32";
1414  string typeOfCalib="perRun";
1415  string calibFreq = "1346";
1416  string calibBandFreq="6.25";
1417  string mxcycles;
1418
1419  //  bool okarg=false;
1420  int ka=1;
1421  while (ka<narg) {
1422    if (strcmp(arg[ka],"-h")==0) {
1423      cout << "Usage:  -act [meanRawDiffOnOff]|medianRawDiffOnOff|meanCalibBAODiffOnOff\n"
1424           << " -mxcycles <number> (max. number of cycles to be treated)\n"
1425           << " -calibfreq <number> (cf. freq. used by calibration operation)\n"
1426           << " -calibbandfreq <number> (cf. band of freq. used by calibration operation)\n"
1427           << " -src [Abell85]\n" 
1428           << " -inPath [.]|<top_root_dir of the ppf file>\n" 
1429           << " (ex. /sps/baoradio/AmasNancay/JEC/\n " 
1430           << " -outPath [.]|<dir of the output> \n"
1431           << " -nSliceInFreq [32]|<number of bin in freq. to cumulate>\n"
1432           << " -ppfFile <generic name of the input ppf files> (ex. diffOnOffRaw)\n"
1433           << " -debug <level> "
1434           << endl;
1435      return 0;
1436    }
1437    else if (strcmp(arg[ka],"-debug")==0) {
1438      debuglev=arg[ka+1];
1439      ka+=2;
1440    }
1441    else if (strcmp(arg[ka],"-act")==0) {
1442      action=arg[ka+1];
1443      ka+=2;
1444    }
1445    else if (strcmp(arg[ka],"-calibfreq")==0) {
1446      calibFreq=arg[ka+1];
1447      ka+=2;
1448    }   
1449    else if (strcmp(arg[ka],"-calibbandfreq")==0) {
1450      calibBandFreq=arg[ka+1];
1451      ka+=2;
1452    }   
1453    else if (strcmp(arg[ka],"-mxcycles")==0) {
1454      mxcycles=arg[ka+1];
1455      ka+=2;
1456    }   
1457    else if (strcmp(arg[ka],"-inPath")==0) {
1458      inputPath=arg[ka+1];
1459      ka+=2;
1460    }
1461    else if (strcmp(arg[ka],"-outPath")==0) {
1462      outputPath=arg[ka+1];
1463      ka+=2;
1464    }
1465    else if (strcmp(arg[ka],"-src")==0) {
1466      sourceName=arg[ka+1];
1467      ka+=2;
1468    }
1469    else if (strcmp(arg[ka],"-ppfFile")==0) {
1470      ppfFile=arg[ka+1];
1471      ka+=2;
1472    }
1473    else if (strcmp(arg[ka],"-nSliceInFreq")==0) {
1474      nSliceInFreq=arg[ka+1];
1475      ka+=2;
1476    }
1477    else ka++;
1478  }//eo while
1479
1480  para.debuglev_   = atoi(debuglev.c_str());
1481  para.inPath_     = inputPath;
1482  para.outPath_    = outputPath;
1483  para.sourceName_ = sourceName;
1484  para.ppfFile_    = ppfFile;
1485  para.nSliceInFreq_ = atoi(nSliceInFreq.c_str());
1486  para.calibFreq_   = calibFreq;
1487  para.calibBandFreq_ = calibBandFreq;
1488  para.rcalibFreq_   = atof(calibFreq.c_str());
1489  para.rcalibBandFreq_ = atof(calibBandFreq.c_str());
1490  if (mxcycles != "") {
1491    para.maxNumberCycles_ = atoi(mxcycles.c_str());
1492  } else {
1493    para.maxNumberCycles_ = std::numeric_limits<int>::max();
1494  }
1495
1496  cout << "Dump Initial parameters ............" << endl;
1497  cout << " action = " << action << "\n"
1498       << " maxNumberCycles = " << para.maxNumberCycles_ << "\n"
1499       << " inputPath = " << para.inPath_  << "\n" 
1500       << " outputPath = " <<  para.outPath_ << "\n"
1501       << " sourceName = " << para.sourceName_ << "\n"
1502       << " ppfFile = " <<  para.ppfFile_ << "\n"
1503       << " nSliceInFreq = " << para.nSliceInFreq_  << "\n"
1504       << " calibFreq = " <<  para.calibFreq_ << "\n"
1505       << " calibBandFreq = " <<  para.calibBandFreq_ << "\n"
1506       << " debuglev = "  << para.debuglev_   << "\n";
1507  cout << "...................................." << endl;
1508
1509  if ( "" == ppfFile ) {
1510    cerr << "mergeAnaFiles.cc: you have forgotten ppfFile option"
1511         << endl;
1512    return 999;
1513  }
1514
1515
1516  try {
1517
1518//     int b,e;
1519//     char *match=regexp("truc0machin","[a-z]+[0-9]*",&b,&e);
1520//     printf("->%s<-\n(b=%d e=%d)\n",match,b,e);
1521
1522    if ( action == "meanRawDiffOnOff" ) {
1523      meanRawDiffOnOffCycles();
1524    } else if (action == "medianRawDiffOnOff") {
1525      medianRawDiffOnOffCycles();
1526    } else if (action == "meanCalibBAODiffOnOff") {
1527      meanCalibBAODiffOnOffCycles();
1528    } else {
1529      msg = "Unknown action " + action;
1530      throw msg;
1531    }
1532
1533
1534  }  catch (std::exception& sex) {
1535    cerr << "mergeRawOnOff.cc std::exception :"  << (string)typeid(sex).name() 
1536         << "\n msg= " << sex.what() << endl;
1537    rc = 78;
1538  }
1539  catch ( string str ) {
1540    cerr << "mergeRawOnOff.cc Exception raised: " << str << endl;
1541  }
1542  catch (...) {
1543    cerr << "mergeRawOnOff.cc catched unknown (...) exception  " << endl; 
1544    rc = 79; 
1545  } 
1546
1547  return 0;
1548
1549}
Note: See TracBrowser for help on using the repository browser.