1 | //-------------------------------------------------------------------------- |
---|
2 | |
---|
3 | #ifndef HEPEVT_EntriesAllocation |
---|
4 | #define HEPEVT_EntriesAllocation 10000 |
---|
5 | #endif // HEPEVT_EntriesAllocation |
---|
6 | |
---|
7 | //-------------------------------------------------------------------------- |
---|
8 | #ifndef HEPMC_HEPEVT_COMMON_H |
---|
9 | #define HEPMC_HEPEVT_COMMON_H |
---|
10 | ////////////////////////////////////////////////////////////////////////// |
---|
11 | // |
---|
12 | // PARAMETER (NMXHEP=2000) |
---|
13 | // COMMON/HEPEVT/NEVHEP,NHEP,ISTHEP(NMXHEP),IDHEP(NMXHEP), |
---|
14 | // & JMOHEP(2,NMXHEP),JDAHEP(2,NMXHEP),PHEP(5,NMXHEP),VHEP(4,NMXHEP) |
---|
15 | /**********************************************************/ |
---|
16 | /* D E S C R I P T I O N : */ |
---|
17 | /*--------------------------------------------------------*/ |
---|
18 | /* NEVHEP - event number (or some special meaning*/ |
---|
19 | /* (see documentation for details) */ |
---|
20 | /* NHEP - actual number of entries in current */ |
---|
21 | /* event. */ |
---|
22 | /* ISTHEP[IHEP] - status code for IHEP'th entry - see */ |
---|
23 | /* documentation for details */ |
---|
24 | /* IDHEP [IHEP] - IHEP'th particle identifier according*/ |
---|
25 | /* to PDG. */ |
---|
26 | /* JMOHEP[IHEP][0] - pointer to position of 1st mother */ |
---|
27 | /* JMOHEP[IHEP][1] - pointer to position of 2nd mother */ |
---|
28 | /* JDAHEP[IHEP][0] - pointer to position of 1st daughter */ |
---|
29 | /* JDAHEP[IHEP][1] - pointer to position of 2nd daughter */ |
---|
30 | /* PHEP [IHEP][0] - X momentum */ |
---|
31 | /* PHEP [IHEP][1] - Y momentum */ |
---|
32 | /* PHEP [IHEP][2] - Z momentum */ |
---|
33 | /* PHEP [IHEP][3] - Energy */ |
---|
34 | /* PHEP [IHEP][4] - Mass */ |
---|
35 | /* VHEP [IHEP][0] - X vertex */ |
---|
36 | /* VHEP [IHEP][1] - Y vertex */ |
---|
37 | /* VHEP [IHEP][2] - Z vertex */ |
---|
38 | /* VHEP [IHEP][3] - production time */ |
---|
39 | /*========================================================*/ |
---|
40 | // Remember, array(1) is the first entry in a fortran array, array[0] is the |
---|
41 | // first entry in a C array. |
---|
42 | // |
---|
43 | // This interface to HEPEVT common block treats the block as |
---|
44 | // an array of bytes --- the precision and number of entries |
---|
45 | // is determined "on the fly" by the wrapper and used to decode |
---|
46 | // each entry. |
---|
47 | // |
---|
48 | // HEPEVT_EntriesAllocation is the maximum size of the HEPEVT common block |
---|
49 | // that can be interfaced. |
---|
50 | // It is NOT the actual size of the HEPEVT common used in each |
---|
51 | // individual application. The actual size can be changed on |
---|
52 | // the fly using HEPEVT_Wrapper::set_max_number_entries(). |
---|
53 | // Thus HEPEVT_EntriesAllocation should typically be set |
---|
54 | // to the maximum possible number of entries --- 10000 is a good choice |
---|
55 | // (and is the number used by ATLAS versions of Pythia). |
---|
56 | // |
---|
57 | // Note: a statement like *( (int*)&hepevt.data[0] ) |
---|
58 | // takes the memory address of the first byte in HEPEVT, |
---|
59 | // interprets it as an integer pointer, |
---|
60 | // and dereferences the pointer. |
---|
61 | // i.e. it returns an integer corresponding to nevhep |
---|
62 | // |
---|
63 | |
---|
64 | #include <ctype.h> |
---|
65 | |
---|
66 | const unsigned int hepevt_bytes_allocation = |
---|
67 | sizeof(long int) * ( 2 + 6 * HEPEVT_EntriesAllocation ) |
---|
68 | + sizeof(double) * ( 9 * HEPEVT_EntriesAllocation ); |
---|
69 | |
---|
70 | |
---|
71 | #ifdef _WIN32 // Platform: Windows MS Visual C++ |
---|
72 | struct HEPEVT_DEF{ |
---|
73 | char data[hepevt_bytes_allocation]; |
---|
74 | }; |
---|
75 | extern "C" HEPEVT_DEF HEPEVT; |
---|
76 | #define hepevt HEPEVT |
---|
77 | |
---|
78 | #else |
---|
79 | extern "C" { |
---|
80 | extern struct { |
---|
81 | char data[hepevt_bytes_allocation]; |
---|
82 | } hepevt_; |
---|
83 | } |
---|
84 | #define hepevt hepevt_ |
---|
85 | |
---|
86 | #endif // Platform |
---|
87 | |
---|
88 | #endif // HEPMC_HEPEVT_COMMON_H |
---|
89 | |
---|
90 | //-------------------------------------------------------------------------- |
---|
91 | #ifndef HEPMC_HEPEVT_WRAPPER_H |
---|
92 | #define HEPMC_HEPEVT_WRAPPER_H |
---|
93 | |
---|
94 | ////////////////////////////////////////////////////////////////////////// |
---|
95 | // Matt.Dobbs@Cern.CH, April 24, 2000, refer to: |
---|
96 | // M. Dobbs and J.B. Hansen, "The HepMC C++ Monte Carlo Event Record for |
---|
97 | // High Energy Physics", Computer Physics Communications (to be published). |
---|
98 | // |
---|
99 | // Generic Wrapper for the fortran HEPEVT common block |
---|
100 | // This class is intended for static use only - it makes no sense to |
---|
101 | // instantiate it. |
---|
102 | // Updated: June 30, 2000 (static initialization moved to separate .cxx file) |
---|
103 | ////////////////////////////////////////////////////////////////////////// |
---|
104 | // |
---|
105 | // The index refers to the fortran style index: |
---|
106 | // i.e. index=1 refers to the first entry in the HEPEVT common block. |
---|
107 | // all indices must be >0 |
---|
108 | // number_entries --> integer between 0 and max_number_entries() giving total |
---|
109 | // number of sequential particle indices |
---|
110 | // first_parent/child --> index of first mother/child if there is one, |
---|
111 | // zero otherwise |
---|
112 | // last_parent/child --> if number children is >1, address of last parent/child |
---|
113 | // if number of children is 1, same as first_parent/child |
---|
114 | // if there are no children, returns zero. |
---|
115 | // is_double_precision --> T or F depending if floating point variables |
---|
116 | // are 8 or 4 bytes |
---|
117 | // |
---|
118 | |
---|
119 | #include <iostream> |
---|
120 | #include <cstdio> // needed for formatted output using sprintf |
---|
121 | |
---|
122 | namespace HepMC { |
---|
123 | |
---|
124 | //! Generic Wrapper for the fortran HEPEVT common block |
---|
125 | |
---|
126 | /// \class HEPEVT_Wrapper |
---|
127 | /// This class is intended for static use only - it makes no sense to |
---|
128 | /// instantiate it. |
---|
129 | /// |
---|
130 | class HEPEVT_Wrapper { |
---|
131 | public: |
---|
132 | |
---|
133 | /// write information from HEPEVT common block |
---|
134 | static void print_hepevt( std::ostream& ostr = std::cout ); |
---|
135 | /// write particle information to ostr |
---|
136 | static void print_hepevt_particle( int index, |
---|
137 | std::ostream& ostr = std::cout ); |
---|
138 | static bool is_double_precision(); //!< True if common block uses double |
---|
139 | |
---|
140 | /// check for problems with HEPEVT common block |
---|
141 | static bool check_hepevt_consistency( std::ostream& ostr = std::cout ); |
---|
142 | |
---|
143 | /// set all entries in HEPEVT to zero |
---|
144 | static void zero_everything(); |
---|
145 | |
---|
146 | //////////////////// |
---|
147 | // Access Methods // |
---|
148 | //////////////////// |
---|
149 | static int event_number(); //!< event number |
---|
150 | static int number_entries(); //!< num entries in current evt |
---|
151 | static int status( int index ); //!< status code |
---|
152 | static int id( int index ); //!< PDG particle id |
---|
153 | static int first_parent( int index ); //!< index of 1st mother |
---|
154 | static int last_parent( int index ); //!< index of last mother |
---|
155 | static int number_parents( int index ); //!< number of parents |
---|
156 | static int first_child( int index ); //!< index of 1st daughter |
---|
157 | static int last_child( int index ); //!< index of last daughter |
---|
158 | static int number_children( int index ); //!< number of children |
---|
159 | static double px( int index ); //!< X momentum |
---|
160 | static double py( int index ); //!< Y momentum |
---|
161 | static double pz( int index ); //!< Z momentum |
---|
162 | static double e( int index ); //!< Energy |
---|
163 | static double m( int index ); //!< generated mass |
---|
164 | static double x( int index ); //!< X Production vertex |
---|
165 | static double y( int index ); //!< Y Production vertex |
---|
166 | static double z( int index ); //!< Z Production vertex |
---|
167 | static double t( int index ); //!< production time |
---|
168 | |
---|
169 | //////////////////// |
---|
170 | // Set Methods // |
---|
171 | //////////////////// |
---|
172 | |
---|
173 | /// set event number |
---|
174 | static void set_event_number( int evtno ); |
---|
175 | /// set number of entries in HEPEVT |
---|
176 | static void set_number_entries( int noentries ); |
---|
177 | /// set particle status |
---|
178 | static void set_status( int index, int status ); |
---|
179 | /// set particle ID |
---|
180 | static void set_id( int index, int id ); |
---|
181 | /// define parents of a particle |
---|
182 | static void set_parents( int index, int firstparent, int lastparent ); |
---|
183 | /// define children of a particle |
---|
184 | static void set_children( int index, int firstchild, int lastchild ); |
---|
185 | /// set particle momentum |
---|
186 | static void set_momentum( int index, double px, double py, |
---|
187 | double pz, double e ); |
---|
188 | /// set particle mass |
---|
189 | static void set_mass( int index, double mass ); |
---|
190 | /// set particle production vertex |
---|
191 | static void set_position( int index, double x, double y, double z, |
---|
192 | double t ); |
---|
193 | ////////////////////// |
---|
194 | // HEPEVT Floorplan // |
---|
195 | ////////////////////// |
---|
196 | static unsigned int sizeof_int(); //!< size of integer in bytes |
---|
197 | static unsigned int sizeof_real(); //!< size of real in bytes |
---|
198 | static int max_number_entries(); //!< size of common block |
---|
199 | static void set_sizeof_int(unsigned int); //!< define size of integer |
---|
200 | static void set_sizeof_real(unsigned int); //!< define size of real |
---|
201 | static void set_max_number_entries(unsigned int); //!< define size of common block |
---|
202 | |
---|
203 | protected: |
---|
204 | /// navigate a byte array |
---|
205 | static double byte_num_to_double( unsigned int ); |
---|
206 | /// navigate a byte array |
---|
207 | static int byte_num_to_int( unsigned int ); |
---|
208 | /// pretend common block is an array of bytes |
---|
209 | static void write_byte_num( double, unsigned int ); |
---|
210 | /// pretend common block is an array of bytes |
---|
211 | static void write_byte_num( int, unsigned int ); |
---|
212 | /// print output legend |
---|
213 | static void print_legend( std::ostream& ostr = std::cout ); |
---|
214 | |
---|
215 | private: |
---|
216 | static unsigned int s_sizeof_int; |
---|
217 | static unsigned int s_sizeof_real; |
---|
218 | static unsigned int s_max_number_entries; |
---|
219 | |
---|
220 | }; |
---|
221 | |
---|
222 | ////////////////////////////// |
---|
223 | // HEPEVT Floorplan Inlines // |
---|
224 | ////////////////////////////// |
---|
225 | inline unsigned int HEPEVT_Wrapper::sizeof_int(){ return s_sizeof_int; } |
---|
226 | |
---|
227 | inline unsigned int HEPEVT_Wrapper::sizeof_real(){ return s_sizeof_real; } |
---|
228 | |
---|
229 | inline int HEPEVT_Wrapper::max_number_entries() |
---|
230 | { return (int)s_max_number_entries; } |
---|
231 | |
---|
232 | inline void HEPEVT_Wrapper::set_sizeof_int( unsigned int size ) |
---|
233 | { |
---|
234 | if ( size != sizeof(short int) && size != sizeof(long int) && size != sizeof(int) ) { |
---|
235 | std::cerr << "HepMC is not able to handle integers " |
---|
236 | << " of size other than 2 or 4." |
---|
237 | << " You requested: " << size << std::endl; |
---|
238 | } |
---|
239 | s_sizeof_int = size; |
---|
240 | } |
---|
241 | |
---|
242 | inline void HEPEVT_Wrapper::set_sizeof_real( unsigned int size ) { |
---|
243 | if ( size != sizeof(float) && size != sizeof(double) ) { |
---|
244 | std::cerr << "HepMC is not able to handle floating point numbers" |
---|
245 | << " of size other than 4 or 8." |
---|
246 | << " You requested: " << size << std::endl; |
---|
247 | } |
---|
248 | s_sizeof_real = size; |
---|
249 | } |
---|
250 | |
---|
251 | inline void HEPEVT_Wrapper::set_max_number_entries( unsigned int size ) { |
---|
252 | s_max_number_entries = size; |
---|
253 | } |
---|
254 | |
---|
255 | inline double HEPEVT_Wrapper::byte_num_to_double( unsigned int b ) { |
---|
256 | if ( b >= hepevt_bytes_allocation ) std::cerr |
---|
257 | << "HEPEVT_Wrapper: requested hepevt data exceeds allocation" |
---|
258 | << std::endl; |
---|
259 | if ( s_sizeof_real == sizeof(float) ) { |
---|
260 | float* myfloat = (float*)&hepevt.data[b]; |
---|
261 | return (double)(*myfloat); |
---|
262 | } else if ( s_sizeof_real == sizeof(double) ) { |
---|
263 | double* mydouble = (double*)&hepevt.data[b]; |
---|
264 | return (*mydouble); |
---|
265 | } else { |
---|
266 | std::cerr |
---|
267 | << "HEPEVT_Wrapper: illegal floating point number length." |
---|
268 | << s_sizeof_real << std::endl; |
---|
269 | } |
---|
270 | return 0; |
---|
271 | } |
---|
272 | |
---|
273 | inline int HEPEVT_Wrapper::byte_num_to_int( unsigned int b ) { |
---|
274 | if ( b >= hepevt_bytes_allocation ) std::cerr |
---|
275 | << "HEPEVT_Wrapper: requested hepevt data exceeds allocation" |
---|
276 | << std::endl; |
---|
277 | if ( s_sizeof_int == sizeof(short int) ) { |
---|
278 | short int* myshortint = (short int*)&hepevt.data[b]; |
---|
279 | return (int)(*myshortint); |
---|
280 | } else if ( s_sizeof_int == sizeof(long int) ) { |
---|
281 | long int* mylongint = (long int*)&hepevt.data[b]; |
---|
282 | return (*mylongint); |
---|
283 | // on some 64 bit machines, int, short, and long are all different |
---|
284 | } else if ( s_sizeof_int == sizeof(int) ) { |
---|
285 | int* myint = (int*)&hepevt.data[b]; |
---|
286 | return (*myint); |
---|
287 | } else { |
---|
288 | std::cerr |
---|
289 | << "HEPEVT_Wrapper: illegal integer number length." |
---|
290 | << s_sizeof_int << std::endl; |
---|
291 | } |
---|
292 | return 0; |
---|
293 | } |
---|
294 | |
---|
295 | inline void HEPEVT_Wrapper::write_byte_num( double in, unsigned int b ) { |
---|
296 | if ( b >= hepevt_bytes_allocation ) std::cerr |
---|
297 | << "HEPEVT_Wrapper: requested hepevt data exceeds allocation" |
---|
298 | << std::endl; |
---|
299 | if ( s_sizeof_real == sizeof(float) ) { |
---|
300 | float* myfloat = (float*)&hepevt.data[b]; |
---|
301 | (*myfloat) = (float)in; |
---|
302 | } else if ( s_sizeof_real == sizeof(double) ) { |
---|
303 | double* mydouble = (double*)&hepevt.data[b]; |
---|
304 | (*mydouble) = (double)in; |
---|
305 | } else { |
---|
306 | std::cerr |
---|
307 | << "HEPEVT_Wrapper: illegal floating point number length." |
---|
308 | << s_sizeof_real << std::endl; |
---|
309 | } |
---|
310 | } |
---|
311 | |
---|
312 | inline void HEPEVT_Wrapper::write_byte_num( int in, unsigned int b ) { |
---|
313 | if ( b >= hepevt_bytes_allocation ) std::cerr |
---|
314 | << "HEPEVT_Wrapper: requested hepevt data exceeds allocation" |
---|
315 | << std::endl; |
---|
316 | if ( s_sizeof_int == sizeof(short int) ) { |
---|
317 | short int* myshortint = (short int*)&hepevt.data[b]; |
---|
318 | (*myshortint) = (short int)in; |
---|
319 | } else if ( s_sizeof_int == sizeof(long int) ) { |
---|
320 | long int* mylongint = (long int*)&hepevt.data[b]; |
---|
321 | (*mylongint) = (int)in; |
---|
322 | // on some 64 bit machines, int, short, and long are all different |
---|
323 | } else if ( s_sizeof_int == sizeof(int) ) { |
---|
324 | int* myint = (int*)&hepevt.data[b]; |
---|
325 | (*myint) = (int)in; |
---|
326 | } else { |
---|
327 | std::cerr |
---|
328 | << "HEPEVT_Wrapper: illegal integer number length." |
---|
329 | << s_sizeof_int << std::endl; |
---|
330 | } |
---|
331 | } |
---|
332 | |
---|
333 | ////////////// |
---|
334 | // INLINES // |
---|
335 | ////////////// |
---|
336 | |
---|
337 | inline bool HEPEVT_Wrapper::is_double_precision() |
---|
338 | { |
---|
339 | // true if 8byte floating point numbers are used in the HepEVT common. |
---|
340 | return ( sizeof(double) == sizeof_real() ); |
---|
341 | } |
---|
342 | |
---|
343 | inline int HEPEVT_Wrapper::event_number() |
---|
344 | { return byte_num_to_int(0); } |
---|
345 | |
---|
346 | inline int HEPEVT_Wrapper::number_entries() |
---|
347 | { |
---|
348 | int nhep = byte_num_to_int( 1*sizeof_int() ); |
---|
349 | return ( nhep <= max_number_entries() ? |
---|
350 | nhep : max_number_entries() ); |
---|
351 | } |
---|
352 | |
---|
353 | inline int HEPEVT_Wrapper::status( int index ) |
---|
354 | { return byte_num_to_int( (2+index-1) * sizeof_int() ); } |
---|
355 | |
---|
356 | inline int HEPEVT_Wrapper::id( int index ) |
---|
357 | { |
---|
358 | return byte_num_to_int( (2+max_number_entries()+index-1) |
---|
359 | * sizeof_int() ); |
---|
360 | } |
---|
361 | |
---|
362 | inline int HEPEVT_Wrapper::first_parent( int index ) |
---|
363 | { |
---|
364 | int parent = byte_num_to_int( (2+2*max_number_entries()+2*(index-1)) |
---|
365 | * sizeof_int() ); |
---|
366 | return ( parent > 0 && parent <= number_entries() ) ? |
---|
367 | parent : 0; |
---|
368 | } |
---|
369 | |
---|
370 | inline int HEPEVT_Wrapper::last_parent( int index ) |
---|
371 | { |
---|
372 | // Returns the Index of the LAST parent in the HEPEVT record |
---|
373 | // for particle with Index index. |
---|
374 | // If there is only one parent, the last parent is forced to |
---|
375 | // be the same as the first parent. |
---|
376 | // If there are no parents for this particle, both the first_parent |
---|
377 | // and the last_parent with return 0. |
---|
378 | // Error checking is done to ensure the parent is always |
---|
379 | // within range ( 0 <= parent <= nhep ) |
---|
380 | // |
---|
381 | int firstparent = first_parent(index); |
---|
382 | int parent = byte_num_to_int( (2+2*max_number_entries()+2*(index-1)+1) |
---|
383 | * sizeof_int() ); |
---|
384 | return ( parent > firstparent && parent <= number_entries() ) |
---|
385 | ? parent : firstparent; |
---|
386 | } |
---|
387 | |
---|
388 | inline int HEPEVT_Wrapper::number_parents( int index ) { |
---|
389 | int firstparent = first_parent(index); |
---|
390 | return ( firstparent>0 ) ? |
---|
391 | ( 1+last_parent(index)-firstparent ) : 0; |
---|
392 | } |
---|
393 | |
---|
394 | inline int HEPEVT_Wrapper::first_child( int index ) |
---|
395 | { |
---|
396 | int child = byte_num_to_int( (2+4*max_number_entries()+2*(index-1)) |
---|
397 | * sizeof_int() ); |
---|
398 | return ( child > 0 && child <= number_entries() ) ? |
---|
399 | child : 0; |
---|
400 | } |
---|
401 | |
---|
402 | inline int HEPEVT_Wrapper::last_child( int index ) |
---|
403 | { |
---|
404 | // Returns the Index of the LAST child in the HEPEVT record |
---|
405 | // for particle with Index index. |
---|
406 | // If there is only one child, the last child is forced to |
---|
407 | // be the same as the first child. |
---|
408 | // If there are no children for this particle, both the first_child |
---|
409 | // and the last_child with return 0. |
---|
410 | // Error checking is done to ensure the child is always |
---|
411 | // within range ( 0 <= parent <= nhep ) |
---|
412 | // |
---|
413 | int firstchild = first_child(index); |
---|
414 | int child = byte_num_to_int( (2+4*max_number_entries()+2*(index-1)+1) |
---|
415 | * sizeof_int() ); |
---|
416 | return ( child > firstchild && child <= number_entries() ) |
---|
417 | ? child : firstchild; |
---|
418 | } |
---|
419 | |
---|
420 | inline int HEPEVT_Wrapper::number_children( int index ) |
---|
421 | { |
---|
422 | int firstchild = first_child(index); |
---|
423 | return ( firstchild>0 ) ? |
---|
424 | ( 1+last_child(index)-firstchild ) : 0; |
---|
425 | } |
---|
426 | |
---|
427 | inline double HEPEVT_Wrapper::px( int index ) |
---|
428 | { |
---|
429 | return byte_num_to_double( (2+6*max_number_entries())*sizeof_int() |
---|
430 | + (5*(index-1)+0) *sizeof_real() ); |
---|
431 | } |
---|
432 | |
---|
433 | inline double HEPEVT_Wrapper::py( int index ) |
---|
434 | { |
---|
435 | return byte_num_to_double( (2+6*max_number_entries())*sizeof_int() |
---|
436 | + (5*(index-1)+1) *sizeof_real() ); |
---|
437 | } |
---|
438 | |
---|
439 | |
---|
440 | inline double HEPEVT_Wrapper::pz( int index ) |
---|
441 | { |
---|
442 | return byte_num_to_double( (2+6*max_number_entries())*sizeof_int() |
---|
443 | + (5*(index-1)+2) *sizeof_real() ); |
---|
444 | } |
---|
445 | |
---|
446 | inline double HEPEVT_Wrapper::e( int index ) |
---|
447 | { |
---|
448 | return byte_num_to_double( (2+6*max_number_entries())*sizeof_int() |
---|
449 | + (5*(index-1)+3) *sizeof_real() ); |
---|
450 | } |
---|
451 | |
---|
452 | inline double HEPEVT_Wrapper::m( int index ) |
---|
453 | { |
---|
454 | return byte_num_to_double( (2+6*max_number_entries())*sizeof_int() |
---|
455 | + (5*(index-1)+4) *sizeof_real() ); |
---|
456 | } |
---|
457 | |
---|
458 | inline double HEPEVT_Wrapper::x( int index ) |
---|
459 | { |
---|
460 | return byte_num_to_double( (2+6*max_number_entries())*sizeof_int() |
---|
461 | + ( 5*max_number_entries() |
---|
462 | + (4*(index-1)+0) ) *sizeof_real() ); |
---|
463 | } |
---|
464 | |
---|
465 | inline double HEPEVT_Wrapper::y( int index ) |
---|
466 | { |
---|
467 | return byte_num_to_double( (2+6*max_number_entries())*sizeof_int() |
---|
468 | + ( 5*max_number_entries() |
---|
469 | + (4*(index-1)+1) ) *sizeof_real() ); |
---|
470 | } |
---|
471 | |
---|
472 | inline double HEPEVT_Wrapper::z( int index ) |
---|
473 | { |
---|
474 | return byte_num_to_double( (2+6*max_number_entries())*sizeof_int() |
---|
475 | + ( 5*max_number_entries() |
---|
476 | + (4*(index-1)+2) ) *sizeof_real() ); |
---|
477 | } |
---|
478 | |
---|
479 | inline double HEPEVT_Wrapper::t( int index ) |
---|
480 | { |
---|
481 | return byte_num_to_double( (2+6*max_number_entries())*sizeof_int() |
---|
482 | + ( 5*max_number_entries() |
---|
483 | + (4*(index-1)+3) ) *sizeof_real() ); |
---|
484 | } |
---|
485 | |
---|
486 | inline void HEPEVT_Wrapper::set_event_number( int evtno ) |
---|
487 | { write_byte_num( evtno, 0 ); } |
---|
488 | |
---|
489 | inline void HEPEVT_Wrapper::set_number_entries( int noentries ) |
---|
490 | { write_byte_num( noentries, 1*sizeof_int() ); } |
---|
491 | |
---|
492 | inline void HEPEVT_Wrapper::set_status( int index, int status ) |
---|
493 | { |
---|
494 | if ( index <= 0 || index > max_number_entries() ) return; |
---|
495 | write_byte_num( status, (2+index-1) * sizeof_int() ); |
---|
496 | } |
---|
497 | |
---|
498 | inline void HEPEVT_Wrapper::set_id( int index, int id ) |
---|
499 | { |
---|
500 | if ( index <= 0 || index > max_number_entries() ) return; |
---|
501 | write_byte_num( id, (2+max_number_entries()+index-1) *sizeof_int() ); |
---|
502 | } |
---|
503 | |
---|
504 | inline void HEPEVT_Wrapper::set_parents( int index, int firstparent, |
---|
505 | int lastparent ) |
---|
506 | { |
---|
507 | if ( index <= 0 || index > max_number_entries() ) return; |
---|
508 | write_byte_num( firstparent, (2+2*max_number_entries()+2*(index-1)) |
---|
509 | *sizeof_int() ); |
---|
510 | write_byte_num( lastparent, (2+2*max_number_entries()+2*(index-1)+1) |
---|
511 | * sizeof_int() ); |
---|
512 | } |
---|
513 | |
---|
514 | inline void HEPEVT_Wrapper::set_children( int index, int firstchild, |
---|
515 | int lastchild ) |
---|
516 | { |
---|
517 | if ( index <= 0 || index > max_number_entries() ) return; |
---|
518 | write_byte_num( firstchild, (2+4*max_number_entries()+2*(index-1)) |
---|
519 | *sizeof_int() ); |
---|
520 | write_byte_num( lastchild, (2+4*max_number_entries()+2*(index-1)+1) |
---|
521 | *sizeof_int() ); |
---|
522 | } |
---|
523 | |
---|
524 | inline void HEPEVT_Wrapper::set_momentum( int index, double px, |
---|
525 | double py, double pz, double e ) |
---|
526 | { |
---|
527 | if ( index <= 0 || index > max_number_entries() ) return; |
---|
528 | write_byte_num( px, (2+6*max_number_entries()) *sizeof_int() |
---|
529 | + (5*(index-1)+0) *sizeof_real() ); |
---|
530 | write_byte_num( py, (2+6*max_number_entries())*sizeof_int() |
---|
531 | + (5*(index-1)+1) *sizeof_real() ); |
---|
532 | write_byte_num( pz, (2+6*max_number_entries())*sizeof_int() |
---|
533 | + (5*(index-1)+2) *sizeof_real() ); |
---|
534 | write_byte_num( e, (2+6*max_number_entries())*sizeof_int() |
---|
535 | + (5*(index-1)+3) *sizeof_real() ); |
---|
536 | } |
---|
537 | |
---|
538 | inline void HEPEVT_Wrapper::set_mass( int index, double mass ) |
---|
539 | { |
---|
540 | if ( index <= 0 || index > max_number_entries() ) return; |
---|
541 | write_byte_num( mass, (2+6*max_number_entries())*sizeof_int() |
---|
542 | + (5*(index-1)+4) *sizeof_real() ); |
---|
543 | } |
---|
544 | |
---|
545 | inline void HEPEVT_Wrapper::set_position( int index, double x, double y, |
---|
546 | double z, double t ) |
---|
547 | { |
---|
548 | if ( index <= 0 || index > max_number_entries() ) return; |
---|
549 | write_byte_num( x, (2+6*max_number_entries())*sizeof_int() |
---|
550 | + ( 5*max_number_entries() |
---|
551 | + (4*(index-1)+0) ) *sizeof_real() ); |
---|
552 | write_byte_num( y, (2+6*max_number_entries())*sizeof_int() |
---|
553 | + ( 5*max_number_entries() |
---|
554 | + (4*(index-1)+1) ) *sizeof_real() ); |
---|
555 | write_byte_num( z, (2+6*max_number_entries())*sizeof_int() |
---|
556 | + ( 5*max_number_entries() |
---|
557 | + (4*(index-1)+2) ) *sizeof_real() ); |
---|
558 | write_byte_num( t, (2+6*max_number_entries())*sizeof_int() |
---|
559 | + ( 5*max_number_entries() |
---|
560 | + (4*(index-1)+3) ) *sizeof_real() ); |
---|
561 | } |
---|
562 | |
---|
563 | } // HepMC |
---|
564 | |
---|
565 | #endif // HEPMC_HEPEVT_WRAPPER_H |
---|
566 | //-------------------------------------------------------------------------- |
---|
567 | |
---|