22#include "TProfile2D.h"
24#include "TGraphErrors.h"
25#include "TGraphAsymmErrors.h"
26#include "TMultiGraph.h"
29#include "TDirectory.h"
36#include "TObjString.h"
39#include "TVirtualTreePlayer.h"
42#include "TGo4LockGuard.h"
43#include "TGo4ObjectProxy.h"
44#include "TGo4DirProxy.h"
45#include "TGo4LinkProxy.h"
47#include "TGo4ObjectManager.h"
49#include "TGo4Fitter.h"
50#include "TGo4Parameter.h"
51#include "TGo4Picture.h"
52#include "TGo4PolyCond.h"
53#include "TGo4WinCond.h"
54#include "TGo4ShapedCond.h"
55#include "TGo4ListCond.h"
56#include "TGo4CondArray.h"
57#include "TGo4HistogramEntry.h"
58#include "TGo4TreeHistogramEntry.h"
59#include "TGo4ExportManager.h"
63#include "TGo4AnalysisStatus.h"
84 Bool_t
Use()
const override {
return kFALSE; }
88 if (
fObject == obj)
return kTRUE;
90 Bool_t updatedone =
false;
93 if ((
fObject->IsA() == obj->IsA()) &&
94 (strcmp(
fObject->GetName(), obj->GetName()) == 0))
102 if (owner)
delete obj;
112 if (!
fObject && !strong)
return;
130 const char *viewpath,
131 Bool_t withRootBrowser)
142 Info(
"~TGo4BrowserProxy",
"Called");
168 Info(
"~TGo4BrowserProxy",
"Finished");
178 gROOT->GetClass(
"TH1");
179 gROOT->GetClass(
"TH1C");
180 gROOT->GetClass(
"TH1D");
181 gROOT->GetClass(
"TH1F");
182 gROOT->GetClass(
"TH1I");
183 gROOT->GetClass(
"TH1S");
184 gROOT->GetClass(
"TH2");
185 gROOT->GetClass(
"TH2C");
186 gROOT->GetClass(
"TH2D");
187 gROOT->GetClass(
"TH2F");
188 gROOT->GetClass(
"TH2I");
189 gROOT->GetClass(
"TH2S");
190 gROOT->GetClass(
"TH3");
191 gROOT->GetClass(
"TH3C");
192 gROOT->GetClass(
"TH3D");
193 gROOT->GetClass(
"TH3F");
194 gROOT->GetClass(
"TH3I");
195 gROOT->GetClass(
"TH3S");
197 gROOT->GetClass(
"TGo4WinCond");
198 gROOT->GetClass(
"TGo4PolyCond");
199 gROOT->GetClass(
"TGo4ShapedCond");
200 gROOT->GetClass(
"TGo4CondArray");
202 gROOT->GetClass(
"TGo4Fitter");
203 gROOT->GetClass(
"TGo4Parameter");
204 gROOT->GetClass(
"TGo4Picture");
206 gROOT->GetClass(
"TGo4DynamicEntry");
207 gROOT->GetClass(
"TGo4HistogramEntry");
208 gROOT->GetClass(
"TGo4TreeHistogramEntry");
209 gROOT->GetClass(
"TLatex");
210 gROOT->GetClass(
"TF1");
211 gROOT->GetClass(
"TGo4AnalysisStatus");
222 fxOM->UnregisterLink(slot);
230 bool ischildevent = source->
IsParent(slot);
232 if ((source != slot) && !ischildevent) {
246 }
else if ((source != slot) && ischildevent) {
275 return fxOM->GetSlot(slotname.Data());
282 return fxOM->GetSlot(slotname.Data());
316 if (!cl || !cl->IsLoaded())
return 0;
324 return fxOM->RequestObject(src.Data(), tgt.Data(), wait_time);
344 if (!itemslot)
return kFALSE;
347 if (itemslot->
IsParent(memslot) && !tgtpath)
return kFALSE;
350 if (!tgtslot)
return kFALSE;
351 if ((tgtslot == itemslot) || tgtslot->
IsParent(itemslot))
return kFALSE;
357 for (Int_t n = 0; n < itemslot->
NumChilds(); n++)
364 if (!tgtslot)
return kFALSE;
365 if (!tgtslot->
GetSlot(itemslot->GetName(), kTRUE))
return kFALSE;
372 subpath += itemslot->GetName();
374 tgtpath = subpath.Data();
377 for (Int_t n = 0; n <= childs.GetLast(); n++) {
390 if (!tgtslot)
return kFALSE;
391 if (!tgtslot->
IsParent(memslot) && (tgtslot!=memslot))
return kFALSE;
392 if (itemslot->
GetParent() == tgtslot)
return kFALSE;
393 if (memslot!=tgtslot)
401 if (!obj || forcerequest) {
403 if (res == 0)
return kFALSE;
405 if ((res == 1) || !forcerequest)
410 TString res =
SaveToMemory(pathname, obj->Clone(), kTRUE);
411 return res.Length() > 0;
435 if (!itemslot)
return;
438 for (Int_t n = 0; n <=
fxClipboard->GetLast(); n++) {
447 fxClipboard->Add(
new TNamed(itemname,
"clipboard item"));
459 for (Int_t n = 0; n <=
fxClipboard->GetLast(); n++)
465 if (!fname || (*fname == 0))
return;
486 if (!nodename || (*nodename == 0))
return kFALSE;
489 if (!proxy->
Connect(nodename)) {
494 const char *slotname = nodename;
495 if (strncmp(slotname,
"dabc://",7) == 0) slotname+=7;
505 const char *basename,
506 const char *userpass,
520 TString capt =
"HServ_";
523 AddServerProxy(hserv, capt.Data(),
"Connection to histogram server");
538 for (Int_t n = 0; n < slot->
NumChilds(); n++) {
553 for (Int_t n = 0; n < slot->
NumChilds(); n++) {
556 if (pr) arr->Add(pr);
567 for (Int_t n = 0; n < slot->
NumChilds(); n++) {
570 if (pr) arr->Add(pr);
581 for (Int_t n = 0; n < slot->
NumChilds(); n++) {
587 (strncmp(pr->
GetServerName(),
"https://",8) == 0)) arr->Add(pr);
604 TString &createdhistoname)
606 if (!Xexp || strlen(Xexp) == 0)
return;
608 TString varexp(Xexp);
610 if(Yexp && strlen(Yexp) > 0) {
611 varexp = TString(Yexp) + TString(
":") + varexp;
612 if(Zexp && strlen(Zexp) > 0)
613 varexp = TString(Zexp) + TString(
":") + varexp;
616 int drawdim = varexp.CountChar(
':') + 1;
617 if (drawdim > 3) drawdim = 3;
623 TString analhname(hname);
626 TString anitem =
"abcdef";
627 if (analhname.IsNull())
628 while (anitem.Length() > 0) {
629 analhname =
"hTreeDraw";
630 if (cnt > 0) { analhname+=
"_"; analhname+=cnt; }
635 an->
RemoteTreeDraw(objname.Data(), varexp.Data(), cutcond, analhname.Data());
639 createdhistoname =
"";
646 TString treeslotname;
648 TTree *SelectedTree =
dynamic_cast<TTree *
> (
fxOM->GetObject(treeslotname.Data()));
649 if (!SelectedTree)
return;
651 TString histoname(hname), hslotname;
655 TH1 *histo =
nullptr;
659 if (histo && (drawdim != histo->GetDimension())) {
667 if (!histo && histoname.IsNull())
670 histoname +=
"/hTreeDraw_";
673 hslot =
fxOM->GetSlot(hslotname.Data());
676 TString hfoldername, hobjectname;
680 hobjectname = histo->GetName();
683 varexp += hobjectname;
685 TDirectory *oldhisdir = histo ? histo->GetDirectory() :
nullptr;
686 TDirectory *savdir = gDirectory;
687 gDirectory =
nullptr;
688 TDirectory dummydir(
"DummyTreeDraw",
"Dummy directory to call tree draw");
691 histo->SetDirectory(&dummydir);
693 SelectedTree->Draw(varexp, cutcond,
"goff", 10000000, 0);
696 histo =
dynamic_cast<TH1 *
> (dummydir.FindObject(hobjectname));
698 histo->SetDirectory(
nullptr);
704 histo->SetDirectory(oldhisdir);
724 while (iter.
next()) {
731 if (!serv || ((kind == 1) && !serv->
IsGo4Analysis()))
continue;
740 if (res && !databranch) {
755 if (!slot || !itemname)
769 if (!slot || !itemname)
778 if (!analslot || !objname)
return TString(
"");
781 while (iter.
next()) {
782 if (strcmp(iter.
getname(), objname) != 0)
continue;
796 if (!topslot || !objname)
return TString(
"");
800 if (strcmp(iter.
getname(), objname) == 0)
809 if (!slot)
return nullptr;
824 const char *objectname =
nullptr;
826 TGo4Slot *servslot =
fxOM->FindSlot(slotname.Data(), &objectname);
830 if (!serv)
return nullptr;
832 if (objname) *objname = objectname;
844 if (!slot)
return kFALSE;
847 if (!obj)
return kFALSE;
849 const char *analysisname =
nullptr;
855 anslot =
fxOM->FindSlot(slotname.Data(), &analysisname);
859 analysisname =
nullptr;
870 if (!itemslot)
return;
876 while (iter.
next()) {
882 if (wait_time == 0)
return;
906 if (!guislot)
return nullptr;
910 if ((update == 0) || ((update == 1) && obj))
return obj;
943 if (itemslot->
GetPar(
"::CopyObject") !=
nullptr) {
950 fxOM->DeleteSlot(src.Data());
971 return fxOM->GetSlot(slotname.Data());
979 if (!slot)
return kFALSE;
984 if (cl && cl->InheritsFrom(TTree::Class()))
break;
987 if (!treeslot)
return kFALSE;
996 if (!itemname || !treename)
return kFALSE;
1001 if (!slot)
return kFALSE;
1005 int ilen = strlen(itemname);
1006 int tlen = strlen(treename);
1007 if ((ilen < tlen) || (strncmp(itemname, treename, tlen) != 0))
1010 leafname = slot->GetName();
1016 if (!objname || (*objname == 0))
return kFALSE;
1019 objectitem = objname;
1031 if (*objname!=
'/') searchname+=
"/";
1032 searchname+=objname;
1039 searchname.Append(
";1");
1040 slot =
fxOM->GetSlot(searchname.Data());
1044 objectitem = searchname;
1052 if (strchr(objname,
'/')) {
1054 if ((mask & 2) == 0)
return kFALSE;
1060 const char *slash = strchr(objname,
'/');
1063 slash = strchr(slash+1,
'/');
1067 if (!
DefineRelatedObject(itemname, TString(objname, slash-objname).Data(), diritem, 0))
break;
1069 int kind =
ItemKind(diritem.Data());
1081 if ((mask & 1) == 0)
return kFALSE;
1087 size_t len = strlen(objname);
1088 while (iter.
next()) {
1089 const char *name = iter.
getname();
1091 if (strncmp(objname, name, len) != 0)
continue;
1093 if ((strlen(name) == len) ||
1094 ((strlen(name)==(len+2)) && (strcmp(name+len,
";1") == 0))) {
1102 }
while (searchslot);
1110 if (!slot)
return kFALSE;
1116 if (cl && cl->InheritsFrom(TFile::Class()))
break;
1124 *filepath = itemname + fitemname.Length();
1125 if (**filepath==
'/') (*filepath)++;
1136 if (!slot)
return kFALSE;
1139 if (!obj)
return kFALSE;
1142 if (!fileslot)
return kFALSE;
1145 if (!dircont)
return kFALSE;
1158 if (!slot)
return kFALSE;
1161 if (!obj)
return kFALSE;
1163 TFile *f = TFile::Open(filename,
"UPDATE");
1164 if (!f)
return kFALSE;
1166 TDirectory *dir = f;
1168 if (subfolder && *subfolder) {
1169 dir =
dynamic_cast<TDirectory *
> (f->Get(subfolder));
1174 bool res = dir->WriteTObject(obj, obj->GetName(),
"Overwrite") > 0;
1176 if (obj->InheritsFrom(TH1::Class()))
1177 ((TH1 *) obj)->SetDirectory(
nullptr);
1186 const char *filename,
1187 const char *filedir,
1189 const char *description)
1191 if (!items || (items->GetSize() == 0))
return;
1200 if (convert.Contains(
"ASCII")) {
1203 }
else if (convert.Contains(
"Radware")) {
1206 }
else if (convert.Contains(
"ROOT XML")) {
1209 }
else if (convert.Contains(
"ROOT")) {
1219 TObjString* str =
dynamic_cast<TObjString*
> (items->At(0));
1223 TString fname = filename;
1226 if(!fname.Contains(
".xml")) fname.Append(
".xml");
1228 if(!fname.Contains(
".root")) fname.Append(
".root");
1231 if (itemslot && (itemslot->
NumChilds() > 0)) {
1243 TGo4Log::Message(1,
"Exporting selected browser objects to %s", convert.Data());
1246 for (
int n = 0; n <= items->GetLast(); n++) {
1247 TObjString *str =
dynamic_cast<TObjString *
>(items->At(n));
1258 exman.
Export(&objs, filter);
1264 TString result,folder;
1273 if (convert.Contains(
"ASCII")) {
1276 folder =
"Imports/Ascii";
1277 }
else if (convert.Contains(
"Ortec")) {
1280 folder =
"Imports/OrtecMCA";
1290 result=
SaveToMemory(folder.Data(),histo, kTRUE, kFALSE);
1292 TGo4Log::Message(1,
"Importing %s Histogram from file %s to %s.", convert.Data(), filename ,result.Data());
1301 const char *selectedpath,
1302 const char *description)
1306 if (!toppath)
return kFALSE;
1311 TFile *f = TFile::Open(filename,
"recreate", description);
1312 if (!f)
return kFALSE;
1314 fxOM->SaveDataToFile(f, kTRUE, toppath);
1328 if (!slot)
return kFALSE;
1330 if (!slot->
GetIntPar(
"GUI::Remote", remote))
return kFALSE;
1336 TString analysisname;
1342 if (stime && sdate) {
1343 slot->
SetPar(
"GUI::Time", stime);
1344 slot->
SetPar(
"GUI::Date", sdate);
1349 const char *datetime = t.AsSQLString();
1350 char *time = (
char *) strchr(datetime,
' ');
1352 slot->
SetPar(
"GUI::Time", datetime);
1353 slot->
SetPar(
"GUI::Date", datetime);
1355 slot->
SetPar(
"GUI::Time", time+1);
1357 slot->
SetPar(
"GUI::Date", datetime);
1363 return !slot ? nullptr : slot->
GetPar(
"GUI::Time");
1368 return !slot ? nullptr : slot->
GetPar(
"GUI::Date");
1374 slot->
SetPar(
"::LinkedItem", itemname);
1379 return !slot ? nullptr : slot->
GetPar(
"::LinkedItem");
1398 if (kind >= 0) slot->
SetIntPar(
"GUI::Kind", kind);
1400 slot->
SetPar(
"GUI::Class", classname);
1401 slot->
SetPar(
"GUI::Info", info);
1402 slot->
SetIntPar(
"GUI::SizeInfo", sizeinfo);
1407 return !slot ? nullptr : slot->
GetPar(
"GUI::Info");
1412 if (!slot)
return -1;
1414 if (!slot->
GetIntPar(
"GUI::SizeInfo", sizeinfo))
return -1;
1426 if (!slot)
return 0;
1428 if (!slot->
GetIntPar(
"GUI::CalcSize", size))
return 0;
1444 return !slot ? nullptr : slot->
GetPar(
"GUI::Class");
1459 if (!slot)
return 0;
1462 if (!slot->
GetIntPar(
"GUI::CanDo", cando))
return 0;
1468 if (slot) slot->
SetIntPar(
"GUI::CanDo", cando);
1473 return !slot ? kTRUE : !slot->
GetPar(
"GUI::NotMonitored");
1482 while (iter.
next()) {
1492 slot->
SetPar(
"GUI::NotMonitored",
"1");
1499 return (cando % 1000000000) / 100000000 > 0;
1504 return (cando % 100000000) / 10000000 > 0;
1509 return (cando % 10000000) / 1000000 > 0;
1514 return (cando % 1000000) / 100000 > 0;
1519 return (cando % 100000) / 10000 > 0;
1524 return (cando % 10000) / 1000 > 0;
1529 return (cando % 1000) / 100 > 0;
1534 return (cando % 100) / 10 > 0;
1539 return (cando % 10 > 0);
1544 if (foldername && *foldername)
1547 TString fullpathname;
1550 fxOM->MakeFolder(fullpathname);
1557 if (!itemslot || !newfoldername || (strlen(newfoldername) == 0))
return;
1560 if (!itemslot->
IsParent(memslot) && (memslot!=itemslot))
return;
1574 if (!itemslot || !newname || (strlen(newname) == 0))
return;
1576 if (strchr(newname,
'/') || strchr(newname,
'\\'))
return;
1579 if (!itemslot->
IsParent(memslot))
return;
1587 slot->SetName(newname);
1589 if (n) n->SetName(newname);
1599 if (!itemslot)
return;
1602 if (!itemslot->
IsParent(memslot))
return;
1610 if(ob->InheritsFrom(TH1::Class())) {
1611 TH1 *his =
dynamic_cast<TH1 *
>(ob);
1612 if (his) his->Reset();
1614 if(ob->InheritsFrom(TGo4DynamicEntry::Class())) {
1616 if (entry) entry->
Reset();
1618 if(ob->InheritsFrom(TGo4Picture::Class())) {
1620 if (pic) pic->
Reset();
1622 if(ob->InheritsFrom(TGraph::Class())) {
1623 TGraph *gr =
dynamic_cast<TGraph *
>(ob);
1625 Int_t pn = gr->GetN();
1630 if(ob->InheritsFrom(TMultiGraph::Class())) {
1631 TMultiGraph *mg =
dynamic_cast<TMultiGraph *
>(ob);
1633 TIter liter(mg->GetListOfGraphs());
1634 while(
auto gr = (TGraph *) liter()) {
1635 Int_t pn = gr->GetN();
1651 if (!obj)
return TString(
"");
1654 if (pathname && (*pathname != 0)) {
1661 TString itemname = path;
1663 itemname+=obj->GetName();
1671 TString fullpathname;
1674 TGo4Slot *slot =
fxOM->Add(fullpathname.Data(), obj, ownership, kTRUE);
1691 TString picitemname;
1702 for (Int_t posy = 0; posy < pic->
GetDivY(); posy++)
1703 for (Int_t posx = 0; posx < pic->
GetDivX(); posx++)
1717 TIter iter(gROOT->GetList());
1718 while (
auto obj = iter()) {
1722 gROOT->GetList()->Clear();
1728 if(on) slot->
SetPar(
"GUI::CanDelete",
"1");
1735 return !slot ? kFALSE : slot->
GetPar(
"GUI::CanDelete") !=
nullptr;
1760 if (!viewslot)
return 0;
1764 TObjArray UniqueItems;
1768 while (iter.
next()) {
1774 if (srcslot && srcslot->
IsParent(brslot) && !UniqueItems.FindObject(srcslot))
1775 UniqueItems.Add(srcslot);
1779 Int_t nrequests = 0;
1780 for (
int n = 0; n <= UniqueItems.GetLast(); n++) {
1792 Int_t nrequests = 0;
1796 while (iter.
next()) {
1818 Bool_t anready = kTRUE;
1848 slot->
SetIntPar(
"GUI::DeleteProtect", delprot);
1852 slot->
SetIntPar(
"GUI::ResetProtect", clearprot);
1859 delprot = -1; clearprot = -1;
1861 if (!slot->
GetIntPar(
"GUI::DeleteProtect", delprot)) delprot = -1;
1862 if (!slot->
GetIntPar(
"GUI::ResetProtect", clearprot)) clearprot = -1;
1872 if (!source)
return;
1875 if (!curfold)
return;
1881 const char *EventsFolder =
"EventObjects/Events/";
1886 Bool_t res = iter.
next();
1891 while (levelchange++ < 0) {
1900 if (!curfold)
break;
1907 while (find && (strcmp(iter.
getname(), find->GetName()) != 0))
1913 if (find!=curslot) {
1921 const char *ppp = strstr(fullname, EventsFolder);
1923 ppp += strlen(EventsFolder);
1924 if ((strlen(ppp) != 0) && !strchr(ppp,
'/')) {
1926 classname =
nullptr;
1937 TObject *assobj =
nullptr;
1958 if (curslot && curslot->
IsParent(targetslot))
1977 if (!topslot)
return 0;
1983 for (Int_t n = 0; n < topslot->
NumChilds(); n++)
2008 if (cl->InheritsFrom(TProfile::Class())) { cando = 1110; pixmap =
"profile_t.png"; }
else
2009 if (cl->InheritsFrom(TProfile2D::Class())) { cando = 1110; pixmap =
"col.png"; }
else
2010 if (cl->InheritsFrom(TGo4Picture::Class())) { cando = 110; pixmap =
"picture.png"; }
else
2011 if (cl->InheritsFrom(TGo4Parameter::Class())) { cando = 1011; pixmap =
"parameter.png"; }
else
2012 if (cl->InheritsFrom(TMultiGraph::Class())) { cando = 1110; pixmap =
"superimpose.png"; }
else
2013 if (cl->InheritsFrom(THStack::Class())) { cando = 1110; pixmap =
"superimpose.png"; }
else
2014 if (cl->InheritsFrom(TGraph::Class())) { cando = 1001110; pixmap =
"tgraph.png"; }
else
2015 if (cl->InheritsFrom(TGo4Fitter::Class())) { cando = 11; pixmap =
"fitter.png"; }
else
2016 if (cl->InheritsFrom(TCanvas::Class())) { cando = 110; pixmap =
"canvas.png"; }
else
2017 if (cl->InheritsFrom(TFile::Class())) { pixmap =
"rootdb_t.png"; }
else
2018 if (cl->InheritsFrom(TTree::Class())) { pixmap =
"tree_t.png"; }
else
2019 if (cl->InheritsFrom(TFolder::Class())) { pixmap =
"folder_t.png"; }
else
2020 if (cl->InheritsFrom(TDirectory::Class())) { pixmap =
"folder_t.png"; }
else
2021 if (cl->InheritsFrom(TH3::Class())) { cando = 1101110; pixmap =
"h3_t.png"; }
else
2022 if (cl->InheritsFrom(TH2::Class())) { cando = 1101110; pixmap =
"h2_t.png"; }
else
2023 if (cl->InheritsFrom(TH1::Class())) { cando = 1101110; pixmap =
"h1_t.png"; }
else
2024 if (cl->InheritsFrom(TGo4WinCond::Class())) { cando = 101011; pixmap =
"windcond.png"; }
else
2025 if (cl->InheritsFrom(TGo4PolyCond::Class())) { cando = 101011; pixmap =
"polycond.png"; }
else
2026 if (cl->InheritsFrom(TGo4ShapedCond::Class())) { cando = 101011; pixmap =
"polycond.png"; }
else
2027 if (cl->InheritsFrom(TGo4ListCond::Class())) { cando = 101011; pixmap =
"windcond.png"; }
else
2028 if (cl->InheritsFrom(TGo4CondArray::Class())) { cando = 101011; pixmap =
"windcondarray.png"; }
else
2029 if (cl->InheritsFrom(TGo4TreeHistogramEntry::Class())) { cando = 1011; pixmap =
"dynentryx.png"; }
else
2030 if (cl->InheritsFrom(TGo4HistogramEntry::Class())) { cando = 1011; pixmap =
"dynentryx.png"; }
else
2031 if (cl->InheritsFrom(TLatex::Class())) { cando = 110; pixmap =
"canvas.png"; }
else
2032 if (cl->InheritsFrom(TF1::Class())) { cando = 110; pixmap =
"draw1dline.png"; }
else
2033 if (cl->InheritsFrom(TLeaf::Class())) { cando = 11; pixmap =
"leaf_t.png"; }
else
2034 if (cl->InheritsFrom(TGo4AnalysisStatus::Class())) { cando = 1; pixmap =
"control.png"; }
2037 pixmap =
"folder_t.png";
2038 if (cl && cl->InheritsFrom(TTree::Class())) { cando = 10; pixmap =
"tree_t.png"; }
else
2039 if (cl && cl->InheritsFrom(TCanvas::Class())) { cando = 110; pixmap =
"canvas.png"; }
else
2040 if (cl && cl->InheritsFrom(THStack::Class())) { cando = 110; pixmap =
"superimpose.png"; }
else
2041 if (cl && cl->InheritsFrom(TFile::Class())) { cando = 10000; pixmap =
"rootdb_t.png"; }
else
2042 if (cl && cl->InheritsFrom(TGo4HServProxy::Class())) { cando = 10000; pixmap =
"histserv.png"; }
else
2043 if (cl && cl->InheritsFrom(TGo4DabcProxy::Class())) { cando = 10000; pixmap =
"dabc.png"; }
else
2044 if (cl && cl->InheritsFrom(TGo4AnalysisProxy::Class())) { pixmap =
"analysiswin.png"; }
else
2045 if (cl && cl->InheritsFrom(TGo4ServerProxy::Class())) { cando = 10000; pixmap =
"http.png"; }
2048 pixmap =
"branch_t.png";
2050 cando = 11; pixmap =
"leaf_t.png";
2052 cando = 1011; pixmap =
"parameter.png";
2054 cando = 10; pixmap =
"eventitem.png";
2056 cando = 100010; pixmap =
"eventobj.png";
2058 cando = 100000000; pixmap =
"eventobj.png";
2066 if (v1==v2)
return kTRUE;
2068 return (fabs(v1-v2) <= scale);
2078 if (!ax1 || !ax2)
return 0;
2080 Int_t num1 = ax1->GetNbins();
2081 Int_t num2 = ax2->GetNbins();
2083 Double_t scale = fabs(ax1->GetXmax() - ax1->GetXmin()) / (num1+1.) * 1e-3;
2085 if ((num1 != num2)) {
2087 if ((num1 > num2/2) || (num1 < 2))
return 0;
2089 Int_t rebin = num2/num1;
2090 if (rebin == 0)
return 0;
2093 if ((ax1->GetXbins()->GetSize() != 0) || (ax2->GetXbins()->GetSize() != 0))
return 0;
2100 if (num1*rebin!=num2) xmax = ax2->GetBinUpEdge(num1*rebin);
2101 else xmax = ax2->GetXmax();
2109 if ((ax1->GetXbins()->GetSize() == 0) && (ax2->GetXbins()->GetSize() == 0)) {
2113 for (Int_t n=1;n<=num1;n++)
2115 ax2->GetBinCenter(n), scale))
return 0;
2123 Bool_t tdisp = kFALSE;
2126 if (obj->InheritsFrom(TProfile::Class())) {
2127 auto profile =
dynamic_cast<TProfile *
>(obj);
2128 auto profile2 =
dynamic_cast<TProfile *
>(newobj);
2129 if (!profile || !profile2)
return kFALSE;
2130 if (profile->GetNbinsX() != profile2->GetNbinsX())
return kFALSE;
2131 profile2->Copy(*profile);
2133 }
else if (obj->InheritsFrom(TProfile2D::Class())) {
2134 auto profile =
dynamic_cast<TProfile2D *
>(obj);
2135 auto profile2 =
dynamic_cast<TProfile2D *
>(newobj);
2136 if (!profile || !profile2)
return kFALSE;
2137 if ((profile->GetNbinsX() != profile2->GetNbinsX()) || (profile->GetNbinsY() != profile2->GetNbinsY()))
return kFALSE;
2138 profile2->Copy(*profile);
2140 }
else if (obj->InheritsFrom(TH1::Class())) {
2141 auto histo =
dynamic_cast<TH1 *
>(obj);
2142 auto histo2 =
dynamic_cast<TH1 *
>(newobj);
2143 if (!histo || !histo2)
return kFALSE;
2145 if (
dynamic_cast<TProfile *
>(obj) ||
dynamic_cast<TProfile2D *
>(obj))
return kFALSE;
2147 if (histo->GetDimension() != histo2->GetDimension())
return kFALSE;
2149 histo->SetTitle(histo2->GetTitle());
2151 Int_t rebinx = 1, rebiny = 1;
2153 rebinx =
CompareAxis(histo->GetXaxis(), histo2->GetXaxis());
2154 if (histo->GetDimension()>1)
2155 rebiny =
CompareAxis(histo->GetYaxis(), histo2->GetYaxis());
2156 if (histo->GetDimension()>2)
2157 if (
CompareAxis(histo->GetZaxis(), histo2->GetZaxis())!=1)
return kFALSE;
2159 if ((rebinx == 0) || (rebiny == 0))
return kFALSE;
2163 if ((rebinx>1) || (rebiny>1)) {
2164 if (!hasrebinx || !hasrebiny)
return kFALSE;
2166 TH1 *clon = (TH1 *) histo2->Clone(
"____dummyhisto____");
2167 if (!clon)
return kFALSE;
2168 clon->SetDirectory(
nullptr);
2169 Bool_t rebinres = kFALSE;
2171 if (histo->GetDimension() == 1) {
2172 clon->Rebin(rebinx);
2174 }
else if (histo->GetDimension() == 2) {
2175 TH2 *h2 =
dynamic_cast<TH2 *
>(clon);
2177 h2->Rebin2D(rebinx, rebiny);
2183 *hasrebinx = rebinx;
2184 *hasrebiny = rebiny;
2190 Int_t sz = histo->GetNbinsX()+2;
2191 if (histo->GetDimension()>1)
2192 sz = sz*(histo->GetNbinsY()+2);
2193 if (histo->GetDimension()>2)
2194 sz = sz*(histo->GetNbinsZ()+2);
2195 Bool_t canrebin = histo->CanExtendAllAxes();
2196 histo->SetCanExtend(TH1::kNoAxis);
2198 for (
int n = 0; n < sz; n++) {
2199 Stat_t value = histo2->GetBinContent(n);
2201 histo->SetBinContent(n, value);
2204 if (canrebin) histo->SetCanExtend(TH1::kAllAxes);
2206 histo->SetEntries(sum);
2208 TArrayD *sumw_tgt =
nullptr, *sumw_src =
nullptr;
2210 if (histo2->GetSumw2N() > 0)
2211 sumw_src = histo2->GetSumw2();
2215 histo->GetSumw2()->Set(0);
2217 if(histo->GetSumw2N() == 0)
2219 sumw_tgt = histo->GetSumw2();
2222 if (sumw_src && sumw_tgt)
2223 sumw_tgt->Set(sz, sumw_src->GetArray());
2226 }
else if (obj->InheritsFrom(TGo4Condition::Class())) {
2229 if (!cond || !newcond)
return kFALSE;
2235 }
else if (obj->InheritsFrom(TGraphAsymmErrors::Class())) {
2236 TGraphAsymmErrors* gr =
dynamic_cast<TGraphAsymmErrors*
> (obj);
2237 TGraph *newgr =
dynamic_cast<TGraph *
> (newobj);
2238 if (!gr || !newgr)
return kFALSE;
2240 gr->SetTitle(newgr->GetTitle());
2242 Int_t npoints = newgr->GetN();
2244 Double_t xp, yp, exh, exl, eyh, eyl;
2245 for (Int_t n = 0; n < npoints; n++) {
2246 newgr->GetPoint(n, xp, yp);
2247 gr->SetPoint(n, xp, yp);
2248 exh = newgr->GetErrorXhigh(n);
2249 exl = newgr->GetErrorXlow(n);
2250 eyh = newgr->GetErrorYhigh(n);
2251 eyl = newgr->GetErrorYlow(n);
2252 gr->SetPointError(n, exl, exh, eyl, eyh);
2258 }
else if (obj->InheritsFrom(TGraphErrors::Class())) {
2259 TGraphErrors* gr =
dynamic_cast<TGraphErrors*
> (obj);
2260 TGraph *newgr =
dynamic_cast<TGraph *
> (newobj);
2261 if (!gr || !newgr)
return kFALSE;
2263 gr->SetTitle(newgr->GetTitle());
2265 Int_t npoints = newgr->GetN();
2267 Double_t xp, yp, ex, ey;
2268 for (Int_t n = 0; n < npoints; n++) {
2269 newgr->GetPoint(n, xp, yp);
2270 gr->SetPoint(n, xp, yp);
2271 ex = newgr->GetErrorX(n);
2272 ey = newgr->GetErrorY(n);
2273 gr->SetPointError(n, ex, ey);
2280 }
else if (obj->InheritsFrom(TGraph::Class())) {
2281 TGraph *gr =
dynamic_cast<TGraph *
> (obj);
2282 TGraph *newgr =
dynamic_cast<TGraph *
> (newobj);
2283 if (!gr || !newgr)
return kFALSE;
2287 gr->SetTitle(newgr->GetTitle());
2289 Int_t npoints = newgr->GetN();
2292 for (Int_t n = 0; n < npoints; n++) {
2293 newgr->GetPoint(n, xp, yp);
2294 gr->SetPoint(n, xp, yp);
2300 }
else if (obj->InheritsFrom(TLatex::Class())) {
2301 TLatex *l0 =
dynamic_cast<TLatex *
> (obj);
2302 TLatex *l1 =
dynamic_cast<TLatex *
> (newobj);
2303 if (!l1 || !l0)
return kFALSE;
2305 l0->SetTitle(l1->GetTitle());
2308 }
else if (obj->InheritsFrom(TF1::Class())) {
2309 TF1 *f0 =
dynamic_cast<TF1 *
> (obj);
2310 TF1 *f1 =
dynamic_cast<TF1 *
> (newobj);
2311 if (!f1 || !f0)
return kFALSE;
2322 TH1 *h1 = gr->GetHistogram();
2323 TAxis *xax = h1->GetXaxis();
2324 timedisplay = xax->GetTimeDisplay();
2325 format = xax->GetTimeFormat();
2331 TH1 *h1 = gr->GetHistogram();
2332 TAxis *xax = h1->GetXaxis();
2333 xax->SetTimeDisplay(timedisplay);
2334 xax->SetTimeFormat(format.Data());
2340 if(!oldgr || !newgr)
return;
2341 TList *theFunctions = oldgr->GetListOfFunctions();
2342 TObject *obj =
nullptr;
2343 while ((obj = theFunctions->First()) !=
nullptr) {
2344 while (theFunctions->Remove(obj)) { }
2348 TList *newFunctions = newgr->GetListOfFunctions();
2349 TListIter fiter(newFunctions);
2350 while(
auto fun =
dynamic_cast<TF1 *
>(fiter())) {
2351 TF1 *fclon =
dynamic_cast<TF1 *
>(fun->Clone());
2352 theFunctions->Add(fclon);
2353 fclon->SetParent(oldgr);
2357 TH1 *oldhis = oldgr->GetHistogram();
2358 TH1 *newhis = newgr->GetHistogram();
2359 if(oldhis && newhis) {
2360 oldhis->GetXaxis()->SetTitle(newhis->GetXaxis()->GetTitle());
2361 oldhis->GetYaxis()->SetTitle(newhis->GetYaxis()->GetTitle());
2369 if(!oldh || !newh)
return;
2370 TList *theFunctions = oldh->GetListOfFunctions();
2371 TObject *obj =
nullptr;
2372 while ((obj = theFunctions->First()) !=
nullptr) {
2373 while (theFunctions->Remove(obj)) { }
2377 TList *newFunctions = newh->GetListOfFunctions();
2378 TListIter fiter(newFunctions);
2379 while(
auto fun =
dynamic_cast<TF1 *
>(fiter())) {
2380 TF1 *fclon =
dynamic_cast<TF1 *
>(fun->Clone());
2381 theFunctions->Add(fclon);
2382 fclon->SetParent(oldh);
2391 if (!itemslot)
return;
2397 TNamed *n = (TNamed*)
fxWaitingList->FindObject(itemname.Data());
2399 n->SetTitle(destination);
2401 fxWaitingList->Add(
new TNamed(itemname.Data(), destination));
2411 TNamed *n = (TNamed*)
fxWaitingList->FindObject(itemname.Data());
2413 const char *dest = n->GetTitle();
2414 if (dest && (strlen(dest) == 0)) dest =
nullptr;
2425 TIter next(gROOT->GetListOfCanvases());
2426 while (
auto pad = (TPad *) next()) {
2430 while (
auto subpad = pad->GetPad(number++))
TGo4BrowserObjProxy(TGo4Slot *slot, TObject *obj, Bool_t owner)
Bool_t Use() const override
virtual ~TGo4BrowserObjProxy()
Bool_t AssignObject(TGo4Slot *slot, TObject *obj, Bool_t owner) override
void Update(TGo4Slot *slot, Bool_t strong) override
static Bool_t CompareAxisValues(Double_t v1, Double_t v2, Double_t scale)
virtual ~TGo4BrowserProxy()
void CheckWaitingList(TGo4Slot *source)
Int_t RequestBrowserObject(const char *name, Int_t wait_time=0)
void RenameMemoryItem(const char *itemname, const char *newname)
static bool CanExportItem(int cando)
void ImportObjectFromFile(const char *filename, const char *filedir, const char *format)
Bool_t SaveBrowserToFile(const char *filename, Bool_t prefetch=kFALSE, const char *selectedpath=nullptr, const char *description=nullptr)
Bool_t SaveItemToFile(const char *itemname, const char *filename, const char *subfolder=nullptr)
TGo4AnalysisProxy * FindAnalysis(const char *itemname=nullptr)
Bool_t DefineTreeName(const char *itemname, TString &treename)
Bool_t IsCanDelete(TGo4Slot *slot) const
static void SetLinkedName(TGo4Slot *slot, const char *itemname)
void SetItemKind(TGo4Slot *slot, Int_t kind, const char *classname, const char *info, Int_t sizeinfo)
TGo4Slot * FindServerSlot(Bool_t databranch, Int_t kind=0)
void MakeDabcList(TObjArray *arr)
void PerformTreeDraw(const char *treename, const char *Xexp, const char *Yexp, const char *Zexp, const char *cutcond, const char *hname, TString &createdhistoname)
void Initialize(TGo4Slot *slot) override
Bool_t DeleteDataSource(TGo4Slot *itemslot)
TGo4Slot * BrowserSlot(const char *item=nullptr)
static bool CanCloseItem(int cando)
Bool_t DefineLeafName(const char *itemname, const char *treename, TString &leafname)
TGo4ServerProxy * DefineServerProxy(const char *itemname)
void MakeFilesList(TObjArray *arr)
TGo4Slot * BrowserTopSlot()
TGo4ServerProxy * DefineAnalysisObject(const char *itemname, TString &analysisname)
TGo4Slot * ItemSlot(const char *itemname)
static bool CanExecuteItem(int cando)
Int_t ItemSizeInfo(TGo4Slot *slot)
Bool_t ProduceExplicitCopy(const char *itemname, const char *tgtpath=nullptr, Bool_t forcerequest=kFALSE)
TObject * GetBrowserObject(const char *name, Int_t update=0)
void ToggleMonitoring(Int_t period)
Int_t UpdateAllMonitoredObjects()
void CreateMemoryFolder(const char *foldername=nullptr)
void CreateMemorySubfolder(const char *itemname, const char *newfoldername)
static bool CanExpandItem(int cando)
static void SetItemCanDo(TGo4Slot *slot, Int_t cando)
TString SaveToMemory(const char *pathname, TObject *obj, Bool_t ownership, Bool_t overwrite=kFALSE)
static bool CanClearItem(int cando)
Int_t ItemCanDo(const char *name)
void SetProtectionBits(TGo4Slot *slot, Int_t delprot, Int_t clearprot)
void ExportItemsTo(TObjArray *items, Bool_t fetchitems, const char *filename, const char *filedir, const char *format, const char *description)
Int_t ItemKind(const char *name)
TGo4Slot * DataSlot(const char *item)
static Int_t CompareAxis(TAxis *ax1, TAxis *ax2)
Int_t GetCalcSize(TGo4Slot *slot)
Bool_t ConnectHServer(const char *servername, Int_t portnumber, const char *basename, const char *userpass, const char *filter)
Bool_t DefineFileObject(const char *itemname, TString &filedataslot, const char **filepath)
TGo4Slot * BrowserMemorySlot()
void RedrawItem(const char *itemname)
void SetCanDelete(TGo4Slot *slot, Bool_t on=kTRUE)
void GetProtectionBits(TGo4Slot *slot, Int_t &delprot, Int_t &clearprot)
static const char * ItemTime(TGo4Slot *slot)
void FetchItem(const char *itemname, Int_t wait_time=0)
TGo4ServerProxy * FindServer(const char *itemname=nullptr, Bool_t asanalysis=kTRUE)
TVirtualTreePlayer * fDummyTreePlayer
void SetItemsFilter(Int_t filter)
void SetItemMonitored(TGo4Slot *slot, Bool_t on=kTRUE)
void CopyClipboard(const char *tgtpath, Bool_t forcerequest=kFALSE)
static void SaveAxisTimeProperties(TGraph *gr, Bool_t &timedisplay, TString &format)
void ClearMemoryItem(const char *itemname)
static const char * ItemInfo(TGo4Slot *slot)
Int_t UpdateVisibleAnalysisObjects(bool checkmonitor)
void BrowserSlotName(const char *item, TString &res) const
void Finalize(TGo4Slot *slot) override
static Bool_t UpdateObjectContent(TObject *obj, TObject *newobj, Int_t *hasrebinx=nullptr, Int_t *hasrebiny=nullptr)
Bool_t UpdateAnalysisItem(const char *itemname, TObject *obj=nullptr)
Bool_t BrowserItemName(TGo4Slot *itemslot, TString &res)
static Int_t DefineItemProperties(Int_t kind, TClass *cl, TString &pixmap)
static void UpdateListOfFunctions(TGraph *oldgr, TGraph *newgr)
preserve fit result functions contained in any graph-like objects
void AddServerProxy(TGo4ServerProxy *serv, const char *slotname, const char *info)
void AddWaitingList(TGo4Slot *itemslot, const char *destination=nullptr)
void AddToClipboard(const char *itemname)
Bool_t IsItemRemote(const char *name)
Bool_t DefineRelatedObject(const char *itemname, const char *objectname, TString &objectitem, Int_t mask=3)
static void RestoreAxisTimeProperties(TGraph *gr, Bool_t &timedisplay, TString &format)
void DataSlotName(const char *item, TString &res) const
static bool CanInfoItem(int cando)
static bool CanEditItem(int cando)
static const char * GetLinkedName(TGo4Slot *slot)
static const char * ItemDate(TGo4Slot *slot)
Bool_t ProcessEvent(TGo4Slot *slot, TGo4Slot *source, Int_t id, void *param) override
void InformBrowserUpdate()
Bool_t HandleTimer(TTimer *timer) override
static bool CanDrawItem(int cando)
const char * ItemClassName(const char *name)
TString FindItemInAnalysis(const char *objname)
TGo4ServerProxy * DefineServerObject(const char *itemname, TString *objname=nullptr, Bool_t onlyanalysis=kTRUE)
Int_t CalculateFolderSizes(TGo4Slot *topslot)
Bool_t IsItemMonitored(TGo4Slot *slot) const
TClass * ItemClass(const char *name)
void DoItemMonitor(TGo4Slot *slot)
Bool_t ConnectDabc(const char *nodename)
void RequestObjectStatus(const char *name, TGo4Slot *tgtslot)
TString FindItem(const char *objname)
Bool_t IsAnalysisItem(const char *name)
Bool_t IsClipboard() const
void MakeHttpList(TObjArray *arr)
void UpdateBrowserContent()
void MakeHServerList(TObjArray *arr)
void OpenFile(const char *fname)
static bool CanDragItem(int cando)
void SetCalcSize(TGo4Slot *slot, Int_t size)
void CheckPictureMonitor(TGo4Slot *slot)
static void UpdateHistoListOfFunctions(TH1 *oldh, TH1 *newh)
JAM24: also preserve fit result functions contained in any TH1.
static void SetItemTimeDate(TGo4Slot *slot, const char *stime=nullptr, const char *sdate=nullptr)
Bool_t UpdateObjectInFile(const char *itemname, const char *fileslotname, const char *filepath)
virtual Bool_t UpdateFrom(TGo4Condition *cond, Bool_t counts)
Copy values from cond to this.
virtual void SetChanged(Bool_t on=kTRUE)
Bool_t Connect(const char *nodename)
Bool_t UpdateObjectInFile(const char *filepath, TObject *obj)
ABC for all entries that can be kept in a dynamic list.
virtual void Reset()
Resets this entry to an initial status.
This class manages all export and import conversions of objects to/from different file formats like a...
void SetOutFileComment(const char *comment=nullptr)
void SetStartDir(const char *dir=nullptr)
void SetOutFile(const char *filename=nullptr)
void Export(TObject *ob, Go4Export_t format)
Conversion of object into selected file format in working dir.
void SetCurrentDir(const char *dir=nullptr)
TH1 * ImportHistogram(const char *filename, Go4Import_t format)
create imported histogram from file of given name
void SetHServConfig(const char *servername, Int_t portnumber, const char *basename, const char *userpass, const char *filter)
Bool_t RefreshNamesList() override
Bool_t next(Bool_t goesinto=kTRUE)
const char * getfullname()
TGo4Slot * getslot() const
const char * getclassname()
Int_t getflag(const char *flagname)
Int_t levelchange() const
TGo4Slot * GetLink() const
static const char * Message(Int_t prio, const char *text,...) GO4_PRINTF2_ARGS
Display a message.
Int_t RequestObject(const char *source, const char *targetslot, Int_t waittime_millisec=0)
Bool_t AssignObject(TGo4Slot *slot, TObject *obj, Bool_t owner) override
Picture cconfiguration in Go4.
Int_t GetNumObjNames() const
const char * GetObjName(Int_t n) const
TGo4Picture * FindPic(Int_t posy, Int_t posx)
virtual const char * GetContainedClassName() const
static TClass * GetClass(const char *classname, Bool_t load=kFALSE)
special base class for remote data servers like DABC, HTTP, hist server
virtual Bool_t IsConnected() const
virtual Bool_t IsGo4Analysis() const
virtual const char * GetServerName() const
virtual void RemoteTreeDraw(const char *treename, const char *varexp, const char *cutcond, const char *hname)
virtual Bool_t RequestObjectStatus(const char *objectname, TGo4Slot *tgtslot)
virtual Bool_t UpdateAnalysisObject(const char *objectname, TObject *obj)
virtual Bool_t DelayedRefreshNamesList(Int_t delay_sec)
virtual Int_t NumberOfWaitingProxyes()
TGo4Slot * GetParent() const
TString GetFullName(TGo4Slot *toparent=nullptr)
virtual TGo4ObjectManager * GetOM() const
virtual void Update(Bool_t strong=kFALSE)
Bool_t GetIntPar(const char *name, Int_t &value) const
Bool_t IsParent(const TGo4Slot *slot) const
TGo4Proxy * GetProxy() const
void SetProxy(TGo4Proxy *cont)
TGo4Slot * GetSlot(const char *name, Bool_t force=kFALSE)
TGo4Slot * FindChild(const char *name) const
void ForwardEvent(TGo4Slot *source, Int_t id, void *param=nullptr)
static void ProduceFolderAndName(const char *fullname, TString &foldername, TString &objectname)
virtual void ProduceFullName(TString &name, TGo4Slot *toparent=nullptr)
Bool_t AssignObject(TObject *obj, Bool_t owner)
Bool_t ShiftSlotBefore(TGo4Slot *slot, TGo4Slot *before)
void DeleteChilds(const char *startedwith=nullptr)
void SetPar(const char *name, const char *value)
void RemovePar(const char *name)
void SetIntPar(const char *name, Int_t value)
TObject * GetAssignedObject()
const char * GetPar(const char *name) const
TGo4Slot * GetChild(Int_t n) const
TGo4Slot * GetNext() const