4 #include "KVIDGridEditor.h"
14 #include <KVSpIdGUI.h>
15 #include <KVZAFinderDialog.h>
17 #include "KVTreeAnalyzer.h"
18 #include <KVHistogram.h>
19 #include "KVTestIDGridDialog.h"
20 #include "KVItvFinderDialog.h"
37 fSpiderOption =
"DRLF";
69 AddMethod(
"SaveCurrentGrid");
70 AddMethod(
"SpiderIdentification");
71 AddMethod(
"ChangeMasses");
72 AddMethod(
"ChangeCharges");
73 AddMethod(
"SelectLinesByZ");
74 AddMethod(
"MakeScaleX");
75 AddMethod(
"MakeScaleY");
76 AddMethod(
"SetSelectedColor");
77 AddMethod(
"SetPointStyle");
78 AddMethod(
"SetPointSize");
79 AddMethod(
"SetVarXVarY");
80 AddMethod(
"SetRunList");
81 AddMethod(
"AddParameter");
82 AddMethod(
"SetXScaleFactor");
83 AddMethod(
"SetYScaleFactor");
84 AddMethod(
"SetSVGMode");
86 ft =
new TF1(
"tranlation",
"(x+[0])", 0, 70000);
87 fs =
new TF1(
"scale",
"(x-[0])*[1]+[0]", 0, 70000);
88 fsy =
new TF1(
"scale_y",
"(x-[0])*[1]+[0]", 0, 70000);
90 frx =
new TF2(
"rotation_x",
"(x-[0])*TMath::Cos([2])-(y-[1])*TMath::Sin([2])+[0]", 0, 70000);
91 fry =
new TF2(
"rotation_y",
"(x-[0])*TMath::Sin([2])+(y-[1])*TMath::Cos([2])+[1]", 0, 70000);
96 lplabel->SetOwner(
kTRUE);
98 lplabel2->SetOwner(
kTRUE);
100 lplabel3->SetOwner(
kTRUE);
102 lplabel4->SetOwner(
kTRUE);
104 lplabel5->SetOwner(
kTRUE);
128 dynamic_cast<TGMainFrame*
>(fCanvas->GetCanvasImp())->Connect(
"CloseWindow()",
"KVIDGridEditor",
this,
"CanvasWasClosed()");
129 fPad = fCanvas->cd();
132 if (TheHisto) TheHisto->Draw(
"col");
164 void KVIDGridEditor::SetDefault()
178 itrans = iact = iopt = 0;
217 dynamic_cast<TGMainFrame*
>(fCanvas->GetCanvasImp())->Disconnect(
"CloseWindow()",
"KVIDGridEditor",
this,
"CanvasWasClosed()");
242 ResetColor(ListOfLines);
243 ListOfLines->Clear();
245 if (
option.Contains(
"AL")) {
256 if (!IsClosed()) TheGrid->UnDraw();
280 fCanvas->SaveAs(
Form(
"%s/gIDGridEditorPrint-%d.png", dir.
Data(), fSVGIndex));
316 if (ownhisto)
delete TheHisto;
317 if (fCanvas)
delete fCanvas;
338 if (gIDGridEditor ==
this) gIDGridEditor = 0x0;
339 dynamic_cast<TGMainFrame*
>(fCanvas->
GetCanvasImp())->Disconnect(
"CloseWindow()",
"KVIDGridEditor",
this,
"CanvasWasClosed()");
370 void KVIDGridEditor::init()
372 AddTransformation(
"T_{X}");
373 AddTransformation(
"T_{Y}");
374 AddTransformation(
"R_{Z}");
375 AddTransformation(
"S_{X}");
376 AddTransformation(
"S_{Y}");
377 AddTransformation(
"S_{XY}");
378 AddTransformation(
"S_{C}");
382 AddAction(
"#Leftarrow");
388 AddGridOption(
"Select", lplabel3);
390 AddGridOption(
"Edit", lplabel4);
391 AddGridOption(
"Delete", lplabel4);
392 AddGridOption(
"Line", lplabel4);
393 AddGridOption(
"Cut", lplabel4);
394 AddGridOption(
"Info", lplabel4);
395 AddGridOption(
"Fit", lplabel4);
396 AddGridOption(
"Test", lplabel4);
397 AddGridOption(
"Mass", lplabel4);
398 AddGridOption(
"More", lplabel4);
400 ConstructModulator();
407 SetPiedestal(0., 0.);
418 void KVIDGridEditor::ConstructModulator()
430 templabel =
new TPaveLabel(x1, y1, x2, y2,
"+",
"NDC");
435 lplabel5->
Add(templabel);
438 y1 = 0.90 - i * 0.06;
441 modulator =
new TPaveLabel(x1, y1, x2, y2,
Form(
"%d", imod),
"NDC");
446 lplabel5->
Add(modulator);
449 y1 = 0.90 - i * 0.06;
452 templabel =
new TPaveLabel(x1, y1, x2, y2,
"-",
"NDC");
457 lplabel5->
Add(templabel);
459 lplabel5->
Execute(
"SetTextSize",
"0.625");
466 void KVIDGridEditor::AddTransformation(
TString label)
481 lplabel->
Add(templabel);
491 void KVIDGridEditor::AddAction(
TString label)
506 lplabel2->
Add(templabel);
531 thelist->
Add(templabel);
543 void KVIDGridEditor::RecurseFileStructureFindHistos(
TString& hist_names,
TDirectory* the_directory)
548 if (!the_directory)
return;
551 while ((key = (
TKey*)next_key())) {
572 TString KVIDGridEditor::ListOfHistogramInMemory()
587 while ((obj = nextmem())) {
595 while ((f = (
TFile*)next())) {
600 RecurseFileStructureFindHistos(HistosNames, f);
602 HistosNames.
Begin(
" ");
603 while (!HistosNames.
End()) {
605 if (g !=
"gIDGridEditorDefaultHistogram") histos.
Add(
new TObjString(
g.Data()));
612 while ((canv = (
TCanvas*)nextc())) {
614 if (strcmp(canv->
GetName(),
"gIDGridEditorCanvas")) {
617 while ((obj1 = next_step1())) {
621 TIter next_step2(((
TPad*)obj1)->GetListOfPrimitives());
622 while ((obj2 = next_step2())) {
623 printf(
"%s\n", obj2->
GetName());
660 HistosNames +=
Form(
" %s",
s->GetString().Data());
677 if (!TheGrid)
return "";
684 Iter = str.Next(kTRUE);
693 Iter = str.Next(kTRUE);
711 KVString Listo = ListOfHistogramInMemory();
712 TString Select = PreselectHistogram(Listo);
719 Choices +=
"Current ";
721 else Default =
"Dummy";
725 else if (Select ==
"") {
730 Choices += Select.
Data();
735 while (!Listo.
End()) {
737 if (s != Select) Choices +=
Form(
"%s ", s.Data());
751 else Answer = Default;
753 if (!Answer.
Contains(
"Current") && ownhisto) {
761 if ((TheHistoChoice = (
TH2*)
gROOT->FindObject(Answer.
Data()))) TheHisto = TheHistoChoice;
762 else if (
gFile && (TheHistoChoice = (
TH2*)
gFile->Get(Answer.
Data()))) TheHisto = TheHistoChoice;
763 else if (
gFile && (TheHistoChoice = (
TH2*)
gFile->FindObjectAnyFile(Answer.
Data()))) TheHisto = TheHistoChoice;
764 else if (
gFile && (TheHistoChoice = (
TH2*)
gFile->FindObjectAny(Answer.
Data()))) TheHisto = TheHistoChoice;
765 else if (gTreeAnalyzer && (TheHistoChoice = (
TH2*)gTreeAnalyzer->
GetHistogram(Answer.
Data()))) TheHisto = TheHistoChoice;
766 else if ((TheHistoChoice = FindInCanvases(Answer.
Data()))) TheHisto = TheHistoChoice;
767 else Answer =
"Dummy";
784 if ((TmpH = (
TH2*)
gROOT->FindObject(hname.
Data())))
delete TmpH;
785 TheHisto =
new TH2F(hname.
Data(), hname.
Data(), 2048, 0, Xmax, 2048, 0, Ymax);
790 cout <<
"ERROR: KVIDGridEditor::SetHisto(): '" << hh->
GetName() <<
"' must be a 2D histogram !" << endl;
794 if ((ownhisto) && (TheHisto)) {
803 fPad = fCanvas->
cd();
810 TheHisto->
Draw(
"col");
823 TH2* KVIDGridEditor::FindInCanvases(
const Char_t* histoname)
829 while ((cc = (
TCanvas*)nextc())) {
830 if (strcmp(cc->GetName(),
"gIDGridEditorCanvas")) {
831 if ((obj = cc->FindObject(histoname))) {
844 void KVIDGridEditor::DrawAtt(
Bool_t piv)
854 if (!piv) SetPivot(0., 0.);
855 else fPivot->
Draw(
"P");
857 if (!piv) SetPiedestal(0., 0.);
858 else fPivot->
Draw(
"P");
872 cout <<
"ERROR: KVIDGridEditor::SetHisto(): invalid pointer on the grid !" << endl;
906 if (!strcmp(GridName.
Data(),
"")) {
908 Bool_t proposename =
false;
909 if (TheGrid) Answer = TheGrid->
GetName();
915 new KVInputDialog(
gClient->GetDefaultRoot(),
"Enter the name of your grid :", &Answer, &okpressed);
916 if (!okpressed)
return;
917 GridName = Answer.
Data();
918 if (proposename && (!strcmp(TheHisto->
GetName(), Answer.
Data()))) sethisto =
false;
922 if (!gIDGridManager)
return;
924 cout <<
"WARNING: KVIDGridEditor::SetGrid(): Unknown grid named '" << GridName.
Data() <<
"' !" << endl;
927 else SetGrid(tempgrid, sethisto);
961 fPivot->
SetName(
"ThePiedestal");
963 else fPivot->
SetPoint(1, ppdx, ppdy);
1003 lplabel->
Execute(
"SetFillColor", fBlackMode ?
"kBlack" :
"kWhite");
1008 else if (lplabel2->
Contains(label)) {
1011 DispatchOrder(label);
1013 else if (lplabel4->
Contains(label)) {
1014 DispatchOrder(label);
1016 else if (lplabel3->
Contains(label)) {
1017 lplabel3->
Execute(
"SetFillColor", fBlackMode ?
"kBlack" :
"kWhite");
1021 SelectLines(
"Select");
1024 else if (lplabel5->
Contains(label) && (label != modulator)) {
1035 else if (lplabel5->
Contains(label) && (label != modulator)) {
1041 if (lplabel5->
Contains(label) && (label != modulator)) {
1048 if (lplabel5->
Contains(label) && (label != modulator)) {
1050 ChangeStep(label->
GetTitle(), 100);
1053 else if (lplabel3->
Contains(label)) {
1054 lplabel3->
Execute(
"SetFillColor",
"kGreen");
1101 if (!(aoemode))
return;
1120 Double_t ddX = (X1 + X0) * 0.5 - px;
1122 if (distX >= 0.5)
return;
1130 Double_t ddY = (Y1 + Y0) * 0.5 - py;
1132 if (distY >= 0.5)
return;
1134 if ((distX <=
size) && (distY <=
size))
return;
1136 dX =
TMath::Nint(ddX * (0.05 + 0.05 * venermode));
1137 dY =
TMath::Nint(ddY * (0.05 + 0.05 * venermode));
1144 if ((X0 - dX > 0) && (X1 - dX < NbinsX)) {
1148 if ((Y0 - dY > 0) && (Y1 - dY < NbinsY)) {
1186 SelectLines(
"Select");
1196 if (ListOfLines->
Contains(select))
return;
1201 Int_t zmin, zmax, amin, amax;
1202 if (LastZ == SeleZ) {
1208 else if (LastZ < SeleZ) {
1222 for (
int Z = zmin; Z <= zmax; Z++) {
1229 if ((
line->GetA() > amin) && (
line->GetA() < amax)) {
1235 if ((
line->GetZ() == zmin) && (
line->GetA() > amin)) {
1240 if ((
line->GetZ() == zmax) && (
line->GetA() < amax)) {
1245 if ((
line->GetZ() != zmax) && (
line->GetZ() != zmin)) {
1256 if (drawmode) drawmode =
false;
1277 SetPiedestal(x0, y0);
1284 const char* who = WhoIsSelected();
1288 else if (!strcmp(who,
"T_{X}")) TranslateX(sign);
1289 else if (!strcmp(who,
"T_{Y}")) TranslateY(sign);
1290 else if (!strcmp(who,
"R_{Z}")) RotateZ(sign);
1291 else if (!strcmp(who,
"S_{X}")) ScaleX(sign);
1292 else if (!strcmp(who,
"S_{Y}")) ScaleY(sign);
1293 else if (!strcmp(who,
"S_{XY}")) ScaleXY(sign);
1294 else if (!strcmp(who,
"S_{C}")) ScaleCurvature(sign);
1298 if ((
event ==
kESC) && (TheHisto)) Unzoom();
1307 void KVIDGridEditor::ZoomSelected()
1309 if (!TheHisto)
return;
1315 if ((ratio2 - ratio1 > 0.05)) {
1324 if ((ratio2 - ratio1 > 0.05)) {
1328 xmax = xmin = ymax = ymin = 0.;
1336 void KVIDGridEditor::DispatchOrder(
TPaveLabel* label)
1340 if (commande.Contains(
"#Leftarrow")) Undo();
1341 else if (commande.Contains(
"0")) SetPivot(0, 0);
1342 else if (commande.Contains(
"#odot")) Unzoom();
1343 else if (commande.Contains(
"Lz")) SetLogz();
1344 else if (commande.Contains(
"Ly")) SetLogy();
1345 else if (commande.Contains(
"Lx")) SetLogx();
1346 else if (commande.Contains(
"Cut")) NewCut();
1347 else if (commande.Contains(
"Line")) NewLine();
1348 else if (commande.Contains(
"Edit")) SetEditable(label);
1349 else if (commande.Contains(
"Fit")) {
1356 else if (commande.Contains(
"Test")) {
1363 else if (commande.Contains(
"Mass")) {
1370 else if (commande.Contains(
"Info")) {
1378 else if (commande.Contains(
"More")) {
1381 SuggestMoreAction();
1385 else if (commande.Contains(
"Delete")) {
1386 if (!TheGrid)
return;
1388 if (color == kRed) {
1393 else if (color == kWhite || color == kBlack) {
1399 else cout <<
"WARNING: KVIDGridEditor::DispatchOrder(): unknown order '" << commande <<
"' !" << endl;
1406 void KVIDGridEditor::SetEditable(
TPaveLabel* label)
1411 if (iseditable) label->
SetFillColor(fBlackMode ? kBlack : kWhite);
1414 else label->
SetFillColor(fBlackMode ? kBlack : kWhite);
1424 void KVIDGridEditor::SelectLines(
const Char_t* label)
1426 if (!TheGrid)
return;
1431 if (title.Contains(
"All")) {
1442 ListOfLines->R__FOR_EACH(
KVIDentifier, SetLineColor)(SelectedColor);
1443 ListOfLines->R__FOR_EACH(
KVIDentifier, SetMarkerColor)(SelectedColor);
1447 if (title.Contains(
"Select")) {
1448 if (color == kWhite || color == kBlack) {
1450 ResetColor(ListOfLines);
1451 ListOfLines->
Clear();
1453 if (color == kGreen) {
1454 ListOfLines->R__FOR_EACH(
KVIDentifier, SetLineColor)(SelectedColor);
1466 void KVIDGridEditor::NewLine()
1468 if (!TheGrid)
return;
1485 "Choose class of new identifier :",
1490 if (!okpressed)
return;
1492 else cut_class = cut_choices;
1500 if (fDebug) cout <<
"INFO: KVIDGridEditor::NewLine(): New Line has been added to the current grid..." << endl;
1505 void KVIDGridEditor::NewCut()
1511 if (!TheGrid)
return;
1531 if (!strcmp(cut_default,
"")) {
1532 cut_types.
Begin(
" ");
1533 cut_default = cut_types.
Next();
1536 "Choose class of new cut :",
1548 else cut_class = cut_types;
1557 if (fDebug) cout <<
"INFO: KVIDGridEditor::NewCut(): New Cut has been added to the current grid..." << endl;
1565 void KVIDGridEditor::NewInfo()
1568 if (!TheGrid)
return;
1576 if (info_choices ==
"") info_choices =
gEnv->
GetValue(
Form(
"%s.InfoClass",
"KVIDGraph"),
"");
1579 if (info_choices ==
"") info_choices =
gEnv->
GetValue(
Form(
"%s.DefaultInfoClass",
"KVIDGraph"),
"");
1584 KVString info_types = info_choices;
1589 if (!strcmp(info_default,
"")) {
1590 info_types.
Begin(
" ");
1591 info_default = info_types.
Next();
1594 "Choose class of new info :",
1596 info_default.
Data(),
1606 else info_class = info_types;
1611 Info(
"NewInfo",
"Adding new info contour or line of class '%s'", info_class.
Data());
1616 if (fDebug) cout <<
"INFO: KVIDGridEditor::NewInfo(): New info has been added to the current grid..." << endl;
1626 return fPivot->
GetX()[0];
1635 return fPivot->
GetY()[0];
1645 return fPivot->
GetX()[1];
1655 return fPivot->
GetY()[1];
1665 if (!TheGrid)
return;
1666 if (!TheHisto)
return;
1677 new KVSpIdGUI(TheGrid, TheHisto, x0, y0, pdx, pdy, fSpiderOption.
Data());
1806 void KVIDGridEditor::TestGrid()
1808 if (!TheGrid)
return;
1809 if (!TheHisto)
return;
1813 if (fDebug) cout <<
"INFO: KVIDGridEditor::TestGrid(): testing the current grid..." << endl;
1820 void KVIDGridEditor::FitGrid()
1822 if (!TheGrid)
return;
1829 cm->Action(fitter, m);
1832 if (fDebug) cout <<
"INFO: KVIDGridEditor::FitGrid(): fitting grid '" << TheGrid->
GetName() <<
"'..." << endl;
1839 void KVIDGridEditor::SuggestMoreAction()
1849 if (!okpressed)
return;
1852 if (!TheGrid)
return;
1855 cm->Action(TheGrid, m);
1858 else if ((m =
IsA()->GetMethodAllAny(Answer.
Data()))) {
1860 cm->Action(
this, m);
1863 else cout <<
"INFO: KVIDGridEditor::SuggestMoreAction(): '" << Answer <<
"' not implemented..." << endl;
1874 if (!TheGrid)
return;
1875 if (!ListOfLines)
return;
1877 ResetColor(ListOfLines);
1878 ListOfLines->
Clear();
1886 if ((found == -1) || (!
line))
continue;
1902 if (!TheGrid)
return;
1913 "KVIDGridEditor::SaveCurrentGrid",
Form(
"Do you wat to save the grid here : %s", fn.
Data()),
1917 if (ret_code ==
kMBYes) {
1923 const char* filetypes[] = {
1924 "ID Grid files",
"*.dat",
1937 if (!filenam.
Contains(
'.')) filenam +=
".dat";
1955 TIter it(ListOfLines);
1959 for (
int ii = 0; ii <
id->GetN(); ii++) {
1960 double xx =
id->
GetX()[ii];
1961 double yy =
id->GetY()[ii];
1963 if (ref) dyref =
abs(yy - ref->
Eval(xx)) / 2;
1965 TH1* hh = TheHisto->
ProjectionY(
"toto", xbin - nbin, xbin + nbin,
"goff");
1967 int nfound = spec.
Search(hh, dyref,
"goff", 0.05);
1974 for (
int ip = 0; ip < nfound; ip++) {
1976 TheGrid->
Identify(xx, xpeaks[ip], &idr);
1978 if (ypeaks[ip] > threshold && (idr.
Z ==
id->GetZ() && idr.
A ==
id->GetA())) {}
1981 if (
abs(xpeaks[ip] - yy) < dy) {
1982 dy =
abs(xpeaks[ip] - yy);
1986 if (ygood > 0)
id->GetY()[ii] = ygood;
1996 void KVIDGridEditor::OpenRootFile()
1998 static TString dir(
"$(HISTOROOT)");
2001 if (dir ==
"$(HISTOROOT)" &&
gSystem->
Getenv(
"HISTOROOT")) {
2007 const char* filetypes[] = {
"Root files",
"*.root",
"All files",
"*", 0, 0};
2025 void KVIDGridEditor::ChooseSelectedColor()
2030 Choices +=
"kBlack kGreen kBlue kRed kYellow kCyan kMagenta";
2035 if (!okpressed)
return;
2055 if (!TheGrid)
return;
2075 void KVIDGridEditor::ChangeStep(
const char* title,
Int_t dstep)
2078 if (commande.Contains(
"+")) {
2081 else if (commande.Contains(
"-")) {
2083 if (imod <= 0)imod = 1;
2094 void KVIDGridEditor::SetLogz()
2104 void KVIDGridEditor::SetLogy()
2114 void KVIDGridEditor::SetLogx()
2124 void KVIDGridEditor::Unzoom()
2139 void KVIDGridEditor::Undo()
2145 if (!TheGrid)
return;
2151 Form(
"This will undo all changes to the grid. Are you sure, %s?", username.
Data()),
2152 kMBIconExclamation, kMBOk | kMBCancel, &ret_val);
2154 if (ret_val & kMBOk) {
2155 if (ListOfLines && ListOfLines->
GetEntries()) {
2170 const char* KVIDGridEditor::WhoIsSelected()
2173 TIter nextlabel(lplabel);
2184 void KVIDGridEditor::TranslateX(
Int_t Sign)
2186 if (!TheGrid)
return;
2187 if (!ListOfLines)
return;
2188 if (ListOfLines->
IsEmpty())
return;
2199 if (fDebug) cout <<
"INFO: KVIDGridEditor::TranslateX(): translation on the X axis (" << (
Sign > 0 ?
"+" :
"-") << step <<
") !" << endl;
2207 void KVIDGridEditor::TranslateY(
Int_t Sign)
2209 if (!TheGrid)
return;
2210 if (!ListOfLines)
return;
2211 if (ListOfLines->
IsEmpty())
return;
2222 if (fDebug) cout <<
"INFO: KVIDGridEditor::TranslateY(): translation on the Y axis (" << (
Sign > 0 ?
"+" :
"-") << step <<
") !" << endl;
2235 if (!TheHisto)
return;
2256 if (X0 >= X1) X0 = X1 - 1;
2258 if ((X0 - dX) < 0) ax->
SetRange(0, X1 - X0);
2260 else ax->
SetRange(X0 - dX, X1 - dX);
2270 if (Y0 >= Y1) Y0 = Y1 - 1;
2272 if ((Y0 - dY) < 0) ax->
SetRange(0, Y1 - Y0);
2274 else ax->
SetRange(Y0 - dY, Y1 - dY);
2284 void KVIDGridEditor::RotateZ(
Int_t Sign)
2286 if (!TheGrid)
return;
2287 if (!ListOfLines)
return;
2288 if (ListOfLines->
IsEmpty())
return;
2291 if (step >= 45.) step = 45.;
2294 x0 = fPivot->
GetX()[0];
2295 y0 = fPivot->
GetY()[0];
2300 ListOfLines->R__FOR_EACH(
KVIDentifier, Scale)(frx, fry);
2303 if (fDebug) cout <<
"INFO: KVIDGridEditor::RotateZ(): rotation around the Z axis (" << (
Sign > 0 ?
"+" :
"-") << step <<
") !" << endl;
2354 if (!TheGrid)
return;
2355 if (!ListOfLines)
return;
2356 if (ListOfLines->
IsEmpty())
return;
2358 Double_t step = 0.05 * (imod / 100.);
2362 x0 = fPivot->
GetX()[0];
2372 fBx = fs->
Eval(fBx);
2374 if (fDebug)
Info(
"ScaleX",
"scaling on the X axis (*%f) !", factor);
2375 KVEnv scale_factors(
"KVIDGridEditor_scalings.dat");
2376 scale_factors.AddCommentLine(
"# Cumulative linear scalings applied to grids with KVIDGridEditor");
2377 scale_factors.AddCommentLine(
"# Parameters are a0,a1 of linear transform using pol1 X -> a0 + a1*X");
2378 scale_factors.SetValue(
Form(
"%s.X",TheGrid->
GetName()),
Form(
"%g %g", fBx, fAx));
2379 scale_factors.SaveLevel(kEnvLocal);
2390 if (!TheGrid)
return;
2391 if (!ListOfLines)
return;
2392 if (ListOfLines->
IsEmpty())
return;
2394 Double_t step = 0.05 * (imod / 100.);
2398 y0 = fPivot->
GetY()[0];
2408 fBy = fs->
Eval(fBy);
2410 if (fDebug)
Info(
"ScaleY",
"scaling on the Y axis (*%f) !", factor);
2412 KVEnv scale_factors(
"KVIDGridEditor_scalings.dat");
2413 scale_factors.AddCommentLine(
"# Cumulative linear scalings applied to grids with KVIDGridEditor");
2414 scale_factors.AddCommentLine(
"# Parameters are a0,a1 of linear transform using pol1 X -> a0 + a1*X");
2415 scale_factors.SetValue(
Form(
"%s.Y",TheGrid->
GetName()),
Form(
"%g %g", fBy, fAy));
2416 scale_factors.SaveLevel(kEnvLocal);
2425 void KVIDGridEditor::ScaleXY(
Int_t Sign)
2427 if (!TheGrid)
return;
2428 if (!ListOfLines)
return;
2429 if (ListOfLines->
IsEmpty())
return;
2431 Double_t step = 0.05 * (imod / 100.);
2434 x0 = fPivot->
GetX()[0];
2435 y0 = fPivot->
GetY()[0];
2440 ListOfLines->R__FOR_EACH(
KVIDentifier, Scale)(fs, fsy);
2447 fBx = fs->
Eval(fBx);
2449 fBy = fsy->
Eval(fBy);
2451 if (fDebug)
Info(
"ScaleXY",
"scaling (*%f) !", factor);
2459 void KVIDGridEditor::ScaleCurvature(
Int_t Sign)
2461 if (!TheGrid)
return;
2462 if (!ListOfLines)
return;
2463 if (ListOfLines->
IsEmpty())
return;
2465 Double_t step = 0.05 * (imod / 100.);
2469 TIter nextidd(ListOfLines);
2483 idd->
Scale(frx, fry);
2490 idd->
Scale(frx, fry);
2506 if (!TheGrid)
return;
2509 Ident->
SetLineColor(Ident->
HasMassFits() ? identifier_line_colors_with_mass[(
int)fBlackMode] : identifier_line_colors_no_mass[(
int)fBlackMode]);
2510 Ident->
SetMarkerColor(Ident->
HasMassFits() ? identifier_marker_colors_with_mass[(
int)fBlackMode] : identifier_marker_colors_no_mass[(
int)fBlackMode]);
2530 TIter nextidd(IdentList);
2546 TheHisto->
Draw(
"col");
2551 if (fPivot) fPivot->
Draw(
"P");
2556 if (fDebug) cout <<
"INFO: KVIDGridEditor::ForceUpdate(): Canvas and Co has been updated !" << endl;
2578 fKeyShow =
new TPaveText(0.8, 0.8, 0.9, 0.9,
"brNDC");
2582 fKeyShow->
AddText(tmpStr.Data());
2653 DispatchOrder(label);
2668 DynamicZoom(-1, 0, 0, 0.1);
2677 DynamicZoom(1, 0, 0, 0.1);
2690 gROOT->ForceStyle();
2699 lplabel->
Execute(
"SetFillColor",
"kWhite");
2700 lplabel->
Execute(
"SetTextColor",
"kBlack");
2701 lplabel->
Execute(
"SetLineColor",
"kBlack");
2703 lplabel2->
Execute(
"SetFillColor",
"kWhite");
2704 lplabel2->
Execute(
"SetTextColor",
"kBlack");
2705 lplabel2->
Execute(
"SetLineColor",
"kBlack");
2707 lplabel3->
Execute(
"SetFillColor",
"kWhite");
2708 lplabel3->
Execute(
"SetTextColor",
"kBlack");
2709 lplabel3->
Execute(
"SetLineColor",
"kBlack");
2711 lplabel4->
Execute(
"SetFillColor",
"kWhite");
2712 lplabel4->
Execute(
"SetTextColor",
"kBlack");
2713 lplabel4->
Execute(
"SetLineColor",
"kBlack");
2718 if (dummy != modulator) {
2739 gROOT->ForceStyle();
2748 lplabel->
Execute(
"SetFillColor",
"kBlack");
2749 lplabel->
Execute(
"SetTextColor",
"kWhite");
2750 lplabel->
Execute(
"SetLineColor",
"kWhite");
2752 lplabel2->
Execute(
"SetFillColor",
"kBlack");
2753 lplabel2->
Execute(
"SetTextColor",
"kWhite");
2754 lplabel2->
Execute(
"SetLineColor",
"kWhite");
2756 lplabel3->
Execute(
"SetFillColor",
"kBlack");
2757 lplabel3->
Execute(
"SetTextColor",
"kWhite");
2758 lplabel3->
Execute(
"SetLineColor",
"kWhite");
2760 lplabel4->
Execute(
"SetFillColor",
"kBlack");
2761 lplabel4->
Execute(
"SetTextColor",
"kWhite");
2762 lplabel4->
Execute(
"SetLineColor",
"kWhite");
2767 if (dummy != modulator) {
2781 DispatchOrder(label);
2787 fAutoZoomMode = !fAutoZoomMode;
2791 lplabel3->
Execute(
"SetFillColor",
"kGreen");
2797 ChangeZoomRatio(-1);
2807 if (fPointStyle == 4) {
2827 lplabel3->
Execute(
"SetFillColor", fBlackMode ?
"kBlack" :
"kWhite");
2828 if (color == kWhite || color == kBlack) label->
SetFillColor(kGreen);
2829 if (color == kGreen) label->
SetFillColor(fBlackMode ? kBlack : kWhite);
2830 SelectLines(
"Select");
2839 venermode = !venermode;
2861 MoveHor(1, .2,
false);
2870 MoveHor(-1, .2,
false);
2880 MoveVert(1, .25,
false);
2889 MoveVert(-1, .25,
false);
2903 if (fSVGMode && fKeyShow) {
2917 if (!TheHisto)
return;
2924 if ((XX1 == 1) && (sign == 1))
return;
2925 if ((XX2 == xAxis->
GetNbins() - 1) && (sign == -1))
return;
2927 Int_t dX = (
Int_t)sign * (XX1 - XX2) * 0.25 * speed;
2929 xAxis->
SetRange(XX1 + dX, XX2 + dX);
2937 void KVIDGridEditor::ChangeZoomRatio(
Int_t sign,
Double_t speed)
2939 if (!TheHisto)
return;
2942 if (sign < 0) axis = TheHisto->
GetXaxis();
2948 Int_t dX = (
Int_t) - 1 * (XX1 - XX2) * 0.1 * speed;
2950 axis->
SetRange(XX1 + dX, XX2 - dX);
2961 if (!TheHisto)
return;
2968 if ((XX1 == 1) && (sign == 1))
return;
2969 if ((XX2 == yAxis->
GetNbins() - 1) && (sign == -1))
return;
2971 Int_t dX = (
Int_t)sign * (XX1 - XX2) * 0.25 * speed;
2973 yAxis->
SetRange(XX1 + dX, XX2 + dX);
2981 void KVIDGridEditor::ZoomOnMouse()
2991 void KVIDGridEditor::SelectTrans(
TPaveLabel* label)
2996 lplabel->
Execute(
"SetFillColor", fBlackMode ?
"kBlack" :
"kWhite");
2997 if (color == kWhite || color == kBlack) label->
SetFillColor(kRed);
2998 else if (color == kRed) label->
SetFillColor(fBlackMode ? kBlack : kWhite);
3009 fPointStyle = pstyle;
3035 if ((!TheHisto) || (!TheGrid))
return;
3060 Info(
"ChangeMasses",
"%d lines found for Z=%d", ll->
GetSize(), Z);
3065 Info(
"ChangeMasses",
"A=%d -> A=%d",
id->GetA(),
id->GetA() + dA);
3066 id->SetA(
id->GetA() + dA);
3084 for (
int i =
n - 1; i > 0; i--) {
3087 Info(
"ChangeMasses",
"%d lines found for Z=%d", ll->
GetSize(), Z);
3092 Info(
"ChangeMasses",
"Z=%d -> Z=%d",
id->GetZ(),
id->GetZ() + dZ);
3093 id->SetZ(
id->GetZ() + dZ);
3104 void KVIDGridEditor::AddMethod(
const char* theMethod)
3106 if (fListOfMethods.
IsNull()) fDefaultMethod += theMethod;
3107 fListOfMethods += theMethod;
3108 fListOfMethods +=
" ";
3122 Info(
"PrintScalingRecap",
3123 "Scaling recap:\n X --> %f X + %f\n Y --> %f Y + %f"
3124 , fAx, fBx, fAy, fBy);
3135 ResetColor(TheGrid->
GetCuts());
size_t size(const MatrixT &matrix)
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void char Point_t Rectangle_t WindowAttributes_t Float_t Float_t Float_t Int_t Int_t UInt_t UInt_t Rectangle_t result
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize id
Option_t Option_t TPoint TPoint const char x2
Option_t Option_t TPoint TPoint const char x1
Option_t Option_t TPoint TPoint const char y2
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void char Point_t Rectangle_t WindowAttributes_t Float_t Float_t g
Option_t Option_t TPoint TPoint percent
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize fs
Option_t Option_t TPoint TPoint const char y1
char * Form(const char *fmt,...)
char * StrDup(const char *str)
R__EXTERN TStyle * gStyle
R__EXTERN TSystem * gSystem
Base class for KaliVeda framework.
virtual Bool_t IsType(const Char_t *typ) const
void Copy(TObject &) const override
Make a copy of this object.
Ask user to choose between several options in a drop-down list.
Extension of TEnv to allow the writing of comments in the file.
Extended version of ROOT THashList.
Wrapper for histograms and graphical cuts used by KVTreeAnalyzer.
Base class for particle identification in a 2D map.
void Draw(Option_t *opt="") override
void RemoveIdentifier(KVIDentifier *)
Remove and destroy identifier.
void SetEditable(Bool_t editable=kTRUE) override
void UpdateLastSavedVersion()
update last saved version. mkae copy of current state of graph.
void RemoveInfo(KVIDentifier *)
Remove and destroy cut.
const KVList * GetCuts() const
TVirtualPad * GetPad() const
const KVList * GetInfos() const
void RevertToLastSavedVersion()
virtual void Identify(Double_t, Double_t, KVIdentificationResult *) const =0
const Char_t * GetName() const override
virtual void DrawAndAdd(const TString &type="ID", const TString &classname="KVIDentifier")
KVIDentifier * GetIdentifier(Int_t Z, Int_t A) const
void FindAxisLimits()
Calculate X/Y min/max of all objects in graph.
void WriteAsciiFile(const Char_t *filename)
Open, write and close ascii file containing this grid.
virtual void Initialize()=0
void RemoveCut(KVIDentifier *)
Remove and destroy cut.
const KVList * GetIdentifiers() const
Extended version of KVCanvas used by KVIDGridEditor.
Identification grid editor GUI ,.
void SelectLinesByZ(const Char_t *ListOfZ)
KVIDGridEditor()
Default constructor.
void MakeTransformation()
void SetGrid(KVIDGraph *gg, Bool_t histo=true)
void ChangeCharges(const Char_t *Zl, Int_t dZ)
void SetPointStyle(int pstyle)
void StartViewer()
Close();.
virtual ~KVIDGridEditor()
Destructor.
void SetSelectedColor(Int_t color)
void Clear(const Option_t *opt="") override
void SetPointSize(double psize)
void ChangeMasses(const Char_t *Zl, Int_t dA)
void SpiderIdentification()
void Copy(TObject &) const override
KVSeqCollection * GetGrids()
Hybrid charge & mass identification grid.
Identification grid with lines corresponding to different nuclear isotopes (KVIDZALine)
Base class for identification ridge lines corresponding to different nuclear species.
Base class for graphical cuts used in particle identification.
virtual Bool_t HasMassFits() const
void Scale(TF1 *sx, TF1 *sy)
Full result of one attempted particle identification.
Int_t A
A of particle found (if Aident==kTRUE)
Int_t Z
Z of particle found (if Zident==kTRUE)
GUI for finding/fixing mass identification intervals.
Extended TList class which owns its objects by default.
void Sort(Bool_t order=kSortAscending)
Strings used to represent a set of ranges of values.
IntArray GetArray() const
KaliVeda extensions to ROOT collection classes.
void Execute(const char *method, const char *params, Int_t *error=0) override
KVSeqCollection * GetSubListWithMethod(const Char_t *retvalue, const Char_t *method) const
TObject * Remove(TObject *obj) override
Remove object from list.
void Add(TObject *obj) override
TObject * FindObject(const char *name) const override
void AddLast(TObject *obj) override
Int_t GetSize() const override
void Clear(Option_t *option="") override
TObject * At(Int_t idx) const override
void Delete(Option_t *option="") override
Extension of ROOT TString class which allows backwards compatibility with ROOT v3....
void Begin(TString delim) const
KVString Next(Bool_t strip_whitespace=kFALSE) const
GUI for testing identification grids.
const KVList * GetHistoList() const
TH1 * GetHistogram(const Char_t *name) const
Return histogram with given name.
Extended TList class which does not own its objects by default.
ABC for fitting ID grids with functionals.
static KVVirtualIDFitter * GetDefaultFitter()
void SetPad(TVirtualPad *p)
void SetGrid(KVIDGraph *g)
Dialog box for KVZALineFinder class.
virtual void SetAxisColor(Color_t color=1, Float_t alpha=1.)
virtual void SetLabelColor(Color_t color=1, Float_t alpha=1.)
virtual Color_t GetFillColor() const
virtual void SetFillColor(Color_t fcolor)
virtual void SetFillStyle(Style_t fstyle)
virtual void SetLineColor(Color_t lcolor)
virtual void SetMarkerColor(Color_t mcolor=1)
virtual void SetMarkerStyle(Style_t mstyle=1)
virtual void SetMarkerSize(Size_t msize=1)
virtual void SetTextAlign(Short_t align=11)
virtual void SetTextColor(Color_t tcolor=1)
virtual void SetTextSize(Float_t tsize=1)
virtual Int_t FindBin(const char *label)
virtual void SetRangeUser(Double_t ufirst, Double_t ulast)
virtual void SetRange(Int_t first=0, Int_t last=0)
virtual Double_t GetBinWidth(Int_t bin) const
virtual Int_t IsInside(Double_t x, Double_t y) const
void Clear(Option_t *option="") override
TCanvasImp * GetCanvasImp() const override
TVirtualPad * cd(Int_t subpadnumber=0) override
TMethod * GetMethodAllAny(const char *method)
TMethod * GetMethodAny(const char *method)
virtual void AddAll(const TCollection *col)
virtual Int_t GetEntries() const
virtual void SetOwner(Bool_t enable=kTRUE)
virtual Bool_t IsEmpty() const
Bool_t Contains(const char *name) const
TClass * IsA() const override
virtual TDirectory * GetDirectory(const char *namecycle, Bool_t printError=false, const char *funcname="GetDirectory")
virtual TList * GetListOfKeys() const
virtual const char * GetValue(const char *name, const char *dflt) const
virtual void SetParameters(const Double_t *params)
virtual Double_t Eval(Double_t x, Double_t y=0, Double_t z=0, Double_t t=0) const
virtual void SetParameter(const TString &name, Double_t value)
static TFile * Open(const char *name, Option_t *option="", const char *ftitle="", Int_t compress=ROOT::RCompressionSetting::EDefaults::kUseCompiledDefault, Int_t netopt=0)
virtual void SetPoint(Int_t i, Double_t x, Double_t y)
virtual Bool_t IsEditable() const
virtual Double_t Eval(Double_t x, TSpline *spline=nullptr, Option_t *option="") const
void SetName(const char *name="") override
void Draw(Option_t *chopt="") override
void Draw(Option_t *option="") override
virtual void SetMinimum(Double_t minimum=-1111)
virtual Double_t GetMinimum(Double_t minval=-FLT_MAX) const
TH1D * ProjectionY(const char *name="_py", Int_t firstxbin=0, Int_t lastxbin=-1, Option_t *option="") const
Bool_t IsFolder() const override
virtual const char * GetClassName() const
const char * GetName() const override
TClass * IsA() const override
virtual const char * GetName() const
R__ALWAYS_INLINE Bool_t TestBit(UInt_t f) const
virtual const char * ClassName() const
virtual Bool_t InheritsFrom(const char *classname) const
virtual void Draw(Option_t *option="")
virtual void Info(const char *method, const char *msgfmt,...) const
TList * GetListOfPrimitives() const override
const char * GetName() const override
virtual void SetLabel(const char *label)
const char * GetTitle() const override
virtual TText * AddText(const char *label)
void Draw(Option_t *option="") override
const char * GetName() const override
virtual void SetName(const char *name="")
virtual void SetBorderSize(Int_t bordersize=4)
Double_t * GetPositionY() const
virtual Int_t Search(const TH1 *hist, Double_t sigma=2, Option_t *option="", Double_t threshold=0.05)
Double_t * GetPositionX() const
Bool_t EndsWith(const char *pat, ECaseCompare cmp=kExact) const
const char * Data() const
Bool_t EqualTo(const char *cs, ECaseCompare cmp=kExact) const
TString & Prepend(char c, Ssiz_t rep=1)
virtual Int_t Sizeof() const
void Form(const char *fmt,...)
TString & Remove(EStripType s, char c)
Bool_t Contains(const char *pat, ECaseCompare cmp=kExact) const
TString & ReplaceAll(const char *s1, const char *s2)
void SetOptTitle(Int_t tit=1)
void SetPadTopMargin(Float_t margin=0.1)
void SetOptStat(Int_t stat=1)
void SetPadBottomMargin(Float_t margin=0.1)
void SetFrameFillColor(Color_t color=1)
void SetPadRightMargin(Float_t margin=0.1)
void SetTitleFont(Style_t font=62, Option_t *axis="X")
void SetPadTickY(Int_t ticky)
void SetTitleOffset(Float_t offset=1, Option_t *axis="X")
void SetPadTickX(Int_t tickx)
void SetPalette(Int_t ncolors=kBird, Int_t *colors=nullptr, Float_t alpha=1.)
void SetLabelFont(Style_t font=62, Option_t *axis="X")
void SetPadLeftMargin(Float_t margin=0.1)
void SetTitleSize(Float_t size=0.02, Option_t *axis="X")
void SetNdivisions(Int_t n=510, Option_t *axis="X")
void SetHatchesSpacing(Double_t h)
void SetHatchesLineWidth(Int_t l)
void SetLabelSize(Float_t size=0.04, Option_t *axis="X")
Bool_t cd(const char *path)
virtual const char * Getenv(const char *env)
virtual UserGroup_t * GetUserInfo(const char *user=nullptr)
virtual Bool_t AccessPathName(const char *path, EAccessMode mode=kFileExists)
virtual const char * BaseName(const char *pathname)
virtual char * ExpandPathName(const char *path)
virtual void Modified(Bool_t flag=1)=0
virtual void SetLogx(Int_t value=1)=0
virtual Double_t GetUymax() const=0
virtual TFrame * GetFrame()=0
virtual Int_t GetEventX() const=0
virtual TObject * GetSelected() const=0
virtual void SetLogz(Int_t value=1)=0
virtual Double_t AbsPixeltoX(Int_t px)=0
virtual Double_t GetUxmax() const=0
virtual Double_t AbsPixeltoY(Int_t py)=0
virtual Double_t GetUymin() const=0
virtual Int_t GetEvent() const=0
virtual Double_t GetUxmin() const=0
virtual void SetLogy(Int_t value=1)=0
virtual Int_t GetEventY() const=0
RVec< PromoteType< T > > abs(const RVec< T > &v)
Double_t Min(Double_t a, Double_t b)
Double_t Sign(Double_t a, Double_t b)
constexpr Double_t DegToRad()
Double_t Max(Double_t a, Double_t b)