36 namespace REX = ROOT::Experimental;
38 bool gRhoZView =
false;
40 REX::REveManager *eveMng =
nullptr;
47 using namespace ROOT::Experimental;
50 class XYJet :
public TParticle
57 float GetEtaSize()
const {
return m_etaSize; }
58 float GetPhiSize()
const {
return m_phiSize; }
59 void SetEtaSize(
float iEtaSize) { m_etaSize = iEtaSize; }
60 void SetPhiSize(
float iPhiSize) { m_phiSize = iPhiSize; }
62 XYJet(Int_t pdg, Int_t status, Int_t mother1, Int_t mother2, Int_t daughter1, Int_t daughter2,
63 Double_t px, Double_t py, Double_t pz, Double_t etot) :
64 TParticle(pdg, status, mother1, mother2, daughter1, daughter2, px, py, pz, etot, 0, 0, 0, 0)
81 TRandom &r = *gRandom;
83 TList* list =
new TList();
84 list->SetName(
"XYJets");
85 for (
int i = 1; i <= N; ++i)
87 double pt = r.Uniform(0.5, 10);
88 double eta = r.Uniform(-2.55, 2.55);
89 double phi = r.Uniform(-TMath::Pi(), TMath::Pi());
91 double px = pt * std::cos(phi);
92 double py = pt * std::sin(phi);
93 double pz = pt * (1. / (std::tan(2*std::atan(std::exp(-eta)))));
95 auto jet =
new XYJet(0, 0, 0, 0, 0, 0, px, py, pz, std::sqrt(px*px + py*py + pz*pz + 80*80));
96 jet->SetEtaSize(r.Uniform(0.02, 0.2));
97 jet->SetPhiSize(r.Uniform(0.01, 0.3));
100 m_data.push_back(list);
103 void MakeParticles(
int N)
105 TRandom &r = *gRandom;
107 TList* list =
new TList();
108 list->SetName(
"XYTracks");
109 for (
int i = 1; i <= N; ++i)
111 double pt = r.Uniform(0.5, 10);
112 double eta = r.Uniform(-2.55, 2.55);
113 double phi = r.Uniform(0, TMath::TwoPi());
115 double px = pt * std::cos(phi);
116 double py = pt * std::sin(phi);
117 double pz = pt * (1. / (std::tan(2*std::atan(std::exp(-eta)))));
121 auto particle =
new TParticle(0, 0, 0, 0, 0, 0,
122 px, py, pz, std::sqrt(px*px + py*py + pz*pz + 80*80),
125 int pdg = 11 * (r.Integer(2) > 0 ? 1 : -1);
126 particle->SetPdgCode(pdg);
130 m_data.push_back(list);
133 std::vector<TList*> m_data;
137 for (
auto &l : m_data)
156 class XYJetProxyBuilder:
public REveDataSimpleProxyBuilderTemplate<XYJet>
158 bool HaveSingleProduct()
const override {
return false; }
160 using REveDataSimpleProxyBuilderTemplate<XYJet>::BuildViewType;
162 void BuildViewType(
const XYJet& dj,
int idx, REveElement* iItemHolder,
163 std::string viewType,
const REveViewContext* context)
override
165 auto jet =
new REveJetCone();
166 jet->SetCylinder(context->GetMaxR(), context->GetMaxZ());
167 jet->AddEllipticCone(dj.Eta(), dj.Phi(), dj.GetEtaSize(), dj.GetPhiSize());
168 SetupAddElement(jet, iItemHolder,
true);
169 jet->SetLineColor(jet->GetMainColor());
171 float size = 50.f * dj.Pt();
172 double theta = dj.Theta();
174 double phi = dj.Phi();
177 if (viewType ==
"Projected" )
179 static const float_t offr = 6;
180 float r_ecal = context->GetMaxR() + offr;
181 float z_ecal = context->GetMaxZ() + offr;
183 float transAngle = abs(atan(r_ecal/z_ecal));
186 if (theta < transAngle || 3.14-theta < transAngle)
188 z_ecal = context->GetMaxZ() + offr/transAngle;
189 r = z_ecal/fabs(cos(theta));
194 r = r_ecal/sin(theta);
197 REveVector p1(0, (phi<TMath::Pi() ? r*fabs(sin(theta)) : -r*fabs(sin(theta))), r*cos(theta));
198 REveVector p2(0, (phi<TMath::Pi() ? (r+size)*fabs(sin(theta)) : -(r+size)*fabs(sin(theta))), (r+size)*cos(theta));
200 auto marker =
new REveScalableStraightLineSet(
"jetline");
201 marker->SetScaleCenter(p1.fX, p1.fY, p1.fZ);
202 marker->AddLine(p1, p2);
203 marker->SetLineWidth(4);
205 marker->AddMarker(0, 0.9);
207 SetupAddElement(marker, iItemHolder,
true);
208 marker->SetName(Form(
"line %s %d", Collection()->GetCName(), idx));
213 using REveDataProxyBuilderBase::LocalModelChanges;
215 void LocalModelChanges(
int idx, REveElement* el,
const REveViewContext* ctx)
override
217 printf(
"LocalModelChanges jet %s ( %s )\n", el->GetCName(), el->FirstChild()->GetCName());
218 REveJetCone* cone =
dynamic_cast<REveJetCone*
>(el->FirstChild());
219 cone->SetLineColor(cone->GetMainColor());
224 class TrackProxyBuilder :
public REveDataSimpleProxyBuilderTemplate<TParticle>
226 using REveDataSimpleProxyBuilderTemplate<TParticle>::Build;
228 void Build(
const TParticle& p,
int idx, REveElement* iItemHolder,
const REveViewContext* context)
override
230 const TParticle *x = &p;
231 auto track =
new REveTrack((TParticle*)(x), 1, context->GetPropagator());
233 SetupAddElement(track, iItemHolder,
true);
245 Event *m_event{
nullptr};
247 std::vector<REveScene *> m_scenes;
248 REveViewContext *m_viewContext {
nullptr};
249 REveProjectionManager *m_mngRhoZ {
nullptr};
251 std::vector<REveDataProxyBuilderBase *> m_builders;
253 REveScene *m_collections {
nullptr};
254 bool m_inEventLoading {
false};
257 XYManager(Event* event) : m_event(event)
262 auto prop =
new REveTrackPropagator();
263 prop->SetMagFieldObj(
new REveMagFieldDuo(350, -3.5, 2.0));
269 m_viewContext =
new REveViewContext();
270 m_viewContext->SetBarrel(r, z);
271 m_viewContext->SetTrackPropagator(prop);
274 auto tableInfo =
new REveTableViewInfo();
276 tableInfo->table(
"TParticle").
277 column(
"pt", 1,
"i.Pt()").
278 column(
"eta", 3,
"i.Eta()").
279 column(
"phi", 3,
"i.Phi()");
281 tableInfo->table(
"XYJet").
282 column(
"eta", 1,
"i.Eta()").
283 column(
"phi", 1,
"i.Phi()").
284 column(
"etasize", 2,
"i.GetEtaSize()").
285 column(
"phisize", 2,
"i.GetPhiSize()");
287 m_viewContext->SetTableViewInfo(tableInfo);
289 createScenesAndViews();
292 void createScenesAndViews()
295 m_collections = eveMng->SpawnNewScene(
"Collections",
"Collections");
298 m_scenes.push_back(eveMng->GetEventScene());
301 auto b1 =
new REveGeoShape(
"Barrel 1");
303 b1->SetShape(
new TGeoTube(m_viewContext->GetMaxR() , m_viewContext->GetMaxR() + dr, m_viewContext->GetMaxZ()));
304 b1->SetMainColor(kCyan);
305 eveMng->GetGlobalScene()->AddElement(b1);
310 auto rhoZEventScene = eveMng->SpawnNewScene(
"RhoZ Scene",
"Projected");
311 m_mngRhoZ =
new REveProjectionManager(REveProjection::kPT_RhoZ);
312 m_mngRhoZ->SetImportEmpty(
true);
313 auto rhoZView = eveMng->SpawnNewViewer(
"RhoZ View",
"");
314 rhoZView->AddScene(rhoZEventScene);
315 m_scenes.push_back(rhoZEventScene);
317 auto pgeoScene = eveMng->SpawnNewScene(
"Projection Geometry",
"xxx");
318 m_mngRhoZ->ImportElements(b1,pgeoScene );
319 rhoZView->AddScene(pgeoScene);
325 auto tableScene = eveMng->SpawnNewScene (
"Tables",
"Tables");
326 auto tableView = eveMng->SpawnNewViewer(
"Table",
"Table View");
327 tableView->AddScene(tableScene);
328 tableScene->AddElement(m_viewContext->GetTableViewInfo());
329 m_scenes.push_back(tableScene);
334 REveDataProxyBuilderBase* makeGLBuilderForType(TClass* c)
336 std::string cn = c->GetName();
338 return new XYJetProxyBuilder();
342 return new TrackProxyBuilder();
346 void LoadCurrentEvent(REveDataCollection* collection)
348 for (
auto &l : m_event->m_data) {
350 if (collection->GetName() == std::string(l->GetName()))
352 collection->ClearItems();
353 collection->DestroyElements();
355 for (
int i = 0; i <= l->GetLast(); ++i)
357 std::string cname = collection->GetName();
358 auto len = cname.size();
359 char end = cname[len-1];
361 cname = cname.substr(0, len-1);
363 TString pname(Form(
"%s %2d", cname.c_str(), i));
364 collection->AddItem(l->At(i), pname.Data(),
"");
367 collection->ApplyFilter();
373 m_inEventLoading =
true;
375 for (
auto &el: m_collections->RefChildren())
377 auto c =
dynamic_cast<REveDataCollection *
>(el);
381 for (
auto proxy : m_builders)
386 m_inEventLoading =
false;
389 void addCollection(REveDataCollection* collection,
bool showInTable)
391 m_collections->AddElement(collection);
394 LoadCurrentEvent(collection);
397 auto glBuilder = makeGLBuilderForType(collection->GetItemClass());
398 glBuilder->SetCollection(collection);
399 glBuilder->SetHaveAWindow(
true);
400 for (
auto scene : m_scenes)
402 REveElement *product = glBuilder->CreateProduct(scene->GetTitle(), m_viewContext);
404 if (strncmp(scene->GetCTitle(),
"Table", 5) == 0)
continue;
406 if (!strncmp(scene->GetCTitle(),
"Projected", 8))
408 m_mngRhoZ->ImportElements(product, scene);
412 scene->AddElement(product);
415 m_builders.push_back(glBuilder);
419 auto tableBuilder =
new REveTableProxyBuilder();
420 tableBuilder->SetHaveAWindow(
true);
421 tableBuilder->SetCollection(collection);
422 REveElement* tablep = tableBuilder->CreateProduct(
"table-type", m_viewContext);
423 auto tableMng = m_viewContext->GetTableViewInfo();
426 tableMng->SetDisplayedCollection(collection->GetElementId());
428 tableMng->AddDelegate([=]() { tableBuilder->ConfigChanged(); });
429 for (REveScene* scene : m_scenes)
431 if (strncmp(scene->GetCTitle(),
"Table", 5) == 0)
433 scene->AddElement(tablep);
434 tableBuilder->Build(collection, tablep, m_viewContext );
437 m_builders.push_back(tableBuilder);
439 collection->SetHandlerFunc([&] (REveDataCollection* collection)
441 this->CollectionChanged( collection );
444 collection->SetHandlerFuncIds([&] (REveDataCollection* collection,
const REveDataCollection::Ids_t& ids)
446 this->ModelChanged( collection, ids );
450 void finishViewCreate()
452 auto mngTable = m_viewContext->GetTableViewInfo();
455 for (
auto &el : m_collections->RefChildren())
457 if (el->GetName() ==
"XYTracks")
458 mngTable->SetDisplayedCollection(el->GetElementId());
463 void CollectionChanged(REveDataCollection* collection)
465 printf(
"collection changes not implemented %s!\n", collection->GetCName());
468 void ModelChanged(REveDataCollection* collection,
const REveDataCollection::Ids_t& ids)
470 if (m_inEventLoading)
return;
472 for (
auto proxy : m_builders)
474 if (proxy->Collection() == collection)
477 proxy->ModelChanges(ids);
488 class EventManager :
public REveElement
495 EventManager(Event* e, XYManager* m): m_event(e), m_xymng(m) {}
497 virtual ~EventManager() {}
499 virtual void NextEvent()
502 m_xymng->NextEvent();
505 virtual void QuitRoot()
507 printf(
"Quit ROOT\n");
508 if (gApplication) gApplication->Terminate();
517 void collection_proxies(
bool proj=
true)
519 eveMng = REveManager::Create();
521 auto event =
new Event();
527 auto xyManager =
new XYManager(event);
531 REveDataCollection* trackCollection =
new REveDataCollection(
"XYTracks");
532 trackCollection->SetItemClass(TParticle::Class());
533 trackCollection->SetMainColor(kGreen);
534 trackCollection->SetFilterExpr(
"i.Pt() > 4.1 && std::abs(i.Eta()) < 1");
535 xyManager->addCollection(trackCollection,
true);
540 REveDataCollection* jetCollection =
new REveDataCollection(
"XYJets");
541 jetCollection->SetItemClass(XYJet::Class());
542 jetCollection->SetMainColor(kRed);
543 xyManager->addCollection(jetCollection,
false);
546 auto eventMng =
new EventManager(event, xyManager);
547 eventMng->SetName(
"EventManager");
548 eveMng->GetWorld()->AddElement(eventMng);
550 eveMng->GetWorld()->AddCommand(
"QuitRoot",
"sap-icon://log", eventMng,
"QuitRoot()");
551 eveMng->GetWorld()->AddCommand(
"NextEvent",
"sap-icon://step", eventMng,
"NextEvent()");