go-hep.org/x/hep@v0.38.1/hepmc/go-hepmc-dump/main.go (about)

     1  // Copyright ©2017 The go-hep Authors. All rights reserved.
     2  // Use of this source code is governed by a BSD-style
     3  // license that can be found in the LICENSE file.
     4  
     5  // go-hepmc-dump is a simple command to dump in an almost human-friendly format
     6  // the content of a hepmc file.
     7  // ex:
     8  //
     9  //	$ go-hepmc-dump foo.hepmc | head -n20
    10  //
    11  // ________________________________________________________________________________
    12  // GenEvent: #0000 ID=  111 SignalProcessGenVertex Barcode: 0
    13  //
    14  //	Momentum units:      GEV     Position units:       MM
    15  //	Cross Section: 2.666668e+12 +/- 2.666668e+12
    16  //	Entries this event: 129 vertices, 241 particles.
    17  //	Beam Particle barcodes: 1 2
    18  //	RndmState(0)=
    19  //	Wgts(1)=(0,1.000000)
    20  //	EventScale 1.438780e+00 [energy] 	 alphaQCD=4.519907e-01	 alphaQED=7.472465e-03
    21  //	                                   GenParticle Legend
    22  //	       Barcode   PDG ID      ( Px,       Py,       Pz,     E ) Stat  DecayVtx
    23  //
    24  // ________________________________________________________________________________
    25  // GenVertex:       -1 ID:    0 (X,cT):0
    26  //
    27  //	I: 1         7        21 -5.87e-14, 9.60e-15, 3.41e+01, 3.41e+01 42        -1
    28  //	O: 1         3        21  0.00e+00, 0.00e+00, 3.41e+01, 3.41e+01 21        -3
    29  //
    30  // GenVertex:       -2 ID:    0 (X,cT):0
    31  //
    32  //	I: 1         8        21  3.20e-14, 0.00e+00,-7.23e+01, 7.23e+01 41        -2
    33  //	O: 2         4        21  0.00e+00, 0.00e+00,-1.19e+00, 1.19e+00 21        -3
    34  //	            11        21  9.42e-01,-1.56e-01,-7.11e+01, 7.11e+01 43       -12
    35  package main
    36  
    37  import (
    38  	"errors"
    39  	"fmt"
    40  	"io"
    41  	"log"
    42  	"os"
    43  
    44  	"go-hep.org/x/hep/hepmc"
    45  )
    46  
    47  func main() {
    48  	log.SetPrefix("hepmc-dump: ")
    49  	log.SetFlags(0)
    50  
    51  	var (
    52  		err error
    53  		r   io.ReadCloser
    54  		w   io.Writer = os.Stdout
    55  	)
    56  
    57  	switch len(os.Args) {
    58  	case 1:
    59  		r = os.Stdin
    60  	case 2:
    61  		r, err = os.Open(os.Args[1])
    62  		if err != nil {
    63  			log.Fatal(err)
    64  		}
    65  		defer r.Close()
    66  	default:
    67  	}
    68  
    69  	err = dump(w, r)
    70  	if err != nil {
    71  		log.Fatal(err)
    72  	}
    73  }
    74  
    75  func dump(w io.Writer, r io.Reader) error {
    76  	dec := hepmc.NewDecoder(r)
    77  	for {
    78  		var (
    79  			evt hepmc.Event
    80  			err = dec.Decode(&evt)
    81  		)
    82  		if errors.Is(err, io.EOF) {
    83  			return nil
    84  		}
    85  		if err != nil {
    86  			return fmt.Errorf("error decoding event: %w", err)
    87  		}
    88  		err = evt.Print(w)
    89  		if err != nil {
    90  			return fmt.Errorf("error printing event: %w", err)
    91  		}
    92  
    93  		err = hepmc.Delete(&evt)
    94  		if err != nil {
    95  			return fmt.Errorf("error deleting event: %w", err)
    96  		}
    97  	}
    98  }