Prya13
July 11, 2018, 2:48pm
1
Hi All,
I am new to Root, trying to convert a STARlight ASCII file to root tree and I am using this macro ConvertStarlightAsciiToTree.C but I got the following error:
ConvertStarlightAsciiToTree.C:83:28: error: use of undeclared identifier ‘IDtoMass’
Double_t daughterMass = IDtoMass(particleCode);
How may I correct this?
Thank you.
couet
July 11, 2018, 2:50pm
2
can you post it ? with some STARlight ASCII file example ?
Prya13
July 11, 2018, 2:57pm
3
ConvertStarlightAsciiToTree.C from Spencer R. Klein paper.
#include <iostream>
#include <fstream>
#include <sstream>
#include "TLorentzVector.h"
#include "TClonesArray.h"
#include "TTree.h"
#include "TFile.h"
using namespace std;
void ConvertStarlightAsciiToTree(const char* inFileName = "slight.out",
const char* outFileName = "starlight.root")
{
// create output tree
TFile* outFile = new TFile(outFileName, "RECREATE");
if (!outFile) {
cerr << " error: could not create output file '" << outFileName << "'" << endl;
return;
}
TTree* outTree = new TTree("starlightTree", "starlightTree");
TLorentzVector* parentParticle = new TLorentzVector();
TClonesArray* daughterParticles = new TClonesArray("TLorentzVector");
outTree->Branch("parent", "TLorentzVector", &parentParticle, 32000, -1);
outTree->Branch("daughters", "TClonesArray", &daughterParticles, 32000, -1);
ifstream inFile;
inFile.open(inFileName);
unsigned int countLines = 0;
while (inFile.good()) {
string line;
stringstream lineStream;
// read EVENT
string label;
int eventNmb, nmbTracks;
if (!getline(inFile, line))
break;
++countLines;
lineStream.str(line);
assert(lineStream >> label >> eventNmb >> nmbTracks);
if (!(label == "EVENT:"))
continue;
// read vertex
if (!getline(inFile, line))
break;
++countLines;
lineStream.str(line);
assert(lineStream >> label);
assert(label == "VERTEX:");
*parentParticle = TLorentzVector(0, 0, 0, 0);
for (int i = 0; i < nmbTracks; ++i) {
// read tracks
int particleCode;
double momentum[3];
if (!getline(inFile, line))
break;
++countLines;
lineStream.str(line);
assert(lineStream >> label >> particleCode >> momentum[0] >> momentum[1] >> momentum[2]);
assert(label == "TRACK:");
Double_t daughterMass = IDtoMass(particleCode);
if (daughterMass < 0) {break;}
const double E = sqrt( momentum[0] * momentum[0] + momentum[1] * momentum[1]
+ momentum[2] * momentum[2] + daughterMass * daughterMass);
new ( (*daughterParticles)[i] ) TLorentzVector(momentum[0], momentum[1], momentum[2], E);
*parentParticle += *(static_cast<TLorentzVector*>(daughterParticles->At(i)));
}
daughterParticles->Compress();
outTree->Fill();
}
outTree->Write();
if (outFile) {
outFile->Close();
delete outFile;
}
}
double IDtoMass(int particleCode){
double mass;
if (particleCode == 2 || particleCode==3) {mass = 0.00051099907;} // electron
else if (particleCode == 5 || particleCode==6) {mass = 0.105658389;} // muon
else if (particleCode == 8 || particleCode==9) {mass = 0.13956995;} // charged pion
else if (particleCode == 7) {mass = 0.1345766;} // neutral pion
else if (particleCode == 11|| particleCode==12) {mass = 0.493677;} // charged kaon
else if (particleCode == 10 || particleCode == 16) {mass = 0.497614;} // neutral kaon
else if (particleCode == 14) {mass = 0.93827231;} // proton
else {
cout << "unknown daughter particle (ID = " << particleCode << "), please modify code to accomodate" << endl;
mass = -1.0;
//
Right after the using namespace std;
line add a new line: double IDtoMass(int particleCode);
Prya13
July 11, 2018, 3:12pm
5
Thank you so much it worked.