--- chewbacca/PamOffLineSW/PamOffLineSW_Main.cpp 2008/11/04 09:44:33 1.2 +++ chewbacca/PamOffLineSW/PamOffLineSW_Main.cpp 2010/02/11 09:02:10 1.10 @@ -1,5 +1,5 @@ //============================================================================ -// $Id: PamOffLineSW_Main.cpp,v 1.52 2008-09-12 14:03:55 messineo Exp $ +// $Id: PamOffLineSW_Main.cpp,v 1.9 2010/02/02 15:26:09 mocchiut Exp $ // Description : Pamela Off-Line Software //============================================================================ @@ -8,6 +8,7 @@ #include "StateManager.h" #include "PacketUser.h" +#include extern "C" { #include @@ -42,29 +43,40 @@ //global variables bool simulated_data = false; -bool do_vrl_check = false; +//bool do_vrl_check = false; //EMI +bool do_vrl_check = true; //EMI -char* db_host = ""; + +const char* db_host = ""; int db_port = 0; -char* db_name = ""; +const char* db_name = ""; char conn[100]=""; LogUtil::logLevel loglevel=LogUtil::LOGERROR; -char* logfilename = "chewbacca.log"; +const char* logfilename = "chewbacca.log"; //current route int route = 999; //previous route int old_route = 999; +Long64_t filelength = 0LL; +Long64_t streamposi = 0LL; +Long64_t streamposisaved = 0LL; +Int_t numposi = 10; +Long64_t downcount = 1LL; +TArrayL64 *dwin=new TArrayL64(12); +Long64_t cadcount = 0LL; +Int_t horrorcount = 0; + bool skip_cadre = false; long int iNumGoodCadres=0; //total number of good cadres // global variables used in all the project namespace PamOffLineSW { - char* db_user = ""; - char* db_pwd = ""; - char* connection = NULL; + const char* db_user = ""; + const char* db_pwd = ""; + char* pelosconnection = NULL; //marco_new_01 bool single_connection=false; long int iNumCadres=0; //cadre's number @@ -74,28 +86,36 @@ char* fni; //path completo short compression = 3; // char *outDir = "."; - char *outDir = ""; + const char *outDir = ""; - char * nome_output="chewbacca"; - bool multiFile = 0; - unsigned long int step_pkt_number=0; - unsigned long int step_pkt_obt=0; + // char * nome_output="chewbacca"; //EMI + const char * nome_output="L0PAM";//EMI + bool multiFile = 0; + // unsigned long int step_pkt_number=0; // EMI + unsigned long int step_pkt_number=3000; + // unsigned long int step_pkt_obt=0; // EMI + unsigned long int step_pkt_obt=7200000; // EMI LogUtil* mainLogUtil = NULL; TSQLServer* sqlServer = NULL; unsigned long int max_pkt_number = 16777215;//biggest value before reset unsigned long int max_pkt_obt = 4294967295u;//biggest value before reset - bool is_new_route = false; + // bool is_new_route = false; // EMI + bool is_new_route = true; // EMI ??????????? VA BENE? SECONDO ME SI` unsigned int download = 0; unsigned int orbit_number=0; unsigned int mmm_number = 0;//session_number unsigned long int time_Offset=0; - bool tryMerge = false; + // bool tryMerge = false; + bool tryMerge = true; + bool candelete = true; //EM bool do_cont_check=true;//if do_cont_check is false do not use a DB ... //TODO: now it is unused unsigned long int delta_Time=0;//in seconds +#define TAGVALUELEN 4 + char tag_value[TAGVALUELEN]; } // main: @@ -158,6 +178,8 @@ cout << "\t (-help | --help | -h) print this help and exit \n"; cout << "\t -simu if the input file contains simulated data instead of real data\n"; cout << "\t -vrl if you want to perform the vrl check\n"; + cout << "\t -no-vrl if you DO NOT want to perform the vrl check\n"; + cout << "\t -gpamela gpamela data as input\n"; cout << "\t -filelog set the log filename. [default: chewbacca.log]\n"; cout << "\t -loglevel set the log level. Values: [0,3] (error,warning,info,all) [default:0]\n"; cout << "\t -c set the compression level for the generated ROOT file(s). Values: [0,9] [default = 3]\n"; @@ -176,10 +198,12 @@ cout << "\t -session_number Value of the session number. If 0 this is retrieved from the input file name. [default = 0]\n"; cout << "\t -time_Offset Value of the timeOffset. If 0 this is retrieved using the orbital number. [default = 0]\n"; cout << "\t -tryMerge if you want to try to Merge ROOT files\n"; - //marco_new_01 + cout << "\t -dontMerge if you do not want to try to Merge ROOT files\n"; + cout << "\t -dontDelete if you do not want to delete bad ROOT files from disks\n"; + //marco_new_01 cout << "\t -single_connection if you want to open only one connection to DB.\n"; - // cout << "\t -delta_Time set the allowed difference (seconds) in the Real Time between two root file. [default = 0]\n"; - + cout << "\t -tag if you want add the 'The owner of the file' - the tag lenght is 4 char\n"; + // cout << "\t -delta_Time set the allowed difference (seconds) in the Real Time between two root file. [default = 0]\n"; //cout << "\t -multi generate multiple root files \n"; exit(1); } @@ -198,6 +222,9 @@ exit(1); } + //input file + fni= argv[1]; + for (int i = 2; i < argc; i++) { //marco_new_01 @@ -213,6 +240,18 @@ tryMerge = true; continue; } + + if (!strcmp(argv[i], "-dontMerge")) // EMI + { + tryMerge = false; + continue; + } + + if (!strcmp(argv[i], "-dontDelete")) // EMI + { + candelete = false; + continue; + } if (!strcmp(argv[i], "-time_Offset")){ if (++i >= argc){ @@ -300,7 +339,21 @@ simulated_data = true; continue; } + + if (!strcmp(argv[i], "-gpamela")) + { + simulated_data = true; + do_vrl_check = false; + nome_output = (char *)gSystem->BaseName(fni); + tryMerge = false; + candelete = false; + continue; + } + if (!strcmp(argv[i], "-no-vrl")) //EMI + { + do_vrl_check = false; + } if (!strcmp(argv[i], "-vrl")) { do_vrl_check = true; @@ -364,7 +417,7 @@ exit(1); } DIR* tempdir; - if ((tempdir = opendir(argv[i])) != 0) { + if ((tempdir = opendir(gSystem->ExpandPathName(argv[i]))) != 0) { // EMI outDir = argv[i]; closedir(tempdir); } else { @@ -488,17 +541,25 @@ db_pwd = argv[i]; continue; } - + if (!strcmp(argv[i], "-tag")){ + if (++i >= argc){ + cerr << "-tag needs arguments. \n"; + cout << "Try '-help' for more information. \n"; + exit(1); + } + int len=strlen(argv[i])>TAGVALUELEN?TAGVALUELEN:strlen(argv[i]); + strncpy(tag_value,argv[i],len); + tag_value[len]=0; + continue; + } + //TODO: check that multiFile is always 0 // if (!strcmp(argv[i], "-multi")){multiFile = 1; cout<<"debug: multi= "<logAlways(msg); } @@ -634,8 +695,10 @@ string msg = "Input file: " + (string)fni; mainLogUtil->logAlways(msg); - msg = "Output directory for the generated root file(s): " + (string)outDir; + msg = "Output directory for the generated root file(s): " + (string)outDir; mainLogUtil->logAlways(msg); + msg = "Output directory for the generated root file(s) expanded: " + (string)gSystem->ExpandPathName(outDir); // EMI + mainLogUtil->logAlways(msg); //EMI msg = "Output root name for the generated root file(s): " + (string)nome_output; mainLogUtil->logAlways(msg); @@ -791,13 +854,72 @@ ifstream fin; fin.open(fni, ifstream::binary); if (!fin) {cout<<"Can not open input file "< 5LL ) dwin->Set(2LL+2LL*downcount); + dwin->Reset(); + dwin->AddAt(0LL,0); + // + Int_t dco = 1; + // + for (Int_t ee=1; ee<(-1+2+2*downcount); ee+=2){ + dwin->AddAt(((downsize*(dco-1))+hwint),ee); + dwin->AddAt(((downsize*dco)-hwint),ee+1); + dco++; + }; + // + fin.seekg(0,std::ios::beg); + // + dwin->AddAt(filelength,(-1LL+2LL+2LL*downcount)); + // + // printf(" file lenght is %L downcount is %L downsize is %L hwint is %L \n",filelength,downcount,downsize,hwint); + stringstream ess; + ess.str() = ""; + ess << " (EM) " << " file lenght is "<< filelength<< " downcount is "<< downcount <<" downsize is "<< downsize <<" hwint is " << hwint; + string emsg = ess.str(); + mainLogUtil->logInfo(emsg); + // + // cout << " file lenght is "<< filelength<< " downcount is "<< downcount <<" downsize is "<< downsize <<" hwint is " << hwint << endl; + // for (Int_t ee=0; ee "<< dwin->At(ee) << endl; + // //a printf(" %i ==> %L \n",ee,dwin->At(ee)); + // }; + //main read loop while(fin.eof()==0) { isCadreGood = true; //start reading the file + streamposi = (Long64_t)fin.tellg(); // stream position in the file before reading the vrl header + if ( iNumCadres > 9 && numposi > 9 ){ + streamposisaved = streamposi; + numposi = 0; + }; + numposi++; + // fin.read(ccHeader_VRL, LENGTH_HEADER_VRL); + // printf(" position in file is %llu \n",streamposi); + stringstream ss; + ss.str() = ""; + ss << " position in file is "<logError(sms); + // if (!fin.good()) { //TODO: check here @@ -815,7 +937,7 @@ if(do_vrl_check){isCadreGood=false;} break; } - + skip_cadre = false; //check of the VRL header e setta route number if(!VRL_Header_Check(ccHeader_VRL,LENGTH_HEADER_VRL)) { @@ -825,8 +947,37 @@ " This error occurred after byte: "<logWarning(msg); + // printf(" streamposi %llu \n",streamposi); } + // + // we completely missed more than 10 VRL packets + // + // if ( horrorcount > 10 ){ + if ( horrorcount > 1 ){ + stringstream os; + os<<" NEW (EM) THIS IS TOO MUCH, LOST SYNC WITH VRL HEADERS! try to recover horrorcount = "<logAll(ms); + // printf(" fin.(streamposi-10*1025-7) %llu \n",streamposi-(10LL*1025LL)-7LL); + if ( (streamposi-(10LL*1024LL)+1LL) < streamposisaved ){ + fin.seekg(streamposisaved+1LL); + stringstream oss; + oss<<" Problems repositioning stream reader... streamposisaved "<logWarning(msg); + + } else { + fin.seekg(streamposi-(10LL*1024LL)+1LL); + }; + // fin.seekg(streamposi-(1LL*1024LL)+1LL); + horrorcount = 0; + continue; + }; + + //we have read and analysed the header VRL of this cadre iByte_tot+=fin.gcount(); @@ -910,6 +1061,7 @@ if(route!=old_route) { is_new_route=true; + cadcount = 1LL; download++; stringstream oss; oss<<"Found a new download n: "<logAll(msg); } // is_new_route will be reset to false in PacketUser after the packet is used and stored - + + //main processing of the data, searching for Pamela Packets for(int i=0; ireadInput(ccData[i]); - iByte_tot++; - if(exitdbg==true){cout<<"**** DBG EXIT FOR****"<readInput(ccData[i]); + iByte_tot++; + if(exitdbg==true){cout<<"**** DBG EXIT FOR****"<logAll(msg); + + if ( ((int)(unsigned char)headVRL[0]!=CODE_FF)&&((int)(unsigned char)headVRL[1]!=CODE_46)&& ((int)(unsigned char)headVRL[2]!=CODE_D5) ){ + stringstream os; + os<<" Horror movie, the cadre does not start with FF 46 D5 at all! "<< + " This error occurred after byte: "<logAll(ms); + horrorcount++; + }; + return false; } - - route = (int)headVRL[3]; - - if(route!=old_route) - { - stringstream oss; - oss<<"Changing ROUTE at byte: "<logAll(msg); - } + + horrorcount = 0; + + // EM qui condizione su posizione file + Bool_t downchangeallowed = false; + for (Int_t ee=0; ee<(-1+2+2*downcount); ee+=2){ + if ( streamposi >= dwin->At(ee) && streamposi < dwin->At(ee+1) ) downchangeallowed = true; + // printf(" %i ==> %i \n",ee,dwin->At(ee)); + }; + if ( cadcount < 10000LL && cadcount > 0LL) downchangeallowed = false; + cadcount++; + // cout << " cadcount " << cadcount << endl; + // printf("cadcount %L \n",cadcount); + if ( downchangeallowed ){ + // printf(" change allowed! \n"); + + route = (int)headVRL[3]; + + if(route!=old_route) + { + stringstream oss; + oss<<"Changing ROUTE at byte: "<logAll(msg); + } + + }; //TODO: check the cadre number and save this info? //TODO check that the lenght is 8