go-hep.org/x/hep@v0.38.1/fastjet/fastjet_test.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 fastjet_test
     6  
     7  import (
     8  	"sort"
     9  	"testing"
    10  
    11  	"go-hep.org/x/hep/fastjet"
    12  	"go-hep.org/x/hep/fmom"
    13  )
    14  
    15  func TestSimple(t *testing.T) {
    16  	t.Parallel()
    17  
    18  	particles := []fastjet.Jet{
    19  		fastjet.NewJet(+99.0, +0.1, 0, 100.0),
    20  		fastjet.NewJet(+04.0, -0.1, 0, 005.0),
    21  		fastjet.NewJet(-99.0, +0.0, 0, 099.0),
    22  		fastjet.NewJet(+99.0, +0.1, 0, 199.0),
    23  		fastjet.NewJet(-99.0, +0.0, 0, 299.0),
    24  		fastjet.NewJet(-99.0, +1.0, 0, 399.0),
    25  		fastjet.NewJet(+50.0, +1.0, 100, 399.0),
    26  	}
    27  
    28  	// for i, jet := range particles {
    29  	// 	fmt.Printf("part[%d]: pt=%+e eta=%+e rap=%+e phi=%+e\n",
    30  	// 		i, jet.Pt(), jet.Eta(), jet.Rapidity(), jet.Phi(),
    31  	// 	)
    32  	// }
    33  
    34  	// choose a jet definition
    35  	r := 0.7
    36  	def := fastjet.NewJetDefinition(fastjet.AntiKtAlgorithm, r, fastjet.EScheme, fastjet.BestStrategy)
    37  
    38  	if def.R() != r {
    39  		t.Fatalf("expected r-param=%v. got=%v", r, def.R())
    40  	}
    41  
    42  	if def.RecombinationScheme() != fastjet.EScheme {
    43  		t.Fatalf("expected scheme=%v. got=%v", def.RecombinationScheme(), fastjet.EScheme)
    44  	}
    45  
    46  	if def.Strategy() != fastjet.BestStrategy {
    47  		t.Fatalf("expected strategy=%v. got=%v", def.Strategy(), fastjet.BestStrategy)
    48  	}
    49  
    50  	// run the clustering, extract jets
    51  	cs, err := fastjet.NewClusterSequence(particles, def)
    52  	if err != nil {
    53  		t.Fatalf("clustering failed: %v", err)
    54  	}
    55  
    56  	expected := []struct {
    57  		jet fmom.PxPyPzE
    58  		cts []fmom.PxPyPzE
    59  	}{
    60  		{
    61  			jet: fmom.NewPxPyPzE(-2.970000e+02, +1.000000e+00, +0.000000e+00, +7.970000e+02),
    62  			cts: []fmom.PxPyPzE{
    63  
    64  				fmom.NewPxPyPzE(-9.900000e+01, +1.000000e+00, +0.000000e+00, +3.990000e+02),
    65  				fmom.NewPxPyPzE(-9.900000e+01, +0.000000e+00, +0.000000e+00, +9.900000e+01),
    66  				fmom.NewPxPyPzE(-9.900000e+01, +0.000000e+00, +0.000000e+00, +2.990000e+02),
    67  			},
    68  		},
    69  		{
    70  			jet: fmom.NewPxPyPzE(+2.520000e+02, +1.100000e+00, +1.000000e+02, +7.030000e+02),
    71  			cts: []fmom.PxPyPzE{
    72  				fmom.NewPxPyPzE(+5.000000e+01, +1.000000e+00, +1.000000e+02, +3.990000e+02),
    73  				fmom.NewPxPyPzE(+4.000000e+00, -1.000000e-01, +0.000000e+00, +5.000000e+00),
    74  				fmom.NewPxPyPzE(+9.900000e+01, +1.000000e-01, +0.000000e+00, +1.000000e+02),
    75  				fmom.NewPxPyPzE(+9.900000e+01, +1.000000e-01, +0.000000e+00, +1.990000e+02),
    76  			},
    77  		},
    78  	}
    79  
    80  	const ptmin = 0
    81  	jets, err := cs.InclusiveJets(ptmin)
    82  	if err != nil {
    83  		t.Fatalf("could not retrieve inclusive jets: %v", err)
    84  	}
    85  	sort.Sort(fastjet.ByPt(jets))
    86  
    87  	if len(jets) != len(expected) {
    88  		t.Fatalf("expected %d jets. got=%d", len(expected), len(jets))
    89  	}
    90  	// print the jets
    91  	for i := range jets {
    92  		ref := &expected[i]
    93  		jet := &jets[i]
    94  		if !fmom.Equal(&ref.jet, jet) {
    95  			t.Fatalf("jet[%d] differ:\nexp: %v\ngot: %v\n", i,
    96  				ref.jet,
    97  				jet.PxPyPzE,
    98  			)
    99  		}
   100  		constituents := jet.Constituents()
   101  		if len(constituents) != len(ref.cts) {
   102  			t.Fatalf("jet[%d]: expected %d constituents. got=%d",
   103  				i, len(ref.cts), len(constituents),
   104  			)
   105  		}
   106  		for j := range constituents {
   107  			jj := &constituents[j]
   108  			if !fmom.Equal(&ref.cts[j], jj) {
   109  				t.Fatalf("jet[%d].constituent[%d] differ:\nexp: %v\ngot: %v\n",
   110  					i, j,
   111  					ref.cts[j],
   112  					jj.PxPyPzE,
   113  				)
   114  			}
   115  		}
   116  	}
   117  }