/[PAMELA software]/PadmeAmidala/src/RunGlue.cpp
ViewVC logotype

Contents of /PadmeAmidala/src/RunGlue.cpp

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.21 - (show annotations) (download)
Fri Oct 17 13:17:05 2014 UTC (10 years, 1 month ago) by mocchiut
Branch: MAIN
Changes since 1.20: +9 -6 lines
ProcessingInfo added to output file

1 /**
2 * \file RunGlue.cpp
3 * \author Emiliano Mocchiutti
4 *
5 * The file contains implementation of the methods to query the DB.
6 */
7 //
8 #include <sstream>
9 #include <iostream>
10 //
11 #include <TFile.h>
12 #include <TTree.h>
13 #include <TTimeStamp.h>
14 #include <TTreeCloner.h>
15 #include <RunGlue.h>
16 //
17 ClassImp(RunGlue);
18 //
19 using namespace std;
20
21 RunGlue::RunGlue() {
22 this->Clear();
23 }
24
25 RunGlue::RunGlue(TSQLServer *da, UInt_t ru, TString di, TString wrkdi) {
26 fDBG = false;
27 li = new PamLevel2();
28 // li = 0;
29 this->Clear();
30 dbc = da;
31 run = ru;
32 dir = di;
33 //
34 wd = gSystem->WorkingDirectory();
35 //
36 outdir = wrkdi;
37 if ( !strcmp(outdir.Data(),"") ) outdir = wd;
38 fList = 0;
39 if ( run ){
40 runmode = true;
41 } else {
42 runmode = false;
43 createlist = true;
44 };
45 fUpgrade = true;
46 //
47 // lList = new TList();
48 //
49 };
50
51 void RunGlue::Clear() {
52 fEnd = false;
53 run = 0;
54 dir = "";
55 outdir = "";
56 fFilename = "";
57 };
58
59 void RunGlue::Clean() {
60 if ( !merged ) gSystem->Unlink(fFilename);
61 lList->Delete();
62 delete Target;
63 };
64
65 void RunGlue::SetDebug(Bool_t dbg) {
66 fDBG = dbg;
67 };
68
69 void RunGlue::SetDList(TString list) {
70 //
71 RUN = true;
72 //
73 if (list.Contains("-RUN", TString::kIgnoreCase)) RUN = false;
74 if (list.Contains("-ALL", TString::kIgnoreCase)) RUN = false;
75 if (list.Contains("+RUN", TString::kIgnoreCase)) RUN = true;
76 if (list.Contains("+ALL", TString::kIgnoreCase)) RUN = true;
77 //
78 fDList = list;
79 // li->SetWhichTrees(fDList);
80 //
81 if ( DebugMode() ) printf(" Detector list is %s \n",fDList.Data());
82 //
83 };
84
85 TList *RunGlue::GetRunList(){
86 //
87 lList = new TList();
88 lList->Clear();
89 TString thisrun;
90 TFile *su;
91 //
92 TSQLResult *pResult;
93 TSQLRow *Row;
94 //
95 if ( run && runmode ){
96 //
97 // Qurey the GL_RUN table to obtain RUN infos
98 //
99 GL_RUN *glrun = new GL_RUN();
100 glrun->Query_GL_RUN(run,dbc);
101 //
102 // convert RUNHEADER_TIME into a UTC date
103 //
104 GL_TIMESYNC *dbtime = new GL_TIMESYNC();
105 //
106 TString UTC="UTC";
107 TString rhdate=dbtime->ConvertTime(UTC,glrun->RUNHEADER_TIME);
108 //
109 TDatime ti = TDatime(rhdate.Data());
110 //
111 YY=(UInt_t)ti.GetYear();
112 MM=(UInt_t)ti.GetMonth();
113 DD=(UInt_t)ti.GetDay();
114 //
115 TTimeStamp *llim = new TTimeStamp(YY,MM,DD,0,0,0,0,true,0);
116 //
117 UInt_t lowerlimit = llim->GetSec();
118 UInt_t upperlimit = lowerlimit + 86400;
119 //
120 if ( DebugMode() ) printf(" YY %u MM %u DD %u ll %u ul %u \n",YY,MM,DD,lowerlimit,upperlimit);
121 //
122 YY -= 2000;
123 stringstream tmpf;
124 tmpf.str("");
125 tmpf << "L2PAM";
126 if ( YY < 10 ){
127 tmpf<< "0" << YY;
128 } else {
129 tmpf<< YY;
130 };
131 if ( MM < 10 ){
132 tmpf<< "0" << MM;
133 } else {
134 tmpf<< MM;
135 };
136 if ( DD < 10 ){
137 tmpf << "0" << DD << ".root";
138 } else {
139 tmpf << DD << ".root";
140 };
141 TString fpath = "";
142 if ( !strcmp(outdir,"") ){
143 fpath="./";
144 } else {
145 fpath += outdir;
146 fpath += "/";
147 };
148 //
149 fFilename = fpath + tmpf.str().c_str();
150 //
151 printf(" Output filename is %s \n",fFilename.Data());
152 //
153 if ( !this->OpenFile() ){
154 fEnd = true;
155 return(0);
156 };
157 //
158 stringstream myquery;
159 myquery.str("");
160 myquery << "SELECT ID FROM GL_RUN WHERE RUNHEADER_TIME>=" << (UInt_t)lowerlimit
161 << " AND RUNHEADER_TIME<" << (UInt_t)upperlimit << " ORDER BY RUNHEADER_TIME ASC;";
162 //
163 pResult = dbc->Query(myquery.str().c_str());
164 for( UInt_t r=0; r < 1000; r++){
165 Row = pResult->Next();
166 if( Row == NULL ) break;
167 if ( DebugMode() ) printf(" %u RUN %s \n",r,Row->GetField(0));
168 //
169 thisrun=dir+(TString)Row->GetField(0)+".Level2.root";
170 //
171 if ( DebugMode() ) printf(" Filename is %s \n",thisrun.Data());
172 //
173 su = TFile::Open(thisrun);
174 if ( li->CheckLevel2File(thisrun) ){
175 lList->Add(su);
176 } else {
177 if ( DebugMode() ) printf(" RUN %s DISCARDED \n",Row->GetField(0));
178 };
179 //
180 };
181 //
182 //
183 delete glrun;
184 delete dbtime;
185 //
186 };
187 //
188 if ( strcmp(dir.Data(),"" )){
189 //
190 if ( createlist ){
191 fList = new TList();
192 fDoneList = new TList();
193 fNlist = 0;
194 fNlistdone = 0;
195 //
196 // read files in the directory
197 //
198 if ( DebugMode() ) printf("\n No input run given\n Check for existing root files. \n");
199 //
200 TSystemDirectory *datadir = new TSystemDirectory(gSystem->BaseName(dir),dir);
201 TList *temp = datadir->GetListOfFiles();
202 //
203 TIter next(temp);
204 TSystemFile *questo = 0;
205 //
206 while ( (questo = (TSystemFile*)next()) ) {
207 TString name = questo->GetName();
208 if( name.EndsWith(".Level2.root") ){
209 char *fullpath0;
210 gSystem->IsFileInIncludePath(name,&fullpath0);
211 TString fullpath = fullpath0;
212 //
213 if ( DebugMode() ) printf(" fullpath = %s name %s \n",fullpath.Data(),name.Data());
214 //
215 //
216 su = TFile::Open(fullpath);
217 if ( li->CheckLevel2File((TString)fullpath) ){
218 fList->Add(su);
219 fNlist++;
220 } else {
221 if ( DebugMode() ) printf(" RUN %s DISCARDED \n",fullpath.Data());
222 };
223 //
224 };
225 };
226 createlist = false;
227 nrun = 0;
228 };
229 //
230 //
231 //
232 Bool_t stop = true;
233 UInt_t drun = 0;
234 while ( nrun < fNlist && stop ){
235 TString myrun = (TString)((TString)(gSystem->BaseName(((TFile*)fList->At(nrun))->GetName()))).ReplaceAll(".Level2.root",12,"",0);
236 if ( DebugMode() ) printf(" nrun %u myrun is %s \n",nrun,(myrun.ReplaceAll(".Level2.root",12,"",0)).Data());
237 run = (UInt_t)(myrun.Atoi());
238 nrun++;
239 //
240 TString donerun = "";
241 for (UInt_t ll=0; ll<fNlistdone; ll++){
242 donerun = "";
243 donerun = (TString)((TString)(gSystem->BaseName(((TFile*)fDoneList->At(ll))->GetName()))).ReplaceAll(".Level2.root",12,"",0);
244 if ( DebugMode() ) printf(" donerun is %s \n",(donerun.ReplaceAll(".Level2.root",12,"",0)).Data());
245 drun = (UInt_t)(donerun.Atoi());
246 //
247 if ( run == drun ) goto jump;
248 //
249 };
250 //
251 stop = false;
252 //
253 jump:
254 drun = 0;
255 //
256 };
257 //
258 if ( nrun >= fNlist && stop ){
259 fEnd = true;
260 return(0);
261 };
262 //
263 // Qurey the GL_RUN table to obtain RUN infos
264 //
265 printf(" PROCESSING RUN %u AND ITS FRIENDS\n",run);
266 GL_RUN *glrun = new GL_RUN();
267 glrun->Query_GL_RUN(run,dbc);
268 //
269 // convert RUNHEADER_TIME into a UTC date
270 //
271 GL_TIMESYNC *dbtime = new GL_TIMESYNC();
272 //
273 TString UTC="UTC";
274 TString rhdate=dbtime->ConvertTime(UTC,glrun->RUNHEADER_TIME);
275 //
276 TDatime ti = TDatime(rhdate.Data());
277 //
278 YY=(UInt_t)ti.GetYear();
279 MM=(UInt_t)ti.GetMonth();
280 DD=(UInt_t)ti.GetDay();
281 //
282 TTimeStamp *llim = new TTimeStamp(YY,MM,DD,0,0,0,0,true,0);
283 //
284 UInt_t lowerlimit = llim->GetSec();
285 UInt_t upperlimit = lowerlimit + 86400;
286 //
287 if ( DebugMode() ) printf(" YY %u MM %u DD %u ll %u ul %u \n",YY,MM,DD,lowerlimit,upperlimit);
288 //
289 YY -= 2000;
290 stringstream tmpf;
291 tmpf.str("");
292 tmpf << "L2PAM";
293 if ( YY < 10 ){
294 tmpf<< "0" << YY;
295 } else {
296 tmpf<< YY;
297 };
298 if ( MM < 10 ){
299 tmpf<< "0" << MM;
300 } else {
301 tmpf<< MM;
302 };
303 if ( DD < 10 ){
304 tmpf << "0" << DD << ".root";
305 } else {
306 tmpf << DD << ".root";
307 };
308 TString fpath = "";
309 if ( !strcmp(outdir,"") ){
310 fpath="./";
311 } else {
312 fpath += outdir;
313 fpath += "/";
314 };
315 //
316 fFilename = fpath + tmpf.str().c_str();
317 //
318 printf(" Output filename is %s \n",fFilename.Data());
319 //
320 if ( !this->OpenFile() ) return(0);
321 //
322 stringstream myquery;
323 myquery.str("");
324 myquery << "SELECT ID FROM GL_RUN WHERE RUNHEADER_TIME>=" << (UInt_t)lowerlimit
325 << " AND RUNHEADER_TIME<" << (UInt_t)upperlimit << " ORDER BY RUNHEADER_TIME ASC;";
326 //
327 pResult = dbc->Query(myquery.str().c_str());
328 for( UInt_t r=0; r < 1000; r++){
329 Row = pResult->Next();
330 if( Row == NULL ) break;
331 if ( DebugMode() ) printf(" %u RUN %s \n",r,Row->GetField(0));
332 //
333 thisrun=dir+(TString)Row->GetField(0)+".Level2.root";
334 //
335 if ( DebugMode() ) printf(" Filename is %s \n",thisrun.Data());
336 //
337 su = TFile::Open(thisrun);
338 if ( su ){
339 TFile *su0 = TFile::Open(thisrun);
340 fDoneList->Add(su0);
341 fNlistdone++;
342 };
343 if ( li->CheckLevel2File(thisrun) ){
344 lList->Add(su);
345 if ( DebugMode() ) printf(" RUN %s ADDED \n",Row->GetField(0));
346 } else {
347 if ( DebugMode() ) printf(" RUN %s DISCARDED \n",Row->GetField(0));
348 };
349 //
350 };
351 //
352 if ( DebugMode() ){
353 UInt_t ll = 0;
354 while ( (TFile*)lList->At(ll) ){
355 TString donerun = "";
356 donerun = (TString)((TString)(gSystem->BaseName(((TFile*)lList->At(ll))->GetName()))).ReplaceAll(".Level2.root",12,"",0);
357 printf(" XXX file is %s \n",donerun.Data());
358 ll++;
359 //
360 };
361 };
362 //
363 delete glrun;
364 delete dbtime;
365 //
366 };
367 //
368 // is it the end?
369 //
370 if ( runmode ){
371 fEnd = true;
372 } else {
373 //
374 // did we use all the run in the directory? if so exit
375 //
376 if ( nrun >= fNlist ) fEnd = true;
377 };
378 //
379 return(lList);
380 };
381
382 Bool_t RunGlue::OpenFile(){
383 //
384 fOpen = false;
385 printf(" Check if output file already exists \n");
386 ifstream myfile;
387 myfile.open((this->GetFilename()).Data());
388 if ( myfile ){
389 // Target = TFile::Open((this->GetFilename()).Data(), "READ" );
390 //
391 // if ( Target ){
392 // Target->Close();
393 myfile.close();
394 printf("Error opening target file, %s already exist!\n",(this->GetFilename()).Data());
395 return(false);
396 } else {
397 //
398 // try to lock tables and work on a db level to avoid multiple file simultaneous access
399 //
400 stringstream oss;
401 //
402 if ( fUpgrade ){
403 oss.str("");
404 oss << "lock table GL_ROOT write;";
405 TSQLResult *result = 0;
406 TSQLRow *row = 0;
407 result = dbc->Query(oss.str().c_str());
408 oss.str("");
409 oss << "select ID from GL_ROOT where NAME='" << ((TString)gSystem->BaseName(this->GetFilename())).Data() << "';";
410 result = dbc->Query(oss.str().c_str());
411 row = result->Next();
412 if ( row ){
413 printf("Error opening target file (does %s exist? already in the DB? are the permissions ok?)\n",(this->GetFilename()).Data());
414 return(false);
415 } else {
416 oss.str("");
417 oss << "insert into GL_ROOT (PATH,NAME) values ('$PAM_L2','" << ((TString)gSystem->BaseName(this->GetFilename())).Data() << "');";
418 result = dbc->Query(oss.str().c_str());
419 };
420 oss.str("");
421 oss << "unlock tables;";
422 result = dbc->Query(oss.str().c_str());
423 };
424 // Target = TFile::Open((this->GetFilename()).Data(), "RECREATE" );
425 Target = TFile::Open((this->GetFilename()).Data(), "NEW" );
426 //
427 printf(" Output file does not exist, creating it\n");
428 //
429 Long64_t maxsize = 99900000000LL;
430 //
431 if ( !Target || Target->IsZombie()) {
432 printf("Error opening target file (does %s exist? are the permissions ok?)\n",(this->GetFilename()).Data());
433 // exit(1);
434 return(false);
435 }
436 //
437 Target->Write();
438 //
439 //fastMethod = kTRUE;
440 fastMethod = kFALSE;
441 //
442 //
443 TTree::SetMaxTreeSize(maxsize);
444 // Target->SetCompressionLevel(2);
445 Target->SetCompressionLevel(3);
446 //Target->SetCompressionLevel(5);
447 //
448 fOpen = true;
449 return(true);
450 //
451 };
452 //
453 return(true);
454 //
455 };
456
457
458 void RunGlue::DeleteRunFiles(TList *dlist){
459 //
460 TString donerun = "";
461 //
462 printf(" Deleting runs: \n");
463 //
464 UInt_t ll = 0;
465 //
466 while ( (TFile*)dlist->At(ll) ){
467 donerun = (TString)(((TFile*)dlist->At(ll))->GetName());
468 gSystem->Unlink(donerun);
469 printf(" Deleted file is %s \n",donerun.Data());
470 ll++;
471 //
472 };
473 };
474
475 void RunGlue::UpdateDB(TList *dlist){
476 //
477 TSQLResult *pResult;
478 TSQLRow *Row;
479 stringstream myquery;
480 //
481 TString donerun = "";
482 //
483 if ( DebugMode() ) printf(" Updating GL_RUN: \n");
484 //
485 UInt_t ll = 0;
486 UInt_t idl2 = 0;
487 UInt_t idr = 0;
488 //
489 //
490 myquery.str("");
491 myquery << "select ID from GL_RAW where NAME='level2 files';";
492 if ( DebugMode() ) printf(" query is %s \n",myquery.str().c_str());
493 //
494 pResult = dbc->Query(myquery.str().c_str());
495 if ( !pResult ){
496 printf(" ERROR QUERYING ON DB!\n");
497 return;
498 };
499 Row = pResult->Next();
500 if( Row == NULL ){
501 printf(" ERROR QUERYING THE DB!\n");
502 return;
503 } else {
504 idr = (UInt_t)atoll(Row->GetField(0));
505 };
506 //
507 myquery.str("");
508 myquery << "select ID from GL_ROOT where NAME='" << ((TString)gSystem->BaseName(this->GetFilename())).Data() << "';";
509 if ( DebugMode() ) printf(" query is %s \n",myquery.str().c_str());
510 //
511 pResult = dbc->Query(myquery.str().c_str());
512 if ( !pResult ){
513 printf(" ERROR WRITING ON DB!\n");
514 return;
515 };
516 Row = pResult->Next();
517 if( Row == NULL ){
518 printf(" ERROR QUERYING THE DB!\n");
519 return;
520 } else {
521 idl2 = (UInt_t)atoll(Row->GetField(0));
522 };
523 myquery.str("");
524 // myquery << "insert into GL_ROOT (ID_RAW,PATH,NAME) values (" << idr << ",'" << outdir.Data() << "','" << ((TString)gSystem->BaseName(this->GetFilename())).Data() << "');";
525 // myquery << "insert into GL_ROOT (ID_RAW,PATH,NAME) values (" << idr << ",'$PAM_L2','" << ((TString)gSystem->BaseName(this->GetFilename())).Data() << "');";
526 myquery << "update GL_ROOT set ID_RAW=" << idr << " where ID=" << idl2 << ";";
527 if ( DebugMode() ) printf(" query is %s \n",myquery.str().c_str());
528 //
529 pResult = dbc->Query(myquery.str().c_str());
530 if ( !pResult ){
531 printf(" ERROR WRITING ON DB!\n");
532 return;
533 };
534 //
535 //
536 //
537 UInt_t drun = 0;
538 //
539 while ( (TFile*)dlist->At(ll) ){
540 donerun = "";
541 donerun = (TString)((TString)(gSystem->BaseName(((TFile*)dlist->At(ll))->GetName()))).ReplaceAll(".Level2.root",12,"",0);
542 drun = (UInt_t)(donerun.Atoi());
543 //
544 if ( DebugMode() ) printf(" Run is %s \n",donerun.Data());
545 //
546 myquery.str("");
547 myquery << "update GL_RUN set ID_ROOT_L2=" << idl2 << " where ID=" << drun << ";";
548 if ( DebugMode() ) printf(" query is %s \n",myquery.str().c_str());
549 //
550 pResult = dbc->Query(myquery.str().c_str());
551 if ( !pResult ){
552 printf(" ERROR WRITING ON DB!\n");
553 return;
554 };
555 //
556 ll++;
557 //
558 };
559 };
560
561 //
562 // method stolen to ROOT's "hadd" and modified
563 //
564 void RunGlue::MergeRootfile(TList *sourcelist) {
565 //
566 merged = true;
567 //
568 // if ( li ) li->Delete();
569 PamLevel2 *nli = new PamLevel2(wd,sourcelist,fDList);
570 nli->SetSELLI(2);
571 //
572 Target->cd();
573 //
574 nli->CreateCloneTrees(Target);
575 //
576 /* nli->GetCloneTree("Tracker")->SetAutoSave(900000000000000LL);
577 nli->GetCloneTree("Trigger")->SetAutoSave(900000000000000LL);
578 nli->GetCloneTree("Calorimeter")->SetAutoSave(900000000000000LL);
579 nli->GetCloneTree("S4")->SetAutoSave(900000000000000LL);
580 nli->GetCloneTree("Anticounter")->SetAutoSave(900000000000000LL);
581 nli->GetCloneTree("NeutronD")->SetAutoSave(900000000000000LL);
582 nli->GetCloneTree("OrbitalInfo")->SetAutoSave(900000000000000LL);
583 nli->GetCloneTree("Run")->SetAutoSave(900000000000000LL);
584 nli->GetCloneTree("ToF")->SetAutoSave(900000000000000LL);*/
585 //
586 ULong64_t nevents = nli->GetEntries();
587 printf(" NEVENTS %llu \n",nevents);
588 for(ULong64_t iev=0; iev<nevents; iev++){
589 nli->Clear();
590 if( nli->GetEntry(iev) ){
591 nli->FillCloneTrees();
592 };
593 };
594 Target->cd();
595 nli->WriteCloneTrees();
596 printf("Written file %s \n",Target->GetName());
597 // Target->Write();
598 // TTree *slist = (TTree*)Target->Get("SelectionList");
599 // slist->Delete("all");
600 if ( !nli->GetCloneTree("ProcessingInfo") ){
601 TChain *P = new TChain("ProcessingInfo");
602 // loop over files and create chains
603 TIter next(sourcelist);
604 TSystemFile *questo = 0;
605 bool found = false;
606 while ((questo = (TSystemFile*) next())) {
607 TString name = questo->GetName();
608 if ( P->Add(name) ) found = true;
609 }
610 if ( found ){
611 TTree *Pclone = P->CloneTree();
612 Target->cd();
613 Pclone->Write("ProcessingInfo",TObject::kOverwrite);
614 P->Delete();
615 P=0;
616 }
617 }
618 //
619 Target->Close();
620
621 // //
622 // TDirectory *target = Target;
623 // //
624 // if ( DebugMode() ) printf("\nTarget path is: %s \n",target->GetPath());
625 // //
626 // TString path( (char*)strstr( target->GetPath(), ":" ) );
627 // path.Remove(0,2);
628 // //
629 // TDirectory *first_source = (TDirectory*)sourcelist->First();
630 // THashList allNames;
631 // //
632 // while ( first_source ){
633 // //
634 // TDirectory *current_sourcedir = first_source->GetDirectory(path);
635 // //
636 // if ( !current_sourcedir ){
637 // first_source = (TDirectory*)sourcelist->After(first_source);
638 // continue;
639 // }
640 // //
641 // // loop over all keys in this directory
642 // //
643 // TChain *globChain = 0;
644 // TIter nextkey( current_sourcedir->GetListOfKeys() );
645 // TKey *key = 0;
646 // TKey *oldkey = 0;
647 // TH1::AddDirectory(kFALSE); // gain time, do not add the objects in the list in memory
648 // //
649 // while ( (key = (TKey*)nextkey()) ) {
650 // //
651 // // printf(" target ls \n");
652 // // Target->ls();
653 // //
654 // if ( current_sourcedir == target ) break;
655 // //
656 // if ( oldkey && !strcmp(oldkey->GetName(),key->GetName()) ) continue; //keep only the highest cycle number for each key
657 // //
658 // if ( allNames.FindObject(key->GetName()) ) continue;
659 // //
660 // if ( DebugMode() ) printf(" Key name is -%s- \n",key->GetName());
661 // //
662 // //
663 // //
664 // if ( !strcmp(key->GetName(),"Tracker") && !li->IsTRK2() && !li->IsTRK1() && !li->IsTRKh() ) continue;
665 // //
666 // if ( !strcmp(key->GetName(),"Calorimeter") && !li->IsCAL2() && !li->IsCAL1() ) continue;
667 // //
668 // if ( !strcmp(key->GetName(),"ToF") && !li->IsTOF() ) continue;
669 // //
670 // if ( !strcmp(key->GetName(),"Trigger") && !li->IsTRG() ) continue;
671 // //
672 // if ( !strcmp(key->GetName(),"Anticounter") && !li->IsAC() ) continue;
673 // //
674 // if ( !strcmp(key->GetName(),"S4") && !li->IsS4() ) continue;
675 // //
676 // if ( !strcmp(key->GetName(),"NeutronD") && !li->IsND() ) continue;
677 // //
678 // if ( !strcmp(key->GetName(),"OrbitalInfo") && !li->IsORB() ) continue;
679 // //
680 // if ( !strcmp(key->GetName(),"Run") && !li->IsRUN() ) continue;
681 // //
682 // if ( strcmp(key->GetName(),"Calorimeter") && strcmp(key->GetName(),"Tracker") && strcmp(key->GetName(),"ToF") && strcmp(key->GetName(),"Trigger") && strcmp(key->GetName(),"Anticounter") && strcmp(key->GetName(),"S4") && strcmp(key->GetName(),"NeutronD") && strcmp(key->GetName(),"OrbitalInfo") && strcmp(key->GetName(),"Run") && strcmp(key->GetName(),"ProcessID0") ){
683 // if ( DebugMode() ) printf(" ERROR UNKNOWN KEY %s !\n",key->GetName());
684 // continue;
685 // };
686 // //
687 // printf(" 1 \n");
688 // allNames.Add(new TObjString(key->GetName()));
689 // printf(" 2 \n");
690 // //
691 // // read object from first source file
692 // //
693 // current_sourcedir->cd();
694 // TObject *obj = key->ReadObj();
695 // printf(" 3 \n");
696 // //
697 // if ( obj->IsA()->InheritsFrom("TTree") ){
698 // //
699 // // loop over all source files create a chain of Trees "globChain"
700 // //
701 // TString obj_name;
702 // printf(" 4 \n");
703 // //
704 // if ( path.Length() ) {
705 // obj_name = path + "/" + obj->GetName();
706 // } else {
707 // obj_name = obj->GetName();
708 // };
709 // //
710 // globChain = new TChain(obj_name);
711 // //
712 // globChain->SetCacheSize(0);
713 // //
714 // printf(" 5 \n");
715 // globChain->Add(first_source->GetName());
716 // printf(" 6 \n");
717 // //
718 // TFile *nextsource = (TFile*)sourcelist->After( first_source );
719 // //
720 // while ( nextsource ) {
721 // //
722 // //do not add to the list a file that does not contain this Tree
723 // //
724 // printf(" 7 \n");
725 // TFile *curf = TFile::Open(nextsource->GetName());
726 // //
727 // if ( curf ) {
728 // //
729 // Bool_t mustAdd = kFALSE;
730 // //
731 // if (curf->FindKey(obj_name)) {
732 // //
733 // mustAdd = kTRUE;
734 // //
735 // } else {
736 // //
737 // //we could be more clever here. No need to import the object
738 // //we are missing a function in TDirectory
739 // //
740 // TObject *aobj = curf->Get(obj_name);
741 // //
742 // if ( aobj ){
743 // mustAdd = kTRUE;
744 // delete aobj;
745 // };
746 // };
747 // if (mustAdd) {
748 // printf(" 8 \n");
749 // globChain->Add(nextsource->GetName());
750 // printf(" 9 \n");
751 // };
752 // };
753 // delete curf;
754 // nextsource = (TFile*)sourcelist->After(nextsource);
755 // };
756 // //
757 // printf(" 10 \n");
758 // delete nextsource;
759 // printf(" 11 \n");
760 // //
761 // } else {
762 // //
763 // // object is of no type that we know or can handle
764 // //
765 // if ( DebugMode() ) cout << "Unknown object type, name: "
766 // << obj->GetName() << " title: " << obj->GetTitle() << endl;
767 // };
768 // //
769 // // now write the merged histogram (which is "in" obj) to the target file
770 // // note that this will just store obj in the current directory level,
771 // // which is not persistent until the complete directory itself is stored
772 // // by "target->Write()" below
773 // //
774 // printf(" 12 \n");
775 // if ( obj ){
776 // //
777 // target->cd();
778 // //
779 // if( obj->IsA()->InheritsFrom("TTree") ) {
780 // //
781 // Long64_t nfiles = 0;
782 // if ( fastMethod ){
783 // // globChain->Merge(target->GetFile(),0,"C keep fast");
784 // nfiles=this->Mergy((TChain*)globChain,target->GetFile(),0,"C keep fast");
785 // } else {
786 // //globChain->Merge(target->GetFile(),0,"C keep");
787 // printf(" 13 %llu \n",globChain->GetEntries());
788 // nfiles=this->Mergy((TChain*)globChain,target->GetFile(),0,"C keep");
789 // printf(" 14 \n");
790 // };
791 // //
792 // merged = true;
793 // //
794 // if ( DebugMode() ){
795 // printf(" Merged %i files\n",(int)nfiles);
796 // globChain->ls();
797 // };
798 // //
799 // delete globChain;
800 // // return;
801 // //
802 // } else {
803 // //
804 // // obj->Write( key->GetName() ); // <==================================================================================
805 // //
806 // };
807 // };
808 // delete obj;
809 // oldkey = key;
810 // };
811 // //
812 // first_source = (TDirectory*)sourcelist->After(first_source);
813 // //
814 // };
815 // // save modifications to target file
816 // //
817 // target->SaveSelf(kTRUE);
818 // //
819 };
820
821
822 // Long64_t RunGlue::Mergy(TChain *mychain, TFile* file, Int_t basketsize, Option_t* option){
823 // // We must have been passed a file, we will use it
824 // // later to reset the compression level of the branches.
825 // if (!file) {
826 // // FIXME: We need an error message here.
827 // printf(" 19 \n");
828 // return 0;
829 // }
830 // printf(" 20 \n");
831
832 // // Options
833 // Bool_t fastClone = kFALSE;
834 // TString opt = option;
835 // opt.ToLower();
836 // if (opt.Contains("fast")) {
837 // fastClone = kTRUE;
838 // printf(" 21 \n");
839 // }
840 // // The chain tree must have a list of branches
841 // // because we may try to change their basket
842 // // size later.
843 // TObjArray* lbranches = mychain->GetListOfBranches();
844 // if (!lbranches) {
845 // // FIXME: We need an error message here.
846 // printf(" 22 \n");
847 // return 0;
848 // }
849
850 // // file->cd();
851 // // The chain must have a current tree because
852 // // that is the one we will clone.
853 // // if (!fTree) {
854 // // -- LoadTree() has not yet been called, no current tree.
855 // // FIXME: We need an error message here.
856 // // return 0;
857 // // }
858
859 // // Copy the chain's current tree without
860 // // copying any entries, we will do that later.
861 // printf(" 23 \n");
862 // TTree* newTree = mychain->CloneTree(0);
863 // if (!newTree) {
864 // // FIXME: We need an error message here.
865 // printf(" 24 \n");
866 // return 0;
867 // }
868 // printf(" 25 \n");
869
870
871 // // Strip out the (potential) directory name.
872 // // FIXME: The merged chain may or may not have the
873 // // same name as the original chain. This is
874 // // bad because the chain name determines the
875 // // names of the trees in the chain by default.
876 // printf(" 26 \n");
877 // newTree->SetName(gSystem->BaseName(mychain->GetName()));
878 // printf(" 27 \n");
879
880 // // FIXME: Why do we do this?
881 // // newTree->SetAutoSave(-1);
882 // newTree->SetAutoSave(900000000000000LL);
883
884 // printf(" 28 \n");
885 // // Circularity is incompatible with merging, it may
886 // // force us to throw away entries, which is not what
887 // // we are supposed to do.
888 // newTree->SetCircular(0);
889
890 // // Reset the compression level of the branches.
891 // if (opt.Contains("c")) {
892 // TBranch* branch = 0;
893 // TIter nextb(newTree->GetListOfBranches());
894 // while ((branch = (TBranch*) nextb())) {
895 // printf(" 29 \n");
896 // branch->SetCompressionLevel(file->GetCompressionLevel());
897 // }
898 // }
899
900 // printf(" 30 \n");
901 // // Reset the basket size of the branches.
902 // if (basketsize > 1000) {
903 // TBranch* branch = 0;
904 // TIter nextb(newTree->GetListOfBranches());
905 // while ((branch = (TBranch*) nextb())) {
906 // printf(" 31 \n");
907 // branch->SetBasketSize(basketsize);
908 // }
909 // }
910
911 // printf(" 32 \n");
912 // Long64_t nentries = mychain->GetEntriesFast();
913 // //Long64_t nentries = mychain->GetEntries();
914
915 // // Copy the entries.
916 // if (fastClone) {
917 // // For each tree in the chain.
918 // for (Long64_t i = 0; i < nentries; i += mychain->GetTree()->GetEntries()) {
919 // if (mychain->LoadTree(i) < 0) {
920 // break;
921 // }
922 // TTreeCloner cloner(mychain->GetTree(), newTree, option);
923 // if (cloner.IsValid()) {
924 // newTree->SetEntries(newTree->GetEntries() + mychain->GetTree()->GetEntries());
925 // cloner.Exec();
926 // } else {
927 // if (mychain->GetFile()) {
928 // printf("Merge Skipped file %s\n", mychain->GetFile()->GetName());
929 // // } else {
930 // // Warning("Merge", "Skipped file number %d\n", fTreeNumber);
931 // }
932 // }
933 // }
934 // } else {
935 // printf(" 33 %llu \n",nentries);
936 // mychain->Print();
937 // for (Long64_t i = 0; i < nentries; i++) {
938 // printf(" i %llu \n",i);
939 // // for (Long64_t i = 0; i < 1; i++) {
940 // if (mychain->GetEntry(i) <= 0) {
941 // break;
942 // }
943 // newTree->Fill();
944 // }
945 // printf(" 34 \n");
946 // }
947
948 // // Write the new tree header.
949 // printf(" 35 \n");
950 // newTree->Write();
951
952 // printf(" 36 \n");
953 // // Get our return value.
954 // Int_t nfiles = newTree->GetFileNumber() + 1;
955
956 // // Close and delete the current file of the new tree.
957 // if (!opt.Contains("keep")) {
958 // // FIXME: What happens to fDirectory in newTree here?
959 // delete newTree->GetCurrentFile();
960 // }
961 // return nfiles;
962 // }

  ViewVC Help
Powered by ViewVC 1.1.23