17 #include "G4UIcommandTree.hh" 58 pcolors[2112] = QPen(Qt::black, 5);
59 pcolors[22] = QPen(Qt::blue, 5);
60 pcolors[11] = QPen(Qt::cyan, 5);
61 pcolors[2212] = QPen(QColor(240, 80, 80), 5);
62 pcolors[211] = QPen(Qt::magenta, 5);
63 pcolors[-211] = QPen(Qt::yellow, 5);
64 pcolors[-11] = QPen(Qt::red, 5);
69 QSplitter *splitter =
new QSplitter(Qt::Vertical);
77 QSplitter *treesplitter =
new QSplitter(Qt::Horizontal);
80 QVBoxLayout *topLayout =
new QVBoxLayout(treesplitter);
83 s_detectors =
new QTreeWidget();
86 topLayout->addWidget(s_detectors);
90 gsignals =
new QTreeWidget();
93 topLayout->addWidget(gsignals);
100 treesplitter->setSizes(tlist);
103 QVBoxLayout *layoutTop =
new QVBoxLayout(topWidget);
104 layoutTop->addWidget(treesplitter);
111 bottomWidget->setMinimumSize(600, 450);
112 bottomWidget->setMaximumSize(600, 450);
114 plots =
new QGraphicsView();
115 scene =
new QGraphicsScene();
116 plots->setScene(scene);
121 QVBoxLayout *layoutBottom =
new QVBoxLayout(bottomWidget);
122 layoutBottom->addWidget(
new QLabel(
"Signal:"));
123 layoutBottom->addWidget(plots);
130 splitter->setSizes(list);
136 QVBoxLayout *mainLayout =
new QVBoxLayout;
137 mainLayout->addWidget(splitter);
138 setLayout(mainLayout);
143 HitGrad = QLinearGradient(QPointF(1, 100), QPointF(180, 20));
144 HitGrad.setColorAt(0, QColor(255, 80, 80));
145 HitGrad.setColorAt(1, QColor(245, 245, 245));
146 HitBrush = QBrush(HitGrad);
152 s_detectors->clear();
153 s_detectors->setSelectionMode(QAbstractItemView::SingleSelection);
155 labels << QString(
"Hits List");
156 s_detectors->setHeaderLabels(labels);
158 QTreeWidgetItem * newItem;
161 for(map<string, MSensitiveDetector*>::iterator it =
SeDe_Map.begin(); it!=
SeDe_Map.end(); it++)
165 if(MHC) nhits = MHC->GetSize();
169 if(it->first !=
"Mirrors")
171 newItem =
new QTreeWidgetItem(s_detectors);
172 newItem->setText(0, QString(it->first.c_str()));
176 newItem->setBackground(0, HitBrush );
177 string snhits = it->first +
" " +
stringify(nhits) +
" hit";
178 if(nhits>1) snhits +=
"s";
179 newItem->setText(0, QString(snhits.c_str()));
182 QTreeWidgetItem *newHit;
187 for(
int h=0; h<nhits; h++)
190 int nsteps = aHit->
GetPos().size();
191 newHit =
new QTreeWidgetItem(newItem);
197 if(it->second->SDID.IDnames.back().find(
"nphe_pmt") != string::npos)
200 newHit->setText(0, QString(hitindex.c_str()));
205 connect(s_detectors, SIGNAL(itemSelectionChanged() ),
this, SLOT(
CreateSignalsTree() ) );
213 gsignals->setSelectionMode(QAbstractItemView::SingleSelection);
215 labels << QString(
"Signal");
216 gsignals->setHeaderLabels(labels);
218 QTreeWidgetItem* item = NULL;
221 QList<QTreeWidgetItem *> list = s_detectors->selectedItems();
232 string itext = item->text(0).toStdString();
234 stringstream sitext(itext);
239 sitext >> a >> b >> c;
240 index = atoi(c.c_str());
252 stringstream mtext(item->parent()->text(0).toStdString());
255 SD +=
" Hit n. " + c;
258 QTreeWidgetItem * newHit =
new QTreeWidgetItem(gsignals);
259 newHit->setText(0, QString(SD.c_str()));
260 newHit->setExpanded(1);
265 if(index>0 && index<=MHC->GetSize())
267 MHit* aHit = (*MHC)[index-1];
268 int nsteps = aHit->
GetPos().size();
272 if(MSD->
SDID.
IDnames.back().find(
"nphe_pmt") != string::npos)
276 newHit->setText(0, QString(SD.c_str()));
278 vector<double> ene = aHit->
GetEs();
279 vector<double> time = aHit->
GetTime();
280 vector<int> pid = aHit->
GetPIDs();
282 vector<double> lambda;
284 for(
unsigned int i=0; i<ene.size(); i++)
285 lambda.push_back(1240.0/(ene[i]/eV));
288 vector<identifier> identi = aHit->
GetId();
290 for(
unsigned int i=0; i<identi.size(); i++)
291 title += identi[i].name +
" " +
stringify(identi[i].
id) +
" " ;
293 QTreeWidgetItem * EneI =
new QTreeWidgetItem(newHit);
294 EneI->setText(0, QString(
" Wavelenght[nm] pid Time[ns] "));
295 EneI->setExpanded(1);
297 QTreeWidgetItem * EneItems;
298 for(
int i=0; i<nsteps; i++)
300 EneItems =
new QTreeWidgetItem(EneI);
302 sprintf(etext,
" %4.1f %d %5.4f ", lambda[i], pid[i], time[i]);
303 EneItems->setText(0, QString(etext));
304 EneItems->setTextAlignment(1, Qt::AlignJustify);
305 EneItems->setTextAlignment(2, Qt::AlignJustify);
307 plots_bg(
"time [ns]",
"Wavelenght [nm]", time, lambda, title);
314 newHit->setText(0, QString(SD.c_str()));
316 vector<double> edep = aHit->
GetEdep();
317 vector<double> time = aHit->
GetTime();
318 vector<G4ThreeVector> mom = aHit->
GetMoms();
319 vector<int> pid = aHit->
GetPIDs();
320 vector<identifier> identi = aHit->
GetId();
322 for(
unsigned int i=0; i<identi.size(); i++)
323 title += identi[i].name +
" " +
stringify(identi[i].
id) +
" " ;
328 for(
unsigned int i=0; i<edep.size(); i++)
329 if(edep[i]>max_edep) max_edep = edep[i];
335 QTreeWidgetItem * EdepI =
new QTreeWidgetItem(newHit);
336 EdepI->setText(0, QString(
" Edep[MeV] pid Time[ns] p[MeV]"));
337 EdepI->setExpanded(1);
339 QTreeWidgetItem * EdepItems;
340 for(
int i=0; i<nsteps; i++)
342 EdepItems =
new QTreeWidgetItem(EdepI);
344 sprintf(etext,
"%6.5f %d %5.4f %4.2f", edep[i], pid[i], time[i], mom[i].mag());
345 EdepItems->setText(0, QString(etext));
346 EdepItems->setTextAlignment(1, Qt::AlignJustify);
347 EdepItems->setTextAlignment(2, Qt::AlignJustify);
349 plots_bg(
"time [ns]",
"EDep [MeV]", time, edep, title);
360 void gsignal::plots_bg(
string xtit,
string ytit, vector<double> x, vector<double> y,
string title)
364 QGraphicsSimpleTextItem *Title =
new QGraphicsSimpleTextItem(QString(title.c_str()));
365 scene->addItem(Title);
366 QFont sansFont(
"Times", 18);
367 Title->setFont(sansFont);
368 Title->moveBy(20 - (
double) title.length()*3.0, 10);
370 if(x.size()<1)
return;
376 xaxis->setPen( QPen(Qt::black, 3));
377 xaxisa->setPen(QPen(Qt::black, 2));
378 xaxisb->setPen(QPen(Qt::black, 2));
379 scene->addItem(xaxis);
380 scene->addItem(xaxisa);
381 scene->addItem(xaxisb);
387 yaxis->setPen( QPen(Qt::black, 3));
388 yaxisa->setPen(QPen(Qt::black, 3));
389 yaxisb->setPen(QPen(Qt::black, 3));
390 scene->addItem(yaxis);
391 scene->addItem(yaxisa);
392 scene->addItem(yaxisb);
396 QGraphicsSimpleTextItem *xlab =
new QGraphicsSimpleTextItem(QString(xtit.c_str()));
397 QGraphicsSimpleTextItem *ylab =
new QGraphicsSimpleTextItem(QString(ytit.c_str()));
398 scene->addItem(xlab);
399 scene->addItem(ylab);
402 ylab->setRotation(-90);
407 for(
unsigned int i=0; i<x.size(); i++)
if(x[i] <
xmin)
xmin = x[i];
408 for(
unsigned int i=0; i<y.size(); i++)
if(y[i] <
ymin)
ymin = y[i];
411 for(
unsigned int i=0; i<x.size(); i++)
if(x[i] >
xmax)
xmax = x[i];
412 for(
unsigned int i=0; i<y.size(); i++)
if(y[i] >
ymax)
ymax = y[i];
423 QGraphicsSimpleTextItem *alab;
425 QGraphicsLineItem *xtick;
429 xtick->setPen( QPen(Qt::blue, 1, Qt::DashDotLine));
430 scene->addItem(xtick);
436 sprintf(lab,
"%4.3f",
xmin+ a*
dx/nticksx);
437 alab =
new QGraphicsSimpleTextItem(QString(lab));
438 QFont sansFont(
"Helvetica", 12);
439 alab->setFont(sansFont);
441 scene->addItem(alab);
445 QGraphicsLineItem *ytick;
449 ytick->setPen( QPen(Qt::blue, 1, Qt::DashDotLine));
450 scene->addItem(ytick);
457 if (
ymin+ a*
dy/nticksy < 0.01)
458 sprintf(lab,
"%5.4f",
ymin+ a*
dy/nticksy);
459 else if(
ymin+ a*
dy/nticksy < 1)
460 sprintf(lab,
"%5.3f",
ymin+ a*
dy/nticksy);
461 else if(
ymin+ a*
dy/nticksy < 10)
462 sprintf(lab,
"%5.2f",
ymin+ a*
dy/nticksy);
463 else if(
ymin+ a*
dy/nticksy < 100)
464 sprintf(lab,
"%5.1f",
ymin+ a*
dy/nticksy);
466 sprintf(lab,
"%5.0f",
ymin+ a*
dy/nticksy);
468 alab =
new QGraphicsSimpleTextItem(QString(lab));
469 QFont sansFont(
"Helvetica", 12);
470 alab->setFont(sansFont);
472 scene->addItem(alab);
479 if(x.size()<2)
return;
481 QGraphicsRectItem *rect;
483 for(
unsigned int i=0; i<x.size(); i++)
486 cout <<
" Attention: color not found for: " << pid[i] << endl;
489 rect = scene->addRect(0, 0, 6, 6,
pcolors[pid[i]]);
500 cout << hd_msg <<
" Signal Widget Deleted." << endl;
SDId SDID
SDId used for identification.
void plots_bg(string xtit, string ytit, vector< double > x, vector< double > y, string title)
vector< G4ThreeVector > GetMoms()
vector< identifier > GetId()
G4THitsCollection< MHit > MHitCollection
gsignal(QWidget *parent, gemc_opts *, map< string, MSensitiveDetector * >)
vector< string > IDnames
Identifier names as they should be in identifier.
QTreeWidget * CreateSignalsTree()
string stringify(double x)
vector< G4ThreeVector > GetPos()
void plot_graph(vector< double > x, vector< double > y, vector< int > pid)
map< string, MSensitiveDetector * > SeDe_Map
MHitCollection * GetMHitCollection()
returns hit collection
vector< double > GetTime()
map< string, opts > args
Options map.
QTreeWidget * CreateSDetsTree()
vector< double > GetEdep()