go-hep.org/x/hep@v0.38.1/fmom/utils_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 fmom
     6  
     7  import (
     8  	"math"
     9  	"testing"
    10  )
    11  
    12  const (
    13  	epsilon_test = 1e-6
    14  )
    15  
    16  func TestDeltaR(t *testing.T) {
    17  	for _, tc := range []struct {
    18  		p1   P4
    19  		p2   P4
    20  		want float64
    21  	}{
    22  		// pxpypze
    23  		{
    24  			p1:   newPxPyPzE(NewPxPyPzE(10, 10, 10, 20)),
    25  			p2:   newPxPyPzE(NewPxPyPzE(10, 10, 10, 20)),
    26  			want: 0,
    27  		},
    28  		{
    29  			p1:   newPxPyPzE(NewPxPyPzE(+10, +10, +10, +20)),
    30  			p2:   newPxPyPzE(NewPxPyPzE(-10, -10, -10, +20)),
    31  			want: 3.4064618746379645,
    32  		},
    33  		{
    34  			p1:   newPxPyPzE(NewPxPyPzE(+10, +10, +10, +20)),
    35  			p2:   newPxPyPzE(NewPxPyPzE(+10, -10, +10, +20)),
    36  			want: 1.5707963267948966,
    37  		},
    38  
    39  		// eetaphim
    40  		{
    41  			p1:   newPxPyPzE(NewPxPyPzE(10, 10, 10, 20)),
    42  			p2:   newEEtaPhiM(NewPxPyPzE(10, 10, 10, 20)),
    43  			want: 0,
    44  		},
    45  		{
    46  			p1:   newPxPyPzE(NewPxPyPzE(+10, +10, +10, +20)),
    47  			p2:   newEEtaPhiM(NewPxPyPzE(-10, -10, -10, +20)),
    48  			want: 3.4064618746379645,
    49  		},
    50  		{
    51  			p1:   newPxPyPzE(NewPxPyPzE(+10, +10, +10, +20)),
    52  			p2:   newEEtaPhiM(NewPxPyPzE(+10, -10, +10, +20)),
    53  			want: 1.5707963267948966,
    54  		},
    55  
    56  		// etetaphim
    57  		{
    58  			p1:   newPxPyPzE(NewPxPyPzE(10, 10, 10, 20)),
    59  			p2:   newEtEtaPhiM(NewPxPyPzE(10, 10, 10, 20)),
    60  			want: 0,
    61  		},
    62  		{
    63  			p1:   newPxPyPzE(NewPxPyPzE(+10, +10, +10, +20)),
    64  			p2:   newEtEtaPhiM(NewPxPyPzE(-10, -10, -10, +20)),
    65  			want: 3.4064618746379645,
    66  		},
    67  		{
    68  			p1:   newPxPyPzE(NewPxPyPzE(+10, +10, +10, +20)),
    69  			p2:   newEtEtaPhiM(NewPxPyPzE(+10, -10, +10, +20)),
    70  			want: 1.5707963267948966,
    71  		},
    72  
    73  		// ptetaphim
    74  		{
    75  			p1:   newPxPyPzE(NewPxPyPzE(10, 10, 10, 20)),
    76  			p2:   newPtEtaPhiM(NewPxPyPzE(10, 10, 10, 20)),
    77  			want: 0,
    78  		},
    79  		{
    80  			p1:   newPxPyPzE(NewPxPyPzE(+10, +10, +10, +20)),
    81  			p2:   newPtEtaPhiM(NewPxPyPzE(-10, -10, -10, +20)),
    82  			want: 3.4064618746379645,
    83  		},
    84  		{
    85  			p1:   newPxPyPzE(NewPxPyPzE(+10, +10, +10, +20)),
    86  			p2:   newPtEtaPhiM(NewPxPyPzE(+10, -10, +10, +20)),
    87  			want: 1.5707963267948966,
    88  		},
    89  
    90  		// iptcotthphim
    91  		{
    92  			p1:   newPxPyPzE(NewPxPyPzE(10, 10, 10, 20)),
    93  			p2:   newIPtCotThPhiM(NewPxPyPzE(10, 10, 10, 20)),
    94  			want: 0,
    95  		},
    96  		{
    97  			p1:   newPxPyPzE(NewPxPyPzE(+10, +10, +10, +20)),
    98  			p2:   newIPtCotThPhiM(NewPxPyPzE(-10, -10, -10, +20)),
    99  			want: 3.4064618746379645,
   100  		},
   101  		{
   102  			p1:   newPxPyPzE(NewPxPyPzE(+10, +10, +10, +20)),
   103  			p2:   newIPtCotThPhiM(NewPxPyPzE(+10, -10, +10, +20)),
   104  			want: 1.5707963267948966,
   105  		},
   106  	} {
   107  		got := DeltaR(tc.p1, tc.p2)
   108  		if got-tc.want > epsilon_test {
   109  			t.Fatalf("DeltaR error\np1=%#v\np2=%#v\ngot= %+e\nwantt=%+e\n",
   110  				tc.p1,
   111  				tc.p2,
   112  				got,
   113  				tc.want,
   114  			)
   115  		}
   116  	}
   117  }
   118  
   119  func TestDeltaPhi(t *testing.T) {
   120  	for _, tc := range []struct {
   121  		p1   P4
   122  		p2   P4
   123  		want float64
   124  	}{
   125  		// pxpypze
   126  		{
   127  			p1:   newPxPyPzE(NewPxPyPzE(10, 10, 10, 20)),
   128  			p2:   newPxPyPzE(NewPxPyPzE(10, 10, 10, 20)),
   129  			want: 0,
   130  		},
   131  		{
   132  			p1:   newPxPyPzE(NewPxPyPzE(+10, +10, +10, +20)),
   133  			p2:   newPxPyPzE(NewPxPyPzE(-10, -10, -10, +20)),
   134  			want: -math.Pi,
   135  		},
   136  		{
   137  			p1:   newPxPyPzE(NewPxPyPzE(+10, +10, +10, +20)),
   138  			p2:   newPxPyPzE(NewPxPyPzE(+10, -10, +10, +20)),
   139  			want: math.Pi / 2.0,
   140  		},
   141  
   142  		// eetaphim
   143  		{
   144  			p1:   newPxPyPzE(NewPxPyPzE(10, 10, 10, 20)),
   145  			p2:   newEEtaPhiM(NewPxPyPzE(10, 10, 10, 20)),
   146  			want: 0,
   147  		},
   148  		{
   149  			p1:   newPxPyPzE(NewPxPyPzE(+10, +10, +10, +20)),
   150  			p2:   newEEtaPhiM(NewPxPyPzE(-10, -10, -10, +20)),
   151  			want: -math.Pi,
   152  		},
   153  		{
   154  			p1:   newPxPyPzE(NewPxPyPzE(+10, +10, +10, +20)),
   155  			p2:   newEEtaPhiM(NewPxPyPzE(+10, -10, +10, +20)),
   156  			want: math.Pi / 2.0,
   157  		},
   158  
   159  		// etetaphim
   160  		{
   161  			p1:   newPxPyPzE(NewPxPyPzE(10, 10, 10, 20)),
   162  			p2:   newEtEtaPhiM(NewPxPyPzE(10, 10, 10, 20)),
   163  			want: 0,
   164  		},
   165  		{
   166  			p1:   newPxPyPzE(NewPxPyPzE(+10, +10, +10, +20)),
   167  			p2:   newEtEtaPhiM(NewPxPyPzE(-10, -10, -10, +20)),
   168  			want: -math.Pi,
   169  		},
   170  		{
   171  			p1:   newPxPyPzE(NewPxPyPzE(+10, +10, +10, +20)),
   172  			p2:   newEtEtaPhiM(NewPxPyPzE(+10, -10, +10, +20)),
   173  			want: math.Pi / 2.0,
   174  		},
   175  
   176  		// ptetaphim
   177  		{
   178  			p1:   newPxPyPzE(NewPxPyPzE(10, 10, 10, 20)),
   179  			p2:   newPtEtaPhiM(NewPxPyPzE(10, 10, 10, 20)),
   180  			want: 0,
   181  		},
   182  		{
   183  			p1:   newPxPyPzE(NewPxPyPzE(+10, +10, +10, +20)),
   184  			p2:   newPtEtaPhiM(NewPxPyPzE(-10, -10, -10, +20)),
   185  			want: -math.Pi,
   186  		},
   187  		{
   188  			p1:   newPxPyPzE(NewPxPyPzE(+10, +10, +10, +20)),
   189  			p2:   newPtEtaPhiM(NewPxPyPzE(+10, -10, +10, +20)),
   190  			want: math.Pi / 2.0,
   191  		},
   192  
   193  		// iptcotthphim
   194  		{
   195  			p1:   newPxPyPzE(NewPxPyPzE(10, 10, 10, 20)),
   196  			p2:   newIPtCotThPhiM(NewPxPyPzE(10, 10, 10, 20)),
   197  			want: 0,
   198  		},
   199  		{
   200  			p1:   newPxPyPzE(NewPxPyPzE(+10, +10, +10, +20)),
   201  			p2:   newIPtCotThPhiM(NewPxPyPzE(-10, -10, -10, +20)),
   202  			want: -math.Pi,
   203  		},
   204  		{
   205  			p1:   newPxPyPzE(NewPxPyPzE(+10, +10, +10, +20)),
   206  			p2:   newIPtCotThPhiM(NewPxPyPzE(+10, -10, +10, +20)),
   207  			want: math.Pi / 2.0,
   208  		},
   209  	} {
   210  		got := DeltaPhi(tc.p1, tc.p2)
   211  		if got-tc.want > epsilon_test {
   212  			t.Fatalf("DeltaPhi error\np1=%#v\np2=%#v\ngot= %+e\nwant=%+e\n",
   213  				tc.p1,
   214  				tc.p2,
   215  				got,
   216  				tc.want,
   217  			)
   218  		}
   219  	}
   220  }
   221  
   222  func TestDot(t *testing.T) {
   223  	for _, tc := range []struct {
   224  		p1   P4
   225  		p2   P4
   226  		want float64
   227  	}{
   228  		// pxpypze
   229  		{
   230  			p1:   newPxPyPzE(NewPxPyPzE(10, 10, 10, 20)),
   231  			p2:   newPxPyPzE(NewPxPyPzE(10, 10, 10, 20)),
   232  			want: 100,
   233  		},
   234  		{
   235  			p1:   newPxPyPzE(NewPxPyPzE(+10, +10, +10, +20)),
   236  			p2:   newPxPyPzE(NewPxPyPzE(-10, -10, -10, +20)),
   237  			want: 700,
   238  		},
   239  		{
   240  			p1:   newPxPyPzE(NewPxPyPzE(+10, +10, +10, +20)),
   241  			p2:   newPxPyPzE(NewPxPyPzE(+10, -10, +10, +20)),
   242  			want: 300,
   243  		},
   244  
   245  		// eetaphim
   246  		{
   247  			p1:   newPxPyPzE(NewPxPyPzE(10, 10, 10, 20)),
   248  			p2:   newEEtaPhiM(NewPxPyPzE(10, 10, 10, 20)),
   249  			want: 100,
   250  		},
   251  		{
   252  			p1:   newPxPyPzE(NewPxPyPzE(+10, +10, +10, +20)),
   253  			p2:   newEEtaPhiM(NewPxPyPzE(-10, -10, -10, +20)),
   254  			want: 700,
   255  		},
   256  		{
   257  			p1:   newPxPyPzE(NewPxPyPzE(+10, +10, +10, +20)),
   258  			p2:   newEEtaPhiM(NewPxPyPzE(+10, -10, +10, +20)),
   259  			want: 300,
   260  		},
   261  
   262  		// etetaphim
   263  		{
   264  			p1:   newPxPyPzE(NewPxPyPzE(10, 10, 10, 20)),
   265  			p2:   newEtEtaPhiM(NewPxPyPzE(10, 10, 10, 20)),
   266  			want: 100,
   267  		},
   268  		{
   269  			p1:   newPxPyPzE(NewPxPyPzE(+10, +10, +10, +20)),
   270  			p2:   newEtEtaPhiM(NewPxPyPzE(-10, -10, -10, +20)),
   271  			want: 700,
   272  		},
   273  		{
   274  			p1:   newPxPyPzE(NewPxPyPzE(+10, +10, +10, +20)),
   275  			p2:   newEtEtaPhiM(NewPxPyPzE(+10, -10, +10, +20)),
   276  			want: 300,
   277  		},
   278  
   279  		// ptetaphim
   280  		{
   281  			p1:   newPxPyPzE(NewPxPyPzE(10, 10, 10, 20)),
   282  			p2:   newPtEtaPhiM(NewPxPyPzE(10, 10, 10, 20)),
   283  			want: 100,
   284  		},
   285  		{
   286  			p1:   newPxPyPzE(NewPxPyPzE(+10, +10, +10, +20)),
   287  			p2:   newPtEtaPhiM(NewPxPyPzE(-10, -10, -10, +20)),
   288  			want: 700,
   289  		},
   290  		{
   291  			p1:   newPxPyPzE(NewPxPyPzE(+10, +10, +10, +20)),
   292  			p2:   newPtEtaPhiM(NewPxPyPzE(+10, -10, +10, +20)),
   293  			want: 300,
   294  		},
   295  
   296  		// iptcotthphim
   297  		{
   298  			p1:   newPxPyPzE(NewPxPyPzE(10, 10, 10, 20)),
   299  			p2:   newIPtCotThPhiM(NewPxPyPzE(10, 10, 10, 20)),
   300  			want: 100,
   301  		},
   302  		{
   303  			p1:   newPxPyPzE(NewPxPyPzE(+10, +10, +10, +20)),
   304  			p2:   newIPtCotThPhiM(NewPxPyPzE(-10, -10, -10, +20)),
   305  			want: 700,
   306  		},
   307  		{
   308  			p1:   newPxPyPzE(NewPxPyPzE(+10, +10, +10, +20)),
   309  			p2:   newIPtCotThPhiM(NewPxPyPzE(+10, -10, +10, +20)),
   310  			want: 300,
   311  		},
   312  	} {
   313  		got := Dot(tc.p1, tc.p2)
   314  		if got-tc.want > epsilon_test {
   315  			t.Fatalf("Dot error\np1=%#v\np2=%#v\ngot= %+e\nwant=%+e\n",
   316  				tc.p1,
   317  				tc.p2,
   318  				got,
   319  				tc.want,
   320  			)
   321  		}
   322  	}
   323  }
   324  func TestCosTheta(t *testing.T) {
   325  	for _, tc := range []struct {
   326  		p1   P4
   327  		p2   P4
   328  		want float64
   329  	}{
   330  		// pxpypze
   331  		{
   332  			p1:   newPxPyPzE(NewPxPyPzE(10, 10, 10, 20)),
   333  			p2:   newPxPyPzE(NewPxPyPzE(10, 10, 10, 20)),
   334  			want: 1,
   335  		},
   336  		{
   337  			p1:   newPxPyPzE(NewPxPyPzE(+10, +10, +10, +20)),
   338  			p2:   newPxPyPzE(NewPxPyPzE(-10, -10, -10, +20)),
   339  			want: -1,
   340  		},
   341  		{
   342  			p1:   newPxPyPzE(NewPxPyPzE(+10, +10, +10, +20)),
   343  			p2:   newPxPyPzE(NewPxPyPzE(+10, -10, +10, +20)),
   344  			want: 1.0 / 3,
   345  		},
   346  
   347  		// eetaphim
   348  		{
   349  			p1:   newPxPyPzE(NewPxPyPzE(10, 10, 10, 20)),
   350  			p2:   newEEtaPhiM(NewPxPyPzE(10, 10, 10, 20)),
   351  			want: 1,
   352  		},
   353  		{
   354  			p1:   newPxPyPzE(NewPxPyPzE(+10, +10, +10, +20)),
   355  			p2:   newEEtaPhiM(NewPxPyPzE(-10, -10, -10, +20)),
   356  			want: -1,
   357  		},
   358  		{
   359  			p1:   newPxPyPzE(NewPxPyPzE(+10, +10, +10, +20)),
   360  			p2:   newEEtaPhiM(NewPxPyPzE(+10, -10, +10, +20)),
   361  			want: 1.0 / 3,
   362  		},
   363  
   364  		// etetaphim
   365  		{
   366  			p1:   newPxPyPzE(NewPxPyPzE(10, 10, 10, 20)),
   367  			p2:   newEtEtaPhiM(NewPxPyPzE(10, 10, 10, 20)),
   368  			want: 1,
   369  		},
   370  		{
   371  			p1:   newPxPyPzE(NewPxPyPzE(+10, +10, +10, +20)),
   372  			p2:   newEtEtaPhiM(NewPxPyPzE(-10, -10, -10, +20)),
   373  			want: -1,
   374  		},
   375  		{
   376  			p1:   newPxPyPzE(NewPxPyPzE(+10, +10, +10, +20)),
   377  			p2:   newEtEtaPhiM(NewPxPyPzE(+10, -10, +10, +20)),
   378  			want: 1.0 / 3,
   379  		},
   380  
   381  		// ptetaphim
   382  		{
   383  			p1:   newPxPyPzE(NewPxPyPzE(10, 10, 10, 20)),
   384  			p2:   newPtEtaPhiM(NewPxPyPzE(10, 10, 10, 20)),
   385  			want: 1,
   386  		},
   387  		{
   388  			p1:   newPxPyPzE(NewPxPyPzE(+10, +10, +10, +20)),
   389  			p2:   newPtEtaPhiM(NewPxPyPzE(-10, -10, -10, +20)),
   390  			want: -1,
   391  		},
   392  		{
   393  			p1:   newPxPyPzE(NewPxPyPzE(+10, +10, +10, +20)),
   394  			p2:   newPtEtaPhiM(NewPxPyPzE(+10, -10, +10, +20)),
   395  			want: 1.0 / 3,
   396  		},
   397  
   398  		// iptcotthphim
   399  		{
   400  			p1:   newPxPyPzE(NewPxPyPzE(10, 10, 10, 20)),
   401  			p2:   newIPtCotThPhiM(NewPxPyPzE(10, 10, 10, 20)),
   402  			want: 1,
   403  		},
   404  		{
   405  			p1:   newPxPyPzE(NewPxPyPzE(+10, +10, +10, +20)),
   406  			p2:   newIPtCotThPhiM(NewPxPyPzE(-10, -10, -10, +20)),
   407  			want: -1,
   408  		},
   409  		{
   410  			p1:   newPxPyPzE(NewPxPyPzE(+10, +10, +10, +20)),
   411  			p2:   newIPtCotThPhiM(NewPxPyPzE(+10, -10, +10, +20)),
   412  			want: 1.0 / 3,
   413  		},
   414  	} {
   415  		got := CosTheta(tc.p1, tc.p2)
   416  		if got-tc.want > epsilon_test {
   417  			t.Fatalf("CosTheta error\np1=%#v\np2=%#v\ngot= %+e\nwant=%+e\n",
   418  				tc.p1,
   419  				tc.p2,
   420  				got,
   421  				tc.want,
   422  			)
   423  		}
   424  	}
   425  }