go-hep.org/x/hep@v0.38.1/fads/hepmcreader.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  package fads
     6  
     7  import (
     8  	"bufio"
     9  	"fmt"
    10  	"io"
    11  	"os"
    12  	"reflect"
    13  	"sort"
    14  
    15  	"go-hep.org/x/hep/fmom"
    16  	"go-hep.org/x/hep/fwk"
    17  	"go-hep.org/x/hep/hepmc"
    18  	"go-hep.org/x/hep/heppdt"
    19  )
    20  
    21  type HepMcStreamer struct {
    22  	Name string // input filename
    23  	r    io.ReadCloser
    24  	dec  *hepmc.Decoder
    25  
    26  	mcevt string // hepmc event key
    27  }
    28  
    29  func (s *HepMcStreamer) Connect(ports []fwk.Port) error {
    30  	var err error
    31  	s.r, err = os.Open(s.Name)
    32  	if err != nil {
    33  		return err
    34  	}
    35  
    36  	s.dec = hepmc.NewDecoder(bufio.NewReader(s.r))
    37  
    38  	port := ports[0]
    39  	if port.Type != reflect.TypeOf(hepmc.Event{}) {
    40  		err = fmt.Errorf("fads: invalid port. expected type=hepmc.Event. got=%v", port.Type)
    41  		return err
    42  	}
    43  
    44  	s.mcevt = port.Name
    45  
    46  	return err
    47  }
    48  
    49  func (s *HepMcStreamer) Read(ctx fwk.Context) error {
    50  	var err error
    51  
    52  	var evt hepmc.Event
    53  	err = s.dec.Decode(&evt)
    54  	if err != nil {
    55  		return err
    56  	}
    57  
    58  	store := ctx.Store()
    59  	err = store.Put(s.mcevt, evt)
    60  	return err
    61  }
    62  
    63  func (s *HepMcStreamer) Disconnect() error {
    64  	return s.r.Close()
    65  }
    66  
    67  type HepMcReader struct {
    68  	fwk.TaskBase
    69  
    70  	mcevt       string // original HepMC event
    71  	allparts    string // all particles
    72  	stableparts string // all stable particles
    73  	partons     string // all partons
    74  }
    75  
    76  func (tsk *HepMcReader) Configure(ctx fwk.Context) error {
    77  	var err error
    78  
    79  	err = tsk.DeclInPort(tsk.mcevt, reflect.TypeOf(hepmc.Event{}))
    80  	if err != nil {
    81  		return err
    82  	}
    83  
    84  	err = tsk.DeclOutPort(tsk.allparts, reflect.TypeOf([]Candidate{}))
    85  	if err != nil {
    86  		return err
    87  	}
    88  
    89  	err = tsk.DeclOutPort(tsk.stableparts, reflect.TypeOf([]Candidate{}))
    90  	if err != nil {
    91  		return err
    92  	}
    93  
    94  	err = tsk.DeclOutPort(tsk.partons, reflect.TypeOf([]Candidate{}))
    95  	if err != nil {
    96  		return err
    97  	}
    98  
    99  	return err
   100  }
   101  
   102  func (tsk *HepMcReader) StartTask(ctx fwk.Context) error {
   103  	var err error
   104  	return err
   105  }
   106  
   107  func (tsk *HepMcReader) StopTask(ctx fwk.Context) error {
   108  	var err error
   109  	return err
   110  }
   111  
   112  func (tsk *HepMcReader) Process(ctx fwk.Context) error {
   113  	var err error
   114  	store := ctx.Store()
   115  	msg := ctx.Msg()
   116  
   117  	v, err := store.Get(tsk.mcevt)
   118  	if err != nil {
   119  		return err
   120  	}
   121  	evt := v.(hepmc.Event)
   122  
   123  	msg.Debugf(
   124  		"event number: %d, #parts=%d #vtx=%d\n",
   125  		evt.EventNumber,
   126  		len(evt.Particles), len(evt.Vertices),
   127  	)
   128  
   129  	allparts := make([]Candidate, 0, len(evt.Particles)/2)
   130  	stableparts := make([]Candidate, 0)
   131  	partons := make([]Candidate, 0)
   132  
   133  	for _, p := range evt.Particles {
   134  		allparts = append(allparts, Candidate{
   135  			Pid:        int32(p.PdgID),
   136  			Status:     int32(p.Status),
   137  			M2:         1,
   138  			D2:         1,
   139  			CandCharge: -999,
   140  			CandMass:   -999.9,
   141  			Mom:        fmom.PxPyPzE(p.Momentum),
   142  		})
   143  		c := &allparts[len(allparts)-1]
   144  		pdg := heppdt.ParticleByID(heppdt.PID(p.PdgID))
   145  		if pdg != nil {
   146  			c.CandCharge = int32(pdg.Charge)
   147  			c.CandMass = pdg.Mass
   148  		}
   149  
   150  		// FIXME(sbinet)
   151  		if vtx := p.ProdVertex; vtx != nil {
   152  			c.M1 = 1
   153  			c.Pos = fmom.PxPyPzE(vtx.Position)
   154  		}
   155  
   156  		if pdg == nil {
   157  			continue
   158  		}
   159  
   160  		pdgcode := p.PdgID
   161  		if pdgcode < 0 {
   162  			pdgcode = -pdgcode
   163  		}
   164  
   165  		switch {
   166  		case p.Status == 1: // && pdg.IsStable():
   167  			width := pdg.Resonance.Width.Value
   168  			if width <= 1e-10 {
   169  				stableparts = append(stableparts, *c)
   170  			}
   171  
   172  		case pdgcode <= 5 || pdgcode == 21 || pdgcode == 15:
   173  			partons = append(partons, *c)
   174  		}
   175  
   176  	}
   177  
   178  	sort.Sort(ByPt(allparts))
   179  	err = store.Put(tsk.allparts, allparts)
   180  	if err != nil {
   181  		return err
   182  	}
   183  
   184  	sort.Sort(ByPt(stableparts))
   185  	err = store.Put(tsk.stableparts, stableparts)
   186  	if err != nil {
   187  		return err
   188  	}
   189  
   190  	sort.Sort(ByPt(partons))
   191  	err = store.Put(tsk.partons, partons)
   192  	if err != nil {
   193  		return err
   194  	}
   195  
   196  	msg.Debugf("allparts: %d\nstables: %d\npartons: %d\n",
   197  		len(allparts),
   198  		len(stableparts),
   199  		len(partons),
   200  	)
   201  
   202  	return err
   203  }
   204  
   205  func init() {
   206  	fwk.Register(reflect.TypeOf(HepMcReader{}),
   207  		func(typ, name string, mgr fwk.App) (fwk.Component, error) {
   208  			var err error
   209  
   210  			tsk := &HepMcReader{
   211  				TaskBase:    fwk.NewTask(typ, name, mgr),
   212  				mcevt:       "/fads/McEvent",
   213  				allparts:    "/fads/AllParticles",
   214  				stableparts: "/fads/StableParticles",
   215  				partons:     "/fads/Partons",
   216  			}
   217  
   218  			err = tsk.DeclProp("Input", &tsk.mcevt)
   219  			if err != nil {
   220  				return nil, err
   221  			}
   222  
   223  			return tsk, err
   224  		},
   225  	)
   226  }