#include "TROOT.h"
#include "TGenerator.h"
#include "TDatabasePDG.h"
#include "TParticlePDG.h"
#include "TParticle.h"
#include "TObjArray.h"
#include "Hepevt.h"
#include "TVirtualPad.h"
#include "TView.h"
#include "TText.h"
#include "TPaveText.h"
#include "TClonesArray.h"
#include "Riostream.h"
ClassImp(TGenerator)
TGenerator::TGenerator(const char *name,const char *title): TNamed(name,title)
{
TDatabasePDG::Instance();
fPtCut = 0;
fShowNeutrons = kTRUE;
fParticles = new TObjArray(10000);
}
TGenerator::~TGenerator()
{
if (fParticles) {
fParticles->Delete();
delete fParticles;
fParticles = 0;
}
}
void TGenerator::GenerateEvent()
{
}
TObjArray* TGenerator::ImportParticles(Option_t *option)
{
fParticles->Clear();
Int_t numpart = HEPEVT.nhep;
if (!strcmp(option,"") || !strcmp(option,"Final")) {
for (Int_t i = 0; i<numpart; i++) {
if (HEPEVT.isthep[i] == 1) {
TParticle *p = new TParticle(
HEPEVT.idhep[i],
HEPEVT.isthep[i],
HEPEVT.jmohep[i][0]-1,
HEPEVT.jmohep[i][1]-1,
HEPEVT.jdahep[i][0]-1,
HEPEVT.jdahep[i][1]-1,
HEPEVT.phep[i][0],
HEPEVT.phep[i][1],
HEPEVT.phep[i][2],
HEPEVT.phep[i][3],
HEPEVT.vhep[i][0],
HEPEVT.vhep[i][1],
HEPEVT.vhep[i][2],
HEPEVT.vhep[i][3]);
fParticles->Add(p);
}
}
} else if (!strcmp(option,"All")) {
for (Int_t i = 0; i<numpart; i++) {
TParticle *p = new TParticle(
HEPEVT.idhep[i],
HEPEVT.isthep[i],
HEPEVT.jmohep[i][0]-1,
HEPEVT.jmohep[i][1]-1,
HEPEVT.jdahep[i][0]-1,
HEPEVT.jdahep[i][1]-1,
HEPEVT.phep[i][0],
HEPEVT.phep[i][1],
HEPEVT.phep[i][2],
HEPEVT.phep[i][3],
HEPEVT.vhep[i][0],
HEPEVT.vhep[i][1],
HEPEVT.vhep[i][2],
HEPEVT.vhep[i][3]);
fParticles->Add(p);
}
}
return fParticles;
}
Int_t TGenerator::ImportParticles(TClonesArray *particles, Option_t *option)
{
if (particles == 0) return 0;
TClonesArray &clonesParticles = *particles;
clonesParticles.Clear();
Int_t numpart = HEPEVT.nhep;
if (!strcmp(option,"") || !strcmp(option,"Final")) {
for (Int_t i = 0; i<numpart; i++) {
if (HEPEVT.isthep[i] == 1) {
new(clonesParticles[i]) TParticle(
HEPEVT.idhep[i],
HEPEVT.isthep[i],
HEPEVT.jmohep[i][0]-1,
HEPEVT.jmohep[i][1]-1,
HEPEVT.jdahep[i][0]-1,
HEPEVT.jdahep[i][1]-1,
HEPEVT.phep[i][0],
HEPEVT.phep[i][1],
HEPEVT.phep[i][2],
HEPEVT.phep[i][3],
HEPEVT.vhep[i][0],
HEPEVT.vhep[i][1],
HEPEVT.vhep[i][2],
HEPEVT.vhep[i][3]);
}
}
} else if (!strcmp(option,"All")) {
for (Int_t i = 0; i<numpart; i++) {
new(clonesParticles[i]) TParticle(
HEPEVT.idhep[i],
HEPEVT.isthep[i],
HEPEVT.jmohep[i][0]-1,
HEPEVT.jmohep[i][1]-1,
HEPEVT.jdahep[i][0]-1,
HEPEVT.jdahep[i][1]-1,
HEPEVT.phep[i][0],
HEPEVT.phep[i][1],
HEPEVT.phep[i][2],
HEPEVT.phep[i][3],
HEPEVT.vhep[i][0],
HEPEVT.vhep[i][1],
HEPEVT.vhep[i][2],
HEPEVT.vhep[i][3]);
}
}
return numpart;
}
void TGenerator::Browse(TBrowser *)
{
Draw();
gPad->Update();
}
Int_t TGenerator::DistancetoPrimitive(Int_t px, Int_t py)
{
const Int_t big = 9999;
const Int_t inview = 0;
Int_t dist = big;
if (px > 50 && py > 50) dist = inview;
return dist;
}
void TGenerator::Draw(Option_t *option)
{
if (!gPad) {
gROOT->MakeDefCanvas();
if (gPad->GetVirtCanvas())
gPad->GetVirtCanvas()->SetFillColor(13);
}
static Float_t rbox = 1000;
Float_t rmin[3],rmax[3];
TView *view = gPad->GetView();
if (!strstr(option,"same")) {
if (view) { view->GetRange(rmin,rmax); rbox = rmax[2];}
gPad->Clear();
}
AppendPad(option);
view = gPad->GetView();
if (view) {
view->GetRange(rmin,rmax);
rbox = rmax[2];
} else {
view = TView::CreateView(1,0,0);
if (view) view->SetRange(-rbox,-rbox,-rbox, rbox,rbox,rbox );
}
const Int_t kColorProton = 4;
const Int_t kColorNeutron = 5;
const Int_t kColorAntiProton= 3;
const Int_t kColorPionPlus = 6;
const Int_t kColorPionMinus = 2;
const Int_t kColorKaons = 7;
const Int_t kColorElectrons = 0;
const Int_t kColorGamma = 18;
Int_t nProtons = 0;
Int_t nNeutrons = 0;
Int_t nAntiProtons= 0;
Int_t nPionPlus = 0;
Int_t nPionMinus = 0;
Int_t nKaons = 0;
Int_t nElectrons = 0;
Int_t nGammas = 0;
Int_t ntracks = fParticles->GetEntriesFast();
Int_t i,lwidth,color,lstyle;
TParticlePDG *ap;
TParticle *p;
const char *name;
Double_t etot,vx,vy,vz;
Int_t ninvol = 0;
for (i=0;i<ntracks;i++) {
p = (TParticle*)fParticles->UncheckedAt(i);
if(!p) continue;
ap = (TParticlePDG*)p->GetPDG();
vx = p->Vx();
vy = p->Vy();
vz = p->Vz();
if (vx*vx+vy*vy+vz*vz > rbox*rbox) continue;
Float_t pt = p->Pt();
if (pt < fPtCut) continue;
etot = p->Energy();
if (etot > 0.1) lwidth = Int_t(6*TMath::Log10(etot));
else lwidth = 1;
if (lwidth < 1) lwidth = 1;
lstyle = 1;
color = 0;
name = ap->GetName();
if (!strcmp(name,"n")) { if (!fShowNeutrons) continue;
color = kColorNeutron; nNeutrons++;}
if (!strcmp(name,"p")) { color = kColorProton; nProtons++;}
if (!strcmp(name,"p bar")) { color = kColorAntiProton; nAntiProtons++;}
if (!strcmp(name,"pi+")) { color = kColorPionPlus; nPionPlus++;}
if (!strcmp(name,"pi-")) { color = kColorPionMinus; nPionMinus++;}
if (!strcmp(name,"e+")) { color = kColorElectrons; nElectrons++;}
if (!strcmp(name,"e-")) { color = kColorElectrons; nElectrons++;}
if (!strcmp(name,"gamma")) { color = kColorGamma; nGammas++; lstyle = 3; }
if ( strstr(name,"K")) { color = kColorKaons; nKaons++;}
p->SetLineColor(color);
p->SetLineStyle(lstyle);
p->SetLineWidth(lwidth);
p->AppendPad();
ninvol++;
}
TPaveText *pt = new TPaveText(-0.94,0.85,-0.25,0.98,"br");
pt->AddText((char*)GetName());
pt->AddText((char*)GetTitle());
pt->SetFillColor(42);
pt->Draw();
Int_t tcolor = 5;
if (gPad->GetFillColor() == 10) tcolor = 4;
TText *text = new TText(-0.95,-0.47,"Particles");
text->SetTextAlign(12);
text->SetTextSize(0.025);
text->SetTextColor(tcolor);
text->Draw();
text->SetTextColor(kColorGamma); text->DrawText(-0.95,-0.52,"(on screen)");
text->SetTextColor(kColorGamma); text->DrawText(-0.95,-0.57,"Gamma");
text->SetTextColor(kColorProton); text->DrawText(-0.95,-0.62,"Proton");
text->SetTextColor(kColorNeutron); text->DrawText(-0.95,-0.67,"Neutron");
text->SetTextColor(kColorAntiProton); text->DrawText(-0.95,-0.72,"AntiProton");
text->SetTextColor(kColorPionPlus); text->DrawText(-0.95,-0.77,"Pion +");
text->SetTextColor(kColorPionMinus); text->DrawText(-0.95,-0.82,"Pion -");
text->SetTextColor(kColorKaons); text->DrawText(-0.95,-0.87,"Kaons");
text->SetTextColor(kColorElectrons); text->DrawText(-0.95,-0.92,"Electrons,etc.");
text->SetTextColor(tcolor);
text->SetTextAlign(32);
char tcount[32];
snprintf(tcount,12,"%d",ntracks); text->DrawText(-0.55,-0.47,tcount);
snprintf(tcount,12,"%d",ninvol); text->DrawText(-0.55,-0.52,tcount);
snprintf(tcount,12,"%d",nGammas); text->DrawText(-0.55,-0.57,tcount);
snprintf(tcount,12,"%d",nProtons); text->DrawText(-0.55,-0.62,tcount);
snprintf(tcount,12,"%d",nNeutrons); text->DrawText(-0.55,-0.67,tcount);
snprintf(tcount,12,"%d",nAntiProtons); text->DrawText(-0.55,-0.72,tcount);
snprintf(tcount,12,"%d",nPionPlus); text->DrawText(-0.55,-0.77,tcount);
snprintf(tcount,12,"%d",nPionMinus); text->DrawText(-0.55,-0.82,tcount);
snprintf(tcount,12,"%d",nKaons); text->DrawText(-0.55,-0.87,tcount);
snprintf(tcount,12,"%d",nElectrons); text->DrawText(-0.55,-0.92,tcount);
text->SetTextAlign(12);
if (nPionPlus+nPionMinus) {
snprintf(tcount,31,"Protons/Pions= %4f",Float_t(nProtons)/Float_t(nPionPlus+nPionMinus));
} else {
strlcpy(tcount,"Protons/Pions= inf",31);
}
text->DrawText(-0.45,-0.92,tcount);
if (nPionPlus+nPionMinus) {
snprintf(tcount,12,"Kaons/Pions= %4f",Float_t(nKaons)/Float_t(nPionPlus+nPionMinus));
} else {
strlcpy(tcount,"Kaons/Pions= inf",31);
}
text->DrawText(0.30,-0.92,tcount);
}
void TGenerator::ExecuteEvent(Int_t event, Int_t px, Int_t py)
{
if (gPad->GetView()) {
gPad->GetView()->ExecuteRotateView(event, px, py);
return;
}
}
Int_t TGenerator::GetNumberOfParticles() const
{
return fParticles->GetLast()+1;
}
TParticle *TGenerator::GetParticle(Int_t i) const
{
if (!fParticles) return 0;
Int_t n = fParticles->GetLast();
if (i < 0 || i > n) return 0;
return (TParticle*)fParticles->UncheckedAt(i);
}
void TGenerator::Paint(Option_t *)
{
}
void TGenerator::SetPtCut(Float_t ptcut)
{
fPtCut = ptcut;
Draw();
gPad->Update();
}
void TGenerator::SetViewRadius(Float_t rbox)
{
SetViewRange(-rbox,-rbox,-rbox,rbox,rbox,rbox);
}
void TGenerator::SetViewRange(Float_t xmin, Float_t ymin, Float_t zmin, Float_t xmax, Float_t ymax, Float_t zmax)
{
TView *view = gPad->GetView();
if (!view) return;
view->SetRange(xmin,ymin,zmin,xmax,ymax,zmax);
Draw();
gPad->Update();
}
void TGenerator::ShowNeutrons(Bool_t show)
{
fShowNeutrons = show;
Draw();
gPad->Update();
}