1
################################################################################
3
# Copyright (c) 2009 The MadGraph Development team and Contributors
5
# This file is a part of the MadGraph 5 project, an application which
6
# automatically generates Feynman diagrams and matrix elements for arbitrary
7
# high-energy processes in the Standard Model and beyond.
9
# It is subject to the MadGraph license which should accompany this
12
# For more information, please visit: http://madgraph.phys.ucl.ac.be
14
################################################################################
15
"""Unit test Library for testing the Creation of Helas Amplitude created from
16
the output of the Feynman Rules."""
17
from __future__ import division
19
import aloha.helasamp_object as HelasObject
20
import aloha.helasamp_lib as HelasLib
23
class TestVariable(unittest.TestCase):
26
self.var1 = HelasLib.Variable(2, 'var1')
27
self.var2 = HelasLib.Variable(3, 'var2')
28
self.var3 = HelasLib.Variable(11, 'var3')
31
def testsumvarvar (self):
32
""" test the sum of two Variable Object"""
35
sum = self.var1 + self.var2
38
self.assertEquals(sum.__class__,HelasLib.AddVariable)
39
self.assertTrue(self.var1 in sum)
40
self.assertTrue(self.var2 in sum)
41
self.assertEquals(len(sum),2)
43
#test prefactor, constant term treatment
44
self.assertEquals(sum.prefactor,1)
45
self.assertTrue(self.var1 in sum)
48
self.assertEqual(term.prefactor, 2)
49
self.assertFalse(term is self.var1)
50
elif term == self.var2:
51
self.assertEqual(term.prefactor, 3)
52
self.assertFalse(term is self.var2)
54
self.assertEquals(self.var1.prefactor, 2) #prefactor is preserve
55
self.assertEquals(self.var2.prefactor, 3)
57
def testrsumvarvar (self):
58
""" test the sum of two Variable Object (inverse order)"""
61
sum = self.var2 + self.var1
63
self.assertEquals(sum.__class__,HelasLib.AddVariable)
64
self.assertTrue(self.var1 in sum)
65
self.assertTrue(self.var2 in sum)
66
self.assertEquals(len(sum),2)
68
#test prefactor, constant term treatment
69
self.assertEquals(sum.prefactor,1)
70
self.assertTrue(self.var1 in sum)
73
self.assertEqual(term.prefactor, 2)
74
self.assertFalse(term is self.var1)
75
elif term == self.var2:
76
self.assertEqual(term.prefactor, 3)
77
self.assertFalse(term is self.var2)
79
self.assertEquals(self.var1.prefactor,2) #prefactor is preserve
80
self.assertEquals(self.var2.prefactor,3)
82
def testsumvarint(self):
83
""" test the sum of one Variable with an integer"""
85
self.assertRaises(AttributeError,HelasLib.Variable.__add__, self.var1, 4)
88
def testsumvaradd(self):
89
""" test the sum of one Variable with an AddVariable"""
91
add = HelasLib.AddVariable()
97
self.assertEquals(sum.__class__,HelasLib.AddVariable)
98
self.assertTrue(self.var3 in sum)
99
self.assertEquals(len(sum), 3)
101
if data == self.var3:
102
self.assertFalse(data is self.var3)
104
self.assertFalse(data is self.var1)
105
self.assertFalse(data is self.var2)
108
#test prefactor- constant_term
109
self.assertEquals(sum.prefactor, 1)
110
self.assertEquals(self.var1.prefactor,2)
112
def testsumvarmult(self):
113
""" test the sum of one Variable with an MultVariable"""
115
mult = HelasLib.MultVariable()
116
mult.append(self.var1)
117
mult.append(self.var2)
118
sum = self.var3 + mult
120
self.assertEquals(sum.__class__,HelasLib.AddVariable)
121
self.assertTrue(self.var3 in sum)
122
self.assertEquals(len(sum), 2)
124
if data == self.var3:
125
self.assertFalse(data is self.var3)
126
self.assertEqual(data.prefactor, self.var3.prefactor)
128
#test prefactor- constant_term
129
self.assertEquals(sum.prefactor, 1)
130
self.assertEquals(self.var3.prefactor, 11)
132
def testmultvarvar(self):
133
"""product of Two Variable"""
135
prod = self.var1 * self.var2
138
self.assertEquals(prod.__class__,HelasLib.MultVariable)
139
self.assertTrue(self.var1 in prod) # presence of single term
140
self.assertTrue(self.var2 in prod) # presence of single term
141
self.assertEquals(len(prod),2)
144
self.assertEquals(prod.prefactor,6)
147
def testmultvarAdd(self):
148
"""product of Variable with an AddVariable"""
150
add = self.var1 + self.var2
151
prod = self.var3 * add
153
self.assertEquals(prod.__class__, HelasLib.AddVariable)
154
self.assertEquals(len(prod), 2)
156
#check prefactor of each term
158
if self.var1 not in term:
159
self.assertEquals(term.prefactor, 33)
160
elif self.var2 not in term:
161
self.assertEquals(term.prefactor, 22)
163
raise Exception('not valid term')
166
def testmultvarMult(self):
167
"""product of Variable with an MultVariable"""
169
var1 = HelasLib.Variable(2)
170
var2 = HelasLib.Variable(3,'y')
171
mult = HelasLib.MultVariable()
175
prod = self.var1 * mult
178
self.assertEquals(prod.__class__, HelasLib.MultVariable)
179
self.assertEquals(len(prod), 3)
182
self.assertEquals(prod.prefactor, 12)
185
def testmultvarint(self):
186
"""product of Var with an integer"""
188
prod1 = self.var1 * 2
189
prod2 = 2 * self.var2
192
self.assertTrue(prod1, HelasLib.Variable)
193
self.assertTrue(prod2, HelasLib.Variable)
194
self.assertEquals(prod1, self.var1)
195
self.assertEquals(prod2, self.var2)
196
self.assertFalse(prod1 is self.var1)
197
self.assertFalse(prod2 is self.var2)
199
#check prefactor - constant term
200
self.assertEquals(prod1.prefactor, 4)
201
self.assertEquals(prod2.prefactor, 6)
203
class TestAddVariable(unittest.TestCase):
206
"""Initialize basic object"""
207
self.var1 = HelasLib.Variable(2, 'var1')
208
self.var2 = HelasLib.Variable(3, 'var2')
209
self.add1 = HelasLib.AddVariable()
210
self.add1.append(self.var1)
211
self.add1.append(self.var2)
213
self.var3 = HelasLib.Variable(11, 'var3')
214
self.var4 = HelasLib.Variable(4, 'var4')
215
self.add2 = HelasLib.AddVariable()
216
self.add2.append(self.var3)
217
self.add2.append(self.var4)
219
def testsumaddint(self):
220
"""Test the sum of an Add variable with an integer"""
223
self.assertEqual(type(add2), HelasLib.AddVariable)
224
self.assertEqual(len(add2), 3)
226
if term == self.var1:
227
self.assertTrue(term.prefactor, 2)
228
elif term == self.var2:
229
self.assertTrue(term.prefactor, 3)
231
self.assertEqual(type(term), HelasLib.ConstantObject)
232
self.assertEqual(term.value, 5)
236
def testsumaddmult(self):
237
"""Test the sum of an AddVariable with a MultVariable."""
239
var1 = HelasLib.Variable(2)
240
var2 = HelasLib.Variable(3)
241
mult = HelasLib.MultVariable()
244
mult.constant_term =2
246
sum = self.add1 + mult
249
self.assertEquals(sum.__class__, HelasLib.AddVariable)
250
self.assertEqual(len(sum), 3)
251
self.assertTrue(mult in sum)
255
if term.__class__ == HelasLib.AddVariable:
256
self.assertTrue(term.prefactor, 6)
257
self.assertTrue(term.constant_term, 0)
259
def testsumaddvar(self):
260
"""Test the sum of an AddVariable with a Variable."""
262
var3 = HelasLib.Variable(11, 'var3')
263
sum = self.add1 + var3
264
self.assertEquals(sum.__class__,HelasLib.AddVariable)
265
self.assertTrue(self.var1 in sum)
266
self.assertTrue(self.var2 in sum)
267
self.assertTrue(self.var3 in sum)
268
self.assertEquals(len(sum), 3)
270
if data == self.var1:
271
self.assertEquals(data.prefactor,2)
272
elif data == self.var2:
273
self.assertEquals(data.prefactor,3)
274
elif data == self.var3:
275
self.assertEquals(data.prefactor,11)
277
#test prefactor- constant_term
278
self.assertEquals(sum.prefactor, 1)
280
def testsumaddadd(self):
281
"""Test the sum of two add object"""
283
sum = self.add1 + self.add2
285
self.assertEquals(sum.__class__, HelasLib.AddVariable)
286
self.assertEquals(len(sum), 4)
288
self.assertTrue(self.var1 in sum)
289
self.assertTrue(self.var2 in sum)
290
self.assertTrue(self.var3 in sum)
291
self.assertTrue(self.var4 in sum)
294
if data == self.var1:
295
self.assertEquals(data.prefactor, 2)
296
elif data == self.var2:
297
self.assertEquals(data.prefactor, 3)
298
elif data == self.var3:
299
self.assertEquals(data.prefactor, 11)
300
elif data == self.var4:
301
self.assertEquals(data.prefactor, 4)
302
#test prefactor- constant_term
303
self.assertEquals(sum.prefactor, 1)
305
def testmultaddint(self):
306
"""test the multiplication of an AddVariable by a Integer"""
308
prod1 = 3 * self.add1
309
prod2 = self.add2 * 2
311
self.assertEquals(prod1.__class__, HelasLib.AddVariable)
312
self.assertEquals(prod2.__class__, HelasLib.AddVariable)
313
self.assertFalse(prod1 is self.add1)
314
self.assertFalse(prod2 is self.add2)
315
self.assertEquals(len(prod1), 2)
316
self.assertEquals(len(prod2), 2)
318
self.assertEquals(prod1.prefactor, 1)
319
self.assertEquals(prod2.prefactor, 1)
322
if data == self.var1:
323
self.assertEquals(data.prefactor, 6)
324
elif data == self.var2:
325
self.assertEquals(data.prefactor, 9)
327
if data == self.var3:
328
self.assertEquals(data.prefactor, 22)
329
elif data == self.var4:
330
self.assertEquals(data.prefactor, 8)
333
def testmultadd_legacy(self):
334
""" int * AddVariable doens't change the content of AddVariable """
336
var1 = HelasObject.P(1,2)
337
var2 = HelasObject.P(2,2)
339
assert(prod.__class__, HelasLib.MultLorentz)
340
var3 = HelasObject.Metric(1,2)
342
sum = (var3 + var1 * var2)
345
self.assertEqual(new_sum.__class__, HelasLib.AddVariable)
346
self.assertEqual(len(new_sum), 2)
347
self.assertEqual(new_sum.prefactor, 1)
349
self.assertEqual(term.prefactor, 2)
350
if term.__class__ == HelasObject.Metric:
351
self.assertFalse(var3 is term)
353
self.assertEqual(term.__class__, HelasLib.MultLorentz)
354
self.assertEqual(prod, term)
355
self.assertFalse(prod is term)
357
def testmultaddvar(self):
358
"""Test the multiplication of an Addvariable with a Variable"""
360
var3 = HelasLib.Variable(11, 'var3')
361
prod = self.add1 * var3
363
self.assertEquals(prod.__class__, HelasLib.AddVariable)
364
self.assertEquals(len(prod), 2)
366
#check prefactor of each term
368
if self.var1 not in term:
369
self.assertEquals(term.prefactor, 33)
370
elif self.var2 not in term:
371
self.assertEquals(term.prefactor, 22)
373
raise Exception('not valid term')
376
def testmultaddvar_legacy(self):
377
"""Test that the legacy is preserve for Add/var multiplication"""
379
p1 = HelasObject.P(1,1)
380
p2 = HelasObject.P(1,2)
381
p3 = HelasObject.P(3,3)
387
self.assertEqual(result.__class__, HelasLib.AddVariable)
388
self.assertEqual(len(result), 2)
390
self.assertTrue(p3 in term)
391
self.assertEqual(term.__class__,HelasObject.P.mult_class)
396
def testmultaddmult(self):
397
"""Test the multiplication of an AddVariable with a MultVariable."""
399
var3 = HelasLib.Variable(2, 'var3')
400
var4 = HelasLib.Variable(1, 'var4')
401
prod = self.add1 * (var3 *var4)
403
self.assertEqual(prod.__class__, HelasLib.AddVariable)
404
self.assertEqual(len(prod), 2)
407
if self.var1 in data:
408
self.assertEqual(data.__class__, HelasLib.MultVariable)
409
self.assertEqual(data.prefactor, 4)
411
self.assertEqual(data.__class__, HelasLib.MultVariable)
412
self.assertEqual(data.prefactor, 6)
413
self.assertEqual(prod.prefactor, 1)
416
def testmultaddadd(self):
417
"""Test the multiplication between two AddVariable."""
419
prod = self.add1 * self.add2
420
self.assertEqual(prod.__class__, HelasLib.AddVariable)
421
self.assertEqual(len(prod), 4)
424
if self.var1 in data and self.var3 in data:
425
self.assertEqual(data.__class__, HelasLib.MultVariable)
426
self.assertEqual(data.prefactor, 22)
427
elif self.var1 in data:
428
self.assertEqual(data.__class__, HelasLib.MultVariable)
429
self.assertEqual(data.prefactor, 8)
430
elif self.var2 in data and self.var3 in data:
431
self.assertEqual(data.__class__, HelasLib.MultVariable)
432
self.assertEqual(data.prefactor, 33)
434
self.assertEqual(data.__class__, HelasLib.MultVariable)
435
self.assertEqual(data.prefactor, 12)
438
def testfactorization(self):
439
"""test the factorization"""
441
p1 = HelasLib.ScalarVariable('p1',[])
442
p2 = HelasLib.ScalarVariable('p2',[])
443
p3 = HelasLib.ScalarVariable('p3',[])
444
p4 = HelasLib.ScalarVariable('p4',[])
445
p5 = HelasLib.ScalarVariable('p5',[])
448
sum = p1 * p2 + p1 * p3
449
sum = sum.factorize()
450
self.assertEqual(sum.__class__,HelasLib.MultVariable)
451
self.assertEqual(len(sum),2)
453
if isinstance(fact, HelasLib.Variable):
454
self.assertEqual(fact, p1)
456
self.assertEqual(fact, p3 + p2)
459
sum = p1 * p2 + p1 * p3 + 2 * p1 + 2 *p1 * p2 * p4
460
sum = sum.factorize()
462
#Should return p1*(p2(2*p4 + 1) + p3 + 2)
464
self.assertEqual(sum.__class__,HelasLib.MultVariable)
465
self.assertEqual(len(sum),2)
467
if isinstance(fact, HelasLib.Variable):
468
self.assertEqual(fact, p1)
470
self.assertEqual(fact.__class__,HelasLib.AddVariable)
471
self.assertEqual(len(fact), 2)
473
if isinstance(term, HelasLib.AddVariable):
474
self.assertEqual(term[0], p3)
475
self.assertEqual(term[1], HelasLib.ConstantObject(2))
477
self.assertEqual(term.__class__, HelasLib.MultVariable)
478
self.assertTrue(p2 in term)
479
self.assertTrue(len(term),2)
484
self.assertEqual(data.__class__, HelasLib.AddVariable)
485
self.assertTrue(p4 in data)
486
self.assertTrue(HelasLib.ConstantObject(1) in data)
489
self.assertEqual(term2.prefactor,2)
491
print term2, term2.__class__
492
self.assertEqual(term2, \
493
HelasLib.ConstantObject(1))
496
s3 = HelasLib.ScalarVariable('s3',[])
497
s2 = HelasLib.ScalarVariable('s2',[])
498
p1 = HelasLib.ScalarVariable('p1',[])
499
om1 = HelasLib.ScalarVariable('om1',[])
500
sum = 2/3 * s3 * s2 - 4/3 * p1 * p1 * s3 * s2 * om1 + \
501
2/3 * p1 * p1 * p1 * p1 * om1 *om1
503
sum = sum.factorize()
513
class TestMultVariable(unittest.TestCase):
516
self.var1 = HelasLib.Variable(2, 'var1')
517
self.var2 = HelasLib.Variable(3, 'var2')
518
self.var3 = HelasLib.Variable(4, 'var3')
519
self.var4 = HelasLib.Variable(5, 'var4')
521
self.mult1 = self.var1 * self.var2
522
self.mult2 = self.var3 * self.var4
524
def testequality(self):
525
"""test the definition of Equality"""
529
self.assertNotEqual(self.mult1, self.mult2)
531
#test with other type of obj
532
self.assertNotEqual(self.mult1, 32)
533
self.assertNotEqual(self.mult1, self.var1)
534
self.assertNotEqual(self.mult1, self.var1 + self.var2)
536
def testsummultmul(self):
537
"""Test the sum of two MultVariable"""
539
sum = self.mult1 + self.mult2
540
self.assertEqual(sum.__class__, HelasLib.AddVariable)
541
self.assertEqual(len(sum),2)
542
self.assertEqual(sum.prefactor, 1)
545
if self.var1 in term:
546
self.assertEqual(term.prefactor, 6)
547
self.assertFalse(term is self.mult1)
549
self.assertEqual(term.prefactor, 20)
550
self.assertFalse(term is self.mult2)
552
sum = self.mult1 - self.mult1
554
self.assertEqual(sum.__class__, HelasLib.ConstantObject)
555
self.assertEqual(len(sum),0)
556
self.assertEqual(sum.prefactor, 1)
558
def testdealingwithpower1(self):
559
"""Check that the power is correctly set in a product"""
561
p1 = HelasLib.ScalarVariable('p1', [])
562
p2 = HelasLib.ScalarVariable('p2', [])
565
self.assertEqual(prod.__class__, HelasLib.MultVariable)
566
prod = prod.simplify()
567
self.assertEqual(prod.__class__, HelasLib.ScalarVariable)
568
self.assertEqual(prod.power, 2)
569
self.assertEqual(p1.power, 1)
572
prod = prod.simplify()
573
self.assertEqual(prod.__class__, HelasLib.ScalarVariable)
574
self.assertEqual(prod.power, 3)
575
self.assertEqual(p1.power, 1)
579
self.assertEqual(prod.__class__, HelasLib.MultVariable)
580
self.assertEqual(prod[0].power, 3)
581
self.assertEqual(prod[1].power, 1)
582
self.assertEqual(p1.power, 1)
583
self.assertEqual(p2.power, 1)
587
self.assertEqual(prod.__class__, HelasLib.MultVariable)
588
self.assertEqual(prod[0].power, 4)
589
self.assertEqual(prod[1].power, 1)
590
self.assertEqual(p1.power, 1)
591
self.assertEqual(p2.power, 1)
593
def testdealingwithpower2(self):
594
"""Check that the power is correctly set in a product"""
596
p1 = HelasLib.ScalarVariable('p1', [])
597
p2 = HelasLib.ScalarVariable('p2', [])
598
p3 = HelasLib.ScalarVariable('p3', [])
599
p4 = HelasLib.ScalarVariable('p2', [])
600
p5 = HelasLib.ScalarVariable('p5', [])
604
prod = p3 * sum2 * sum1
605
self.assertEqual(prod.__class__, HelasLib.AddVariable)
606
for term in sum1 + sum2:
607
self.assertEqual(term.power, 1)
612
self.assertEqual(term.power, 2)
613
elif p1 in term and p2 in term and p3 in term:
614
self.assertEqual(term[0].power, 1)
615
self.assertEqual(term[1].power, 1)
616
self.assertEqual(term[2].power, 1)
620
self.assertFalse(obj1 is term[1])
621
elif p2 in term and p3 in term:
622
self.assertEqual(term[0].power+term[1].power, 3)
626
self.assertFalse(obj1 is term[1])
632
def test_obj_are_not_modified(self):
633
"""Check that a sum-product-... doesn't change part of the objects"""
635
sum = self.mult1 + self.mult2
637
self.assertFalse(term is self.mult1)
638
self.assertFalse(term is self.mult2)
641
sum2 = sum - (self.mult1 + self.mult2)
644
# self.assertFalse(term is term2)
646
sum2 = sum2.simplify()
648
#check that sum2 is zero
649
self.assertEqual(len(sum2), 0)
650
self.assertEqual(sum2.__class__, HelasLib.ConstantObject)
651
self.assertEqual(sum2, 0)
653
#check that the sum is not modify in this game
654
self.assertEqual(sum.__class__, HelasLib.AddVariable)
655
self.assertEqual(len(sum), 2)
656
self.assertEqual(sum.prefactor, 1)
659
self.assertEqual(len(data), 2)
660
if self.var1 in data:
661
self.assertEqual(data.prefactor, 6)
662
self.assertTrue(self.var2 in data)
664
self.assertEqual(data.prefactor, 20)
665
self.assertTrue(self.var3 in data)
666
self.assertTrue(self.var4 in data)
668
def testsummultint(self):
669
"""Test the sum of a MultVariable object with a number"""
671
self.assertRaises(AttributeError, HelasLib.MultVariable.__add__, self.mult1, 2)
674
def testsummultadd(self):
675
"""Test the sum of an MultVariable with a AddVariable."""
677
var1 = HelasLib.Variable(2,'xxx')
678
var2 = HelasLib.Variable(3,'yyy')
681
sum = self.mult2 + add
683
self.assertEquals(sum.__class__, HelasLib.AddVariable)
684
self.assertEqual(len(sum), 3)
685
self.assertTrue(var1 in sum)
686
self.assertTrue(var2 in sum)
690
if term.__class__ == HelasLib.MultVariable:
691
self.assertEqual(term.prefactor, 20)
692
self.assertTrue(self.var3 in term)
693
self.assertTrue(self.var4 in term)
695
self.assertEqual(term.prefactor, 2)
697
self.assertEqual(term.prefactor, 3)
699
self.assertEqual(sum.prefactor, 1)
701
def testsummulvar(self):
702
"""Test the sum of a MultVariable with a Variable"""
705
var = HelasLib.Variable(3,'xxx')
706
sum = self.mult2 + var
708
self.assertEquals(sum.__class__,HelasLib.AddVariable)
709
self.assertTrue(var in sum)
710
self.assertEquals(len(sum), 2)
713
self.assertEquals(term.prefactor, 3)
714
self.assertFalse(term is var)
716
self.assertTrue(self.var3 in term)
717
self.assertTrue(self.var4 in term)
718
self.assertEqual(term.prefactor, 20)
720
#test prefactor- constant_term
721
self.assertEquals(sum.prefactor, 1)
722
self.assertEquals(var.prefactor, 3)
723
self.assertEquals(self.mult2.prefactor, 20)
725
def testmultmultint(self):
726
"""Test the multiplication of an MultVariable with an integer"""
728
prod1 = self.mult1 * 2
730
self.assertEqual(prod1.__class__, HelasLib.MultVariable)
731
self.assertEqual(len(prod1), 2)
732
self.assertFalse(prod1 is self.mult1)
733
self.assertEqual(prod1.prefactor, 12)
735
if fact == self.var1:
736
self.assertEqual(fact.prefactor, 1)
737
if fact == self.var2:
738
self.assertEqual(fact.prefactor, 1)
740
prod2 = 2 * self.mult1
742
self.assertEqual(prod2.__class__, HelasLib.MultVariable)
743
self.assertEqual(len(prod2), 2)
744
self.assertEqual(prod2.prefactor, 12)
746
if fact == self.var1:
747
self.assertEqual(fact.prefactor, 1)
748
if fact == self.var2:
749
self.assertEqual(fact.prefactor, 1)
752
def testmultmultmult(self):
753
"""test the multiplication of two MultVariable"""
755
prod1 = self.mult1 * self.mult2
756
self.assertEqual(prod1.__class__, HelasLib.MultVariable)
757
self.assertEqual(len(prod1), 4)
758
self.assertTrue(self.var1 in prod1)
759
self.assertTrue(self.var2 in prod1)
760
self.assertTrue(self.var3 in prod1)
761
self.assertTrue(self.var4 in prod1)
762
self.assertEqual(prod1.prefactor, 120)
765
self.assertEqual(fact.prefactor, 1)
769
class TestFracVariable(unittest.TestCase):
770
""" Class to test the Operation linked to a FracVariable """
773
""" some building block """
775
self.p1 = HelasObject.P(1,2)
776
self.p2 = HelasObject.P(1,3)
777
self.mass1 = HelasObject.Mass(2)
778
self.mass2 = HelasObject.Mass(3)
779
self.frac1 = HelasLib.FracVariable(self.p1, self.mass1)
780
self.frac2 = HelasLib.FracVariable(self.p2, self.mass2)
782
def testcreation(self):
783
""" test if we can create FracVariable Object with division"""
786
# First check the creation at Lorentz Object
788
frac1= self.p1 / self.mass1
789
self.assertEqual(frac1.__class__, HelasLib.FracVariable)
790
self.assertEqual(frac1, self.frac1)
791
# Verif that the object are different
792
self.assertFalse(frac1.numerator is self.p1)
793
self.assertFalse(frac1.denominator is self.mass1)
795
sum = self.p1 +self.p2
796
frac2 = sum / self.mass1
797
self.assertEqual(frac2.__class__, HelasLib.FracVariable)
798
self.assertEqual(frac2.numerator, sum)
799
self.assertEqual(frac2.denominator, self.mass1)
800
# Verif that the object are different
801
self.assertFalse(frac2.numerator is sum)
802
self.assertFalse(frac2.denominator is self.mass1)
804
prod = self.p1 * self.p2
805
frac3 = prod / self.mass1
806
self.assertEqual(frac3.__class__, HelasLib.FracVariable)
807
self.assertEqual(frac3.numerator, prod)
808
self.assertEqual(frac3.denominator, self.mass1)
809
# Verif that the object are different
810
self.assertFalse(frac3.numerator is prod)
811
self.assertFalse(frac3.denominator is self.mass1)
813
frac4 = 2 / self.mass1
814
self.assertEqual(frac4.__class__, HelasLib.FracVariable)
815
self.assertTrue(isinstance(frac4.numerator, int))
816
self.assertEqual(frac4.numerator, 2)
817
self.assertTrue(isinstance(frac4.denominator,HelasLib.Variable))
818
self.assertEqual(frac4.denominator, self.mass1)
819
self.assertFalse(frac4.denominator is self.mass1)
821
sum = (self.mass1 + self.mass2)
823
self.assertEqual(frac4.__class__, HelasLib.FracVariable)
824
self.assertTrue(isinstance(frac4.numerator, int))
825
self.assertEqual(frac4.numerator, 2)
826
self.assertTrue(isinstance(frac4.denominator,HelasLib.AddVariable))
827
self.assertEqual(frac4.denominator, sum)
828
self.assertFalse(frac4.denominator is sum)
830
prod = self.mass1 * self.mass2
832
self.assertEqual(frac4.__class__, HelasLib.FracVariable)
833
self.assertTrue(isinstance(frac4.numerator, int))
834
self.assertEqual(frac4.numerator, 2)
835
self.assertTrue(isinstance(frac4.denominator,HelasLib.MultVariable))
836
self.assertTrue(isinstance(frac4.denominator,HelasLib.MultLorentz))
837
self.assertEqual(frac4.denominator, prod)
838
self.assertFalse(frac4.denominator is prod)
841
def testmultiplacation(self):
842
"""Frac Variable can be multiply by any object"""
844
#product with Variable
845
prod1 = self.frac1 * self.p1
846
self.assertEqual(prod1.__class__, HelasLib.FracVariable)
847
self.assertEqual(prod1.numerator, self.p1 * self.p1)
848
self.assertEqual(prod1.denominator, self.mass1)
850
prod2 = self.p1 * self.frac1
851
self.assertEqual(prod2.__class__, HelasLib.FracVariable)
852
self.assertEqual(prod2.numerator, self.p1 * self.p1)
853
self.assertEqual(prod2.denominator, self.mass1)
855
#product with MultVariable
856
prod = self.p1 * self.p2
857
prod2 = prod * self.frac1
858
self.assertEqual(prod2.__class__, HelasLib.FracVariable)
859
self.assertEqual(prod2.numerator, self.p1 * self.p2 * self.p1)
860
self.assertEqual(prod2.denominator, self.mass1)
862
prod3 = self.frac1 * prod
863
self.assertEqual(prod3.__class__, HelasLib.FracVariable)
864
self.assertEqual(prod3.numerator, self.p1 * self.p2 * self.p1)
865
self.assertEqual(prod3.denominator, self.mass1)
867
# Product with SumVariable
868
sum = self.p1 +self.p2
869
prod2 = sum * self.frac1
870
self.assertEqual(prod2.__class__, HelasLib.FracVariable)
871
self.assertEqual(prod2.numerator, sum * self.p1)
872
self.assertEqual(prod2.denominator, self.mass1)
874
prod3 = self.frac1 * sum
875
self.assertEqual(prod3.__class__, HelasLib.FracVariable)
876
self.assertEqual(prod3.numerator, sum * self.p1)
877
self.assertEqual(prod3.denominator, self.mass1)
880
# Product with FracVariable
881
prod = self.frac1 * self.frac2
882
self.assertEqual(prod.__class__, HelasLib.FracVariable)
883
self.assertEqual(prod.numerator.__class__, HelasLib.MultLorentz)
884
self.assertEqual(prod.numerator, self.p2 * self.p1)
885
self.assertEqual(prod.denominator, self.mass1 * self.mass2)
887
prod3 = self.frac2 * self.frac1
888
self.assertEqual(prod3.__class__, HelasLib.FracVariable)
889
self.assertEqual(prod3.numerator, self.p2 * self.p1)
890
self.assertEqual(prod3.denominator, self.mass1 * self.mass2)
893
def testdivision(self):
894
""" Test division with a FracVariable """
896
#divide with Variable
897
prod1 = self.frac1 / self.p1
898
self.assertEqual(prod1.__class__, HelasLib.FracVariable)
899
self.assertEqual(prod1.numerator, self.p1)
900
self.assertEqual(prod1.denominator, self.p1 * self.mass1)
902
#divide with a MultVariable
903
prod= self.p1 * self.p2
904
prod3 = self.frac1 / prod
905
self.assertEqual(prod3.__class__, HelasLib.FracVariable)
906
self.assertEqual(prod3.numerator, self.p1)
907
self.assertEqual(prod3.denominator, self.mass1 * self.p1 * self.p2)
909
# divide with AddVariable
910
sum = self.p1 +self.p2
911
prod2 = self.frac1 / sum
912
self.assertEqual(prod2.__class__, HelasLib.FracVariable)
913
self.assertEqual(prod2.numerator, self.p1)
914
self.assertEqual(prod2.denominator, sum * self.mass1)
919
class testLorentzObject(unittest.TestCase):
920
""" Class to test the Operation linked to a Lorentz Object"""
924
self.p1= HelasObject.P(1,2)
925
self.p2= HelasObject.P(1,3)
926
self.p3= HelasObject.P(2,2)
927
self.p4= HelasObject.P(2,3)
929
def testbasicoperation(self):
930
"""Test the sum/product run correctly on High level object.
931
Those test will be basic since everything should derive from particle
934
new = self.p1 * self.p2 + self.p3 * self.p4
935
self.assertEqual(new.__class__, HelasLib.AddVariable)
936
self.assertEqual(len(new), 2)
938
new2 = HelasObject.Gamma(1,2,3) * HelasObject.P(1,2)
940
self.assertEqual(new2.__class__, HelasLib.MultLorentz)
941
self.assertEqual(len(new2), 2)
943
new2 += HelasObject.Gamma(1,2,3) * HelasObject.P(1,3)
944
self.assertEqual(new2.__class__, HelasLib.AddVariable)
945
self.assertEqual(len(new2), 2)
946
self.assertNotEqual(new, new2)
948
def test_equality(self):
949
"""test the equality of Lorentz Object"""
951
self.assertEqual(self.p1,self.p1)
952
self.assertNotEqual(self.p1,self.p2)
953
self.assertNotEqual(self.p1,self.p3)
954
self.assertNotEqual(self.p1,self.p4)
955
self.assertEqual(self.p1, HelasObject.P(1,2))
957
self.assertNotEqual(self.p1, HelasObject.Gamma(1,2,3))
959
new = HelasObject.Gamma(1,2,3) * HelasObject.P(1,2)
960
new2 = HelasObject.Gamma(1,2,3) * HelasObject.P(1,2)
961
self.assertEqual(new, new2)
963
#Check that sum indices are not consider for equality
964
new3 = HelasObject.Gamma(3,2,3) * HelasObject.P(3,2)
965
self.assertEqual(new, new3)
967
new4 = HelasObject.P(3,2) * HelasObject.Gamma(3,2,3)
968
self.assertEqual(new, new4)
969
self.assertEqual(new3, new4)
971
new5 = HelasObject.P(4,2) * HelasObject.Gamma(4,2,3)
972
self.assertEqual(new, new5)
973
self.assertEqual(new3, new5)
974
self.assertEqual(new4, new5)
976
new6 = HelasObject.P(3,2) * HelasObject.Gamma(3,3,2)
977
self.assertNotEqual(new, new6)
979
new7 = HelasObject.P(3,4) * HelasObject.Gamma(3,2,3)
980
self.assertNotEqual(new, new7)
982
#Test contraction on spin
983
new = HelasObject.Gamma(3,3,2) * HelasObject.Gamma(2,2,4) * \
984
HelasObject.P(3,3) * HelasObject.P(2,4)
985
new2 = HelasObject.Gamma(3,3,2) * HelasObject.Gamma(2,2,4) * \
986
HelasObject.P(3,4) * HelasObject.P(2,3)
987
self.assertNotEqual(new,new2)
989
new3 = HelasObject.P(1,3) * HelasObject.Gamma(1,3,1) * HelasObject.P(4,4) * \
990
HelasObject.Gamma(4,1,4)
991
self.assertEqual(new, new3)
992
self.assertNotEqual(new2, new3)
994
new4 = HelasObject.P(1,3) * HelasObject.Gamma(1,3,2) * HelasObject.P(4,4) * \
995
HelasObject.Gamma(4,1,4)
996
self.assertNotEqual(new,new4)
998
def testexpand(self):
999
"""Test if the expansion from HighLevel to LowLevel works correctly"""
1001
#expand a single object
1002
obj = HelasObject.P(1,2)
1003
low_level = obj.expand()
1005
keys= low_level.keys()
1007
self.assertEqual(keys, [(0,),(1,),(2,),(3,)])
1008
self.assertEqual(low_level[(0,)], HelasLib.ScalarVariable('P2_0',[2]))
1009
self.assertEqual(low_level[(1,)], HelasLib.ScalarVariable('P2_1',[2]))
1010
self.assertEqual(low_level[(2,)], HelasLib.ScalarVariable('P2_2',[2]))
1011
self.assertEqual(low_level[(3,)], HelasLib.ScalarVariable('P2_3',[2]))
1015
obj = HelasObject.P(1,2) * HelasObject.P(2,3)
1016
low_level = obj.expand()
1018
for ind in low_level.listindices():
1019
self.assertEqual(low_level.get_rep(ind), \
1020
HelasLib.ScalarVariable('P2_%s' % ind[1]) * \
1021
HelasLib.ScalarVariable('P3_%s' % ind[0]))
1024
obj = HelasObject.P(1,2) + HelasObject.P(1,3)
1025
low_level = obj.expand()
1027
for ind in low_level.listindices():
1028
self.assertEqual(low_level.get_rep(ind), \
1029
HelasLib.ScalarVariable('P2_%s' % ind[0]) + \
1030
HelasLib.ScalarVariable('P3_%s' % ind[0]))
1033
obj = HelasObject.P(1,2) - HelasObject.P(1,2)
1034
obj = obj.simplify()
1035
low_level = obj.expand()
1037
for ind in low_level.listindices():
1039
self.assertEqual(low_level.get_rep(ind), 0)
1040
self.assertEqual(pass_in_check, 1)
1042
#expand zero without first simplification
1043
obj = HelasObject.P(1,2) - HelasObject.P(1,2)
1044
low_level = obj.expand().simplify()
1046
for ind in low_level.listindices():
1048
self.assertEqual(low_level.get_rep(ind), 0)
1049
self.assertEqual(pass_in_check, 4)
1051
#expand standard frac variable
1052
obj = HelasObject.P(1,2) / HelasObject.P(1,2)
1054
result = {(0,): HelasLib.ScalarVariable('P2_0',[2]), \
1055
(1,): HelasLib.ScalarVariable('P2_1',[2]), \
1056
(2,): HelasLib.ScalarVariable('P2_2',[2]), \
1057
(3,): HelasLib.ScalarVariable('P2_3',[2])}
1059
self.assertEqual(result[tuple([i])], obj.numerator[tuple([i])])
1060
self.assertEqual(result[tuple([i])], obj.denominator[tuple([i])])
1063
#expand standard frac variable with number numerator
1064
obj = 1 / HelasObject.P(1,2)
1066
self.assertEqual(obj.numerator, 1)
1068
self.assertEqual(result[tuple([i])], obj.denominator[tuple([i])])
1070
# Check for the prefactor
1071
obj = 36 * HelasObject.P(1,2)
1073
for ind in obj.listindices():
1074
expression = obj.get_rep(ind)
1075
self.assertEqual(expression.prefactor, 36)
1077
# Check for the prefactor
1078
obj = 36 * HelasObject.P(1,2) * HelasObject.P(2,2)
1080
for ind in obj.listindices():
1081
expression = obj.get_rep(ind)
1082
self.assertEqual(expression.prefactor, 36)
1085
def testTraceofObject(self):
1086
"""Check that we can output the trace of an object"""
1088
obj = HelasObject.Gamma(1,1,1)
1092
def testscalarmanipulation(self):
1093
"""Deal correctly with Scalar type of LorentzObject"""
1095
obj= HelasObject.Mass(3)
1096
obj = obj.simplify()
1097
low_level = obj.expand()
1098
for ind in low_level.listindices():
1099
self.assertEqual(low_level.get_rep(ind).__class__, HelasLib.ScalarVariable)
1100
self.assertEqual(low_level.get_rep(ind), HelasLib.ScalarVariable('M3',[3]))
1102
obj= HelasObject.Mass(3) * HelasObject.P(1,2)
1103
obj = obj.simplify()
1104
low_level = obj.expand()
1105
self.assertEqual(low_level.__class__, HelasLib.LorentzObjectRepresentation)
1106
for ind in low_level.listindices():
1107
self.assertEqual(low_level.get_rep(ind).__class__, HelasLib.MultVariable)
1108
self.assertEqual(low_level.get_rep(ind), HelasLib.ScalarVariable('M3',[3])
1109
* HelasLib.ScalarVariable('P2_%s' % ind[0],[0]))
1112
class TestLorentzObjectRepresentation(unittest.TestCase):
1113
"""Class to test the operation in the LorentzObjectRepresentation"""
1115
#for lorentz manipulation
1116
p1nu = HelasObject.P(1,1)
1117
p1nu = p1nu.expand()
1118
p1mu = HelasObject.P(2,1)
1119
p1mu = p1mu.expand()
1120
p2nu = HelasObject.P(1,2)
1121
p2nu = p2nu.expand()
1122
p2mu = HelasObject.P(2,2)
1123
p2mu = p2mu.expand()
1125
#for lorentz - spin manipulation
1126
gamma_nu_ij = HelasObject.Gamma(1,1,2)
1127
gamma_nu_ij = gamma_nu_ij.expand()
1128
gamma_nu_ji = HelasObject.Gamma(1,2,1)
1129
gamma_nu_ji = gamma_nu_ji.expand()
1130
gamma_mu_ij = HelasObject.Gamma(2,1,2)
1131
gamma_mu_ij = gamma_mu_ij.expand()
1132
gamma_nu_jk = HelasObject.Gamma(1,2,3)
1133
gamma_nu_jk = gamma_nu_jk.expand()
1134
gamma_mu_jk = HelasObject.Gamma(2,2,3)
1135
gamma_mu_jk = gamma_mu_jk.expand()
1136
gamma_nu_kl = HelasObject.Gamma(1,3,4)
1137
gamma_nu_kl = gamma_nu_kl.expand()
1138
gamma_mu_kl = HelasObject.Gamma(2,3,4)
1139
gamma_mu_kl = gamma_mu_kl.expand()
1140
gamma_mu_ki = HelasObject.Gamma(2,3,1)
1141
gamma_mu_ki = gamma_mu_ki.expand()
1143
def testlistindices(self):
1144
"""test that we return the correct list of indices"""
1146
#only lorentz indices
1147
test1 = HelasLib.LorentzObjectRepresentation([],[1,2],[],[])
1150
for ind in test1.listindices():
1151
self.assertFalse(ind in already_use, '%s appear two times' % ind)
1152
already_use.append(list(ind))
1154
self.assertTrue(value >= 0)
1155
self.assertTrue(value < 4)
1156
self.assertEqual(len(already_use), 16)
1159
test1 = HelasLib.LorentzObjectRepresentation([],[],[1,2,3],[])
1162
for ind in test1.listindices():
1163
self.assertFalse(ind in already_use, '%s appear two times' % ind)
1164
already_use.append(list(ind))
1166
self.assertTrue(value >= 0)
1167
self.assertTrue(value < 4)
1168
self.assertEqual(len(already_use), 64)
1171
test1 = HelasLib.LorentzObjectRepresentation([],[1],[1,2,3],[])
1174
for ind in test1.listindices():
1175
self.assertFalse(ind in already_use, '%s appear two times' % ind)
1176
already_use.append(list(ind))
1178
self.assertTrue(value >= 0)
1179
self.assertTrue(value < 4)
1180
self.assertEqual(len(already_use), 256)
1183
test1 = HelasLib.LorentzObjectRepresentation([],[1],[],[])
1186
for ind in test1.listindices():
1187
self.assertFalse(ind in already_use, '%s appear two times' % ind)
1188
already_use.append(list(ind))
1190
self.assertTrue(value >= 0)
1191
self.assertTrue(value < 4)
1192
self.assertEqual(len(already_use), 4)
1195
test1 = HelasLib.LorentzObjectRepresentation(38,[],[],[])
1198
for ind in test1.listindices():
1199
self.assertEqual(ind,[0])
1200
already_use.append(list(ind))
1201
self.assertEqual(len(already_use), 1)
1203
def testgetrepresentation(self):
1204
"""Check the way to find representation"""
1206
data={(0,0):1, (0,1):2, (0,2):3, (0,3):4,
1207
(1,0):2, (1,1):4, (1,2):6, (1,3):8,
1208
(2,0):3, (2,1):6, (2,2):9, (2,3):12,
1209
(3,0):4, (3,1):8, (3,2):12, (3,3):16
1212
repr1 = HelasLib.LorentzObjectRepresentation(data, [1], [1], [])
1213
repr2 = HelasLib.LorentzObjectRepresentation(data, [1, 2], [], [])
1214
repr3 = HelasLib.LorentzObjectRepresentation(data, [], [1, 2], [])
1216
for ind in repr1.listindices():
1217
self.assertEquals(repr1.get_rep(ind), (ind[0]+1)*(ind[1]+1))
1218
self.assertEquals(repr2.get_rep(ind), (ind[0]+1)*(ind[1]+1))
1219
self.assertEquals(repr3.get_rep(ind), (ind[0]+1)*(ind[1]+1))
1222
#check the dealing with scalar
1223
repr4 = HelasLib.LorentzObjectRepresentation(49, [], [], [])
1224
for ind in repr4.listindices():
1225
self.assertEquals(repr4.get_rep(ind), 49)
1227
def testsetrepresentation(self):
1228
"""Check the way to set a representation"""
1230
goal=[[1, 2, 3 , 4], [2, 4, 6, 8], [3, 6, 9, 12], [4, 8, 12, 16]]
1232
repr1 = HelasLib.LorentzObjectRepresentation([], [1], [1], [])
1233
repr2 = HelasLib.LorentzObjectRepresentation([], [1, 2], [], [])
1234
repr3 = HelasLib.LorentzObjectRepresentation([], [], [1, 2], [])
1236
for ind in repr1.listindices():
1237
repr1.set_rep(ind, (ind[0]+1)*(ind[1]+1))
1238
repr2.set_rep(ind, (ind[0]+1)*(ind[1]+1))
1239
repr3.set_rep(ind, (ind[0]+1)*(ind[1]+1))
1241
for ind in repr1.listindices():
1242
self.assertEquals(repr1.get_rep(ind), (ind[0]+1)*(ind[1]+1))
1243
self.assertEquals(repr2.get_rep(ind), (ind[0]+1)*(ind[1]+1))
1244
self.assertEquals(repr3.get_rep(ind), (ind[0]+1)*(ind[1]+1))
1246
for ind in repr1.listindices():
1247
self.assertEquals(repr1.get_rep(ind), goal[ind[0]][ind[1]])
1248
self.assertEquals(repr2.get_rep(ind), goal[ind[0]][ind[1]])
1249
self.assertEquals(repr3.get_rep(ind), goal[ind[0]][ind[1]])
1251
self.assertEquals(repr1.get_rep(ind), (ind[0]+1)*(ind[1]+1))
1252
self.assertEquals(repr2.get_rep(ind), (ind[0]+1)*(ind[1]+1))
1253
self.assertEquals(repr3.get_rep(ind), (ind[0]+1)*(ind[1]+1))
1256
def testtensorialproductlorentz(self):
1257
"""Test that two object have correct product"""
1259
product = self.p1nu * self.p2mu
1262
self.assertTrue(isinstance(product, HelasLib.LorentzObjectRepresentation))
1263
self.assertEquals(product.lorentz_ind, [1,2])
1264
self.assertEqual(product.spin_ind, [])
1265
self.assertEqual(product.tag, set(['P1','P2']))
1267
#check the representation
1268
for ind in product.listindices():
1269
rep = product.get_rep(ind)
1270
self.assertEqual(rep.__class__, HelasLib.MultVariable)
1271
self.assertEqual(len(rep), 2)
1273
if not( data.variable == 'P1_%s' % ind[0] or data.variable == \
1275
raise Exception('invalid product')
1276
self.assertNotEqual(rep[0].variable, rep[1].variable)
1279
def testtensorialproductspin(self):
1280
"""test the product in spin indices"""
1282
product1 = self.gamma_nu_ij * self.gamma_mu_kl
1285
self.assertTrue(isinstance(product1, HelasLib.LorentzObjectRepresentation))
1286
self.assertEquals(product1.lorentz_ind, [1,2])
1287
self.assertEqual(product1.spin_ind, [1,2,3,4])
1288
self.assertEqual(product1.tag, set([]))
1290
#check the representation
1291
for ind in product1.listindices():
1292
rep = product1.get_rep(ind)
1294
fact1 = self.gamma_nu_ij.get_rep([ind[0],ind[2],ind[3]])
1295
fact2 = self.gamma_mu_kl.get_rep([ind[1],ind[4],ind[5]])
1296
self.assertEqual(rep, fact1 * fact2)
1299
#Check with a lorentz contraction
1300
product2 = self.gamma_nu_ij * self.gamma_nu_kl
1303
self.assertTrue(isinstance(product2, HelasLib.LorentzObjectRepresentation))
1304
self.assertEquals(product2.lorentz_ind, [])
1305
self.assertEqual(product2.spin_ind, [1,2,3,4])
1306
self.assertEqual(product2.tag, set([]))
1308
#check the representation
1309
for ind in product2.listindices():
1310
rep = product2.get_rep(ind)
1312
sol = product1.get_rep([0,0] + ind) - product1.get_rep([1,1] + ind) - \
1313
product1.get_rep([2,2] + ind) -product1.get_rep([3,3] + ind)
1315
product1.get_rep([2,2] + ind),product1.get_rep([3,3] + ind)
1316
self.assertEqual(rep, sol)
1319
def testspincontraction(self):
1320
"""Test the spin contraction"""
1321
prod0 = self.gamma_mu_ij * self.gamma_nu_kl
1322
prod1 = self.gamma_mu_ij * self.gamma_nu_jk
1325
self.assertTrue(isinstance(prod1, HelasLib.LorentzObjectRepresentation))
1326
self.assertEquals(prod1.lorentz_ind, [2, 1])
1327
self.assertEqual(prod1.spin_ind, [1,3])
1329
for ind in prod1.listindices():
1331
rep = prod1.get_rep(ind)
1332
sol = prod0.get_rep([ind[0], ind[1], ind[2], 0, 0, ind[3]]) + \
1333
prod0.get_rep([ind[0], ind[1], ind[2], 1, 1, ind[3]]) + \
1334
prod0.get_rep([ind[0], ind[1], ind[2], 2, 2, ind[3]]) + \
1335
prod0.get_rep([ind[0], ind[1], ind[2], 3, 3, ind[3]])
1336
self.assertEqual(rep, sol)
1339
prod2 = self.gamma_mu_ij * self.gamma_mu_jk
1342
self.assertTrue(isinstance(prod2, HelasLib.LorentzObjectRepresentation))
1343
self.assertEquals(prod2.lorentz_ind, [])
1344
self.assertEqual(prod2.spin_ind, [1,3])
1346
for ind in prod2.listindices():
1348
rep = prod2.get_rep(ind)
1349
sol = prod1.get_rep([0, 0, ind[0], ind[1]]) \
1350
- prod1.get_rep([1, 1, ind[0], ind[1]]) + \
1351
- prod1.get_rep([2, 2, ind[0], ind[1]]) + \
1352
- prod1.get_rep([3, 3, ind[0], ind[1]])
1354
self.assertEqual(rep, sol)
1357
prod3 = self.gamma_nu_ij * self.gamma_nu_ji
1360
self.assertTrue(isinstance(prod3, HelasLib.LorentzObjectRepresentation))
1361
self.assertEquals(prod3.lorentz_ind, [])
1362
self.assertEqual(prod3.spin_ind, [])
1364
for ind in prod3.listindices():
1366
rep = prod3.get_rep(ind)
1367
sol = prod2.get_rep([0,0]) \
1368
+ prod2.get_rep([1,1]) \
1369
+ prod2.get_rep([2,2]) \
1370
+ prod2.get_rep([3,3])
1371
self.assertEqual(rep, sol)
1374
prod3 = self.gamma_nu_ji * self.gamma_nu_ij
1377
self.assertTrue(isinstance(prod3, HelasLib.LorentzObjectRepresentation))
1378
self.assertEquals(prod3.lorentz_ind, [])
1379
self.assertEqual(prod3.spin_ind, [])
1381
for ind in prod3.listindices():
1383
rep = prod3.get_rep(ind)
1384
sol = prod2.get_rep([0,0]) \
1385
+ prod2.get_rep([1,1]) \
1386
+ prod2.get_rep([2,2]) \
1387
+ prod2.get_rep([3,3])
1388
self.assertEqual(rep, sol)
1392
def testEinsteinsum(self):
1393
"""Test the Einstein summation"""
1395
prod1 = self.p1nu * self.p2mu * self.p2nu
1398
self.assertTrue(isinstance(prod1, HelasLib.LorentzObjectRepresentation))
1399
self.assertEquals(prod1.lorentz_ind, [2])
1400
self.assertEqual(prod1.spin_ind, [])
1401
self.assertEqual(prod1.tag, set(['P1','P2']))
1403
#check the representation
1404
for ind in prod1.listindices():
1405
rep = prod1.get_rep(ind)
1406
self.assertEqual(rep.__class__, HelasLib.AddVariable)
1407
self.assertEqual(len(rep), 4)
1409
self.assertEqual(data.__class__, HelasLib.MultVariable)
1410
power = [data2.power for data2 in data]
1413
self.assertEqual(power, [1,2])
1415
self.assertEqual(power, [1,1,1])
1418
# Returning a scalar
1419
prod2 = self.p1nu * self.p2nu
1422
self.assertTrue(isinstance(prod2, HelasLib.LorentzObjectRepresentation))
1423
self.assertEquals(prod2.lorentz_ind, [])
1424
self.assertEqual(prod2.spin_ind, [])
1425
self.assertEqual(prod2.tag, set(['P1','P2']))
1427
#check the representation
1428
for ind in prod2.listindices():
1429
rep = prod2.get_rep(ind)
1430
self.assertEqual(rep.__class__, HelasLib.AddVariable)
1431
self.assertEqual(len(rep), 4)
1433
self.assertEqual(data.__class__, HelasLib.MultVariable)
1434
self.assertEqual(len(data), 2)
1435
self.assertNotEqual(data[0].variable, data[1].variable)
1437
def testeinsteinsum2(self):
1439
class gamma_in_lorentz(HelasLib.LorentzObject):
1440
""" local representation """
1442
def __init__(self, l1, l2, prefactor=1, constant=0):
1443
HelasLib.LorentzObject.__init__(self,[l1, l2], [], [])
1445
representation = HelasLib.LorentzObjectRepresentation(
1446
{(0,0): 0, (0,1): 0, (0,2): 0, (0,3):-1,
1447
(1,0): 0, (1,1): 0, (1,2): -1, (1,3):0,
1448
(2,0): 0, (2,1): 1, (2,2): 0, (2,3):0,
1449
(3,0): 1, (3,1): 0, (3,2): 0, (3,3):0
1452
create_representation = lambda : representation
1454
obj = gamma_in_lorentz([1,2],[],[])
1458
self.assertEqual(obj2.get_rep((0,3)), -1)
1459
self.assertEqual(obj2.get_rep((1,2)), -1)
1460
self.assertEqual(obj2.get_rep((2,1)), 1)
1461
self.assertEqual(obj2.get_rep((3,0)), 1)
1463
new= obj * HelasObject.P(2,2)
1464
new = new.simplify()
1466
new = new.simplify()
1467
self.assertEqual(new.__class__, HelasLib.LorentzObjectRepresentation)
1468
self.assertEqual(new.lorentz_ind, [1])
1469
self.assertEqual(new.get_rep([3]), HelasLib.ScalarVariable('P2_0'))
1470
self.assertEqual(new.get_rep([2]), HelasLib.ScalarVariable('P2_1'))
1471
self.assertEqual(new.get_rep([1]), HelasLib.ScalarVariable('P2_2'))
1472
self.assertEqual(new.get_rep([0]), HelasLib.ScalarVariable('P2_3'))
1473
self.assertEqual(new.get_rep([0]).prefactor, 1)
1474
self.assertEqual(new.get_rep([1]).prefactor, 1)
1475
self.assertEqual(new.get_rep([2]).prefactor, -1)
1476
self.assertEqual(new.get_rep([3]).prefactor, 1)
1478
def testspinsum(self):
1480
class gamma_in_spin(HelasLib.LorentzObject):
1481
""" local representation """
1483
def __init__(self, s1, s2, prefactor=1, constant=0):
1484
HelasLib.LorentzObject.__init__(self, [], [s1, s2], [])
1486
representation = HelasLib.LorentzObjectRepresentation(
1487
{(0,0): 0, (0,1): 0, (0,2): 0, (0,3):-1,
1488
(1,0): 0, (1,1): 0, (1,2): -1, (1,3):0,
1489
(2,0): 0, (2,1): 1, (2,2): 0, (2,3):0,
1490
(3,0): 1, (3,1): 0, (3,2): 0, (3,3):0},
1493
create_representation = lambda : representation
1496
obj = gamma_in_spin(1,2)
1499
self.assertEqual(obj2.get_rep((0,3)), -1)
1500
self.assertEqual(obj2.get_rep((1,2)), -1)
1501
self.assertEqual(obj2.get_rep((2,1)), 1)
1502
self.assertEqual(obj2.get_rep((3,0)), 1)
1504
new= obj * HelasObject.Spinor(2,2)
1505
new = new.simplify()
1507
new = new.simplify()
1508
self.assertEqual(new.__class__, HelasLib.LorentzObjectRepresentation)
1509
self.assertEqual(new.spin_ind, [1])
1510
self.assertEqual(new.get_rep([3]), HelasLib.ScalarVariable('F2_1'))
1511
self.assertEqual(new.get_rep([2]), HelasLib.ScalarVariable('F2_2'))
1512
self.assertEqual(new.get_rep([1]), HelasLib.ScalarVariable('F2_3'))
1513
self.assertEqual(new.get_rep([0]), HelasLib.ScalarVariable('F2_4'))
1514
self.assertEqual(new.get_rep([0]).prefactor, -1)
1515
self.assertEqual(new.get_rep([1]).prefactor, -1)
1516
self.assertEqual(new.get_rep([2]).prefactor, 1)
1517
self.assertEqual(new.get_rep([3]).prefactor, 1)
1521
def testsumofLorentzObj(self):
1522
""" Check the sumation of LorentzObject"""
1524
sum = self.p1nu + self.p2nu
1527
self.assertTrue(isinstance(sum, HelasLib.LorentzObjectRepresentation))
1528
self.assertEquals(sum.lorentz_ind, [1])
1529
self.assertEqual(sum.spin_ind, [])
1530
self.assertEqual(sum.tag, set(['P1','P2']))
1532
#check the representation
1533
for ind in sum.listindices():
1534
rep = sum.get_rep(ind)
1535
self.assertEqual(rep.__class__, HelasLib.AddVariable)
1536
self.assertEqual(len(rep), 2)
1538
self.assertEqual(data.__class__, HelasLib.ScalarVariable)
1541
## check more complex with indices in wrong order
1544
sum = self.p1nu * self.p2mu + self.p1mu * self.p2nu
1547
self.assertTrue(isinstance(sum, HelasLib.LorentzObjectRepresentation))
1548
self.assertEquals(sum.lorentz_ind, [1, 2])
1549
self.assertEqual(sum.spin_ind, [])
1550
tag = set(list(sum.tag))
1552
#check the representation
1553
for ind in sum.listindices():
1554
rep = sum.get_rep(ind)
1555
if rep.prefactor == 1:
1556
self.assertEqual(rep.__class__, HelasLib.AddVariable)
1557
self.assertEqual(len(rep), 2)
1559
self.assertEqual(data.__class__, HelasLib.MultVariable)
1560
self.assertEqual(data.prefactor, 1)
1562
self.assertEqual(rep.__class__, HelasLib.MultVariable)
1563
self.assertEqual(len(rep), 2)
1564
self.assertEqual(rep.prefactor,2)
1565
sum2 = sum - (self.p1nu * self.p2mu + self.p2nu * self.p1mu)
1566
sum2 = sum2.simplify()
1567
for ind in sum2.listindices():
1568
rep = sum2.get_rep(ind)
1569
self.assertEqual(rep, 0)
1572
#check sum is unchanged
1573
self.assertTrue(isinstance(sum, HelasLib.LorentzObjectRepresentation))
1574
self.assertEquals(sum.lorentz_ind, [1, 2])
1575
self.assertEqual(sum.spin_ind, [])
1576
self.assertEqual(sum.tag, tag)
1577
for ind in sum.listindices():
1578
rep = sum.get_rep(ind)
1579
if rep.prefactor == 1:
1580
self.assertEqual(rep.__class__, HelasLib.AddVariable)
1581
self.assertEqual(len(rep), 2)
1583
self.assertEqual(data.__class__, HelasLib.MultVariable)
1584
self.assertEqual(data.prefactor,1)
1586
self.assertEqual(rep.__class__, HelasLib.MultVariable)
1587
self.assertEqual(len(rep), 2)
1588
self.assertEqual(rep.prefactor,2)
1589
self.assertEqual(sum, self.p1nu * self.p2mu + self.p1mu * self.p2nu)
1591
sumbis = self.p1nu * self.p2mu + self.p1mu * self.p2nu
1592
for ind in sumbis.listindices():
1593
self.assertEqual(sumbis.get_rep(ind),sum.get_rep(ind))
1596
sum = sum.simplify()
1597
for ind in sum.listindices():
1598
rep = sum.get_rep(ind)
1599
self.assertEqual(rep, 0)
1600
self.assertEqual(sum,sum2)
1603
self.assertRaises( \
1604
HelasLib.LorentzObjectRepresentation.LorentzObjectRepresentationError, \
1605
HelasLib.LorentzObjectRepresentation.__add__,self.p1nu,self.p2mu)
1607
class TestSomeObjectProperty(unittest.TestCase):
1608
"""Test that some property pass correctly for Object"""
1610
def testmassisdiffaswidth(self):
1611
"""Ensure that a mass object is different of a width object"""
1613
mass = HelasObject.Mass(1)
1614
width = HelasObject.Width(1)
1615
self.assertNotEqual(mass, width)
1616
self.assertNotEqual(mass * mass, mass * width)
1619
mass = mass.expand()
1620
width = width.expand()
1621
self.assertNotEqual(mass, width)
1622
self.assertNotEqual(mass * mass, mass * width)
1624
mass = mass.simplify()
1625
width = width.simplify()
1626
self.assertNotEqual(mass, width)
1627
self.assertNotEqual(mass * mass, mass * width)
1629
mass = HelasObject.Mass(1)
1630
width = HelasObject.Width(1)
1631
sum = mass * mass + mass * width
1633
self.assertEqual(sum.__class__, HelasLib.AddVariable)
1634
self.assertEqual(len(sum), 2)
1636
def testIdentityMatrix(self):
1637
""" Test the Identity Matrix"""
1638
Identity = HelasObject.Identity
1639
Gamma = HelasObject.Gamma
1640
Gamma5 = HelasObject.Gamma5
1641
Metric = HelasObject.Metric
1643
#Test that Identity is idenpotent
1644
obj1 = Identity(1,2).expand()
1645
obj2 = Identity(1,3).expand() * Identity(3,2).expand()
1646
self.assertEqual(obj1.lorentz_ind, obj2.lorentz_ind)
1647
self.assertEqual(obj1.spin_ind, obj2.spin_ind)
1648
self.assertEqual(obj1, obj2)
1651
obj1 = Gamma(1,1,2).expand()
1652
obj2 = Identity(1,3).expand() * Gamma(1,3,2).expand()
1653
self.assertEqual(obj1.lorentz_ind, obj2.lorentz_ind)
1654
self.assertEqual(obj1.spin_ind, obj2.spin_ind)
1655
self.assertEqual(obj1, obj2)
1657
#Gamma = Identity * Gamma
1659
obj2 = Identity(1,3) * Gamma(1,3,2)
1660
obj1 = obj1.simplify().expand().simplify()
1661
obj2 = obj2.simplify().expand().simplify()
1662
self.assertEqual(obj1.lorentz_ind, obj2.lorentz_ind)
1663
self.assertEqual(set(obj1.spin_ind), set(obj2.spin_ind))
1664
for ind in obj1.listindices():
1665
if obj1.spin_ind == obj2.spin_ind:
1666
mapind = lambda ind : ind
1668
mapind = lambda ind : [ind[0],ind[2],ind[1]]
1669
self.assertEqual(obj1.get_rep(ind),obj2.get_rep(mapind(ind)))
1672
#self.assertEqual(obj1, obj2)
1674
#Gamma = Identity * Identity * Gamma
1676
obj1 = Gamma(1,1,2).expand()
1677
obj2 = Identity(3,4).expand() * Gamma(1,4,2).expand()
1678
obj3 = Identity(1,3).expand() *obj2
1679
self.assertEqual(obj1.lorentz_ind, obj2.lorentz_ind)
1680
self.assertEqual(obj1.lorentz_ind, obj3.lorentz_ind)
1681
self.assertEqual(obj2.spin_ind, [3,2])
1682
self.assertEqual(obj1.spin_ind, obj3.spin_ind)
1683
for ind in obj1.listindices():
1684
self.assertEqual(obj1.get_rep(ind),obj3.get_rep(ind))
1685
self.assertEqual(obj1, obj3)
1689
obj2 = Identity(1,3) * Identity(3,4)
1690
obj3 = obj2 * Gamma(1,4,2)
1691
obj1 = obj1.simplify().expand().simplify()
1692
obj2 = obj2.simplify().expand().simplify()
1693
obj3 = obj3.simplify().expand().simplify()
1694
#self.assertEqual(obj1.lorentz_ind, obj2.lorentz_ind)
1695
self.assertEqual(obj1.lorentz_ind, obj3.lorentz_ind)
1696
self.assertEqual(set(obj2.spin_ind), set([1,4]))
1697
self.assertEqual(set(obj1.spin_ind), set(obj3.spin_ind))
1698
for ind in obj1.listindices():
1699
if obj1.spin_ind == obj3.spin_ind:
1700
mapind = lambda ind : ind
1702
mapind = lambda ind : [ind[0],ind[2],ind[1]]
1703
self.assertEqual(obj1.get_rep(ind),obj3.get_rep(mapind(ind)))
1704
#self.assertEqual(obj1, obj3)
1708
obj2 = Identity(1,3) * Identity(3,4) * Gamma(1,4,2)
1709
obj1 = obj1.simplify().expand().simplify()
1710
obj2 = obj2.simplify().expand().simplify()
1711
self.assertEqual(obj1.lorentz_ind, obj2.lorentz_ind)
1712
self.assertEqual(set(obj2.spin_ind), set([1,2]))
1713
self.assertEqual(set(obj1.spin_ind), set(obj2.spin_ind))
1714
for ind in obj1.listindices():
1715
if obj1.spin_ind == obj2.spin_ind:
1716
mapind = lambda ind : ind
1718
mapind = lambda ind : [ind[0],ind[2],ind[1]]
1719
self.assertEqual(obj1.get_rep(ind),obj2.get_rep(mapind(ind)))
1720
#self.assertEqual(obj1, obj2)
1722
def testGammaAlgebra(self):
1723
"""Test the coherence between gamma/gamma5/sigma/projector"""
1724
Gamma = HelasObject.Gamma
1725
Gamma5 = HelasObject.Gamma5
1726
Sigma = HelasObject.Sigma
1727
ProjM = HelasObject.ProjM
1728
ProjP = HelasObject.ProjP
1729
Identity = HelasObject.Identity
1730
Metric = HelasObject.Metric
1732
#Gamma5 = i *Gamma0 * Gamma1 * Gamma2 * Gamma3
1733
gamma5 = complex(0,1) * Gamma(0,1,2) * Gamma(1,2,3) * Gamma(2,3,4) * \
1735
self.assertEqual(gamma5.__class__,HelasLib.MultLorentz)
1736
self.assertEqual(gamma5.prefactor, complex(0,1))
1738
gamma5_2 = Gamma5(1,5)
1740
gamma5 = gamma5.expand().simplify()
1741
gamma5_2 = gamma5_2.expand().simplify()
1743
for ind in gamma5_2.listindices():
1744
component1 = gamma5.get_rep([0,1,2,3] + ind)
1745
component2 = gamma5_2.get_rep(ind)
1746
self.assertEqual(component1, component2)
1748
#ProjP = (1+ Gamma5)/2
1750
projp = 1/2 * (Identity(1,2) + Gamma5(1,2))
1751
projp = projp.simplify()
1752
projp = projp.expand()
1753
projp = projp.simplify()
1756
projp2 = projp2.simplify()
1757
projp2 = projp2.expand()
1758
projp2 = projp2.simplify()
1760
self.assertEqual(projp,projp2)
1762
#ProjM = (1 - Gamma5)/2
1764
projm = 1/2 * (Identity(1,2) - Gamma5(1,2))
1765
projm = projm.simplify()
1766
projm = projm.expand()
1767
projm = projm.simplify()
1770
projm2 = projm2.simplify()
1771
projm2 = projm2.expand()
1772
projm2 = projm2.simplify()
1774
self.assertEqual(projm,projm2)
1776
# Identity = ProjP + ProjM
1777
identity= ProjM(1,2) + ProjP(1,2)
1778
identity = identity.simplify().expand().simplify()
1780
identity2 = Identity(1,2)
1781
identity2 = identity2.simplify().expand().simplify()
1783
self.assertEqual(identity,identity2)
1785
#metric_mu_nu = 1/2 {Gamma_nu, Gamma_mu}
1786
metric = 1/2 * (Gamma(1,1,2)*Gamma(2,2,3) + Gamma(2,1,2)*Gamma(1,2,3))
1787
metric = metric.simplify().expand().simplify()
1789
metric2 = Metric(1,2) * Identity(1,3)
1790
metric2 = metric2.simplify().expand().simplify()
1791
self.assertEqual(metric, metric2)
1793
#Sigma_mu_nu = 1/(2i) * [Gamma_mu, Gamma_nu]
1794
sigma = complex(0, 1/2) * (Gamma(1,1,2)*Gamma(2,2,3) - Gamma(2,1,2)*Gamma(1,2,3))
1795
sigma = sigma.simplify().expand().simplify()
1797
sigma2 = Sigma(1,2,1,3)
1798
sigma2 = sigma2.simplify().expand().simplify()
1799
self.assertEqual(sigma, sigma2)
1801
def testemptyisFalse(self):
1803
false = HelasLib.AddVariable([])
1805
raise AssertionError, 'empty list are not False'
1807
false = HelasLib.MultVariable([])
1809
raise AssertionError, 'empty list are not False'
1811
class TestConstantObject(unittest.TestCase):
1812
"""Check the different Operation for a Constant Object"""
1816
const = HelasLib.ConstantObject()
1817
p = HelasObject.P(1,1)
1820
self.assertEqual(type(sum),type(p))
1821
self.assertEqual(sum, p)
1823
p2 = HelasObject.P(1,2)
1826
class TestSimplify(unittest.TestCase):
1827
"""Check that the simplification works correctly"""
1829
def testsimplifyMultLorentz(self):
1831
# For Standard Product : No Simplification
1832
prod = HelasObject.Gamma(1, 2, 3) * HelasObject.Gamma(3, 4, 5)
1834
simp = prod.simplify()
1835
self.assertEqual(simp, prod)
1837
# Look if Multiply by Propagator
1838
prod = HelasObject.Gamma(1, 2, 3) * HelasObject.SpinorPropagator(1, 2 ,3) / \
1839
HelasObject.DenominatorPropagator(3)
1840
simp = prod.simplify()
1842
self.assertEqual(simp.__class__, HelasLib.FracVariable)
1843
self.assertEqual(simp.denominator.__class__, HelasLib.AddVariable)
1844
simp = simp.expand()
1845
simp = simp.simplify()
1846
self.assertEqual(simp.denominator.__class__, HelasLib.LorentzObjectRepresentation)
1847
denominator = simp.denominator.get_rep([0])
1848
for data in denominator:
1849
if HelasLib.ScalarVariable('P3_0') == data:
1850
self.assertEqual(data.prefactor, 1)
1851
self.assertEqual(data.power, 2)
1852
elif HelasLib.ScalarVariable('P3_1') == data:
1853
self.assertEqual(data.prefactor, -1)
1854
self.assertEqual(data.power, 2)
1855
elif HelasLib.ScalarVariable('P3_2') == data:
1856
self.assertEqual(data.prefactor, -1)
1857
self.assertEqual(data.power, 2)
1858
elif HelasLib.ScalarVariable('P3_3') == data:
1859
self.assertEqual(data.prefactor, -1)
1860
self.assertEqual(data.power, 2)
1861
elif HelasLib.ScalarVariable('M3') == data:
1862
self.assertEqual(data.prefactor, -1)
1863
self.assertEqual(data.power, 2)
1864
elif HelasLib.ScalarVariable('W3') in data:
1865
self.assertEqual(data.prefactor, complex(0,1))
1869
def testsimplifyFracVariable(self):
1871
# For Standard Product : No Simplification
1872
prod = HelasObject.Gamma(1, 2, 3) * HelasObject.Gamma(3, 4, 5)
1874
simp = prod.simplify()
1875
self.assertEqual(simp, prod)
1877
# Look if Multiply by Propagator
1879
prod = HelasObject.Gamma(1, 2, 3) * HelasObject.SpinorPropagator(1, 2 ,3) / \
1880
HelasObject.DenominatorPropagator(3)
1881
simp = prod.simplify()
1883
self.assertEqual(simp.__class__, HelasLib.FracVariable)
1884
self.assertEqual(simp.denominator.__class__, HelasLib.AddVariable)
b'\\ No newline at end of file'