/[PAMELA software]/chewbacca/PamOffLineSW/PamOffLineSW_Main.cpp
ViewVC logotype

Annotation of /chewbacca/PamOffLineSW/PamOffLineSW_Main.cpp

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.10 - (hide annotations) (download)
Thu Feb 11 09:02:10 2010 UTC (14 years, 9 months ago) by mocchiut
Branch: MAIN
Changes since 1.9: +60 -4 lines
9R bugs fixed

1 mocchiut 1.1 //============================================================================
2 mocchiut 1.10 // $Id: PamOffLineSW_Main.cpp,v 1.9 2010/02/02 15:26:09 mocchiut Exp $
3 mocchiut 1.1 // Description : Pamela Off-Line Software
4     //============================================================================
5    
6     #include <sys/time.h>
7     #include "PamInclude.h"
8     #include "StateManager.h"
9    
10     #include "PacketUser.h"
11 mocchiut 1.8 #include <TArrayL64.h>
12 mocchiut 1.1
13     extern "C" {
14     #include <dirent.h>
15     }
16    
17     using namespace PamOffLineSW;
18    
19     // dbg purposes
20     bool exitdbg = false;
21     void exitDBG(){exitdbg=true;}
22     //function needed only for dbg purposes:
23     void split_input(char fni[]);
24    
25     #define LENGTH_DATA_SIMU 1024
26     #define LENGTH_CADRE_VRL 1024
27     #define LENGTH_HEADER_VRL 8
28     #define LENGTH_DATA_CADRE (LENGTH_CADRE_VRL-LENGTH_HEADER_VRL-1)//1015
29    
30     //main functions
31     void readOptions(int argc, char *argv[]);
32     void init();
33     void firstLog();
34     void DB_config();
35     void mainRead_RealData(char fni[]);
36     void mainRead_SimulatedData(char fni[]);
37     void finish();
38     void deleteAll();
39    
40     //utilities functions
41     bool VRL_Header_Check(char * headVRL, int length);
42     short int CRC_Cadre_Check(char dataVRL[], int length);
43    
44     //global variables
45     bool simulated_data = false;
46 mocchiut 1.5 //bool do_vrl_check = false; //EMI
47     bool do_vrl_check = true; //EMI
48 mocchiut 1.1
49 mocchiut 1.8
50 pam-fi 1.7 const char* db_host = "";
51 mocchiut 1.1 int db_port = 0;
52 pam-fi 1.7 const char* db_name = "";
53 mocchiut 1.1 char conn[100]="";
54    
55     LogUtil::logLevel loglevel=LogUtil::LOGERROR;
56 pam-fi 1.7 const char* logfilename = "chewbacca.log";
57 mocchiut 1.1 //current route
58     int route = 999;
59     //previous route
60     int old_route = 999;
61    
62 mocchiut 1.8 Long64_t filelength = 0LL;
63     Long64_t streamposi = 0LL;
64 mocchiut 1.10 Long64_t streamposisaved = 0LL;
65     Int_t numposi = 10;
66 mocchiut 1.8 Long64_t downcount = 1LL;
67     TArrayL64 *dwin=new TArrayL64(12);
68     Long64_t cadcount = 0LL;
69 mocchiut 1.10 Int_t horrorcount = 0;
70 mocchiut 1.8
71 mocchiut 1.1 bool skip_cadre = false;
72     long int iNumGoodCadres=0; //total number of good cadres
73    
74     // global variables used in all the project
75     namespace PamOffLineSW
76     {
77 pam-fi 1.7 const char* db_user = "";
78     const char* db_pwd = "";
79 mocchiut 1.9 char* pelosconnection = NULL;
80 mocchiut 1.1 //marco_new_01
81     bool single_connection=false;
82     long int iNumCadres=0; //cadre's number
83     unsigned long long int iByte_tot=0;// how many bytes I have read till now
84    
85     bool isCadreGood = true;//if the cadre is good
86     char* fni; //path completo
87     short compression = 3;
88     // char *outDir = ".";
89 pam-fi 1.7 const char *outDir = "";
90 mocchiut 1.1
91 mocchiut 1.5 // char * nome_output="chewbacca"; //EMI
92 pam-fi 1.7 const char * nome_output="L0PAM";//EMI
93 mocchiut 1.4 bool multiFile = 0;
94 mocchiut 1.5 // unsigned long int step_pkt_number=0; // EMI
95     unsigned long int step_pkt_number=3000;
96     // unsigned long int step_pkt_obt=0; // EMI
97     unsigned long int step_pkt_obt=7200000; // EMI
98 mocchiut 1.1 LogUtil* mainLogUtil = NULL;
99     TSQLServer* sqlServer = NULL;
100     unsigned long int max_pkt_number = 16777215;//biggest value before reset
101     unsigned long int max_pkt_obt = 4294967295u;//biggest value before reset
102    
103 mocchiut 1.5 // bool is_new_route = false; // EMI
104     bool is_new_route = true; // EMI ??????????? VA BENE? SECONDO ME SI`
105 mocchiut 1.1 unsigned int download = 0;
106     unsigned int orbit_number=0;
107     unsigned int mmm_number = 0;//session_number
108     unsigned long int time_Offset=0;
109 mocchiut 1.5 // bool tryMerge = false;
110     bool tryMerge = true;
111 mocchiut 1.8 bool candelete = true; //EM
112 mocchiut 1.1
113     bool do_cont_check=true;//if do_cont_check is false do not use a DB ...
114    
115     //TODO: now it is unused
116     unsigned long int delta_Time=0;//in seconds
117 mocchiut 1.4 #define TAGVALUELEN 4
118     char tag_value[TAGVALUELEN];
119 mocchiut 1.1 }
120    
121     // main:
122     //
123     int main(int argc, char *argv[])
124     {
125     // read command line options
126     readOptions(argc,argv);
127    
128     cout<<"Please wait"<<endl;
129    
130     // initialize everything and write few things in the log file
131     init();
132    
133     // take time to measure the performance.
134     timeval tv1;
135     gettimeofday(&tv1,NULL);
136     unsigned long long timems1 = (unsigned long long)tv1.tv_sec * (unsigned long long)1000 + tv1.tv_usec / 1000;
137    
138     if(simulated_data)
139     {
140     mainLogUtil->logAll("Using simulated data");
141     mainRead_SimulatedData(fni);
142     }
143     else
144     {
145     mainLogUtil->logAll("Using real data");
146     mainRead_RealData(fni);
147     }
148    
149     finish();
150    
151     timeval tv2;
152     gettimeofday(&tv2,NULL);
153     unsigned long long timems2 = (unsigned long long)tv2.tv_sec * (unsigned long long)1000 + tv2.tv_usec / 1000;
154     unsigned long long timems = timems2 -timems1;
155    
156     string msg = "The analisys took: " + mainLogUtil->value2string(timems) + " ms";
157     mainLogUtil->logAlways(msg);
158    
159     deleteAll();
160    
161     cout<<"The end "<<endl;
162     return 0;
163     }
164    
165     void readOptions(int argc, char *argv[])
166     {
167     if (argc < 2)
168     {
169     cout << "You have forgotten the file name. \n";
170     cout << "Try '-help' for more information. \n";
171     exit(1);
172     }
173    
174     if((!strcmp(argv[1], "-help"))||(!strcmp(argv[1], "--help"))||(!strcmp(argv[1], "-h")))
175     {
176     // cout << "Usage: PamOffLineSW INPUT_FILE [OPTIONS] \n";
177     cout << "Usage: chewbacca INPUT_FILE [OPTIONS] \n";
178     cout << "\t (-help | --help | -h) print this help and exit \n";
179     cout << "\t -simu if the input file contains simulated data instead of real data\n";
180     cout << "\t -vrl if you want to perform the vrl check\n";
181 mocchiut 1.6 cout << "\t -no-vrl if you DO NOT want to perform the vrl check\n";
182     cout << "\t -gpamela gpamela data as input\n";
183 mocchiut 1.2 cout << "\t -filelog set the log filename. [default: chewbacca.log]\n";
184 mocchiut 1.1 cout << "\t -loglevel set the log level. Values: [0,3] (error,warning,info,all) [default:0]\n";
185     cout << "\t -c set the compression level for the generated ROOT file(s). Values: [0,9] [default = 3]\n";
186 mocchiut 1.2 cout << "\t -root_name set the root-name for the generated ROOT file(s). [default = chewbacca]\n";
187 mocchiut 1.1 cout << "\t -outDir set the output directory for the generated root file(s). [default = .]\n";
188     cout << "\t -delta_counter set the allowed difference in the Packet Counter between two continuos packets. If 0 all packets are considered continuos. [default = 0]\n";
189     cout << "\t -delta_obt set the allowed difference (ms) in the Packet Orbital Time between two continuos packets. If 0 all packets are considered continuos. [default = 0]\n";
190     cout << "\t -db_host set the host-name of the DataBase. [default = localhost]\n";
191     cout << "\t -db_port set the port of the DataBase. [default = 3306]\n";
192 mocchiut 1.2 cout << "\t -db_name set the name of the DataBase. [default = chewbacca_db]\n";
193     cout << "\t -db_user set the user of the DataBase. [default = chewbacca_user]\n";
194     cout << "\t -db_pwd set the user of the DataBase. [default = chewbacca_pwd]\n";
195 mocchiut 1.1 cout << "\t -max_pkt_number Maximum value for Packet Counter, after this value it is resetted. [default = 2^24 - 1]\n";
196     cout << "\t -max_pkt_obt Maximum value for Packet OBT, after this value it is resetted. [default = 2^32 - 1]\n";
197     cout << "\t -orbit_number Value of the orbital number. If 0 this is retrieved from the input file name. [default = 0]\n";
198     cout << "\t -session_number Value of the session number. If 0 this is retrieved from the input file name. [default = 0]\n";
199     cout << "\t -time_Offset Value of the timeOffset. If 0 this is retrieved using the orbital number. [default = 0]\n";
200     cout << "\t -tryMerge if you want to try to Merge ROOT files\n";
201 mocchiut 1.8 cout << "\t -dontMerge if you do not want to try to Merge ROOT files\n";
202     cout << "\t -dontDelete if you do not want to delete bad ROOT files from disks\n";
203 mocchiut 1.4 //marco_new_01
204 mocchiut 1.1 cout << "\t -single_connection if you want to open only one connection to DB.\n";
205 mocchiut 1.4 cout << "\t -tag if you want add the 'The owner of the file' - the tag lenght is 4 char\n";
206     // cout << "\t -delta_Time set the allowed difference (seconds) in the Real Time between two root file. [default = 0]\n";
207 mocchiut 1.1 //cout << "\t -multi generate multiple root files \n";
208     exit(1);
209     }
210    
211     if(!strcmp(argv[1], "-usage")){
212     cout << "\t chewbacca INPUT_FILE [OPTIONS] \n";
213     cout << "Try '-help' for more information. \n";
214     exit(1);
215     }
216    
217     //http://en.wikipedia.org/wiki/Chewbacca_defense
218     //http://www.urbandictionary.com/define.php?term=chewbacca+defense
219     if(!strcmp(argv[1], "-defense")){
220     cout << "\n Why would a Wookiee, an eight-foot tall Wookiee, want to live on Endor,\n with a bunch of two-foot tall Ewoks? That does not make sense!\n But more important, you have to ask yourself:\n What does this have to do with this case? \n Nothing. Ladies and gentlemen, it has nothing to do with this case! \n It does not make sense!\n Look at me. I'm a lawyer defending a major record company, \n and I'm talkin' about Chewbacca! Does that make sense? \n Ladies and gentlemen, I am not making any sense! \n None of this makes sense! \n And so you have to remember, when you're in that jury room\n deliberatin' and conjugatin' the Emancipation Proclamation,\n does it make sense? \n No! Ladies and gentlemen of this supposed jury, it does not make sense!\n If Chewbacca lives on Endor, you must acquit! \n The defense rests."<<endl;
221     cout << "\nTry '-help' for more information. \n";
222     exit(1);
223     }
224    
225 mocchiut 1.6 //input file
226     fni= argv[1];
227    
228 mocchiut 1.1 for (int i = 2; i < argc; i++)
229     {
230     //marco_new_01
231     if (!strcmp(argv[i], "-single_connection"))
232     {
233     single_connection = true;
234     continue;
235     }
236    
237    
238     if (!strcmp(argv[i], "-tryMerge"))
239     {
240     tryMerge = true;
241     continue;
242     }
243 mocchiut 1.5
244     if (!strcmp(argv[i], "-dontMerge")) // EMI
245     {
246     tryMerge = false;
247     continue;
248     }
249 mocchiut 1.8
250     if (!strcmp(argv[i], "-dontDelete")) // EMI
251     {
252     candelete = false;
253     continue;
254     }
255 mocchiut 1.1
256     if (!strcmp(argv[i], "-time_Offset")){
257     if (++i >= argc){
258     cerr << "-time_Offset needs arguments. \n";
259     cout << "Try '-help' for more information. \n";
260     exit(1);
261     }
262     if ((isdigit(*argv[i])) && ( (atoi(argv[i]) >= 0) )) {
263     time_Offset = atoll(argv[i]);
264     } else {
265     cerr << "-time_Offset needs an integer value. \n";
266     cout << "Try '-help' for more information. \n";
267     exit(1);
268     }
269     continue;
270     }
271    
272     if (!strcmp(argv[i], "-orbit_number")){
273     if (++i >= argc){
274     cerr << "-orbit_number needs arguments. \n";
275     cout << "Try '-help' for more information. \n";
276     exit(1);
277     }
278     if ((isdigit(*argv[i])) && ( (atoi(argv[i]) >= 0) )) {
279     orbit_number = atoi(argv[i]);
280     } else {
281     cerr << "-orbit_number needs an integer value. \n";
282     cout << "Try '-help' for more information. \n";
283     exit(1);
284     }
285     continue;
286     }
287    
288     if (!strcmp(argv[i], "-session_number")){
289     if (++i >= argc){
290     cerr << "-session_number needs arguments. \n";
291     cout << "Try '-help' for more information. \n";
292     exit(1);
293     }
294     if ((isdigit(*argv[i])) && ( (atoi(argv[i]) >= 0) )) {
295     mmm_number = atoi(argv[i]);
296     } else {
297     cerr << "-session_number needs an integer value. \n";
298     cout << "Try '-help' for more information. \n";
299     exit(1);
300     }
301     continue;
302     }
303    
304     if (!strcmp(argv[i], "-max_pkt_number")){
305     if (++i >= argc){
306     cerr << "-max_pkt_number needs arguments. \n";
307     cout << "Try '-help' for more information. \n";
308     exit(1);
309     }
310     if ((isdigit(*argv[i])) && ( (atoi(argv[i]) >= 0) )) {
311     max_pkt_number = atoll(argv[i]);
312     } else {
313     cerr << "-max_pkt_number needs an integer value. \n";
314     cout << "Try '-help' for more information. \n";
315     exit(1);
316     }
317     continue;
318     }
319    
320     if (!strcmp(argv[i], "-max_pkt_obt")){
321     if (++i >= argc){
322     cerr << "-max_pkt_obt needs arguments. \n";
323     cout << "Try '-help' for more information. \n";
324     exit(1);
325     }
326     if ((isdigit(*argv[i])) && ( (atoi(argv[i]) >= 0) )) {
327     max_pkt_obt = atoll(argv[i]);
328     } else {
329     cerr << "-max_pkt_obt needs an integer value. \n";
330     cout << "Try '-help' for more information. \n";
331     exit(1);
332     }
333     continue;
334     }
335    
336    
337     if (!strcmp(argv[i], "-simu"))
338     {
339     simulated_data = true;
340     continue;
341     }
342 mocchiut 1.6
343     if (!strcmp(argv[i], "-gpamela"))
344     {
345     simulated_data = true;
346     do_vrl_check = false;
347     nome_output = (char *)gSystem->BaseName(fni);
348     tryMerge = false;
349 mocchiut 1.8 candelete = false;
350 mocchiut 1.6 continue;
351     }
352 mocchiut 1.1
353 mocchiut 1.5 if (!strcmp(argv[i], "-no-vrl")) //EMI
354     {
355     do_vrl_check = false;
356     }
357 mocchiut 1.1 if (!strcmp(argv[i], "-vrl"))
358     {
359     do_vrl_check = true;
360     if(simulated_data)
361     {
362     cout<<"Impossible to perform VRL check with simulated data. Don't use -simu option"<<endl;
363     cout << "Try '-help' for more information. \n";
364     exit(1);
365     }
366    
367     continue;
368     }
369    
370     if (!strcmp(argv[i], "-filelog")){
371     if (++i >= argc){
372     cerr << "-filelog needs arguments. \n";
373     cout << "Try '-help' for more information. \n";
374     exit(1);
375     }
376     logfilename=argv[i];
377     continue;
378     }
379    
380     if (!strcmp(argv[i], "-loglevel")){
381     if (++i >= argc){
382     cerr << "-loglevel needs arguments. \n";
383     cout << "Try '-help' for more information. \n";
384     exit(1);
385     }
386     if ((isdigit(*argv[i])) && ( (atoi(argv[i]) >= 0) && (atoi(argv[i]) <= 3))) {
387     loglevel = (LogUtil::logLevel) atoi(argv[i]);
388     } else {
389     cerr << "-loglevel needs an integer value beetween 0 and 3. \n";
390     cout << "Try '-help' for more information. \n";
391     exit(1);
392     }
393     continue;
394     }
395    
396    
397     if (!strcmp(argv[i], "-c")){
398     if (++i >= argc){
399     cerr << "-c needs arguments. \n";
400     cout << "Try '-help' for more information. \n";
401     exit(1);
402     }
403     if ((isdigit(*argv[i])) && ( (atoi(argv[i]) >= 0) && (atoi(argv[i]) <= 9))) {
404     compression = atoi(argv[i]);
405     } else {
406     cerr << "-c needs an integer value beetween 0 and 9. \n";
407     cout << "Try '-help' for more information. \n";
408     exit(1);
409     }
410     continue;
411     }
412    
413     if (!strcmp(argv[i], "-outDir")){
414     if (++i >= argc){
415     cerr << "-outDir needs arguments. \n";
416     cout << "Try '-help' for more information. \n";
417     exit(1);
418     }
419     DIR* tempdir;
420 mocchiut 1.5 if ((tempdir = opendir(gSystem->ExpandPathName(argv[i]))) != 0) { // EMI
421 mocchiut 1.1 outDir = argv[i];
422     closedir(tempdir);
423     } else {
424     cerr << "-outDir needs an existing/accessable directory. \n";
425     cout << "Try '-help' for more information. \n";
426     exit(1);
427     }
428     continue;
429     }
430    
431     if (!strcmp(argv[i], "-root_name")){
432     if (++i >= argc){
433     cerr << "-root_name needs arguments. \n";
434     cout << "Try '-help' for more information. \n";
435     exit(1);
436     }
437    
438     nome_output = argv[i];
439     continue;
440     }
441    
442     if (!strcmp(argv[i], "-delta_counter")){
443     if (++i >= argc){
444     cerr << "-delta_counter needs arguments. \n";
445     cout << "Try '-help' for more information. \n";
446     exit(1);
447     }
448     if ((isdigit(*argv[i])) && ( (atoi(argv[i]) >= 0) )) {
449     step_pkt_number = atoi(argv[i]);
450     } else {
451     cerr << "-delta_counter needs an integer value. \n";
452     cout << "Try '-help' for more information. \n";
453     exit(1);
454     }
455     continue;
456     }
457    
458     if (!strcmp(argv[i], "-delta_obt")){
459     if (++i >= argc){
460     cerr << "-delta_obt needs arguments. \n";
461     cout << "Try '-help' for more information. \n";
462     exit(1);
463     }
464     if ((isdigit(*argv[i])) && ( (atoi(argv[i]) >= 0) )) {
465     step_pkt_obt = atoi(argv[i]);
466     } else {
467     cerr << "-delta_obt needs an integer value. \n";
468     cout << "Try '-help' for more information. \n";
469     exit(1);
470     }
471     continue;
472     }
473     if (!strcmp(argv[i], "-delta_Time")){
474     if (++i >= argc){
475     cerr << "-delta_Time needs arguments. \n";
476     cout << "Try '-help' for more information. \n";
477     exit(1);
478     }
479     if ((isdigit(*argv[i])) && ( (atoi(argv[i]) >= 0) )) {
480     delta_Time = atoi(argv[i]);
481     } else {
482     cerr << "-delta_Time needs an integer value. \n";
483     cout << "Try '-help' for more information. \n";
484     exit(1);
485     }
486     continue;
487     }
488    
489     if (!strcmp(argv[i], "-db_host")){
490     if (++i >= argc){
491     cerr << "-db_host needs arguments. \n";
492     cout << "Try '-help' for more information. \n";
493     exit(1);
494     }
495     db_host = argv[i];
496     continue;
497     }
498    
499    
500     if (!strcmp(argv[i], "-db_port")){
501     if (++i >= argc){
502     cerr << "-db_port needs arguments. \n";
503     cout << "Try '-help' for more information. \n";
504     exit(1);
505     }
506     if ((isdigit(*argv[i])) && ( (atoi(argv[i]) >= 0) )) {
507     db_port = atoi(argv[i]);
508     } else {
509     cerr << "-db_port needs an integer value. \n";
510     cout << "Try '-help' for more information. \n";
511     exit(1);
512     }
513     continue;
514     }
515    
516     if (!strcmp(argv[i], "-db_name")){
517     if (++i >= argc){
518     cerr << "-db_name needs arguments. \n";
519     cout << "Try '-help' for more information. \n";
520     exit(1);
521     }
522     db_name = argv[i];
523     continue;
524     }
525     if (!strcmp(argv[i], "-db_user")){
526     if (++i >= argc){
527     cerr << "-db_name needs arguments. \n";
528     cout << "Try '-help' for more information. \n";
529     exit(1);
530     }
531     db_user = argv[i];
532     continue;
533     }
534    
535     if (!strcmp(argv[i], "-db_pwd")){
536     if (++i >= argc){
537     cerr << "-db_name needs arguments. \n";
538     cout << "Try '-help' for more information. \n";
539     exit(1);
540     }
541     db_pwd = argv[i];
542     continue;
543     }
544 mocchiut 1.4 if (!strcmp(argv[i], "-tag")){
545     if (++i >= argc){
546     cerr << "-tag needs arguments. \n";
547     cout << "Try '-help' for more information. \n";
548     exit(1);
549     }
550     int len=strlen(argv[i])>TAGVALUELEN?TAGVALUELEN:strlen(argv[i]);
551     strncpy(tag_value,argv[i],len);
552     tag_value[len]=0;
553     continue;
554     }
555    
556 mocchiut 1.1 //TODO: check that multiFile is always 0
557     // if (!strcmp(argv[i], "-multi")){multiFile = 1; cout<<"debug: multi= "<<multiFile<<endl;}
558     }
559    
560     //TODO: maybe if simulated data I don't need nothig so I can skip the following lines
561     // and use instead something similar to:
562 mocchiut 1.6 if (simulated_data) {orbit_number=99999; mmm_number=999; download=999; }
563 mocchiut 1.1
564     //I need the following lines only to retrieve orbit_number and mmm_number (session_number)from the filename
565     if((!orbit_number)||(!mmm_number))
566     {
567     std::string input = fni;
568     std::string fileName;
569     int pos = input.find_last_of("/");
570     fileName = input.substr(pos+1);
571     pos = fileName.find_last_of(".");
572     fileName = fileName.substr(0,pos);
573    
574     if(fileName.length()<8){
575     cout<<"Wrong filename unable to retrieve orbit_number and session_number."<<endl;
576     cout<<"Rename input in format nnnnnmmm.pam or set orbit_number and session_number."<<endl;
577     cout << "Try '-help' for more information. \n";
578     exit(1);
579     }
580    
581     if(!orbit_number){
582     std::string downlink;
583     downlink = fileName.substr(0,5);
584     orbit_number= atoi(downlink.c_str());
585     }
586    
587     if(!mmm_number){
588     std::string mmm;
589     mmm = fileName.substr(5,3);
590     mmm_number= atoi(mmm.c_str());
591     }
592     }
593    
594     }
595    
596     void init()
597     {
598     //initial condition of automaton
599     StateManager::getInstance().init();
600     mainLogUtil = new LogUtil(logfilename,loglevel);
601    
602     //TODO check if you like this
603     if (!strcmp(outDir,""))
604     {
605     char *pam_out = getenv("PAM_L0");
606     if (pam_out)
607     {
608     outDir = pam_out;
609     }
610     else
611     {
612     outDir = ".";
613     }
614    
615     }
616     // write some initial things in the Log file
617     firstLog();
618    
619     if(do_cont_check){
620     DB_config();
621     //marco_new_31:spostata logica in PacketUser.cpp
622     ////sqlServer = TSQLServer::Connect(connection,db_user,db_pwd);
623     ////if ((!sqlServer)||(!(sqlServer->IsConnected()))){cout<<"Can not connect with MYSQL sever"<<endl; exit(1);}
624     }
625    
626     }
627    
628     void DB_config()
629     {
630     if( (!strcmp(db_host,""))||(db_port==0)||(!strcmp(db_name,"")))
631     {
632     char *pamdbhost = getenv("PAM_DBHOST");
633     if (pamdbhost)
634     {
635 mocchiut 1.9 pelosconnection = pamdbhost;
636 mocchiut 1.1 }
637     else
638     {
639     if (!strcmp(db_host,""))
640     {
641     db_host="localhost";
642     }
643    
644     if (db_port==0)
645     {
646     db_port=3306;
647     }
648    
649     if (!strcmp(db_name,""))
650     {
651 mocchiut 1.2 db_name="chewbacca_db";
652 mocchiut 1.1 }
653     sprintf(conn,"mysql://%s:%d/%s",db_host,db_port,db_name);
654 mocchiut 1.9 pelosconnection=conn;
655 mocchiut 1.1 }
656     }
657     else{
658     sprintf(conn,"mysql://%s:%d/%s",db_host,db_port,db_name);
659 mocchiut 1.9 pelosconnection=conn;
660 mocchiut 1.1 }
661    
662     if (!strcmp(db_user,""))
663     {
664     char *pamdbuser = getenv("PAM_DBUSER");
665     if (pamdbuser)
666     {
667     db_user = pamdbuser;
668     }
669     else
670     {
671 mocchiut 1.2 db_user="chewbacca_user";
672 mocchiut 1.1 }
673    
674     }
675    
676     if(!strcmp(db_pwd,""))
677     {
678     char *pamdbpsw = getenv("PAM_DBPSW");
679     if (pamdbpsw)
680     {
681     db_pwd = pamdbpsw;
682     }
683     else
684     {
685 mocchiut 1.2 db_pwd="chewbacca_pwd";
686 mocchiut 1.1 }
687     }
688    
689 mocchiut 1.9 string msg = "Using DB: " + string(pelosconnection);// +" "+ string(db_user) +" "+ string(db_pwd);
690 mocchiut 1.1 mainLogUtil->logAlways(msg);
691     }
692    
693    
694     void firstLog(){
695     string msg = "Input file: " + (string)fni;
696     mainLogUtil->logAlways(msg);
697    
698 mocchiut 1.5 msg = "Output directory for the generated root file(s): " + (string)outDir;
699 mocchiut 1.1 mainLogUtil->logAlways(msg);
700 mocchiut 1.5 msg = "Output directory for the generated root file(s) expanded: " + (string)gSystem->ExpandPathName(outDir); // EMI
701     mainLogUtil->logAlways(msg); //EMI
702 mocchiut 1.1
703     msg = "Output root name for the generated root file(s): " + (string)nome_output;
704     mainLogUtil->logAlways(msg);
705    
706     stringstream oss1;
707     oss1.str()="";
708     oss1<< "Compression level for the generated root file(s): " <<compression;
709     msg = oss1.str();
710     mainLogUtil->logInfo(msg);
711    
712     stringstream oss2;
713     oss2.str()="";
714     oss2<< "Max value for Packet Counter: " <<max_pkt_number<<" - Max value for Packet OBT: " <<max_pkt_obt;
715     msg = oss2.str();
716     mainLogUtil->logAll(msg);
717    
718     if(do_vrl_check)
719     {
720     mainLogUtil->logInfo("VRL check set to true");
721     }
722     else
723     {
724     mainLogUtil->logWarning("VRL check skipped");
725     }
726    
727     if(step_pkt_number)
728     {
729     stringstream oss;
730     oss.str()="";
731     oss<<"The allowed difference in the Packet Counter between two continuos packets: "<<step_pkt_number;
732     msg = oss.str();
733     mainLogUtil->logAlways(msg);
734     }
735    
736     if(step_pkt_obt)
737     {
738     stringstream oss;
739     oss.str()="";
740     oss<<"The allowed difference in the Packet Orbital Time between two continuos packets: " <<step_pkt_obt;
741     msg = oss.str();
742     mainLogUtil->logAlways(msg);
743     }
744    
745     if((!step_pkt_number)&&(!step_pkt_obt)){
746     mainLogUtil->logAlways("No check about continuity; DB unused. No Merging ...");
747     do_cont_check=false;
748     tryMerge=false;
749     //return;
750     }
751    
752     /*
753     if(do_cont_check){
754     sprintf(connection,"mysql://%s:%d/%s",db_host,db_port,db_name);
755     string msg = "Using DB: " + (string)connection;
756     mainLogUtil->logAlways(msg);
757     }
758     */
759    
760     if(tryMerge)
761     {
762     mainLogUtil->logInfo("Try to Merge ROOT files");
763     }
764    
765     /*
766     if(tryMerge){
767     stringstream oss1;
768     oss1.str()="";
769     oss1<<"The allowed difference in the Real Time between two ROOT files: " <<delta_Time<<" s";
770     string msg1=oss1.str();
771     mainLogUtil->logAlways(msg1);
772     }
773     */
774    
775     }
776    
777     void finish()
778     {
779     PacketUser::getInstance().FinishLastGroup();
780     }
781    
782     void deleteAll()
783     {
784     if(mainLogUtil){delete mainLogUtil; mainLogUtil = NULL;}
785     //marco_new_01: questo non serve sicuramente ...
786     if(sqlServer){delete sqlServer; sqlServer = NULL;}
787     }
788    
789     //read simulated data
790     // without vrl header
791     void mainRead_SimulatedData(char fni[])
792     {
793     //we read LENGTH_DATA_SIMU bytes each time ...
794     char ccData[LENGTH_DATA_SIMU]={0};
795     ifstream fin;
796     fin.open(fni, ifstream::binary);
797     if (!fin) {cout<<"Can not open input file "<<fni<<endl; exit(1);}
798     //main read loop
799     isCadreGood = true;//all the cadres are good ;-)
800    
801     while(fin.eof()==0)
802     {
803     //reading data in the cadre
804     fin.read(ccData,LENGTH_DATA_SIMU);
805     stringstream oss;
806    
807     if (!fin.good())
808     {
809     // if (fin.eof()){break;}//if we reach the end of file
810     stringstream oss;
811     oss<<"Read only "<<fin.gcount()<<" bytes instead of "<<LENGTH_DATA_SIMU<<
812     ". This error occurred after byte: "<<iByte_tot
813     <<" ... use the data read, then ... exit ";
814     string msg = oss.str();
815     mainLogUtil->logAll(msg);
816     //I want try to use it ...
817     for(int i=0;i<fin.gcount();i++)
818     {
819     StateManager::getInstance().getCurrentState()->readInput(ccData[i]);
820     iByte_tot++;
821     }
822     //anyhow then exit
823     break;
824     }
825    
826     //main processing of the data, searching for Pamela Packets
827     for(int i=0;i<LENGTH_DATA_SIMU;i++)
828     {
829     StateManager::getInstance().getCurrentState()->readInput(ccData[i]);
830     iByte_tot++;
831     }
832     iNumCadres++;
833     }
834    
835     fin.close();
836    
837     stringstream oss1;
838     oss1<<"Total bytes read "<<iByte_tot;
839     string msg = oss1.str();
840     mainLogUtil->logInfo(msg);
841     }
842    
843     //read real data
844     void mainRead_RealData(char fni[])
845     {
846     //header VRL
847     char ccHeader_VRL[LENGTH_HEADER_VRL]={0};
848     //data in each cadre, it can contain the PAMELA PKT
849     char ccData[LENGTH_DATA_CADRE]={0};
850     //last byte of each cadre, it is used to check CRC of the cadre
851     char cCrc_VRL=0;
852    
853     //file di input = fni[]
854     ifstream fin;
855     fin.open(fni, ifstream::binary);
856     if (!fin) {cout<<"Can not open input file "<<fni<<endl; exit(1);}
857 mocchiut 1.8
858    
859     //
860     // 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
861     //
862     fin.seekg(0,std::ios::end);
863     filelength = (Long64_t)fin.tellg();
864     //
865     // filelength = 3840214016LL;
866     // filelength = 5763760128LL;
867     // filelength = 15370027008LL;
868     //
869     downcount = (Long64_t)round((Double_t)filelength/2000000000.);
870     if ( downcount < 1LL ) downcount = 1LL;
871     Long64_t downsize = (Long64_t)round((Double_t)filelength/(Double_t)downcount);
872     Long64_t hwint = Long64_t((Double_t)downsize/25.);
873     //
874     if ( downcount > 5LL ) dwin->Set(2LL+2LL*downcount);
875     dwin->Reset();
876     dwin->AddAt(0LL,0);
877     //
878     Int_t dco = 1;
879     //
880     for (Int_t ee=1; ee<(-1+2+2*downcount); ee+=2){
881     dwin->AddAt(((downsize*(dco-1))+hwint),ee);
882     dwin->AddAt(((downsize*dco)-hwint),ee+1);
883     dco++;
884     };
885     //
886     fin.seekg(0,std::ios::beg);
887     //
888     dwin->AddAt(filelength,(-1LL+2LL+2LL*downcount));
889     //
890     // printf(" file lenght is %L downcount is %L downsize is %L hwint is %L \n",filelength,downcount,downsize,hwint);
891     stringstream ess;
892     ess.str() = "";
893     ess << " (EM) " << " file lenght is "<< filelength<< " downcount is "<< downcount <<" downsize is "<< downsize <<" hwint is " << hwint;
894     string emsg = ess.str();
895     mainLogUtil->logInfo(emsg);
896     //
897     // cout << " file lenght is "<< filelength<< " downcount is "<< downcount <<" downsize is "<< downsize <<" hwint is " << hwint << endl;
898     // for (Int_t ee=0; ee<TMath::Max((2+2*downcount),12LL); ee++){
899     // cout << " " << ee << " ==> "<< dwin->At(ee) << endl;
900     // //a printf(" %i ==> %L \n",ee,dwin->At(ee));
901     // };
902    
903 mocchiut 1.1 //main read loop
904     while(fin.eof()==0)
905     {
906     isCadreGood = true;
907     //start reading the file
908 mocchiut 1.10 streamposi = (Long64_t)fin.tellg(); // stream position in the file before reading the vrl header
909     if ( iNumCadres > 9 && numposi > 9 ){
910     streamposisaved = streamposi;
911     numposi = 0;
912     };
913     numposi++;
914     //
915 mocchiut 1.1 fin.read(ccHeader_VRL, LENGTH_HEADER_VRL);
916 mocchiut 1.10 // printf(" position in file is %llu \n",streamposi);
917     stringstream ss;
918     ss.str() = "";
919     ss << " position in file is "<<streamposi;
920     string sms = ss.str();
921     // mainLogUtil->logError(sms);
922     //
923 mocchiut 1.1 if (!fin.good())
924     {
925     //TODO: check here
926     if (fin.eof())//if we reach the end of file
927     {
928     break;
929     }
930    
931     stringstream oss;
932     oss<<"The cadre: "<<iNumCadres<<" has something wrong in the lenght of its header VRL."<<
933     " This error occurred after byte: "<<iByte_tot<<" ... exit";
934     string msg = oss.str();
935     mainLogUtil->logError(msg);
936    
937     if(do_vrl_check){isCadreGood=false;}
938     break;
939     }
940 mocchiut 1.3 skip_cadre = false;
941 mocchiut 1.1 //check of the VRL header e setta route number
942     if(!VRL_Header_Check(ccHeader_VRL,LENGTH_HEADER_VRL))
943     {
944     isCadreGood=false;//Check if it is better set it to true ...
945     stringstream oss;
946     oss<<"The cadre: "<<iNumCadres<<" has something wrong in its header VRL."<<
947     " This error occurred after byte: "<<iByte_tot<<" ... use the data carefully";
948     string msg = oss.str();
949     mainLogUtil->logWarning(msg);
950 mocchiut 1.10 // printf(" streamposi %llu \n",streamposi);
951 mocchiut 1.1 }
952    
953 mocchiut 1.10 //
954     // we completely missed more than 10 VRL packets
955     //
956     // if ( horrorcount > 10 ){
957     if ( horrorcount > 1 ){
958     stringstream os;
959     os<<" NEW (EM) THIS IS TOO MUCH, LOST SYNC WITH VRL HEADERS! try to recover horrorcount = "<<horrorcount;
960     os<<" new position in file "<<(streamposi-(10LL*1024LL)+1LL);
961     // os<<" new position in file "<<(streamposi-(1LL*1024LL)+1LL);
962     string ms = os.str();
963     mainLogUtil->logAll(ms);
964     // printf(" fin.(streamposi-10*1025-7) %llu \n",streamposi-(10LL*1025LL)-7LL);
965     if ( (streamposi-(10LL*1024LL)+1LL) < streamposisaved ){
966     fin.seekg(streamposisaved+1LL);
967     stringstream oss;
968     oss<<" Problems repositioning stream reader... streamposisaved "<<streamposisaved;
969     string msg = oss.str();
970     mainLogUtil->logWarning(msg);
971    
972     } else {
973     fin.seekg(streamposi-(10LL*1024LL)+1LL);
974     };
975     // fin.seekg(streamposi-(1LL*1024LL)+1LL);
976     horrorcount = 0;
977     continue;
978     };
979    
980    
981 mocchiut 1.1 //we have read and analysed the header VRL of this cadre
982     iByte_tot+=fin.gcount();
983    
984     //reading data in the cadre
985     fin.read(ccData,LENGTH_DATA_CADRE);
986     if (!fin.good())
987     {
988     stringstream oss;
989     oss<<"The cadre: "<<iNumCadres<<" has something wrong in its data"<<
990     " This error occurred after byte: "<<iByte_tot<<" ... use the data carefully then ... exit ";
991     string msg = oss.str();
992     mainLogUtil->logWarning(msg);
993    
994     //I am sure that this cadre is not good ...
995     if(do_vrl_check)
996     {
997     isCadreGood=false;
998     }
999    
1000     //... but maybe I want try to use it ...
1001     for(int i=0;i<fin.gcount();i++)
1002     {
1003     StateManager::getInstance().getCurrentState()->readInput(ccData[i]);
1004     iByte_tot++;
1005     }
1006    
1007     //... anyhow then exit
1008     break;
1009     }
1010    
1011     //reading the last byte of the cadre
1012     fin.get(cCrc_VRL);
1013     if (!fin.good())
1014     {
1015     //if the last byte representing the CRC_VRL is not present
1016     //or if we are not able to read it
1017     stringstream oss;
1018     oss<<"The cadre: "<<iNumCadres<<" has something wrong in its last byte."<<
1019     " This error occurred after byte: "<<iByte_tot<<" ... use the data carefully then ... exit ";
1020     string msg = oss.str();
1021     mainLogUtil->logWarning(msg);
1022    
1023     //I am sure that this cadre is not good ...
1024     if(do_vrl_check)
1025     {
1026     isCadreGood=false;
1027     }
1028    
1029     //don't exit now, we need to keep it alive to process data
1030     //we will exit the main reading cicle after,
1031     }
1032    
1033     if((do_vrl_check)&&(!skip_cadre))
1034     {
1035     //check CRC for the cadre
1036     short int CalcCheckSum;
1037     CalcCheckSum=CRC_Cadre_Check(ccData,(int)LENGTH_DATA_CADRE);
1038    
1039     if (CalcCheckSum!=(short int)(cCrc_VRL))
1040     {
1041     isCadreGood=false;
1042     stringstream oss;
1043     oss<<"The cadre: "<<iNumCadres<<" failed the CRC check."<<
1044     " This error occurred after byte: "<<iByte_tot<<" ... use the data carefully";
1045     string msg = oss.str();
1046     mainLogUtil->logError(msg);
1047    
1048 mocchiut 1.2 //non mi fido del contatore del route
1049 mocchiut 1.1 stringstream oss1;
1050     oss1<<"Route number unused = "<<route<<" Resetting ROUTE to old value = "<<old_route<<" (download="<<download<<")";
1051     msg = oss1.str();
1052     mainLogUtil->logAll(msg);
1053    
1054     route=old_route;
1055    
1056     }
1057     }
1058    
1059     if(!skip_cadre)
1060     {
1061     if(route!=old_route)
1062     {
1063     is_new_route=true;
1064 mocchiut 1.8 cadcount = 1LL;
1065 mocchiut 1.1 download++;
1066     stringstream oss;
1067     oss<<"Found a new download n: "<<download<<". Header VRL ends at byte: "<<iByte_tot;
1068     string msg = oss.str();
1069     mainLogUtil->logAll(msg);
1070     }
1071     // is_new_route will be reset to false in PacketUser after the packet is used and stored
1072 mocchiut 1.3
1073    
1074 mocchiut 1.1 //main processing of the data, searching for Pamela Packets
1075     for(int i=0; i<LENGTH_DATA_CADRE; i++)
1076     {
1077 mocchiut 1.3 StateManager::getInstance().getCurrentState()->readInput(ccData[i]);
1078     iByte_tot++;
1079     if(exitdbg==true){cout<<"**** DBG EXIT FOR****"<<endl; break;}
1080     }
1081 mocchiut 1.1 }
1082     else{
1083     iByte_tot+=LENGTH_DATA_CADRE;
1084     }
1085    
1086     if(exitdbg==true){cout<<"**** DBG EXIT WHILE***##*#*#"<<endl; break;}
1087    
1088     //taking in account the cCrc_VRL read before
1089     iByte_tot++;
1090    
1091     //increment the number of cadre processed
1092     if(!skip_cadre)
1093     iNumCadres++;
1094    
1095     if(isCadreGood)
1096     {
1097     if(!skip_cadre)
1098     iNumGoodCadres++;
1099     }
1100    
1101    
1102     // if(iNumCadres>=0){cout<<"################DBG EXIT ##################"<<endl; break;}
1103    
1104     }//end reading cycle
1105    
1106     fin.close();
1107    
1108     stringstream oss1;
1109     oss1<<"Total bytes read "<<iByte_tot
1110     <<" Total number of cadres processed "<<iNumCadres
1111     <<" Total number of good cadres "<<iNumGoodCadres;
1112     string msg = oss1.str();
1113     mainLogUtil->logInfo(msg);
1114     }
1115    
1116     //function that check the header VRL
1117     bool VRL_Header_Check(char* headVRL, int length)
1118     {
1119 mocchiut 1.2
1120 mocchiut 1.1 /* stringstream oss;
1121     oss<<"Pippooooooo: at byte+ "<<iByte_tot<<" cadre ... route number = "<<(int)headVRL[3];
1122     string msg = oss.str();
1123     mainLogUtil->logAll(msg);*/
1124    
1125     old_route = route;
1126    
1127     //a volte capita che ho header tutti 0 e poi anche la cadre e' tutti zeri da buttare
1128     //il CRC invece viene buono allora uso skip_cadre
1129     if(((int)(unsigned char)headVRL[0]==0)&&((int)(unsigned char)headVRL[1]==0)&&((int)(unsigned char)headVRL[2]==0)&&((int)(unsigned char)headVRL[3]==0)&&((int)(unsigned char)headVRL[7]==0))
1130     {
1131     skip_cadre=true;
1132     stringstream oss;
1133     oss<<"The cadre is all zeros"<<
1134     " This error occurred after byte: "<<iByte_tot<<" ... Cadre DISCARDED and not computed ";
1135     string msg = oss.str();
1136     mainLogUtil->logAll(msg);
1137     return false;
1138     }
1139    
1140     if(
1141     ((int)(unsigned char)headVRL[0]!=CODE_FF)||
1142     ((int)(unsigned char)headVRL[1]!=CODE_46)||
1143     ((int)(unsigned char)headVRL[2]!=CODE_D5)
1144     )
1145     {
1146    
1147     stringstream oss;
1148     oss<<"The cadre does not start with FF 46 D5"<<
1149     " This error occurred after byte: "<<iByte_tot<<" ... Route number unused= "<<(int)headVRL[3]<<" Resetting ROUTE to old value = "<<old_route<<" (download="<<download<<")";
1150     string msg = oss.str();
1151     mainLogUtil->logAll(msg);
1152 mocchiut 1.10
1153     if ( ((int)(unsigned char)headVRL[0]!=CODE_FF)&&((int)(unsigned char)headVRL[1]!=CODE_46)&& ((int)(unsigned char)headVRL[2]!=CODE_D5) ){
1154     stringstream os;
1155     os<<" Horror movie, the cadre does not start with FF 46 D5 at all! "<<
1156     " This error occurred after byte: "<<iByte_tot<<" ... Route number unused= "<<(int)headVRL[3]<<" Resetting ROUTE to old value = "<<old_route<<" (download="<<download<<")";
1157     string ms = os.str();
1158     mainLogUtil->logAll(ms);
1159     horrorcount++;
1160     };
1161    
1162 mocchiut 1.1 return false;
1163     }
1164 mocchiut 1.10
1165     horrorcount = 0;
1166    
1167 mocchiut 1.8 // EM qui condizione su posizione file
1168     Bool_t downchangeallowed = false;
1169     for (Int_t ee=0; ee<(-1+2+2*downcount); ee+=2){
1170     if ( streamposi >= dwin->At(ee) && streamposi < dwin->At(ee+1) ) downchangeallowed = true;
1171     // printf(" %i ==> %i \n",ee,dwin->At(ee));
1172     };
1173     if ( cadcount < 10000LL && cadcount > 0LL) downchangeallowed = false;
1174     cadcount++;
1175     // cout << " cadcount " << cadcount << endl;
1176     // printf("cadcount %L \n",cadcount);
1177     if ( downchangeallowed ){
1178     // printf(" change allowed! \n");
1179    
1180     route = (int)headVRL[3];
1181    
1182     if(route!=old_route)
1183     {
1184     stringstream oss;
1185     oss<<"Changing ROUTE at byte: "<<iByte_tot<<" route = "<<route<<" old value = "<<old_route<<" (download="<<download<<")";
1186     string msg = oss.str();
1187     mainLogUtil->logAll(msg);
1188     }
1189    
1190     };
1191 mocchiut 1.1
1192     //TODO: check the cadre number and save this info?
1193     //TODO check that the lenght is 8
1194     return true;
1195     }
1196    
1197     //function that computes the CRC for each cadre
1198     short int CRC_Cadre_Check(char dataVRL[], int length)
1199     {
1200     //function used only if(do_vrl_check)
1201     short int Summ;
1202     int i;
1203     int CSum, tmp;
1204    
1205     tmp=(int)dataVRL[0];
1206     CSum=tmp;
1207     for (i=1;i<length;i++) {tmp=dataVRL[i]; CSum=CSum^tmp;}
1208     Summ=(short int) (CSum);
1209     return Summ;
1210     }
1211    
1212    
1213     //TODO: funzione per debug, rimuovere marco
1214     void split_input(char fni[])
1215     {
1216     cout<<"splitting input file"<<endl;
1217    
1218     system("mkdir splitted");
1219    
1220     ifstream fin;
1221     fin.open(fni, ifstream::binary);
1222     if (!fin) {cout<<"Can not open input file "<<fni<<endl; exit(1);}
1223    
1224     ofstream fout;
1225     static int num=0;
1226    
1227     int cic = 1024;
1228     int mille =1000;
1229     int quanti = 50;
1230     int tanti =quanti*mille*cic;
1231     char * tmp = new char[tanti];
1232     while(fin.eof()==0)
1233     {
1234     fin.read(tmp,tanti);
1235     stringstream fno;
1236     fno<<"./splitted/splitted_"<<++num;
1237     fout.open(fno.str().c_str(), ios::binary);
1238     fout.write(tmp,tanti);
1239     fout.close();
1240     }
1241    
1242     delete[] tmp;
1243     fin.close();
1244     cout<<"done, output in folder splitted"<<endl;
1245     }
1246    
1247    

  ViewVC Help
Powered by ViewVC 1.1.23