ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/UserCode/ForwardAnalysis/Utilities/src/HepMCFileReader.cc
Revision: 1.1
Committed: Mon Jun 11 12:59:57 2012 UTC (12 years, 10 months ago) by antoniov
Content type: text/plain
Branch: MAIN
CVS Tags: V01-01-01, V01-01-00, antoniov-forwardAnalysis-09Jul2012-v1, antoniov-forwardAnalysis-29Jun2012-v1, V01-00-00, antoniov-utilities-11Jun2012-v1, HEAD
Log Message:
update

File Contents

# Content
1 // $Id: HepMCFileReader.cc,v 1.1 2012/06/07 19:10:12 antoniov Exp $
2
3 /**
4 * See header file for a description of this class.
5 *
6 *
7 * $Date: 2012/06/07 19:10:12 $
8 * $Revision: 1.1 $
9 * \author Jo. Weng - CERN, Ph Division & Uni Karlsruhe
10 */
11
12 #include <iostream>
13 #include <iomanip>
14 #include <string>
15
16 #include "HepMC/GenEvent.h"
17 #include "HepMC/GenParticle.h"
18 #include "HepMC/IO_GenEvent.h"
19
20 #include "CLHEP/Units/GlobalPhysicalConstants.h"
21
22 #include "ForwardAnalysis/Utilities/interface/HepMCFileReader.h"
23 #include "FWCore/MessageLogger/interface/MessageLogger.h"
24 #include "FWCore/Utilities/interface/Exception.h"
25
26 using namespace std;
27
28
29 HepMCFileReader *HepMCFileReader::instance_=0;
30
31
32 //-------------------------------------------------------------------------
33 HepMCFileReader *HepMCFileReader::instance()
34 {
35 // Implement a HepMCFileReader singleton.
36
37 if (instance_== 0) {
38 instance_ = new HepMCFileReader();
39 }
40 return instance_;
41 }
42
43
44 //-------------------------------------------------------------------------
45 HepMCFileReader::HepMCFileReader() :
46 evt_(0), input_(0)
47 {
48 // Default constructor.
49 if (instance_ == 0) {
50 instance_ = this;
51 } else {
52 edm::LogError("HepMCFileReader") << "Constructing a new instance";
53 }
54 }
55
56
57 //-------------------------------------------------------------------------
58 HepMCFileReader::~HepMCFileReader()
59 {
60 edm::LogInfo("HepMCFileReader") << "Destructing HepMCFileReader";
61
62 instance_=0;
63 delete input_;
64 }
65
66
67 //-------------------------------------------------------------------------
68 void HepMCFileReader::initialize(const string &filename)
69 {
70 if (isInitialized()) {
71 edm::LogError("HepMCFileReader") << "Was already initialized... reinitializing";
72 delete input_;
73 }
74
75 edm::LogInfo("HepMCFileReader") << "Opening file" << filename << "using HepMC::IO_GenEvent";
76 input_ = new HepMC::IO_GenEvent(filename.c_str(), std::ios::in);
77
78 if (rdstate() == std::ios::failbit) {
79 throw cms::Exception("FileNotFound", "HepMCFileReader::initialize()")
80 << "File " << filename << " was not found.\n";
81 }
82 }
83
84
85 //-------------------------------------------------------------------------
86 int HepMCFileReader::rdstate() const
87 {
88 // work around a HepMC IO_ inheritence shortfall
89
90 HepMC::IO_GenEvent *p = dynamic_cast<HepMC::IO_GenEvent*>(input_);
91 if (p) return p->rdstate();
92
93 return std::ios::failbit;
94 }
95
96
97 //-------------------------------------------------------------------------
98 bool HepMCFileReader::readCurrentEvent()
99 {
100 evt_ = input_->read_next_event();
101 if (evt_) {
102 edm::LogInfo("HepMCFileReader") << "| --- Event Nr. " << evt_->event_number()
103 << " with " << evt_->particles_size() << " particles --- !";
104 ReadStats();
105 // printHepMcEvent();
106 // printEvent();
107 } else {
108 edm::LogInfo("HepMCFileReader") << "Got no event" <<endl;
109 }
110
111 return evt_ != 0;
112 }
113
114
115 //-------------------------------------------------------------------------
116 bool HepMCFileReader::setEvent(int event)
117 {
118 return true;
119 }
120
121
122 //-------------------------------------------------------------------------
123 bool HepMCFileReader::printHepMcEvent() const
124 {
125 if (evt_ != 0) evt_->print();
126 return true;
127 }
128
129
130 //-------------------------------------------------------------------------
131 HepMC::GenEvent * HepMCFileReader::fillCurrentEventData()
132 {
133 readCurrentEvent();
134 return evt_;
135 }
136
137
138 //-------------------------------------------------------------------------
139 // Print out in old CMKIN style for comparisons
140 void HepMCFileReader::printEvent() const {
141 int mo1=0,mo2=0,da1=0,da2=0,status=0,pid=0;
142 if (evt_ != 0) {
143 cout << "---#-------pid--st---Mo1---Mo2---Da1---Da2------px------py------pz-------E-";
144 cout << "------m---------x---------y---------z---------t-";
145 cout << endl;
146 cout.setf(ios::right, ios::adjustfield);
147 for(int n=1; n<=evt_->particles_size(); n++) {
148 HepMC::GenParticle *g = index_to_particle[n];
149 getStatsFromTuple( mo1,mo2,da1,da2,status,pid,n);
150 cout << setw(4) << n
151 << setw(8) << pid
152 << setw(5) << status
153 << setw(6) << mo1
154 << setw(6) << mo2
155 << setw(6) << da1
156 << setw(6) << da2;
157 cout.setf(ios::fixed, ios::floatfield);
158 cout.setf(ios::right, ios::adjustfield);
159 cout << setw(10) << setprecision(2) << g->momentum().x();
160 cout << setw(8) << setprecision(2) << g->momentum().y();
161 cout << setw(10) << setprecision(2) << g->momentum().z();
162 cout << setw(8) << setprecision(2) << g->momentum().t();
163 cout << setw(8) << setprecision(2) << g->generatedMass();
164 // tau=L/(gamma*beta*c)
165 if (g->production_vertex() != 0 && g->end_vertex() != 0 && status == 2) {
166 cout << setw(10) << setprecision(2) <<g->production_vertex()->position().x();
167 cout << setw(10) << setprecision(2) <<g->production_vertex()->position().y();
168 cout << setw(10) << setprecision(2) <<g->production_vertex()->position().z();
169
170 double xm = g->production_vertex()->position().x();
171 double ym = g->production_vertex()->position().y();
172 double zm = g->production_vertex()->position().z();
173 double xd = g->end_vertex()->position().x();
174 double yd = g->end_vertex()->position().y();
175 double zd = g->end_vertex()->position().z();
176 double decl = sqrt((xd-xm)*(xd-xm)+(yd-ym)*(yd-ym)+(zd-zm)*(zd-zm));
177 double labTime = decl/c_light;
178 // convert lab time to proper time
179 double properTime = labTime/g->momentum().rho()*(g->generatedMass() );
180 // set the proper time in nanoseconds
181 cout << setw(8) << setprecision(2) <<properTime;
182 }
183 else{
184 cout << setw(10) << setprecision(2) << 0.0;
185 cout << setw(10) << setprecision(2) << 0.0;
186 cout << setw(10) << setprecision(2) << 0.0;
187 cout << setw(8) << setprecision(2) << 0.0;
188 }
189 cout << endl;
190 }
191 } else {
192 cout << " HepMCFileReader: No event available !" << endl;
193 }
194 }
195
196
197 //-------------------------------------------------------------------------
198 void HepMCFileReader::ReadStats()
199 {
200 unsigned int particle_counter=0;
201 index_to_particle.reserve(evt_->particles_size()+1);
202 index_to_particle[0] = 0;
203 for (HepMC::GenEvent::vertex_const_iterator v = evt_->vertices_begin();
204 v != evt_->vertices_end(); ++v ) {
205 // making a list of incoming particles of the vertices
206 // so that the mother indices in HEPEVT can be filled properly
207 for (HepMC::GenVertex::particles_in_const_iterator p1 = (*v)->particles_in_const_begin();
208 p1 != (*v)->particles_in_const_end(); ++p1 ) {
209 ++particle_counter;
210 //particle_counter can be very large for heavy ions
211 if(particle_counter >= index_to_particle.size() ) {
212 //make it large enough to hold up to this index
213 index_to_particle.resize(particle_counter+1);
214 }
215 index_to_particle[particle_counter] = *p1;
216 particle_to_index[*p1] = particle_counter;
217 }
218 // daughters are entered only if they aren't a mother of
219 // another vertex
220 for (HepMC::GenVertex::particles_out_const_iterator p2 = (*v)->particles_out_const_begin();
221 p2 != (*v)->particles_out_const_end(); ++p2) {
222 if (!(*p2)->end_vertex()) {
223 ++particle_counter;
224 //particle_counter can be very large for heavy ions
225 if(particle_counter >= index_to_particle.size() ) {
226 //make it large enough to hold up to this index
227 index_to_particle.resize(particle_counter+1);
228 }
229 index_to_particle[particle_counter] = *p2;
230 particle_to_index[*p2] = particle_counter;
231 }
232 }
233 }
234 }
235
236
237 //-------------------------------------------------------------------------
238 void HepMCFileReader::getStatsFromTuple(int &mo1, int &mo2, int &da1, int &da2,
239 int &status, int &pid, int j) const
240 {
241 if (!evt_) {
242 cout << "HepMCFileReader: Got no event :-( Game over already ?" <<endl;
243 } else {
244 status = index_to_particle[j]->status();
245 pid = index_to_particle[j]->pdg_id();
246 if ( index_to_particle[j]->production_vertex() ) {
247
248 //HepLorentzVector p = index_to_particle[j]->
249 //production_vertex()->position();
250
251 int num_mothers = index_to_particle[j]->production_vertex()->
252 particles_in_size();
253 int first_mother = find_in_map( particle_to_index,
254 *(index_to_particle[j]->
255 production_vertex()->
256 particles_in_const_begin()));
257 int last_mother = first_mother + num_mothers - 1;
258 if ( first_mother == 0 ) last_mother = 0;
259 mo1=first_mother;
260 mo2=last_mother;
261 } else {
262 mo1 =0;
263 mo2 =0;
264 }
265 if (!index_to_particle[j]->end_vertex()) {
266 //find # of 1. daughter
267 int first_daughter = find_in_map( particle_to_index,
268 *(index_to_particle[j]->end_vertex()->particles_begin(HepMC::children)));
269 //cout <<"first_daughter "<< first_daughter << "num_daughters " << num_daughters << endl;
270 HepMC::GenVertex::particle_iterator ic;
271 int last_daughter=0;
272 //find # of last daughter
273 for (ic = index_to_particle[j]->end_vertex()->particles_begin(HepMC::children);
274 ic != index_to_particle[j]->end_vertex()->particles_end(HepMC::children); ++ic)
275 last_daughter= find_in_map( particle_to_index,*ic);
276
277 if (first_daughter== 0) last_daughter = 0;
278 da1=first_daughter;
279 da2=last_daughter;
280 } else {
281 da1=0;
282 da2=0;
283 }
284 }
285 }
286
287
288 //-------------------------------------------------------------------------
289 int HepMCFileReader::find_in_map( const std::map<HepMC::GenParticle*,int>& m,
290 HepMC::GenParticle *p) const
291 {
292 std::map<HepMC::GenParticle*,int>::const_iterator iter = m.find(p);
293 return (iter == m.end()) ? 0 : iter->second;
294 }
295