Index: trunk/src/EicSmearFormatWriter.h
===================================================================
--- trunk/src/EicSmearFormatWriter.h (revision 449)
+++ trunk/src/EicSmearFormatWriter.h (revision 450)
@@ -1,61 +1,61 @@
//==============================================================================
// EicSmearFormatWriter.h
//
// Copyright (C) 2021 Tobias Toll and Thomas Ullrich
//
// This file is part of Sartre.
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation.
// This program is distributed in the hope that it will be useful,
// but without any warranty; without even the implied warranty of
// merchantability or fitness for a particular purpose. See the
// GNU General Public License for more details.
// You should have received a copy of the GNU General Public License
// along with this program. If not, see .
//
// Author: Thomas Ullrich
// Last update:
-// $Date:$
-// $Author:$
+// $Date: 2021-06-16 11:55:44 -0400 (Wed, 16 Jun 2021) $
+// $Author: ullrich $
//==============================================================================
#ifndef EicSmearFormatWriter_h
#define EicSmearFormatWriter_h
#include
#include
#include
#include "TLorentzVector.h"
using namespace std;
class Event;
class EicSmearFormatWriter {
public:
EicSmearFormatWriter();
~EicSmearFormatWriter();
bool open(string, bool breakupOn = false);
bool writeEvent(Event*);
void close();
bool hasOpenFile() const;
string filename() const;
private:
bool writeHeader();
void writeKine(TLorentzVector&);
private:
bool mBreakupIsOn;
bool mFileOpen;
string mFilename;
ofstream mStream;
};
inline bool EicSmearFormatWriter::hasOpenFile() const {return mFileOpen;}
inline string EicSmearFormatWriter::filename() const {return mFilename;}
#endif
Index: trunk/src/EicSmearFormatWriter.cpp
===================================================================
--- trunk/src/EicSmearFormatWriter.cpp (revision 449)
+++ trunk/src/EicSmearFormatWriter.cpp (revision 450)
@@ -1,286 +1,287 @@
//==============================================================================
// EicSmearFormatWriter.cpp
//
// Copyright (C) 2021 Tobias Toll and Thomas Ullrich
//
// This file is part of Sartre.
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation.
// This program is distributed in the hope that it will be useful,
// but without any warranty; without even the implied warranty of
// merchantability or fitness for a particular purpose. See the
// GNU General Public License for more details.
// You should have received a copy of the GNU General Public License
// along with this program. If not, see .
//
// Author: Thomas Ullrich based on code by Barak Schmookler (SBU)
-// $Date$
-// $Author$
+// Last update:
+// $Date: 2021-06-16 11:55:44 -0400 (Wed, 16 Jun 2021) $
+// $Author: ullrich $
//==============================================================================
#include "Event.h"
#include "Constants.h"
#include "Enumerations.h"
#include "EicSmearFormatWriter.h"
#define PR(x) cout << #x << " = " << (x) << endl;
EicSmearFormatWriter::EicSmearFormatWriter()
{
mFileOpen = false;
mBreakupIsOn = false;
}
EicSmearFormatWriter::~EicSmearFormatWriter()
{
close();
}
bool EicSmearFormatWriter::open(string name, bool bupOn)
{
mBreakupIsOn = bupOn;
if (mFileOpen) { // stream already used
cout << "EicSmearFormatWriter::open(): Warning, trying to open file stream that is already open." << endl;
return false;
}
mFilename = name;
mStream.open(mFilename, ios_base::out);
if (mStream.is_open() && mStream.good()) {
mFileOpen = true;
writeHeader();
}
else {
cout << "EicSmearFormatWriter::open(): Error, failed to open file '"
<< mFilename << "'." << endl;
mStream.close();
mFileOpen = false;
}
return mFileOpen;
}
void EicSmearFormatWriter::close()
{
mStream.close();
mFileOpen = false;
mBreakupIsOn = false;
mFilename = "";
}
bool EicSmearFormatWriter::writeHeader()
{
//
// Six-line header according to
// https://eic.github.io/software/mcgen.html
//
if (!mStream.good()) return false;
mStream << "Sartre EVENT FILE" << endl;
mStream << "============================================" << endl;
mStream << "I, ievent, genevent, t, Q2, x, y, W2, nu, xpom, s, pol, dmod, bup" << endl;
mStream << "============================================" << endl;
mStream << "I, K(I,1) K(I,2) K(I,3) K(I,4) K(I,5) P(I,1) P(I,2) P(I,3) P(I,4) P(I,5) V(I,1) V(I,2) V(I,3)" << endl;
mStream << "============================================" << endl;
return true;
}
void EicSmearFormatWriter::writeKine(TLorentzVector& vec)
{
mStream << vec.Px(); // Px
mStream << "\t";
mStream << vec.Py(); // Py
mStream << "\t";
mStream << vec.Pz(); // Pz
mStream << "\t";
mStream << vec.E(); // Energy
mStream << "\t";
mStream << vec.M(); // Mass
}
bool EicSmearFormatWriter::writeEvent(Event* event)
{
//
// The first four tracks should be, in order,
// 1 - beam lepton
// 2 - beam hadron
// 3 - exchange boson (gamma*)
// 4 - scattered lepton
// That way, they are picked up correctly by the
// default methods
// Then we do
// 5 - pomeron
// 6 - scattered hadron
// 7 - vector meson
// If present
// 8 - decay daughter 1
// 9 - decay daughter 2
// followed by all fragments if breakup is on
//
if (!mFileOpen) {
cout << "EicSmearFormatWriter::writeEvent(): Error, no file assigned. Do not know where to write to." << endl;
return false;
}
else {
if (!mStream.good()) {
cout << "EicSmearFormatWriter::writeEvent(): Error, cannot write into file '"
<< mFilename << "'." << endl;
return false;
}
}
if (!event) {
cout << "EicSmearFormatWriter::writeEvent(): Error, event pointer is not valid (null)." << endl;
return false;
}
//
// The rest of the code is adapted from code by Barak Schmookler (SBU)
// Status codes used:
// stable - 1
// decayed - 11
// beam - 21
//
// General event info
//
mStream << "0"; // I
mStream << "\t";
mStream << event->eventNumber; // ievent
mStream << "\t";
mStream << "1"; //genevent
mStream << "\t";
mStream << event->t;
mStream << "\t";
mStream << event->Q2;
mStream << "\t";
mStream << event->x;
mStream << "\t";
mStream << event->y;
mStream << "\t";
mStream << event->W*event->W; // W2
mStream << "\t";
mStream << (event->Q2)/(2.*protonMass*event->x); // nu
mStream << "\t";
mStream << event->xpom;
mStream << "\t";
mStream << event->s;
mStream << "\t";
mStream << (event->polarization == transverse ? 0 : 1); // pol
mStream << "\t";
mStream << (event->diffractiveMode == coherent ? 0 : 1); // dmod
mStream << "\t";
mStream << (mBreakupIsOn ? 1 : 0); //bup
mStream << endl;
mStream << "============================================" << endl;
//
// Push back initial particle vectors
//
string vertex = "\t0\t0\t0";
// eIn
mStream << "1\t"; // I
mStream << "21\t"; // Status
mStream << event->particles[0].pdgId << '\t';
mStream << "0\t 0\t 0\t";
writeKine(event->particles[0].p);
mStream << vertex << endl; // Vertex
// pIn
mStream << "2\t";
mStream << "21\t"; // (21 for beam)
mStream << event->particles[1].pdgId << '\t';
//eic_out << "2212"; // "event->particles[1].pdgId" gives error on conversion
mStream << "0\t 0\t 0\t";
writeKine(event->particles[1].p);
mStream << vertex << endl; // Vertex
// gamma*
mStream << "3\t";
mStream << "21\t";
mStream << event->particles[3].pdgId;
mStream << "\t";
mStream << "0\t 0\t 0\t";
writeKine(event->particles[3].p);
mStream << vertex << endl;
// eOut
mStream << "4\t";
mStream << "1\t";
mStream << event->particles[2].pdgId;
mStream << "\t";
mStream << "1\t 0\t 0\t"; // 3 for scattered lepton
writeKine(event->particles[2].p);
mStream << vertex << endl;
// Pomeron
mStream << "5\t";
mStream << "21\t";
mStream << event->particles[5].pdgId;
mStream << "\t 0\t 0\t 0\t";
writeKine(event->particles[5].p);
mStream << vertex << endl;
// pOut
mStream << "6\t";
if(mBreakupIsOn && event->diffractiveMode == incoherent)
mStream << "11\t";
else
mStream << "1\t";
mStream << event->particles[6].pdgId;
mStream << "\t 2\t 0\t 0\t";
writeKine(event->particles[6].p);
mStream << vertex << endl;
// vector meson
int numberOfDaughters = event->particles[4].daughters.size();
mStream << "7\t";
mStream << (numberOfDaughters ? 11 : 1) << '\t';
mStream << event->particles[4].pdgId;
if (numberOfDaughters) {
mStream << "\t 0\t 8\t 9\t";
}
else {
mStream << "\t 0\t 0\t 0\t";
}
writeKine(event->particles[4].p);
mStream << vertex << endl;
//
// Check if daughters are present. If so
// stream them out as well.
//
int index = 7;
for (int i=0; i < numberOfDaughters; i++) {
mStream << ++index;
mStream << "\t";
mStream << "1\t";
int k = event->particles[4].daughters[i]; // vm = 4
mStream << event->particles[k].pdgId;
mStream << "\t 7\t 0\t 0\t";
writeKine(event->particles[k].p);
mStream << vertex << endl;
}
//
// If breakup is on write out the fragments
//
if (mBreakupIsOn) {
for (unsigned int i=index; iparticles.size(); i++) {
mStream << i+1;
mStream << "\t";
mStream << "1\t";
mStream << event->particles[i].pdgId;
mStream << "\t";
mStream << "6\t 0\t 0\t";
writeKine(event->particles[i].p);
mStream << vertex << endl;
}
}
mStream << "=============== Event finished ===============" << endl;
return mStream.good();
}