--- chewbacca/YodaProfiler/src/PamelaDBOperations.cpp	2008/11/28 09:10:16	1.11
+++ chewbacca/YodaProfiler/src/PamelaDBOperations.cpp	2014/10/14 13:19:32	1.40
@@ -60,6 +60,7 @@
  */
 PamelaDBOperations::PamelaDBOperations(TString host, TString user, TString password, TString filerawname, TString filerootname, UInt_t boot, UInt_t tsync, UInt_t obt0, Bool_t debug, TString tlefilename, UInt_t dwinput, Bool_t staticp, Bool_t gpamela, Bool_t keepenv){
   //
+  RELAXED = false;
   chewbacca = false;
   chminentry = 0;
   chID = 0;
@@ -87,12 +88,12 @@
   //
   glrun = new GL_RUN();
   //
-  if ( !chewbacca ){
-    if ( !boot ) SetNOBOOT(false);
-    SetTsync(tsync,gpamela);
-    SetBOOTnumber(boot,gpamela);
-    SetObt0(obt0);
-  };
+  //   if ( !chewbacca ){
+  //     if ( !boot ) SetNOBOOT(false);
+  //     SetTsync(tsync,gpamela);
+  //     SetBOOTnumber(boot,gpamela);
+  //     SetObt0(obt0);
+  //   };
   //
   SetTLEPath(tlefilename);
   //
@@ -101,6 +102,7 @@
   if (INSERT_RAW) SetRawName(filerawname);
   //
   INSERT_ROOT = !filerootname.IsNull();
+  if ( INSERT_ROOT ) this->SetRootName(filerootname);
   this->SetOrbitNo(dwinput);
   //
   this->SetID_RAW(0);
@@ -124,6 +126,12 @@
 //
 // SETTERS 
 //
+void PamelaDBOperations::NotChewbacca(UInt_t boot, UInt_t tsync, UInt_t obt0, Bool_t gpamela){
+  if ( !boot ) SetNOBOOT(false);
+  SetTsync(tsync,gpamela);
+  SetBOOTnumber(boot,gpamela);
+  SetObt0(obt0);
+};
 
 void PamelaDBOperations::OpenL0File(TString filerootname){
   if( INSERT_ROOT ){
@@ -134,13 +142,15 @@
       stringstream qu;
       TSQLResult *result = 0;
       TSQLResult *result2 = 0;
+      TSQLResult *result3 = 0;
       TSQLRow    *row    = 0;    
       TSQLRow    *row2    = 0;    
+      TSQLRow    *row3    = 0;    
       TString chpath;
       TString chfile;
       UInt_t ridn = 0;
       qu.str("");
-      qu << "SELECT ROOT_ID_N,PKT_NUMBER_INIT,PKT_NUMBER_FINAL,PKT_OBT_INIT,PKT_OBT_FINAL,INSERTED_BY from ROOT_TABLE_MERGING where ID_N=" << chID << ";"; 
+      qu << "SELECT ROOT_ID_N,PKT_NUMBER_INIT,PKT_NUMBER_FINAL,PKT_OBT_INIT,PKT_OBT_FINAL,INSERTED_BY,REAL_TIME_INIT from ROOT_TABLE_MERGING where ID_N=" << chID << ";"; 
       if ( debug ) printf(" chewbacca: query is %s \n",qu.str().c_str());
       result = conn->Query(qu.str().c_str());
       if ( result ){
@@ -152,6 +162,7 @@
 	  chobtmin = (UInt_t)atoll(row->GetField(3));
 	  chobtmax = (UInt_t)atoll(row->GetField(4));
 	  chiby = (TString)(row->GetField(5));
+	  chrtinit = (UInt_t)atoll(row->GetField(6));
 	} else {
 	  throw -84;
 	};
@@ -160,7 +171,7 @@
       };
       delete result;
       qu.str("");
-      qu << "SELECT FOLDER_NAME,FILE_NAME,OBT_TIME_SYNC,LAST_TIME_SYNC_INFO,TIME_OFFSET,BOOT_NUMBER,PKT_NUMBER_INIT,PKT_NUMBER_FINAL,PKT_OBT_INIT,PKT_OBT_FINAL from ROOT_TABLE where ID_N=" << ridn << ";"; 
+      qu << "SELECT FOLDER_NAME,FILE_NAME,OBT_TIME_SYNC,LAST_TIME_SYNC_INFO,TIME_OFFSET,BOOT_NUMBER,PKT_NUMBER_INIT,PKT_NUMBER_FINAL,PKT_OBT_INIT,PKT_OBT_FINAL,REAL_TIME_INIT from ROOT_TABLE where ID_N=" << ridn << ";"; 
       if ( debug ) printf(" chewbacca: query is %s \n",qu.str().c_str());
       result2 = conn->Query(qu.str().c_str());
       if ( result2 ){
@@ -177,6 +188,79 @@
 	  chresursts = (UInt_t)atoll(row2->GetField(4));
 	  chboot = (UInt_t)atoll(row2->GetField(5));
 	  //
+	  if ( !chboot ){
+	    if ( debug ) printf(" mmm... no BOOT number determined by chewbacca, try to find it looking at DB \n");
+	    //
+	    // new feature: check in ROOT_TABLE (timewise) the previous and the next BOOT number != 0 , if it is the same we know this one!
+	    // if it is different roll back to the old behaviour
+	    // 
+	    qu.str("");
+	    qu << "SELECT BOOT_NUMBER from ROOT_TABLE where BOOT_NUMBER!=0 AND REAL_TIME_INIT>"<< row2->GetField(10) <<" order by REAL_TIME_INIT asc limit 1;"; 
+	    if ( debug ) printf(" chewbacca: query is %s \n",qu.str().c_str());
+	    UInt_t chbootA = 0;
+	    UInt_t chbootB = 1;
+	    result3 = conn->Query(qu.str().c_str());
+	    if ( result3 ){
+	      row3 = result3->Next();
+	      if ( row3 ){
+		chbootA = (UInt_t)atoll(row3->GetField(0));
+		if ( debug ) printf(" Found boot_number A = %u \n",chbootA);
+	      };
+	    };
+	    delete result3;
+	    qu.str("");
+	    qu << "SELECT BOOT_NUMBER from ROOT_TABLE where BOOT_NUMBER!=0 AND REAL_TIME_INIT<"<< row2->GetField(10) <<" order by REAL_TIME_INIT desc limit 1;"; 
+	    if ( debug ) printf(" chewbacca: query is %s \n",qu.str().c_str());
+	    result3 = conn->Query(qu.str().c_str());
+	    if ( result3 ){
+	      row3 = result3->Next();
+	      if ( row3 ){
+		chbootB = (UInt_t)atoll(row3->GetField(0));
+		if ( debug ) printf(" Found boot_number B = %u \n",chbootB);
+	      };
+	    };
+	    if ( chbootA == chbootB ){
+	      chboot = chbootA;
+	      if ( debug ) printf(" Found boot_number! it is %u \n",chboot);
+	    } else {	    
+	      qu.str("");
+	      //	    qu << "SELECT BOOT_NUMBER from ROOT_TABLE where BOOT_NUMBER!=0 AND ABS(LAST_TIME_SYNC_INFO-"<< chlastts <<")<10000 AND ABS(REAL_TIME_INIT-"<< row2->GetField(10) <<")<7200 group by BOOT_NUMBER order by BOOT_NUMBER asc;"; 
+	      //	    qu << "SELECT BOOT_NUMBER from ROOT_TABLE where BOOT_NUMBER!=0 AND ABS(LAST_TIME_SYNC_INFO-"<< chlastts <<")<40000 AND ABS(REAL_TIME_INIT-"<< row2->GetField(10) <<")<40000 group by BOOT_NUMBER order by BOOT_NUMBER asc;"; // relax conditions... 090112 [8RED: error -29]
+	      qu << "SELECT BOOT_NUMBER from ROOT_TABLE where BOOT_NUMBER!=0 AND ABS(LAST_TIME_SYNC_INFO-"<< (float)chlastts <<")<50000 AND ABS(REAL_TIME_INIT-"<< atof(row2->GetField(10)) <<")<50000 group by BOOT_NUMBER order by BOOT_NUMBER asc;"; // even more relaxed conditions... 091214 [9REDtest3: error -29] // 10RED MYSQL operators BUG:
+              /*
+
+mysql> select CAST(1322000646 AS UNSIGNED INTEGER)-1322017203.;
++--------------------------------------------------+
+| CAST(1322000646 AS UNSIGNED INTEGER)-1322017203. |
++--------------------------------------------------+
+|                                           -16557 | 
++--------------------------------------------------+
+1 row in set (0.06 sec)
+
+mysql> select CAST(1322000646 AS UNSIGNED INTEGER)-1322017203;
++-------------------------------------------------+
+| CAST(1322000646 AS UNSIGNED INTEGER)-1322017203 |
++-------------------------------------------------+
+|                            18446744073709535059 | 
++-------------------------------------------------+
+1 row in set (0.02 sec)
+
+              */
+	      if ( debug ) printf(" chewbacca: query is %s \n",qu.str().c_str());
+	      result3 = conn->Query(qu.str().c_str());
+	      if ( result3 ){
+		row3 = result3->Next();
+		if ( row3 && result3->GetRowCount() == 1 ){
+		  chboot = (UInt_t)atoll(row3->GetField(0));
+		  if ( debug ) printf(" Found boot_number = %u \n",chboot);
+		} else {
+		  if ( debug ) printf(" AGH CANNOT DETERMINE THE BOOT NUMBER... \n");
+		  throw -29;
+		};
+	      };
+	    };
+	  };
+	  //
 	  chpktinit = (UInt_t)atoll(row2->GetField(6));
 	  chpktfinal = (UInt_t)atoll(row2->GetField(7));
 	  chobtinit = (UInt_t)atoll(row2->GetField(8));
@@ -189,13 +273,15 @@
 	throw -85;
       };
       filerootname = chpath + chfile;// + ".root";
-      if ( debug ) printf(" chewbacca: filename is %s \n",filerootname.Data());
     };
     this->SetRootName(filerootname);
-    file = TFile::Open(this->GetRootName().Data());
-  } else {
-    this->SetRootName("");
   };
+  if ( debug ) printf(" Filename is %s \n",filerootname.Data());
+  file = TFile::Open(this->GetRootName().Data());
+  //  } else {
+  //    this->SetRootName("");
+  //    this->SetRootName(filerootname);
+  //  };
 }
 
 //
@@ -395,23 +481,28 @@
     return;
   };
   //
-  TString name = this->GetRootFile();
-  Int_t nlength = name.Length();
-  if ( nlength < 5 ) return;
-  TString dwo = 0;
-  for (Int_t i = 0; i<5; i++){
-    dwo.Append(name[i],1);
-  };
-  if ( dwo.IsDigit() ){
-    dworbit = (UInt_t)dwo.Atoi();
-  } else {
-    dwo="";
-    for (Int_t i = 8; i<13; i++){
+  if ( !chewbacca ){
+    TString name = this->GetRootFile();
+    Int_t nlength = name.Length();
+    if ( nlength < 5 ){
+      if ( IsDebug() ) printf(" Agh problems determining the orbit number! name = %s \n",name.Data());
+      return;
+    };
+    TString dwo = "";
+    for (Int_t i = 0; i<5; i++){
       dwo.Append(name[i],1);
-    };     
-    if ( dwo.IsDigit() ) dworbit = (UInt_t)dwo.Atoi();
+    };
+    if ( dwo.IsDigit() ){
+      dworbit = (UInt_t)dwo.Atoi();
+    } else {
+      dwo="";
+      for (Int_t i = 8; i<13; i++){
+	dwo.Append(name[i],1);
+      };     
+      if ( dwo.IsDigit() ) dworbit = (UInt_t)dwo.Atoi();
+    };
+    if ( IsDebug() ) printf(" Downlink orbit is %i (dwo = %s) \n",dworbit,dwo.Data());
   };
-  if ( IsDebug() ) printf(" Downlink orbit is %i (dwo = %s) \n",dworbit,dwo.Data());
   return;
 };
 
