| 1 | //
 | 
|---|
| 2 | // Analyse of Amas@Nancay runs by J.E Campagne (LAL)
 | 
|---|
| 3 | // Version 0: 1/6/2011
 | 
|---|
| 4 | //-----------------------------
 | 
|---|
| 5 | 
 | 
|---|
| 6 | // Utilisation de SOPHYA pour faciliter les tests ...
 | 
|---|
| 7 | #include "sopnamsp.h"
 | 
|---|
| 8 | #include "machdefs.h"
 | 
|---|
| 9 | 
 | 
|---|
| 10 | #include <stdlib.h>
 | 
|---|
| 11 | #include <dirent.h>
 | 
|---|
| 12 | 
 | 
|---|
| 13 | 
 | 
|---|
| 14 | // include standard c/c++
 | 
|---|
| 15 | #include <iostream>
 | 
|---|
| 16 | #include <fstream>
 | 
|---|
| 17 | #include <string>
 | 
|---|
| 18 | #include <vector>
 | 
|---|
| 19 | #include <map>
 | 
|---|
| 20 | #include <functional>
 | 
|---|
| 21 | #include <algorithm>
 | 
|---|
| 22 | #include <numeric>
 | 
|---|
| 23 | #include <list>
 | 
|---|
| 24 | #include <exception>
 | 
|---|
| 25 | 
 | 
|---|
| 26 | // include sophya mesure ressource CPU/memoire ...
 | 
|---|
| 27 | #include "resusage.h"
 | 
|---|
| 28 | #include "ctimer.h"
 | 
|---|
| 29 | #include "timing.h"
 | 
|---|
| 30 | #include "timestamp.h"
 | 
|---|
| 31 | #include "strutilxx.h"
 | 
|---|
| 32 | #include "ntuple.h"
 | 
|---|
| 33 | #include "fioarr.h"
 | 
|---|
| 34 | #include "tarrinit.h"
 | 
|---|
| 35 | #include "histinit.h"
 | 
|---|
| 36 | #include "fitsioserver.h"
 | 
|---|
| 37 | #include "fiosinit.h"
 | 
|---|
| 38 | #include "ppersist.h"
 | 
|---|
| 39 | 
 | 
|---|
| 40 | 
 | 
|---|
| 41 | const sa_size_t NUMBER_OF_CHANNELS = 2;
 | 
|---|
| 42 | const sa_size_t  NUMBER_OF_FREQ = 8192;
 | 
|---|
| 43 | const r_4    LOWER_FREQUENCY = 1250.0; //MHz
 | 
|---|
| 44 | const r_4    TOTAL_BANDWIDTH = 250.0; //MHz
 | 
|---|
| 45 | 
 | 
|---|
| 46 | //decalration of non class members functions
 | 
|---|
| 47 | extern "C" {
 | 
|---|
| 48 |   int Usage(bool);
 | 
|---|
| 49 | }
 | 
|---|
| 50 | 
 | 
|---|
| 51 | 
 | 
|---|
| 52 | //----------------------------------------------------------
 | 
|---|
| 53 | //Utility fonctions
 | 
|---|
| 54 | // Function for deleting pointers in map.
 | 
|---|
| 55 | template<class A, class B>
 | 
|---|
| 56 | struct DeleteMapFntor
 | 
|---|
| 57 | {
 | 
|---|
| 58 |     // Overloaded () operator.
 | 
|---|
| 59 |     // This will be called by for_each() function.
 | 
|---|
| 60 |     bool operator()(pair<A,B> x) const
 | 
|---|
| 61 |     {
 | 
|---|
| 62 |         // Assuming the second item of map is to be
 | 
|---|
| 63 |         // deleted. Change as you wish.
 | 
|---|
| 64 |         delete x.second;
 | 
|---|
| 65 |         return true;
 | 
|---|
| 66 |     }
 | 
|---|
| 67 | };
 | 
|---|
| 68 | //-----
 | 
|---|
| 69 | bool compare(const pair<string,r_4>& i, const pair<string,r_4>& j) {
 | 
|---|
| 70 |   return i.second < j.second;
 | 
|---|
| 71 | }
 | 
|---|
| 72 | //-----
 | 
|---|
| 73 | sa_size_t round_sa(r_4 r) {
 | 
|---|
| 74 |   return static_cast<sa_size_t>((r > 0.0) ? (r + 0.5) : (r - 0.5));
 | 
|---|
| 75 | }
 | 
|---|
| 76 | //-----
 | 
|---|
| 77 | string StringToLower(string strToConvert){
 | 
|---|
| 78 |   //change each element of the string to lower case
 | 
|---|
| 79 |   for(unsigned int i=0;i<strToConvert.length();i++) {
 | 
|---|
| 80 |     strToConvert[i] = tolower(strToConvert[i]);
 | 
|---|
| 81 |   }
 | 
|---|
| 82 |   return strToConvert;//return the converted string
 | 
|---|
| 83 | }
 | 
|---|
| 84 | //-----
 | 
|---|
| 85 | list<string> ListOfFileInDir(string dir, string filePettern) throw(string) {
 | 
|---|
| 86 |   list<string> theList;
 | 
|---|
| 87 | 
 | 
|---|
| 88 | 
 | 
|---|
| 89 |   DIR *dip;
 | 
|---|
| 90 |   struct dirent *dit;
 | 
|---|
| 91 |   string msg;
 | 
|---|
| 92 |   string fileName;
 | 
|---|
| 93 |   string fullFileName;
 | 
|---|
| 94 |   size_t found;
 | 
|---|
| 95 | 
 | 
|---|
| 96 |   if ((dip=opendir(dir.c_str())) == NULL ) {
 | 
|---|
| 97 |     msg = "opendir failed on directory "+dir;
 | 
|---|
| 98 |     throw msg;
 | 
|---|
| 99 |   }
 | 
|---|
| 100 |   while ( (dit = readdir(dip)) != NULL ) {
 | 
|---|
| 101 |     fileName = dit->d_name;
 | 
|---|
| 102 |     found=fileName.find(filePettern);
 | 
|---|
| 103 |     if (found != string::npos) {
 | 
|---|
| 104 |       fullFileName = dir + "/";
 | 
|---|
| 105 |       fullFileName += fileName;
 | 
|---|
| 106 |       theList.push_back(fullFileName);
 | 
|---|
| 107 |     }
 | 
|---|
| 108 |   }//eo while
 | 
|---|
| 109 |   if (closedir(dip) == -1) {
 | 
|---|
| 110 |     msg = "closedir failed on directory "+dir;
 | 
|---|
| 111 |     throw msg;
 | 
|---|
| 112 |   }
 | 
|---|
| 113 |   return theList;
 | 
|---|
| 114 | }
 | 
|---|
| 115 | 
 | 
|---|
| 116 | 
 | 
|---|
| 117 | //Declaration of local classes
 | 
|---|
| 118 | //----------------------------------------------
 | 
|---|
| 119 | //Process Interface
 | 
|---|
| 120 | class IProcess {
 | 
|---|
| 121 | public:
 | 
|---|
| 122 |   IProcess() {}
 | 
|---|
| 123 |   virtual ~IProcess() {}
 | 
|---|
| 124 |   virtual int processCmd() throw(string) =0;
 | 
|---|
| 125 | };
 | 
|---|
| 126 | //------------
 | 
|---|
| 127 | //Common Process
 | 
|---|
| 128 | class ProcessBase : public IProcess {
 | 
|---|
| 129 | public:
 | 
|---|
| 130 |   ProcessBase();
 | 
|---|
| 131 |   virtual ~ProcessBase();
 | 
|---|
| 132 |   void SetInputPath(const string& inputPath) {inputPath_ = inputPath;}
 | 
|---|
| 133 |   void SetOutputPath(const string& outputPath) {outputPath_ = outputPath;}
 | 
|---|
| 134 |   void SetSourceName(const string& sourceName) {sourceName_ = sourceName;}
 | 
|---|
| 135 |   void SetDateOfRun(const string& dateOfRun) {dateOfRun_ = dateOfRun;}
 | 
|---|
| 136 |   void SetSpectraDirectory(const string& spectraDirectory) {spectraDirectory_ = spectraDirectory;}
 | 
|---|
| 137 |   void SetTypeOfFile(const string& typeOfFile) { typeOfFile_ = typeOfFile; }
 | 
|---|
| 138 |   void SetNumCycle(const string& numcycle) {numcycle_ = numcycle; }
 | 
|---|
| 139 |   void SetScaFileName(const string& scaFileName) { scaFileName_ =scaFileName; }
 | 
|---|
| 140 | 
 | 
|---|
| 141 |   void SetDebugLevel(const string& debuglev) {
 | 
|---|
| 142 |     debuglev_ = atoi(debuglev.c_str());
 | 
|---|
| 143 |   }
 | 
|---|
| 144 | 
 | 
|---|
| 145 |   virtual int processCmd() throw(string);
 | 
|---|
| 146 |   
 | 
|---|
| 147 | protected:
 | 
|---|
| 148 |   string inputPath_;
 | 
|---|
| 149 |   string outputPath_;
 | 
|---|
| 150 |   string sourceName_;
 | 
|---|
| 151 |   string dateOfRun_;
 | 
|---|
| 152 |   string spectraDirectory_;
 | 
|---|
| 153 |   string typeOfFile_;
 | 
|---|
| 154 | 
 | 
|---|
| 155 |   string numcycle_; //cycle numbers format="first,last"
 | 
|---|
| 156 |   sa_size_t ifirstCycle_;
 | 
|---|
| 157 |   sa_size_t ilastCycle_;
 | 
|---|
| 158 | 
 | 
|---|
| 159 | 
 | 
|---|
| 160 |   uint_4 debuglev_; 
 | 
|---|
| 161 |   string scaFileName_;
 | 
|---|
| 162 |   NTuple* scaTuple_;
 | 
|---|
| 163 |   map<sa_size_t,sa_size_t> idCycleInTuple_;
 | 
|---|
| 164 | };
 | 
|---|
| 165 | ProcessBase::ProcessBase() {
 | 
|---|
| 166 |   scaTuple_ = 0;
 | 
|---|
| 167 | }
 | 
|---|
| 168 | ProcessBase::~ProcessBase() {
 | 
|---|
| 169 |   if (scaTuple_) delete scaTuple_;
 | 
|---|
| 170 |   scaTuple_ = 0;
 | 
|---|
| 171 | }
 | 
|---|
| 172 | //------------
 | 
|---|
| 173 | //Process ON/OFF data
 | 
|---|
| 174 | //------------
 | 
|---|
| 175 | class ProcessONOFFData : public ProcessBase {
 | 
|---|
| 176 | protected:
 | 
|---|
| 177 |   string  freqBAOCalibration_;//string MHz
 | 
|---|
| 178 | public:
 | 
|---|
| 179 |   ProcessONOFFData(){}
 | 
|---|
| 180 |   virtual ~ProcessONOFFData(){}
 | 
|---|
| 181 | 
 | 
|---|
| 182 |   void SetFreqBAOCalibration(const string& freqBAOCalibration) { 
 | 
|---|
| 183 |     freqBAOCalibration_ = freqBAOCalibration; 
 | 
|---|
| 184 |   }
 | 
|---|
| 185 |   
 | 
|---|
| 186 |   virtual int processCmd() throw(string);
 | 
|---|
| 187 | };
 | 
|---|
| 188 | //------------
 | 
|---|
| 189 | //Process Gain
 | 
|---|
| 190 | //------------
 | 
|---|
| 191 | class ProcessGain : public ProcessBase {
 | 
|---|
| 192 | protected:
 | 
|---|
| 193 |   string mode_; //mode of data taken for gain computation On || Off
 | 
|---|
| 194 | public:
 | 
|---|
| 195 |   ProcessGain(){}
 | 
|---|
| 196 |   virtual ~ProcessGain(){}
 | 
|---|
| 197 | 
 | 
|---|
| 198 |   void SetMode(const string& mode) {mode_ = mode;}
 | 
|---|
| 199 |   
 | 
|---|
| 200 |   virtual int processCmd() throw(string);
 | 
|---|
| 201 | };
 | 
|---|
| 202 | //------------
 | 
|---|
| 203 | //Process Calibration
 | 
|---|
| 204 | //------------
 | 
