| 374 |
PamTrack::PamTrack(const PamTrack& track) { |
PamTrack::PamTrack(const PamTrack& track) { |
| 375 |
|
|
| 376 |
TrkTrack *t = track.trk_track; |
TrkTrack *t = track.trk_track; |
| 377 |
|
ExtTrack *e = track.trk_ext_track; |
| 378 |
CaloTrkVar *c = track.calo_track; |
CaloTrkVar *c = track.calo_track; |
| 379 |
ToFTrkVar *o = track.tof_track; |
ToFTrkVar *o = track.tof_track; |
| 380 |
OrbitalInfoTrkVar *r = track.orb_track; |
OrbitalInfoTrkVar *r = track.orb_track; |
| 381 |
|
|
| 382 |
trk_track = 0; |
trk_ext_track = 0; |
| 383 |
calo_track = 0; |
trk_track = 0; |
| 384 |
tof_track = 0; |
calo_track = 0; |
| 385 |
orb_track = 0; |
tof_track = 0; |
| 386 |
|
orb_track = 0; |
| 387 |
|
if(e) |
| 388 |
|
trk_ext_track = new ExtTrack(*e); |
| 389 |
if (t) |
if (t) |
| 390 |
trk_track = new TrkTrack(*t); |
trk_track = new TrkTrack(*t); |
| 391 |
if (c) |
if (c) |
| 394 |
tof_track = new ToFTrkVar(*o); |
tof_track = new ToFTrkVar(*o); |
| 395 |
if (r) |
if (r) |
| 396 |
orb_track = new OrbitalInfoTrkVar(*r); |
orb_track = new OrbitalInfoTrkVar(*r); |
| 397 |
|
|
| 398 |
candeleteobj = 1; |
candeleteobj = 1; |
| 399 |
pscore = 0; |
pscore = 0; |
| 400 |
iscore = 0; |
iscore = 0; |
| 401 |
|
|
| 402 |
} |
} |
| 403 |
void PamTrack::Clear() { |
void PamTrack::Clear(Option_t *option) { |
| 404 |
|
|
| 405 |
// cout << "PamTrack::Clear() "<<candeleteobj<<endl; |
// cout << "PamTrack::Clear( "<<option<<" ) "<<candeleteobj<<endl; |
| 406 |
if (candeleteobj) { |
if (candeleteobj) { |
| 407 |
|
|
| 408 |
if (trk_ext_track) |
if (trk_ext_track) |
| 409 |
trk_ext_track->ExtTrack::Clear(); |
trk_ext_track->ExtTrack::Clear(option); |
| 410 |
if (trk_track) |
if (trk_track) |
| 411 |
trk_track->TrkTrack::Clear(); |
trk_track->TrkTrack::Clear(); |
| 412 |
if (calo_track) |
if (calo_track) |
| 431 |
// cout << "PamTrack::Delete() "<<candeleteobj<<endl; |
// cout << "PamTrack::Delete() "<<candeleteobj<<endl; |
| 432 |
if (candeleteobj) { |
if (candeleteobj) { |
| 433 |
if (trk_ext_track) { |
if (trk_ext_track) { |
| 434 |
trk_ext_track->ExtTrack::Clear(); |
trk_ext_track->ExtTrack::Clear("C"); |
| 435 |
delete trk_ext_track; |
delete trk_ext_track; |
| 436 |
} |
} |
| 437 |
if (trk_track) { |
if (trk_track) { |
| 566 |
|
|
| 567 |
run_obj = 0;//new GL_RUN(); |
run_obj = 0;//new GL_RUN(); |
| 568 |
soft_obj = 0;// Emiliano |
soft_obj = 0;// Emiliano |
| 569 |
|
proc_obj = 0;// Emiliano |
| 570 |
irun = -1LL; |
irun = -1LL; |
| 571 |
irunt = -1LL; |
irunt = -1LL; |
| 572 |
totrunentry = 0LL; |
totrunentry = 0LL; |
| 577 |
gltsync = 0; // Emiliano |
gltsync = 0; // Emiliano |
| 578 |
fUpdateRunInfo = true; // Emiliano |
fUpdateRunInfo = true; // Emiliano |
| 579 |
fUseDBinRunInfo = true; // Emiliano |
fUseDBinRunInfo = true; // Emiliano |
| 580 |
|
fDiscarded = false; //EM |
| 581 |
isSync = false; // by default assume that the level2 file(s) is(are) not sinchronized between L0/DB and L2, that is we miss some packets in L2 due to nested/DV-skipped events |
isSync = false; // by default assume that the level2 file(s) is(are) not sinchronized between L0/DB and L2, that is we miss some packets in L2 due to nested/DV-skipped events |
| 582 |
il0entry = 0LL; |
il0entry = 0LL; |
| 583 |
// hasL0EE = true; |
// hasL0EE = true; |
| 593 |
|
|
| 594 |
run_tree = NULL; |
run_tree = NULL; |
| 595 |
run_tree_clone = NULL; |
run_tree_clone = NULL; |
| 596 |
|
|
| 597 |
|
proc_tree = NULL; |
| 598 |
|
proc_tree_clone = NULL; |
| 599 |
|
|
| 600 |
sel_tree = NULL; |
sel_tree = NULL; |
| 601 |
sel_tree_clone = NULL; |
sel_tree_clone = NULL; |
| 602 |
|
|
| 628 |
if (strcmp(pamdbpsw, "")) |
if (strcmp(pamdbpsw, "")) |
| 629 |
psw = pamdbpsw; |
psw = pamdbpsw; |
| 630 |
|
|
| 631 |
|
customString = ""; |
| 632 |
|
|
| 633 |
// sorted_tracks = 0;//new TRefArray(); |
// sorted_tracks = 0;//new TRefArray(); |
| 634 |
|
|
| 635 |
CAL0 = false; |
CAL0 = false; |
| 646 |
ND = true; |
ND = true; |
| 647 |
AC = true; |
AC = true; |
| 648 |
ORB = true; |
ORB = true; |
| 649 |
|
PROC = true; |
| 650 |
GP = false; |
GP = false; |
| 651 |
|
|
| 652 |
EXT = false; |
EXT = false; |
| 653 |
NUC = false; |
NUC = false; |
| 654 |
trkAlg = "";//default tracking algorythm |
trkAlg = "STD";//default tracking algorythm |
| 655 |
|
|
| 656 |
RUN = true; |
RUN = true; |
| 657 |
|
|
| 689 |
delete run_obj; |
delete run_obj; |
| 690 |
if (soft_obj) |
if (soft_obj) |
| 691 |
delete soft_obj; //Emiliano |
delete soft_obj; //Emiliano |
| 692 |
|
if (proc_obj) |
| 693 |
|
delete proc_obj; //Emiliano |
| 694 |
|
|
| 695 |
// cout << "void PamLevel2::Clear()"<<endl; |
// cout << "void PamLevel2::Clear()"<<endl; |
| 696 |
if (h0_obj) |
if (h0_obj) |
| 891 |
orb2_obj->Clear(); |
orb2_obj->Clear(); |
| 892 |
if (gp_obj) |
if (gp_obj) |
| 893 |
gp_obj->Clear(); |
gp_obj->Clear(); |
| 894 |
|
if (proc_obj) |
| 895 |
|
proc_obj->Clear(); |
| 896 |
|
|
| 897 |
// if(sorted_tracks)sorted_tracks->Clear(); |
// if(sorted_tracks)sorted_tracks->Clear(); |
| 898 |
// sorted_tracks.Clear(); |
// sorted_tracks.Clear(); |
| 973 |
if (sel_tree) |
if (sel_tree) |
| 974 |
sel_tree->Delete();; |
sel_tree->Delete();; |
| 975 |
sel_tree = NULL; |
sel_tree = NULL; |
| 976 |
|
|
| 977 |
|
if (proc_tree) |
| 978 |
|
proc_tree->Delete(); |
| 979 |
|
proc_tree = NULL; |
| 980 |
// |
// |
| 981 |
// Close file |
// Close file |
| 982 |
// |
// |
| 1000 |
ac_obj = 0; |
ac_obj = 0; |
| 1001 |
orb2_obj = 0; |
orb2_obj = 0; |
| 1002 |
gp_obj = 0; |
gp_obj = 0; |
| 1003 |
|
proc_obj = 0; |
| 1004 |
|
|
| 1005 |
trk_ext_obj = 0; |
trk_ext_obj = 0; |
| 1006 |
trk_ext_nuc_obj = 0; |
trk_ext_nuc_obj = 0; |
| 1032 |
// |
// |
| 1033 |
run_obj = 0;//new GL_RUN(); |
run_obj = 0;//new GL_RUN(); |
| 1034 |
soft_obj = 0;// Emiliano |
soft_obj = 0;// Emiliano |
| 1035 |
|
proc_obj = 0;// Emiliano |
| 1036 |
irun = -1; |
irun = -1; |
| 1037 |
irunt = -1; |
irunt = -1; |
| 1038 |
totrunentry = 0LL; |
totrunentry = 0LL; |
| 1207 |
if (!objname.CompareTo("SoftInfo")) |
if (!objname.CompareTo("SoftInfo")) |
| 1208 |
return &soft_obj; // Emiliano |
return &soft_obj; // Emiliano |
| 1209 |
|
|
| 1210 |
|
if (!objname.CompareTo("ProcInfo")){ |
| 1211 |
|
if (!proc_obj) |
| 1212 |
|
proc_obj = new ProcInfo(); |
| 1213 |
|
return &proc_obj; // Emiliano |
| 1214 |
|
} |
| 1215 |
|
|
| 1216 |
return NULL; |
return NULL; |
| 1217 |
} |
} |
| 1218 |
; |
; |
| 1478 |
// create TCloneArrays to store tracks and its images |
// create TCloneArrays to store tracks and its images |
| 1479 |
if (!tsorted) |
if (!tsorted) |
| 1480 |
tsorted = new TClonesArray("PamTrack", trk2_obj->GetNTracks()); |
tsorted = new TClonesArray("PamTrack", trk2_obj->GetNTracks()); |
| 1481 |
tsorted->Delete(); |
tsorted->Clear("C+C");//Delete(); |
| 1482 |
TClonesArray &ttsorted = *tsorted; |
TClonesArray &ttsorted = *tsorted; |
| 1483 |
|
|
| 1484 |
if (!timage) |
if (!timage) |
| 1485 |
timage = new TClonesArray("PamTrack", trk2_obj->GetNTracks()); |
timage = new TClonesArray("PamTrack", trk2_obj->GetNTracks()); |
| 1486 |
timage->Delete(); |
timage->Clear("C+C");//Delete(); |
| 1487 |
TClonesArray &ttimage = *timage; |
TClonesArray &ttimage = *timage; |
| 1488 |
|
|
| 1489 |
|
|
| 2019 |
//----------------------------------------------------------- |
//----------------------------------------------------------- |
| 2020 |
// create/reset TCloneArrays to store tracks and their images |
// create/reset TCloneArrays to store tracks and their images |
| 2021 |
//----------------------------------------------------------- |
//----------------------------------------------------------- |
| 2022 |
|
|
| 2023 |
|
// cout << " PamLevel2::SortTracksNew() --- Clear TClonesArray objects"<<endl; |
| 2024 |
|
|
| 2025 |
// main tracks from standard alg |
// main tracks from standard alg |
| 2026 |
if (!tsorted) |
// if (!tsorted) |
| 2027 |
tsorted = new TClonesArray("PamTrack", trk2_obj->GetNTracks()); |
// tsorted = new TClonesArray("PamTrack", trk2_obj->GetNTracks()); |
| 2028 |
tsorted->Delete(); |
// tsorted->Clear("C+C");//Delete(); |
| 2029 |
// track images from standard alg |
// // track images from standard alg |
| 2030 |
if (!timage) |
// if (!timage) |
| 2031 |
timage = new TClonesArray("PamTrack", trk2_obj->GetNTracks()); |
// timage = new TClonesArray("PamTrack", trk2_obj->GetNTracks()); |
| 2032 |
timage->Delete(); |
// timage->Clear("C+C");//Delete(); |
| 2033 |
// tracks from extended algorythm |
// // tracks from extended algorythm |
| 2034 |
if(EXT && !text) |
// if(EXT && !text) |
| 2035 |
text = new TClonesArray("PamTrack",trk_ext_obj->GetEntries()); |
// text = new TClonesArray("PamTrack",trk_ext_obj->GetEntries()); |
| 2036 |
if(text)text->Delete(); |
// if(text)text->Clear("C+C");//Delete(); |
| 2037 |
|
|
| 2038 |
|
if(tsorted)delete tsorted; |
| 2039 |
|
if(timage) delete timage; |
| 2040 |
|
if(text) delete text; |
| 2041 |
|
tsorted = new TClonesArray("PamTrack", trk2_obj->GetNTracks()); |
| 2042 |
|
timage = new TClonesArray("PamTrack", trk2_obj->GetNTracks()); |
| 2043 |
|
text = new TClonesArray("PamTrack",trk_ext_obj->GetEntries()); |
| 2044 |
|
|
| 2045 |
//----------------------------------------------------------- |
//----------------------------------------------------------- |
| 2046 |
// create/reset TCloneArrays to store tracks and their images |
// create/reset TCloneArrays to store tracks and their images |
| 2047 |
//----------------------------------------------------------- |
//----------------------------------------------------------- |
| 2048 |
if(NUC){ |
if(NUC){ |
| 2049 |
|
|
| 2050 |
|
|
| 2051 |
|
if(tsorted_nuc)delete tsorted_nuc; |
| 2052 |
|
if(timage_nuc) delete timage_nuc; |
| 2053 |
|
if(text_nuc) delete text_nuc; |
| 2054 |
|
tsorted_nuc = new TClonesArray("PamTrack", trk2_nuc_obj->GetNTracks()); |
| 2055 |
|
timage_nuc = new TClonesArray("PamTrack", trk2_nuc_obj->GetNTracks()); |
| 2056 |
|
text_nuc = new TClonesArray("PamTrack",trk_ext_nuc_obj->GetEntries()); |
| 2057 |
|
|
| 2058 |
// main tracks from standard alg |
// main tracks from standard alg |
| 2059 |
if (!tsorted_nuc) |
// if (!tsorted_nuc) |
| 2060 |
tsorted_nuc = new TClonesArray("PamTrack", trk2_nuc_obj->GetNTracks()); |
// tsorted_nuc = new TClonesArray("PamTrack", trk2_nuc_obj->GetNTracks()); |
| 2061 |
tsorted_nuc->Delete(); |
// tsorted_nuc->Clear("C+C");//Delete(); |
| 2062 |
// track images from standard alg |
// // track images from standard alg |
| 2063 |
if (!timage_nuc) |
// if (!timage_nuc) |
| 2064 |
timage_nuc = new TClonesArray("PamTrack", trk2_nuc_obj->GetNTracks()); |
// timage_nuc = new TClonesArray("PamTrack", trk2_nuc_obj->GetNTracks()); |
| 2065 |
timage_nuc->Delete(); |
// timage_nuc->Clear("C+C");//Delete(); |
| 2066 |
// tracks from extended algorythm |
// // tracks from extended algorythm |
| 2067 |
if(EXT && !text_nuc) |
// if(EXT && !text_nuc) |
| 2068 |
text_nuc = new TClonesArray("PamTrack",trk_ext_nuc_obj->GetEntries()); |
// text_nuc = new TClonesArray("PamTrack",trk_ext_nuc_obj->GetEntries()); |
| 2069 |
if(text_nuc)text_nuc->Delete(); |
// if(text_nuc)text_nuc->Clear("C+C");//Delete(); |
| 2070 |
|
|
| 2071 |
} |
} |
| 2072 |
//-------------------------------------------------- |
//-------------------------------------------------- |
| 2073 |
// retrieve sorting method |
// retrieve sorting method |
| 2629 |
/** |
/** |
| 2630 |
* This method overrides TrkLevel2::GetTracks(), where sorting is done by decreasing number of fit points and increasing chi^2. |
* This method overrides TrkLevel2::GetTracks(), where sorting is done by decreasing number of fit points and increasing chi^2. |
| 2631 |
* PamLevel2::GetTracks() keeps the same track order given by TrkLevel2::GetTracks(), but checks image selection by using calorimeter and ToF tracking information. |
* PamLevel2::GetTracks() keeps the same track order given by TrkLevel2::GetTracks(), but checks image selection by using calorimeter and ToF tracking information. |
| 2632 |
/* |
*/ |
| 2633 |
|
|
| 2634 |
// TRefArray *PamLevel2::GetTracks(){ |
// TRefArray *PamLevel2::GetTracks(){ |
| 2635 |
|
|
| 2647 |
// |
// |
| 2648 |
// |
// |
| 2649 |
//-------------------------------------- |
//-------------------------------------- |
| 2650 |
|
|
| 2651 |
/** |
/** |
| 2652 |
* Retrieves the it-th Pamela "physical" track. |
* Retrieves the it-th Pamela "physical" track. |
| 2653 |
* It override TrkLevel2::GetTrack(int it). |
* It override TrkLevel2::GetTrack(int it). |
| 2654 |
* @param it Track number, ranging from 0 to GetNTracks(). |
* @param it Track number, ranging from 0 to GetNTracks(). |
| 2655 |
*/ |
*/ |
| 2656 |
PamTrack *PamLevel2::GetTrack(int it) { |
PamTrack *PamLevel2::GetTrackOld(int it) { |
| 2657 |
|
|
| 2658 |
PamTrack *track = NULL; |
PamTrack *track = NULL; |
| 2659 |
|
|
| 2670 |
track = (PamTrack*)((*tsorted)[it]); |
track = (PamTrack*)((*tsorted)[it]); |
| 2671 |
} |
} |
| 2672 |
else { |
else { |
| 2673 |
cout << "PamLevel2::GetTrack(int) : tracker track SeqNo " << it << " does not exist (GetNTracks() = " |
cout << "PamLevel2::GetTrackOld(int) : tracker track SeqNo " << it << " does not exist (GetNTracks() = " |
| 2674 |
<< trk2_obj->TrkLevel2::GetNTracks() << ")" << endl; |
<< trk2_obj->TrkLevel2::GetNTracks() << ")" << endl; |
| 2675 |
}; |
}; |
| 2676 |
|
|
| 2686 |
* @param it Track number, ranging from 0 to GetNTracks(). |
* @param it Track number, ranging from 0 to GetNTracks(). |
| 2687 |
* @param alg Algorythm, see SetTrakingAlgorythm(char *alg) for explanation. |
* @param alg Algorythm, see SetTrakingAlgorythm(char *alg) for explanation. |
| 2688 |
*/ |
*/ |
| 2689 |
PamTrack *PamLevel2::GetTrack(int it, char* alg) { |
PamTrack *PamLevel2::GetTrack(int it, const char* alg) { |
| 2690 |
|
|
| 2691 |
TString s(alg); |
TString s(alg); |
| 2692 |
if(!s.CompareTo("") ||!s.CompareTo("STD") )return GetTrack(it); //old algorythm |
if(!s.CompareTo("") ||!s.CompareTo("STD") )return GetTrackOld(it); //old algorythm |
| 2693 |
|
|
| 2694 |
|
|
| 2695 |
SortTracksNew(); |
SortTracksNew(); |
| 2737 |
}; |
}; |
| 2738 |
|
|
| 2739 |
|
|
| 2740 |
|
cout << "PamTrack *PamLevel2::GetTrack("<<it<<","<<alg<<") -- wrong track number or unrecognised algorithm"<<endl; |
| 2741 |
|
|
| 2742 |
return NULL; |
return NULL; |
| 2743 |
|
|
| 2753 |
|
|
| 2754 |
} |
} |
| 2755 |
; |
; |
| 2756 |
Int_t PamLevel2::GetNTracks(char* alg) { |
Int_t PamLevel2::GetNTracks(const char* alg) { |
| 2757 |
|
|
| 2758 |
|
|
| 2759 |
// cout << " trk_nuc_obj->GetEntries() "<<trk_nuc_obj->GetEntries()<<" trk2_nuc_obj->GetNTracks() "<<trk2_nuc_obj->GetNTracks()<<endl; |
// cout << " trk_nuc_obj->GetEntries() "<<trk_nuc_obj->GetEntries()<<" trk2_nuc_obj->GetNTracks() "<<trk2_nuc_obj->GetNTracks()<<endl; |
| 2774 |
if(s.Contains("NUC", TString::kIgnoreCase) && NUC ) |
if(s.Contains("NUC", TString::kIgnoreCase) && NUC ) |
| 2775 |
return trk2_nuc_obj->TrkLevel2::GetNTracks(); |
return trk2_nuc_obj->TrkLevel2::GetNTracks(); |
| 2776 |
|
|
| 2777 |
|
cout << "Int_t PamLevel2::GetNTracks("<<alg<<") -- unrecognised algorithm"<<endl; |
| 2778 |
|
|
| 2779 |
return 0; |
return 0; |
| 2780 |
|
|
| 2781 |
} |
} |
| 2789 |
* Retrieves (if present) the image of the it-th Pamela "physical" track, sorted by the method PamLevel2::SortTracks(). |
* Retrieves (if present) the image of the it-th Pamela "physical" track, sorted by the method PamLevel2::SortTracks(). |
| 2790 |
* @param it Track number, ranging from 0 to GetNTracks(). |
* @param it Track number, ranging from 0 to GetNTracks(). |
| 2791 |
*/ |
*/ |
| 2792 |
PamTrack *PamLevel2::GetTrackImage(int it) { |
PamTrack *PamLevel2::GetTrackImageOld(int it) { |
| 2793 |
|
|
| 2794 |
// *-*-*-*-*-*-*-*-*-*-*-*-* |
// *-*-*-*-*-*-*-*-*-*-*-*-* |
| 2795 |
SortTracks(); |
SortTracks(); |
| 2813 |
}; |
}; |
| 2814 |
} |
} |
| 2815 |
else { |
else { |
| 2816 |
cout << "PamLevel2::GetTrackImage(int) : Tracker track SeqNo " << it << " does not exist (GetNTracks() = " |
cout << "PamLevel2::GetTrackImageOld(int) : Tracker track SeqNo " << it << " does not exist (GetNTracks() = " |
| 2817 |
<< trk2_obj->TrkLevel2::GetNTracks() << ")" << endl; |
<< trk2_obj->TrkLevel2::GetNTracks() << ")" << endl; |
| 2818 |
}; |
}; |
| 2819 |
|
|
| 2824 |
* @param it Track number, ranging from 0 to GetNTracks(). |
* @param it Track number, ranging from 0 to GetNTracks(). |
| 2825 |
* @param alg Algorythm, see SetTrakingAlgorythm(char *alg) for explanation. |
* @param alg Algorythm, see SetTrakingAlgorythm(char *alg) for explanation. |
| 2826 |
*/ |
*/ |
| 2827 |
PamTrack *PamLevel2::GetTrackImage(int it, char* alg) { |
PamTrack *PamLevel2::GetTrackImage(int it, const char* alg) { |
| 2828 |
|
|
| 2829 |
TString s(alg); |
TString s(alg); |
| 2830 |
if(!s.CompareTo("") || !s.CompareTo("STD"))return GetTrack(it); //old algorythm |
if(!s.CompareTo("") || !s.CompareTo("STD"))return GetTrackImageOld(it); //old algorythm |
| 2831 |
|
|
| 2832 |
|
|
| 2833 |
SortTracksNew(); |
SortTracksNew(); |
| 2845 |
PamTrack *temp = (PamTrack*) t[it]; |
PamTrack *temp = (PamTrack*) t[it]; |
| 2846 |
if (temp->GetTrkTrack()->HasImage()) { |
if (temp->GetTrkTrack()->HasImage()) { |
| 2847 |
return (PamTrack*)((*timage_nuc)[it]); //ok return the track |
return (PamTrack*)((*timage_nuc)[it]); //ok return the track |
| 2848 |
|
}else{ |
| 2849 |
|
return NULL; |
| 2850 |
} |
} |
| 2851 |
|
|
| 2852 |
} |
} |
| 2860 |
PamTrack *temp = (PamTrack*) t[it]; |
PamTrack *temp = (PamTrack*) t[it]; |
| 2861 |
if (temp->GetTrkTrack()->HasImage()) { |
if (temp->GetTrkTrack()->HasImage()) { |
| 2862 |
return (PamTrack*)((*timage)[it]); //ok return the track |
return (PamTrack*)((*timage)[it]); //ok return the track |
| 2863 |
|
}else{ |
| 2864 |
|
return NULL; |
| 2865 |
} |
} |
| 2866 |
} |
} |
| 2867 |
} |
} |
| 2868 |
|
|
| 2869 |
} |
} |
| 2870 |
|
|
| 2871 |
|
cout << "PamTrack *PamLevel2::GetTrackImage("<<it<<","<<alg<<") -- wrong track number or unrecognised algorithm"<<endl; |
| 2872 |
|
|
| 2873 |
return NULL; |
return NULL; |
| 2874 |
|
|
| 3328 |
TChain *G = 0; |
TChain *G = 0; |
| 3329 |
|
|
| 3330 |
TChain *L = 0; |
TChain *L = 0; |
| 3331 |
|
TChain *P = 0; |
| 3332 |
|
|
| 3333 |
if (TRK2 || TRK1 || TRKh) |
if (TRK2 || TRK1 || TRKh) |
| 3334 |
T = new TChain("Tracker"); |
T = new TChain("Tracker"); |
| 3348 |
B = new TChain("OrbitalInfo"); |
B = new TChain("OrbitalInfo"); |
| 3349 |
if (GP) |
if (GP) |
| 3350 |
G = new TChain("h20"); |
G = new TChain("h20"); |
| 3351 |
|
if (PROC) |
| 3352 |
|
P = new TChain("ProcessingInfo"); |
| 3353 |
L = new TChain("SelectionList"); |
L = new TChain("SelectionList"); |
| 3354 |
|
|
| 3355 |
// loop over files and create chains |
// loop over files and create chains |
| 3377 |
B->Add(name); |
B->Add(name); |
| 3378 |
if (GP) |
if (GP) |
| 3379 |
G->Add(name); |
G->Add(name); |
| 3380 |
|
if (P) |
| 3381 |
|
P->Add(name); |
| 3382 |
if (SELLI == 1) |
if (SELLI == 1) |
| 3383 |
L->Add(name); |
L->Add(name); |
| 3384 |
}; |
}; |
| 3504 |
L->Delete(); |
L->Delete(); |
| 3505 |
}; |
}; |
| 3506 |
|
|
| 3507 |
|
//ProcessingInfo EM |
| 3508 |
|
if ( P && P->GetEntries() ){ |
| 3509 |
|
cout << "----------------------------------------------------" << endl; |
| 3510 |
|
cout << ">>> Found ProcessingInfo <<<" << endl; |
| 3511 |
|
// L->SetBranchAddress("RunEntry",&irun); |
| 3512 |
|
P->SetBranchAddress("ProcInfo", &proc_obj);//NEWNEW |
| 3513 |
|
proc_tree = P; |
| 3514 |
|
} |
| 3515 |
// -------------------------------------------- |
// -------------------------------------------- |
| 3516 |
// return the pamela chain with all the friends |
// return the pamela chain with all the friends |
| 3517 |
// -------------------------------------------- |
// -------------------------------------------- |
| 3518 |
|
|
| 3519 |
pam_tree = Trout; |
pam_tree = Trout; |
|
|
|
| 3520 |
return Trout; |
return Trout; |
| 3521 |
} |
} |
| 3522 |
|
|
| 3838 |
* "NUCEXT" --> as "EXT", but for nuclei |
* "NUCEXT" --> as "EXT", but for nuclei |
| 3839 |
* "NUCEXTF" --> as "EXTF", but for nuclei |
* "NUCEXTF" --> as "EXTF", but for nuclei |
| 3840 |
*/ |
*/ |
| 3841 |
void PamLevel2::SetTrakingAlgorythm(char *alg){ |
// void PamLevel2::SetTrackingAlgorythm(const char *alg){ |
| 3842 |
|
|
| 3843 |
|
|
| 3844 |
TString s(alg); |
// TString s(alg); |
| 3845 |
if(s.Contains("NUC", TString::kIgnoreCase) && !NUC) |
// if(s.Contains("NUC", TString::kIgnoreCase) && !NUC) |
| 3846 |
cout << "Warning! NUC algorythm requested, but branches are missing"<<endl; |
// cout << "Warning! NUC algorythm requested, but branches are missing"<<endl; |
| 3847 |
if(s.Contains("EXT", TString::kIgnoreCase) && !EXT) |
// if(s.Contains("EXT", TString::kIgnoreCase) && !EXT) |
| 3848 |
cout << "Warning! EXT algorythm requested, but branches are missing"<<endl;; |
// cout << "Warning! EXT algorythm requested, but branches are missing"<<endl;; |
| 3849 |
|
|
| 3850 |
trkAlg = alg; |
// trkAlg = alg; |
| 3851 |
|
|
| 3852 |
}; |
// }; |
| 3853 |
char* PamLevel2::GetTrakingAlgorythm(){ |
// const char* PamLevel2::GetTrackingAlgorythm(){ |
| 3854 |
|
|
| 3855 |
|
|
| 3856 |
cout<<endl<<" Implemented tracking algorythm: "; |
// cout<<endl<<" Implemented tracking algorythm: "; |
| 3857 |
cout<<endl<<" \"\" or \"STD\" --> take the output of the standard tracking algorythm"; |
// cout<<endl<<" \"\" or \"STD\" --> take the output of the standard tracking algorythm"; |
| 3858 |
cout<<endl<<" \"NUC\" --> take the output of the standard tracking algorythm for nuclei cluster selection"; |
// cout<<endl<<" \"NUC\" --> take the output of the standard tracking algorythm for nuclei cluster selection"; |
| 3859 |
cout<<endl<<" \"EXT\" --> in case the standard tracking algorythm has not found any track,"; |
// cout<<endl<<" \"EXT\" --> in case the standard tracking algorythm has not found any track,"; |
| 3860 |
cout<<endl<<" take the output of the extended one"; |
// cout<<endl<<" take the output of the extended one"; |
| 3861 |
cout<<endl<<" \"EXTF\" --> force the extended tracking algorythm"; |
// cout<<endl<<" \"EXTF\" --> force the extended tracking algorythm"; |
| 3862 |
cout<<endl<<" \"NUCEXT\" --> as \"EXT\", but for nuclei "; |
// cout<<endl<<" \"NUCEXT\" --> as \"EXT\", but for nuclei "; |
| 3863 |
cout<<endl<<" \"NUCEXTF\" --> as \"EXTF\", but for nuclei"; |
// cout<<endl<<" \"NUCEXTF\" --> as \"EXTF\", but for nuclei"; |
| 3864 |
|
|
| 3865 |
cout<<endl; |
// cout<<endl; |
| 3866 |
cout<<" <<Currently set algorythm>> "<<trkAlg<<endl; |
// cout<<" <<Currently set algorythm>> "<<trkAlg<<endl; |
| 3867 |
cout<<endl; |
// cout<<endl; |
| 3868 |
|
|
| 3869 |
return trkAlg; |
// return trkAlg; |
| 3870 |
}; |
// }; |
| 3871 |
|
|
| 3872 |
|
|
| 3873 |
|
|
| 4608 |
// cout << "Checking file: "<<f->GetName()<<endl; |
// cout << "Checking file: "<<f->GetName()<<endl; |
| 4609 |
if (!f || f->IsZombie()) { |
if (!f || f->IsZombie()) { |
| 4610 |
cout << "File: " << f->GetName() << " Non valid root file" << endl; |
cout << "File: " << f->GetName() << " Non valid root file" << endl; |
| 4611 |
|
fDiscarded = true; |
| 4612 |
return; |
return; |
| 4613 |
} |
} |
| 4614 |
|
|
| 4815 |
TFile *f = new TFile(name.Data()); |
TFile *f = new TFile(name.Data()); |
| 4816 |
if (!f || f->IsZombie()) { |
if (!f || f->IsZombie()) { |
| 4817 |
cout << "File: " << f->GetName() << " discarded ---- Non valid root file" << endl; |
cout << "File: " << f->GetName() << " discarded ---- Non valid root file" << endl; |
| 4818 |
|
fDiscarded = true; |
| 4819 |
return false; |
return false; |
| 4820 |
} |
} |
| 4821 |
// cout << "Get list of keys: "<<f<<endl; |
// cout << "Get list of keys: "<<f<<endl; |
| 4854 |
if (nev && nevt != nev) { |
if (nev && nevt != nev) { |
| 4855 |
cout << "File: " << f->GetName() << " discarded ---- SelectionList tree has " << nevt |
cout << "File: " << f->GetName() << " discarded ---- SelectionList tree has " << nevt |
| 4856 |
<< " events instead of " << nev << endl; |
<< " events instead of " << nev << endl; |
| 4857 |
|
fDiscarded = true; |
| 4858 |
return false; |
return false; |
| 4859 |
} |
} |
| 4860 |
nev = nevt; |
nev = nevt; |
| 4869 |
if (nev && nevt != nev) { |
if (nev && nevt != nev) { |
| 4870 |
cout << "File: " << f->GetName() << " discarded ---- Trigger tree has " << nevt << " events instead of " |
cout << "File: " << f->GetName() << " discarded ---- Trigger tree has " << nevt << " events instead of " |
| 4871 |
<< nev << endl; |
<< nev << endl; |
| 4872 |
|
fDiscarded = true; |
| 4873 |
return false; |
return false; |
| 4874 |
} |
} |
| 4875 |
nev = nevt; |
nev = nevt; |
| 4883 |
if (nev && nevt != nev) { |
if (nev && nevt != nev) { |
| 4884 |
cout << "File: " << f->GetName() << " discarded ---- ToF tree has " << nevt << " events instead of " << nev |
cout << "File: " << f->GetName() << " discarded ---- ToF tree has " << nevt << " events instead of " << nev |
| 4885 |
<< endl; |
<< endl; |
| 4886 |
|
fDiscarded = true; |
| 4887 |
return false; |
return false; |
| 4888 |
} |
} |
| 4889 |
nev = nevt; |
nev = nevt; |
| 4897 |
if (nev && nevt != nev) { |
if (nev && nevt != nev) { |
| 4898 |
cout << "File: " << f->GetName() << " discarded ---- S4 tree has " << nevt << " events instead of " << nev |
cout << "File: " << f->GetName() << " discarded ---- S4 tree has " << nevt << " events instead of " << nev |
| 4899 |
<< endl; |
<< endl; |
| 4900 |
|
fDiscarded = true; |
| 4901 |
return false; |
return false; |
| 4902 |
} |
} |
| 4903 |
nev = nevt; |
nev = nevt; |
| 4912 |
if (nev && nevt != nev) { |
if (nev && nevt != nev) { |
| 4913 |
cout << "File: " << f->GetName() << " discarded ---- NeutronD tree has " << nevt << " events instead of " |
cout << "File: " << f->GetName() << " discarded ---- NeutronD tree has " << nevt << " events instead of " |
| 4914 |
<< nev << endl; |
<< nev << endl; |
| 4915 |
|
fDiscarded = true; |
| 4916 |
return false; |
return false; |
| 4917 |
} |
} |
| 4918 |
nev = nevt; |
nev = nevt; |
| 4926 |
if (nev && nevt != nev) { |
if (nev && nevt != nev) { |
| 4927 |
cout << "File: " << f->GetName() << " discarded ---- Anticounter tree has " << nevt << " events instead of " |
cout << "File: " << f->GetName() << " discarded ---- Anticounter tree has " << nevt << " events instead of " |
| 4928 |
<< nev << endl; |
<< nev << endl; |
| 4929 |
|
fDiscarded = true; |
| 4930 |
return false; |
return false; |
| 4931 |
} |
} |
| 4932 |
nev = nevt; |
nev = nevt; |
| 4940 |
if (nev && nevt != nev) { |
if (nev && nevt != nev) { |
| 4941 |
cout << "File: " << f->GetName() << " discarded ---- OrbitalInfo tree has " << nevt << " events instead of " |
cout << "File: " << f->GetName() << " discarded ---- OrbitalInfo tree has " << nevt << " events instead of " |
| 4942 |
<< nev << endl; |
<< nev << endl; |
| 4943 |
|
fDiscarded = true; |
| 4944 |
return false; |
return false; |
| 4945 |
} |
} |
| 4946 |
nev = nevt; |
nev = nevt; |
| 4954 |
if (nev && nevt != nev) { |
if (nev && nevt != nev) { |
| 4955 |
cout << "File: " << f->GetName() << " discarded ---- Tracker tree has " << nevt << " events instead of " |
cout << "File: " << f->GetName() << " discarded ---- Tracker tree has " << nevt << " events instead of " |
| 4956 |
<< nev << endl; |
<< nev << endl; |
| 4957 |
|
fDiscarded = true; |
| 4958 |
return false; |
return false; |
| 4959 |
} |
} |
| 4960 |
nev = nevt; |
nev = nevt; |
| 4978 |
if (nev && nevt != nev) { |
if (nev && nevt != nev) { |
| 4979 |
cout << "File: " << f->GetName() << " discarded ---- Calorimeter tree has " << nevt << " events instead of " |
cout << "File: " << f->GetName() << " discarded ---- Calorimeter tree has " << nevt << " events instead of " |
| 4980 |
<< nev << endl; |
<< nev << endl; |
| 4981 |
|
fDiscarded = true; |
| 4982 |
return false; |
return false; |
| 4983 |
} |
} |
| 4984 |
nev = nevt; |
nev = nevt; |
| 5001 |
if (nev && nevt != nev) { |
if (nev && nevt != nev) { |
| 5002 |
cout << "File: " << f->GetName() << " discarded ---- h20 tree has " << nevt << " events instead of " << nev |
cout << "File: " << f->GetName() << " discarded ---- h20 tree has " << nevt << " events instead of " << nev |
| 5003 |
<< endl; |
<< endl; |
| 5004 |
|
fDiscarded = true; |
| 5005 |
return false; |
return false; |
| 5006 |
} |
} |
| 5007 |
nev = nevt; |
nev = nevt; |
| 5014 |
SELLI = (Int_t) SELLI__ok; |
SELLI = (Int_t) SELLI__ok; |
| 5015 |
if (SELLI == 0 && SELLI__ok) { |
if (SELLI == 0 && SELLI__ok) { |
| 5016 |
cout << "File: " << f->GetName() << " discarded ---- found SelectionList (it is not a full-event file)" << endl; |
cout << "File: " << f->GetName() << " discarded ---- found SelectionList (it is not a full-event file)" << endl; |
| 5017 |
|
fDiscarded = true; |
| 5018 |
return false; |
return false; |
| 5019 |
} |
} |
| 5020 |
if (SELLI == 1 && !SELLI__ok) { |
if (SELLI == 1 && !SELLI__ok) { |
| 5021 |
cout << "File: " << f->GetName() << " discarded ---- SelectionList missing" << endl; |
cout << "File: " << f->GetName() << " discarded ---- SelectionList missing" << endl; |
| 5022 |
|
fDiscarded = true; |
| 5023 |
return false; |
return false; |
| 5024 |
} |
} |
| 5025 |
|
|
| 5058 |
|
|
| 5059 |
if (CAL1 && !CAL1__ok) { |
if (CAL1 && !CAL1__ok) { |
| 5060 |
cout << "File: " << f->GetName() << " discarded ---- Missing CaloLevel1 branch" << endl; |
cout << "File: " << f->GetName() << " discarded ---- Missing CaloLevel1 branch" << endl; |
| 5061 |
|
fDiscarded = true; |
| 5062 |
return false; |
return false; |
| 5063 |
}; |
}; |
| 5064 |
if (CAL2 && !CAL2__ok) { |
if (CAL2 && !CAL2__ok) { |
| 5065 |
cout << "File: " << f->GetName() << " discarded ---- Missing CaloLevel2 branch" << endl; |
cout << "File: " << f->GetName() << " discarded ---- Missing CaloLevel2 branch" << endl; |
| 5066 |
|
fDiscarded = true; |
| 5067 |
return false; |
return false; |
| 5068 |
}; |
}; |
| 5069 |
if (TRK2 && !TRK2__ok) { |
if (TRK2 && !TRK2__ok) { |
| 5070 |
cout << "File: " << f->GetName() << " discarded ---- Missing TrkLevel2 branch" << endl; |
cout << "File: " << f->GetName() << " discarded ---- Missing TrkLevel2 branch" << endl; |
| 5071 |
|
fDiscarded = true; |
| 5072 |
return false; |
return false; |
| 5073 |
}; |
}; |
| 5074 |
if (TRK1 && !TRK1__ok) { |
if (TRK1 && !TRK1__ok) { |
| 5075 |
cout << "File: " << f->GetName() << " discarded ---- Missing TrkLevel1 branch" << endl; |
cout << "File: " << f->GetName() << " discarded ---- Missing TrkLevel1 branch" << endl; |
| 5076 |
|
fDiscarded = true; |
| 5077 |
return false; |
return false; |
| 5078 |
}; |
}; |
| 5079 |
if (TRKh && !TRKh__ok) { |
if (TRKh && !TRKh__ok) { |
| 5080 |
cout << "File: " << f->GetName() << " discarded ---- Missing TrkHough branch" << endl; |
cout << "File: " << f->GetName() << " discarded ---- Missing TrkHough branch" << endl; |
| 5081 |
|
fDiscarded = true; |
| 5082 |
return false; |
return false; |
| 5083 |
}; |
}; |
| 5084 |
if (ORB && !ORB__ok) { |
if (ORB && !ORB__ok) { |
| 5085 |
cout << "File: " << f->GetName() << " discarded ---- Missing ORB tree" << endl; |
cout << "File: " << f->GetName() << " discarded ---- Missing ORB tree" << endl; |
| 5086 |
|
fDiscarded = true; |
| 5087 |
return false; |
return false; |
| 5088 |
}; |
}; |
| 5089 |
if (AC && !AC__ok) { |
if (AC && !AC__ok) { |
| 5090 |
cout << "File: " << f->GetName() << " discarded ---- Missing AC tree" << endl; |
cout << "File: " << f->GetName() << " discarded ---- Missing AC tree" << endl; |
| 5091 |
|
fDiscarded = true; |
| 5092 |
return false; |
return false; |
| 5093 |
}; |
}; |
| 5094 |
if (S4 && !S4__ok) { |
if (S4 && !S4__ok) { |
| 5095 |
cout << "File: " << f->GetName() << " discarded ---- Missing S4 tree" << endl; |
cout << "File: " << f->GetName() << " discarded ---- Missing S4 tree" << endl; |
| 5096 |
|
fDiscarded = true; |
| 5097 |
return false; |
return false; |
| 5098 |
}; |
}; |
| 5099 |
if (TOF && !TOF__ok) { |
if (TOF && !TOF__ok) { |
| 5100 |
cout << "File: " << f->GetName() << " discarded ---- Missing ToF tree" << endl; |
cout << "File: " << f->GetName() << " discarded ---- Missing ToF tree" << endl; |
| 5101 |
|
fDiscarded = true; |
| 5102 |
return false; |
return false; |
| 5103 |
}; |
}; |
| 5104 |
|
|
| 5105 |
if (ND && !ND__ok) { |
if (ND && !ND__ok) { |
| 5106 |
cout << "File: " << f->GetName() << " discarded ---- Missing ND tree" << endl; |
cout << "File: " << f->GetName() << " discarded ---- Missing ND tree" << endl; |
| 5107 |
|
fDiscarded = true; |
| 5108 |
return false; |
return false; |
| 5109 |
}; |
}; |
| 5110 |
if (TRG && !TRG__ok) { |
if (TRG && !TRG__ok) { |
| 5111 |
cout << "File: " << f->GetName() << " discarded ---- Missing Trigger tree" << endl; |
cout << "File: " << f->GetName() << " discarded ---- Missing Trigger tree" << endl; |
| 5112 |
|
fDiscarded = true; |
| 5113 |
return false; |
return false; |
| 5114 |
}; |
}; |
| 5115 |
if (GP && !GP__ok) { |
if (GP && !GP__ok) { |
| 5116 |
cout << "File: " << f->GetName() << " discarded ---- Missing h20 tree" << endl; |
cout << "File: " << f->GetName() << " discarded ---- Missing h20 tree" << endl; |
| 5117 |
|
fDiscarded = true; |
| 5118 |
return false; |
return false; |
| 5119 |
}; |
}; |
| 5120 |
|
|
| 5214 |
// cout << i<< "\t | "<<GetRunInfo()->ID<<"\t "<<GetRunInfo()->NEVENTS<< "\t "<<GetRunInfo()->RUNHEADER_TIME<<" <---> "<<GetRunInfo()->RUNTRAILER_TIME<<endl; |
// cout << i<< "\t | "<<GetRunInfo()->ID<<"\t "<<GetRunInfo()->NEVENTS<< "\t "<<GetRunInfo()->RUNHEADER_TIME<<" <---> "<<GetRunInfo()->RUNTRAILER_TIME<<endl; |
| 5215 |
run_tree_clone->Fill(); |
run_tree_clone->Fill(); |
| 5216 |
} |
} |
| 5217 |
cout << "----------------------------------------------------" << endl; |
// |
| 5218 |
|
// replicate processinginfo tree |
| 5219 |
|
// |
| 5220 |
|
if ( PROC ){ // EMEMEM |
| 5221 |
|
proc_tree_clone = new TTree("ProcessingInfo","Log of data processing"); |
| 5222 |
|
proc_tree_clone->Branch("ProcInfo", "ProcInfo", GetPointerTo("ProcInfo")); |
| 5223 |
|
cout << "ProcessingInfo: branch ProcessingInfo" << endl; |
| 5224 |
|
// ------------------ |
| 5225 |
|
// replicate processinginfo tree |
| 5226 |
|
// ------------------ |
| 5227 |
|
// cout << "----------------------------------------------------"<<endl; |
| 5228 |
|
// cout << "irun\t | RUN\t NEVENTS\t absolute time"<<endl; |
| 5229 |
|
for (Int_t i = 0; i < proc_tree->GetEntries(); i++) { |
| 5230 |
|
proc_tree->GetEntry(i); |
| 5231 |
|
// cout << i<< "\t | "<<endl; |
| 5232 |
|
proc_tree_clone->Fill(); |
| 5233 |
|
} |
| 5234 |
|
if ( SELLI != 2 ){ |
| 5235 |
|
proc_obj->runID = 0; |
| 5236 |
|
TTimeStamp *dt = new TTimeStamp(); |
| 5237 |
|
proc_obj->date = dt->AsString(); |
| 5238 |
|
delete dt; |
| 5239 |
|
proc_obj->commandLine = Form("PamelaLevel2 was called: CAL2 %i CAL1 %i CAL0 %i TRK2 %i TRK1 %i TRKh %i TRK0 %i TOF %i TOF0 %i TRG %i \n S4 %i ND %i AC %i ORB %i GP %i EXT %i NUC %i RUN %i ISGP %i SELLI %i \n Custom string = %s",CAL2,CAL1,CAL0,TRK2,TRK1,TRKh,TRK0,TOF,TOF0,TRG,S4,ND,AC,ORB,GP,EXT,NUC,RUN,ISGP,SELLI,customString.Data()); |
| 5240 |
|
proc_obj->outputFilename = ofile->GetName(); |
| 5241 |
|
proc_obj->localDir = gSystem->WorkingDirectory(); |
| 5242 |
|
proc_obj->uname = gSystem->GetFromPipe("uname -a"); |
| 5243 |
|
if (!dbc || (dbc && !dbc->IsConnected())) SetDBConnection(); |
| 5244 |
|
proc_obj->DB = Form("mysql://%s/%s",dbc->GetHost(),dbc->GetDB()); |
| 5245 |
|
dbc->Close(); |
| 5246 |
|
proc_tree_clone->Fill(); |
| 5247 |
|
} |
| 5248 |
|
cout << "----------------------------------------------------" << endl; |
| 5249 |
|
} |
| 5250 |
// ------------------------------------ |
// ------------------------------------ |
| 5251 |
// add branch with dead and live times |
// add branch with dead and live times |
| 5252 |
// ------------------------------------ |
// ------------------------------------ |
| 5437 |
if (!name.CompareTo(na)) |
if (!name.CompareTo(na)) |
| 5438 |
return sel_tree_clone; |
return sel_tree_clone; |
| 5439 |
} |
} |
| 5440 |
|
if (proc_tree_clone && PROC) { |
| 5441 |
|
TString na = proc_tree_clone->GetName(); |
| 5442 |
|
if (!name.CompareTo(na)) |
| 5443 |
|
return proc_tree_clone; |
| 5444 |
|
} |
| 5445 |
return NULL; |
return NULL; |
| 5446 |
|
|
| 5447 |
} |
} |
| 5461 |
for (Int_t i = 0; i < NCLONES; i++) { |
for (Int_t i = 0; i < NCLONES; i++) { |
| 5462 |
if (pam_tree_clone[i]) { |
if (pam_tree_clone[i]) { |
| 5463 |
cout << pam_tree_clone[i]->GetName() << endl; |
cout << pam_tree_clone[i]->GetName() << endl; |
| 5464 |
pam_tree_clone[i]->Write(); |
pam_tree_clone[i]->Write(pam_tree_clone[i]->GetName(),TObject::kOverwrite); |
| 5465 |
}; |
}; |
| 5466 |
} |
} |
| 5467 |
|
|
| 5468 |
|
if ( PROC ){//EMEMEMEM |
| 5469 |
|
proc_tree_clone->Write("ProcessingInfo",TObject::kOverwrite); |
| 5470 |
|
} |
| 5471 |
cout << "+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+" << endl; |
cout << "+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+" << endl; |
| 5472 |
|
|
| 5473 |
} |
} |