/[PAMELA software]/yodaUtility/YodaProfiler/PamelaDBOperations.cpp
ViewVC logotype

Contents of /yodaUtility/YodaProfiler/PamelaDBOperations.cpp

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.1 - (show annotations) (download)
Tue Jun 6 07:39:45 2006 UTC (18 years, 6 months ago) by kusanagi
Branch: MAIN
*** empty log message ***

1 #include <PamelaDBOperations.h>
2 #include <YFile.h>
3 #include <log4cxx/logger.h>
4 #include <iostream>
5 #include <string>
6 #include <fstream>
7 #include <list>
8 #include <errno.h>
9 #include <TSQLResult.h>
10 #include <TRFIOFile.h>
11 #include <TSQLRow.h>
12 #include <TTree.h>
13 #include <TGraph.h>
14 #include <TF1.h>
15
16 #include <cOrbit.h>
17 #include <cTle.h>
18 #include <cEci.h>
19
20 #include <EventHeader.h>
21 #include <PscuHeader.h>
22 #include <mcmd/McmdEvent.h>
23 #include <mcmd/McmdRecord.h>
24 #include <RunHeaderEvent.h>
25 #include <RunTrailerEvent.h>
26 #include <CalibCalPedEvent.h>
27 #include <CalibS4Event.h>
28 #include <CalibTrk1Event.h>
29 #include <CalibTrk2Event.h>
30 #include <varDump/VarDumpEvent.h>
31 #include <varDump/VarDumpRecord.h>
32 #include <physics/S4/S4Event.h>
33
34 extern "C" {
35 #include <dirent.h>
36 }
37
38 using namespace log4cxx;
39 using namespace std;
40 using namespace pamela;
41 using namespace yngn::YException;
42 using namespace yngn::util;
43
44
45 //extern TArrayD S4_paramfit(CalibS4Event *S4CalibEvent);
46 /*
47 * Received from Valeria Malvezzi 06/02/2006
48 */
49 Double_t fitf(Double_t *x, Double_t *par){
50
51 Double_t fitval =(par[0]*x[0])+par[1];
52 return fitval;
53 }
54
55 /*
56 * Received from Valeria Malvezzi 06/02/2006
57 */
58 TArrayD S4_paramfit(pamela::CalibS4Event *S4CalibEvent){
59
60 //----------- variable initialization -------------------------------------------------
61
62 Double_t mip[3]={1, 30, 300};
63 Double_t adc[3] = {0};
64 TArrayD parametri(2);
65
66 //------------ Fit calibrations and find parameters to calibrate data ------------------
67 pamela::S4::S4Event *s4Record;
68
69 for (Int_t j = 0; j < 4; j++){
70 for (Int_t i = 0; i < 128; i++){
71 s4Record = (pamela::S4::S4Event*)S4CalibEvent->Records->At((j*128 + i));
72 switch (j) {
73 case 0 :{
74 //calibS4_1->Fill(s4Record->S4_DATA);
75 adc[0]=adc[0]+((s4Record->S4_DATA)-32);
76 break;
77 }
78 case 1 :{
79 //calibS4_2->Fill(s4Record->S4_DATA);
80 adc[1]=adc[1]+((s4Record->S4_DATA)-32);
81 break;
82 }
83 case 3 :{
84 //calibS4_4->Fill(s4Record->S4_DATA);
85 adc[2]=adc[2]+((s4Record->S4_DATA)-32);
86 break;
87 }
88 }
89 }
90 }
91
92 adc[0]=adc[0]/128;
93 adc[1]=adc[1]/128;
94 adc[2]=adc[2]/128;
95
96 TGraph *fitpar = new TGraph (3, adc, mip);
97 TF1 *func = new TF1("fitf", fitf, -0., 1000., 2); // definizione della funzione, 2 = num. parametri
98
99 func->SetParameters(1,1); //inizializzazione dei parametri a 1
100 func->SetParNames("m","q"); //definisce il nome dei parametri
101 fitpar->Fit(func,"r"); //fitta fitpar con la funzione func nel range definito nella funzione
102
103 parametri[0] = func -> GetParameter(0);
104 parametri[1] = func -> GetParameter(1);
105
106 return parametri;
107 }
108
109
110 #define OK 1
111 #define NOK 0
112
113 static const char* RAW_FILE_NOT_FOUND = "Raw file not found in the database";
114
115 const char *PamelaDBOperations::TM_CALO_CALIB = "CREATE TEMPORARY TABLE `TM_CALO_CALIB` ( "
116 " `ID` bigint(64) unsigned NOT NULL auto_increment, "
117 " `ID_REGISTRY` bigint(64) unsigned NOT NULL default '0', "
118 " `REG_EVENT` bigint(64) unsigned NOT NULL default '0', "
119 " `TIME` bigint(64) unsigned NOT NULL default '0', "
120 " `CAL_SECTION` tinyint(3) unsigned NOT NULL default '0', "
121 " `CPERROR` int(32) unsigned NOT NULL default '0', "
122 " `CSTWERR` smallint(8) unsigned NOT NULL default '0', "
123 " PRIMARY KEY (`ID`) "
124 " ) TYPE=MyISAM";
125
126 const char *PamelaDBOperations::TM_S4_CALIB = "CREATE TEMPORARY TABLE `TM_S4_CALIB` ( "
127 " `ID` bigint(64) unsigned NOT NULL auto_increment, "
128 " `ID_REGISTRY` bigint(64) unsigned NOT NULL default '0', "
129 " `REG_EVENT` bigint(64) unsigned NOT NULL default '0', "
130 " `TIME` bigint(64) unsigned NOT NULL default '0', "
131 " `PARAM_FIT0` float unsigned NOT NULL default '0', "
132 " `PARAM_FIT1` float unsigned NOT NULL default '0', "
133 " PRIMARY KEY (`ID`) "
134 " ) TYPE=MyISAM";
135
136 const char *PamelaDBOperations::TM_TRK_CALIB = "CREATE TEMPORARY TABLE `TM_TRK_CALIB` ( "
137 " `ID` bigint(64) unsigned NOT NULL auto_increment, "
138 " `ID_REGISTRY` bigint(64) unsigned NOT NULL default '0', "
139 " `REG_EVENT` bigint(64) unsigned NOT NULL default '0', "
140 " `TIME` bigint(64) unsigned NOT NULL default '0', "
141 " `TRK_PART` smallint(8) unsigned NOT NULL default '0', "
142 " `PCK_COUNTER` bigint(64) unsigned NOT NULL default '0', "
143 " PRIMARY KEY (`ID`) "
144 " ) TYPE=MyISAM";
145
146 const char *PamelaDBOperations::TM_REGISTRY = "CREATE TEMPORARY TABLE `TM_REGISTRY` ( "
147 " `ID` bigint(64) unsigned NOT NULL auto_increment, "
148 " `REG_EVENT` bigint(64) unsigned NOT NULL default '0', "
149 " `TIME` bigint(64) unsigned NOT NULL default '0', "
150 " PRIMARY KEY (`ID`) "
151 " ) TYPE=MyISAM";
152
153 const char *PamelaDBOperations::TM_HEADER = "CREATE TEMPORARY TABLE `TM_HEADER` ( "
154 " `ID` bigint(20) NOT NULL auto_increment, "
155 " `ID_ROOT` bigint(20) unsigned NOT NULL default '0', "
156 " `COUNTER` int(10) unsigned NOT NULL default '0', "
157 " `OBT` int(10) unsigned NOT NULL default '0', "
158 " `EVENT` int(10) unsigned NOT NULL default '0', "
159 " `TIME` bigint(20) unsigned NOT NULL default '0', "
160 " `TREE_NAME` varchar(50), "
161 " PRIMARY KEY (`ID`) "
162 " ) TYPE=MyISAM ";
163
164 const char *PamelaDBOperations::TM_TIMESYNC = "CREATE TEMPORARY TABLE `TM_TIMESYNC` ("
165 " `ID` bigint(20) unsigned NOT NULL auto_increment,"
166 " `TS_OBT` bigint(20) unsigned NOT NULL default '0',"
167 " `TS_TIME` bigint(20) unsigned NOT NULL default '0',"
168 " `TYPE` smallint(5) unsigned NOT NULL default '0',"
169 " `ID_HEADER` int(10) unsigned NOT NULL default '0',"
170 " `ID_RAW` int(10) unsigned NOT NULL default '0',"
171 " PRIMARY KEY (`ID`)"
172 " ) TYPE=MyISAM ";
173
174
175
176
177
178 static LoggerPtr logger = Logger::getLogger(_T("PamelaDBOperation"));
179
180 /**
181 * Insert a new row into GL_RAW table. Throw exception if (conn == 0) or the SQL command went wrong.
182 * @param conn An active connection to a suitable (for PAMELA) database.
183 * @param pathName The path to the raw file.
184 * @param fileName The name of the raw file.
185 * @param symbolicName An optional parameter.
186 */
187 bool PamelaDBOperations::insertPamelaRawFile(TSQLServer *conn, const char *pathName, const char *fileName)
188 throw (YSQLNotConnectedException, YSQLQueryException, YSQLDuplicateRowException){
189 if (conn == 0) throw YSQLNotConnectedException("Connection missing");
190 const char *id = PamelaDBOperations::getID_RAW(conn, pathName, fileName);
191 stringstream oss;
192 TSQLResult *result = 0;
193
194 if (id != NULL) throw YSQLDuplicateRowException("Existing RawFile");
195
196 oss.str("");
197 oss << "INSERT INTO GL_RAW (PATH, NAME) VALUES ('"
198 << pathName << "', '" << fileName << "')";
199 if (conn->Query(oss.str().c_str()) == 0) throw YSQLQueryException(oss.str().c_str());
200 return OK;
201 }
202
203
204 /**
205 * Insert a new row into GL_ROOT table. It's private beacuse does not perform cross check on idRaw.
206 * Throw exception if (conn == 0) or the SQL command went wrong.
207 * @param conn An active connection to a suitable (for PAMELA) database.
208 * @param pathName The path to the root file.
209 * @param fileName The name of the root file.
210 * @param idRaw The ID code of the raw file according to the GL_RAW table.
211 */
212 int PamelaDBOperations::insertPamelaRootFiles(TSQLServer *conn, const char *pathName, const char *fileName, const char *idRaw)
213 throw (YSQLNotConnectedException, YSQLQueryException){
214 if (conn == 0) throw YSQLNotConnectedException("Connection missing");
215 stringstream oss;
216
217 oss.str("");
218 oss << "INSERT INTO GL_ROOT (ID_RAW, PATH, NAME) VALUES ('"
219 << idRaw << "', '" << pathName << "', '" << fileName << "')";
220 //cout << oss.str().c_str() << "\n" ;
221 if (conn->Query(oss.str().c_str()) == 0) throw YSQLQueryException(oss.str().c_str());
222 return OK;
223 }
224
225 /**
226 * Insert all the new rows into GL_ROOT.
227 * The raw file indicates in the parameters should be already been stored in the database.
228 * Throw exception if (conn == 0) or the SQL command went wrong.
229 * @param conn An active connection to a suitable (for PAMELA) database.
230 * @param pathName The path to the root file.
231 * @param fileName The name of the root file.
232 * @param rawPathName The path to the raw file used to generate the root files.
233 * @param rawFileName The name of the raw file used to generate the root files.
234 */
235 int PamelaDBOperations::insertPamelaRootFiles(TSQLServer *conn, const char *pathName, const char *fileName, const char *rawPathName, const char *rawFileName)
236 throw (YSQLNotConnectedException, YSQLQueryException){
237
238 if (conn == 0) throw YSQLNotConnectedException("Connection missing");
239 stringstream oss;
240 TSQLResult *result = 0;
241 TSQLRow *row = 0;
242
243 oss.str("");
244 oss << " SELECT COUNT(GL_ROOT.ID_RAW), GL_RAW.ID FROM GL_RAW "
245 << " LEFT JOIN GL_ROOT "
246 << " ON GL_RAW.ID = GL_ROOT.ID_RAW "
247 << " WHERE GL_RAW.PATH = '" << rawPathName << "' AND "
248 << " GL_RAW.NAME = '" << rawFileName << "' GROUP BY GL_RAW.ID ";
249 //cout << oss.str().c_str() << "\n";
250 result = conn->Query(oss.str().c_str());
251 row = result->Next();
252 if ((row != NULL) && (atol(row->GetField(0)) > 0)) throw YSQLQueryException("ROOT file already inserted!");
253
254
255 //if ((row != NULL) && (atol(row->GetField(0))) == 0){
256 //cout << "pathName: " << pathName << " count: " << row->GetField(0) << " ID: " << row->GetField(1) << "\n";
257 //conn->Query("BEGIN WORK");
258 if (insertPamelaRootFiles(conn, pathName, fileName, row->GetField(1))) {
259 //conn->Query("COMMIT");
260 } else {
261 //conn->Query("ROLLBACK");
262 //}
263 }
264 return OK;
265 }
266
267
268
269 int PamelaDBOperations::insertPamelaTM_HEADER(TSQLServer *conn, const char *idRaw)
270 throw (YSQLNotConnectedException, YSQLQueryException){
271 if (conn == 0) throw YSQLNotConnectedException("Connection missing");
272 conn->Query(PamelaDBOperations::TM_HEADER);
273 stringstream oss;
274 TSQLResult *result = 0;
275
276 /*Took all the root file related to a specific raw file*/
277 oss.str("");
278 oss << "SELECT ID, PATH, NAME FROM GL_ROOT WHERE ID_RAW = '" << idRaw << "'";
279 //cout << oss.str().c_str() << "\n";
280 result = conn->Query(oss.str().c_str());
281 if (result == 0) throw YSQLQueryException(oss.str().c_str());
282 TSQLRow *row = 0;
283 TFile *file = 0;
284 TTree *tr = 0;
285 EventHeader *eh = 0;
286 PscuHeader *ph = 0;
287 ULong64_t nevents = 0;
288 const char *idRoot = 0;
289 row = result->Next();
290 if (row == 0) return NOK;
291
292 oss.str("");
293 oss << row->GetField(1) << "/" << row->GetField(2);
294 idRoot = row->GetField(0);
295 //cout << "Sto per aprire il file: " << oss.str().c_str() << "\n";
296 file = YFile::Open(oss.str().c_str());
297
298 pcksList packetsNames;
299 pcksList::iterator Iter;
300 getPacketsNames(packetsNames);
301 for(Iter = packetsNames.begin(); Iter != packetsNames.end(); Iter++){
302 tr = (TTree*)file->Get(*Iter);
303 nevents = tr->GetEntries();
304 tr->SetBranchAddress("Header", &eh);
305 for (UInt_t i = 0; i < nevents; i++){
306 tr->GetEntry(i);
307 ph = eh->GetPscuHeader();
308 oss.str("");
309 oss << "INSERT INTO TM_HEADER (COUNTER, EVENT, ID_ROOT, OBT, TREE_NAME) VALUES ('"
310 << ph->Counter << "', '" << i << "', '" << idRoot << "', '"
311 << ph->OrbitalTime << "', '" << *Iter <<"')";
312 //cout << oss.str().c_str() << "\n";
313 if (conn->Query(oss.str().c_str()) == 0) {
314 //delete result;
315 throw YSQLQueryException(oss.str().c_str());
316 }
317 }
318 }
319 return OK;
320 }
321
322
323
324 /**
325 * Collect all the timesyncs data contained in the specified raw file and
326 * fill the GL_TIMESYNC table.
327 * Throw exception if (conn == 0) or the SQL command went wrong.
328 * @param conn An active connection to a suitable (for PAMELA) database.
329 * @param rawPathName The path to the raw file.
330 * @param rawFileName The name of the raw file.
331 */
332 int PamelaDBOperations::insertPamelaGL_TIMESYNC(TSQLServer *conn, const char *rawPathName, const char *rawFileName)
333 throw (YSQLNotConnectedException, YSQLQueryException){
334 if (conn == 0) throw YSQLNotConnectedException("Connection missing");
335 const char *id = PamelaDBOperations::getID_RAW(conn, rawPathName, rawFileName);
336 stringstream oss;
337
338 if (id == NULL) throw YSQLQueryException(RAW_FILE_NOT_FOUND);
339 /*
340 * Verify that the TIMESYNC have been not already processed
341 */
342 oss.str("");
343 oss << " SELECT COUNT(GL_TIMESYNC.ID) FROM GL_TIMESYNC "
344 << " LEFT JOIN GL_RAW "
345 << " ON GL_RAW.ID = GL_TIMESYNC.ID_RAW "
346 << " WHERE GL_TIMESYNC.ID_RAW = " << id;
347 TSQLResult *result = conn->Query(oss.str().c_str());
348 if (result == NULL) throw YSQLQueryException(oss.str().c_str());
349 TSQLRow *row = result->Next();
350 if ((row != NULL) && (atol(row->GetField(0)) > 0)) throw YSQLQueryException("TIMESYNC already existing!");
351
352 try {
353 insertPamelaGL_TIMESYNC(conn, id);
354 } catch (YSQLQueryException exc) {
355 cout << "Eccezione! " << exc.print() << "\n";
356 return NOK;
357 } catch (YSQLNotConnectedException exc) {
358 cout << "Eccezione! " << exc.print() << "\n";
359 return NOK;
360 }
361 return OK;
362 }
363
364 int PamelaDBOperations::insertPamelaGL_TIMESYNC(TSQLServer *conn, const char *idRaw) throw (YSQLNotConnectedException, YSQLQueryException){
365 if (conn == 0) throw YSQLNotConnectedException("Connection missing");
366 conn->Query(PamelaDBOperations::TM_TIMESYNC);
367 stringstream oss;
368
369 TSQLResult *result = 0;
370 TSQLResult *secResult = 0;
371
372 oss.str("");
373 oss << "SELECT ID, PATH, NAME FROM GL_ROOT WHERE ID_RAW = '" << idRaw << "'";
374 result = conn->Query(oss.str().c_str());
375 //cout << oss.str().c_str() << "\n";
376 //if (result->GetRowCount() == 0) throw YSQLQueryException(oss.str().c_str());
377 if (result->GetRowCount() == 0) throw YSQLQueryException(oss.str().c_str());
378 TSQLRow *row = 0;
379 TFile *file = 0;
380 TTree *tr = 0;
381 McmdEvent *mcmdev = 0;
382 McmdRecord *mcmdrc = 0;
383 TArrayC *mcmddata = 0;
384 RunHeaderEvent *runheader = 0;
385 RunTrailerEvent *runtrailer = 0;
386 const char *idRoot = 0;
387 const char *idHeader = 0;
388 ULong64_t nevents = 0;
389 ULong64_t timesync = 0;
390 string name;
391
392 row = result->Next();
393 while (!(row == 0)){
394 oss.str("");
395 oss << row->GetField(1) << "/" << row->GetField(2);
396 //cout << oss.str().c_str() << "\n";
397 name = row->GetField(2);
398 idRoot = row->GetField(0);
399 file = YFile::Open(oss.str().c_str());
400
401 /*
402 * process RunHeader
403 */
404 tr = (TTree*)file->Get("RunHeader");
405 nevents = tr->GetEntries();
406 tr->SetBranchAddress("RunHeader", &runheader);
407 for (UInt_t i = 0; i < nevents; i++){
408 tr->GetEntry(i);
409 idHeader = "000";
410 oss.str("");
411 oss << "INSERT INTO TM_TIMESYNC (ID_HEADER, TS_OBT, TS_TIME, TYPE, ID_RAW) VALUES ('"
412 << idHeader << "', '" << dec << runheader->OBT_TIME_SYNC << "', '"
413 << dec << runheader->LAST_TIME_SYNC_INFO
414 << "', 0x20, '" << idRaw << "')";
415 //cout << oss.str().c_str() << "\n";
416 if (conn->Query(oss.str().c_str()) == 0) throw YSQLQueryException(oss.str().c_str());
417 }
418
419 /*
420 * process RunTrailer
421 */
422 tr = (TTree*)file->Get("RunTrailer");
423 nevents = tr->GetEntries();
424 tr->SetBranchAddress("RunTrailer", &runtrailer);
425 for (UInt_t i = 0; i < nevents; i++){
426 tr->GetEntry(i);
427 idHeader = "000";
428 oss.str("");
429 oss << "INSERT INTO TM_TIMESYNC (ID_HEADER, TS_OBT, TS_TIME, TYPE, ID_RAW) VALUES ('"
430 << idHeader << "', '" << dec << runtrailer->OBT_TYME_SYNC << "', '"
431 << dec << runtrailer->LAST_TYME_SYNC_INFO
432 << "', 0x21, '" << idRaw << "')";
433 //cout << oss.str().c_str() << "\n";
434 if (conn->Query(oss.str().c_str()) == 0) throw YSQLQueryException(oss.str().c_str());
435 }
436
437 /*
438 * process Mcmd
439 */
440 long int recEntries;
441 tr = (TTree*)file->Get("Mcmd");
442 tr->SetBranchAddress("Mcmd", &mcmdev);
443 nevents = tr->GetEntries();
444 for (UInt_t i = 0; i < nevents; i++){
445 tr->GetEntry(i);
446 recEntries = mcmdev->Records->GetEntries();
447 for (int j = 0; j < recEntries; j++){
448 mcmdrc = (McmdRecord*)mcmdev->Records->At(j);
449 if (mcmdrc->ID1 == 0xE0){
450 mcmddata = mcmdrc->McmdData;
451 timesync = (((ULong64_t)mcmddata->At(0)<<24)&0xFF000000) +
452 (((ULong64_t)mcmddata->At(1)<<16)&0x00FF0000) +
453 (((ULong64_t)mcmddata->At(2)<<8)&0x0000FF00) +
454 (((ULong64_t)mcmddata->At(3))&0x000000FF);
455 idHeader = "000";
456 oss.str("");
457 oss << "INSERT INTO TM_TIMESYNC (ID_HEADER, TS_OBT, TS_TIME, TYPE, ID_RAW) VALUES ('"
458 << idHeader << "', '" << dec << mcmdrc->MCMD_RECORD_OBT << "', '"
459 << dec << timesync << "', 0x55, '" << idRaw << "')";
460 //cout << oss.str().c_str() << "\n";
461 if (conn->Query(oss.str().c_str()) == 0) throw YSQLQueryException(oss.str().c_str());
462 }
463 }
464 }
465 file->Close();
466 row = result->Next();
467 }
468
469 oss.str("");
470 oss << "select TS_OBT, TS_TIME "
471 << " FROM TM_TIMESYNC "
472 << " WHERE "
473 << " ID_RAW = " << idRaw << " AND "
474 << " ((TS_OBT <> 0) OR (TS_TIME <> 0)) AND "
475 << " TYPE = 0x55 ";
476 //cout << oss.str().c_str() << "\n";
477 secResult = conn->Query(oss.str().c_str());
478 Long64_t sizeMcmdTS = secResult->GetRowCount();
479 double *mcmdTS = new double[sizeMcmdTS];
480 int index = 0;
481 double tho = 1./1000.;
482 row = secResult->Next();
483 while (!(row == 0)) {
484 if ((row->GetField(0) != NULL) && (row->GetField(1) != NULL)){
485 mcmdTS[index++] = atof(row->GetField(1)) - atof(row->GetField(0))*tho;
486 }
487 row = secResult->Next();
488 }
489
490 oss.str("");
491 oss << "select TS_OBT, TS_TIME "
492 << " FROM TM_TIMESYNC "
493 << " WHERE "
494 << " ID_RAW = " << idRaw << " AND "
495 << " ((TS_OBT <> 0) OR (TS_TIME <> 0)) AND "
496 << " TYPE = 0x20 ";
497 //cout << oss.str().c_str() << "\n";
498 secResult = conn->Query(oss.str().c_str());
499 Long64_t sizeHead = secResult->GetRowCount();
500 double *runHead = new double[sizeHead];
501 index = 0;
502 row = secResult->Next();
503 while (!(row == 0)) {
504 if ((row->GetField(1) != NULL) && (row->GetField(0) != NULL)){
505 runHead[index++] = atof(row->GetField(1)) - atof(row->GetField(0));
506 }
507 row = secResult->Next();
508 }
509
510 oss.str("");
511 oss << "select TS_OBT, TS_TIME "
512 << " FROM TM_TIMESYNC "
513 << " WHERE "
514 << " ID_RAW = " << idRaw << " AND "
515 << " ((TS_OBT <> 0) OR (TS_TIME <> 0)) AND "
516 << " TYPE = 0x21 ";
517 //cout << oss.str().c_str() << "\n";
518 secResult = conn->Query(oss.str().c_str());
519 Long64_t sizeTrail = secResult->GetRowCount();
520 double *runTrail = new double[sizeTrail];
521 index = 0;
522 row = secResult->Next();
523 while (!(row == 0)) {
524 if ((row->GetField(1) != NULL) && (row->GetField(0) != NULL)){
525 runTrail[index++] = atof(row->GetField(1)) - atof(row->GetField(0));
526 }
527 row = secResult->Next();
528 }
529
530 oss.str("");
531 oss << "INSERT INTO GL_TIMESYNC (DELTA_OBT_TMSYNC, RMS_DELTA, TYPE, ID_RAW) VALUES ('"
532 << dec << TMath::Mean(sizeMcmdTS,mcmdTS)*1000. << "', '" << dec << TMath::RMS(sizeMcmdTS, mcmdTS)*1000. << "', "
533 << " 0x55, '" << idRaw << "')";
534 //cout << oss.str().c_str() << "\n";
535 conn->Query(oss.str().c_str());
536
537 oss.str("");
538 oss << "INSERT INTO GL_TIMESYNC (DELTA_OBT_TMSYNC, RMS_DELTA, TYPE, ID_RAW) VALUES ('"
539 << dec << TMath::Mean(sizeHead,runHead)*1000. << "', '" << dec << TMath::RMS(sizeHead,runHead)*1000. << "', "
540 << " 0x20, '" << idRaw << "')";
541 //cout << oss.str().c_str() << "\n";
542 conn->Query(oss.str().c_str());
543
544 oss.str("");
545 oss << "INSERT INTO GL_TIMESYNC (DELTA_OBT_TMSYNC, RMS_DELTA, TYPE, ID_RAW) VALUES ('"
546 << dec << TMath::Mean(sizeTrail,runTrail)*1000. << "', '" << dec << TMath::RMS(sizeTrail,runTrail)*1000. << "', "
547 << " 0x21, '" << idRaw << "')";
548 //cout << oss.str().c_str() << "\n";
549 conn->Query(oss.str().c_str());
550
551 oss.str("");
552 oss << " DROP TABLE IF EXISTS TM_TIMESYNC ";
553 // GOOD FOR MySQL ver > 3.2
554 //oss << " DROP TEMPORARY TABLE IF EXISTS TM_TIMESYNC ";
555 conn->Query(oss.str().c_str());
556
557 return OK;
558 }
559
560
561 /**
562 * Delete the duplicate row in TM_HEADER and TM_TIMESYNC
563 * generated by the specified raw file and fill the TM_TIMESYNC table.
564 * Throw exception if (conn == 0) or the SQL command went wrong.
565 * @param conn An active connection to a suitable (for PAMELA) database.
566 * @param idRaw The ID code of the raw file according to the GL_RAW table.
567 */
568 int PamelaDBOperations::deletePamelaDuplicate(TSQLServer *conn, const char *idRaw)
569 throw (YSQLNotConnectedException, YSQLQueryException) {
570
571 if (conn == 0) throw YSQLNotConnectedException("Connection missing");
572 stringstream oss;
573
574 TSQLResult *result = 0;
575 TSQLRow *row = 0;
576 bool dup = true;
577 //---------------- Clean up the multiple rows in TM_HEADER ---------------------------------------
578 /*
579 * Select the duplicate COUNTER-OBT pairs into a holding table
580 */
581 oss.str("");
582 oss << " CREATE TEMPORARY TABLE holdkey "
583 << " SELECT ID, OBT, COUNTER, ID_ROOT, count(*) "
584 << " FROM TM_HEADER "
585 << " WHERE ID_ROOT = " << idRaw
586 << " GROUP BY OBT, COUNTER"
587 << " HAVING count(*) > 1";
588 //cout << oss.str().c_str() << "\n";
589 if (conn->Query(oss.str().c_str()) == 0) throw YSQLQueryException(oss.str().c_str());
590
591 /*
592 * Select the duplicate rows into a holding table, eliminating duplicates in the process
593 */
594 oss.str("");
595 oss << " CREATE TEMPORARY TABLE holddups "
596 << " SELECT DISTINCT TM_HEADER.* "
597 << " FROM TM_HEADER, holdkey "
598 << " WHERE TM_HEADER.COUNTER = holdkey.COUNTER "
599 << " AND TM_HEADER.OBT = holdkey.OBT ";
600 //cout << oss.str().c_str() << "\n";
601 if (conn->Query(oss.str().c_str()) == 0) throw YSQLQueryException(oss.str().c_str());
602
603 /*
604 * Verify that holddup contains only one row for each pair
605 */
606 oss.str("");
607 oss << " SELECT ID, COUNTER, ID_ROOT, count(*) "
608 << " FROM holddups "
609 << " GROUP BY COUNTER";
610 //cout << oss.str().c_str() << "\n";
611 result = conn->Query(oss.str().c_str());
612 if (result == 0) throw YSQLQueryException(oss.str().c_str());
613
614 dup = true;
615 while (true) {
616 row = result->Next();
617 if (row == 0) break;
618 if ((!atol(row->GetField(3)) == 0)){
619 dup = false;
620 break;
621 }
622 }
623
624 if (dup){
625 /*
626 * Delete the duplicate rows from TM_HEADER
627 */
628 oss.str("");
629 oss << " DELETE TM_HEADER "
630 << " FROM TM_HEADER, holdkey "
631 << " WHERE TM_HEADER.COUNTER = holdkey.COUNTER "
632 << " AND TM_HEADER.ID_ROOT = holdkey.ID_ROOT ";
633 //cout << oss.str().c_str() << "\n";
634 //if (conn->Query(oss.str().c_str()) == 0) throw YSQLQueryException(oss.str().c_str());
635 conn->Query(oss.str().c_str());
636
637 /*
638 * Put the unique rows back in TM_HEADER
639 */
640 oss.str("");
641 oss << " INSERT TM_HEADER SELECT * FROM holddups ";
642 //cout << oss.str().c_str() << "\n";
643 //if (conn->Query(oss.str().c_str()) == 0) throw YSQLQueryException(oss.str().c_str());
644 conn->Query(oss.str().c_str());
645 }
646
647 /*
648 * Delete the temporary Tables
649 */
650 oss.str("");
651 oss << " DROP TABLE IF EXISTS holdkey ";
652 // GOOD FOR MySQL ver > 3.2
653 //oss << " DROP TEMPORARY TABLE IF EXISTS holdkey ";
654 //cout << oss.str().c_str() << "\n";
655 //if (conn->Query(oss.str().c_str()) == 0) throw YSQLQueryException(oss.str().c_str());
656 conn->Query(oss.str().c_str());
657 oss.str("");
658 oss << " DROP TABLE IF EXISTS holddups ";
659 // GOOD FOR MySQL ver > 3.2
660 //oss << " DROP TEMPORARY TABLE IF EXISTS holddups ";
661 //cout << oss.str().c_str() << "\n";
662 //if (conn->Query(oss.str().c_str()) == 0) throw YSQLQueryException(oss.str().c_str());
663 conn->Query(oss.str().c_str());
664 //---------------- Clean up the multiple rows in TM_HEADER ---------------------------------------
665 return OK;
666 }
667
668
669 /**
670 * Assign the collectied TIMESYNCs to the T_HEADERs row relative to the
671 * same ID_ROOT unpacked data.
672 * Throw exception if (conn == 0) or the SQL command went wrong.
673 * @param conn An active connection to a suitable (for PAMELA) database.
674 * @param idRaw The ID code of the raw file according to the GL_RAW table.
675 */
676 int PamelaDBOperations::assignPamelaTIMESYNC(TSQLServer *conn, const char *idRaw)
677 throw (YSQLNotConnectedException, YSQLQueryException) {
678
679 if (conn == 0) throw YSQLNotConnectedException("Connection missing");
680 stringstream oss;
681
682 TSQLResult *result = NULL, *secResult = NULL;
683 TSQLRow *row = NULL, *secRow = NULL;
684 ULong64_t syncTIME = 0, absTime = 0;
685
686 /* In any case this parameter can be changed to set the timesync scale*/
687 unsigned long id_Raw = (unsigned long)atol(idRaw);
688 bool validTS = false;
689 int types[] = {0x55, 0x20, 0x21};
690 Long64_t boot_Num = -1;
691 /*--------------------------------------------------*/
692
693 oss.str("");
694 oss << " SELECT COUNT(GL_TIMESYNC.DELTA_OBT_TMSYNC), GL_RAW.BOOT_NUMBER, SUM(GL_TIMESYNC.DELTA_OBT_TMSYNC) from GL_TIMESYNC, GL_RAW "
695 << " WHERE GL_TIMESYNC.ID_RAW = GL_RAW.ID AND GL_TIMESYNC.ID_RAW = " << dec << id_Raw
696 << " GROUP BY GL_TIMESYNC.ID_RAW";
697 // << " AND GL_RAW.BOOT_NUMBER IS NOT NULL GROUP BY GL_TIMESYNC.ID_RAW";
698 //cout << oss.str().c_str() << "\n";
699 result = conn->Query(oss.str().c_str());
700 if (result == 0) throw YSQLQueryException("result: No Timesync!");
701 row = result->Next();
702 if (row == 0) throw YSQLQueryException("raw: No Timesync!");
703 if (row->GetField(1) != 0) boot_Num = atol(row->GetField(1));
704 //cout << "Questo è il boot number: " << dec << boot_Num;
705
706
707
708 //Get the list of the id_raw belonging to the same BOOT_NUMBER. This have been done to foreseen
709 //situation where a file does not contain a valid timesync, BUT HOPEFULLY A VALID BOOT NUMBER!
710 if ((atol(row->GetField(0)) > 0) && (atol(row->GetField(2)) == 0)){
711 oss.str("");
712 oss << " SELECT ID from GL_RAW "
713 << " WHERE GL_RAW.BOOT_NUMBER = " << dec << boot_Num ;
714 //cout << oss.str().c_str() << "\n";
715 secResult = conn->Query(oss.str().c_str());
716 }
717
718 if (atol(row->GetField(0)) > 0){
719 //Looks for a valid TIMESYNC (before 0x55, then 0x20 and finally 0x21)
720 while (true){
721 for(int ty = 0; ty < 3; ty++){
722 oss.str("");
723 oss << " SELECT COUNT(GL_TIMESYNC.DELTA_OBT_TMSYNC) from GL_TIMESYNC "
724 << " WHERE GL_TIMESYNC.ID_RAW = '" << dec << id_Raw << "' AND GL_TIMESYNC.TYPE = " << dec << types[ty]
725 << " AND GL_TIMESYNC.DELTA_OBT_TMSYNC <> 0";
726 //cout << oss.str().c_str() << "\n";
727 result = conn->Query(oss.str().c_str());
728 row = result->Next();
729 //Has found a good TIMESYNC?
730 if ((row != NULL) && (atol(row->GetField(0)) > 0)){
731 oss.str("");
732 oss << " SELECT GL_TIMESYNC.DELTA_OBT_TMSYNC from GL_TIMESYNC "
733 << " WHERE "
734 << " GL_TIMESYNC.ID_RAW = " << dec << id_Raw << " AND "
735 << " GL_TIMESYNC.TYPE = " << dec << types[ty];
736 //cout << oss.str().c_str() << "\n";
737 result = conn->Query(oss.str().c_str());
738 row = result->Next();
739 if (row == 0) throw YSQLQueryException("No Timesync!");
740 syncTIME = (ULong64_t)atof(row->GetField(0));
741 validTS = true;
742 break;
743 }
744 }
745
746 //Should exits from the loop?
747 if (validTS) break;
748
749 //Get another id_raw
750 if (secResult != NULL) {
751 secRow = secResult->Next();
752 if (secRow == NULL) throw YSQLQueryException("No Timesync!");
753 id_Raw = (ULong64_t)atof(secRow->GetField(0));
754 }
755
756 }
757
758 }
759
760 //Collect the TM_HEADER to assign them the correct TIMESYNC
761 oss.str("");
762 oss << " SELECT TM_HEADER.OBT, TM_HEADER.ID"
763 << " FROM GL_ROOT, TM_HEADER, GL_RAW "
764 << " WHERE "
765 << " GL_ROOT.ID_RAW = " << idRaw << " AND "
766 << " TM_HEADER.TIME = 0 AND "
767 << " TM_HEADER.ID_ROOT = GL_ROOT.ID ";
768 //cout << oss.str().c_str() << "\n";
769 result = conn->Query(oss.str().c_str());
770 if (result == 0) throw YSQLQueryException(oss.str().c_str());
771
772 //Calculate the absolute time for the GL_HEADER item
773 while (true) {
774 row = result->Next();
775 if (row == 0) break;
776 //diff = 1;
777 //if (syncOBT < (unsigned long)atol(row->GetField(0))) diff = -1;
778 //absTime = (syncTIME + konstant)*1000 + diff*((unsigned long)atol(row->GetField(0)) - syncOBT);
779 absTime = (ULong64_t)atof(row->GetField(0)) + syncTIME;
780 oss.str("");
781 oss << " UPDATE TM_HEADER "
782 << " SET TM_HEADER.TIME = '" << absTime << "'"
783 << " WHERE TM_HEADER.ID = '" << row->GetField(1) << "'";
784 //cout << oss.str().c_str() << "\n";
785 if (conn->Query(oss.str().c_str()) == 0) throw YSQLQueryException(oss.str().c_str());
786 }
787 return OK;
788 }
789
790
791
792 /**
793 * Create the Registry files connected to the processed unpaking.
794 * Throw exception if (conn == 0) or the SQL command went wrong.
795 * @param conn An active connection to a suitable (for PAMELA) database.
796 * @param pathName The path to the root file.
797 * @param fileName The name of the root file.
798 * @param rawPathName The path to the raw file used to generate the root files.
799 * @param rawFileName The name of the raw file used to generate the root files.
800 */
801 int PamelaDBOperations::createPamelaRegistry(TSQLServer *conn, const char *rawPathName, const char *rawFileName, bool overwrite = false)
802 throw (YSQLNotConnectedException, YSQLQueryException, YNotExistingFileException, YExistingFileException){
803 if (conn == 0) throw YSQLNotConnectedException("Connection missing");
804 const char *id = PamelaDBOperations::getID_RAW(conn, rawPathName, rawFileName);
805 if (id == NULL) throw YSQLQueryException(RAW_FILE_NOT_FOUND);
806
807 try {
808 createPamelaRegistry(conn, id, overwrite);
809 } catch (YSQLQueryException exc) {
810 cout << "Eccezione! " << exc.print() << "\n";
811 return NOK;
812 } catch (YSQLNotConnectedException exc) {
813 cout << "Eccezione! " << exc.print() << "\n";
814 return NOK;
815 } catch (YNotExistingFileException exc) {
816 cout << "Eccezione! " << exc.print() << "\n";
817 return NOK;
818 }
819
820 return OK;
821 }
822
823 /**
824 * Create the Registry files connected to the processed unpaking.
825 * Throw exception if (conn == 0) or the SQL command went wrong.
826 * @param conn An active connection to a suitable (for PAMELA) database.
827 * @param idRaw The ID code of the raw file according to the GL_RAW table.
828 */
829 int PamelaDBOperations::createPamelaRegistry(TSQLServer *conn, const char *idRaw, bool overwrite = false)
830 throw (YSQLNotConnectedException, YSQLQueryException, YNotExistingFileException, YExistingFileException) {
831 if (conn == 0) throw YSQLNotConnectedException("Connection missing");
832
833 ///TBD: Put the check "IF THE REGISTRY ALREDY EXISTS" before this try.
834 try {
835 if (insertPamelaTM_HEADER(conn, idRaw)){
836 deletePamelaDuplicate(conn, idRaw);
837 assignPamelaTIMESYNC(conn, idRaw);
838 }
839 } catch (YSQLQueryException exc) {
840 cout << "Eccezione! " << exc.print() << "\n";
841 return NOK;
842 } catch (YSQLNotConnectedException exc) {
843 cout << "Eccezione! " << exc.print() << "\n";
844 return NOK;
845 }
846
847 stringstream oss;
848 TSQLResult *result, *secResult;
849 TSQLRow *row, *secRow;
850
851 const char *idRoot;
852 string registryName;
853 RegistryEvent *registry = new RegistryEvent();
854 TFile *file = 0;
855 TTree *tr = 0;
856 TBranch *branch = 0;
857 cOrbit *orbit = 0;
858
859 /*Took all the root file related to a specific raw file*/
860 oss.str("");
861 oss << "SELECT ID, PATH, NAME FROM GL_ROOT WHERE ID_RAW = '" << idRaw << "'";
862 result = conn->Query(oss.str().c_str());
863 //cout << oss.str().c_str() << "\n";
864 //if (result->GetRowCount() == 0) throw YSQLQueryException(oss.str().c_str());
865 row = result->Next();
866 if (row == 0) return NOK;
867
868 idRoot = row->GetField(0);
869 oss.str("");
870 oss << row->GetField(1) << "/" << row->GetField(2);
871 file = YFile::Open(oss.str().c_str(), "UPDATE");
872 pcksList packetsNames;
873 pcksList::iterator Iter;
874 getPacketsNames(packetsNames);
875
876 for(Iter = packetsNames.begin(); Iter != packetsNames.end(); Iter++){
877 //cout << "Tree Name: " << *Iter << "\n";
878 tr = (TTree*)file->Get(*Iter);
879
880 //Branch Registry exist?
881 if (!tr->GetBranchStatus("Registry")){
882 branch = tr->Branch("Registry", "pamela::RegistryEvent", &registry);
883 } else {
884 if (!overwrite) throw YExistingFileException("The Registry branches already exists: you have to force overwriting!");
885 tr->SetBranchAddress("Registry", &registry);
886 branch = tr->GetBranch("Registry");
887 branch->Reset();
888 }
889
890 //This select s temporary. Better selection on time should be done,
891 oss.str("");
892 oss << "SELECT TLE1, TLE2, TLE3"
893 << " FROM GL_TLE "
894 << " WHERE VALID_FROM_TIME = 0 ";
895 //cout << oss.str().c_str() << "\n";
896 result = conn->Query(oss.str().c_str());
897 row = result->Next();
898 if (!(row == 0)){
899 string tle1 = row->GetField(0);
900 string tle2 = row->GetField(1);
901 string tle3 = row->GetField(2);
902 cTle tle(tle1, tle2, tle3);
903 orbit = new cOrbit(tle);
904 }
905
906 /*Took all the TM_HEADER rows related to a specific root file and TREE_NAME*/
907 oss.str("");
908 oss << "SELECT EVENT, TIME FROM TM_HEADER WHERE ID_ROOT = '" << idRoot << "' "
909 << " AND TREE_NAME = '" << *Iter << "' ORDER BY EVENT ASC";
910 secResult = conn->Query(oss.str().c_str());
911 //cout << oss.str().c_str() << "\n";
912
913 //Fill the 'Registry' TBranch
914 secRow = secResult->Next();
915 while (!(secRow == 0)){
916 registry->event = (unsigned int)atoi(secRow->GetField(0));
917 registry->absTime = (ULong64_t)atof(secRow->GetField(1));
918
919 branch->Fill();
920 secRow = secResult->Next();
921 /*
922 cout << "FileName: " << registryName
923 << "absTime: " << dec << registry->absTime
924 << "event: " << dec << registry->event << "\n";
925 */
926 }
927 }
928 file->Write(0,TObject::kOverwrite);
929 file->Close();
930 }
931
932 /**
933 * Assign the BOOT_NUMBER to the raw file.
934 * Throw exception if (conn == 0) or the SQL command went wrong.
935 * @param conn An active connection to a suitable (for PAMELA) database.
936 * @param rawPathName The path to the raw file used to generate the root files.
937 * @param rawFileName The name of the raw file used to generate the root files.
938 */
939 int PamelaDBOperations::assignBOOT_NUMBER(TSQLServer *conn, const char *rawPathName, const char *rawFileName)
940 throw (YSQLNotConnectedException, YSQLQueryException){
941 if (conn == 0) throw YSQLNotConnectedException("Connection missing");
942 stringstream oss;
943 TSQLResult *result = 0;
944 TSQLRow *row = 0;
945 oss.str("");
946 oss << "SELECT ID, BOOT_NUMBER FROM GL_RAW WHERE "
947 << " PATH = '" << rawPathName << "' AND "
948 << " NAME = '" << rawFileName << "' ";
949 result = conn->Query(oss.str().c_str());
950 //if (result == NULL) throw YSQLQueryException(oss.str().c_str());
951 row = result->Next();
952 if (row == 0) throw YSQLQueryException("The file is not in the database");
953 if (row->GetField(1) != 0) throw YSQLQueryException("BOOT number already existing!");
954 return assignBOOT_NUMBER(conn, row->GetField(0));
955
956 }
957
958
959 /**
960 * Update GL_RAW.BOOT_NUMBER columns.
961 * Throw exception if (conn == 0) or the SQL command went wrong.
962 * @param conn An active connection to a suitable (for PAMELA) database.
963 * @param idRaw The ID code of the raw file according to the GL_RAW table.
964 *
965 */
966 int PamelaDBOperations::assignBOOT_NUMBER(TSQLServer *conn, const char *idRaw) throw (YSQLNotConnectedException, YSQLQueryException) {
967
968 if (conn == 0) throw YSQLNotConnectedException("Connection missing");
969 stringstream oss;
970 TSQLResult *result;
971 TSQLRow *row;
972
973 TFile *file = 0;
974 TTree *tr = 0;
975
976 oss.str("");
977 oss << "SELECT ID, PATH, NAME FROM GL_ROOT WHERE ID_RAW = '" << idRaw << "'";
978 //cout << oss.str().c_str() << "\n";
979 result = conn->Query(oss.str().c_str());
980 if (result == 0) throw YSQLQueryException(oss.str().c_str());
981 row = result->Next();
982 oss.str("");
983 oss << row->GetField(1) << "/" << row->GetField(2);
984 //cout << oss.str().c_str() << "\n";
985 TFile *varDumpFile = YFile::Open(oss.str().c_str());
986
987 TTree *trDumpEv = (TTree*)varDumpFile->Get("VarDump");
988 if (trDumpEv == NULL) throw YSQLQueryException("Event file is empty");
989
990 VarDumpEvent *vde = 0;
991 VarDumpRecord *vdr = 0;
992
993 trDumpEv->SetBranchAddress("VarDump", &vde);
994 if (trDumpEv->GetEntries() > 0){
995 trDumpEv->GetEntry(0);
996 vde->Records->GetEntries();
997 if (vde->Records->GetEntries() > 0){
998 vdr = (VarDumpRecord*)vde->Records->At(6);
999 oss.str("");
1000 oss << " UPDATE GL_RAW "
1001 << " SET GL_RAW.BOOT_NUMBER = '" << dec << vdr->VAR_VALUE << "'"
1002 << " WHERE GL_RAW.ID = '" << idRaw << "'";
1003 conn->Query(oss.str().c_str());
1004 //cout << "Boot Number: " << dec << vdr->VAR_ID << "</VAR_ID> \n";
1005 //cout << "Boot Number: " << dec << vdr->VAR_VALUE << "</VAR_VALUE> \n";
1006 } else {
1007 throw YSQLQueryException("No VarDump!");
1008 }
1009 }
1010 }
1011
1012
1013 /**
1014 * Insert RUN items into the GL_RUN table.
1015 * Throw exception if (conn == 0) or the SQL command went wrong.
1016 * @param conn An active connection to a suitable (for PAMELA) database.
1017 * @param rawPathName The path to the raw file used to generate the root files.
1018 * @param rawFileName The name of the raw file used to generate the root files.
1019 */
1020 int PamelaDBOperations::insertPamelaRUN(TSQLServer *conn, const char *pathName, const char *fileName)
1021 throw (YSQLNotConnectedException, YSQLQueryException, YNotExistingFileException, YEmptyObjectException){
1022
1023 if (conn == 0) throw YSQLNotConnectedException("Connection missing");
1024 const char *id = PamelaDBOperations::getID_RAW(conn, pathName, fileName);
1025 if (id == NULL) throw YSQLQueryException(RAW_FILE_NOT_FOUND);
1026 TSQLResult *result = 0;
1027 TSQLRow *row = 0;
1028 /*
1029 * Verify that the RUN have been not already processed
1030 */
1031 stringstream oss;
1032 oss.str("");
1033 oss << " SELECT COUNT(GL_RUN.ID) FROM GL_RUN "
1034 << " LEFT JOIN GL_ROOT "
1035 << " ON GL_ROOT.ID = GL_RUN.ID_REG_RUN "
1036 << " WHERE GL_ROOT.ID_RAW = " << id;
1037 result = conn->Query(oss.str().c_str());
1038 row = result->Next();
1039 if ((row != NULL) && (atol(row->GetField(0)) > 0)) throw YSQLQueryException("Runs already inserted in the database");
1040 /*
1041 * Finally extract the RUNs informations
1042 */
1043 try {
1044 insertPamelaRUN(conn, id);
1045 } catch (YSQLQueryException exc) {
1046 cout << "Eccezione! " << exc.print() << "\n";
1047 return NOK;
1048 } catch (YSQLNotConnectedException exc) {
1049 cout << "Eccezione! " << exc.print() << "\n";
1050 return NOK;
1051 } catch (YNotExistingFileException exc) {
1052 cout << "Eccezione! " << exc.print() << "\n";
1053 return NOK;
1054 } catch (YEmptyObjectException exc) {
1055 cout << "Eccezione! " << exc.print() << "\n";
1056 return NOK;
1057 }
1058 return OK;
1059 }
1060
1061 /**
1062 * Insert RUN items into the GL_RUN table.
1063 * Throw exception if (conn == 0) or the SQL command went wrong.
1064 * @param conn An active connection to a suitable (for PAMELA) database.
1065 * @param idRaw The ID code of the raw file according to the GL_RAW table.
1066 *
1067 * STILL TO BE DONE: When a new RUN is inserted it have to update the GL_CALIB before run
1068 * any insertNEW_CALIBXXX in order to have always the run into one calibration!!!
1069 */
1070 int PamelaDBOperations::insertPamelaRUN(TSQLServer *conn, const char *idRaw)
1071 throw (YSQLNotConnectedException, YSQLQueryException, YNotExistingFileException, YEmptyObjectException) {
1072
1073 if (conn == 0) throw YSQLNotConnectedException("Connection missing");
1074 stringstream oss;
1075 TSQLResult *result = 0;
1076 TSQLRow *row = 0;
1077 const char *idRoot = 0;
1078 RegistryEvent *runHeaderRegistry = new RegistryEvent();
1079 RegistryEvent *runTrailerRegistry = new RegistryEvent();
1080 RegistryEvent *calPedRegistry = new RegistryEvent();
1081 RegistryEvent *physRegistry = new RegistryEvent();
1082 TFile *rootFile = 0;
1083 TTree *calTr, *physTr, *runHeaderEvTr = 0, *runTrailerEvTr = 0;
1084 TBranch *calBr, *physRegBr, *runHeaderRegBr = 0, *runHeaderEvBr = 0, *runTrailerRegBr = 0;
1085 RunHeaderEvent *runheader = 0;
1086 ULong64_t nevents = 0;
1087
1088 /*----------BEGIN - Create the temporary table to collect the PhysicsRegistry items-----------*/
1089 conn->Query(PamelaDBOperations::TM_REGISTRY);
1090
1091 /*Took the root file related to the Physics*/
1092 oss << "SELECT ID, PATH, NAME FROM GL_ROOT WHERE ID_RAW = '" << idRaw << "'";
1093 result = conn->Query(oss.str().c_str());
1094 //cout << oss.str().c_str() << "\n";
1095
1096 if (result == NULL) throw YSQLQueryException(oss.str().c_str());
1097 row = result->Next();
1098 idRoot = row->GetField(0);
1099
1100 oss.str("");
1101 oss << row->GetField(1) << "/" << row->GetField(2);
1102 //cout << oss.str().c_str() << "\n";
1103 rootFile = YFile::Open(oss.str().c_str());
1104 if(rootFile->IsZombie()) throw YNotExistingFileException(oss.str().c_str());
1105
1106 physTr = (TTree*)rootFile->Get("Physics");
1107 if (!physTr->GetBranchStatus("Registry")) throw YEmptyObjectException("The 'Registry' TBranch not exist in the 'Physics' TTree");
1108 physTr->SetBranchAddress("Registry", &physRegistry);
1109 physRegBr = physTr->GetBranch("Registry");
1110 nevents = physRegBr->GetEntries();
1111 //cout << "nEvents: " << dec << nevents << "\n";
1112
1113 /*INSERT the physics items into TM_REGISTRY*/
1114 for (UInt_t i = 0; i < nevents; i++){
1115 physRegBr->GetEntry(i);
1116 oss.str("");
1117 oss << " INSERT INTO TM_REGISTRY (REG_EVENT, TIME) "
1118 << " VALUES ( "
1119 << dec << physRegistry->event << ", "
1120 << dec << physRegistry->absTime << ")";
1121 conn->Query(oss.str().c_str());
1122 }
1123 runHeaderEvTr = (TTree*)rootFile->Get("RunHeader");
1124 runHeaderEvTr->SetBranchAddress("RunHeader", &runheader);
1125 runHeaderEvTr->SetBranchAddress("Registry", &runHeaderRegistry);
1126 runHeaderRegBr = runHeaderEvTr->GetBranch("Registry");
1127
1128 runTrailerEvTr = (TTree*)rootFile->Get("RunTrailer");
1129 runTrailerEvTr->SetBranchAddress("Registry", &runTrailerRegistry);
1130 runTrailerRegBr = runTrailerEvTr->GetBranch("Registry");
1131 /*----------END - Create the temporary table to collect the PhysicsRegistry items-----------*/
1132
1133 /*----------BEGIN - Fill the GL_RUN table collecting RunHeader and Physics items-----------*/
1134
1135 nevents = runHeaderRegBr->GetEntries();
1136 //cout << "nEvents: " << dec << nevents << "\n";
1137 /*
1138 * NOTE - Below is aassumed as true that RUNHEADER events are synchronized
1139 * with the RUNTRAILER data. This is true if data will not skip any
1140 * RunHeader or runTrailer.
1141 */
1142 for (UInt_t i = 0; i < nevents; i++){
1143 runTrailerRegBr->GetEntry(i);
1144
1145 /*----- DO NOT INVERT!!-----*/
1146 runHeaderRegBr->GetEntry(i);
1147 runHeaderEvTr->GetEntry(runHeaderRegistry->event);
1148 /*----- DO NOT INVERT!!-----*/
1149
1150
1151 /*
1152 * This line is just for test. It should guarantee that the run is consistent.
1153 * The reason for this is that I have verified that on some MCMD TimeSyncTIME
1154 * the value seems stoned BUT the OBT still run. As consequence can happen to
1155 * have a runTrailer "older" then the relative runHeader which is obviously
1156 * an error.....
1157 */
1158 if (runHeaderRegistry->absTime > runTrailerRegistry->absTime) continue;
1159 /*---------------------------------------------------------------------------*/
1160
1161 /*
1162 * SELECT the interval of events belonging to this RUN
1163 */
1164
1165 oss.str("");
1166 oss << " SELECT MIN(REG_EVENT), MAX(REG_EVENT) "
1167 << " FROM TM_REGISTRY "
1168 << " WHERE TIME BETWEEN " << runHeaderRegistry->absTime
1169 << " AND " << runTrailerRegistry->absTime ;
1170 //cout << oss.str().c_str() << "\n";
1171 result = conn->Query(oss.str().c_str());
1172 if (result->GetRowCount() == 0) throw YSQLQueryException(oss.str().c_str());
1173 row = result->Next();
1174
1175 if ((row->GetField(0) == NULL) || (row->GetField(1) == NULL)) continue;
1176 /*
1177 * INSERT the GL_RUN item
1178 */
1179
1180 oss.str("");
1181 oss << " INSERT INTO GL_RUN (ID_REG_RUN, RUNHEADER_TIME, EV_REG_RUNHEADER, "
1182 << " RUNTRAILER_TIME, EV_REG_RUNTRAILER, TRK_CALIB_USED, "
1183 << " EV_REG_PHYS_FROM, EV_REG_PHYS_TO, EFF_WRK_SCHEDULE, "
1184 << " PRH_VAR_TRG_MODE_A, PRH_VAR_TRG_MODE_B, ACQ_BUILD_INFO, ACQ_VAR_INFO) "
1185 << " VALUES ( "
1186 << idRoot << ", "
1187 << dec << runHeaderRegistry->absTime << ", "
1188 << dec << i << ", "
1189 << dec << runTrailerRegistry->absTime << ", "
1190 << dec << i << ", "
1191 << dec << runheader->TRK_CALIB_USED << ", "
1192 << row->GetField(0) << ", "
1193 << row->GetField(1) << ", "
1194 << dec << runheader->EFFECTIVE_WORKING_SCHEDULE << ", "
1195 << dec << runheader->PRH_VAR_TRIGGER_MODE_A << ", "
1196 << dec << runheader->PRH_VAR_TRIGGER_MODE_B << ", "
1197 << dec << runheader->ACQ_BUILD_INFO << ", "
1198 << dec << runheader->ACQ_VAR_INFO
1199 << ")";
1200 //cout << oss.str().c_str() << "\n";
1201 conn->Query(oss.str().c_str());
1202
1203 /*
1204 * To be consistent the RUN have to be part of one calibration
1205 */
1206 for (int sec = 0; sec < 4 ; sec++){
1207 oss.str("");
1208 oss << "SELECT ID FROM GL_CALO_CALIB "
1209 << " WHERE FROM_TIME <= " << dec << runHeaderRegistry->absTime << " AND "
1210 << " TO_TIME >= " << dec << runTrailerRegistry->absTime << " AND "
1211 << " SECTION = " << dec << sec;
1212 //cout << oss.str().c_str() << "\n";
1213 result = conn->Query(oss.str().c_str());
1214
1215 //The RUN is included in some calibration?
1216 if (result->GetRowCount() == 0) {
1217 oss.str("");
1218 oss << "SELECT MAX(TO_TIME) AS MX_TM_CALIB, ID AS ID_CALIB "
1219 << " FROM GL_CALO_CALIB "
1220 << " WHERE TO_TIME <= " << dec << runHeaderRegistry->absTime << " AND "
1221 << " SECTION = " << dec << sec
1222 << " GROUP BY ID ORDER BY MX_TM_CALIB DESC ";
1223 //cout << oss.str().c_str() << "\n";
1224 result = conn->Query(oss.str().c_str());
1225 //Exist a calibration with time less than the RUN?
1226 //if (result->GetRowCount() == 0) throw YSQLQueryException(oss.str().c_str());
1227 if (result->GetRowCount() == 0) continue;
1228 row = result->Next();
1229 oss.str("");
1230 oss << "UPDATE GL_CALO_CALIB "
1231 << " SET TO_TIME = " << dec << runTrailerRegistry->absTime
1232 << " WHERE ID = " << row->GetField(1);
1233 //cout << oss.str().c_str() << "\n";
1234 result = conn->Query(oss.str().c_str());
1235
1236 }
1237 }
1238
1239 // GL_S4_CALIB
1240 oss.str("");
1241 oss << "SELECT ID FROM GL_S4_CALIB "
1242 << " WHERE FROM_TIME <= " << dec << runHeaderRegistry->absTime << " AND "
1243 << " TO_TIME >= " << dec << runTrailerRegistry->absTime;
1244 //cout << oss.str().c_str() << "\n";
1245 result = conn->Query(oss.str().c_str());
1246 row = result->Next();
1247 //The RUN is included in some calibration?
1248 if (row == NULL) {
1249 oss.str("");
1250 oss << "SELECT MAX(TO_TIME) AS MX_TM_CALIB, ID AS ID_CALIB "
1251 << " FROM GL_S4_CALIB "
1252 << " WHERE TO_TIME <= " << dec << runHeaderRegistry->absTime
1253 << " GROUP BY ID ORDER BY MX_TM_CALIB DESC ";
1254 //cout << oss.str().c_str() << "\n";
1255 result = conn->Query(oss.str().c_str());
1256 //Exist a calibration with time less than the RUN?
1257 //if (result->GetRowCount() == 0) throw YSQLQueryException(oss.str().c_str());
1258 row = result->Next();
1259 if (row == NULL) continue;
1260 oss.str("");
1261 oss << "UPDATE GL_S4_CALIB "
1262 << " SET TO_TIME = " << dec << runTrailerRegistry->absTime
1263 << " WHERE ID = " << row->GetField(1);
1264 //cout << oss.str().c_str() << "\n";
1265 result = conn->Query(oss.str().c_str());
1266 }
1267
1268
1269 // GL_TRK_CALIB
1270
1271 oss.str("");
1272 oss << "SELECT ID FROM GL_TRK_CALIB "
1273 << " WHERE FROM_TIME <= " << dec << runHeaderRegistry->absTime << " AND "
1274 << " TO_TIME >= " << dec << runTrailerRegistry->absTime;
1275 //cout << oss.str().c_str() << "\n";
1276 result = conn->Query(oss.str().c_str());
1277
1278 //The RUN is included in some calibration?
1279 if (result->GetRowCount() == 0) {
1280 oss.str("");
1281 oss << "SELECT MAX(TO_TIME) AS MX_TM_CALIB, ID AS ID_CALIB "
1282 << " FROM GL_TRK_CALIB "
1283 << " WHERE TO_TIME <= " << dec << runHeaderRegistry->absTime
1284 << " GROUP BY ID ORDER BY MX_TM_CALIB DESC ";
1285 //cout << oss.str().c_str() << "\n";
1286 result = conn->Query(oss.str().c_str());
1287 //Exist a calibration with time less than the RUN?
1288 //if (result->GetRowCount() == 0) throw YSQLQueryException(oss.str().c_str());
1289 if (result->GetRowCount() == 0) continue;
1290 row = result->Next();
1291 oss.str("");
1292 oss << "UPDATE GL_TRK_CALIB "
1293 << " SET TO_TIME = " << dec << runTrailerRegistry->absTime
1294 << " WHERE ID = " << row->GetField(1);
1295 //cout << oss.str().c_str() << "\n";
1296 result = conn->Query(oss.str().c_str());
1297 }
1298 }
1299
1300
1301 rootFile->Close();
1302 //delete result, row;
1303 oss.str("");
1304 oss << " DROP TABLE IF EXISTS TM_REGISTRY ";
1305 // GOOD FOR MySQL ver > 3.2
1306 //oss << " DROP TEMPORARY TABLE IF EXISTS TM_REGISTRY ";
1307 //if (conn->Query(oss.str().c_str()) == 0) throw YSQLQueryException(oss.str().c_str());
1308 conn->Query(oss.str().c_str());
1309 /*----------END - Fill the GL_RUN table collecting RunHeader and Physics items-----------*/
1310 }
1311
1312 /**
1313 * Populate the TM_CALIB_CALO_PED.
1314 * Throw exception if (conn == 0) or the SQL command went wrong.
1315 * @param conn An active connection to a suitable (for PAMELA) database.
1316 * @param idRaw The ID code of the raw file according to the GL_RAW table.
1317 */
1318 int PamelaDBOperations::populateTM_CALO_CALIB(TSQLServer *conn, const char *idRaw)
1319 throw (YSQLNotConnectedException, YSQLQueryException, YEmptyObjectException) {
1320 if (conn == 0) throw YSQLNotConnectedException("Connection missing");
1321 stringstream oss;
1322
1323 const char *idRegistry;
1324 TSQLResult *result;
1325 TSQLRow *row = 0;
1326 TFile *file = 0;
1327 TTree *tr = 0;
1328 TBranch *calibCalPedEvBr = 0, *calibCalPedRegBr = 0;
1329 CalibCalPedEvent *calibCalPed = 0;
1330 RegistryEvent *registry = 0;
1331 Long64_t nevents = 0;
1332
1333 /*Create the temporary table to collect the Calib_Cal_Ped items*/
1334 conn->Query(PamelaDBOperations::TM_CALO_CALIB);
1335
1336 /*Get the Registry file relative to the CalibCalPed*/
1337 oss.str("");
1338 oss << "SELECT ID, PATH, NAME FROM GL_ROOT WHERE ID_RAW = '" << idRaw << "'";
1339 result = conn->Query(oss.str().c_str());
1340 //cout << oss.str().c_str() << "\n";
1341
1342 if (result->GetRowCount() == 0) throw YSQLQueryException(oss.str().c_str());
1343 row = result->Next();
1344 idRegistry = row->GetField(0);
1345 oss.str("");
1346 oss << row->GetField(1) << "/" << row->GetField(2);
1347 file = YFile::Open(oss.str().c_str());
1348 if (file->IsZombie()) throw YNotExistingFileException("File not found");
1349
1350 tr = (TTree*)file->Get("CalibCalPed");
1351 if (tr->IsZombie()) throw YEmptyObjectException("CalibCalPed TTree not exist");
1352
1353 if (!tr->GetBranchStatus("Registry")) throw YEmptyObjectException("Registry TBranch not existing for CalibCalPed TTree");
1354 calibCalPedRegBr = tr->GetBranch("Registry");
1355 tr->SetBranchAddress("Registry", &registry);
1356
1357 if (!tr->GetBranchStatus("CalibCalPed")) throw YEmptyObjectException("CalibCalPed TBranch not existing for CalibCalPed TTree");
1358 calibCalPedEvBr = tr->GetBranch("CalibCalPed");
1359 tr->SetBranchAddress("CalibCalPed", &calibCalPed);
1360
1361 nevents = calibCalPedRegBr->GetEntries();
1362 //cout << "nEvents: " << dec << nevents << "\n";
1363 for (Int_t i = 0; i < nevents; i++){
1364 /*----- DO NOT INVERT!!-----*/
1365 calibCalPedRegBr->GetEntry(i);
1366 calibCalPedEvBr->GetEntry(registry->event);
1367 //cout << "i: " << dec << i << "\n";
1368 //cout << "registry: " << dec << registry->event << "\n";
1369 /*----- DO NOT INVERT!!-----*/
1370 for (int j = 0; j < 4; j++){
1371 if (calibCalPed->cstwerr[j] == 0) continue;
1372 /*
1373 * INSERT the CalibCalPed section into CL_CALIB_CAL_PED
1374 */
1375 oss.str("");
1376 oss << " INSERT INTO TM_CALO_CALIB (ID_REGISTRY, REG_EVENT, TIME, CAL_SECTION, CPERROR, CSTWERR) "
1377 << " VALUES ( " << idRegistry << ", "
1378 << dec << i << ", "
1379 << dec << registry->absTime << ", "
1380 << dec << j << ", "
1381 << dec << calibCalPed->cperror[j] << ", "
1382 << dec << calibCalPed->cstwerr[j] << ")" ;
1383 //cout << oss.str().c_str() << "\n";
1384 conn->Query(oss.str().c_str());
1385 }
1386 }
1387 file->Close();
1388 return OK;
1389 }
1390
1391 /**
1392 * Insert a new CALO items into the GL_CALO_XXX table.
1393 * Throw exception if (conn == 0) or the SQL command went wrong.
1394 * @param conn An active connection to a suitable (for PAMELA) database.
1395 * @param idRaw The ID code of the raw file according to the GL_RAW table.
1396 */
1397 int PamelaDBOperations::insertNEW_CALO_CALIB(TSQLServer *conn, const char *rawPathName, const char *rawFileName)
1398 throw (YSQLNotConnectedException, YSQLQueryException){
1399 if (conn == 0) throw YSQLNotConnectedException("Connection missing");
1400 const char *id = PamelaDBOperations::getID_RAW(conn, rawPathName, rawFileName);
1401 stringstream oss;
1402
1403 if (id == NULL) throw YSQLQueryException(RAW_FILE_NOT_FOUND);
1404
1405 /*
1406 * Verify that the CALO_CALIB have been not already processed
1407 */
1408 oss.str("");
1409 oss << " SELECT COUNT(GL_CALO_CALIB.ID) FROM GL_CALO_CALIB "
1410 << " LEFT JOIN GL_ROOT "
1411 << " ON GL_ROOT.ID = GL_CALO_CALIB.ID_REG_CALIBCALPED "
1412 << " WHERE GL_ROOT.ID_RAW = " << id;
1413 TSQLResult *result = conn->Query(oss.str().c_str());
1414 if (result == NULL) throw YSQLQueryException(oss.str().c_str());
1415 TSQLRow *row = result->Next();
1416 if ((row != NULL) && (atol(row->GetField(0)) > 0)) throw YSQLQueryException("CaloPed calibrations already inserted in the database");
1417
1418 try {
1419 insertNEW_CALO_CALIB(conn, id);
1420 } catch (YSQLQueryException exc) {
1421 cout << "Eccezione! " << exc.print() << "\n";
1422 return NOK;
1423 } catch (YSQLNotConnectedException exc) {
1424 cout << "Eccezione! " << exc.print() << "\n";
1425 return NOK;
1426 }
1427 return OK;
1428 }
1429
1430 /**
1431 * Insert a new CALO items into the GL_CALO_XXX table.
1432 * Throw exception if (conn == 0) or the SQL command went wrong.
1433 * @param conn An active connection to a suitable (for PAMELA) database.
1434 * @param idRaw The ID code of the raw file according to the GL_RAW table.
1435 */
1436 int PamelaDBOperations::insertNEW_CALO_CALIB(TSQLServer *conn, const char *idRaw)
1437 throw (YSQLNotConnectedException, YSQLQueryException){
1438
1439 if (conn == 0) throw YSQLNotConnectedException("Connection missing");
1440 stringstream oss;
1441 TSQLResult *result = 0;
1442 TSQLRow *row = 0;
1443
1444 /*---- Create/Populate the TM_CALOCALIB table ----*/
1445 try {
1446 populateTM_CALO_CALIB(conn, idRaw);
1447 } catch (YEmptyObjectException exc) {
1448 cout << "Eccezione! " << exc.print() << "\n";
1449 return NOK;
1450 }
1451
1452 /*---- BEGIN - Fill/update the GL_CALO_CALIB table looping on GL_RUN matching with TM_CALIB_CAL_PED ----*/
1453 oss.str("");
1454 oss << "SELECT TIME as TM_TIME, CAL_SECTION AS SECTION, REG_EVENT AS TM_EV, ID_REGISTRY AS TM_ID_REG, "
1455 << " ID AS TM_ID "
1456 << " FROM TM_CALO_CALIB "
1457 << " WHERE CPERROR = 0 "
1458 << " ORDER BY TIME ";
1459
1460 //cout << oss.str().c_str() << "\n";
1461 result = conn->Query(oss.str().c_str());
1462 ULong64_t time = 0;
1463 int section = 0;
1464 unsigned long reg_ev = 0;
1465 unsigned long id_reg = 0;
1466 unsigned long tm_id = 0;
1467 while (true){
1468 row = result->Next();
1469 if (row == 0) break;
1470 time = (ULong64_t)atof(row->GetField(0)) ;
1471 section = (int)atoi(row->GetField(1)) ;
1472 reg_ev = (unsigned long)atol(row->GetField(2)) ;
1473 id_reg = (unsigned long)atol(row->GetField(3)) ;
1474 tm_id = (unsigned long)atol(row->GetField(4)) ;
1475 try{
1476 insertNEW_CALO_CALIB(conn, time, section, reg_ev, id_reg, tm_id);
1477 } catch (YEmptyObjectException exc) {
1478 logger->error(exc.print());
1479 } catch (YProcessErrorException exc) {
1480 logger->error(exc.print());
1481 }
1482 }
1483 oss.str("");
1484 oss << " DROP TABLE IF EXISTS TM_CALO_CALIB ";
1485 // GOOD FOR MySQL ver > 3.2
1486 //oss << " DROP TEMPORARY TABLE IF EXISTS TM_CALO_CALIB ";
1487 //if (conn->Query(oss.str().c_str()) == 0) throw YSQLQueryException(oss.str().c_str());
1488 conn->Query(oss.str().c_str());
1489 /*---- END - Fill/update the GL_CALO_CALIB table looping on GL_RUN matching with TM_CALO_CALIB ----*/
1490 }
1491
1492 /**
1493 * Insert CALOCALIB items into the GL_CALO_CALIB table.
1494 * Throw exception if (conn == 0) or the SQL command went wrong.
1495 * @param conn An active connection to a suitable (for PAMELA) database.
1496 * @param time The time of the new calorimeter calibration.
1497 * @param section The section of this calibration.
1498 * @param reg_ev The registry entry number of the calibration.
1499 * @param id_reg The registry id number of the calibration.
1500 * @param tm_id The id of the TM_CALOCALIB.
1501 */
1502 int PamelaDBOperations::insertNEW_CALO_CALIB(TSQLServer *conn, ULong64_t time, int section, unsigned long reg_ev, unsigned long id_reg, unsigned long tm_id)
1503 throw (YSQLNotConnectedException, YSQLQueryException, YEmptyObjectException, YProcessErrorException) {
1504
1505 if (conn == 0) throw YSQLNotConnectedException("Connection missing");
1506 if ((id_reg == 0) || (tm_id == 0)) throw YSQLNotConnectedException("Not valid IDs");
1507
1508 TSQLResult *result = 0;
1509 TSQLRow *row = 0;
1510 ULong64_t max_time = 0;
1511 unsigned long id_item = 0;
1512 bool processed = false;
1513 stringstream oss;
1514
1515
1516 /* Check if any GL_CALO_CALIB interval contain the new calibration for the specific section
1517 It is supposed that NO MORE than one interval could contain the new calibration; if this
1518 happens check the assignement procedure.
1519 */
1520 oss.str("");
1521 oss << " SELECT ID, TO_TIME "
1522 << " FROM GL_CALO_CALIB "
1523 << " WHERE ( " << dec << time << " >= FROM_TIME AND "
1524 << dec << time << " <= TO_TIME ) AND "
1525 << " SECTION = " << dec << section;
1526 //cout << oss.str().c_str() << "\n";
1527 result = conn->Query(oss.str().c_str());
1528 if (result->GetRowCount() != 0) {
1529 /*
1530 The new calibration time is contained in a previous CALO_CALIB item
1531 */
1532 row = result->Next();
1533
1534 if (time == (ULong64_t)atof(row->GetField(1))) return 0;
1535 /*
1536 Resize the existing CALO_CALIB item
1537 */
1538 oss.str("");
1539 oss << " UPDATE GL_CALO_CALIB "
1540 << " SET GL_CALO_CALIB.TO_TIME = " << dec << time
1541 << " WHERE GL_CALO_CALIB.ID = " << row->GetField(0);
1542 //cout << oss.str().c_str() << "\n";
1543 conn->Query(oss.str().c_str());
1544
1545 //insert a new CALO_CALIB item
1546 oss.str("");
1547 oss << " INSERT INTO GL_CALO_CALIB (EV_REG_CALIBCALPED, ID_REG_CALIBCALPED, "
1548 << " FROM_TIME, TO_TIME, SECTION) "
1549 << " VALUES ( "
1550 << dec << reg_ev << ", "
1551 << dec << id_reg << ", "
1552 << dec << time << ", "
1553 << row->GetField(1) << ", "
1554 << dec << section << ") ";
1555 //cout << oss.str().c_str() << "\n";
1556 conn->Query(oss.str().c_str());
1557 processed = true;
1558 } else {
1559 if (processed) throw YSQLNotConnectedException("TM_CALIB processed twice");
1560 /*
1561 The calibration is NOT contained in any previous time interval
1562 */
1563 oss.str("");
1564 //THE FROM_TIME > time is not really needed.....
1565 oss << " SELECT ID, MAX(RUNTRAILER_TIME), RUNHEADER_TIME "
1566 << " FROM GL_RUN "
1567 << " WHERE (RUNHEADER_TIME > " << dec << time << ") "
1568 << " GROUP BY ID "
1569 << " ORDER BY RUNTRAILER_TIME DESC";
1570 //cout << oss.str().c_str() << "\n";
1571 result = conn->Query(oss.str().c_str());
1572 if (result->GetRowCount() != 0) {
1573 row = result->Next();
1574 /*
1575 The new calibration time is LESS than any new RUNs
1576 (if the RUNs where old they should already belong to some calibration interval).
1577
1578 Note that this insert will span through all the time interval of the new RUNs,
1579 so in the next loop new calibrations will not fall into this ELSE but in the previous IF!!!! This splution should guarantee that after this procedure every RUN should fall
1580 into the calbration previous in time.
1581 */
1582 oss.str("");
1583 oss << " INSERT INTO GL_CALO_CALIB (EV_REG_CALIBCALPED, ID_REG_CALIBCALPED, "
1584 << " FROM_TIME, TO_TIME, SECTION) "
1585 << " VALUES ( "
1586 << dec << reg_ev << ", "
1587 << dec << id_reg << ", "
1588 << dec << time << ", "
1589 << row->GetField(1) << ", "
1590 << dec << section << ")";
1591 //cout << oss.str().c_str() << "\n";
1592 conn->Query(oss.str().c_str());
1593
1594 /*
1595 Delete the inserted TM_CALIBCALO
1596 */
1597 oss.str("");
1598 oss << " DELETE FROM TM_CALO_CALIB "
1599 << " WHERE ID = " << dec << tm_id;
1600 //cout << oss.str().c_str() << "\n";
1601 conn->Query(oss.str().c_str());
1602 processed = true;
1603 } else {
1604 /*
1605 The new calibration time is GREATER than the first one of the new RUNs
1606 (if the RUNs where old they should already belong to some calibration interval).
1607
1608 Note that this insert will span through all the time interval of the new RUNs,
1609 so in the next loop new calibrations will not fall into this ELSE but in the previous IF!!!! This splution should guarantee that after this procedure every RUN should fall
1610 into the calbration previous in time.
1611 */
1612
1613 /*
1614 Select the max time included in the calibration the already existing GL_CALO_CALIB
1615 */
1616 oss.str("");
1617 oss << " SELECT ID AS ID_CALIB, MAX(TO_TIME) "
1618 << " FROM GL_CALO_CALIB "
1619 << " WHERE SECTION = " << dec << section
1620 << " GROUP BY ID "
1621 << "ORDER BY TO_TIME DESC ";
1622 //cout << oss.str().c_str() << "\n";
1623 result = conn->Query(oss.str().c_str());
1624 if (result->GetRowCount() != 0) {
1625 row = result->Next();
1626 id_item = (unsigned long)atol(row->GetField(0)) ;
1627 max_time = (ULong64_t)atof(row->GetField(1)) ;
1628 /*
1629 Resize the existing CALO_CALIB item
1630 */
1631 oss.str("");
1632 oss << " UPDATE GL_CALO_CALIB "
1633 << " SET GL_CALO_CALIB.TO_TIME = " << dec << max_time
1634 << " WHERE GL_CALO_CALIB.ID = " << dec << id_item;
1635 //cout << oss.str().c_str() << "\n";
1636 conn->Query(oss.str().c_str());
1637
1638 oss.str("");
1639 oss << " INSERT INTO GL_CALO_CALIB (EV_REG_CALIBCALPED, ID_REG_CALIBCALPED, "
1640 << " FROM_TIME, TO_TIME, SECTION) "
1641 << " VALUES ( "
1642 << dec << reg_ev << ", "
1643 << dec << id_reg << ", "
1644 << dec << max_time << ", "
1645 << dec << time << ", "
1646 << dec << section << ") ";
1647 //cout << oss.str().c_str() << "\n";
1648 conn->Query(oss.str().c_str());
1649
1650 /*
1651 Delete the inserted TM_CALIBCALO
1652 */
1653 oss.str("");
1654 oss << " DELETE FROM TM_CALO_CALIB "
1655 << " WHERE ID = " << dec << tm_id;
1656 //cout << oss.str().c_str() << "\n";
1657 conn->Query(oss.str().c_str());
1658 }
1659 processed = true;
1660 }
1661 }
1662 if (!processed) throw YSQLNotConnectedException("TM_CALIB not processed");
1663 }
1664
1665
1666
1667 /**
1668 * Populate the TM_S4_CALIB.
1669 * Throw exception if (conn == 0) or the SQL command went wrong.
1670 * @param conn An active connection to a suitable (for PAMELA) database.
1671 * @param idRaw The ID code of the raw file according to the GL_RAW table.
1672 */
1673
1674 int PamelaDBOperations::populateTM_S4_CALIB(TSQLServer *conn, const char *idRaw)
1675 throw (YSQLNotConnectedException, YSQLQueryException, YEmptyObjectException) {
1676 if (conn == 0) throw YSQLNotConnectedException("Connection missing");
1677 stringstream oss;
1678
1679 const char *idRegistry;
1680 TSQLResult *result;
1681 TSQLRow *row = 0;
1682 TFile *rootFile = 0;
1683 TTree *tr = 0;
1684 TBranch *calibS4RegBr = 0;
1685 TBranch *calibS4EvBr = 0;
1686 CalibS4Event *calibS4 = new CalibS4Event();
1687 RegistryEvent *registry = 0;
1688 Long64_t nevents = 0;
1689 double param_fit = 0;
1690
1691
1692 // Create the temporary table to collect the CalibS4 items
1693 conn->Query(PamelaDBOperations::TM_S4_CALIB);
1694
1695 //Get the Registry file relative to the CalibS4
1696 oss.str("");
1697 oss << "SELECT ID, PATH, NAME FROM GL_ROOT WHERE ID_RAW = '" << idRaw << "'";
1698 result = conn->Query(oss.str().c_str());
1699 //cout << oss.str().c_str() << "\n";
1700 row = result->Next();
1701 if (row == 0) throw YSQLQueryException(oss.str().c_str());
1702
1703 idRegistry = row->GetField(0);
1704 oss.str("");
1705 oss << row->GetField(1) << "/" << row->GetField(2);
1706 rootFile = YFile::Open(oss.str().c_str());
1707
1708
1709 if (rootFile->IsZombie()) throw YNotExistingFileException("File not found");
1710 tr = (TTree*)rootFile->Get("CalibS4");
1711 if (tr->IsZombie()) throw YEmptyObjectException("Calibs4 TTree not exist");
1712
1713 if (!tr->GetBranchStatus("Registry")) throw YEmptyObjectException("Registry TBranch not existing for CalibS4 TTree");
1714 calibS4RegBr = tr->GetBranch("Registry");
1715 tr->SetBranchAddress("Registry", &registry);
1716
1717 calibS4EvBr = tr->GetBranch("CalibS4");
1718 tr->SetBranchAddress("CalibS4", &calibS4);
1719
1720 nevents = calibS4RegBr->GetEntries();
1721 //cout << "nEvents in CalibS4Registry: " << dec << nevents << "\n";
1722 for (Int_t i = 0; i < nevents; i++){
1723 /*----- DO NOT INVERT!!-----*/
1724 calibS4RegBr->GetEntry(i);
1725 calibS4EvBr->GetEntry(registry->event);
1726 TArrayD params = S4_paramfit(calibS4);
1727 //cout << "Param0:" << dec << params.At(0);
1728 //cout << "Param1:" << dec << params.At(0);
1729 oss.str("");
1730 oss << " INSERT INTO TM_S4_CALIB (ID_REGISTRY, REG_EVENT, TIME, PARAM_FIT0, PARAM_FIT1) "
1731 << " VALUES ( " << idRegistry << ", "
1732 << dec << i << ", "
1733 << dec << registry->absTime << ", "
1734 << dec << params.At(0) << ", "
1735 << dec << params.At(1) << ")" ;
1736 //cout << oss.str().c_str() << "\n";
1737 conn->Query(oss.str().c_str());
1738 }
1739 return OK;
1740 }
1741
1742 /**
1743 * Collect the CALIB_S4 from each section of each RUN.
1744 * Throw exception if (conn == 0) or the SQL command went wrong.
1745 * @param conn An active connection to a suitable (for PAMELA) database.
1746 * @param rawPathName The path to the root file.
1747 * @param rawFileName The name of the root file.
1748 */
1749 int PamelaDBOperations::insertNEW_S4_CALIB(TSQLServer *conn, const char *rawPathName, const char *rawFileName)
1750 throw (YSQLNotConnectedException, YSQLQueryException){
1751 if (conn == 0) throw YSQLNotConnectedException("Connection missing");
1752 const char *id = PamelaDBOperations::getID_RAW(conn, rawPathName, rawFileName);
1753 stringstream oss;
1754
1755 if (id == NULL) throw YSQLQueryException(RAW_FILE_NOT_FOUND);
1756
1757 /*
1758 * Verify that the S4_CALIB have been not already processed
1759 */
1760 oss.str("");
1761 oss << " SELECT COUNT(GL_S4_CALIB.ID) FROM GL_S4_CALIB "
1762 << " LEFT JOIN GL_ROOT "
1763 << " ON GL_ROOT.ID = GL_S4_CALIB.ID_REG_CALIBS4 "
1764 << " WHERE GL_ROOT.ID_RAW = " << id;
1765 TSQLResult *result = conn->Query(oss.str().c_str());
1766 if (result == NULL) throw YSQLQueryException(oss.str().c_str());
1767 TSQLRow *row = result->Next();
1768 if ((row != NULL) && (atol(row->GetField(0)) > 0)) throw YSQLQueryException("S4 calibrations already inserted in the database");
1769
1770 try {
1771 return insertNEW_S4_CALIB(conn, id);
1772 } catch (YSQLQueryException exc) {
1773 cout << "Eccezione! " << exc.print() << "\n";
1774 return NOK;
1775 } catch (YSQLNotConnectedException exc) {
1776 cout << "Eccezione! " << exc.print() << "\n";
1777 return NOK;
1778 }
1779 return OK;
1780 }
1781
1782 /**
1783 * Insert a new S4 items into the GL_S4_CALIB table.
1784 * Throw exception if (conn == 0) or the SQL command went wrong.
1785 * @param conn An active connection to a suitable (for PAMELA) database.
1786 * @param idRaw The ID code of the raw file according to the GL_RAW table.
1787 */
1788 int PamelaDBOperations::insertNEW_S4_CALIB(TSQLServer *conn, const char *idRaw)
1789 throw (YSQLNotConnectedException, YSQLQueryException){
1790
1791 if (conn == 0) throw YSQLNotConnectedException("Connection missing");
1792 stringstream oss;
1793 TSQLResult *result = 0;
1794 TSQLRow *row = 0;
1795
1796 /*---- Create/Populate the TM_S4CALIB table ----*/
1797 try {
1798 populateTM_S4_CALIB(conn, idRaw);
1799 } catch (YEmptyObjectException exc) {
1800 cout << "Eccezione! " << exc.print() << "\n";
1801 return NOK;
1802 }
1803
1804
1805 /*---- BEGIN - Fill/update the GL_S4_CALIB table looping on GL_RUN matching with TM_CALIB_CAL_PED ----*/
1806 oss.str("");
1807 oss << "SELECT TIME, PARAM_FIT0, PARAM_FIT1, REG_EVENT, ID_REGISTRY, ID "
1808 << " FROM TM_S4_CALIB "
1809 << " ORDER BY TIME ";
1810
1811 //cout << oss.str().c_str() << "\n";
1812 result = conn->Query(oss.str().c_str());
1813 ULong64_t time = 0;
1814 float param_fit0 = 0;
1815 float param_fit1 = 0;
1816 unsigned long reg_ev = 0;
1817 unsigned long id_reg = 0;
1818 unsigned long tm_id = 0;
1819 while (true){
1820 row = result->Next();
1821 if (row == 0) break;
1822 time = (ULong64_t)atof(row->GetField(0)) ;
1823 param_fit0 = (float)atof(row->GetField(1)) ;
1824 param_fit1 = (float)atof(row->GetField(2)) ;
1825 reg_ev = (unsigned long)atol(row->GetField(3)) ;
1826 id_reg = (unsigned long)atol(row->GetField(4)) ;
1827 tm_id = (unsigned long)atol(row->GetField(5)) ;
1828 try{
1829 insertNEW_S4_CALIB(conn, param_fit0, param_fit1, time, reg_ev, id_reg, tm_id);
1830 } catch (YEmptyObjectException exc) {
1831 logger->error(exc.print());
1832 } catch (YProcessErrorException exc) {
1833 logger->error(exc.print());
1834 }
1835 }
1836 oss.str("");
1837 oss << " DROP TABLE IF EXISTS TM_S4_CALIB ";
1838 // GOOD FOR MySQL ver > 3.2
1839 //oss << " DROP TEMPORARY TABLE IF EXISTS TM_S4_CALIB ";
1840 //if (conn->Query(oss.str().c_str()) == 0) throw YSQLQueryException(oss.str().c_str());
1841 conn->Query(oss.str().c_str());
1842 /*---- END - Fill/update the GL_CALO_CALIB table looping on GL_RUN matching with TM_CALIB_CAL_PED ----*/
1843 }
1844
1845
1846 /**
1847 * Insert S4CALIB items into the GL_S4_CALIB table.
1848 * Throw exception if (conn == 0) or the SQL command went wrong.
1849 * @param conn An active connection to a suitable (for PAMELA) database.
1850 * @param time The time of the new S4 calibration.
1851 * @param section The section of this calibration.
1852 * @param reg_ev The registry entry number of the calibration.
1853 * @param id_reg The registry id number of the calibration.
1854 * @param tm_id The id of the TM_S4CALIB.
1855 */
1856 int PamelaDBOperations::insertNEW_S4_CALIB(TSQLServer *conn, float paramfit0, float paramfit1, ULong64_t time, unsigned long reg_ev, unsigned long id_reg, unsigned long tm_id)
1857 throw (YSQLNotConnectedException, YSQLQueryException, YEmptyObjectException, YProcessErrorException) {
1858
1859 if (conn == 0) throw YSQLNotConnectedException("Connection missing");
1860 if ((id_reg == 0) || (tm_id == 0)) throw YSQLNotConnectedException("Not valid IDs");
1861
1862 TSQLResult *result = 0;
1863 TSQLRow *row = 0;
1864 ULong64_t max_time = 0;
1865 unsigned long id_item = 0;
1866 bool processed = false;
1867 stringstream oss;
1868
1869
1870 /* Check if any GL_S4_CALIB interval contain the new calibration for the specific section
1871 It is supposed that NO MORE than one interval could contain the new calibration; if this
1872 happens check the assignement procedure.
1873 */
1874 oss.str("");
1875 oss << " SELECT ID, TO_TIME "
1876 << " FROM GL_S4_CALIB "
1877 << " WHERE ( " << dec << time << " >= FROM_TIME AND "
1878 << dec << time << " <= TO_TIME ) ";
1879 //cout << oss.str().c_str() << "\n";
1880 result = conn->Query(oss.str().c_str());
1881
1882 row = result->Next();
1883 if (row != 0) {
1884 if (time == (ULong64_t)atof(row->GetField(1))) return 0;
1885 /*
1886 Resize the existing S4_CALIB item
1887 */
1888 oss.str("");
1889 oss << " UPDATE GL_S4_CALIB "
1890 << " SET GL_S4_CALIB.TO_TIME = " << dec << time
1891 << " WHERE GL_S4_CALIB.ID = " << row->GetField(0);
1892 //cout << oss.str().c_str() << "\n";
1893 conn->Query(oss.str().c_str());
1894
1895 //insert a new S4_CALIB item
1896 oss.str("");
1897 oss << " INSERT INTO GL_S4_CALIB (EV_REG_CALIBS4, ID_REG_CALIBS4, "
1898 << " FROM_TIME, TO_TIME, PARAM_FIT0, PARAM_FIT1) "
1899 << " VALUES ( "
1900 << dec << reg_ev << ", "
1901 << dec << id_reg << ", "
1902 << dec << time << ", "
1903 << row->GetField(1) << ", "
1904 << dec << paramfit0 << ", "
1905 << dec << paramfit1 << ") ";
1906 //cout << oss.str().c_str() << "\n";
1907 conn->Query(oss.str().c_str());
1908 processed = true;
1909 } else {
1910 if (processed) throw YSQLNotConnectedException("TM_CALIB processed twice");
1911 /*
1912 The calibration is NOT contained in any previous time interval
1913 */
1914 oss.str("");
1915 //THE FROM_TIME > time is not really needed.....
1916 oss << " SELECT ID, MAX(RUNTRAILER_TIME), RUNHEADER_TIME "
1917 << " FROM GL_RUN "
1918 << " WHERE (RUNHEADER_TIME > " << dec << time << ") "
1919 << " GROUP BY ID "
1920 << " ORDER BY RUNTRAILER_TIME DESC";
1921 //cout << oss.str().c_str() << "\n";
1922 result = conn->Query(oss.str().c_str());
1923 //if (result->GetRowCount() != 0) {
1924 row = result->Next();
1925 if (row != NULL) {
1926 /*
1927 The new calibration time is LESS than any new RUNs
1928 (if the RUNs where old they should already belong to some calibration interval).
1929
1930 Note that this insert will span through all the time interval of the new RUNs,
1931 so in the next loop new calibrations will not fall into this ELSE but in the previous IF!!!! This splution should guarantee that after this procedure every RUN should fall
1932 into the calbration previous in time.
1933 */
1934 oss.str("");
1935 oss << " INSERT INTO GL_S4_CALIB (EV_REG_CALIBS4, ID_REG_CALIBS4, "
1936 << " FROM_TIME, TO_TIME, PARAM_FIT0, PARAM_FIT1) "
1937 << " VALUES ( "
1938 << dec << reg_ev << ", "
1939 << dec << id_reg << ", "
1940 << dec << time << ", "
1941 << row->GetField(1) << ", "
1942 << dec << paramfit0 << ", "
1943 << dec << paramfit1 << ")";
1944 //cout << oss.str().c_str() << "\n";
1945 conn->Query(oss.str().c_str());
1946
1947 /*
1948 Delete the inserted TM_CALIBCALO
1949 */
1950 oss.str("");
1951 oss << " DELETE FROM TM_S4_CALIB "
1952 << " WHERE ID = " << dec << tm_id;
1953 //cout << oss.str().c_str() << "\n";
1954 conn->Query(oss.str().c_str());
1955 processed = true;
1956 } else {
1957 /*
1958 The new calibration time is GREATER than the first one of the new RUNs
1959 (if the RUNs where old they should already belong to some calibration interval).
1960
1961 Note that this insert will span through all the time interval of the new RUNs,
1962 so in the next loop new calibrations will not fall into this ELSE but in the previous IF!!!! This splution should guarantee that after this procedure every RUN should fall
1963 into the calbration previous in time.
1964 */
1965
1966 /*
1967 Select the max time included in the calibration the already existing GL_S4_CALIB
1968 */
1969 oss.str("");
1970 oss << " SELECT ID AS ID_CALIB, MAX(TO_TIME) "
1971 << " FROM GL_S4_CALIB "
1972 << " GROUP BY ID "
1973 << " ORDER BY TO_TIME DESC";
1974 //cout << oss.str().c_str() << "\n";
1975 result = conn->Query(oss.str().c_str());
1976 //if (result->GetRowCount() != 0) {
1977 if (row != NULL) {
1978 row = result->Next();
1979 id_item = (unsigned long)atol(row->GetField(0)) ;
1980 max_time = (ULong64_t)atof(row->GetField(1)) ;
1981 /*
1982 Resize the existing CALO_CALIB item
1983 */
1984 oss.str("");
1985 oss << " UPDATE GL_S4_CALIB "
1986 << " SET GL_S4_CALIB.TO_TIME = " << dec << max_time
1987 << " WHERE GL_S4_CALIB.ID = " << dec << id_item;
1988 //cout << oss.str().c_str() << "\n";
1989 conn->Query(oss.str().c_str());
1990
1991 oss.str("");
1992 oss << " INSERT INTO GL_S4_CALIB (EV_REG_CALIBS4, ID_REG_CALIBS4, "
1993 << " FROM_TIME, TO_TIME, PARAM_FIT0, PARAM_FIT1) "
1994 << " VALUES ( "
1995 << dec << reg_ev << ", "
1996 << dec << id_reg << ", "
1997 << dec << max_time << ", "
1998 << dec << time << ", "
1999 << dec << paramfit0 << ", "
2000 << dec << paramfit1 << ") ";
2001 //cout << oss.str().c_str() << "\n";
2002 conn->Query(oss.str().c_str());
2003
2004 /*
2005 Delete the inserted TM_CALIBS4
2006 */
2007 oss.str("");
2008 oss << " DELETE FROM TM_S4_CALIB "
2009 << " WHERE ID = " << dec << tm_id;
2010 //cout << oss.str().c_str() << "\n";
2011 conn->Query(oss.str().c_str());
2012 }
2013 processed = true;
2014 }
2015 }
2016 if (!processed) throw YSQLNotConnectedException("TM_CALIB not processed");
2017 }
2018
2019
2020 //******************************************************************************
2021 /**
2022 * Collect the CALIB_TRK from each section of each RUN.
2023 * Throw exception if (conn == 0) or the SQL command went wrong.
2024 * @param conn An active connection to a suitable (for PAMELA) database.
2025 * @param rawPathName The path to the root file.
2026 * @param rawFileName The name of the root file.
2027 */
2028 int PamelaDBOperations::insertNEW_TRK_CALIB(TSQLServer *conn, const char *rawPathName, const char *rawFileName)
2029 throw (YSQLNotConnectedException, YSQLQueryException){
2030 if (conn == 0) throw YSQLNotConnectedException("Connection missing");
2031 const char *id = PamelaDBOperations::getID_RAW(conn, rawPathName, rawFileName);
2032 stringstream oss;
2033
2034 if (id == NULL) throw YSQLQueryException(RAW_FILE_NOT_FOUND);
2035
2036 /*
2037 * Verify that the TRK_CALIB have been not already processed
2038 */
2039 oss.str("");
2040 oss << " SELECT COUNT(GL_TRK_CALIB.ID) FROM GL_TRK_CALIB "
2041 << " LEFT JOIN GL_ROOT "
2042 << " ON GL_ROOT.ID = GL_TRK_CALIB.ID_REG_CALIBTRK "
2043 << " WHERE GL_ROOT.ID_RAW = " << id;
2044 TSQLResult *result = conn->Query(oss.str().c_str());
2045 if (result == NULL) throw YSQLQueryException(oss.str().c_str());
2046 TSQLRow *row = result->Next();
2047 if ((row != NULL) && (atol(row->GetField(0)) > 0)) throw YSQLQueryException("TRKx calibrations already inserted in the database");
2048
2049 try {
2050 insertNEW_TRK_CALIB(conn, id);
2051 } catch (YSQLQueryException exc) {
2052 cout << "Eccezione! " << exc.print() << "\n";
2053 return NOK;
2054 } catch (YSQLNotConnectedException exc) {
2055 cout << "Eccezione! " << exc.print() << "\n";
2056 return NOK;
2057 }
2058 return OK;
2059 }
2060
2061
2062 /**
2063 * Insert a new TRK items into the GL_TRK_CALIB table.
2064 * Throw exception if (conn == 0) or the SQL command went wrong.
2065 * @param conn An active connection to a suitable (for PAMELA) database.
2066 * @param idRaw The ID code of the raw file according to the GL_RAW table.
2067 */
2068 int PamelaDBOperations::insertNEW_TRK_CALIB(TSQLServer *conn, const char *idRaw)
2069 throw (YSQLNotConnectedException, YSQLQueryException){
2070
2071 if (conn == 0) throw YSQLNotConnectedException("Connection missing");
2072 stringstream oss;
2073 TSQLResult *res = 0;
2074 TSQLResult *res2 = 0;
2075 TSQLRow *row = 0;
2076 TSQLRow *row2 = 0;
2077
2078 /*---- Create/Populate the TM_TRKCALIB table ----*/
2079 try {
2080 populateTM_TRK_CALIB(conn, idRaw);
2081 } catch (YEmptyObjectException exc) {
2082 cout << "Eccezione! " << exc.print() << "\n";
2083 return NOK;
2084 }
2085
2086 /*---- BEGIN - Fill/update the GL_TRK_CALIB table looping on GL_RUN matching with TM_CALIB_TRK ----*/
2087 /* According to how the CPU execute the calibration sequence the CalibTrk1 and the CalibTrk2 are one
2088 * after the other. Beacuse of this in the second query we search for the CalibTrk2 which has a
2089 * (packet number + 1)
2090 */
2091 ULong64_t time = 0;
2092 unsigned long reg_ev1 = 0;
2093 unsigned long reg_ev2 = 0;
2094 unsigned long id_reg = 0;
2095 const char* tm_id1 = 0;
2096 const char* tm_id2 = 0;
2097
2098 oss.str("");
2099 oss << "SELECT TIME, REG_EVENT, ID_REGISTRY, PCK_COUNTER, ID"
2100 << " FROM TM_TRK_CALIB WHERE TRK_PART = 1"
2101 << " ORDER BY TIME ";
2102
2103 //cout << oss.str().c_str() << "\n";
2104 res = conn->Query(oss.str().c_str());
2105 row = res->Next();
2106 while (!(row == 0)){
2107 id_reg = (unsigned long)atol(row->GetField(2)) ;
2108 reg_ev1 = (unsigned long)atol(row->GetField(1)) ;
2109 time = (ULong64_t)atof(row->GetField(0)) ;
2110 tm_id1 = row->GetField(4);
2111 tm_id2 = row->GetField(1);
2112 oss.str("");
2113 oss << "SELECT REG_EVENT, ID"
2114 << " FROM TM_TRK_CALIB WHERE TRK_PART = 2 "
2115 << " AND ID_REGISTRY = " << row->GetField(2)
2116 << " AND PCK_COUNTER = " << dec << (atol(row->GetField(3)) + 1)
2117 << " ORDER BY TIME ";
2118 //cout << oss.str().c_str() << "\n";
2119 res2 = conn->Query(oss.str().c_str());
2120 row2 = res2->Next();
2121 if (!(row2 == 0)){
2122 reg_ev2 = (unsigned long)atol(row2->GetField(0)) ;
2123 try{
2124 insertNEW_TRK_CALIB(conn, id_reg, reg_ev1, reg_ev2, time, tm_id1, tm_id2);
2125 } catch (YEmptyObjectException exc) {
2126 logger->error(exc.print());
2127 } catch (YProcessErrorException exc) {
2128 logger->error(exc.print());
2129 }
2130 } else {
2131 cout << "The corresponding CalibTrk2 have not been found!!" << "\n";
2132 }
2133 row = res->Next();
2134 }
2135
2136 oss.str("");
2137 oss << " DROP TABLE IF EXISTS TM_TRK_CALIB ";
2138 // GOOD FOR MySQL ver > 3.2
2139 //oss << " DROP TEMPORARY TABLE IF EXISTS TM_S4_CALIB ";
2140 //if (conn->Query(oss.str().c_str()) == 0) throw YSQLQueryException(oss.str().c_str());
2141 conn->Query(oss.str().c_str());
2142 /*---- END - Fill/update the GL_CALO_CALIB table looping on GL_RUN matching with TM_CALIB_CAL_PED ----*/
2143 }
2144
2145
2146 /**
2147 * Insert TRKCALIB items into the GL_TRK_CALIB table.
2148 * Throw exception if (conn == 0) or the SQL command went wrong.
2149 * @param conn An active connection to a suitable (for PAMELA) database.
2150 * @param id_reg The registry id number of the calibration.
2151 * @param reg_ev1 The registry entry number for the Trk1 calibration.
2152 * @param reg_ev2 The registry entry number for the Trk2 calibration.
2153 * @param time The time of the calibration.
2154 */
2155 int PamelaDBOperations::insertNEW_TRK_CALIB(TSQLServer *conn, unsigned long id_reg, unsigned long reg_ev1, unsigned long reg_ev2, ULong64_t time, const char* tm_id1, const char* tm_id2)
2156 throw (YSQLNotConnectedException, YSQLQueryException, YEmptyObjectException, YProcessErrorException) {
2157
2158 if (conn == 0) throw YSQLNotConnectedException("Connection missing");
2159 //if ((id_reg == 0) || (tm_id == 0)) throw YSQLNotConnectedException("Not valid IDs");
2160
2161 TSQLResult *result = 0;
2162 TSQLRow *row = 0;
2163 ULong64_t max_time = 0;
2164 unsigned long id_item = 0;
2165 bool processed = false;
2166 stringstream oss;
2167
2168
2169 /* Check if any GL_TRK_CALIB interval contain the new calibration for the specific section
2170 It is supposed that NO MORE than one interval could contain the new calibration; if this
2171 happens check the assignement procedure.
2172 */
2173 oss.str("");
2174 oss << " SELECT ID, TO_TIME "
2175 << " FROM GL_TRK_CALIB "
2176 << " WHERE ( " << dec << time << " >= FROM_TIME AND "
2177 << dec << time << " <= TO_TIME )";
2178 //cout << oss.str().c_str() << "\n";
2179 result = conn->Query(oss.str().c_str());
2180 if (result->GetRowCount() != 0) {
2181 /*
2182 The new calibration time is contained in a previous GL_TRK_CALIB item
2183 */
2184 row = result->Next();
2185
2186 if (time == (ULong64_t)atof(row->GetField(1))) return 0;
2187 /*
2188 Resize the existing TRK_CALIB item
2189 */
2190 oss.str("");
2191 oss << " UPDATE GL_TRK_CALIB "
2192 << " SET GL_TRK_CALIB.TO_TIME = " << dec << time
2193 << " WHERE GL_TRK_CALIB.ID = " << row->GetField(0);
2194 //cout << oss.str().c_str() << "\n";
2195 conn->Query(oss.str().c_str());
2196
2197 //insert a new TRK_CALIB item
2198 oss.str("");
2199 oss << " INSERT INTO GL_TRK_CALIB (ID_REG_CALIBTRK, EV_REG_CALIBTRK1, EV_REG_CALIBTRK2, "
2200 << " FROM_TIME, TO_TIME) "
2201 << " VALUES ( "
2202 << dec << id_reg << ", "
2203 << dec << reg_ev1 << ", "
2204 << dec << reg_ev2 << ", "
2205 << dec << time << ", "
2206 << row->GetField(1) << ") ";
2207 //cout << oss.str().c_str() << "\n";
2208 conn->Query(oss.str().c_str());
2209 processed = true;
2210 } else {
2211 if (processed) throw YSQLNotConnectedException("TM_CALIB processed twice");
2212 /*
2213 The calibration is NOT contained in any previous time interval
2214 */
2215 oss.str("");
2216 //THE FROM_TIME > time is not really needed.....
2217 oss << " SELECT ID, MAX(RUNTRAILER_TIME), RUNHEADER_TIME "
2218 << " FROM GL_RUN "
2219 << " WHERE (RUNHEADER_TIME > " << dec << time << ") "
2220 << " GROUP BY ID "
2221 << " ORDER BY RUNTRAILER_TIME DESC";
2222 //cout << oss.str().c_str() << "\n";
2223 result = conn->Query(oss.str().c_str());
2224 if (result->GetRowCount() != 0) {
2225 row = result->Next();
2226 /*
2227 The new calibration time is LESS than any new RUNs
2228 (if the RUNs where old they should already belong to some calibration interval).
2229
2230 Note that this insert will span through all the time interval of the new RUNs,
2231 so in the next loop new calibrations will not fall into this ELSE but in the previous IF!!!! This splution should guarantee that after this procedure every RUN should fall
2232 into the calbration previous in time.
2233 */
2234 oss.str("");
2235 oss << " INSERT INTO GL_TRK_CALIB (ID_REG_CALIBTRK, EV_REG_CALIBTRK1, EV_REG_CALIBTRK2, "
2236 << " FROM_TIME, TO_TIME) "
2237 << " VALUES ( "
2238 << dec << id_reg << ", "
2239 << dec << reg_ev1 << ", "
2240 << dec << reg_ev2 << ", "
2241 << dec << time << ", "
2242 << row->GetField(1) << ")";
2243 //cout << oss.str().c_str() << "\n";
2244 conn->Query(oss.str().c_str());
2245
2246 /*
2247 Delete the inserted TM_CALIBTRK
2248 */
2249 oss.str("");
2250 oss << " DELETE FROM TM_TRK_CALIB "
2251 << " WHERE ID = " << tm_id1
2252 << " OR ID = " << tm_id2;
2253 //cout << oss.str().c_str() << "\n";
2254 conn->Query(oss.str().c_str());
2255 processed = true;
2256 } else {
2257 /*
2258 The new calibration time is GREATER than the first one of the new RUNs
2259 (if the RUNs where old they should already belong to some calibration interval).
2260
2261 Note that this insert will span through all the time interval of the new RUNs,
2262 so in the next loop new calibrations will not fall into this ELSE but in the previous IF!!!! This splution should guarantee that after this procedure every RUN should fall
2263 into the calbration previous in time.
2264 */
2265
2266 /*
2267 Select the max time included in the calibration the already existing GL_TRK_CALIB
2268 */
2269 oss.str("");
2270 oss << " SELECT ID AS ID_CALIB, MAX(TO_TIME) "
2271 << " FROM GL_TRK_CALIB "
2272 << " GROUP BY ID "
2273 << " ORDER BY TO_TIME DESC";
2274 //cout << oss.str().c_str() << "\n";
2275 result = conn->Query(oss.str().c_str());
2276 if (result->GetRowCount() != 0) {
2277 row = result->Next();
2278 id_item = (unsigned long)atol(row->GetField(0)) ;
2279 max_time = (ULong64_t)atof(row->GetField(1)) ;
2280 /*
2281 Resize the existing TRK_CALIB item
2282 */
2283 oss.str("");
2284 oss << " UPDATE GL_TRK_CALIB "
2285 << " SET GL_TRK_CALIB.TO_TIME = " << dec << max_time
2286 << " WHERE GL_TRK_CALIB.ID = " << dec << id_item;
2287 //cout << oss.str().c_str() << "\n";
2288 conn->Query(oss.str().c_str());
2289
2290 oss.str("");
2291 oss << " INSERT INTO GL_TRK_CALIB ( ID_REG_CALIBTRK, EV_REG_CALIBTRK1, EV_REG_CALIBTRK2,"
2292 << " FROM_TIME, TO_TIME) "
2293 << " VALUES ( "
2294 << dec << id_reg << ", "
2295 << dec << reg_ev1 << ", "
2296 << dec << reg_ev2 << ", "
2297 << dec << max_time << ", "
2298 << dec << time << ") ";
2299 //cout << oss.str().c_str() << "\n";
2300 conn->Query(oss.str().c_str());
2301
2302 /*
2303 Delete the inserted TM_CALIBTRK
2304 */
2305 oss.str("");
2306 oss << " DELETE FROM TM_TRK_CALIB "
2307 << " WHERE ID = " << tm_id1
2308 << " OR ID = " << tm_id2;
2309 //cout << oss.str().c_str() << "\n";
2310 conn->Query(oss.str().c_str());
2311 }
2312 processed = true;
2313 }
2314 }
2315 if (!processed) throw YSQLNotConnectedException("TM_CALIB not processed");
2316 }
2317
2318 /**
2319 * Populate the TM_TRK_CALIB.
2320 * Throw exception if (conn == 0) or the SQL command went wrong.
2321 * @param conn An active connection to a suitable (for PAMELA) database.
2322 * @param idRaw The ID code of the raw file according to the GL_RAW table.
2323 */
2324 int PamelaDBOperations::populateTM_TRK_CALIB(TSQLServer *conn, const char *idRaw)
2325 throw (YSQLNotConnectedException, YSQLQueryException, YEmptyObjectException) {
2326 if (conn == 0) throw YSQLNotConnectedException("Connection missing");
2327
2328 //It is "a bit" redundant but for sake of clarity......
2329 stringstream oss;
2330 const char *idRegistry;
2331 TSQLResult *result;
2332 TSQLRow *row = 0;
2333 TFile *rootFile = 0;
2334 TTree *calibTrk1Tr = 0;
2335 TTree *calibTrk2Tr = 0;
2336 TBranch *calibTrk1EvBr = 0;
2337 TBranch *calibTrk1HdBr = 0;
2338 TBranch *calibTrk1RegBr = 0;
2339 TBranch *calibTrk2EvBr = 0;
2340 TBranch *calibTrk2HdBr = 0;
2341 TBranch *calibTrk2RegBr = 0;
2342
2343 EventHeader *calibTrk1EH = 0;
2344 PscuHeader *calibTrk1PH = 0;
2345 EventHeader *calibTrk2EH = 0;
2346 PscuHeader *calibTrk2PH = 0;
2347
2348 CalibTrk1Event *calibTrk1 = new CalibTrk1Event();
2349 CalibTrk2Event *calibTrk2 = new CalibTrk2Event();
2350 RegistryEvent *trk1Registry = 0;
2351 RegistryEvent *trk2Registry = 0;
2352 Long64_t nevents = 0;
2353
2354 /*Create the temporary table to collect the CalibTRK items*/
2355 conn->Query(PamelaDBOperations::TM_TRK_CALIB);
2356
2357 /*Get the Registry file relative to the CalibTRK1*/
2358 oss.str("");
2359 oss << "SELECT ID, PATH, NAME FROM GL_ROOT WHERE ID_RAW = '" << idRaw << "'";
2360 result = conn->Query(oss.str().c_str());
2361 //cout << oss.str().c_str() << "\n";
2362 row = result->Next();
2363 if (row == 0) throw YSQLQueryException(oss.str().c_str());
2364
2365 idRegistry = row->GetField(0);
2366 oss.str("");
2367 oss << row->GetField(1) << "/" << row->GetField(2);
2368 rootFile = YFile::Open(oss.str().c_str());
2369 if (rootFile->IsZombie()) throw YNotExistingFileException("File not found");
2370
2371 //Retrieve Registry and Events for CalibTrk1
2372 calibTrk1Tr = (TTree*)rootFile->Get("CalibTrk1");
2373 if (calibTrk1Tr->IsZombie()) throw YEmptyObjectException("CalibTrk1 TTree not exist");
2374 if (!calibTrk1Tr->GetBranchStatus("Registry")) throw YEmptyObjectException("Registry TBranch not existing for CalibTrk1 TTree");
2375 calibTrk1RegBr = calibTrk1Tr->GetBranch("Registry");
2376 calibTrk1Tr->SetBranchAddress("Registry", &trk1Registry);
2377
2378 calibTrk1EvBr = calibTrk1Tr->GetBranch("CalibTrk1");
2379 calibTrk1Tr->SetBranchAddress("CalibTrk1", &calibTrk1);
2380
2381 calibTrk1HdBr = calibTrk1Tr->GetBranch("Header");
2382 calibTrk1Tr->SetBranchAddress("Header", &calibTrk1EH);
2383
2384 //Populate TM_TRK_CALIB for CalibTrk2
2385 nevents = calibTrk1RegBr->GetEntries();
2386 //cout << "nEvents: " << dec << nevents << "\n";
2387 for (Int_t i = 0; i < nevents; i++){
2388 /*----- DO NOT INVERT!!-----*/
2389 calibTrk1RegBr->GetEntry(i);
2390 calibTrk1EvBr->GetEntry(trk1Registry->event);
2391 calibTrk1HdBr->GetEntry(trk1Registry->event);
2392 calibTrk1PH = calibTrk1EH->GetPscuHeader();
2393 oss.str("");
2394 oss << " INSERT INTO TM_TRK_CALIB (ID_REGISTRY, REG_EVENT, TIME, TRK_PART, PCK_COUNTER) "
2395 << " VALUES ( "
2396 << idRegistry << ", "
2397 << dec << i << ", "
2398 << dec << trk1Registry->absTime << ", "
2399 << dec << 1 << ", "
2400 << dec << calibTrk1PH->Counter << ")" ;
2401 //cout << oss.str().c_str() << "\n";
2402 conn->Query(oss.str().c_str());
2403 }
2404
2405
2406 //Retrieve Registry and Events for CalibTrk2
2407 calibTrk2Tr = (TTree*)rootFile->Get("CalibTrk2");
2408 if (calibTrk2Tr->IsZombie()) throw YEmptyObjectException("CalibTrk2 TTree not exist");
2409 if (!calibTrk2Tr->GetBranchStatus("Registry")) throw YEmptyObjectException("Registry TBranch not existing for CalibTrk2 TTree");
2410 calibTrk2RegBr = calibTrk2Tr->GetBranch("Registry");
2411 calibTrk2Tr->SetBranchAddress("Registry", &trk2Registry);
2412
2413 calibTrk2EvBr = calibTrk2Tr->GetBranch("CalibTrk2");
2414 calibTrk2Tr->SetBranchAddress("CalibTrk2", &calibTrk2);
2415
2416 calibTrk2HdBr = calibTrk2Tr->GetBranch("Header");
2417 calibTrk2Tr->SetBranchAddress("Header", &calibTrk2EH);
2418
2419 //Populate TM_TRK_CALIB for CalibTrk2
2420 nevents = calibTrk2RegBr->GetEntries();
2421 //cout << "nEvents: " << dec << nevents << "\n";
2422 for (Int_t i = 0; i < nevents; i++){
2423 /*----- DO NOT INVERT!!-----*/
2424 calibTrk2RegBr->GetEntry(i);
2425 calibTrk2EvBr->GetEntry(trk2Registry->event);
2426 calibTrk2HdBr->GetEntry(trk2Registry->event);
2427 calibTrk2PH = calibTrk2EH->GetPscuHeader();
2428 oss.str("");
2429 oss << " INSERT INTO TM_TRK_CALIB (ID_REGISTRY, REG_EVENT, TIME, TRK_PART, PCK_COUNTER) "
2430 << " VALUES ( "
2431 << idRegistry << ", "
2432 << dec << i << ", "
2433 << dec << trk2Registry->absTime << ", "
2434 << dec << 2 << ", "
2435 << dec << calibTrk2PH->Counter << ")" ;
2436 //cout << oss.str().c_str() << "\n";
2437 conn->Query(oss.str().c_str());
2438 }
2439
2440 return OK;
2441 }
2442
2443
2444 /**
2445 * Retrieve the ID_RAW, if exists.
2446 * Throw exception if (conn == 0) or the SQL command went wrong.
2447 * @param conn An active connection to a suitable (for PAMELA) database.
2448 * @param rawPathName The path to the root file.
2449 * @param rawFileName The name of the root file.
2450 */
2451 const char* PamelaDBOperations::getID_RAW(TSQLServer *conn, const char *rawPathName, const char *rawFileName)
2452 throw (YSQLNotConnectedException, YSQLQueryException){
2453
2454 if (conn == 0) throw YSQLNotConnectedException("Connection missing");
2455 stringstream oss;
2456 TSQLResult *result = 0;
2457 TSQLRow *row = 0;
2458 oss.str("");
2459 oss << "SELECT ID FROM GL_RAW WHERE "
2460 << " PATH = '" << rawPathName << "' AND "
2461 << " NAME = '" << rawFileName << "' ";
2462 result = conn->Query(oss.str().c_str());
2463 if (result == NULL) throw YSQLQueryException(oss.str().c_str());
2464 row = result->Next();
2465 if (row == NULL) return NULL;
2466 return row->GetField(0);
2467 }
2468
2469 const char* PamelaDBOperations::setGeo(cOrbit *orbit, RegistryEvent &reg)
2470 throw (YSQLNotConnectedException, YSQLQueryException){
2471 cEci eci;
2472 cCoordGeo coo;
2473 orbit->getPosition(reg.absTime, &eci);
2474 coo = eci.toGeo();
2475 reg.m_Lat = rad2deg(coo.m_Lat);
2476 reg.m_Lon = rad2deg(coo.m_Lon);
2477 reg.m_Alt = coo.m_Alt;
2478 //rate->Fill(rad2deg(coo.m_Lon), rad2deg(coo.m_Lat));
2479 }

  ViewVC Help
Powered by ViewVC 1.1.23