| | 42 | {{{ |
| | 43 | import madgraph.various.misc as misc |
| | 44 | |
| | 45 | def remove_diag(diag): |
| | 46 | """force to have two s-channel W decaying into a specific way. |
| | 47 | Designed for interference studies where decay chain are not allowed |
| | 48 | This is designed for keeping the following diagram generate p p > j j w- w-, w- > e- ve~ |
| | 49 | from the following syntax: p p > j j e- ve~ e- ve~ |
| | 50 | """ |
| | 51 | |
| | 52 | found_w = 0 |
| | 53 | for vertex in diag['vertices']: |
| | 54 | #misc.sprint(vertex.nice_string()) |
| | 55 | if vertex.get('id') == 0: #special final vertex |
| | 56 | continue |
| | 57 | if len(vertex['legs'])!=3: |
| | 58 | continue |
| | 59 | |
| | 60 | for i, leg in enumerate(list(vertex['legs'])): |
| | 61 | #misc.sprint(i, leg) |
| | 62 | if abs(leg['id']) != 24: |
| | 63 | continue |
| | 64 | else: |
| | 65 | break |
| | 66 | else: |
| | 67 | continue |
| | 68 | # we have a vertex with a W |
| | 69 | if i == 2: #This means a vertex A B > W or W > A B |
| | 70 | if leg['number'] > 2: # means that we have W > A B |
| | 71 | #misc.sprint(vertex.nice_string()) |
| | 72 | # check that A B are what we want |
| | 73 | if not all(oleg['state'] for oleg in vertex['legs'][:2]) : # this means not final state |
| | 74 | continue |
| | 75 | #misc.sprint([oleg['id'] for oleg in vertex['legs'][:2] ]) |
| | 76 | if set([oleg['id'] for oleg in vertex['legs'][:2] ]) == set([11,-12]): |
| | 77 | found_w +=1 |
| | 78 | else: # this means A W > B |
| | 79 | if vertex['legs'][-1].get('number') < 3: |
| | 80 | # T-channel -> continue |
| | 81 | continue |
| | 82 | else: |
| | 83 | #check that they are both final state |
| | 84 | if not vertex['legs'][-1]['state']: |
| | 85 | continue |
| | 86 | if not vertex['legs'][1 if i==0 else 0]['state']: |
| | 87 | continue |
| | 88 | |
| | 89 | other_id = [vertex['legs'][-1].get('id'), vertex['legs'][1 if i==0 else 0]['id']] |
| | 90 | if set(other_id) == set([11,-12]): |
| | 91 | found_w += 1 |
| | 92 | |
| | 93 | misc.sprint(found_w) |
| | 94 | if found_w == 2: |
| | 95 | return True |
| | 96 | else: |
| | 97 | return False |
| | 98 | |
| | 99 | }}} |