This is an example of visualization of containers with REveDataCollection and REveDataProxyBuilders.
#include <iostream>
namespace fw3dlego {
const int xbins_n = 83;
const double xbins[xbins_n] = {
-5.191, -4.889, -4.716, -4.538, -4.363, -4.191, -4.013, -3.839, -3.664, -3.489, -3.314, -3.139, -2.964, -2.853,
-2.650, -2.500, -2.322, -2.172, -2.043, -1.930, -1.830, -1.740, -1.653, -1.566, -1.479, -1.392, -1.305, -1.218,
-1.131, -1.044, -0.957, -0.870, -0.783, -0.696, -0.609, -0.522, -0.435, -0.348, -0.261, -0.174, -0.087, 0.000,
0.087, 0.174, 0.261, 0.348, 0.435, 0.522, 0.609, 0.696, 0.783, 0.870, 0.957, 1.044, 1.131, 1.218,
1.305, 1.392, 1.479, 1.566, 1.653, 1.740, 1.830, 1.930, 2.043, 2.172, 2.322, 2.500, 2.650, 2.853,
2.964, 3.139, 3.314, 3.489, 3.664, 3.839, 4.013, 4.191, 4.363, 4.538, 4.716, 4.889, 5.191};
}
public:
float fEtaSize{0};
float fPhiSize{0};
float GetEtaSize() const { return fEtaSize; }
float GetPhiSize() const { return fPhiSize; }
void SetEtaSize(float iEtaSize) { fEtaSize = iEtaSize; }
void SetPhiSize(float iPhiSize) { fPhiSize = iPhiSize; }
:
TParticle(pdg, status, mother1, mother2, daughter1, daughter2, px, py, pz, etot, 0, 0, 0, 0)
{
}
};
public:
float fX{0};
float fY{0};
float fZ{0};
float fPt{0};
RecHit(
float pt,
float x,
float y,
float z) : fPt(
pt), fX(
x), fY(
y), fZ(z) {}
};
class RCaloTower :
public TObject {
public:
float fEta{0};
float fPhi{0};
float fEt{0};
RCaloTower(float eta, float phi, float et) : fEta(eta), fPhi(phi), fEt(et) {}
};
private:
public:
{
}
using REveCaloDataSliceSelector::ProcessSelection;
{
std::set<int> item_set;
for (auto &cellId : sel_cells) {
fCaloData->GetCellData(cellId, cd);
for (int t = 0; t < fCollection->GetNItems(); ++t) {
RCaloTower *tower = (RCaloTower *)fCollection->GetDataPtr(t);
if (tower->fEta > cd.fEtaMin && tower->fEta < cd.fEtaMax && tower->fPhi > cd.fPhiMin &&
tower->fPhi < cd.fPhiMax && fCollection->GetDataItem(t)->GetVisible()) {
item_set.insert(t);
}
}
}
fCollection->GetItemList()->RefSelectedSet() = item_set;
sel->NewElementPicked(fCollection->GetItemList()->GetElementId(), multi,
true, item_set);
}
using REveCaloDataSliceSelector::GetCellsFromSecondaryIndices;
{
TH2F *hist = fCaloData->GetHist(GetSliceIndex());
std::set<int> cbins;
for (auto &i : idcs) {
RCaloTower *tower = (RCaloTower *)fCollection->GetDataPtr(i);
int bin = hist->
FindBin(tower->fEta, tower->fPhi);
for (size_t ci = 0; ci < out.size(); ++ci) {
if (out[ci].fTower == bin && out[ci].fSlice == GetSliceIndex()) {
float oldv = out[ci].fFraction;
out[ci].fFraction = oldv + frac;
break;
}
}
}
}
}
};
class Event {
public:
int eventId{0};
int N_tracks{0};
int N_jets{0};
std::vector<TList *> fListData;
Event()
{
auto baseHist =
new TH2F(
"dummy",
"dummy", fw3dlego::xbins_n - 1, fw3dlego::xbins, 72, -
TMath::Pi(),
TMath::Pi());
fCaloData->AddHistogram(baseHist);
fCaloData->SetSelector(selector);
}
{
list->SetName("Jets");
for (
int i = 1; i <=
N; ++i) {
double pt =
r.Uniform(0.5, 10);
double eta =
r.Uniform(-2.55, 2.55);
double px =
pt * std::cos(phi);
double py =
pt * std::sin(phi);
double pz =
pt * (1. / (std::tan(2 * std::atan(std::exp(-eta)))));
auto jet =
new Jet(0, 0, 0, 0, 0, 0, px, py, pz, std::sqrt(px * px + py * py + pz * pz + 80 * 80));
jet->SetEtaSize(
r.Uniform(0.02, 0.2));
jet->SetPhiSize(
r.Uniform(0.01, 0.3));
list->Add(jet);
}
fListData.push_back(list);
}
void MakeParticles(
int N)
{
list->SetName("Tracks");
for (
int i = 1; i <=
N; ++i) {
double pt =
r.Uniform(0.5, 10);
double eta =
r.Uniform(-2.55, 2.55);
double px =
pt * std::cos(phi);
double py =
pt * std::sin(phi);
double pz =
pt * (1. / (std::tan(2 * std::atan(std::exp(-eta)))));
auto particle =
new TParticle(0, 0, 0, 0, 0, 0, px, py, pz, std::sqrt(px * px + py * py + pz * pz + 80 * 80), 0, 0, 0, 0);
int pdg = 11 * (
r.Integer(2) > 0 ? 1 : -1);
particle->SetPdgCode(pdg);
list->Add(particle);
}
fListData.push_back(list);
}
{
list->SetName("RecHits");
for (
int i = 1; i <=
N; ++i) {
float pt =
r.Uniform(0.5, 10);
float x =
r.Uniform(-200, 200);
float y =
r.Uniform(-200, 200);
float z =
r.Uniform(-500, 500);
auto rechit =
new RecHit(
pt,
x,
y, z);
list->Add(rechit);
}
fListData.push_back(list);
}
void Clear()
{
for (
auto &
l : fListData)
fListData.clear();
}
void Create()
{
Clear();
MakeJets(4);
MakeParticles(100);
MakeRecHits(20);
TList *jlist = fListData[0];
fListData.push_back(elist);
fListData.push_back(hlist);
for (
int i = 0; i <= jlist->
GetLast(); ++i) {
float offX = j->Eta();
for (int k = 0; k < 20; ++k) {
}
}
fCaloData->DataChanged();
eventId++;
}
};
bool HaveSingleProduct() const override { return false; }
void BuildItemViewType(
const Jet &dj,
int idx,
REveElement *iItemHolder,
const std::string &viewType,
{
jet->AddEllipticCone(dj.Eta(), dj.Phi(), dj.GetEtaSize(), dj.GetPhiSize());
SetupAddElement(jet, iItemHolder, true);
jet->SetLineColor(jet->GetMainColor());
float size = 50.f * dj.Pt();
double theta = dj.Theta();
double phi = dj.Phi();
if (viewType == "Projected") {
static const float_t offr = 6;
float r_ecal = context->
GetMaxR() + offr;
float z_ecal = context->
GetMaxZ() + offr;
float transAngle =
abs(
atan(r_ecal / z_ecal));
bool debug = false;
if (theta < transAngle || 3.14 - theta < transAngle) {
z_ecal = context->
GetMaxZ() + offr / transAngle;
} else {
debug = true;
}
marker->SetScaleCenter(p1.
fX, p1.
fY, p1.
fZ);
marker->AddLine(p1, p2);
marker->SetLineWidth(4);
if (debug)
marker->AddMarker(0, 0.9);
SetupAddElement(marker, iItemHolder, true);
marker->SetName(
Form(
"line %s %d", Collection()->GetCName(), idx));
}
}
using REveDataProxyBuilderBase::LocalModelChanges;
{
cone->SetLineColor(cone->GetMainColor());
}
};
{
track->MakeTrack();
SetupAddElement(track, iItemHolder, true);
}
};
private:
public:
using REveElement::GetSelectionMaster;
{
if (fSelectionMaster) {
return il;
}
return nullptr;
}
};
{
auto collection = Collection();
boxset->SetMainColor(collection->GetMainColor());
boxset->SetName(collection->GetCName());
boxset->SetPickable(true);
boxset->SetAlwaysSecSelect(true);
boxset->SetDetIdsAsSecondaryIndices(true);
boxset->Reset(REveBoxSet::kBT_FreeBox,
true, collection->
GetNItems());
#define RND_BOX(x) (Float_t) r.Uniform(-(x), (x))
Float_t verts[24] = {
x -
a + RND_BOX(
d),
y -
a + RND_BOX(
d), z -
a + RND_BOX(
d),
x -
a + RND_BOX(
d),
y +
a + RND_BOX(
d), z -
a + RND_BOX(
d),
x +
a + RND_BOX(
d),
y +
a + RND_BOX(
d),
z -
a + RND_BOX(
d),
x +
a + RND_BOX(
d),
y -
a + RND_BOX(
d), z -
a + RND_BOX(
d),
x -
a + RND_BOX(
d),
y -
a + RND_BOX(
d), z +
a + RND_BOX(
d),
x -
a + RND_BOX(
d),
y +
a + RND_BOX(
d), z +
a + RND_BOX(
d),
x +
a + RND_BOX(
d),
y +
a + RND_BOX(
d),
z +
a + RND_BOX(
d),
x +
a + RND_BOX(
d),
y -
a + RND_BOX(
d), z +
a + RND_BOX(
d)};
boxset->AddBox(verts);
}
boxset->RefitPlex();
boxset->StampObjProps();
}
public:
using REveDataProxyBuilderBase::Build;
{
fBoxSet = new FWBoxSet();
buildBoxSet(fBoxSet);
}
using REveDataProxyBuilderBase::FillImpliedSelected;
void FillImpliedSelected(
REveElement::Set_t &impSet,
const std::set<int> &sec_idcs, Product *
p)
override
{
impSet.insert(fBoxSet);
}
using REveDataProxyBuilderBase::ModelChanges;
{
for (auto &i : ids) {
auto digi = fBoxSet->GetDigit(i);
auto item = Collection()->GetDataItem(i);
fBoxSet->SetCurrentDigit(i);
fBoxSet->DigitValue(1);
} else {
fBoxSet->DigitValue(0);
}
}
fBoxSet->StampObjProps();
}
};
private:
int fSliceIndex{-1};
void assertSlice()
{
if (!fHist) {
fHist =
new TH2F(
"caloHist",
"caloHist", fw3dlego::xbins_n - 1, fw3dlego::xbins, 72, -
M_PI,
M_PI);
fSliceIndex = fCaloData->AddHistogram(fHist);
fCaloData->RefSliceInfo(fSliceIndex)
.Setup(Collection()->GetCName(), 0., Collection()->GetMainColor(), Collection()->GetMainTransparency());
fCaloData->GetSelector()->AddSliceSelector(std::unique_ptr<REveCaloDataSliceSelector>(
new REveCaloTowerSliceSelector(fSliceIndex, Collection(), fCaloData)));
}
}
public:
using REveDataProxyBuilderBase::Build;
{
assertSlice();
fHist->Reset();
fCaloData->RefSliceInfo(fSliceIndex)
.Setup(Collection()->GetCName(), 0., Collection()->GetMainColor(), Collection()->GetMainTransparency());
RCaloTower *tower = (RCaloTower *)collection->
GetDataPtr(
h);
continue;
fHist->Fill(tower->fEta, tower->fPhi, tower->fEt);
}
}
fCaloData->DataChanged();
}
using REveDataProxyBuilderBase::FillImpliedSelected;
void FillImpliedSelected(
REveElement::Set_t &impSet,
const std::set<int> &sec_idcs, Product *)
override
{
fCaloData->GetSelector()->SetActiveSlice(fSliceIndex);
impSet.insert(fCaloData);
fCaloData->FillImpliedSelectedSet(impSet, sec_idcs);
}
using REveDataProxyBuilderBase::ModelChanges;
{
BuildProduct(Collection(), nullptr, nullptr);
}
};
class CollectionManager {
private:
Event *fEvent{nullptr};
std::vector<REveScene *> m_scenes;
std::vector<REveDataProxyBuilderBase *> m_builders;
bool m_inEventLoading{false};
public:
{
float z = 300;
m_viewContext->SetBarrel(
r, z);
m_viewContext->SetTrackPropagator(
prop);
tableInfo->table("TParticle").column("pt", 1, "i.Pt()").column("eta", 3, "i.Eta()").column("phi", 3, "i.Phi()");
tableInfo->table("Jet")
.column("eta", 1, "i.Eta()")
.column("phi", 1, "i.Phi()")
.column("etasize", 2, "i.GetEtaSize()")
.column("phisize", 2, "i.GetPhiSize()");
tableInfo->table("RecHit").column("pt", 1, "i.fPt");
tableInfo->table("RCaloTower").column("eta", 3, "i.fEta").column("phi", 3, "i.fPhi").column("Et", 3, "i.fEt");
m_viewContext->SetTableViewInfo(tableInfo);
for (
auto &
c : eveMng->GetScenes()->RefChildren()) {
}
if (!strncmp(
c->GetCName(),
"Table", 5))
c->AddElement(m_viewContext->GetTableViewInfo());
}
m_collections = eveMng->
SpawnNewScene(
"Collections",
"Collections");
}
{
for (
auto &
l : fEvent->fListData) {
for (
int i = 0; i <=
l->GetLast(); ++i) {
if (end == 's') {
}
collection->
AddItem(
l->At(i), pname.Data(),
"");
}
}
}
}
void LoadEvent()
{
m_inEventLoading = true;
for (auto &el : m_collections->RefChildren()) {
SetDataItemsFromEvent(
c);
}
for (auto proxy : m_builders) {
proxy->Build();
}
fEvent->fCaloData->DataChanged();
m_inEventLoading = false;
}
{
m_collections->AddElement(collection);
SetDataItemsFromEvent(collection);
for (auto scene : m_scenes) {
if (strncmp(scene->GetCName(), "Tables", 5) == 0)
continue;
if (!strncmp(scene->GetCTitle(), "Projected", 8)) {
} else {
}
}
m_builders.push_back(glBuilder);
tableBuilder->SetHaveAWindow(true);
tableBuilder->SetCollection(collection);
REveElement *tablep = tableBuilder->CreateProduct(
"table-type", m_viewContext);
auto tableMng = m_viewContext->GetTableViewInfo();
if (showInTable) {
tableMng->SetDisplayedCollection(collection->
GetElementId());
}
for (auto s : m_scenes) {
if (strncmp(s->GetCTitle(), "Table", 5) == 0) {
s->AddElement(tablep);
tableBuilder->Build();
}
}
tableMng->AddDelegate([=]() { tableBuilder->ConfigChanged(); });
m_builders.push_back(tableBuilder);
for (
int t = 0; t <
N; t++) {
auto te = tableEntries[t];
}
this->ModelChanged(collection, ids);
});
this->FillImpliedSelected(collection, impSelSet, sec_idcs);
});
}
void finishViewCreate()
{
auto mngTable = m_viewContext->GetTableViewInfo();
if (mngTable) {
for (auto &el : m_collections->RefChildren()) {
if (el->GetName() == "Tracks")
mngTable->SetDisplayedCollection(el->GetElementId());
}
}
}
{
if (m_inEventLoading)
return;
for (auto proxy : m_builders) {
if (proxy->Collection()->GetItemList() == itemList) {
proxy->ModelChanges(ids);
}
}
}
{
if (m_inEventLoading)
return;
for (auto proxy : m_builders) {
if (proxy->Collection()->GetItemList() == itemList) {
proxy->FillImpliedSelected(impSelSet, sec_idcs);
}
}
}
};
private:
Event *fEvent;
CollectionManager *fCMng;
public:
EventManager(Event *
e, CollectionManager *
m) : fEvent(
e), fCMng(
m) {}
~EventManager() override {}
virtual void NextEvent()
{
fEvent->Create();
fCMng->LoadEvent();
}
};
public:
FWSelectionDeviator() {}
using REveSelection::Deviator::DeviateSelection;
const std::set<int> &secondary_idcs) override
{
if (el) {
if (colItems) {
ExecuteNewElementPicked(selection, colItems, multi, true, colItems->RefSelectedSet());
return true;
}
}
return false;
}
};
void collection_proxies(bool proj = true)
{
eveMng = REveManager::Create();
auto event = new Event();
event->Create();
auto deviator = std::make_shared<FWSelectionDeviator>();
b1->SetShape(
new TGeoTube(kR_min, kR_max, kZ_d));
b1->SetMainTransparency(90);
rhoZEventScene = eveMng->
SpawnNewScene(
"RhoZ Scene",
"Projected");
rhoZView->AddScene(rhoZEventScene);
rhoZView->AddScene(pgeoScene);
auto collectionMng =
new CollectionManager(
event);
trackCollection->
SetFilterExpr(
"i.Pt() > 4.1 && std::abs(i.Eta()) < 1");
collectionMng->addCollection(trackCollection, new TParticleProxyBuilder(), true);
collectionMng->addCollection(jetCollection, new JetProxyBuilder());
collectionMng->addCollection(hitCollection, new RecHitProxyBuilder(), true);
calo3d->SetBarrelRadius(kR_max);
calo3d->SetEndCapPos(kZ_d);
calo3d->SetMaxTowerH(300);
collectionMng->addCollection(ecalCollection,
new CaloTowerProxyBuilder(
event->fCaloData));
collectionMng->addCollection(hcalCollection,
new CaloTowerProxyBuilder(
event->fCaloData));
auto eventMng =
new EventManager(
event, collectionMng);
eventMng->SetName("EventManager");
}
size_t size(const MatrixT &matrix)
retrieve the size of a square matrix
bool Bool_t
Boolean (0=false, 1=true) (bool)
int Int_t
Signed integer 4 bytes (int)
unsigned int UInt_t
Unsigned integer 4 bytes (unsigned int)
float Float_t
Float 4 bytes (float)
double Double_t
Double 8 bytes.
#define ClassDef(name, id)
static unsigned int total
winID h TVirtualViewer3D TVirtualGLPainter p
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 Int_t Int_t Window_t TString Int_t GCValues_t GetPrimarySelectionOwner GetDisplay GetScreen GetColormap GetNativeEvent const char const char dpyName wid window const char font_name cursor keysym reg const char only_if_exist regb h Point_t winding char text const char depth char const char Int_t count const char ColorStruct_t color const char Pixmap_t Pixmap_t PictureAttributes_t attr const char char ret_data h unsigned char height h Atom_t Int_t ULong_t ULong_t unsigned char prop_list Atom_t sel
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 r
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 Int_t Int_t Window_t TString Int_t GCValues_t GetPrimarySelectionOwner GetDisplay GetScreen GetColormap GetNativeEvent const char const char dpyName wid window const char font_name cursor keysym reg const char only_if_exist regb h Point_t winding char text const char depth char const char Int_t count const char ColorStruct_t color const char Pixmap_t Pixmap_t PictureAttributes_t attr const char char ret_data h unsigned char height h prop
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 Int_t Int_t Window_t TString Int_t GCValues_t GetPrimarySelectionOwner GetDisplay GetScreen GetColormap GetNativeEvent const char const char dpyName wid window const char font_name cursor keysym reg const char only_if_exist regb h Point_t winding char text const char depth char const char Int_t count const char cname
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 Int_t Int_t Window_t TString Int_t GCValues_t GetPrimarySelectionOwner GetDisplay GetScreen GetColormap GetNativeEvent const char const char dpyName wid window const char font_name cursor keysym reg const char only_if_exist regb h Point_t winding char text const char depth char const char Int_t count const char ColorStruct_t color const char Pixmap_t Pixmap_t PictureAttributes_t attr const char char ret_data h unsigned char height h Atom_t Int_t ULong_t ULong_t unsigned char prop_list Atom_t Atom_t Atom_t Time_t UChar_t len
R__EXTERN TRandom * gRandom
char * Form(const char *fmt,...)
Formats a string in a circular formatting buffer.
Collection of 3D primitives (fixed-size boxes, boxes of different sizes, or arbitrary sexto-epipeds,...
Visualization of a calorimeter event data in 2D.
Visualization of a calorimeter event data in 3D.
A central manager for calorimeter data of an event written in TH2F.
Cell data inner structure.
Base class for REveUtil visualization elements, providing hierarchy management, rendering control and...
Wrapper for TGeoShape with absolute positioning and color attributes allowing display of extracted TG...
Draws a jet cone with leading particle is specified in (eta,phi) and cone radius is given.
Implements constant magnetic filed that switches on given axial radius fR2 from vector fBIn to fBOut.
Manager class for steering of projections and managing projected objects.
Straight-line-set with extra scaling, useful for projectables that need to be scaled in accordance wi...
Eve representation of TGLScene.
Make sure there is a SINGLE running REveSelection for each selection type (select/highlight).
Holding structure for a number of track rendering parameters.
Visual representation of a track.
std::vector< CellId_t > vCellId_t
REveDataItemList * GetItemList()
void SetFilterExpr(const char *filter)
TClass * GetItemClass() const
void * GetDataPtr(Int_t i) const
void AddItem(void *data_ptr, const std::string &n, const std::string &t)
void SetItemClass(TClass *cls)
void SetMainColor(Color_t) override
Set main color of the element.
void AddTooltipExpression(const std::string &title, const std::string &expr, bool init=true)
void SetItemsChangeDelegate(ItemsChangeFunc_t)
void SetFillImpliedSelectedDelegate(FillImpliedSelectedFunc_t)
Color_t GetMainColor() const
Bool_t GetVisible() const
void SetHaveAWindow(bool)
virtual void SetCollection(REveDataCollection *)
virtual REveElement * CreateProduct(const std::string &viewType, const REveViewContext *)
const std::string & GetName() const
virtual void AddElement(REveElement *el)
Add el to the list of children.
virtual Bool_t GetRnrSelf() const
std::set< REveElement * > Set_t
ElementId_t GetElementId() const
REveScene * GetEventScene() const
REveSelection * GetHighlight() const
REveSelection * GetSelection() const
REveElement * FindElementById(ElementId_t id) const
Lookup ElementId in element map and return corresponding REveElement*.
REveScene * GetGlobalScene() const
REveScene * SpawnNewScene(const char *name, const char *title="")
Create a new scene.
REveViewer * SpawnNewViewer(const char *name, const char *title="")
Create a new GL viewer.
REveScene * GetWorld() const
void Show(const RWebDisplayArgs &args="")
Show eve manager in specified browser.
REveProjectionManager Manager class for steering of projections and managing projected objects.
virtual REveElement * ImportElements(REveElement *el, REveElement *ext_list=nullptr)
Recursively import elements and apply projection to the newly imported objects.
void SetImportEmpty(Bool_t ie)
void AddCommand(const std::string &name, const std::string &icon, const REveElement *element, const std::string &action)
SelectionSet_t & RefSelectedSet()
void SetDeviator(std::shared_ptr< Deviator > d)
void ClearSelection()
Clear selection if not empty.
REveTrackPropagator * GetPropagator() const
void SetCameraType(REveCamera::ECameraType type)
Set camera by type (backward compatibility with old API)
virtual void AddScene(REveScene *scene)
Add 'scene' to the list of scenes.
void SetName(const char *name)
TDirectory::TContext keeps track and restore the current directory.
virtual Int_t FindBin(Double_t x, Double_t y=0, Double_t z=0)
Return Global bin number corresponding to x,y,z.
static Bool_t AddDirectoryStatus()
Check whether TH1-derived classes should register themselves to the current gDirectory.
2-D histogram with a float per channel (see TH1 documentation)
Double_t GetBinContent(Int_t binx, Int_t biny) const override
void Add(TObject *obj) override
TObject * At(Int_t idx) const override
Returns the object at position idx. Returns 0 if idx is out of range.
const char * GetName() const override
Returns name of object.
Mother of all ROOT objects.
virtual const char * GetName() const
Returns name of object.
Description of the dynamic properties of a particle.
This is the base class for the ROOT Random number generators.
virtual Double_t Uniform(Double_t x1=1)
Returns a uniform deviate on the interval (0, x1).
virtual Int_t GetLast() const
Returns index of last object in collection.
RVec< PromoteType< T > > abs(const RVec< T > &v)
RVec< PromoteType< T > > cos(const RVec< T > &v)
RVec< PromoteType< T > > atan(const RVec< T > &v)
RVec< PromoteType< T > > sin(const RVec< T > &v)
Namespace for ROOT features in testing.
VecExpr< UnaryOp< Fabs< T >, VecExpr< A, T, D >, T >, T, D > fabs(const VecExpr< A, T, D > &rhs)
double product(DoubleArray factors, std::size_t nFactors)
Short_t Min(Short_t a, Short_t b)
Returns the smallest of a and b.
constexpr Double_t TwoPi()