|---|
| 205 | class ProcessCalibration : public ProcessBase {
 | 
|---|
| 206 | protected:
 | 
|---|
| 207 |   string option_; //option of calibration procedure
 | 
|---|
| 208 |   string  freqBAOCalibration_;//string MHz
 | 
|---|
| 209 |   r_4 valfreqBAOCalibration_; //value MHz
 | 
|---|
| 210 |   string bandWidthBAOCalibration_;//string MHz
 | 
|---|
| 211 |   r_4 valbandWidthBAOCalibration_;//value MHz
 | 
|---|
| 212 |   
 | 
|---|
| 213 |   sa_size_t lowerFreqBin_;
 | 
|---|
| 214 |   sa_size_t upperFreqBin_;
 | 
|---|
| 215 | 
 | 
|---|
| 216 | public:
 | 
|---|
| 217 |   ProcessCalibration() {}
 | 
|---|
| 218 |   virtual ~ProcessCalibration(){}
 | 
|---|
| 219 | 
 | 
|---|
| 220 |   void SetOption(const string& option) {option_ = option;}
 | 
|---|
| 221 |   void SetFreqBAOCalibration(const string& freqBAOCalibration) { 
 | 
|---|
| 222 |     freqBAOCalibration_ = freqBAOCalibration; 
 | 
|---|
| 223 |     valfreqBAOCalibration_ = atof(freqBAOCalibration_.c_str());
 | 
|---|
| 224 |   }
 | 
|---|
| 225 |   void SetBandWidthBAOCalibration(const string& bandWidthBAOCalibration) { 
 | 
|---|
| 226 |     bandWidthBAOCalibration_ = bandWidthBAOCalibration; 
 | 
|---|
| 227 |     valbandWidthBAOCalibration_ = atof(bandWidthBAOCalibration_.c_str());
 | 
|---|
| 228 |   }
 | 
|---|
| 229 | 
 | 
|---|
| 230 |   void ComputeLowerUpperFreqBin();
 | 
|---|
| 231 |       
 | 
|---|
| 232 |   virtual int processCmd() throw(string);
 | 
|---|
| 233 | };
 | 
|---|
| 234 | void ProcessCalibration::ComputeLowerUpperFreqBin() {
 | 
|---|
| 235 |   sa_size_t c0 = round_sa(NUMBER_OF_FREQ*(valfreqBAOCalibration_-LOWER_FREQUENCY)/TOTAL_BANDWIDTH);
 | 
|---|
| 236 |   sa_size_t dc = round_sa(NUMBER_OF_FREQ*valbandWidthBAOCalibration_/TOTAL_BANDWIDTH);
 | 
|---|
| 237 |   lowerFreqBin_ = c0-dc/2;
 | 
|---|
| 238 |   upperFreqBin_ = c0+dc/2;
 | 
|---|
| 239 | }
 | 
|---|
| 240 | 
 | 
|---|
| 241 | 
 | 
|---|
| 242 | //----------------------------------------------------
 | 
|---|
| 243 | //----------------------------------------------------
 | 
|---|
| 244 | int main(int narg, char* arg[])
 | 
|---|
| 245 | {
 | 
|---|
| 246 | 
 | 
|---|
| 247 |   //Init process types
 | 
|---|
| 248 |   map<string,IProcess*> process;
 | 
|---|
| 249 |   process["dataOnOff"] = new ProcessONOFFData();
 | 
|---|
| 250 |   process["gain"]      = new ProcessGain();
 | 
|---|
| 251 |   process["calib"]     = new ProcessCalibration();
 | 
|---|
| 252 | 
 | 
|---|
| 253 |   //Init Sophya related modules
 | 
|---|
| 254 |   //  SophyaInit();
 | 
|---|
| 255 |   TArrayInitiator _inia; //nneded for TArray persistancy
 | 
|---|
| 256 |   FitsIOServerInit(); //needed for input file
 | 
|---|
| 257 | 
 | 
|---|
| 258 |   //message used in Exceptions
 | 
|---|
| 259 |   string msg;
 | 
|---|
| 260 | 
 | 
|---|
| 261 |   //Return code
 | 
|---|
| 262 |   int rc = 0;
 | 
|---|
| 263 | 
 | 
|---|
| 264 |   //Arguments managements
 | 
|---|
| 265 |   if ((narg>1)&&(strcmp(arg[1],"-h")==0))  return Usage(false);
 | 
|---|
| 266 |   if (narg<11) return Usage(true);
 | 
|---|
| 267 | 
 | 
|---|
| 268 |   string action;
 | 
|---|
| 269 |   string inputPath = "."; 
 | 
|---|
| 270 |   string outputPath = "."; 
 | 
|---|
| 271 |   string sourceName;
 | 
|---|
| 272 |   string scaFile;
 | 
|---|
| 273 |   string dateOfRun;
 | 
|---|
| 274 |   string spectraDirectory;
 | 
|---|
| 275 |   string freqBAOCalib = "";
 | 
|---|
| 276 |   string bandWidthBAOCalib = "";
 | 
|---|
| 277 |   string debuglev = "0";
 | 
|---|
| 278 |   string mode = "";
 | 
|---|
| 279 |   string numcycle;
 | 
|---|
| 280 |   string calibrationOpt = "";  
 | 
|---|
| 281 | 
 | 
|---|
| 282 |   string typeOfFile="medfiltmtx";
 | 
|---|
| 283 |   
 | 
|---|
| 284 | 
 | 
|---|
| 285 |   //  bool okarg=false;
 | 
|---|
| 286 |   int ka=1;
 | 
|---|
| 287 |   while (ka<(narg-1)) {
 | 
|---|
| 288 |     if (strcmp(arg[ka],"-debug")==0) {
 | 
|---|
| 289 |       debuglev=arg[ka+1];
 | 
|---|
| 290 |       ka+=2;
 | 
|---|
| 291 |     }
 | 
|---|
| 292 |     if (strcmp(arg[ka],"-act")==0) {
 | 
|---|
| 293 |       action=arg[ka+1];
 | 
|---|
| 294 |       ka+=2;
 | 
|---|
| 295 |     }
 | 
|---|
| 296 |     if (strcmp(arg[ka],"-inPath")==0) {
 | 
|---|
| 297 |       inputPath=arg[ka+1];
 | 
|---|
| 298 |       ka+=2;
 | 
|---|
| 299 |     }
 | 
|---|
| 300 |     if (strcmp(arg[ka],"-outPath")==0) {
 | 
|---|
| 301 |       outputPath=arg[ka+1];
 | 
|---|
| 302 |       ka+=2;
 | 
|---|
| 303 |     }
 | 
|---|
| 304 |     else if (strcmp(arg[ka],"-source")==0) {
 | 
|---|
| 305 |       sourceName=arg[ka+1];
 | 
|---|
| 306 |       ka+=2;
 | 
|---|
| 307 |     }
 | 
|---|
| 308 |     else if (strcmp(arg[ka],"-sca")==0) {
 | 
|---|
| 309 |       scaFile=arg[ka+1];
 | 
|---|
| 310 |       ka+=2;
 | 
|---|
| 311 |     }
 | 
|---|
| 312 |     else if (strcmp(arg[ka],"-date")==0) {
 | 
|---|
| 313 |       dateOfRun=arg[ka+1];
 | 
|---|
| 314 |       ka+=2;
 | 
|---|
| 315 |     }
 | 
|---|
| 316 |     else if (strcmp(arg[ka],"-specdir")==0) {
 | 
|---|
| 317 |       spectraDirectory=arg[ka+1];
 | 
|---|
| 318 |       ka+=2;
 | 
|---|
| 319 |     }
 | 
|---|
| 320 |     else if (strcmp(arg[ka],"-specname")==0) {
 | 
|---|
| 321 |       typeOfFile=arg[ka+1];
 | 
|---|
| 322 |       ka+=2;
 | 
|---|
| 323 |     }    
 | 
|---|
| 324 |     else if (strcmp(arg[ka],"-freqBAOCalib")==0) {
 | 
|---|
| 325 |       freqBAOCalib = arg[ka+1];
 | 
|---|
| 326 |       ka+=2;
 | 
|---|
| 327 |     }
 | 
|---|
| 328 |     else if (strcmp(arg[ka],"-bwBAOCalib")==0) {
 | 
|---|
| 329 |       bandWidthBAOCalib = arg[ka+1];
 | 
|---|
| 330 |       ka+=2;
 | 
|---|
| 331 |     } 
 | 
|---|
| 332 |     else if (strcmp(arg[ka],"-mode")==0) {
 | 
|---|
| 333 |       mode =arg[ka+1];
 | 
|---|
| 334 |       ka+=2; 
 | 
|---|
| 335 |     }
 | 
|---|
| 336 |     else if (strcmp(arg[ka],"-numcycle")==0) {
 | 
|---|
| 337 |       numcycle =arg[ka+1];
 | 
|---|
| 338 |       ka+=2; 
 | 
|---|
| 339 |     }
 | 
|---|
| 340 |     else if (strcmp(arg[ka],"-calibopt")==0) {
 | 
|---|
| 341 |       calibrationOpt =arg[ka+1];
 | 
|---|
| 342 |       ka+=2; 
 | 
|---|
| 343 |     }
 | 
|---|
| 344 |     else ka++;
 | 
|---|
| 345 |   }//eo while
 | 
|---|
| 346 | 
 | 
|---|
| 347 | 
 | 
|---|
| 348 | 
 | 
|---|
| 349 |   try {
 | 
|---|
| 350 |     //verification of action
 | 
|---|
| 351 |     if(process.find(action) == process.end()) {
 | 
|---|
| 352 |       msg = "action ";
 | 
|---|
| 353 |       msg += action + " not valid... FATAL";
 | 
|---|
| 354 |       rc = 999;
 | 
|---|
| 355 |       throw msg;
 | 
|---|
| 356 |     }
 | 
|---|
| 357 |     
 | 
|---|
| 358 | 
 | 
|---|
| 359 |     //
 | 
|---|
| 360 |     //Process initialisation...
 | 
|---|
| 361 |     //
 | 
|---|
| 362 |     try {
 | 
|---|
| 363 |       ProcessBase* procbase = dynamic_cast<ProcessBase*>(process[action]);
 | 
|---|
| 364 |       if (procbase == 0) {
 | 
|---|
| 365 |         msg= "action ";
 | 
|---|
| 366 |         msg += action + "Not a <process base> type...FATAL";
 | 
|---|
| 367 |         rc = 999;
 | 
|---|
| 368 |         throw msg;
 | 
|---|
| 369 |       }
 | 
|---|
| 370 |       procbase->SetInputPath(inputPath);
 | 
|---|
| 371 |       procbase->SetOutputPath(outputPath);
 | 
|---|
| 372 | 
 | 
|---|
| 373 |       if ("" == sourceName) {
 | 
|---|
| 374 |         msg = "(FATAL) missingsourceName  for action " + action;
 | 
|---|
| 375 |         Usage(true);
 | 
|---|
| 376 |         throw msg;
 | 
|---|
| 377 |       }
 | 
|---|
| 378 |       procbase->SetSourceName(sourceName);
 | 
|---|
| 379 | 
 | 
|---|
| 380 |       if ("" == dateOfRun) {
 | 
|---|
| 381 |         msg = "(FATAL) missing dateOfRun for action " + action;
 | 
|---|
| 382 |         Usage(true);
 | 
|---|
| 383 |         throw msg;
 | 
|---|
| 384 |       }
 | 
|---|
| 385 |       procbase->SetDateOfRun(dateOfRun);
 | 
|---|
| 386 | 
 | 
|---|
| 387 |       
 | 
|---|
| 388 |       if ("" == spectraDirectory) {
 | 
|---|
| 389 |         msg = "(FATAL) missing spectraDirectory for action " + action;
 | 
|---|
| 390 |         Usage(true);
 | 
|---|
| 391 |         throw msg;
 | 
|---|
| 392 |       }
 | 
|---|
| 393 |       procbase->SetSpectraDirectory(spectraDirectory);
 | 
|---|
| 394 | 
 | 
|---|
| 395 |       if ("" == scaFile) {
 | 
|---|
| 396 |         msg = "(FATAL) missing scaFile for action " + action;
 | 
|---|
| 397 |         Usage(true);
 | 
|---|
| 398 |         throw msg;
 | 
|---|
| 399 |       }
 | 
|---|
| 400 |       procbase->SetScaFileName(scaFile);
 | 
|---|
| 401 | 
 | 
|---|
| 402 |       if ("" == numcycle) {
 | 
|---|
| 403 |         msg = "(FATAL) missing cycle number for action " + action;
 | 
|---|
| 404 |         Usage(true);
 | 
|---|
| 405 |         throw msg;
 | 
|---|
| 406 |       }
 | 
|---|
| 407 |       procbase->SetNumCycle(numcycle);
 | 
|---|
| 408 | 
 | 
|---|
| 409 | 
 | 
|---|
| 410 |       procbase->SetTypeOfFile(typeOfFile);
 | 
|---|
| 411 | 
 | 
|---|
| 412 |       procbase->SetDebugLevel(debuglev);
 | 
|---|
| 413 |     }
 | 
|---|
| 414 |     catch(exception& e){
 | 
|---|
| 415 |       throw e.what();
 | 
|---|
| 416 |     }
 | 
|---|
| 417 | 
 | 
|---|
| 418 |     try {
 | 
|---|
| 419 |       ProcessONOFFData* procdata = dynamic_cast<ProcessONOFFData*>(process[action]);
 | 
|---|
| 420 |       if (procdata) {
 | 
|---|
| 421 |         if (freqBAOCalib == "") {
 | 
|---|
| 422 |           msg = "(FATAL) missing calibration BAO frequency for action " + action;
 | 
|---|
| 423 |           Usage(true);
 | 
|---|
| 424 |           throw msg;
 | 
|---|
| 425 |         }
 | 
|---|
| 426 |         procdata->SetFreqBAOCalibration(freqBAOCalib);
 | 
|---|
| 427 |       }
 | 
|---|
| 428 |     }
 | 
|---|
| 429 |     catch(exception& e){
 | 
|---|
| 430 |       throw e.what();
 | 
|---|
| 431 |     }
 | 
|---|
| 432 |     
 | 
|---|
| 433 | 
 | 
|---|
| 434 |     try {
 | 
|---|
| 435 |       ProcessGain* procgain = dynamic_cast<ProcessGain*>(process[action]);
 | 
|---|
| 436 |       if(procgain) {
 | 
|---|
| 437 |         if (mode == "") {
 | 
|---|
| 438 |           msg = "(FATAL) missing mode-type for action " + action;
 | 
|---|
| 439 |           Usage(true);
 | 
|---|
| 440 |           throw msg;
 | 
|---|
| 441 |         }
 | 
|---|
| 442 |         procgain->SetMode(mode);
 | 
|---|
| 443 |       }
 | 
|---|
| 444 |     }
 | 
|---|
| 445 |     catch(exception& e){
 | 
|---|
| 446 |       throw e.what();
 | 
|---|
| 447 |     }
 | 
|---|
| 448 | 
 | 
|---|
| 449 |     try {
 | 
|---|
| 450 |       ProcessCalibration* proccalib = dynamic_cast<ProcessCalibration*>(process[action]);
 | 
|---|
| 451 |       if(proccalib) {
 | 
|---|
| 452 |         if (calibrationOpt == "") {
 | 
|---|
| 453 |           msg = "(FATAL) missing calibration option";
 | 
|---|
| 454 |           Usage(true);
 | 
|---|
| 455 |           throw msg;
 | 
|---|
| 456 |         }
 | 
|---|
| 457 |         if (freqBAOCalib == "") {
 | 
|---|
| 458 |           msg = "(FATAL) missing calibration BAO frequency for action " + action;
 | 
|---|
| 459 |           Usage(true);
 | 
|---|
| 460 |           throw msg;
 | 
|---|
| 461 |         }
 | 
|---|
| 462 |         if (bandWidthBAOCalib == "") {
 | 
|---|
| 463 |           msg = "(FATAL) missing calibration BAO frequency band width for action " + action;
 | 
|---|
| 464 |           Usage(true);
 | 
|---|
| 465 |           throw msg;
 | 
|---|
| 466 |         }
 | 
|---|
| 467 |         proccalib->SetOption(calibrationOpt);
 | 
|---|
| 468 |         proccalib->SetFreqBAOCalibration(freqBAOCalib);
 | 
|---|
| 469 |         proccalib->SetBandWidthBAOCalibration(bandWidthBAOCalib);
 | 
|---|
| 470 |         proccalib->ComputeLowerUpperFreqBin();
 | 
|---|
| 471 |       }
 | 
|---|
| 472 |     }
 | 
|---|
| 473 |     catch(exception& e){
 | 
|---|
| 474 |       throw e.what();
 | 
|---|
| 475 |     }
 | 
|---|
| 476 | 
 | 
|---|
| 477 |     //
 | 
|---|
| 478 |     //execute command
 | 
|---|
| 479 |     //
 | 
|---|
| 480 |     rc = process[action]->processCmd();
 | 
|---|
| 481 | 
 | 
|---|
| 482 |   }
 | 
|---|
| 483 |   catch (std::exception& sex) {
 | 
|---|
| 484 |     cerr << "\n analyse.cc std::exception :"  << (string)typeid(sex).name() 
 | 
|---|
| 485 |          << "\n msg= " << sex.what() << endl;
 | 
|---|
| 486 |     rc = 78;
 | 
|---|
| 487 |   }
 | 
|---|
| 488 |   catch ( string str ) {
 | 
|---|
| 489 |     cerr << "analyse.cc Exception raised: " << str << endl;
 | 
|---|
| 490 |   }
 | 
|---|
| 491 |   catch (...) {
 | 
|---|
| 492 |     cerr << " analyse.cc catched unknown (...) exception  " << endl; 
 | 
|---|
| 493 |     rc = 79; 
 | 
|---|
| 494 |   } 
 | 
|---|
| 495 | 
 | 
|---|
| 496 |   
 | 
|---|
| 497 | 
 | 
|---|
| 498 | 
 | 
|---|
| 499 |   cout << ">>>> analyse.cc ------- END ----------- RC=" << rc << endl;
 | 
|---|
| 500 |   
 | 
|---|
| 501 |   //Delete processes
 | 
|---|
| 502 |   for_each(process.begin(),process.end(), DeleteMapFntor<string,IProcess*>());
 | 
|---|
| 503 | 
 | 
|---|
| 504 |   return rc;
 | 
|---|
| 505 | }
 | 
