ATLAS Offline Software
Loading...
Searching...
No Matches
VP1MCSystem.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2024 CERN for the benefit of the ATLAS collaboration
3*/
4
5#include "HepPDT/ParticleDataTable.hh"
6#include "HepPDT/ParticleData.hh"
8#include "ui_vp1mccontroller.h"
13
14#include "GaudiKernel/IClassIDSvc.h"
15#include "GaudiKernel/ISvcLocator.h"
16#include <QListWidget>
17#include <QListWidgetItem>
18#include <QTreeWidget>
19#include <QTreeWidgetItem>
20
23#include "CLHEP/Vector/ThreeVector.h"
25#include "GaudiKernel/IPartPropSvc.h"
27#include "CLHEP/Units/SystemOfUnits.h"
28#include <cmath>
29#include <stack>
30
31//____________________________________________________________________
33public:
36 Ui::VP1MCSystemControllerForm ui{};
37 QTreeWidget *tw;
38 SmartIF<IPartPropSvc> pps;
39
40 void handle(QTreeWidgetItem *item, const HepMC::GenParticle &particle);
41
42 void expand(const QString& text, QTreeWidgetItem *item);
43 void zeroFormat(QTreeWidgetItem *item);
44};
45
47
48 ISvcLocator* svcLoc = theclass->serviceLocator();
49 if (!svcLoc) {
50 theclass->message("Error: Got NULL pointer to the service locator!");
51 return;
52 }
53 pps = svcLoc->service( "PartPropSvc" );
54 if(!pps) {
55 theclass->message("Error: Could not retrieve PartPropSvc!!");
56 return;
57 }
58
59}
60
61void VP1MCSystem::Imp::expand(const QString& name, QTreeWidgetItem *item) {
62 QFont font = item->font(0);
63
64 if (item->text(0)==name) {
65 font.setBold(true);
66 for (int i=0;i<item->columnCount();++i) {
67 item->setFont(i,font);
68 }
69
70
71 QTreeWidgetItem *expandItem = item;
72 while (expandItem) {
73 expandItem->setExpanded(true);
74 expandItem=expandItem->parent();
75 if (!expandItem || expandItem->isExpanded()) break;
76 }
77 }
78 for (int i=0;i<item->childCount();++i) {
79 expand(name, item->child(i));
80 }
81}
82
83void VP1MCSystem::Imp::zeroFormat(QTreeWidgetItem *item) {
84 QFont font = item->font(0);
85 font.setBold(false);
86 for (int i=0;i<item->columnCount();++i) {
87 item->setFont(i,font);
88 }
89 for (int i=0;i<item->childCount();++i) {
90 zeroFormat(item->child(i));
91 }
92}
93
94void VP1MCSystem::Imp::handle(QTreeWidgetItem *item, const HepMC::GenParticle &theParticle) {
95
96#ifdef PD
97 const HepPDT::ParticleDataTable * dataTable = pps->PDT();
98 const HepPDT::ParticleData * particleData = dataTable->particle(iabs(theParticle.pdg_id()));
99 // Generate text
100 if (particleData) {
101 }
102 else {
103 }
104#endif
105
106 std::ostringstream partStream, pidStream, massStream, ptStream, etaStream, phiStream;
107
108 bool ok;
109 QString name = VP1ParticleData::particleName(theParticle.pdg_id(),ok);
110 if (ok) {
111 partStream << name.toStdString();
112 }
113 else {
114 partStream << "PDG ID = " << theParticle.pdg_id();
115 }
116
117
118 item->setText(0,partStream.str().c_str());
119
120 double eta = 0;
121 CLHEP::Hep3Vector mom=CLHEP::Hep3Vector(theParticle.momentum().x(),
122 theParticle.momentum().y(),
123 theParticle.momentum().z());
124 if (mom.x()!=0 || mom.y()!=0) {
125 eta =-log(tan(mom.theta()/2));
126 }
127 double phi = mom.phi();
128 while (phi<0) phi += 2*M_PI;
129 while (phi>2*M_PI) phi -= 2*M_PI;
130 double pt = mom.perp()/CLHEP::GeV;
131
132 pidStream << theParticle.pdg_id();
133 item->setText(1,pidStream.str().c_str());
134
135 massStream << theParticle.generated_mass()/CLHEP::GeV;
136 item->setText(2,massStream.str().c_str());
137
138 ptStream << pt;
139 item->setText(3,ptStream.str().c_str());
140
141 etaStream << eta;
142 item->setText(4,etaStream.str().c_str());
143
144 phiStream << phi;
145 item->setText(5,phiStream.str().c_str());
146
147 if (1) {
148 HepMC::ConstGenVertexPtr prodVertex = theParticle.production_vertex();
149
150 QBrush brush=item->foreground(0);
151 brush.setColor(Qt::gray);
152
153 if (prodVertex) {
154 int nParents=prodVertex->particles_in_size();
155 if (nParents==0) {
156 brush.setColor(Qt::black);
157 }
158 else if (nParents==1){
159 brush.setColor(Qt::blue);
160 }
161 else if (nParents>1) {
162 brush.setColor(Qt::red);
163 }
164 }
165
166 item->setForeground(0,brush);
167 item->setForeground(1,brush);
168 item->setForeground(2,brush);
169 item->setForeground(3,brush);
170 item->setForeground(4,brush);
171 }
172 if (1) {
173 HepMC::ConstGenVertexPtr decayVertex = theParticle.end_vertex();
174 if (decayVertex) {
175 // decayVertex->print();
176 for ( const HepMC::ConstGenParticlePtr& current : *decayVertex ) {
177 QTreeWidgetItem *newItem = new QTreeWidgetItem();
178 item->addChild(newItem);
179 handle(newItem,*current);
180 }
181 }
182 }
183}
184
185
186//____________________________________________________________________
188 : IVP1System("MC",
189 "System for browsing the MC Event",
190 "Joe Boudreau <boudreau@pitt.edu> (original), Thomas.Kittelmann@cern.ch (VP1 implementation)"),
191 m_d(new Imp(this))
192{
193}
194
195
196//____________________________________________________________________
198{
199 delete m_d; m_d=0;
200}
201
202
203
204//____________________________________________________________________
206{
207 QWidget * controller = new QWidget;
208 m_d->ui.setupUi(controller);
209 connect(m_d->ui.addButton,SIGNAL(clicked()), this, SLOT(addParticle()));
210 connect(m_d->ui.subtractButton,SIGNAL(clicked()), this, SLOT(removeParticle()));
211 connect(m_d->ui.searchButton,SIGNAL(clicked()), this, SLOT(searchParticles()));
212 connect (m_d->ui.listWidget, SIGNAL (itemDoubleClicked (QListWidgetItem *)), this, SLOT (editItem (QListWidgetItem *)));
213 registerController(controller);
214
215}
216
217//____________________________________________________________________
219{
220 //erase();
222 if (VP1SGAccessHelper(this).retrieve(iter,endColl)) {
223 for (;iter!=endColl;++iter) {
225 for (e=iter->begin();e!=iter->end(); ++e) {
226 for (const HepMC::ConstGenParticlePtr& particle : **e) {
227 if (!particle->production_vertex() || ! particle->production_vertex()->particles_in_size()) {
228 QTreeWidgetItem *item = new QTreeWidgetItem();
229 m_d->tw->insertTopLevelItem(m_d->tw->topLevelItemCount(), item);
230 m_d->handle(item,*particle);
231 }
232 }
233 }
234 }
235 }
236}
237
238
239//____________________________________________________________________
241{
242 m_d->tw->clear();
243}
244
245//____________________________________________________________________
247{
248 VP1Serialise serialise(0/*version*/,this);
249 serialise.save(IVP1System::saveState());//Info from base class
250 serialise.save(m_d->ui.listWidget->count());
251 for (int i=0;i<m_d->ui.listWidget->count();++i) {
252 m_d->ui.listWidget->setCurrentRow(i);
253 serialise.save(m_d->ui.listWidget->item(i)->text());
254 }
255 serialise.warnUnsaved(controllerWidget());
256 return serialise.result();
257
258}
259
260//____________________________________________________________________
262{
263 VP1Deserialise state(ba,this);
264 if (state.version()!=0) {
265 message("Warning: State data in .vp1 file is in wrong format - ignoring!");
266 return;
267 }
268 IVP1System::restoreFromState(state.restoreByteArray());
269 qint32 itemCount=state.restoreInt();
270 for (int i=0;i<itemCount;++i) {
271 QString text=state.restoreString();
272 m_d->ui.listWidget->addItem(text);
273 }
274 state.warnUnrestored(controllerWidget());
275}
276
277void VP1MCSystem::setTree(QTreeWidget *tw) {
278 m_d->tw=tw;
279 m_d->tw->setColumnCount(5);
280 m_d->tw->setHeaderLabels((QStringList()<<"Type"<< "ID" << "Mass (GeV) " << "Pt (GeV)"<<"Eta"<<"Phi"));
281 m_d->tw->setAlternatingRowColors ( true );
282 m_d->tw->setEditTriggers(QAbstractItemView::NoEditTriggers);
283}
285 message("Adding...");
286 m_d->ui.listWidget->addItem("<particleName>");
287 m_d->ui.listWidget->setCurrentRow(m_d->ui.listWidget->count()-1);
288 //QListWidgetItem *item =m_d->ui.listWidget->currentItem();
289 //item->setFlags(Qt::ItemIsEditable|Qt::ItemIsSelectable);
290 //m_d->ui.listWidget->editItem(item);
291}
293 message("Removing...");
294 QList<QListWidgetItem *> selectedItems =m_d->ui.listWidget->selectedItems();
295 for (int i=0;i<selectedItems.size();++i) {
296 int row = m_d->ui.listWidget->row(selectedItems[i]);
297 QListWidgetItem *item = m_d->ui.listWidget->takeItem(row);
298 delete item;
299 }
300}
302 message("Searching...");
303 m_d->tw->collapseAll();
304 for (int j=0;j<m_d->ui.listWidget->count();++j) {
305 m_d->ui.listWidget->setCurrentRow(j);
306 QString text = m_d->ui.listWidget->currentItem()->text();
307 for (int i=0;i<m_d->tw->topLevelItemCount();++i) {
308 m_d->zeroFormat(m_d->tw->topLevelItem(i));
309 }
310 }
311
312 for (int j=0;j<m_d->ui.listWidget->count();++j) {
313 m_d->ui.listWidget->setCurrentRow(j);
314 QString text = m_d->ui.listWidget->currentItem()->text();
315 for (int i=0;i<m_d->tw->topLevelItemCount();++i) {
316 m_d->expand(text,m_d->tw->topLevelItem(i));
317 }
318 }
319
320
321}
322
323void VP1MCSystem::editItem(QListWidgetItem *item) {
324 m_d->ui.listWidget->openPersistentEditor(item);
325}
#define M_PI
Scalar eta() const
pseudorapidity method
Scalar phi() const
phi method
static Double_t tc
int iabs(int a)
DataModel_detail::const_iterator< DataVector > const_iterator
Standard const_iterator.
Definition DataVector.h:838
virtual void restoreFromState(QByteArray)
const QString & name() const
State state() const
QWidget * controllerWidget()
IVP1System(const QString &name, const QString &information, const QString &contact_info)
void message(const QString &) const
void registerController(QWidget *)
virtual QByteArray saveState()
a const_iterator facade to DataHandle.
Definition SGIterator.h:164
The Athena Transient Store API.
void handle(QTreeWidgetItem *item, const HepMC::GenParticle &particle)
Imp(VP1MCSystem *tc)
Ui::VP1MCSystemControllerForm ui
QTreeWidget * tw
void zeroFormat(QTreeWidgetItem *item)
SmartIF< IPartPropSvc > pps
void expand(const QString &text, QTreeWidgetItem *item)
VP1MCSystem * theclass
void removeParticle()
void setTree(QTreeWidget *tw)
void restoreFromState(QByteArray)
virtual ~VP1MCSystem()
void refresh(StoreGateSvc *storegate)
void create(StoreGateSvc *detstore)
QByteArray saveState()
void editItem(QListWidgetItem *)
void addParticle()
void searchParticles()
static QString particleName(const int &pdgcode, bool &ok)
const GenParticle * ConstGenParticlePtr
Definition GenParticle.h:38
const HepMC::GenVertex * ConstGenVertexPtr
Definition GenVertex.h:60