musinsky / ROOTHighlight

ROOT Highlight (histogram or graph)
0 stars 0 forks source link

notes #1

Closed musinsky closed 6 years ago

musinsky commented 6 years ago

Int_t THistPainter::DistancetoPrimitive(Int_t px, Int_t py)


FUNCTIONS:

/*
 * Vykreslovanie histogramu s palette objektom sa vykonava v poradi, resp. gPad->Update vola:
 * 1) THistPainter::PaintTable
 * 2) THistPainter::PaintPalette
 * 3) THistPainter::PaintFunction
 *
 * Palette (TPaletteAxis) je vykreslene pomocou funkcie THistPainter::PaintPalette, ak palette objekt neexistuje,
 * tak sa stale vytvori novy (new) palette objekt v THistPainter::PaintPalette a zaroven sa prida do zoznamu fFunctions
 * prislusneho histogramu. Vymaze (delete) sa potom v THistPainter::PaintTable (samozrejme, aj zo zoznamu fFunctions).
 *
 * Problem zacina v pripade, ze sa vykresli ten isty histogram na dva pady, raz s palette objektom a raz bez neho.
 * Vtedy sa v principe stale vytvara a maze tento palette objekt v zavislosti v ktorom pade sa nachadza histogram
 * s palette a v ktorom bez palette objektu.
 * !!! Od teraz stale len takato moznost (ten isty histogram raz vykresleny s palette a raz bez neho) !!!
 *
 * Ak zadavam prikaz v CLI, napr. h->GetListOfFunctions()->ls(), tak sa vzdy po stalaceni ENTER v CLI vola
 * aj funkcia gPad->Update (a teda aj vsetky 1), 2) a 3) vyssie spomenute funkcie) a teda v zavislosti od padu:
 * - pad, kde je histogram s palette objektom ho ma aj v svojom zozname (new in PaintPalette)
 * - pad, kde je histogram bez palette objektom ho nema v svojom zozname (delete in PaintTable)
 * Tak isto ako ENTER v CLI vola funkciu gPad->Update, tak ju vzdy vola aj kliknutie myskou v pade (nie vsak pohyb).
 *
 * Problem zacina, ked len "beham s myskou", resp. ProcessedEvent, vtedy sa pri kazdej zmene "pohybu mysky" nevola
 * funkcia gPad->Update a teda sa nevola ani PaintTable, PaintPalette, resp. PaintFunction . V zavislosti od toho,
 * co bolo vykreslene (gPad->Update) ako posledne je potom mozne, ze histogram vykresleny v pade bez palette
 * sa "bude tvarit ako keby mal palette", resp. naopak, co vsak az taky problem nie je.
 * Problem zacina az v momenta THistPainter::DistancetoPrimitive_goto_FUNCTIONS (vola sa vzdy pri "behani myskou")
 *    gPad->SetSelected(f);
 * teraz moze nastat situacia, kedy pre pad (na ktorom je histogram bez palette) sa vola gPad->SetSelected(palette),
 * ale palette je pre histgram na inom pade, kde "v skutocnosti" je histogram s palette objektom. Tento problem
 * sa vsak tazko "preukaze", lebo po kliknuti myskou na neexistujuci objekt, sa ihned vola gPad->Update, a teda,
 * sa aj volaju potrebne funkcie (PaintTable, PaintPalette), ktore palette zmazu, resp, vytvoria.
 * Problem sa vsak prejavi pri pouziti napr. ProcessedEvent, vtedy sa moze vyslat signal pre pad s neexistujucim
 * objektom v "tomto" pade, co vacsinou znamena "Generating stack trace...". Pre opacny pripad sa "len nevyvola"
 * signal pre existujuci objekt, co vsak nema za nasledok "Generating stack trace..."
 *
 * Jednoduche riesenie je zavolat gPad->Update, ktory jednoducho zmaze, resp. vytvori palette, vzdy ked sa zmeni pad
 * v ktorom je histogram bez, resp. s palette objektom.
 *
 * Ak je zapnuta funkcia Highlight, tak sa velmi casto vola funkcia gPad->Update pri pohybe myskou. Highlight sa vsak
 * vola pre samotny histgoram, ktory je "vo vnutri" TFrame, takze gPad->Update() nastane az v momente, ked je myska
 * "vo vnutri" TFrame a nie mimo. Palette objekt sa vsak nachadza prave "mimo" (nie v TFrame) a teda funkcia
 * gPad->Update (volana cez Highlight) je volana, az ked je myska "vo vnutri" TFrame, t.j. je volana uz "neskoro".
 *
 */

   static TVirtualPad *prevpad = nullptr;
   if (prevpad != gPad) {
      if (fFunctions && !fFunctions->IsEmpty()) // with or without this condition ?!
      {
         gPad->Modified();
         gPad->Update();
      }
   }
   prevpad = gPad;

   TObject *f;
   TIter   next(fFunctions);
   while ((f = (TObject*) next())) {
      Int_t dist;
      if (f->InheritsFrom(TF1::Class())) dist = f->DistancetoPrimitive(-px,py);
      else                               dist = f->DistancetoPrimitive(px,py);
      if (dist < kMaxDiff) {gPad->SetSelected(f); return dist;}
   }
   return curdist;
}

https://photos.app.goo.gl/tH9EigfUVLJFPzQo2

musinsky commented 6 years ago

palette problem

void palette_problem()
{
   auto h2 = new TH2F("h2", "h2", 10, -5, 5, 10, -5, 5);
   Float_t x, y;
   for (Int_t i = 0; i < 10000; i++) {
      gRandom->Rannor(x, y);
      h2->Fill(x, y);
   }

   auto c1 = new TCanvas();
   c1->Divide(2, 1);
   c1->cd(1);
   h2->Draw("");
   c1->cd(2);
   h2->Draw("colz");
   c1->SetFillColor(kGray);
   c1->Update();
   if (!c1->GetShowEventStatus()) c1->ToggleEventStatus();
   c1->Connect("ProcessedEvent(Int_t,Int_t,Int_t,TObject*)",
               0, 0, "ProcessedEventPrint(Int_t,Int_t,Int_t,TObject*)");
}

void ProcessedEventPrint(Int_t e, Int_t, Int_t, TObject *o)
{
   Printf("ProcessedEvent => event: %d, object: %s", e, o->GetName());
   Printf("%d", gPad->GetNumber());
}
musinsky commented 6 years ago