|---|
| 506 | 
 | 
|---|
| 507 | //---------------------------------------------------
 | 
|---|
| 508 | int Usage(bool flag) {
 | 
|---|
| 509 |   cout << "Analyse.cc usage...." << endl;
 | 
|---|
| 510 |   cout << "analyse  -act <action_type>: dataOnOff, gain, calib\n"
 | 
|---|
| 511 |        << "         -inPath <path for input files: default='.'>\n"
 | 
|---|
| 512 |        << "         -outPath <path for output files: default='.'>\n"
 | 
|---|
| 513 |        << "         -source <source name> \n" 
 | 
|---|
| 514 |        << "         -date <YYYYMMDD>\n"
 | 
|---|
| 515 |        << "         -sca <file name scaXYZ.sum.trans>\n"
 | 
|---|
| 516 |        << "         -specdir <generic directory name of spectra fits files>\n"
 | 
|---|
| 517 |        << "         -specname <generic name of spectra fits files>\n"
 | 
|---|
| 518 |        << "         -freqBAOCalib <freq in MHZ> freq. of calibration BAO\n"
 | 
|---|
| 519 |        << "            valid for act=dataOnOff\n"
 | 
|---|
| 520 |        << "         -bwBAOCalib <band width MHz> band width arround central freq. for calibration BAO\n"
 | 
|---|
| 521 |        << "            valid for act=calib\n"
 | 
|---|
| 522 |        << "         -mode <mode_type>:\n"
 | 
|---|
| 523 |        << "            valid for act=gain, mode_type: On, Off\n"
 | 
|---|
| 524 |        << "         -numcycle <number>,<number>:\n"
 | 
|---|
| 525 |        << "            valid for all actions"
 | 
|---|
| 526 |        << "         -calibopt <option>:\n"
 | 
|---|
| 527 |        << "            valid for act=calib: indiv OR mean (NOT USED)"
 | 
|---|
| 528 |        << "         -debuglev <number> [0=default]\n"
 | 
|---|
| 529 |        << "           1: normal print\n"
 | 
|---|
| 530 |        << "           2: save intermediate spectra\n"
 | 
|---|
| 531 |        << endl;
 | 
|---|
| 532 |   if (flag) {
 | 
|---|
| 533 |     cout << "use <path>/analyse -h for detailed instructions" << endl;
 | 
|---|
| 534 |     return 5;
 | 
|---|
| 535 |   }
 | 
|---|
| 536 |   return 1;
 | 
|---|
| 537 | }
 | 
|---|
| 538 | 
 | 
|---|
| 539 | int ProcessBase::processCmd() throw(string) {
 | 
|---|
| 540 |   int rc =0;
 | 
|---|
| 541 |   string msg;
 | 
|---|
| 542 |   if(debuglev_>0)cout << "Process Base" << endl;
 | 
|---|
| 543 |   //------------------------
 | 
|---|
| 544 |   //Use the sca file informations
 | 
|---|
| 545 |   //------------------------
 | 
|---|
| 546 |   //  string scaFullPathName = "./";
 | 
|---|
| 547 |   //TOBE FIXED  scaFullPathName += sourceName_+"/"+dateOfRun_ + StringToLower(sourceName_)+"/";
 | 
|---|
| 548 |   string scaFullPathName = inputPath_ + "/" 
 | 
|---|
| 549 |     + sourceName_+ "/" +dateOfRun_ + StringToLower(sourceName_)+ "/" + scaFileName_;
 | 
|---|
| 550 |   char* scaTupleColumnName[9] = {"cycle","stcalOn","spcalOn","stOn","spOn","stcalOff","spcalOff","stOff","spOff"};
 | 
|---|
| 551 |   scaTuple_ = new NTuple(9,scaTupleColumnName);
 | 
|---|
| 552 |   int n = scaTuple_->FillFromASCIIFile(scaFullPathName);
 | 
|---|
| 553 |   if(n<0){ //Error
 | 
|---|
| 554 |     msg = "(FATAL) NTuple error loading "+ scaFullPathName;
 | 
|---|
| 555 |     rc = 999;
 | 
|---|
| 556 |     throw msg;
 | 
|---|
| 557 |   }
 | 
|---|
| 558 |   
 | 
|---|
| 559 |   if(debuglev_>1){
 | 
|---|
| 560 |     cout << "ProcessBase::processCmd: dump tuple in " << scaFullPathName << endl;
 | 
|---|
| 561 |     scaTuple_->Show(cout);
 | 
|---|
| 562 |   }
 | 
|---|
| 563 |   
 | 
|---|
| 564 |   
 | 
|---|
| 565 |   //Get the cycles (here consider consecutive cycles)    
 | 
|---|
| 566 |   //The SCA file cannot be used as the DAQ can miss some cycles...
 | 
|---|
| 567 |   //     r_8 firstCycle, lastCycle;
 | 
|---|
| 568 |   //     scaTuple_->GetMinMax("cycle",firstCycle,lastCycle);
 | 
|---|
| 569 |   //     ifirstCycle_ = (sa_size_t)firstCycle;
 | 
|---|
| 570 |   //     ilastCycle_  = (sa_size_t)lastCycle;
 | 
|---|
| 571 |   //Analyse the string given by -numcycle command line
 | 
|---|
| 572 |   int ai1=0,ai2=0;
 | 
|---|
| 573 |   sscanf(numcycle_.c_str(),"%d,%d",&ai1,&ai2);
 | 
|---|
| 574 |   ifirstCycle_ = (sa_size_t)ai1;
 | 
|---|
| 575 |   ilastCycle_  = (sa_size_t)ai2;
 | 
|---|
| 576 |   
 | 
|---|
| 577 | 
 | 
|---|
| 578 |   //associate cycle number to index line in tuple
 | 
|---|
| 579 |   sa_size_t nLines = scaTuple_->NbLines();
 | 
|---|
| 580 |   for(sa_size_t iL=0; iL<nLines; ++iL){
 | 
|---|
| 581 |     idCycleInTuple_[(sa_size_t)scaTuple_->GetCell(iL,"cycle")]=iL;
 | 
|---|
| 582 |   }
 | 
|---|
| 583 | 
 | 
|---|
| 584 | 
 | 
|---|
| 585 |   return rc;
 | 
|---|
| 586 | }
 | 
