#include "TString.h" #include "TROOT.h" #include "TSystem.h" #include "TFile.h" #include "TTree.h" #include "TDatabasePDG.h" #include "TLorentzVector.h" #include #include #include #include using namespace std; struct smash_evt { Int_t evtNr; Int_t nParticle; Double_t impact; Double_t eBeam; Double_t flag; }; struct smash_p { Int_t t; Double_t x; Double_t y; Double_t z; Double_t mass; Double_t p0; Double_t px; Double_t py; Double_t pz; Int_t pdg; Int_t ID; Int_t charge; // extended Int_t ncoll; Double_t form_time; Int_t xsecfac; Int_t proc_id_origin; Int_t proc_type_origin; Double_t time_last_coll; Int_t pdg_mother1; Int_t pdg_mother2; // helpers Int_t geantID; Double_t E; Double_t weight; }; struct objects { TDatabasePDG PDG; smash_evt evt; vector particles; ofstream out; TString input; TString config; TString output; Int_t nEvts; Bool_t debug; }; Int_t convert(TString, TString, Int_t); Int_t convert_ROOT (objects& obj); Int_t convert_OSCAR13(objects& obj); Int_t write_Header(objects& obj); Int_t write_Event (objects& obj); Int_t scan_Config (objects& obj); Int_t convert(TString in, TString config, TString outf, Int_t nevts) { objects obj; obj.evt.eBeam = -1.0; // for the moment obj.debug = kFALSE; obj.input = in; obj.config = config; obj.output = outf; obj.nEvts = nevts; if(gSystem->AccessPathName(obj.input.Data())){ cerr<<"ERROR: input file : "<AccessPathName(obj.config.Data())){ cerr<<"ERROR: config file : "<AccessPathName(gSystem->DirName(obj.output.Data()))){ cerr<<"ERROR: output dir : "<DirName(obj.output.Data())<<" not found!"<cd(); TTree* T = (TTree*) gDirectory->Get("particles"); if(!T){ cerr<<"ERROR: Could not reed TTee \"particles\" from infile : "<SetBranchAddress("npart",&npart); T->SetBranchAddress("impact_b",&impact_b); T->SetBranchAddress("ev",&ev); T->SetBranchAddress("tcounter",&tcounter); T->SetBranchAddress("pdgcode",pdgcode); T->SetBranchAddress("p0",p0); T->SetBranchAddress("px",px); T->SetBranchAddress("py",py); T->SetBranchAddress("pz",pz); T->SetBranchAddress("t",t); T->SetBranchAddress("x",x); T->SetBranchAddress("y",y); T->SetBranchAddress("z",z); Long64_t nentries = T->GetEntries(); if(nentries > obj.nEvts && obj.nEvts != -1) nentries = obj.nEvts; Long64_t nbytes = 0; smash_p p; TLorentzVector v; Int_t evtCt = 0; for (Long64_t i=0; iGetEntry(i); if(nbytes<=0) break; obj.evt.evtNr = ev+1; obj.evt.nParticle = npart; obj.evt.impact = impact_b; for(Int_t j = 0; j < npart; j++){ p.t = (Int_t) t[j]; p.x = x[j]; p.y = y[j]; p.z = z[j]; p.p0 = p0[j]; p.px = px[j]; p.py = py[j]; p.pz = pz[j]; p.pdg = (Int_t) pdgcode[j]; p.geantID= obj.PDG.ConvertPdgToGeant3(p.pdg); TParticlePDG* pdg = obj.PDG.GetParticle(p.pdg); p.mass = pdg->Mass(); p.charge = (Int_t)pdg->Charge(); p.weight = 1.; p.ID = -1; v.SetXYZM(p.px,p.py,p.pz,p.mass); p.E = v.E(); obj.particles.push_back(p); } write_Header(obj); write_Event (obj); evtCt++; if(evtCt == obj.nEvts) { break; } } obj.out.close(); cout<<"Number of events read from file : "<> p.t >> p.x >> p.y >> p.z >> p.mass >> p.p0 >> p.px >> p.py >>p.pz >> p.pdg >> p.ID >> p.charge >> p.ncoll >> p.form_time >> p.xsecfac >> p.proc_id_origin >> p.proc_type_origin >> p.time_last_coll >> p.pdg_mother1 >> p.pdg_mother2; if(inFile.fail()){ cerr<<"ERROR: expected line is not a particle!"<Mass(); // to get the same out put for root/ascii (mass not in root file. smash precision of mass is lower (p 0.938 vs 0.9383 ) p.geantID = obj.PDG.ConvertPdgToGeant3(p.pdg); p.weight = 1.; v.SetXYZM(p.px,p.py,p.pz,p.mass); p.E = v.E(); obj.particles.push_back(p); if(n==12 || n==20){ if(obj.debug){ cout<1) cout<<"nArgs "<1) cout<<"infile = "<2) cout<<"config file = "<3) cout<<"outfile = "<4) cout<<"nevents = "<