@@ -791,6 +882,8 @@
     ph = eh->GetPscuHeader();
     pktlast = ph->GetCounter();
     nevent = upperentry - chminentry;
+    if ( ((Int_t)upperentry - (Int_t)chminentry) < 0 ) nevent = 0; // nevent is UInt_t! 090112 [8RED: error -88]
+    if ( IsDebug() ) printf(" Setting nevent to %u - upperentry %i chminentry %i \n",nevent,upperentry,chminentry);
     //
   } else {
     upperpkt = PKT(pktlast);
@@ -799,6 +892,7 @@
   };
   //
   if ( chewbacca && nevent < 1 ) {
+    if ( IsDebug() ) printf(" chewbacca and no events in the file \n");
     pktfirst = chpktmin;
     upperpkt = PKT(chpktmax);
     pktlast = chpktmax;
@@ -824,7 +918,8 @@
   //  if ( nevent < jump ) jump = int(nevent/10);
   //  if ( !jump ) jump = 1;
   //
-  if ( (PKT(pktlast) < PKT(pktfirst) && OBT(obtlast) < OBT(obtfirst)) || (labs(PKT(pktlast)-PKT(pktfirst))<deltapkt && labs(OBT(obtlast)-OBT(obtfirst))<deltaobt) && nevent > deltapkt ){
+
+  if ( ((PKT(pktlast) < PKT(pktfirst) && OBT(obtlast) < OBT(obtfirst)) || (labs(PKT(pktlast)-PKT(pktfirst))<deltapkt && labs(OBT(obtlast)-OBT(obtfirst))<deltaobt)) && nevent > deltapkt ){
     //
     if ( IsDebug() ) printf(" starting jump %i \n",jump);
     //    if ( IsDebug() ) printf(" (PKT(pktlast) < PKT(pktfirst) && OBT(obtlast) > OBT(obtfirst)) %llu < %llu && %llu > %llu \n     OR \n     (PKT(pktlast) > PKT(pktfirst) && OBT(obtlast) < OBT(obtfirst)) %llu > %llu && %llu < %llu \n",PKT(pktlast),PKT(pktfirst),OBT(obtlast),OBT(obtfirst),PKT(pktlast),PKT(pktfirst),OBT(obtlast),OBT(obtfirst)); 
@@ -1278,6 +1373,7 @@
   oss.str("");
   oss << "SET wait_timeout=173000;";
   conn->Query(oss.str().c_str()); 
+  delete conn->Query("SET sql_mode = 'NO_UNSIGNED_SUBTRACTION';");
   //
 }
 
@@ -1471,6 +1567,14 @@
     glrun->SetRUNTRAILER_PKT(lastPkt);
     //    
   };
+  //
+  // ad hoc solution for INF EV_TO [8RED] 090113
+  //
+  if ( !firstev && lastev == -1 ){
+    if ( IsDebug() ) printf(" EE firstev %i lastev %i nevents %i \n",firstev,lastev,lastev-firstev+1);
+    firstev = 1;
+    lastev = 0;
+  };
   glrun->SetEV_FROM((UInt_t)firstev);
   glrun->SetEV_TO((UInt_t)lastev);
   glrun->SetNEVENTS((UInt_t)lastev-(UInt_t)firstev+1);
@@ -1555,7 +1659,8 @@
 Int_t PamelaDBOperations::insertPamelaGL_TIMESYNC(){
   //
   Int_t signal = 0;
-  UInt_t idresof = 0;
+  //  UInt_t idresof = 0;
+  idresof = 0;
   stringstream   oss;
   TSQLResult *result = 0;
   TSQLRow *row = 0;
@@ -1577,6 +1682,7 @@
     result = conn->Query(oss.str().c_str());
     if ( !result ) throw -10;
     row = result->Next();
+    if ( !row ) throw -92;
     idresof = (UInt_t)atoll(row->GetField(0));
     existsts = true;
     goto eout;
@@ -1598,7 +1704,7 @@
     if ( !row ){
       oss.str("");
       oss << "SELECT YEAR(OFFSET_DATE),MONTH(OFFSET_DATE),DAY(OFFSET_DATE),HOUR(OFFSET_DATE),MINUTE(OFFSET_DATE),SECOND(OFFSET_DATE),ID FROM GL_RESURS_OFFSET WHERE FROM_ORBIT< " 
-	  << dworbit << " order by FROM_ORBIT desc limit 1;";
+	  << dworbit << " AND SPECIAL_FILE='' order by FROM_ORBIT desc limit 1;";
       if ( IsDebug() ) printf(" %s \n",oss.str().c_str());
       result = conn->Query(oss.str().c_str());
       if ( !result ) throw -10;
@@ -1645,9 +1751,9 @@
     TYPE = 0;
     TSYNC = 0;
     //
-    Double_t minimum = 0.;
-    Double_t maximum = 0.;
-    Double_t minimum2 = 0.;
+    //    Double_t minimum = 0.;
+    // Double_t maximum = 0.;
+    //Double_t minimum2 = 0.;
     Double_t maximum2 = 0.;
     //
     //
@@ -1655,9 +1761,9 @@
     pamela::McmdRecord *mcrc = 0;
     TArrayC *mcmddata = 0;
     //
-    minimum = numeric_limits<Double_t>::max();
-    maximum = numeric_limits<Double_t>::min();
-    minimum2 = numeric_limits<Double_t>::max();
+    //    minimum = numeric_limits<Double_t>::max();
+    //    maximum = numeric_limits<Double_t>::min();
+    //    minimum2 = numeric_limits<Double_t>::max();
     maximum2 = numeric_limits<Double_t>::min();
     //
     T = (TTree*)file->Get("Mcmd");
@@ -1868,7 +1974,7 @@
     //
     if ( chewbacca ){
 	oss.str("");
-	oss << " SELECT ID FROM GL_TIMESYNC where TIMESYNC="<<chlastts<<" AND OBT0="<<chobtts*1000<<" limit 1;";
+	oss << " SELECT ID FROM GL_TIMESYNC where TIMESYNC="<<chlastts<<" AND OBT0="<<chobtts*1000<<" and ID_RESURS_OFFSET="<< idresof <<" limit 1;"; // 10RED BUG!!!! without 'and ID_RESURS_OFFSET="<< idresof ' this query is not enough to ensure finding the correct line in GL_TIMSYNC...
 	if ( debug ) printf(" %s \n",oss.str().c_str());
 	result = conn->Query(oss.str().c_str());
 	//
@@ -2077,16 +2183,16 @@
     UInt_t lowerts = tsync-(obt0/1000)-5;
     if ( chewbacca ){
       oss.str("");
-      oss << "select BOOT_NUMBER from ROOT_TABLE where LAST_TIME_SYNC_INFO-(OBT_TIME_SYNC)<"
+      oss << "select BOOT_NUMBER from ROOT_TABLE where CAST((LAST_TIME_SYNC_INFO-(OBT_TIME_SYNC)) AS SIGNED INT)<" // 10RED MYSQL OPERATORS BUG
 	  << upperts 
-	  << " AND LAST_TIME_SYNC_INFO-(OBT_TIME_SYNC)>"
+	  << " AND CAST((LAST_TIME_SYNC_INFO-(OBT_TIME_SYNC)) AS SIGNED INT)>" // 10RED MYSQL OPERATORS BUG
 	  << lowerts
 	  << " AND BOOT_NUMBER>1;";
     } else {
       oss.str("");
-      oss << "select GL_RAW.BOOT_NUMBER from GL_TIMESYNC LEFT JOIN GL_RAW ON GL_RAW.ID = GL_TIMESYNC.ID_RAW where TIMESYNC-(OBT0/1000)<"
+      oss << "select GL_RAW.BOOT_NUMBER from GL_TIMESYNC LEFT JOIN GL_RAW ON GL_RAW.ID = GL_TIMESYNC.ID_RAW where CAST((TIMESYNC-(OBT0/1000)) AS SIGNED INT)<" // 10RED MYSQL OPERATORS BUG
 	  << upperts 
-	  << " AND TIMESYNC-(OBT0/1000)>"
+	  << " AND CAST((TIMESYNC-(OBT0/1000)) AS SIGNED INT)>" // 10RED MYSQL OPERATORS BUG
 	  << lowerts
 	  << " AND GL_RAW.BOOT_NUMBER>0 GROUP BY GL_TIMESYNC.OBT0;";
     };
@@ -2185,8 +2291,10 @@
   //
   // no runtrailers in the file!
   //
-  if ( !rtev ){
-    if ( !rhev ){
+  if ( IsDebug() ) printf(" Start rtev %i rhev %i nrtev %i nrhev %i \n",rtev,rhev,nrtev,nrhev); 
+  if ( !rtev || (chewbacca && !nrtev) ){
+    if ( IsDebug() ) printf(" No runtrailers \n"); 
+    if ( !rhev || (chewbacca && !nrhev) ){
       if ( IsDebug() ) printf(" No runheaders nor runtrailers!! \n"); 
       if ( !(upperentry-chminentry) ){
 	if ( IsDebug() ) printf(" No physics events nor runs in the file \n"); // di nuovo potrebbe esserci un runtrailer senza eventi (riempimento MM)
@@ -2223,6 +2331,7 @@
     //
   } else {
     //
+    if ( IsDebug() ) printf(" We have runtrailers \n"); 
     Int_t conptt = -1;
     for (Int_t ptt=0; ptt<rtev; ptt++){
       //
@@ -2239,7 +2348,7 @@
 	ptht = cod->Get(pctp->RunHeader) - 1;
 	//      evbeft = cod->Get(pctp->Physics);
 	tcod = (UInt_t)cod->Get(pctp->Physics);
-	if ( !tcod ) tcod = 1;
+	if ( !tcod ) tcod = 1;    // IS A BUG SINCE RUNS WITH ZERO EVENTS WILL LOOK LIKE RUNS WITH ONE EVENT
 	evbeft = TMath::Min(upperentry,(tcod-1));
 	if ( debug ) printf(" Loop in runtrailers, evbeft is %u upperentry %u cod->getetc %u \n",evbeft,upperentry,cod->Get(pctp->Physics));
 	//
@@ -2278,7 +2387,7 @@
 	  obth = phh->GetOrbitalTime();
 	  cod = ehh->GetCounter();
 	  tcod = (UInt_t)cod->Get(pctp->Physics);
-	  if ( !tcod ) tcod = 1;
+	  if ( !tcod ) tcod = 1; // IS A BUG SINCE RUNS WITH ZERO EVENTS WILL LOOK LIKE RUNS WITH ONE EVENT
 	  evbefh = TMath::Max(chminentry,(tcod-1));
 	  // 
 	  if ( PKT(pkth) >= PKT(pktfirst) && PKT(pkth) <= upperpkt ){
@@ -2340,7 +2449,7 @@
 	      cod = ehh->GetCounter();
 	      //	    evbeft = cod->Get(pctp->Physics);
 	      tcod = (UInt_t)cod->Get(pctp->Physics);
-	      if ( !tcod ) tcod = 1;
+	      if ( !tcod ) tcod = 1; // IS A BUG SINCE RUNS WITH ZERO EVENTS WILL LOOK LIKE RUNS WITH ONE EVENT
 	      evbeft = TMath::Min(upperentry,(tcod-1));
 	      rh->GetEntry(pth);
 	      phh = ehh->GetPscuHeader();
@@ -2382,7 +2491,7 @@
 	  //	if ( conptt+1 == (nrtev+nrtbef )){  
 	  if ( IsDebug() ) printf(" >>>>>>>>>>> %i %u %i %u \n",ptht,rhev,nrtev,conptt); 
 	  ptht++;
-	  if ( ptht < rhev ){
+	  if ( ptht < rhev ){ 
 	    rh->GetEntry(ptht);
 	    //pth++;
 	    //if ( pth < rhev ){
@@ -2410,7 +2519,8 @@
 	    if ( (UInt_t)evbeft < upperentry-1 && upperentry>0 ){
 	      if ( IsDebug() ) printf(" Piece of run at the end of the file with NO RUNHEADER! evbeft %u upperentry-1 %u \n",(UInt_t)evbeft,upperentry-1);
 	      //
-	      if ( (ptt-1) < 0 ) throw -15; // should never arrive here!
+	      //	      if ( (ptt-1) < 0 ) throw -15; // should never arrive here!
+	      if ( (rtev-1) < 0 || ptt < 0 ) throw -15; // should never arrive here!
 	      //	      rt->GetEntry(ptt-1);
 	      rt->GetEntry(rtev-1);
 	      cod = eht->GetCounter();
@@ -2645,10 +2755,14 @@
     //
     // we have now the good first piece of a run, fill the glrun object
     //
-    if ( rhfirstev != firstev && !mishead ) mishead = true;
-    if ( rtlastev != lastev && !mistrail ) mistrail = true;
+    if ( firstev != (lastev+1) ){ // could be a problem sometimes (?)
+      if ( rhfirstev != firstev && !mishead ) mishead = true;
+      if ( rtlastev != lastev && !mistrail ) mistrail = true;
+    }; 
     //
+    if ( IsDebug() ) printf(" bhere firstev is %i lastev is %i \n",firstev,lastev);
     this->FillClass(mishead,mistrail,firstev,lastev);
+    if ( IsDebug() ) printf(" chere firstev is %i lastev is %i \n",firstev,lastev);
     //
     if ( IsDebug() ) printf("The run is good, is it the other piece in the GL_RUN_FRAGMENTS table?\n");
     if ( IsDebug() ) printf(" C THIS RUN: RUNHEADER_OBT %u RUNTRAILER_OBT %u RUNHEADER_PKT %u RUNTRAILER_PKT %u \n", glrun->GetRUNHEADER_OBT(),glrun->GetRUNTRAILER_OBT(),glrun->GetRUNHEADER_PKT(),glrun->GetRUNTRAILER_PKT());
@@ -2690,9 +2804,14 @@
       glrun->Fill_GL_RUN_FRAGMENTS(conn);
       //
     } else {
-      if ( IsDebug() ) printf(" The run is already present in the fragment table \n");
-      if ( PEDANTIC ) throw -69;
-      return;
+      if ( IsDebug() ) printf(" The run is already present in the fragment table, relaxed %u \n",RELAXED);
+      if ( !RELAXED ){
+	if ( PEDANTIC ) throw -69;
+	return;
+      } else {
+	glrun->SetID((UInt_t)atoll(row->GetField(0)));
+	glrun->SetID_RUN_FRAG(0);
+      };
     };
     //
     if ( chewbacca && mishead && mistrail ) goto justcheck;
@@ -2743,7 +2862,7 @@
 	//
 	found = false; // default value
 	//
-	if ( IsDebug() ) printf(" Found a possible candidate, checking if it is the good one... \n");
+	if ( IsDebug() ) printf(" A Found a possible candidate, checking if it is the good one... \n");
 	//
 	// if we have both runheader and runtrailer we can check with pkt_counter:
 	//
@@ -2759,6 +2878,7 @@
 	    if ( IsDebug() ) printf(" FOUND!!! check %llu pktt %llu \n",chkpkt,pktt); 
 	    //
 	    found = true;
+	    if ( IsDebug() ) printf(" where firstev is %i lastev is %i \n",firstev,lastev);
 	    //
 	  } else {
 	    //
@@ -2824,6 +2944,7 @@
 	oss << " ID="<<row->GetField(0)<<";";
 	//
 	glrun1->Query_GL_RUN_FRAGMENTS(oss.str().c_str(),conn); // here we have runheader infos
+	if ( IsDebug() ) printf(" there firstev is %i lastev is %i \n",firstev,lastev);
 	//
 	// merge infos
 	//
@@ -2854,7 +2975,10 @@
 	glrun1->SetRUNTRAILER_OBT(glrun->GetRUNTRAILER_OBT());
 	glrun1->SetRUNTRAILER_PKT(glrun->GetRUNTRAILER_PKT());
 	//
+	if ( IsDebug() ) printf(" here firstev is %i lastev is %i \n",firstev,lastev);
+	//
 	glrun->SetEV_FROM(firstev);
+	glrun->SetEV_TO(lastev); // EM 10 RED ghost run bug
 	glrun->SetNEVENTS(lastev-firstev+1);
 	//
 	glrun->SetRUNHEADER_TIME(glrun1->GetRUNHEADER_TIME());
@@ -2946,7 +3070,7 @@
 	//
 	found = false; // default value
 	//
-	if ( IsDebug() ) printf(" Found a possible candidate, checking if it is the good one... \n");
+	if ( IsDebug() ) printf(" B Found a possible candidate, checking if it is the good one... \n");
 	//
 	// if we have both runheader and runtrailer we can check with pkt_counter:
 	//
@@ -3046,10 +3170,11 @@
 	  apkt = PKT(ph->GetCounter());
 	  aobt = OBT(ph->GetOrbitalTime());	
 	  lastev--;
-	  if ( PEDANTIC ) throw -72;
+	  if ( PEDANTIC && !RELAXED) throw -72;
 	};
 	if ( IsDebug() ) printf(" Check overlapping events done: %u %u %llu %llu lastev is %i\n",apkt,bpkt,aobt,bobt,lastev);
 	//
+	glrun->SetEV_FROM(firstev); // EM 10RED ghost run bug
 	glrun->SetEV_TO(lastev);
 	glrun->SetNEVENTS(lastev-firstev+1);
 	glrun->SetPKT_COUNTER(glrun1->GetPKT_COUNTER());
@@ -3114,7 +3239,7 @@
       // not found, has this run already inserted in the GL_RUN or in the GL_RUN_FRAGMENTS table?
       //
       oss.str("");
-      oss << " SELECT ID FROM GL_RUN WHERE "
+      oss << " SELECT ID,ID_ROOT_L0 FROM GL_RUN WHERE "
 	  << " BOOT_NUMBER=" << this->GetBOOTnumber() << " AND ("
 	  << " (RUNHEADER_TIME>=" << (UInt_t)(glrun->GetRUNHEADER_TIME()-10) << " AND "
 	  << " RUNTRAILER_TIME<=" << (UInt_t)(glrun->GetRUNTRAILER_TIME()+10) << " AND ("
@@ -3137,8 +3262,313 @@
       row = result->Next();
       //
       if ( row ){
-	if ( IsDebug() ) printf(" The run is already present in the GL_RUN table \n");
-	if ( PEDANTIC ) throw -70;
+	//
+	// we end up here if chewbacca and we have RH---| small gap |---RT, in this case the two pieces are attached and moved to GL_RUN. We are now processing the 
+	// "small gap" piece... we recognize this since: we have two entries from this query, the pkt number is consistent with our pkt number.
+	//
+	// 090112 [8RED (-70): RUN ALREADY INSERTED]
+	// 093012 [8RED (-70): RUN ALREADY INSERTED] try to be more general... the run has not been instered yet if the runheader-trailer PKT interval is not covered by already inserted runs, NOTICE: we must look in the GL_RUN_TRASH table!
+	//
+	Bool_t OK = false;
+	UInt_t IDRL2A = 0;
+	UInt_t IDRL2B = 0;
+	if ( chewbacca ){
+	  if ( result->GetRowCount() >= 2 ){
+	    //
+	    if ( IsDebug() ) printf(" RH---| gap |---RT case, number of pieces in the GL_RUN table: %i \n",result->GetRowCount());
+	    OK = true;
+	    IDRL2A = (UInt_t)atoll(row->GetField(0));
+	    //
+	    while ( row ){
+	      //
+	      TSQLResult *trresult = 0;
+	      TSQLRow    *trrow    = 0;
+	      //
+	      stringstream tross;
+	      tross.str("");
+	      //
+	      tross << " SELECT RUNHEADER_PKT, RUNTRAILER_PKT FROM GL_RUN_TRASH where ID=" << row->GetField(0) << ";";
+	      if ( IsDebug() ) printf(" check in the gl_run_trash table for pkt intervals: query is \n %s \n",tross.str().c_str());
+	      trresult = conn->Query(tross.str().c_str());
+	      if ( !trresult ) throw -4;
+	      trrow = trresult->Next();
+	      if ( !trrow || trresult->GetRowCount() != 1 ){
+		OK = false;
+		if ( IsDebug() ) printf(" OPS! no such run (or multiple runs!) in GL_RUN_TRASH table, something wrong is going on! \n");
+		break;
+	      };
+	      //
+	      UInt_t pktH =  (UInt_t)atoll(row->GetField(0));
+	      UInt_t pktT =  (UInt_t)atoll(row->GetField(1));
+	      delete trresult;
+	      if (
+		  (PKT(pktH) >= PKT(glrun->GetRUNHEADER_PKT()) && PKT(pktH) <= PKT(glrun->GetRUNTRAILER_PKT())) ||
+		  (PKT(pktT) >= PKT(glrun->GetRUNHEADER_PKT()) && PKT(pktT) <= PKT(glrun->GetRUNTRAILER_PKT())) ||
+		  (PKT(pktH) <= PKT(glrun->GetRUNTRAILER_PKT()) && PKT(pktT) >= PKT(glrun->GetRUNTRAILER_PKT())) ){	       
+		OK = false;
+		if ( IsDebug() ) printf(" The run is overlapping with already inserted ones!! \n");
+		break;		
+	      };
+	      //PKT(glrun->GetRUNHEADER_PKT())  PKT(glrun->GetRUNTRAILER_PKT())
+	      row = result->Next();
+	    };
+	    
+	    //	  if ( result->GetRowCount() == 2 ) {
+	    // 	    IDRL2A = (UInt_t)atoll(row->GetField(0));
+	    // 	    UInt_t IDRL0A = (UInt_t)atoll(row->GetField(1));
+	    // 	    row = result->Next();
+	    // 	    IDRL2B = (UInt_t)atoll(row->GetField(0));
+	    // 	    UInt_t IDRL0B = (UInt_t)atoll(row->GetField(1));
+	    // 	    if ( IsDebug() ) printf(" IDRL0A %u B %u IDRL2A %u B %u \n",IDRL0A,IDRL0B,IDRL2A,IDRL2B);
+	    // 	    //	    if ( IDRL0A == IDRL0B ){ //091230 why this condition???? RH could be in a file and RT in another one...
+	    // 	    if ( true ){
+	    // 	      TSQLResult *result2 = 0;
+	    // 	      TSQLRow    *row2    = 0;
+	    // 	      oss.str("");
+	    // 	      oss << "select PKT_NUMBER_FINAL from ROOT_TABLE_MERGING where REAL_TIME_INIT<" << chrtinit << " order by REAL_TIME_INIT desc limit 1;";
+	    // 	      if ( IsDebug() ) printf(" Check if we are in the case RH---| small gap |---RT: query is \n %s \n",oss.str().c_str());
+	    // 	      result2 = conn->Query(oss.str().c_str());
+	    // 	      //
+	    // 	      if ( !result2 ) throw -4;
+	    // 	      //
+	    // 	      row2 = result2->Next();
+	    // 	      //
+	    // 	      if ( row2 ){
+	    // 		UInt_t PKA = (UInt_t)atoll(row2->GetField(0));
+	    // 		delete result2;
+	    // 		oss.str("");
+	    // 		oss << "select PKT_NUMBER_INIT from ROOT_TABLE_MERGING where REAL_TIME_INIT>" << chrtinit << " order by REAL_TIME_INIT asc limit 1;";
+	    // 		if ( IsDebug() ) printf(" Check if we are in the case RH---| small gap |---RT: query is \n %s \n",oss.str().c_str());
+	    // 		result2 = conn->Query(oss.str().c_str());
+	    // 		//
+	    // 		if ( !result2 ) throw -4;
+	    // 		//
+	    // 		row2 = result2->Next();
+	    // 		//
+	    // 		if ( row2 ){
+	    // 		  UInt_t PKB = (UInt_t)atoll(row2->GetField(0));
+	    // 		  //
+	    // 		  if ( IsDebug() ) printf(" PKT(PKA) + 1 %llu == runheaderpkt %llu && PKB = runtrailer %llu + 1 %llu \n",PKT(PKA)+1LL, PKT(glrun->GetRUNHEADER_PKT()),PKT(PKB), PKT(glrun->GetRUNTRAILER_PKT())+1LL);
+	    // 		  if ( PKT(PKA)+1LL == PKT(glrun->GetRUNHEADER_PKT()) && PKT(PKB) == PKT(glrun->GetRUNTRAILER_PKT())+1LL ){
+	    // 		    if ( IsDebug() ) printf(" Ok, we are in the case: RH---| small gap |---RT \n");
+	    // 		    OK = true;
+	    // 		  };
+	    // 		};
+	    // 	      };		  
+	    // 	    };
+	    // 	  };	  
+	  };
+	};
+	if ( OK ){
+	  //
+	  // this is the case in which we must insert a piece of run between two fragments in the GL_RUN table // we arrive here ONLY with internal pieces of runs, never runheader or runtrailer by definition	  
+	  //
+	  // we have to update with runheader/trailer infos our run and we have to change the ROOT_ID_FRAG of the header piece ( 1/2 2/1 must become 1/3 3/2 2/1 )
+	  //
+	  if ( IsDebug() ) printf(" Ok, we are in the case: RH---| small gap |---RT \n");
+	  //
+	  GL_RUN *glA = new GL_RUN();
+	  glA->Query_GL_RUN(IDRL2A,conn);
+	  //
+	  glrun->SetRUNHEADER_TIME(glA->GetRUNHEADER_TIME());
+	  glrun->SetRUNHEADER_OBT(glA->GetRUNHEADER_OBT());
+	  glrun->SetRUNHEADER_PKT(glA->GetRUNHEADER_PKT());
+	  //
+	  glrun->SetRUNTRAILER_TIME(glA->GetRUNTRAILER_TIME());
+	  glrun->SetRUNTRAILER_OBT(glA->GetRUNTRAILER_OBT());
+	  glrun->SetRUNTRAILER_PKT(glA->GetRUNTRAILER_PKT());
+	  //
+	  if ( glA->GetPHYSENDRUN_MASK_S3S2S12() ) glrun->SetPHYSENDRUN_MASK_S3S2S12(glA->GetPHYSENDRUN_MASK_S3S2S12());
+	  if ( glA->GetPHYSENDRUN_MASK_S11CRC() ) glrun->SetPHYSENDRUN_MASK_S11CRC(glA->GetPHYSENDRUN_MASK_S11CRC());
+	  //	      
+	  if ( glA->GetACQ_BUILD_INFO() != 0 ){
+	    //
+	    // the first piece contains a good runheader we can update all the other runs with correct infos!
+	    //
+	    glrun->SetCOMPILATIONTIMESTAMP(glA->GetCOMPILATIONTIMESTAMP());
+	    glrun->SetFAV_WRK_SCHEDULE(glA->GetFAV_WRK_SCHEDULE());
+	    glrun->SetEFF_WRK_SCHEDULE(glA->GetEFF_WRK_SCHEDULE());
+	    glrun->SetPRH_VAR_TRG_MODE_A(glA->GetPRH_VAR_TRG_MODE_A());
+	    glrun->SetPRH_VAR_TRG_MODE_B(glA->GetPRH_VAR_TRG_MODE_B());
+	    glrun->SetACQ_BUILD_INFO(glA->GetACQ_BUILD_INFO());
+	    glrun->SetACQ_VAR_INFO(glA->GetACQ_VAR_INFO());
+	    glrun->SetRM_ACQ_AFTER_CALIB(glA->GetRM_ACQ_AFTER_CALIB());
+	    glrun->SetRM_ACQ_SETTING_MODE(glA->GetRM_ACQ_SETTING_MODE());
+	    glrun->SetTRK_CALIB_USED(glA->GetTRK_CALIB_USED());
+	    glrun->SetCAL_DSP_MASK(glA->GetCAL_DSP_MASK());
+	    glrun->SetLAST_TIMESYNC(glA->GetLAST_TIMESYNC());
+	    glrun->SetOBT_TIMESYNC(glA->GetOBT_TIMESYNC());
+	    //
+	  };
+	  //
+	  if ( glA->GetPKT_READY_COUNTER() != 0 ){
+	    //
+	    // the first piece contains a good runtrailer we can update all the other runs with correct infos!
+	    //
+	    glrun->SetPKT_COUNTER(glA->GetPKT_COUNTER());
+	    glrun->SetPKT_READY_COUNTER(glA->GetPKT_READY_COUNTER());
+	  };
+	  //
+	  // update runheader ROOT_ID_FRAG
+	  //
+	  oss.str("");
+	  oss << "UPDATE GL_RUN SET ID_RUN_FRAG = " << glrun->GetID() << " where ID = " << IDRL2A << ";";
+	  if ( IsDebug() ) printf(" update gl_run to have cross indexing: %s\n",oss.str().c_str());
+	  conn->Query(oss.str().c_str());
+	  //
+	  oss.str("");
+	  oss << "SELECT ID FROM GL_RUN WHERE ID_RUN_FRAG = " << IDRL2A << ";";
+	  if ( IsDebug() ) printf(" update gl_run to have cross indexing: %s\n",oss.str().c_str());
+	  TSQLResult *tsresult = 0;
+	  TSQLRow    *tsrow    = 0;
+	  tsresult=conn->Query(oss.str().c_str());
+	  if ( !tsresult ) throw -4;
+	  tsrow = tsresult->Next();
+	  if ( !tsrow || tsresult->GetRowCount() != 1 ) throw -4;
+	  IDRL2B = (UInt_t)atoll(tsrow->GetField(0));
+	  glrun->SetID_RUN_FRAG(IDRL2B);
+	  //
+	  // fill the new run in GL_RUN
+	  //
+	  glrun->Fill_GL_RUN(conn);	
+	  //
+	  glrun->DeleteRun(conn,0,"GL_RUN_FRAGMENTS");
+	  delete glA;
+	  //
+	} else {
+// 	  //
+// 	  // this is the case in which we must insert a piece of run between two fragments in the GL_RUN table
+// 	  //
+// 	  // we have to update with runheader/trailer infos our run and we have to change the ROOT_ID_FRAG of the header piece ( 1/2 2/1 must become 1/3 3/2 2/1 )
+// 	  //
+// 	  GL_RUN *glA = new GL_RUN();
+// 	  glA->Query_GL_RUN(IDRL2A,conn);
+// 	  //
+// 	  if ( glA->GetACQ_BUILD_INFO() != 0 ){
+// 	    //
+// 	    // the first piece contains a good runheader we can update all the other runs with correct infos!
+// 	    //
+// 	    oss.str("");
+// 	    oss << "UPDATE GL_RUN_FRAGMENTS SET "
+// 		<< " RUNHEADER_TIME=" << glA->GetRUNHEADER_TIME()<< " , "
+// 		<< " RUNHEADER_OBT=" << glA->GetRUNHEADER_OBT()<< " , "
+// 		<< " RUNHEADER_PKT=" << glA->GetRUNHEADER_PKT()<< " , "
+// 		<< " COMPILATIONTIMESTAMP=" << glA->GetCOMPILATIONTIMESTAMP()<< " , "
+// 		<< " FAV_WRK_SCHEDULE=" << glA->GetFAV_WRK_SCHEDULE()<< " , "
+// 		<< " EFF_WRK_SCHEDULE=" << glA->GetEFF_WRK_SCHEDULE()<< " , "
+// 		<< " PRH_VAR_TRG_MODE_A=" << glA->GetPRH_VAR_TRG_MODE_A()<< " , "
+// 		<< " PRH_VAR_TRG_MODE_B=" << glA->GetPRH_VAR_TRG_MODE_B()<< " , "
+// 		<< " ACQ_BUILD_INFO=" << glA->GetACQ_BUILD_INFO()<< " , "
+// 		<< " ACQ_VAR_INFO=" << glA->GetACQ_VAR_INFO()<< " , "
+// 		<< " RM_ACQ_AFTER_CALIB=" << glA->GetRM_ACQ_AFTER_CALIB()<< " , "  
+// 		<< " RM_ACQ_SETTING_MODE=" << glA->GetRM_ACQ_SETTING_MODE()<< " , "  
+// 		<< " TRK_CALIB_USED=" << glA->GetTRK_CALIB_USED()<< " , "  
+// 		<< " CAL_DSP_MASK=" << glA->GetCAL_DSP_MASK()<< " , "  
+// 		<< " LAST_TIMESYNC=" << glA->GetLAST_TIMESYNC()<< " , ";
+// 	    //
+// 	    if ( glA->GetPHYSENDRUN_MASK_S3S2S12() )
+// 	      oss << " PHYSENDRUN_MASK_S3S2S12=" << glA->GetPHYSENDRUN_MASK_S3S2S12() << " , "; 
+// 	    if ( glA->GetPHYSENDRUN_MASK_S11CRC() )
+// 	      oss << " PHYSENDRUN_MASK_S11CRC=" << glA->GetPHYSENDRUN_MASK_S11CRC() << " , ";
+// 	    //	      
+// 	    oss << " OBT_TIMESYNC=" << glA->GetOBT_TIMESYNC();
+// 	    oss << " WHERE ID=" << glrun->GetID() << ";";
+// 	    if ( IsDebug() ) printf(" update with correct infos: %s\n",oss.str().c_str());
+// 	    conn->Query(oss.str().c_str());	
+// 	    //
+// 	  } else {
+// 	    //
+// 	    // sig no runheader, let set anyway what is possible...
+// 	    //
+// 	    oss.str("");
+// 	    oss << "UPDATE GL_RUN_FRAGMENTS SET "
+// 		<< " RUNHEADER_TIME=" << glA->GetRUNHEADER_TIME()<< " , ";
+// 	    //
+// 	    if ( glA->GetPHYSENDRUN_MASK_S3S2S12() )
+// 	      oss << " PHYSENDRUN_MASK_S3S2S12=" << glA->GetPHYSENDRUN_MASK_S3S2S12()<< " , ";
+// 	    if ( glA->GetPHYSENDRUN_MASK_S11CRC() )
+// 	      oss << " PHYSENDRUN_MASK_S11CRC=" << glA->GetPHYSENDRUN_MASK_S11CRC()<< " , "; 
+// 	    //	      
+// 	    oss << " RUNHEADER_OBT=" << glA->GetRUNHEADER_OBT()<< " , "
+// 		<< " RUNHEADER_PKT=" << glA->GetRUNHEADER_PKT();
+// 	    oss << " WHERE ID=" << glrun->GetID() << ";";
+// 	    if ( IsDebug() ) printf(" update with correct infos2: %s\n",oss.str().c_str());
+// 	    conn->Query(oss.str().c_str());	
+// 	  };
+// 	  //
+// 	  // update runheader ROOT_ID_FRAG
+// 	  //
+// 	  oss.str("");
+// 	  oss << "UPDATE GL_RUN SET ID_RUN_FRAG = " << glrun->GetID() << " where ID = " << IDRL2A << ";";
+// 	  if ( IsDebug() ) printf(" update gl_run to have cross indexing: %s\n",oss.str().c_str());
+// 	  conn->Query(oss.str().c_str());
+// 	  //
+// 	  // now let's look for runtrailer if any in the last run
+// 	  //
+// 	  glA->Query_GL_RUN(IDRL2B,conn);
+// 	  //
+// 	  if ( glA->GetPKT_READY_COUNTER() != 0 ){
+// 	    //
+// 	    // the first piece contains a good runtrailer we can update all the other runs with correct infos!
+// 	    //
+// 	    oss.str("");
+// 	    oss << "UPDATE GL_RUN_FRAGMENTS SET "
+// 		<< " RUNTRAILER_TIME=" << glA->GetRUNTRAILER_TIME()<< " , "
+// 		<< " RUNTRAILER_OBT=" << glA->GetRUNTRAILER_OBT()<< " , "
+// 		<< " RUNTRAILER_PKT=" << glA->GetRUNTRAILER_PKT()<< " , "
+// 		<< " PKT_COUNTER=" << glA->GetPKT_COUNTER()<< " , ";
+// 	    //
+// 	    if ( glA->GetPHYSENDRUN_MASK_S3S2S12() ){
+// 	      oss << " PHYSENDRUN_MASK_S3S2S12=" << glA->GetPHYSENDRUN_MASK_S3S2S12()<< " , "; };
+// 	    if ( glA->GetPHYSENDRUN_MASK_S11CRC() ) {
+// 	      oss << " PHYSENDRUN_MASK_S11CRC=" << glA->GetPHYSENDRUN_MASK_S11CRC()<< " , "; };
+// 	    //	      
+// 	    oss << " PKT_READY_COUNTER=" << glA->GetPKT_READY_COUNTER()
+// 		<< " WHERE ID=" << glrun->GetID() << ";";
+// 	    if ( IsDebug() ) printf(" update with correct trailer infos: %s\n",oss.str().c_str());
+// 	    conn->Query(oss.str().c_str());	
+// 	    //
+// 	  } else {
+// 	    //
+// 	    // sig no runtrailer, let set anyway what is possible...
+// 	    //
+// 	    oss.str("");
+// 	    oss << "UPDATE GL_RUN_FRAGMENTS SET "
+// 		<< " RUNTRAILER_TIME=" << glA->GetRUNTRAILER_TIME()<< " , "
+// 		<< " RUNTRAILER_OBT=" << glA->GetRUNTRAILER_OBT()<< " , ";
+// 	      //
+// 	    if ( glA->GetPHYSENDRUN_MASK_S3S2S12() ){
+// 	      oss << " PHYSENDRUN_MASK_S3S2S12=" << glA->GetPHYSENDRUN_MASK_S3S2S12()<< " , "; };
+// 	    if ( glA->GetPHYSENDRUN_MASK_S11CRC() ){
+// 	      oss << " PHYSENDRUN_MASK_S11CRC=" << glA->GetPHYSENDRUN_MASK_S11CRC()<< " , "; };
+// 	    //	      
+// 	    oss << " RUNTRAILER_PKT=" << glrun->GetRUNTRAILER_PKT()
+// 		<< " WHERE ID=" << glrun->GetID() << ";";
+// 	    if ( IsDebug() ) printf(" update with correct trailer infos2: %s\n",oss.str().c_str());
+// 	    conn->Query(oss.str().c_str());	
+// 	  };
+// 	  //
+// 	  UInt_t myi = glrun->GetID();
+// 	  oss.str("");
+// 	  oss << " ID= "<< myi;
+// 	  //
+// 	  glrun->Query_GL_RUN_FRAGMENTS(oss.str().c_str(),conn);   
+// 	  //
+// 	  // fill the new run in GL_RUN
+// 	  //
+// 	  glrun->SetID_RUN_FRAG(IDRL2B);
+// 	  glrun->Fill_GL_RUN(conn);	
+// 	  glrun->DeleteRun(conn,0,"GL_RUN_FRAGMENTS");
+// 	  delete glA;
+// 	  //
+// 	} else {
+	  //
+	  // is just a repetition
+	  //
+	  if ( IsDebug() ) printf(" The run is already present in the GL_RUN table \n");	
+	  if ( PEDANTIC ) throw -70;
+	};
+	//
       } else {
 	if ( NoFrag() ){
 	  glrun->SetID_RUN_FRAG(glrun->GetID());
@@ -3175,7 +3605,7 @@
       glrun->SetID(this->AssignRunID());
       glrun->SetID_RUN_FRAG(0);
       glrun->Fill_GL_RUN(conn);    // it'ok we arrive here only inside a file hence in the middle of the runs...
-    };
+      };
     //
   };
   //
@@ -3191,7 +3621,7 @@
   //  
   EventCounter *code=0;
   //
-  UInt_t nevent = 0;
+  //  UInt_t nevent = 0;
   UInt_t checkfirst = 0;
   UInt_t checklast = 0;
   UInt_t firstentry = 0;
@@ -3213,12 +3643,13 @@
   EventHeader *eh = 0;
   PscuHeader *ph = 0;
   T->SetBranchAddress("Header", &eh);
-  nevent = T->GetEntries();
+  //  nevent = T->GetEntries();
   //
   //
   if ( firstev == lastev+1 || lastev == firstev ) { // no events inside the run!
     //if ( firstev <= lastev+1 ) { // no events inside the run!
     if ( IsDebug() ) printf(" Checking but no events in the run! \n");
+    firstev = lastev+1; // this is necessary for files with no Physics entries, should have no influence on other files
     // return true is correct
     return(true);
     //
@@ -3474,7 +3905,7 @@
 		//
 		found = false; // default value
 		//
-		if ( IsDebug() ) printf(" Found a possible candidate, checking if it is the good one... \n");
+		if ( IsDebug() ) printf(" C Found a possible candidate, checking if it is the good one... \n");
 		//
 		// if we have both runheader and runtrailer we can check with pkt_counter:
 		//
@@ -3586,6 +4017,7 @@
 		glrun1->SetRUNTRAILER_PKT(glrun->GetRUNTRAILER_PKT());
 		//
 		glrun->SetEV_FROM(firstev);
+    	        glrun->SetEV_TO(lastev); // 10 RED ghost run bug
 		glrun->SetNEVENTS(lastev-firstev+1);
 		//
 		glrun->SetRUNHEADER_TIME(glrun1->GetRUNHEADER_TIME());
@@ -3733,7 +4165,7 @@
   EventCounter *code=0;
   UInt_t firstev = 0;
   UInt_t lastev = 0;
-  UInt_t nevent = 0;
+  //  UInt_t nevent = 0;
   UInt_t checkfirst = 0;
   UInt_t checklast = 0;
   UInt_t firstentry = 0;
@@ -3758,7 +4190,7 @@
   EventHeader *eh = 0;
   PscuHeader *ph = 0;
   T->SetBranchAddress("Header", &eh);
-  nevent = T->GetEntries();
+  //  nevent = T->GetEntries();
   //
   codt = eht->GetCounter();
   codh = ehh->GetCounter();
@@ -3992,6 +4424,7 @@
   UInt_t totime = 0;
   UInt_t obt = 0;
   UInt_t pkt = 0;
+  Float_t totped = 0.;
   //
   tr = (TTree*)file->Get("CalibCalPed");
   if ( !tr || tr->IsZombie() ) throw -21;
@@ -4009,6 +4442,22 @@
       if ( calibCalPed->cstwerr[section] ){
 	valid = 1;
 	if ( calibCalPed->cperror[section] ) valid = 0;
+	//
+	// check pedestal values for one plane, if all zeros calibration is not valid (calorimeter power problems) [8th data reduction bug, fixed on 25/11/2009 by E.M.]
+	//
+	totped = 0.;
+	Int_t ns = 0;
+	if ( section == 2 ) ns = 3; 
+	if ( section == 3 ) ns = 1; 
+	if ( section == 1 ) ns = 2; 
+	for (UInt_t ss=0; ss<96; ss++){
+	  totped += fabs(calibCalPed->calped[ns][0][ss]);
+	}
+	if ( totped < 1. ){
+	  if ( IsDebug() ) printf(" Section %i totped %f -  No calibration data! Calorimeter power problems? \n",section,totped);
+	  valid = 0;
+	};
+	//
 	ph = eh->GetPscuHeader();
 	obt = ph->GetOrbitalTime();  
 	pkt = ph->GetCounter();  
@@ -4176,6 +4625,8 @@
   tr->SetBranchAddress("Header", &eh);
   nevents = tr->GetEntries();
   //
+  Float_t totpul = 0.;
+  //
   if ( nevents > 0 ){
     //
     for (UInt_t i=0; i < nevents; i++){
@@ -4185,6 +4636,22 @@
 	if ( cp1->pstwerr[section] && cp1->unpackError == 0 ){
 	  valid = 1;
 	  if ( cp1->pperror[section] ) valid = 0;
+	  //
+	  // check pulse values for one plane, if all zeros calibration is not valid (calorimeter power problems) [8th data reduction bug, fixed on 25/11/2009 by E.M.]
+	  //
+	  totpul = 0.;
+	  Int_t ns = 0;
+	  if ( section == 2 ) ns = 3; 
+	  if ( section == 3 ) ns = 1; 
+	  if ( section == 1 ) ns = 2; 
+	  for (UInt_t ss=0; ss<96; ss++){
+	    totpul += cp1->calpuls[ns][0][ss];
+	  }
+	  if ( totpul >= 3145632. ){
+	    if ( IsDebug() ) printf(" PULSE1 Section %i totpul %f -  No calibration data! Calorimeter power problems? \n",section,totpul);
+	    valid = 0;
+	  };
+	  //
 	  ph = eh->GetPscuHeader();
 	  obt = ph->GetOrbitalTime();  
 	  pkt = ph->GetCounter();  
@@ -4342,6 +4809,22 @@
 	if ( cp2->pstwerr[section] && cp2->unpackError == 0 ){
 	  valid = 1;
 	  if ( cp2->pperror[section] ) valid = 0;
+	  //
+	  // check pulse values for one plane, if all zeros calibration is not valid (calorimeter power problems) [8th data reduction bug, fixed on 25/11/2009 by E.M.]
+	  //
+	  totpul = 0.;
+	  Int_t ns = 0;
+	  if ( section == 2 ) ns = 3; 
+	  if ( section == 3 ) ns = 1; 
+	  if ( section == 1 ) ns = 2; 
+	  for (UInt_t ss=0; ss<96; ss++){
+	    totpul += cp2->calpuls[ns][0][ss];
+	  }
+	  if ( totpul >= 3145632. ){
+	    if ( IsDebug() ) printf(" PULSE2 Section %i totpul %f -  No calibration data! Calorimeter power problems? \n",section,totpul);
+	    valid = 0;
+	  };
+	  //
 	  ph = eh->GetPscuHeader();
 	  obt = ph->GetOrbitalTime();  
 	  pkt = ph->GetCounter();  
@@ -4707,7 +5190,8 @@
     if ( !result ) throw -4;;
     row = result->Next();
     if(row)glcal->ID = (UInt_t)atoll(row->GetField(0));
-
+    //
+    delete result; // mmm... "Error in <TMySQLResult::Next>: result set closed" solved? 090112 [8RED error messages]
     //
 };
 
@@ -4989,7 +5473,8 @@
 
 	if ( IsDebug() ) cout << endl << ">>>> TRY TO RECOVER TRACKER CALIBRATIONS <<<<"<<endl;
 
-	TSQLResult *result = 0;
+	TSQLResult *rresult = 0; // 10RED bug, result is re-used inside result looop...
+	TSQLResult *result = 0; // 10RED bug, result is re-used inside result looop...
 	TSQLRow    *row    = 0;
 	//
 	stringstream oss;
@@ -5019,7 +5504,7 @@
 	oss << " ORDER BY ID DESC LIMIT "<<ncalib<<"; ";	
 	if ( IsDebug() ) cout << oss.str().c_str() << endl;
 
-	result = conn->Query(oss.str().c_str());
+	rresult = conn->Query(oss.str().c_str());
 	if ( !result ) throw -4;;
 	if ( IsDebug() ) cout <<"Rows: "<<result->GetRowCount()<<endl;
 	
@@ -5028,7 +5513,7 @@
 	// -----------------------------------
 	UInt_t nn=0;
 	do {
-	    row = result->Next();
+            row = rresult->Next();
 	    if(!row)break;
 	    
 	    UInt_t id       = (UInt_t)atoll(row->GetField(0));
@@ -5067,9 +5552,9 @@
 	    TString path       = "";
 	    TString name       = "";
 	    TString raw        = "";
-	    UInt_t obt0        = 0;
-	    UInt_t timesync    = 0;
-	    UInt_t boot_number = 0;
+            //	    UInt_t obt0        = 0;
+            //	    UInt_t timesync    = 0;
+            //	    UInt_t boot_number = 0;
 	    bool   FOUND       = false;
 
 	    if ( IsDebug() ) cout << "------------------------------------------------------------" <<endl;
@@ -5142,9 +5627,9 @@
 		    path       = (TString)row2->GetField(0);
 		    name       = (TString)row2->GetField(1);
 		    raw        = (TString)row2->GetField(5);
-		    obt0        = (UInt_t)atoll(row2->GetField(2));
-		    timesync    = (UInt_t)atoll(row2->GetField(3));
-		    boot_number = (UInt_t)atoll(row2->GetField(4));
+                    //		    obt0        = (UInt_t)atoll(row2->GetField(2));
+                    //		    timesync    = (UInt_t)atoll(row2->GetField(3));
+                    //		    boot_number = (UInt_t)atoll(row2->GetField(4));
 		
 		    if ( IsDebug() ) cout << "- - - - - - - - - - -" <<endl;
 //		    cout << path <<endl;
@@ -5208,68 +5693,70 @@
 		    if(FOUND)break;
 
 		}while(1);//endl loop over root table entries
-
+                
+                delete result2; // 10RED potential memory leak
 		if(FOUND)break;
 
 	    }//end loop over tables 
 
 	    if(FOUND){
 
-	    if ( IsDebug() ) cout << " >>> REPETITION FOUND :-) <<<" <<endl;
-
-		////////////////////////////////////////////
-		// insert a new entry in GL_TRK_CALIB and 
-		// modify the time-tag of the previous one
-		////////////////////////////////////////////
+	      if ( IsDebug() ) cout << " >>> REPETITION FOUND :-) <<<" <<endl;
 
-		// ---------------------------------------------------------------------
-		// step 1: insert a new raw file in GL_RAW
-		// ---------------------------------------------------------------------
-		//
-		// check if the raw file already exist
-		//
-	        UInt_t id_raw = 0;   // EM GL_RAW is there only for backward compatibility so we do not need to fill it when in "chewbacca" mode
-// 		oss.str("");
-// 		oss << "SELECT ID FROM GL_RAW where NAME=\"" << gSystem->BaseName(raw.Data()) <<"\";";
-// 		if ( IsDebug() ) cout << oss.str().c_str() << endl;
+	      ////////////////////////////////////////////
+	      // insert a new entry in GL_TRK_CALIB and 
+	      // modify the time-tag of the previous one
+	      ////////////////////////////////////////////
+
+	      // ---------------------------------------------------------------------
+	      // step 1: insert a new raw file in GL_RAW
+	      // ---------------------------------------------------------------------
+	      //
+	      // check if the raw file already exist
+	      //
+	      UInt_t id_raw = 0;   // EM GL_RAW is there only for backward compatibility so we do not need to fill it when in "chewbacca" mode
+	      // 		oss.str("");
+	      // 		oss << "SELECT ID FROM GL_RAW where NAME=\"" << gSystem->BaseName(raw.Data()) <<"\";";
+	      // 		if ( IsDebug() ) cout << oss.str().c_str() << endl;
 		
-// 		result = conn->Query(oss.str().c_str());
-// 		if ( !result ) throw -4;;
-// 		if ( IsDebug() ) cout <<"Rows: "<<result->GetRowCount()<<endl;
-// 		if( result->GetRowCount() == 0){
-// 		    if ( IsDebug() ) cout << " << Insert new RAW file >> "<<endl;
-// 		    // - - - - - - - - - - -
-// 		    // insert new raw file
-// 		    // - - - - - - - - - - - 
-// 		    GL_RAW glraw = GL_RAW();    
-// 		    glraw.PATH        = gSystem->DirName(raw.Data());
-// 		    glraw.NAME        = gSystem->BaseName(raw.Data());
-// 		    glraw.BOOT_NUMBER = boot_number;
-// 		    //
-// 		    insertPamelaRawFile( &glraw );
-// 		    //		    
-// 		    id_raw = glraw.ID;		    
-// 		}else{
-// 		    row = result->Next();
-// 		    id_raw = (UInt_t)atoll(row->GetField(0));
-// 		}
-// 		if ( IsDebug() ) cout << "ID_RAW = "<<id_raw<<endl;
-
-		// ---------------------------------------------------------------------
-		// step 1(bis): retrieve the timesync id associated to the file
-		// (NB, uso lo stesso associato al file iniziale)
-		// ---------------------------------------------------------------------
-		UInt_t idtimesync = 0;
-		oss.str("");
-		oss << " SELECT ID FROM GL_TIMESYNC where TIMESYNC="<<chlastts<<" AND OBT0="<<chobtts*1000<<" limit 1;";
-		if ( debug ) printf(" %s \n",oss.str().c_str());
-		result = conn->Query(oss.str().c_str());
-		if ( !result ) throw -3;
+	      // 		result = conn->Query(oss.str().c_str());
+	      // 		if ( !result ) throw -4;;
+	      // 		if ( IsDebug() ) cout <<"Rows: "<<result->GetRowCount()<<endl;
+	      // 		if( result->GetRowCount() == 0){
+	      // 		    if ( IsDebug() ) cout << " << Insert new RAW file >> "<<endl;
+	      // 		    // - - - - - - - - - - -
+	      // 		    // insert new raw file
+	      // 		    // - - - - - - - - - - - 
+	      // 		    GL_RAW glraw = GL_RAW();    
+	      // 		    glraw.PATH        = gSystem->DirName(raw.Data());
+	      // 		    glraw.NAME        = gSystem->BaseName(raw.Data());
+	      // 		    glraw.BOOT_NUMBER = boot_number;
+	      // 		    //
+	      // 		    insertPamelaRawFile( &glraw );
+	      // 		    //		    
+	      // 		    id_raw = glraw.ID;		    
+	      // 		}else{
+	      // 		    row = result->Next();
+	      // 		    id_raw = (UInt_t)atoll(row->GetField(0));
+	      // 		}
+	      // 		if ( IsDebug() ) cout << "ID_RAW = "<<id_raw<<endl;
+
+	      // ---------------------------------------------------------------------
+	      // step 1(bis): retrieve the timesync id associated to the file
+	      // (NB, uso lo stesso associato al file iniziale)
+	      // ---------------------------------------------------------------------
+	      UInt_t idtimesync = 0;
+	      oss.str("");
+              oss << " SELECT ID FROM GL_TIMESYNC where TIMESYNC="<<chlastts<<" AND OBT0="<<chobtts*1000<<" and ID_RESURS_OFFSET="<< idresof <<" limit 1;"; // 10RED BUG!!!! without 'and ID_RESURS_OFFSET="<< idresof ' this query is not enough to ensure finding the correct line in GL_TIMSYNC...
+	      if ( debug ) printf(" %s \n",oss.str().c_str());
+	      result = conn->Query(oss.str().c_str());
+	      if ( !result ) throw -3;
 		row = result->Next();
 		if ( !row ) throw -3;
 		idtimesync = (UInt_t)atoll(row->GetField(0));
 		if ( IsDebug() ) cout << "ID_TIMESYNC = "<<idtimesync<<endl;
 		
+		delete result;// mmm... "Error in <TMySQLResult::Next>: result set closed" solved? 090112 [8RED error messages]
 		// ---------------------------------------------------------------------
 		// step 2: insert a new root file in GL_ROOT
 		// ---------------------------------------------------------------------
@@ -5317,6 +5804,7 @@
 		}
 		if ( IsDebug() ) cout << "ID_ROOT = "<<id_root<<endl;
 
+		delete result;// mmm... "Error in <TMySQLResult::Next>: result set closed" solved? 090112 [8RED error messages]
 		// ---------------------------------------------------------------------
 		// step 3: modify time-tag of corrupted GL_TRK_CALIB entry
 		// ---------------------------------------------------------------------
@@ -5329,6 +5817,8 @@
 		result = conn->Query(oss.str().c_str());
 		if ( !result ) throw -4;;
 
+		delete result; // mmm... "Error in <TMySQLResult::Next>: result set closed" solved? 090112 [8RED error messages]
+
 		// ---------------------------------------------------------------------
 		// step 4: insert the new calibration:
 		// ---------------------------------------------------------------------
@@ -5358,7 +5848,7 @@
 	}while(1);//end loop over calibrations
 	
 	
-	if( result )delete result;
+	if( rresult )delete rresult; // 10RED bug
 	if( row    )delete row;
 	
 	
@@ -5659,7 +6149,7 @@
     memset(myid,0,500*sizeof(UInt_t));
     //
     oss.str("");
-    oss << "SELECT ID,RUNTRAILER_TIME,RUNTRAILER_PKT,BOOT_NUMBER FROM GL_RUN_FRAGMENTS WHERE INSERT_TIME <= '" << clean_time->AsSQLString() << "'order BY RUNHEADER_TIME asc;";
+    oss << "SELECT ID,RUNTRAILER_TIME,RUNTRAILER_PKT,BOOT_NUMBER FROM GL_RUN_FRAGMENTS WHERE INSERT_TIME <= '" << clean_time->AsSQLString() << "' order BY RUNHEADER_TIME asc;";
     if ( IsDebug() ) printf(" Select from GL_RUN_FRAGMENTS runs older than %s : query is \n %s \n",clean_time->AsSQLString(),oss.str().c_str());
     nresult = conn->Query(oss.str().c_str());
     //
@@ -5690,7 +6180,7 @@
 	  while ( anr ){
 	    //
 	    oss.str("");
-	    oss << "SELECT ID,RUNTRAILER_TIME,RUNTRAILER_PKT,BOOT_NUMBER FROM GL_RUN_FRAGMENTS WHERE BOOT_NUMBER=" << mbo << " AND RUNHEADER_PKT=" << mrhp <<  "+1 AND ABS(RUNHEADER_TIME-"<< mrht <<")<=1 AND INSERT_TIME <= '" << clean_time->AsSQLString() << "' order BY RUNHEADER_TIME asc;";
+	    oss << "SELECT ID,RUNTRAILER_TIME,RUNTRAILER_PKT,BOOT_NUMBER FROM GL_RUN_FRAGMENTS WHERE BOOT_NUMBER=" << mbo << " AND RUNHEADER_PKT=" << mrhp <<  "+1 AND ABS(RUNHEADER_TIME-"<< (float)mrht <<")<=1 AND INSERT_TIME <= '" << clean_time->AsSQLString() << "' order BY RUNHEADER_TIME asc;"; // 10RED MYSQL OPERATOR BUG
 	    if ( IsDebug() ) printf(" In the loop searching for fragmented runs : query is \n %s \n",oss.str().c_str());
 	    //
 	    nresult1 = conn->Query(oss.str().c_str());
@@ -5780,7 +6270,8 @@
 		oss << " PHYSENDRUN_MASK_S11CRC=" << glrun->GetPHYSENDRUN_MASK_S11CRC()<< " , "; 
 	      //	      
 	      oss << " RUNHEADER_OBT=" << glrun->GetRUNHEADER_OBT()<< " , "
-		  << " RUNHEADER_PKT=" << glrun->GetRUNHEADER_PKT()<< ";";
+		  << " RUNHEADER_PKT=" << glrun->GetRUNHEADER_PKT();
+	      oss << " WHERE ID=" << myid[u] << ";"; // BUG!!! 090112
 	      conn->Query(oss.str().c_str());	
 	    };	  
 	  };
@@ -5829,7 +6320,8 @@
 	      if ( glrun->GetPHYSENDRUN_MASK_S11CRC() ){
 		oss << " PHYSENDRUN_MASK_S11CRC=" << glrun->GetPHYSENDRUN_MASK_S11CRC()<< " , "; };
 	      //	      
-	      oss << " RUNTRAILER_PKT=" << glrun->GetRUNTRAILER_PKT()<< ";";
+	      oss << " RUNTRAILER_PKT=" << glrun->GetRUNTRAILER_PKT();
+	      oss << " WHERE ID=" << myid[u] << ";"; // BUG!!! 090112
 	      conn->Query(oss.str().c_str());	
 	    };	  
 	  };
@@ -5880,7 +6372,7 @@
 	      row2 = result2->Next();
 	      //
 	      if ( row2 ){
-		if ( IsDebug() ) printf(" The already exist in the GL_RUN table! \n");
+		if ( IsDebug() ) printf(" The run already exists in the GL_RUN table! \n");
 		if ( PEDANTIC ) throw -83;
 		row2->Close();
 	      };
@@ -5957,7 +6449,7 @@
       glrun->Query_GL_RUN_FRAGMENTS(oss.str().c_str(),conn);   
       //
       oss.str("");
-      oss << " SELECT ID,NEVENTS,TRK_CALIB_USED,PKT_COUNTER FROM GL_RUN WHERE "
+      oss << " SELECT ID,NEVENTS,TRK_CALIB_USED,PKT_COUNTER,ID_ROOT_L0 FROM GL_RUN WHERE "
 	  << " BOOT_NUMBER=" << glrun->GetBOOT_NUMBER() << " AND ("
 	  << " (RUNHEADER_TIME>=" << (UInt_t)(glrun->GetRUNHEADER_TIME()-10) << " AND "
 	  << " RUNTRAILER_TIME<=" << (UInt_t)(glrun->GetRUNTRAILER_TIME()+10) << " AND ("
@@ -6015,8 +6507,199 @@
 	moved++;
 	//
       } else {
-	if ( IsDebug() ) printf(" The already exist in the GL_RUN table! \n");
-	if ( PEDANTIC ) throw -83;
+
+	// questa parte mah mah mah... da controllare
+
+	//
+	// we end up here if chewbacca and we have RH---| small gap |---RT, in this case the two pieces are attached and moved to GL_RUN. We are now processing the 
+	// "small gap" piece... we recognize this since: we have two entries from this query, the pkt number is consistent with our pkt number.
+	//
+	// 090112 [8RED (-70): RUN ALREADY INSERTED]
+	//
+	Bool_t OK = false;
+	UInt_t IDRL2A = 0;
+	UInt_t IDRL2B = 0;
+	  if ( result2->GetRowCount() == 2 ){
+	    IDRL2A = (UInt_t)atoll(row2->GetField(0));
+	    UInt_t IDRL0A = (UInt_t)atoll(row2->GetField(4));
+	    row2 = result2->Next();
+	    IDRL2B = (UInt_t)atoll(row2->GetField(0));
+	    UInt_t IDRL0B = (UInt_t)atoll(row2->GetField(4));
+	    if ( IsDebug() ) printf(" IDRL0A %u B %u IDRL2A %u B %u \n",IDRL0A,IDRL0B,IDRL2A,IDRL2B);
+	    //	    if ( IDRL0A == IDRL0B ){
+// 	      TSQLResult *result2a = 0;
+// 	      TSQLRow    *row2a    = 0;
+// 	      oss.str("");
+// 	      oss << "select PKT_NUMBER_FINAL from ROOT_TABLE_MERGING where REAL_TIME_INIT<" << chrtinit << " order by REAL_TIME_INIT desc limit 1;";
+// 	      if ( IsDebug() ) printf(" Check if we are in the case RH---| small gap |---RT: query is \n %s \n",oss.str().c_str());
+// 	      result2a = conn->Query(oss.str().c_str());
+// 	      //
+// 	      if ( !result2a ) throw -4;
+// 	      //
+// 	      row2a = result2a->Next();
+// 	      //
+// 	      if ( row2a ){
+// 		UInt_t PKA = (UInt_t)atoll(row2a->GetField(0));
+// 		delete result2a;
+// 		oss.str("");
+// 		oss << "select PKT_NUMBER_INIT from ROOT_TABLE_MERGING where REAL_TIME_INIT>" << chrtinit << " order by REAL_TIME_INIT asc limit 1;";
+// 		if ( IsDebug() ) printf(" Check if we are in the case RH---| small gap |---RT: query is \n %s \n",oss.str().c_str());
+// 		result2a = conn->Query(oss.str().c_str());
+// 		//
+// 		if ( !result2a ) throw -4;
+// 		//
+// 		row2a = result2a->Next();
+// 		//
+// 		if ( row2a ){
+// 		  UInt_t PKB = (UInt_t)atoll(row2a->GetField(0));
+// 		  //
+// 		  if ( IsDebug() ) printf(" PKT(PKA) + 1 %llu == runheaderpkt %llu && PKB = runtrailer %llu + 1 %llu \n",PKT(PKA)+1LL, PKT(glrun->GetRUNHEADER_PKT()),PKT(PKB), PKT(glrun->GetRUNTRAILER_PKT())+1LL);
+// 		  if ( PKT(PKA)+1LL == PKT(glrun->GetRUNHEADER_PKT()) && PKT(PKB) == PKT(glrun->GetRUNTRAILER_PKT())+1LL ){
+// 		    if ( IsDebug() ) printf(" Ok, we are in the case: RH---| small gap |---RT \n");
+		    OK = true;
+		    //		  };
+		    //		};
+		    //	      };		  
+		    //	  };
+	  };	  
+	if ( OK ){
+	  //
+	  // this is the case in which we must insert a piece of run between two fragments in the GL_RUN table
+	  //
+	  // we have to update with runheader/trailer infos our run and we have to change the ROOT_ID_FRAG of the header piece ( 1/2 2/1 must become 1/3 3/2 2/1 )
+	  //
+	  GL_RUN *glA = new GL_RUN();
+	  glA->Query_GL_RUN(IDRL2A,conn);
+	  //
+	  if ( glA->GetACQ_BUILD_INFO() != 0 ){
+	    //
+	    // the first piece contains a good runheader we can update all the other runs with correct infos!
+	    //
+	    oss.str("");
+	    oss << "UPDATE GL_RUN_FRAGMENTS SET "
+		<< " RUNHEADER_TIME=" << glA->GetRUNHEADER_TIME()<< " , "
+		<< " RUNHEADER_OBT=" << glA->GetRUNHEADER_OBT()<< " , "
+		<< " RUNHEADER_PKT=" << glA->GetRUNHEADER_PKT()<< " , "
+		<< " COMPILATIONTIMESTAMP=" << glA->GetCOMPILATIONTIMESTAMP()<< " , "
+		<< " FAV_WRK_SCHEDULE=" << glA->GetFAV_WRK_SCHEDULE()<< " , "
+		<< " EFF_WRK_SCHEDULE=" << glA->GetEFF_WRK_SCHEDULE()<< " , "
+		<< " PRH_VAR_TRG_MODE_A=" << glA->GetPRH_VAR_TRG_MODE_A()<< " , "
+		<< " PRH_VAR_TRG_MODE_B=" << glA->GetPRH_VAR_TRG_MODE_B()<< " , "
+		<< " ACQ_BUILD_INFO=" << glA->GetACQ_BUILD_INFO()<< " , "
+		<< " ACQ_VAR_INFO=" << glA->GetACQ_VAR_INFO()<< " , "
+		<< " RM_ACQ_AFTER_CALIB=" << glA->GetRM_ACQ_AFTER_CALIB()<< " , "  
+		<< " RM_ACQ_SETTING_MODE=" << glA->GetRM_ACQ_SETTING_MODE()<< " , "  
+		<< " TRK_CALIB_USED=" << glA->GetTRK_CALIB_USED()<< " , "  
+		<< " CAL_DSP_MASK=" << glA->GetCAL_DSP_MASK()<< " , "  
+		<< " LAST_TIMESYNC=" << glA->GetLAST_TIMESYNC()<< " , ";
+	    //
+	    if ( glA->GetPHYSENDRUN_MASK_S3S2S12() )
+	      oss << " PHYSENDRUN_MASK_S3S2S12=" << glA->GetPHYSENDRUN_MASK_S3S2S12() << " , "; 
+	    if ( glA->GetPHYSENDRUN_MASK_S11CRC() )
+	      oss << " PHYSENDRUN_MASK_S11CRC=" << glA->GetPHYSENDRUN_MASK_S11CRC() << " , ";
+	    //	      
+	    oss << " OBT_TIMESYNC=" << glA->GetOBT_TIMESYNC();
+	    oss << " WHERE ID=" << glrun->GetID() << ";";
+	    if ( IsDebug() ) printf(" update with correct infos: %s\n",oss.str().c_str());
+	    conn->Query(oss.str().c_str());	
+	    //
+	  } else {
+	    //
+	    // sig no runheader, let set anyway what is possible...
+	    //
+	    oss.str("");
+	    oss << "UPDATE GL_RUN_FRAGMENTS SET "
+		<< " RUNHEADER_TIME=" << glA->GetRUNHEADER_TIME()<< " , ";
+	    //
+	    if ( glA->GetPHYSENDRUN_MASK_S3S2S12() )
+	      oss << " PHYSENDRUN_MASK_S3S2S12=" << glA->GetPHYSENDRUN_MASK_S3S2S12()<< " , ";
+	    if ( glA->GetPHYSENDRUN_MASK_S11CRC() )
+	      oss << " PHYSENDRUN_MASK_S11CRC=" << glA->GetPHYSENDRUN_MASK_S11CRC()<< " , "; 
+	    //	      
+	    oss << " RUNHEADER_OBT=" << glA->GetRUNHEADER_OBT()<< " , "
+		<< " RUNHEADER_PKT=" << glA->GetRUNHEADER_PKT();
+	    oss << " WHERE ID=" << glrun->GetID() << ";";
+	    if ( IsDebug() ) printf(" update with correct infos2: %s\n",oss.str().c_str());
+	    conn->Query(oss.str().c_str());	
+	  };
+	  //
+	  // update runheader ROOT_ID_FRAG
+	  //
+	  oss.str("");
+	  oss << "UPDATE GL_RUN SET ID_RUN_FRAG = " << glrun->GetID() << " where ID = " << IDRL2A << ";";
+	  if ( IsDebug() ) printf(" update gl_run to have cross indexing: %s\n",oss.str().c_str());
+	  conn->Query(oss.str().c_str());
+	  //
+	  // now let's look for runtrailer if any in the last run
+	  //
+	  glA->Query_GL_RUN(IDRL2B,conn);
+	  //
+	  if ( glA->GetPKT_READY_COUNTER() != 0 ){
+	    //
+	    // the first piece contains a good runtrailer we can update all the other runs with correct infos!
+	    //
+	    oss.str("");
+	    oss << "UPDATE GL_RUN_FRAGMENTS SET "
+		<< " RUNTRAILER_TIME=" << glA->GetRUNTRAILER_TIME()<< " , "
+		<< " RUNTRAILER_OBT=" << glA->GetRUNTRAILER_OBT()<< " , "
+		<< " RUNTRAILER_PKT=" << glA->GetRUNTRAILER_PKT()<< " , "
+		<< " PKT_COUNTER=" << glA->GetPKT_COUNTER()<< " , ";
+	    //
+	    if ( glA->GetPHYSENDRUN_MASK_S3S2S12() ){
+	      oss << " PHYSENDRUN_MASK_S3S2S12=" << glA->GetPHYSENDRUN_MASK_S3S2S12()<< " , "; };
+	    if ( glA->GetPHYSENDRUN_MASK_S11CRC() ) {
+	      oss << " PHYSENDRUN_MASK_S11CRC=" << glA->GetPHYSENDRUN_MASK_S11CRC()<< " , "; };
+	    //	      
+	    oss << " PKT_READY_COUNTER=" << glA->GetPKT_READY_COUNTER()
+		<< " WHERE ID=" << glrun->GetID() << ";";
+	    if ( IsDebug() ) printf(" update with correct trailer infos: %s\n",oss.str().c_str());
+	    conn->Query(oss.str().c_str());	
+	    //
+	  } else {
+	    //
+	    // sig no runtrailer, let set anyway what is possible...
+	    //
+	    oss.str("");
+	    oss << "UPDATE GL_RUN_FRAGMENTS SET "
+		<< " RUNTRAILER_TIME=" << glA->GetRUNTRAILER_TIME()<< " , "
+		<< " RUNTRAILER_OBT=" << glA->GetRUNTRAILER_OBT()<< " , ";
+	      //
+	    if ( glA->GetPHYSENDRUN_MASK_S3S2S12() ){
+	      oss << " PHYSENDRUN_MASK_S3S2S12=" << glA->GetPHYSENDRUN_MASK_S3S2S12()<< " , "; };
+	    if ( glA->GetPHYSENDRUN_MASK_S11CRC() ){
+	      oss << " PHYSENDRUN_MASK_S11CRC=" << glA->GetPHYSENDRUN_MASK_S11CRC()<< " , "; };
+	    //	      
+	    oss << " RUNTRAILER_PKT=" << glrun->GetRUNTRAILER_PKT()
+		<< " WHERE ID=" << glrun->GetID() << ";";
+	    if ( IsDebug() ) printf(" update with correct trailer infos2: %s\n",oss.str().c_str());
+	    conn->Query(oss.str().c_str());	
+	  };
+	  //
+	  UInt_t myi = glrun->GetID();
+	  oss.str("");
+	  oss << " ID= "<< myi;
+	  //
+	  glrun->Query_GL_RUN_FRAGMENTS(oss.str().c_str(),conn);   
+	  //
+	  // fill the new run in GL_RUN
+	  //
+	  glrun->SetID_RUN_FRAG(IDRL2B);
+	  glrun->Fill_GL_RUN(conn);	
+	  glrun->DeleteRun(conn,0,"GL_RUN_FRAGMENTS");
+	  delete glA;
+	  moved++;
+	  //
+	} else {
+	  //
+	  // is just a repetition
+	  //
+	  if ( IsDebug() ) printf(" The run %u is already present in the GL_RUN table...\n",glrun->GetID());	
+	  //	  printf(" CCCCCCCCICCCCCCCCCCCCIOOOOOOOOOO si muove Ciccio! %u \n",glrun->GetID());
+	  //	  if ( PEDANTIC && glrun->GetID() != 61563 ) throw -83; 
+	  if ( PEDANTIC ) throw -83; 
+	};
+	//	if ( IsDebug() ) printf(" The run already exists in the GL_RUN table! ...\n");
+	//	if ( PEDANTIC ) throw -83;
       };
       if ( IsDebug() ) printf(" Delete run %s from the GL_RUN_FRAGMENTS table \n",row->GetField(0));      
       //
@@ -6082,7 +6765,8 @@
     // 2) get the OBT of the last validated run
     // --------------------------------------------------------------
     oss.str("");
-    oss << " SELECT * FROM GL_RUN  WHERE VALIDATION=1 AND RUNHEADER_TIME<="<< t_start
+    //    oss << " SELECT * FROM GL_RUN  WHERE VALIDATION=1 AND RUNHEADER_TIME<="<< t_start
+    oss << " SELECT * FROM GL_RUN  WHERE VALIDATION>0 AND RUNHEADER_TIME<="<< t_start
 	<<" ORDER BY RUNHEADER_TIME DESC LIMIT 1;";
     if ( IsDebug() ) printf(" Get stop validation-time: query is \n %s \n",oss.str().c_str());
     result = conn->Query(oss.str().c_str());
@@ -6225,7 +6909,8 @@
 	if( interval >= calibtime )CHECK = true;			//more than calibtime s => there might be a calibration
 			  
 	if( !CHECK && this_run->VALIDATION ){
-	  for (Int_t irun = 0; irun < nseq; irun++)assignVALIDATION(sequence[irun],true);
+	  //	  for (Int_t irun = 0; irun < nseq; irun++)assignVALIDATION(sequence[irun],true);
+	  for (Int_t irun = 0; irun < nseq; irun++)assignVALIDATION(sequence[irun],this_run->VALIDATION);
 	  nseq=0;
 	}
 		  
@@ -6246,8 +6931,13 @@
     if( CHECK ){
       // check if calibration exists
       if ( IsDebug() )printf("DT %i ===> CHECK Missing calibration\n",interval); 
-      Bool_t MISSING = MissingTRK_CALIB(t1,t2);
-      for (Int_t irun = 0; irun < nseq; irun++)assignVALIDATION(sequence[irun],!MISSING);
+      //      Bool_t MISSING = MissingTRK_CALIB(t1,t2);
+      UInt_t MISSING = MissingTRK_CALIB(t1,t2);
+      UInt_t val = 0;
+      if ( MISSING == 1 ) val = 0;
+      if ( MISSING == 0 ) val = 1;
+      if ( MISSING == 2 ) val = 2;
+      for (Int_t irun = 0; irun < nseq; irun++)assignVALIDATION(sequence[irun],val);
       nseq=0;
     };
     //--------------
@@ -6277,14 +6967,17 @@
  * @param t2 To absolute time
  * @return true if there might be a missing calibration
  */
-Bool_t PamelaDBOperations::MissingTRK_CALIB(UInt_t t1,UInt_t t2){
+//Bool_t PamelaDBOperations::MissingTRK_CALIB(UInt_t t1,UInt_t t2){
+UInt_t PamelaDBOperations::MissingTRK_CALIB(UInt_t t1,UInt_t t2){
 	
   GL_TRK_CALIB* trkcalib = new GL_TRK_CALIB();
 	
   // get the closest calibration before the run start (t2)
-  if ( trkcalib->Query_GL_TRK_CALIB(t2, conn) )return(true); 	//>>> missing
+  //  if ( trkcalib->Query_GL_TRK_CALIB(t2, conn) )return(true); 	//>>> missing
+  if ( trkcalib->Query_GL_TRK_CALIB(t2, conn) )return(1); 	//>>> missing
 	
-  if ( trkcalib->TO_TIME  < t2 ) return(true); 					//>>> missing
+  //  if ( trkcalib->TO_TIME  < t2 ) return(true); 					//>>> missing
+  if ( trkcalib->TO_TIME  < t2 ) return(1); 					//>>> missing
 	
   //==============================================================
   // Check is done first on the basis of time between calibration,
@@ -6301,9 +6994,11 @@
     //==============================================================
     Bool_t DOWNLOAD = false;
     // check if the calib was skipped becouse of download .... DA FARE!! 
-    if(DOWNLOAD)return(false);
+    //    if(DOWNLOAD)return(false);
+    if(DOWNLOAD)return(0);
 		
-    return(true); 					//>>> missing
+    //    return(true); 					//>>> missing
+    return(1); 					//>>> missing
 		
   };
 	
@@ -6313,7 +7008,9 @@
   //==============================================================
   // the long time interval bewteen runs might be due to download
   if ( IsDebug() )printf("Short time between calib and run start %u :-) ==> OK! \n",t2 - trkcalib->FROM_TIME);
-  return(false);
+  if ( trkcalib->VALIDATION ) return(0);
+  if ( IsDebug() )printf("Calibration is not validated... :-/ ==> OK but with VALIDATION=2! \n");
+  return(2);
 	
 };
 /**
@@ -6322,6 +7019,10 @@
  * @param validation true/false
  */
 Int_t PamelaDBOperations::assignVALIDATION(UInt_t idrun, Bool_t validation){
+  return(this->assignVALIDATION(idrun,(UInt_t)validation));
+}
+
+Int_t PamelaDBOperations::assignVALIDATION(UInt_t idrun, UInt_t validation){
   TSQLResult *result = 0;
   stringstream oss;
   oss.str("");