|---|
| 587 | //----------------------------------------------
 | 
|---|
| 588 | int ProcessONOFFData::processCmd() throw(string) {
 | 
|---|
| 589 |   int rc = 0;
 | 
|---|
| 590 |   try {
 | 
|---|
| 591 |     rc = ProcessBase::processCmd();
 | 
|---|
| 592 |   } 
 | 
|---|
| 593 |   catch (string s) {
 | 
|---|
| 594 |     throw s;
 | 
|---|
| 595 |   }
 | 
|---|
| 596 |    if(debuglev_>0)cout << "Process Data" << endl;
 | 
|---|
| 597 |   vector<string> modeList;
 | 
|---|
| 598 |   modeList.push_back("On");
 | 
|---|
| 599 |   modeList.push_back("Off");
 | 
|---|
| 600 |   vector<string>::const_iterator iMode;
 | 
|---|
| 601 |   
 | 
|---|
| 602 |   uint_4 id; 
 | 
|---|
| 603 |   string tag;
 | 
|---|
| 604 | 
 | 
|---|
| 605 |   //
 | 
|---|
| 606 |   //Process to get sucessively
 | 
|---|
| 607 |   //Raw Spectra, 
 | 
|---|
| 608 |   //BAO Calibrated Spectra 
 | 
|---|
| 609 |   //and RT Calibrated Spectra
 | 
|---|
| 610 |   //The pocesses are separated to allow intermediate save of results
 | 
|---|
| 611 | 
 | 
|---|
| 612 |   map< pair<string, sa_size_t>, TMatrix<r_4> > spectreCollect;
 | 
|---|
| 613 |   map< pair<string, sa_size_t>, TMatrix<r_4> >::iterator iSpectre, iSpectreEnd;
 | 
|---|
| 614 |   
 | 
|---|
| 615 |   for (iMode = modeList.begin(); iMode != modeList.end(); ++iMode) {
 | 
|---|
| 616 |     string mode = *iMode;
 | 
|---|
| 617 |     if(debuglev_>0)cout << "Process RAW Mode " << mode << endl;
 | 
|---|
| 618 | 
 | 
|---|
| 619 |     //------------------------------------------
 | 
|---|
| 620 |     //Produce Raw spectra per cycle
 | 
|---|
| 621 |     //------------------------------------------
 | 
|---|
| 622 | 
 | 
|---|
| 623 |     string directoryName;
 | 
|---|
| 624 |     list<string> listOfSpecFiles;
 | 
|---|
| 625 |     list<string>::const_iterator iFile, iFileEnd;
 | 
|---|
| 626 |     
 | 
|---|
| 627 |         
 | 
|---|
| 628 |     //
 | 
|---|
| 629 |     //loop on cycles
 | 
|---|
| 630 |     //
 | 
|---|
| 631 |     for (sa_size_t icycle = ifirstCycle_; icycle <= ilastCycle_; icycle++) {
 | 
|---|
| 632 |       //TOBE FIXED      directoryName = "./" + sourceName_ + "/"+ dateOfRun_ + StringToLower(sourceName_) + "/" +mode + "/";
 | 
|---|
| 633 |       directoryName = "./" + mode + "/";
 | 
|---|
| 634 |       stringstream sicycle;
 | 
|---|
| 635 |       sicycle << icycle;
 | 
|---|
| 636 |       directoryName += spectraDirectory_ + sicycle.str() + "/";
 | 
|---|
| 637 | 
 | 
|---|
| 638 |       //read directory
 | 
|---|
| 639 |       listOfSpecFiles = ListOfFileInDir(directoryName,typeOfFile_);
 | 
|---|
| 640 |       
 | 
|---|
| 641 | 
 | 
|---|
| 642 |       //compute mean of spectra created in a cycle
 | 
|---|
| 643 |       if(debuglev_>0)cout << "compute mean for cycle " << icycle << endl;
 | 
|---|
| 644 |       TMatrix<r_4> spectreMean(NUMBER_OF_CHANNELS,NUMBER_OF_FREQ); //implicit init to 0
 | 
|---|
| 645 |       iFileEnd = listOfSpecFiles.end();
 | 
|---|
| 646 |       r_4 nSpectres  = 0;
 | 
|---|
| 647 |       for (iFile = listOfSpecFiles.begin(); iFile != iFileEnd; ++iFile) {
 | 
|---|
| 648 |         FitsInOutFile aSpectrum(*iFile,FitsInOutFile::Fits_RO);
 | 
|---|
| 649 |         TMatrix<r_4> spectre(NUMBER_OF_CHANNELS,NUMBER_OF_FREQ);
 | 
|---|
| 650 |         aSpectrum >> spectre;
 | 
|---|
| 651 |         spectreMean += spectre;
 | 
|---|
| 652 |         nSpectres++;
 | 
|---|
| 653 |       }// end of for files 
 | 
|---|
| 654 |       if(nSpectres>0) spectreMean /= nSpectres;
 | 
|---|
| 655 |       
 | 
|---|
| 656 |       //save mean spectrum
 | 
|---|
| 657 |       spectreCollect.insert( pair< pair<string,sa_size_t>, TMatrix<r_4> >(make_pair(mode,icycle),TMatrix<r_4>(spectreMean,false) ));
 | 
|---|
| 658 |     }//end of for cycles
 | 
|---|
| 659 |   }//end loop on mode for raw preocess
 | 
|---|
| 660 | 
 | 
|---|
| 661 |   if(debuglev_>1) {//save mean spectra on file 
 | 
|---|
| 662 |     cout << "Save mean raw spectra" << endl;
 | 
|---|
| 663 |     string fileName;
 | 
|---|
| 664 |     //TOBE FIXED    fileName = "./" + sourceName_ + "/" + dateOfRun_ + "_" + StringToLower(sourceName_) + "_" + "dataRaw" + ".ppf";
 | 
|---|
| 665 |     fileName = "./dataRaw_" + dateOfRun_ + "_" + StringToLower(sourceName_) + ".ppf";
 | 
|---|
| 666 | 
 | 
|---|
| 667 |     POutPersist fos(fileName);
 | 
|---|
| 668 |     id=0;
 | 
|---|
| 669 |     iSpectreEnd = spectreCollect.end();
 | 
|---|
| 670 |     for (iSpectre = spectreCollect.begin();
 | 
|---|
| 671 |          iSpectre != iSpectreEnd ; ++iSpectre, ++id) {
 | 
|---|
| 672 |       tag = "specRaw";
 | 
|---|
| 673 |       stringstream sid;
 | 
|---|
| 674 |       sid << id;
 | 
|---|
| 675 |       tag += sid.str();
 | 
|---|
| 676 |       fos << PPFNameTag(tag) << iSpectre->second;
 | 
|---|
| 677 |     }
 | 
|---|
| 678 |   }//end of save fits
 | 
|---|
| 679 |   
 | 
|---|
| 680 | 
 | 
|---|
| 681 | 
 | 
|---|
| 682 |   for (iMode = modeList.begin(); iMode != modeList.end(); ++iMode) {
 | 
|---|
| 683 |     string mode = *iMode;
 | 
|---|
| 684 |     if(debuglev_>0)cout << "Process CALIB BAO Mode " << mode << endl;
 | 
|---|
| 685 |     //------------------------------------------
 | 
|---|
| 686 |     // Correct Raw spectra for BAO calibration
 | 
|---|
| 687 |     //------------------------------------------
 | 
|---|
| 688 |     //Read BAO calibration files
 | 
|---|
| 689 |     TMatrix<r_4> calibBAOfactors;
 | 
|---|
| 690 |     sa_size_t nr,nc; //values read 
 | 
|---|
| 691 |     bool first = true;
 | 
|---|
| 692 | 
 | 
|---|
| 693 |     for (sa_size_t iCh=0;iCh<NUMBER_OF_CHANNELS;++iCh){
 | 
|---|
| 694 |       string calibFileName = "./" + sourceName_ + "/" 
 | 
|---|
| 695 |         + dateOfRun_ + StringToLower(sourceName_) + "-" + mode + "-" + freqBAOCalibration_ + "MHz";
 | 
|---|
| 696 |       stringstream channel;
 | 
|---|
| 697 |       channel << iCh;
 | 
|---|
| 698 |       calibFileName += "-Ch" + channel.str() + "Cycles.txt";
 | 
|---|
| 699 |       if(debuglev_>0) cout << "Read file " << calibFileName << endl;
 | 
|---|
| 700 |       ifstream ifs(calibFileName.c_str());
 | 
|---|
| 701 |       if ( ! ifs.is_open() ) {
 | 
|---|
| 702 |         rc = 999;
 | 
|---|
| 703 |         throw calibFileName + " cannot be opened...";
 | 
|---|
| 704 |       } 
 | 
|---|
| 705 |       TVector<r_4> aCalib;
 | 
|---|
| 706 |       aCalib.ReadASCII(ifs,nr,nc);
 | 
|---|
| 707 |       if(first){
 | 
|---|
| 708 |         first = false;
 | 
|---|
| 709 |         calibBAOfactors.SetSize(NUMBER_OF_CHANNELS,nr);
 | 
|---|
| 710 |       }
 | 
|---|
| 711 |       calibBAOfactors( Range(iCh), Range::all() ) = aCalib.Transpose();
 | 
|---|
| 712 |       ifs.close();
 | 
|---|
| 713 |     }//end of loop on channels
 | 
|---|
| 714 | 
 | 
|---|
| 715 | 
 | 
|---|
| 716 |     //
 | 
|---|
| 717 |     //spectra corrected by BAO calibration factor 
 | 
|---|
| 718 |     //make it different on Channels and Cycles (1/06/2011)
 | 
|---|
| 719 |     //warning cycles are numbered from 1,...,N
 | 
|---|
| 720 |     //
 | 
|---|
| 721 |     if(debuglev_>0)cout << "do calibration..." << endl;
 | 
|---|
| 722 |     for (sa_size_t icycle = ifirstCycle_; icycle <= ilastCycle_; icycle++) {
 | 
|---|
| 723 |       TMatrix<r_4> specmtx(spectreCollect[make_pair(mode,icycle)],true); //share the memory 
 | 
|---|
| 724 |       
 | 
|---|
| 725 |       for (sa_size_t iCh=0;iCh<NUMBER_OF_CHANNELS;++iCh){
 | 
|---|
| 726 |         specmtx( Range(iCh), Range::all() ) /= calibBAOfactors(iCh,icycle-1);
 | 
|---|
| 727 |       }
 | 
|---|
| 728 |     }
 | 
|---|
| 729 |   } //end loop mode for BAO calib
 | 
|---|
| 730 | 
 | 
|---|
| 731 |   if(debuglev_>1){ //save mean spectra BAO calibrated on file
 | 
|---|
| 732 |     cout << "save calibrated BAO spectra" << endl;
 | 
|---|
| 733 |     string fileName;
 | 
|---|
| 734 |     //TO BE FIXED    fileName = "./" + sourceName_ + "/" + dateOfRun_ + "_" + StringToLower(sourceName_) + "_" + "dataBAOCalib" + ".ppf";
 | 
|---|
| 735 |     fileName = "./dataBAOCalib_" + dateOfRun_ + "_" + StringToLower(sourceName_) + ".ppf";
 | 
|---|
| 736 | 
 | 
|---|
| 737 |     POutPersist fos(fileName);
 | 
|---|
| 738 |     iSpectreEnd = spectreCollect.end();
 | 
|---|
| 739 |     id=0;
 | 
|---|
| 740 |     for (iSpectre = spectreCollect.begin();iSpectre != iSpectreEnd ; ++iSpectre, ++id) {
 | 
|---|
| 741 |       tag = "specBAOCalib";
 | 
|---|
| 742 |       stringstream sid;
 | 
|---|
| 743 |       sid << id;
 | 
|---|
| 744 |       tag += sid.str();
 | 
|---|
| 745 |       fos << PPFNameTag(tag) << (*iSpectre).second;
 | 
|---|
| 746 |     }
 | 
|---|
| 747 |   }//end of save fits
 | 
|---|
| 748 | 
 | 
|---|
| 749 |   
 | 
|---|
| 750 |   for (iMode = modeList.begin(); iMode != modeList.end(); ++iMode) {
 | 
|---|
| 751 |     string mode = *iMode;
 | 
|---|
| 752 |     if(debuglev_>0)cout << "Process CALIB RT Mode " << mode << endl;
 | 
|---|
| 753 |     //------------------------------------------
 | 
|---|
| 754 |     // Correct BAO calib spectra for RT calibration
 | 
|---|
| 755 |     //------------------------------------------
 | 
|---|
| 756 |     //Very Preliminary May-June 11
 | 
|---|
| 757 |     //coef RT @ 1346MHz Ouest - Est associees a Ch 0 et 1
 | 
|---|
| 758 |     r_4 calibRT[NUMBER_OF_CHANNELS] = {27.724, 22.543};
 | 
|---|
| 759 |     for (sa_size_t icycle = ifirstCycle_; icycle <= ilastCycle_; icycle++) {
 | 
|---|
| 760 |       TMatrix<r_4> specmtx(spectreCollect[make_pair(mode,icycle)],true); //share the memory    
 | 
|---|
| 761 |       for (sa_size_t iCh=0;iCh<NUMBER_OF_CHANNELS;++iCh){
 | 
|---|
| 762 |         specmtx( Range(iCh), Range::all() ) *= calibRT[iCh];
 | 
|---|
| 763 |       }
 | 
|---|
| 764 |     }
 | 
|---|
| 765 |   }//end loop on mode RT calib
 | 
|---|
| 766 | 
 | 
|---|
| 767 |   {//save mean spectra BAO & RT calibrated on file
 | 
|---|
| 768 |     if(debuglev_>0)cout << "save calibrated BAO & RT spectra" << endl;
 | 
|---|
| 769 |     string fileName;
 | 
|---|
| 770 |     //TO BE FIXED    fileName = "./" + sourceName_ + "/" + dateOfRun_ + "_" + StringToLower(sourceName_) + "_" + "dataBAORTCalib" + ".ppf";
 | 
|---|
| 771 |      fileName = "./dataBAORTCalib_" + dateOfRun_ + "_" + StringToLower(sourceName_) + ".ppf";   
 | 
|---|
| 772 |     POutPersist fos(fileName);
 | 
|---|
| 773 |     iSpectreEnd = spectreCollect.end();
 | 
|---|
| 774 |     id = 0;
 | 
|---|
| 775 |     for (iSpectre = spectreCollect.begin();iSpectre != iSpectreEnd ; ++iSpectre, ++id) {
 | 
|---|
| 776 |       tag = "specBAORTCalib";
 | 
|---|
| 777 |       stringstream sid;
 | 
|---|
| 778 |       sid << id;
 | 
|---|
| 779 |       tag += sid.str();
 | 
|---|
| 780 |       fos << PPFNameTag(tag) << (*iSpectre).second;
 | 
|---|
| 781 |     }
 | 
|---|
| 782 |   }//end of save fits
 | 
|---|
| 783 | 
 | 
|---|
| 784 |   //------------------------------------------
 | 
|---|
| 785 |   // Perform ON-OFF
 | 
|---|
| 786 |   //------------------------------------------
 | 
|---|
| 787 |   
 | 
|---|
| 788 |   map< sa_size_t, TMatrix<r_4> > diffCollect;
 | 
|---|
| 789 |   map< sa_size_t, TMatrix<r_4> >::iterator iDiff, iDiffEnd;
 | 
|---|
| 790 | 
 | 
|---|
| 791 |   TMatrix<r_4> diffMeanOnOff(NUMBER_OF_CHANNELS,NUMBER_OF_FREQ); //init zero
 | 
|---|
| 792 |   r_4 nCycles = 0;
 | 
|---|
| 793 |   for (sa_size_t icycle = ifirstCycle_; icycle <= ilastCycle_; icycle++) {
 | 
|---|
| 794 |     nCycles++;
 | 
|---|
| 795 |     TMatrix<r_4> specmtxOn(spectreCollect[make_pair(modeList[0],icycle)],false); //clone the memory 
 | 
|---|
| 796 |     TMatrix<r_4> specmtxOff(spectreCollect[make_pair(modeList[1],icycle)],false); //clone the memory 
 | 
|---|
| 797 |     TMatrix<r_4> diffOnOff = specmtxOn - specmtxOff;
 | 
|---|
| 798 |     diffCollect.insert(pair< sa_size_t,TMatrix<r_4> >(icycle,TMatrix<r_4>(diffOnOff,false) ));
 | 
|---|
| 799 |     diffMeanOnOff += diffOnOff;
 | 
|---|
| 800 |   }//end loop on cycle
 | 
|---|
| 801 |   if(nCycles>0) diffMeanOnOff/=nCycles;
 | 
|---|
| 802 | 
 | 
|---|
| 803 |   //exctract channels and do the mean
 | 
|---|
| 804 |   TVector<r_4> meanOfChan(NUMBER_OF_FREQ); //implicitly init to 0
 | 
|---|
| 805 |   for (sa_size_t iCh=0; iCh<NUMBER_OF_CHANNELS; ++iCh) {
 | 
|---|
| 806 |     meanOfChan += diffMeanOnOff.Row(iCh).Transpose();
 | 
|---|
| 807 |   }
 | 
|---|
| 808 |   meanOfChan /= (r_4)NUMBER_OF_CHANNELS;
 | 
|---|
| 809 |   
 | 
|---|
| 810 | 
 | 
|---|
| 811 | 
 | 
|---|
| 812 |   {//save diff ON-OFF BAO & RT calibrated
 | 
|---|
| 813 |     if(debuglev_>0)cout << "save ON-OFF spectra" << endl;
 | 
|---|
| 814 |     string fileName;
 | 
|---|
| 815 |     //TO BE FIXED    fileName = "./" + sourceName_ + "/" + dateOfRun_ + "_" + StringToLower(sourceName_) + "_" + "diffOnOff" + ".ppf";
 | 
|---|
| 816 |     fileName = "./diffOnOff_" + dateOfRun_ + "_" + StringToLower(sourceName_) + ".ppf";
 | 
|---|
| 817 |     POutPersist fos(fileName);
 | 
|---|
| 818 |     iDiffEnd = diffCollect.end();
 | 
|---|
| 819 |     id = 0;
 | 
|---|
| 820 |     for (iDiff = diffCollect.begin();iDiff != iDiffEnd ; ++iDiff, id++) {
 | 
|---|
| 821 |       tag = "specONOFF";
 | 
|---|
| 822 |       stringstream sid;
 | 
|---|
| 823 |       sid << id;
 | 
|---|
| 824 |       tag += sid.str();
 | 
|---|
| 825 |       fos << PPFNameTag(tag) << (*iDiff).second;
 | 
|---|
| 826 |     }
 | 
|---|
| 827 |     //save the mean also
 | 
|---|
| 828 |     fos << PPFNameTag("specONOFFMean") << diffMeanOnOff;
 | 
|---|
| 829 |     fos << PPFNameTag("specONOFF2ChanMean") << meanOfChan;
 | 
|---|
| 830 |   }//end of save fits
 | 
|---|
| 831 | 
 | 
|---|
| 832 |   return rc;
 | 
|---|
| 833 | } //ProcessONOFFData::processCmd
 | 
