1 |
//============================================================================ |
//============================================================================ |
2 |
// $Id: PamOffLineSW_Main.cpp,v 1.4 2008/12/18 12:58:37 mocchiut Exp $ |
// $Id: PamOffLineSW_Main.cpp,v 1.7 2009/08/05 18:48:43 pam-fi Exp $ |
3 |
// Description : Pamela Off-Line Software |
// Description : Pamela Off-Line Software |
4 |
//============================================================================ |
//============================================================================ |
5 |
|
|
8 |
#include "StateManager.h" |
#include "StateManager.h" |
9 |
|
|
10 |
#include "PacketUser.h" |
#include "PacketUser.h" |
11 |
|
#include <TArrayL64.h> |
12 |
|
|
13 |
extern "C" { |
extern "C" { |
14 |
#include <dirent.h> |
#include <dirent.h> |
46 |
//bool do_vrl_check = false; //EMI |
//bool do_vrl_check = false; //EMI |
47 |
bool do_vrl_check = true; //EMI |
bool do_vrl_check = true; //EMI |
48 |
|
|
49 |
char* db_host = ""; |
|
50 |
|
const char* db_host = ""; |
51 |
int db_port = 0; |
int db_port = 0; |
52 |
char* db_name = ""; |
const char* db_name = ""; |
53 |
char conn[100]=""; |
char conn[100]=""; |
54 |
|
|
55 |
LogUtil::logLevel loglevel=LogUtil::LOGERROR; |
LogUtil::logLevel loglevel=LogUtil::LOGERROR; |
56 |
char* logfilename = "chewbacca.log"; |
const char* logfilename = "chewbacca.log"; |
57 |
//current route |
//current route |
58 |
int route = 999; |
int route = 999; |
59 |
//previous route |
//previous route |
60 |
int old_route = 999; |
int old_route = 999; |
61 |
|
|
62 |
|
Long64_t filelength = 0LL; |
63 |
|
Long64_t streamposi = 0LL; |
64 |
|
Long64_t downcount = 1LL; |
65 |
|
TArrayL64 *dwin=new TArrayL64(12); |
66 |
|
Long64_t cadcount = 0LL; |
67 |
|
|
68 |
bool skip_cadre = false; |
bool skip_cadre = false; |
69 |
long int iNumGoodCadres=0; //total number of good cadres |
long int iNumGoodCadres=0; //total number of good cadres |
70 |
|
|
71 |
// global variables used in all the project |
// global variables used in all the project |
72 |
namespace PamOffLineSW |
namespace PamOffLineSW |
73 |
{ |
{ |
74 |
char* db_user = ""; |
const char* db_user = ""; |
75 |
char* db_pwd = ""; |
const char* db_pwd = ""; |
76 |
char* connection = NULL; |
char* connection = NULL; |
77 |
//marco_new_01 |
//marco_new_01 |
78 |
bool single_connection=false; |
bool single_connection=false; |
83 |
char* fni; //path completo |
char* fni; //path completo |
84 |
short compression = 3; |
short compression = 3; |
85 |
// char *outDir = "."; |
// char *outDir = "."; |
86 |
char *outDir = ""; |
const char *outDir = ""; |
87 |
|
|
88 |
// char * nome_output="chewbacca"; //EMI |
// char * nome_output="chewbacca"; //EMI |
89 |
char * nome_output="L0PAM";//EMI |
const char * nome_output="L0PAM";//EMI |
90 |
bool multiFile = 0; |
bool multiFile = 0; |
91 |
// unsigned long int step_pkt_number=0; // EMI |
// unsigned long int step_pkt_number=0; // EMI |
92 |
unsigned long int step_pkt_number=3000; |
unsigned long int step_pkt_number=3000; |
105 |
unsigned long int time_Offset=0; |
unsigned long int time_Offset=0; |
106 |
// bool tryMerge = false; |
// bool tryMerge = false; |
107 |
bool tryMerge = true; |
bool tryMerge = true; |
108 |
|
bool candelete = true; //EM |
109 |
|
|
110 |
bool do_cont_check=true;//if do_cont_check is false do not use a DB ... |
bool do_cont_check=true;//if do_cont_check is false do not use a DB ... |
111 |
|
|
175 |
cout << "\t (-help | --help | -h) print this help and exit \n"; |
cout << "\t (-help | --help | -h) print this help and exit \n"; |
176 |
cout << "\t -simu if the input file contains simulated data instead of real data\n"; |
cout << "\t -simu if the input file contains simulated data instead of real data\n"; |
177 |
cout << "\t -vrl if you want to perform the vrl check\n"; |
cout << "\t -vrl if you want to perform the vrl check\n"; |
178 |
|
cout << "\t -no-vrl if you DO NOT want to perform the vrl check\n"; |
179 |
|
cout << "\t -gpamela gpamela data as input\n"; |
180 |
cout << "\t -filelog set the log filename. [default: chewbacca.log]\n"; |
cout << "\t -filelog set the log filename. [default: chewbacca.log]\n"; |
181 |
cout << "\t -loglevel set the log level. Values: [0,3] (error,warning,info,all) [default:0]\n"; |
cout << "\t -loglevel set the log level. Values: [0,3] (error,warning,info,all) [default:0]\n"; |
182 |
cout << "\t -c set the compression level for the generated ROOT file(s). Values: [0,9] [default = 3]\n"; |
cout << "\t -c set the compression level for the generated ROOT file(s). Values: [0,9] [default = 3]\n"; |
195 |
cout << "\t -session_number Value of the session number. If 0 this is retrieved from the input file name. [default = 0]\n"; |
cout << "\t -session_number Value of the session number. If 0 this is retrieved from the input file name. [default = 0]\n"; |
196 |
cout << "\t -time_Offset Value of the timeOffset. If 0 this is retrieved using the orbital number. [default = 0]\n"; |
cout << "\t -time_Offset Value of the timeOffset. If 0 this is retrieved using the orbital number. [default = 0]\n"; |
197 |
cout << "\t -tryMerge if you want to try to Merge ROOT files\n"; |
cout << "\t -tryMerge if you want to try to Merge ROOT files\n"; |
198 |
cout << "\t -dontMerge if you don not want to try to Merge ROOT files\n"; |
cout << "\t -dontMerge if you do not want to try to Merge ROOT files\n"; |
199 |
|
cout << "\t -dontDelete if you do not want to delete bad ROOT files from disks\n"; |
200 |
//marco_new_01 |
//marco_new_01 |
201 |
cout << "\t -single_connection if you want to open only one connection to DB.\n"; |
cout << "\t -single_connection if you want to open only one connection to DB.\n"; |
202 |
cout << "\t -tag if you want add the 'The owner of the file' - the tag lenght is 4 char\n"; |
cout << "\t -tag if you want add the 'The owner of the file' - the tag lenght is 4 char\n"; |
219 |
exit(1); |
exit(1); |
220 |
} |
} |
221 |
|
|
222 |
|
//input file |
223 |
|
fni= argv[1]; |
224 |
|
|
225 |
for (int i = 2; i < argc; i++) |
for (int i = 2; i < argc; i++) |
226 |
{ |
{ |
227 |
//marco_new_01 |
//marco_new_01 |
243 |
tryMerge = false; |
tryMerge = false; |
244 |
continue; |
continue; |
245 |
} |
} |
246 |
|
|
247 |
|
if (!strcmp(argv[i], "-dontDelete")) // EMI |
248 |
|
{ |
249 |
|
candelete = false; |
250 |
|
continue; |
251 |
|
} |
252 |
|
|
253 |
if (!strcmp(argv[i], "-time_Offset")){ |
if (!strcmp(argv[i], "-time_Offset")){ |
254 |
if (++i >= argc){ |
if (++i >= argc){ |
336 |
simulated_data = true; |
simulated_data = true; |
337 |
continue; |
continue; |
338 |
} |
} |
339 |
|
|
340 |
|
if (!strcmp(argv[i], "-gpamela")) |
341 |
|
{ |
342 |
|
simulated_data = true; |
343 |
|
do_vrl_check = false; |
344 |
|
nome_output = (char *)gSystem->BaseName(fni); |
345 |
|
tryMerge = false; |
346 |
|
candelete = false; |
347 |
|
continue; |
348 |
|
} |
349 |
|
|
350 |
if (!strcmp(argv[i], "-no-vrl")) //EMI |
if (!strcmp(argv[i], "-no-vrl")) //EMI |
351 |
{ |
{ |
554 |
// if (!strcmp(argv[i], "-multi")){multiFile = 1; cout<<"debug: multi= "<<multiFile<<endl;} |
// if (!strcmp(argv[i], "-multi")){multiFile = 1; cout<<"debug: multi= "<<multiFile<<endl;} |
555 |
} |
} |
556 |
|
|
|
//input file |
|
|
fni= argv[1]; |
|
|
|
|
557 |
//TODO: maybe if simulated data I don't need nothig so I can skip the following lines |
//TODO: maybe if simulated data I don't need nothig so I can skip the following lines |
558 |
// and use instead something similar to: |
// and use instead something similar to: |
559 |
//if(simulated data){orbit_number=99999; mmm_number=999; download=999; } |
if (simulated_data) {orbit_number=99999; mmm_number=999; download=999; } |
560 |
|
|
561 |
//I need the following lines only to retrieve orbit_number and mmm_number (session_number)from the filename |
//I need the following lines only to retrieve orbit_number and mmm_number (session_number)from the filename |
562 |
if((!orbit_number)||(!mmm_number)) |
if((!orbit_number)||(!mmm_number)) |
851 |
ifstream fin; |
ifstream fin; |
852 |
fin.open(fni, ifstream::binary); |
fin.open(fni, ifstream::binary); |
853 |
if (!fin) {cout<<"Can not open input file "<<fni<<endl; exit(1);} |
if (!fin) {cout<<"Can not open input file "<<fni<<endl; exit(1);} |
854 |
|
|
855 |
|
|
856 |
|
// |
857 |
|
// EM determine file length, number of downloads (a part small fractions of download due to VRL memory) and interval window for allowed change in download number |
858 |
|
// |
859 |
|
fin.seekg(0,std::ios::end); |
860 |
|
filelength = (Long64_t)fin.tellg(); |
861 |
|
// |
862 |
|
// filelength = 3840214016LL; |
863 |
|
// filelength = 5763760128LL; |
864 |
|
// filelength = 15370027008LL; |
865 |
|
// |
866 |
|
downcount = (Long64_t)round((Double_t)filelength/2000000000.); |
867 |
|
if ( downcount < 1LL ) downcount = 1LL; |
868 |
|
Long64_t downsize = (Long64_t)round((Double_t)filelength/(Double_t)downcount); |
869 |
|
Long64_t hwint = Long64_t((Double_t)downsize/25.); |
870 |
|
// |
871 |
|
if ( downcount > 5LL ) dwin->Set(2LL+2LL*downcount); |
872 |
|
dwin->Reset(); |
873 |
|
dwin->AddAt(0LL,0); |
874 |
|
// |
875 |
|
Int_t dco = 1; |
876 |
|
// |
877 |
|
for (Int_t ee=1; ee<(-1+2+2*downcount); ee+=2){ |
878 |
|
dwin->AddAt(((downsize*(dco-1))+hwint),ee); |
879 |
|
dwin->AddAt(((downsize*dco)-hwint),ee+1); |
880 |
|
dco++; |
881 |
|
}; |
882 |
|
// |
883 |
|
fin.seekg(0,std::ios::beg); |
884 |
|
// |
885 |
|
dwin->AddAt(filelength,(-1LL+2LL+2LL*downcount)); |
886 |
|
// |
887 |
|
// printf(" file lenght is %L downcount is %L downsize is %L hwint is %L \n",filelength,downcount,downsize,hwint); |
888 |
|
stringstream ess; |
889 |
|
ess.str() = ""; |
890 |
|
ess << " (EM) " << " file lenght is "<< filelength<< " downcount is "<< downcount <<" downsize is "<< downsize <<" hwint is " << hwint; |
891 |
|
string emsg = ess.str(); |
892 |
|
mainLogUtil->logInfo(emsg); |
893 |
|
// |
894 |
|
// cout << " file lenght is "<< filelength<< " downcount is "<< downcount <<" downsize is "<< downsize <<" hwint is " << hwint << endl; |
895 |
|
// for (Int_t ee=0; ee<TMath::Max((2+2*downcount),12LL); ee++){ |
896 |
|
// cout << " " << ee << " ==> "<< dwin->At(ee) << endl; |
897 |
|
// //a printf(" %i ==> %L \n",ee,dwin->At(ee)); |
898 |
|
// }; |
899 |
|
|
900 |
//main read loop |
//main read loop |
901 |
while(fin.eof()==0) |
while(fin.eof()==0) |
902 |
{ |
{ |
903 |
isCadreGood = true; |
isCadreGood = true; |
904 |
//start reading the file |
//start reading the file |
905 |
fin.read(ccHeader_VRL, LENGTH_HEADER_VRL); |
fin.read(ccHeader_VRL, LENGTH_HEADER_VRL); |
906 |
|
streamposi = (Long64_t)fin.tellg(); // stream position in the file |
907 |
|
// printf(" position in file is %i \n",streamposi); |
908 |
|
|
909 |
if (!fin.good()) |
if (!fin.good()) |
910 |
{ |
{ |
911 |
//TODO: check here |
//TODO: check here |
1018 |
if(route!=old_route) |
if(route!=old_route) |
1019 |
{ |
{ |
1020 |
is_new_route=true; |
is_new_route=true; |
1021 |
|
cadcount = 1LL; |
1022 |
download++; |
download++; |
1023 |
stringstream oss; |
stringstream oss; |
1024 |
oss<<"Found a new download n: "<<download<<". Header VRL ends at byte: "<<iByte_tot; |
oss<<"Found a new download n: "<<download<<". Header VRL ends at byte: "<<iByte_tot; |
1108 |
mainLogUtil->logAll(msg); |
mainLogUtil->logAll(msg); |
1109 |
return false; |
return false; |
1110 |
} |
} |
1111 |
|
// EM qui condizione su posizione file |
1112 |
route = (int)headVRL[3]; |
Bool_t downchangeallowed = false; |
1113 |
|
for (Int_t ee=0; ee<(-1+2+2*downcount); ee+=2){ |
1114 |
if(route!=old_route) |
if ( streamposi >= dwin->At(ee) && streamposi < dwin->At(ee+1) ) downchangeallowed = true; |
1115 |
{ |
// printf(" %i ==> %i \n",ee,dwin->At(ee)); |
1116 |
stringstream oss; |
}; |
1117 |
oss<<"Changing ROUTE at byte: "<<iByte_tot<<" route = "<<route<<" old value = "<<old_route<<" (download="<<download<<")"; |
if ( cadcount < 10000LL && cadcount > 0LL) downchangeallowed = false; |
1118 |
string msg = oss.str(); |
cadcount++; |
1119 |
mainLogUtil->logAll(msg); |
// cout << " cadcount " << cadcount << endl; |
1120 |
} |
// printf("cadcount %L \n",cadcount); |
1121 |
|
if ( downchangeallowed ){ |
1122 |
|
// printf(" change allowed! \n"); |
1123 |
|
|
1124 |
|
route = (int)headVRL[3]; |
1125 |
|
|
1126 |
|
if(route!=old_route) |
1127 |
|
{ |
1128 |
|
stringstream oss; |
1129 |
|
oss<<"Changing ROUTE at byte: "<<iByte_tot<<" route = "<<route<<" old value = "<<old_route<<" (download="<<download<<")"; |
1130 |
|
string msg = oss.str(); |
1131 |
|
mainLogUtil->logAll(msg); |
1132 |
|
} |
1133 |
|
|
1134 |
|
}; |
1135 |
|
|
1136 |
//TODO: check the cadre number and save this info? |
//TODO: check the cadre number and save this info? |
1137 |
//TODO check that the lenght is 8 |
//TODO check that the lenght is 8 |