|---|
| 834 | //
 | 
|---|
| 835 | //----------------------------------------------
 | 
|---|
| 836 | //
 | 
|---|
| 837 | int ProcessGain::processCmd() throw(string) {
 | 
|---|
| 838 |   int rc = 0;
 | 
|---|
| 839 |   string msg = "";
 | 
|---|
| 840 | 
 | 
|---|
| 841 |   try {
 | 
|---|
| 842 |     rc = ProcessBase::processCmd();
 | 
|---|
| 843 |   } 
 | 
|---|
| 844 |   catch (string s) {
 | 
|---|
| 845 |     throw s;
 | 
|---|
| 846 |   }
 | 
|---|
| 847 |   if(debuglev_>0)cout << "Process Gain" << endl;
 | 
|---|
| 848 |   
 | 
|---|
| 849 |   string directoryName;
 | 
|---|
| 850 |   //TOBE FIXED  directoryName = "./" + sourceName_ + "/"+ dateOfRun_ + StringToLower(sourceName_) + "/" +mode_ + "/";
 | 
|---|
| 851 |   //JEC 6/09/2011 numcycle_ repalced by ifirstCycle_ according to definition of numcycle_ and the fact that for GAIN 1 cycle is involved
 | 
|---|
| 852 |   stringstream thegaincycle;
 | 
|---|
| 853 |   thegaincycle << ifirstCycle_;
 | 
|---|
| 854 |   directoryName = inputPath_ + "/" 
 | 
|---|
| 855 |     + sourceName_ + "/" + dateOfRun_ + StringToLower(sourceName_) + "/" 
 | 
|---|
| 856 |     + mode_ + "/" + spectraDirectory_ + thegaincycle.str()  + "/";
 | 
|---|
| 857 |   
 | 
|---|
| 858 |   list<string> listOfSpecFiles;
 | 
|---|
| 859 |   list<string>::const_iterator iFile, iFileEnd;
 | 
|---|
| 860 |   //read directory
 | 
|---|
| 861 | 
 | 
|---|
| 862 |   listOfSpecFiles = ListOfFileInDir(directoryName,typeOfFile_);
 | 
|---|
| 863 |   
 | 
|---|
| 864 |   //Mean power computed over the N channels to select the spectra for gain computation 
 | 
|---|
| 865 |   //The threshold is computed "on-line" as  1%  of the difference (max power -min power) over the
 | 
|---|
| 866 |   // the min power.
 | 
|---|
| 867 |   //A possible alternative is to set an absolute value...
 | 
|---|
| 868 |   if(debuglev_>0)cout << "compute mean poser spectra for files in " << directoryName << endl;
 | 
|---|
| 869 |   iFileEnd = listOfSpecFiles.end();
 | 
|---|
| 870 |   map<string, r_4> meanpowerCollect;
 | 
|---|
| 871 |   map<string, r_4>::const_iterator iMeanPow, iMeanPowEnd;
 | 
|---|
| 872 | 
 | 
|---|
| 873 |   for (iFile = listOfSpecFiles.begin(); iFile != iFileEnd; ++iFile) {
 | 
|---|
| 874 |     FitsInOutFile aSpectrum(*iFile,FitsInOutFile::Fits_RO);
 | 
|---|
| 875 |     TMatrix<r_4> spectre(NUMBER_OF_CHANNELS,NUMBER_OF_FREQ);
 | 
|---|
| 876 |     aSpectrum >> spectre;
 | 
|---|
| 877 |     meanpowerCollect[*iFile] = spectre.Sum()/spectre.Size();
 | 
|---|
| 878 |   }//end of for files
 | 
|---|
| 879 |   pair<string, r_4> minelement = *min_element(meanpowerCollect.begin(),meanpowerCollect.end(),compare);
 | 
|---|
| 880 |   pair<string, r_4> maxelement = *max_element(meanpowerCollect.begin(),meanpowerCollect.end(),compare);
 | 
|---|
| 881 |   if(debuglev_>1){
 | 
|---|
| 882 |     cout << "meanpowerCollect has " << meanpowerCollect.size() << " spectra registered" << endl;
 | 
|---|
| 883 |     cout << "find min mean power "<<minelement.second << " for " << minelement.first << endl;
 | 
|---|
| 884 |     cout << "find max mean power "<<maxelement.second << " for " << maxelement.first << endl;
 | 
|---|
| 885 |   }
 | 
|---|
| 886 |   r_4 threshold = minelement.second + 0.01*(maxelement.second-minelement.second);
 | 
|---|
| 887 |   if(debuglev_>1){
 | 
|---|
| 888 |     cout << "threshold found at " << threshold <<endl;
 | 
|---|
| 889 |   }  
 | 
|---|
| 890 | 
 | 
|---|
| 891 |   TMatrix<r_4> spectreMean(NUMBER_OF_CHANNELS,NUMBER_OF_FREQ); //implicit init to 0
 | 
|---|
| 892 |   r_4 nSpectres  = 0;
 | 
|---|
| 893 |   iMeanPowEnd = meanpowerCollect.end();
 | 
|---|
| 894 |   for (iMeanPow = meanpowerCollect.begin(); iMeanPow != iMeanPowEnd; ++iMeanPow) {
 | 
|---|
| 895 |     if ( iMeanPow->second <= threshold ) {
 | 
|---|
| 896 |       //TODO avoid the reloading of the file may speed up
 | 
|---|
| 897 |       FitsInOutFile aSpectrum(iMeanPow->first,FitsInOutFile::Fits_RO);
 | 
|---|
| 898 |       TMatrix<r_4> spectre(NUMBER_OF_CHANNELS,NUMBER_OF_FREQ);
 | 
|---|
| 899 |       aSpectrum >> spectre;
 | 
|---|
| 900 |       spectreMean += spectre;
 | 
|---|
| 901 |       nSpectres++;
 | 
|---|
| 902 |     }
 | 
|---|
| 903 |   }
 | 
|---|
| 904 |   if(debuglev_>1){
 | 
|---|
| 905 |     cout << "Number of files selected for gain " << nSpectres <<endl;
 | 
|---|
| 906 |   }    
 | 
|---|
| 907 |   if(nSpectres>0) {
 | 
|---|
| 908 |     spectreMean /= nSpectres;
 | 
|---|
| 909 |   } else {
 | 
|---|
| 910 |     stringstream tmp;
 | 
|---|
| 911 |     tmp << threshold;
 | 
|---|
| 912 |     msg = "Gain: cannot find a spectra above threshold value =" + tmp.str() + " ... FATAL";
 | 
|---|
| 913 |     throw msg;
 | 
|---|
| 914 |   }
 | 
|---|
| 915 | 
 | 
|---|
| 916 |   //Save gain spectra
 | 
|---|
| 917 |   {
 | 
|---|
| 918 |     //use ! to override the file: special features of cfitsio library
 | 
|---|
| 919 |     string fileName;
 | 
|---|
| 920 |     //TOBE FIXED   fileName = "!./" + sourceName_ + "/gain_" + dateOfRun_ + "_" + StringToLower(sourceName_) + ".fits";
 | 
|---|
| 921 |     fileName = "!"+ outputPath_ + "/gain_" + dateOfRun_ + "_" + StringToLower(sourceName_) + ".fits";
 | 
|---|
| 922 |     if(debuglev_>1){
 | 
|---|
| 923 |       cout << "save gains in " << fileName << endl;
 | 
|---|
| 924 |     }
 | 
|---|
| 925 |     FitsInOutFile fos(fileName, FitsInOutFile::Fits_Create);
 | 
|---|
| 926 |     fos << spectreMean;
 | 
|---|
| 927 |   }
 | 
|---|
| 928 |   //save mean power values
 | 
|---|
| 929 |   {
 | 
|---|
| 930 |     vector<r_4> tmp;
 | 
|---|
| 931 |     for (iFile = listOfSpecFiles.begin(); iFile != iFileEnd; ++iFile) {
 | 
|---|
| 932 |       tmp.push_back(meanpowerCollect[*iFile]);
 | 
|---|
| 933 |     }
 | 
|---|
| 934 |     string fileName;
 | 
|---|
| 935 |     //TOBE FIXED    fileName = "./" + sourceName_ + "/gain_monitor_" + dateOfRun_ 
 | 
|---|
| 936 |     fileName = outputPath_ + "/gain_monitor_" + dateOfRun_ + "_" + StringToLower(sourceName_) + ".ppf";
 | 
|---|
| 937 |     POutPersist fos(fileName); 
 | 
|---|
| 938 |     TVector<r_4> tvtmp(tmp);
 | 
|---|
| 939 |     fos.PutObject(tvtmp,"gainmoni");
 | 
|---|
| 940 |   }
 | 
|---|
| 941 |   
 | 
|---|
| 942 | 
 | 
|---|
| 943 |   cout << "OK gain finished" <<endl;
 | 
|---|
| 944 |    return rc;
 | 
|---|
| 945 | }//ProcessGain::processCmd
 | 
|---|
| 946 | //
 | 
|---|
| 947 | //----------------------------------------------
 | 
|---|
| 948 | //
 | 
|---|
| 949 | int ProcessCalibration::processCmd() throw(string) {
 | 
|---|
| 950 |   int rc = 0;
 | 
|---|
| 951 |   string msg = "";
 | 
|---|
| 952 | 
 | 
|---|
| 953 |   try {
 | 
|---|
| 954 |     rc = ProcessBase::processCmd();
 | 
|---|
| 955 |   } 
 | 
|---|
| 956 |   catch (string s) {
 | 
|---|
| 957 |     throw s;
 | 
|---|
| 958 |   }
 | 
|---|
| 959 |   if(debuglev_>0)cout << "Process Calibration with option "<< option_ << endl;
 | 
|---|
| 960 |   
 | 
|---|
| 961 |   vector<string> modeList;
 | 
|---|
| 962 |   modeList.push_back("On");
 | 
|---|
| 963 |   modeList.push_back("Off");
 | 
|---|
| 964 | 
 | 
|---|
| 965 |   r_8 t0absolute = -1;  //TIMEWIN of the first spectra used
 | 
|---|
| 966 |   r_8 timeTag0   = -1;   //MEANTT, mean TIME TAG of the first paquet window  
 | 
|---|
| 967 |   bool first = true;     // for initialisation
 | 
|---|
| 968 |   
 | 
|---|
| 969 |   // Power Tuple
 | 
|---|
| 970 |   // mode, cycle, time, {Ch0, ... ,ChN} mean poser in the range [f0-Bw/2, f0+Bw/2] 
 | 
|---|
| 971 |   vector<string> varPowerTupleName; //ntuple variable naming
 | 
|---|
| 972 |   varPowerTupleName.push_back("mode");
 | 
|---|
| 973 |   varPowerTupleName.push_back("cycle");  
 | 
|---|
| 974 |   varPowerTupleName.push_back("time");
 | 
|---|
| 975 |   for (sa_size_t iCh=0; iCh<NUMBER_OF_CHANNELS;++iCh){
 | 
|---|
| 976 |     stringstream tmp;
 | 
|---|
| 977 |     tmp << iCh;
 | 
|---|
| 978 |     varPowerTupleName.push_back("Ch"+tmp.str());
 | 
|---|
| 979 |   }
 | 
|---|
| 980 |   r_4 valPowerTuple[varPowerTupleName.size()];
 | 
|---|
| 981 |   NTuple powerEvolution(varPowerTupleName); 
 | 
|---|
| 982 |   
 | 
|---|
| 983 |   
 | 
|---|
| 984 |   //-----------------
 | 
|---|
| 985 |   //Start real process
 | 
|---|
| 986 |   //------------------
 | 
|---|
| 987 |   for (size_t iMode = 0; iMode < modeList.size(); ++iMode) {
 | 
|---|
| 988 |     string mode = modeList[iMode];
 | 
|---|
| 989 |     if(debuglev_>0)cout << "Process Calibration for Mode " << mode << endl;
 | 
|---|
| 990 | 
 | 
|---|
| 991 |     //initialize the start of each calibration procedure given by the RT SCA file
 | 
|---|
| 992 |     //see ProcessBase::processCmd for the structure of the sca file
 | 
|---|
| 993 |     string scaStartCalibName = "stcal"+mode; 
 | 
|---|
| 994 |     sa_size_t idStartCalib   = scaTuple_->ColumnIndex(scaStartCalibName);
 | 
|---|
| 995 | 
 | 
|---|
| 996 |     string directoryName;
 | 
|---|
| 997 |     list<string> listOfSpecFiles;
 | 
|---|
| 998 |     list<string>::const_iterator iFile, iFileEnd;            
 | 
|---|
| 999 |     //
 | 
|---|
| 1000 |     //loop on cycles
 | 
|---|
| 1001 |     //
 | 
|---|
| 1002 |     for (sa_size_t icycle = ifirstCycle_; icycle <= ilastCycle_; icycle++) {
 | 
|---|
| 1003 | 
 | 
|---|
| 1004 |       directoryName = inputPath_ + "/" 
 | 
|---|
| 1005 |         + sourceName_ + "/"+ dateOfRun_ + StringToLower(sourceName_) + "/" +mode + "/";
 | 
|---|
| 1006 |       stringstream sicycle;
 | 
|---|
| 1007 |       sicycle << icycle;
 | 
|---|
| 1008 |       directoryName += spectraDirectory_ + sicycle.str() + "/";
 | 
|---|
| 1009 |       
 | 
|---|
| 1010 |       //read directory
 | 
|---|
| 1011 |       listOfSpecFiles = ListOfFileInDir(directoryName,typeOfFile_);
 | 
|---|
| 1012 | 
 | 
|---|
| 1013 |       iFileEnd = listOfSpecFiles.end();
 | 
|---|
| 1014 |       DVList header;
 | 
|---|
| 1015 |       TMatrix<r_4> spectre(NUMBER_OF_CHANNELS,NUMBER_OF_FREQ); //implicit init to 0
 | 
|---|
| 1016 | 
 | 
|---|
| 1017 |       for (iFile = listOfSpecFiles.begin(); iFile != iFileEnd; ++iFile) {
 | 
|---|
| 1018 |         FitsInOutFile aSpectrum(*iFile,FitsInOutFile::Fits_RO);
 | 
|---|
| 1019 |         aSpectrum.GetHeaderRecords(header);
 | 
|---|
| 1020 |         aSpectrum >> spectre;
 | 
|---|
| 1021 | 
 | 
|---|
| 1022 |         if(first){//initialise the timer
 | 
|---|
| 1023 |           first = false;
 | 
|---|
| 1024 |           t0absolute = header.GetD("TIMEWIN")/1000.;
 | 
|---|
| 1025 |           timeTag0 = header.GetD("MEANTT");
 | 
|---|
| 1026 |           if (debuglev_>1){
 | 
|---|
| 1027 |             cout << "debug Header of " << *iFile << endl;
 | 
|---|
| 1028 |             cout << "TIMEWIN = " << setprecision(12) << t0absolute << " "
 | 
|---|
| 1029 |                  << "MEANTT = " << setprecision(12) << timeTag0 << endl;
 | 
|---|
| 1030 |           }
 | 
|---|
| 1031 |         }//end init timer
 | 
|---|
| 1032 |         
 | 
|---|
| 1033 |         //Set time of current file
 | 
|---|
| 1034 |         //Add to the non-precise absolute origin an precise increment
 | 
|---|
| 1035 |         r_4 timeTag = t0absolute + (header.GetD("MEANTT") - timeTag0);
 | 
|---|
| 1036 |         int index=0;
 | 
|---|
| 1037 |         valPowerTuple[index++] = iMode;
 | 
|---|
| 1038 |         valPowerTuple[index++] = icycle;
 | 
|---|
| 1039 |         valPowerTuple[index++] = timeTag-scaTuple_->GetCell(idCycleInTuple_[icycle],idStartCalib); //take the RT time start as refernce 
 | 
|---|
| 1040 | 
 | 
|---|
| 1041 |         //Compute the mean power of the two channel (separatly) in the range [f-bw/2, f+bw/2]
 | 
|---|
| 1042 |         for (sa_size_t iCh=0; iCh<NUMBER_OF_CHANNELS;++iCh){
 | 
|---|
| 1043 |           TMatrix<r_4> tmp(spectre(Range(iCh),Range(lowerFreqBin_,upperFreqBin_)),false);
 | 
|---|
| 1044 |           r_4 mean = tmp.Sum()/(r_4)tmp.Size();
 | 
|---|
| 1045 |           valPowerTuple[index++] = mean;
 | 
|---|
| 1046 |         }//end of channel loop
 | 
|---|
| 1047 |        
 | 
|---|
| 1048 |         //Fill Tuple
 | 
|---|
| 1049 |         powerEvolution.Fill(valPowerTuple);
 | 
|---|
| 1050 |       }//end of files loop
 | 
|---|
| 1051 |     }//end of cycles loop
 | 
|---|
| 1052 |   }//end of mode loop
 | 
|---|
| 1053 | 
 | 
|---|
| 1054 |   //store power evolution Tuple
 | 
|---|
| 1055 |   if(debuglev_>0){
 | 
|---|
| 1056 |     cout << "ProcessCalibration::processCmd: dump powerEvolution tuple" << endl;
 | 
|---|
| 1057 |     powerEvolution.Show(cout);
 | 
|---|
| 1058 |   }
 | 
|---|
| 1059 |   //
 | 
|---|
| 1060 |   //Compute Calibration Coefficients as function of mode/cycle/channels
 | 
|---|
| 1061 |   //
 | 
|---|
| 1062 | 
 | 
|---|
| 1063 |   //Tsys,Incremant Intensity... Tuple
 | 
|---|
| 1064 |   //mode mode cycle [(tsys0,dint0),...,(tsysN,dintN)]
 | 
|---|
| 1065 |   vector<string> varCalibTupleName;
 | 
|---|
| 1066 |   varCalibTupleName.push_back("mode");
 | 
|---|
| 1067 |   varCalibTupleName.push_back("cycle");
 | 
|---|
| 1068 |   for (sa_size_t iCh=0; iCh<NUMBER_OF_CHANNELS;++iCh){
 | 
|---|
| 1069 |     stringstream tmp;
 | 
|---|
| 1070 |     tmp << iCh;
 | 
|---|
| 1071 |     varCalibTupleName.push_back("tsys"+tmp.str());
 | 
|---|
| 1072 |     varCalibTupleName.push_back("dint"+tmp.str());
 | 
|---|
| 1073 |   }
 | 
|---|
| 1074 |   r_4 valCalibTuple[varCalibTupleName.size()];
 | 
|---|
| 1075 |   NTuple calibEvolution(varCalibTupleName);
 | 
|---|
| 1076 | 
 | 
|---|
| 1077 |   // select time E [twin0,twin1] U [twin2,twin3] for Tsys
 | 
|---|
| 1078 |   // time unit = second 
 | 
|---|
| 1079 |   const r_4 twin0 = -3.;
 | 
|---|
| 1080 |   const r_4 twin1 = -1.;
 | 
|---|
| 1081 |   const r_4 twin2 =  6.;
 | 
|---|
| 1082 |   const r_4 twin3 =  8;
 | 
|---|
| 1083 |   const r_4 thresholdFactor = 0.80; //80% of the diff. Max-Min intensity
 | 
|---|
| 1084 | 
 | 
|---|
| 1085 |   sa_size_t inModeIdx = powerEvolution.ColumnIndex("mode");
 | 
|---|
| 1086 |   sa_size_t inCycleIdx= powerEvolution.ColumnIndex("cycle");
 | 
|---|
| 1087 |   sa_size_t inTimeIdx = powerEvolution.ColumnIndex("time");
 | 
|---|
| 1088 |   sa_size_t inOffsetCh0 = powerEvolution.ColumnIndex("Ch0"); //nb Ch0 position in the powerEvolution tuple  
 | 
|---|
| 1089 |   if(debuglev_>1) cout << "DEBUG: in Idx: (" 
 | 
|---|
| 1090 |                        << inModeIdx << ", "
 | 
|---|
| 1091 |                        << inCycleIdx << ", "
 | 
|---|
| 1092 |                        << inTimeIdx << ", "
 | 
|---|
| 1093 |                        << inOffsetCh0 << ")"
 | 
|---|
| 1094 |                        << endl;
 | 
|---|
| 1095 | 
 | 
|---|
| 1096 |  
 | 
|---|
| 1097 |   size_t outModeIdx = calibEvolution.ColumnIndex("mode");
 | 
|---|
| 1098 |   size_t outCycleIdx= calibEvolution.ColumnIndex("cycle");
 | 
|---|
| 1099 |   size_t outOffsetCh0 = calibEvolution.ColumnIndex("tsys0"); //nb Ch0 position in the monitor tuple  
 | 
|---|
| 1100 |   size_t outNDataPerCh= 2;
 | 
|---|
| 1101 |   if(debuglev_>1)  cout << "DEBUG: out Idx: (" 
 | 
|---|
| 1102 |                         << outModeIdx << ", "
 | 
|---|
| 1103 |                         << outCycleIdx << ", "
 | 
|---|
| 1104 |                         << outOffsetCh0 << ")"
 | 
|---|
| 1105 |                         << endl;
 | 
|---|
| 1106 | 
 | 
|---|
| 1107 |   sa_size_t nPowerEvolEntry = powerEvolution.NEntry();
 | 
|---|
| 1108 |   double minMode;
 | 
|---|
| 1109 |   double maxMode;
 | 
|---|
| 1110 |   powerEvolution.GetMinMax("mode",minMode,maxMode);
 | 
|---|
| 1111 |   double minCycleNum;
 | 
|---|
| 1112 |   double maxCycleNum;
 | 
|---|
| 1113 |   powerEvolution.GetMinMax("cycle",minCycleNum,maxCycleNum);
 | 
|---|
| 1114 |   if(debuglev_>1)  cout << "DEBUG mode ("<<minMode<<","<<maxMode<<")\n"
 | 
|---|
| 1115 |                         << "cycle ("<<minCycleNum<<","<<maxCycleNum<<")"
 | 
|---|
| 1116 |                         << endl;
 | 
|---|
| 1117 | 
 | 
|---|
| 1118 |   r_4* aPowerEvolEntry; // a ligne of the powerEvolution tuple
 | 
|---|
| 1119 | //   r_4* aPowerEvolEntry = new r_4[powerEvolution.NbColumns()]; // a ligne of the powerEvolution tuple
 | 
|---|
| 1120 | 
 | 
|---|
| 1121 |   r_4 minMean;
 | 
|---|
| 1122 |   r_4 maxMean;
 | 
|---|
| 1123 | 
 | 
|---|
| 1124 |   for (size_t iMode = (size_t)minMode; iMode <= (size_t)maxMode; iMode++){
 | 
|---|
| 1125 |     for (size_t iCycle = (size_t)minCycleNum; iCycle <= (size_t)maxCycleNum; iCycle++ ){
 | 
|---|
| 1126 |       if(debuglev_>1) cout<<"DEBUG >>>>>>> mode/cycle: " << iMode << "/" << iCycle << endl;
 | 
|---|
| 1127 |  
 | 
|---|
| 1128 |       valCalibTuple[outModeIdx]=iMode;
 | 
|---|
| 1129 |       valCalibTuple[outCycleIdx]=iCycle;
 | 
|---|
| 1130 |       //
 | 
|---|
| 1131 |       //Compute the Min && Max value of each Ch<i> data
 | 
|---|
| 1132 |       if(debuglev_>1) cout<<"DEBUG compute Min and Max for each channels" << endl;
 | 
|---|
| 1133 |       //
 | 
|---|
| 1134 |       TVector<r_4> chMean[NUMBER_OF_CHANNELS];
 | 
|---|
| 1135 |       for (sa_size_t iCh=0;iCh<NUMBER_OF_CHANNELS;iCh++){
 | 
|---|
| 1136 |         chMean[iCh].SetSize(nPowerEvolEntry);
 | 
|---|
| 1137 |       }
 | 
|---|
| 1138 |       for (sa_size_t ie=0; ie<nPowerEvolEntry; ie++){
 | 
|---|
| 1139 |         aPowerEvolEntry = powerEvolution.GetVec(ie);
 | 
|---|
| 1140 |         if ( (size_t)aPowerEvolEntry[inModeIdx] == iMode && (size_t)aPowerEvolEntry[inCycleIdx] == iCycle ){
 | 
|---|
| 1141 |           for (sa_size_t iCh=0;iCh<NUMBER_OF_CHANNELS;iCh++){
 | 
|---|
| 1142 |             chMean[iCh](ie) = aPowerEvolEntry[iCh+inOffsetCh0];
 | 
|---|
| 1143 |           }//end cut
 | 
|---|
| 1144 |         }
 | 
|---|
| 1145 |       }//eo loop on tuple entries
 | 
|---|
| 1146 |       for (sa_size_t iCh=0;iCh<NUMBER_OF_CHANNELS;iCh++){
 | 
|---|
| 1147 |         //
 | 
|---|
| 1148 |         //select values to compute background Tsys
 | 
|---|
| 1149 |         if(debuglev_>1) {
 | 
|---|
| 1150 |           cout<< "DEBUG >>>> Ch[" << iCh << "]" << endl;
 | 
|---|
| 1151 |           cout<< "DEBUG select values to compute background Tsys " << endl;
 | 
|---|
| 1152 |         }
 | 
|---|
| 1153 |         //
 | 
|---|
| 1154 |        
 | 
|---|
| 1155 |         std::vector<r_4> lowerInt;
 | 
|---|
| 1156 |         for (sa_size_t ie=0; ie<nPowerEvolEntry; ie++){
 | 
|---|
| 1157 |           aPowerEvolEntry = powerEvolution.GetVec(ie);
 | 
|---|
| 1158 |           if ( (size_t)aPowerEvolEntry[inModeIdx] == iMode && (size_t)aPowerEvolEntry[inCycleIdx] == iCycle ){
 | 
|---|
| 1159 |             r_4 time = aPowerEvolEntry[inTimeIdx];
 | 
|---|
| 1160 |             if ( (time >= twin0 && time <= twin1) ||
 | 
|---|
| 1161 |                  (time >= twin2 && time <= twin3)
 | 
|---|
| 1162 |                  ) lowerInt.push_back(aPowerEvolEntry[iCh+inOffsetCh0]);
 | 
|---|
| 1163 |           }//end cut
 | 
|---|
| 1164 |         } //end loop entries
 | 
|---|
| 1165 |         //
 | 
|---|
| 1166 |         //compute the Tsys
 | 
|---|
| 1167 |         if(debuglev_>1) cout <<"DEBUG compute Tsys" << endl;
 | 
|---|
| 1168 |         //
 | 
|---|
| 1169 |         std::nth_element(lowerInt.begin(),
 | 
|---|
| 1170 |                          lowerInt.begin()+lowerInt.size()/2,
 | 
|---|
| 1171 |                          lowerInt.end());
 | 
|---|
| 1172 |         r_4 tsys = *(lowerInt.begin()+lowerInt.size()/2);
 | 
|---|
| 1173 |         if(debuglev_>1) cout << "DEBUG tsys["<<iCh<<"] : " << tsys <<endl;
 | 
|---|
| 1174 |         //
 | 
|---|
| 1175 |         //set the threshold for DAB detection
 | 
|---|
| 1176 |         //
 | 
|---|
| 1177 |         chMean[iCh].MinMax(minMean,maxMean);
 | 
|---|
| 1178 |         minMean = (tsys > minMean) ? tsys : minMean; //pb of empty vector
 | 
|---|
| 1179 |         if(debuglev_>1) cout << "DEBUG min["<<iCh<<"] : " << minMean
 | 
|---|
| 1180 |                              << " max["<<iCh<<"] : " << maxMean
 | 
|---|
| 1181 |                              <<endl;
 | 
|---|
| 1182 |         r_4 deltathres = thresholdFactor * (maxMean-minMean);
 | 
|---|
| 1183 |         r_4 thres =  tsys + deltathres;
 | 
|---|
| 1184 |         if(debuglev_>1) cout << "DEBUG thres["<<iCh<<"] : " << thres <<endl;
 | 
|---|
| 1185 |         //
 | 
|---|
| 1186 |         //collect upper part of the DAB
 | 
|---|
| 1187 |         if(debuglev_>1) cout <<"DEBUG collect upper part of the DAB" << endl;
 | 
|---|
| 1188 |         //
 | 
|---|
| 1189 |         std::vector<r_4> upperInt;
 | 
|---|
| 1190 |         for (sa_size_t ie=0; ie<nPowerEvolEntry; ie++){
 | 
|---|
| 1191 |           aPowerEvolEntry = powerEvolution.GetVec(ie);
 | 
|---|
| 1192 |           if ( (size_t)aPowerEvolEntry[inModeIdx] == iMode && (size_t)aPowerEvolEntry[inCycleIdx] == iCycle ){
 | 
|---|
| 1193 |             r_4 mean = aPowerEvolEntry[iCh+inOffsetCh0];
 | 
|---|
| 1194 |             if (mean >= thres) upperInt.push_back(mean);
 | 
|---|
| 1195 |           }//end cut
 | 
|---|
| 1196 |         }//eo loop on channels
 | 
|---|
| 1197 |         //
 | 
|---|
| 1198 |         //compute adjacent differences to detect the 2 DAB levels
 | 
|---|
| 1199 |         //
 | 
|---|
| 1200 |         if(debuglev_>1) cout << "(DEBUG )size upper [" << iCh << "]: " << upperInt.size() <<endl;
 | 
|---|
| 1201 |         std::vector<r_4> upperIntAdjDiff(upperInt.size());
 | 
|---|
| 1202 |         std::adjacent_difference(upperInt.begin(),
 | 
|---|
| 1203 |                                  upperInt.end(),
 | 
|---|
| 1204 |                                  upperIntAdjDiff.begin());
 | 
|---|
| 1205 |         //
 | 
|---|
| 1206 |         //Search the 2 DAB states
 | 
|---|
| 1207 |         if(debuglev_>1) cout<<"DEBUG Search the 2 DAB states" << endl;
 | 
|---|
| 1208 |         //
 | 
|---|
| 1209 |         std::vector<r_4> upIntState[2];
 | 
|---|
| 1210 |         int state=-1;
 | 
|---|
| 1211 |         for (size_t i=1;i<upperInt.size();i++) {//skip first value
 | 
|---|
| 1212 |           if (fabs(upperIntAdjDiff[i])<upperInt[i]*0.010) {
 | 
|---|
| 1213 |             if(state == -1) state=0;
 | 
|---|
| 1214 |             if(state == -2) state=1;
 | 
|---|
| 1215 |             upIntState[state].push_back(upperInt[i]);
 | 
|---|
| 1216 |           } else {
 | 
|---|
| 1217 |             if (state == 0) state=-2;
 | 
|---|
| 1218 |           }
 | 
|---|
| 1219 |         }
 | 
|---|
| 1220 |         //
 | 
|---|
| 1221 |         //Take the mean of the median values of each levels
 | 
|---|
| 1222 |         if(debuglev_>1)cout << "DEBUG mean of the median values of each levels" << endl;       
 | 
|---|
| 1223 |         //
 | 
|---|
| 1224 |         r_4 meanUpper = 0;
 | 
|---|
| 1225 |         r_4 nval = 0;
 | 
|---|
| 1226 |         for (int i=0;i<2;i++) {
 | 
|---|
| 1227 |           if (!upIntState[i].empty()) {
 | 
|---|
| 1228 |             std::nth_element(upIntState[i].begin(),
 | 
|---|
| 1229 |                              upIntState[i].begin()+upIntState[i].size()/2,
 | 
|---|
| 1230 |                              upIntState[i].end());
 | 
|---|
| 1231 |             meanUpper += *(upIntState[i].begin()+upIntState[i].size()/2);
 | 
|---|
| 1232 |             nval++;
 | 
|---|
| 1233 |           } 
 | 
|---|
| 1234 |         }
 | 
|---|
| 1235 |         meanUpper /= nval;
 | 
|---|
| 1236 |         //
 | 
|---|
| 1237 |         //Finaly the increase of power due to the DAB is:
 | 
|---|
| 1238 |         //
 | 
|---|
| 1239 |         r_4 deltaInt = meanUpper - tsys;
 | 
|---|
| 1240 |         if(debuglev_>1) cout << "DEBUG deltaInt["<<iCh<<"] : " << deltaInt <<endl;
 | 
|---|
| 1241 |         //
 | 
|---|
| 1242 |         //Save for monitoring and final calibration operations
 | 
|---|
| 1243 |         //
 | 
|---|
| 1244 |         valCalibTuple[outOffsetCh0+outNDataPerCh*iCh]   = tsys;
 | 
|---|
| 1245 |         valCalibTuple[outOffsetCh0+outNDataPerCh*iCh+1] = deltaInt;
 | 
|---|
| 1246 |       }//end loop on channels
 | 
|---|
| 1247 |       if(debuglev_>1) cout<<"DEBUG Fill the calibEvolution tuple" << endl;
 | 
|---|
| 1248 |       calibEvolution.Fill(valCalibTuple);
 | 
|---|
| 1249 |     }//eo loop on Cycles
 | 
|---|
| 1250 |   }//eo loop on Modes
 | 
|---|
| 1251 |   //
 | 
|---|
| 1252 |   //store calibration evolution Tuple
 | 
|---|
| 1253 |   //
 | 
|---|
| 1254 |   if(debuglev_>0){
 | 
|---|
| 1255 |     cout << "ProcessCalibration::processCmd: dump calibEvolution tuple" << endl;
 | 
|---|
| 1256 |     calibEvolution.Show(cout);
 | 
|---|
| 1257 |   }
 | 
|---|
| 1258 |   //
 | 
|---|
| 1259 |   //Compute the means per channel of the calibration coefficients (deltaInt)
 | 
|---|
| 1260 |   //and save cycle based Calibration Ctes in file named as 
 | 
|---|
| 1261 |   //    <source>-<date>-<mode>-<fcalib>MHz-Ch<channel>Cycles.txt
 | 
|---|
| 1262 |   //   format <cycle> <coef> 
 | 
|---|
| 1263 |   //the means are stored in files     
 | 
|---|
| 1264 |   //    <source>-<date>-<mode>-<fcalib>MHz-All.txt
 | 
|---|
| 1265 |   //   format <channel> <coef>
 | 
|---|
| 1266 |   //
 | 
|---|
| 1267 |   sa_size_t nModes = (sa_size_t)(maxMode - minMode) + 1;
 | 
|---|
| 1268 |   string calibCoefFileName;
 | 
|---|
| 1269 |   ofstream  calibMeanCoefFile[nModes]; //Mean over cycles
 | 
|---|
| 1270 |   ofstream  calibCoefFile[nModes][NUMBER_OF_CHANNELS]; //cycle per cycle
 | 
|---|
| 1271 |   for (sa_size_t iMode=0; iMode<nModes; iMode++){
 | 
|---|
| 1272 |     //The file for the Means Coeff.
 | 
|---|
| 1273 |     calibCoefFileName = outputPath_ + "/calib_" 
 | 
|---|
| 1274 |       + dateOfRun_ + "_" + StringToLower(sourceName_) + "_"
 | 
|---|
| 1275 |       + modeList[iMode] + "_"
 | 
|---|
| 1276 |       + freqBAOCalibration_ + "MHz-All.txt";
 | 
|---|
| 1277 |     calibMeanCoefFile[iMode].open(calibCoefFileName.c_str());
 | 
|---|
| 1278 |     //The file for the cycle per cycle Coeff.
 | 
|---|
| 1279 |     for (sa_size_t iCh=0; iCh<NUMBER_OF_CHANNELS; iCh++){
 | 
|---|
| 1280 |       stringstream chString;
 | 
|---|
| 1281 |       chString << iCh;
 | 
|---|
| 1282 |       calibCoefFileName = outputPath_ + "/calib_" 
 | 
|---|
| 1283 |         + dateOfRun_ + "_" + StringToLower(sourceName_) + "_"
 | 
|---|
| 1284 |         + modeList[iMode] + "_"
 | 
|---|
| 1285 |         + freqBAOCalibration_ + "MHz-Ch" + chString.str() + "Cycles.txt";
 | 
|---|
| 1286 |       calibCoefFile[iMode][iCh].open(calibCoefFileName.c_str());
 | 
|---|
| 1287 |     }
 | 
|---|
| 1288 |   }
 | 
|---|
| 1289 | 
 | 
|---|
| 1290 |   r_4* aCalibEvolEntry;
 | 
|---|
| 1291 |   sa_size_t nCalibEvolEntry = calibEvolution.NEntry();
 | 
|---|
| 1292 | 
 | 
|---|
| 1293 |   TMatrix<r_4> meanCalibCoef(nModes,NUMBER_OF_CHANNELS); //by default init to 0
 | 
|---|
| 1294 |   TMatrix<r_4> nData4Mean(nModes,NUMBER_OF_CHANNELS);
 | 
|---|
| 1295 | 
 | 
|---|
| 1296 |   //READ the calibration tuple, fill the array for mean and write to ascii file
 | 
|---|
| 1297 |   for (sa_size_t ie=0; ie<nCalibEvolEntry; ie++){
 | 
|---|
| 1298 |     aCalibEvolEntry = calibEvolution.GetVec(ie);
 | 
|---|
| 1299 |     if(debuglev_>1){
 | 
|---|
| 1300 |       cout << "DEBUG mode/cycle/Coef " 
 | 
|---|
| 1301 |            << aCalibEvolEntry[outModeIdx] << " "
 | 
|---|
| 1302 |            << aCalibEvolEntry[outCycleIdx] << " ";
 | 
|---|
| 1303 |     }
 | 
|---|
| 1304 |     for (sa_size_t iCh=0; iCh<NUMBER_OF_CHANNELS; iCh++){
 | 
|---|
| 1305 |       if(debuglev_>1) cout << aCalibEvolEntry[outOffsetCh0+outNDataPerCh*iCh+1] << " "; // for debug
 | 
|---|
| 1306 |       sa_size_t currentMode = (sa_size_t)(aCalibEvolEntry[outModeIdx] - minMode); //ok even if minMode <> 0
 | 
|---|
| 1307 |       nData4Mean(currentMode,iCh)++;
 | 
|---|
| 1308 |       meanCalibCoef(currentMode,iCh) += aCalibEvolEntry[outOffsetCh0+outNDataPerCh*iCh+1];
 | 
|---|
| 1309 | 
 | 
|---|
| 1310 |       calibCoefFile[currentMode][iCh] << aCalibEvolEntry[outCycleIdx] << " "
 | 
|---|
| 1311 |                                       << setprecision(12)
 | 
|---|
| 1312 |                                       << aCalibEvolEntry[outOffsetCh0+outNDataPerCh*iCh+1]
 | 
|---|
| 1313 |                                       << endl;
 | 
|---|
| 1314 |     }
 | 
|---|
| 1315 |     if(debuglev_>1) cout << endl; //for debug
 | 
|---|
| 1316 |   }
 | 
|---|
| 1317 |   
 | 
|---|
| 1318 |   //Perform means: true means that div per 0 is treated (slower but safer) 
 | 
|---|
| 1319 |   meanCalibCoef.Div(nData4Mean,true);
 | 
|---|
| 1320 |   
 | 
|---|
| 1321 |   if(debuglev_>0){
 | 
|---|
| 1322 |     cout << "DEBUG nData4Mean" << endl;
 | 
|---|
| 1323 |     nData4Mean.Print(cout);
 | 
|---|
| 1324 |     cout << "DEBUG meanCalibCoef (averaged)" << endl;
 | 
|---|
| 1325 |     meanCalibCoef.Print(cout);
 | 
|---|
| 1326 |   }
 | 
|---|
| 1327 | 
 | 
|---|
| 1328 |   //Save means Coef
 | 
|---|
| 1329 |   for (sa_size_t iMode=0; iMode<nModes; iMode++){
 | 
|---|
| 1330 |     for (sa_size_t iCh=0; iCh<NUMBER_OF_CHANNELS; iCh++){
 | 
|---|
| 1331 |       calibMeanCoefFile[iMode] << setprecision(12)
 | 
|---|
| 1332 |                                << meanCalibCoef(iMode,iCh)
 | 
|---|
| 1333 |                                << endl;
 | 
|---|
| 1334 |     }
 | 
|---|
| 1335 |   }
 | 
|---|
| 1336 | 
 | 
|---|
| 1337 |   //Save Monitor File
 | 
|---|
| 1338 |   {
 | 
|---|
| 1339 |     string fileName = outputPath_ + "/calib_monitor_" + dateOfRun_ + "_" + StringToLower(sourceName_) + ".ppf";
 | 
|---|
| 1340 |     POutPersist calibMonitorFile(fileName);
 | 
|---|
| 1341 |     calibMonitorFile << PPFNameTag("powermoni") <<  powerEvolution;
 | 
|---|
| 1342 |     calibMonitorFile << PPFNameTag("calibmoni") <<  calibEvolution;
 | 
|---|
| 1343 |   }
 | 
|---|
| 1344 | 
 | 
|---|
| 1345 |   //Clean & Return
 | 
|---|
| 1346 |   for (sa_size_t iMode=0; iMode<nModes; iMode++){
 | 
|---|
| 1347 |     calibMeanCoefFile[iMode].close();
 | 
|---|
| 1348 |     for (sa_size_t iCh=0; iCh<NUMBER_OF_CHANNELS; iCh++){
 | 
|---|
| 1349 |       calibCoefFile[iMode][iCh].close();
 | 
|---|
| 1350 |     }
 | 
|---|
| 1351 |   }
 | 
|---|
| 1352 | 
 | 
|---|
| 1353 |   cout << "Ok calibration finished" << endl;  
 | 
|---|
| 1354 |   return rc;
 | 
|---|
| 1355 | }//ProcessCalibration::processCmd
 | 
|---|
| 1356 | 
 | 
|---|