=How can I remove some unwanted diagram? == Warning Be carefull about gauge invariance (a non gauge invariant subset will also break lorentz invariance) == Requirements: 1. This method is implemented since MG5aMC version 2.5.0 1. This method is only implemented for leading order processes == method: === user_filter.py You need to define the file user_filter.py who should define the function remove_diag(diag): It should return True if you want to discard the diagram. example of file {{{ def remove_diag(diag): """remove all diagram with quark in T-channel""" for vertex in diag['vertices']: #last if vertex['id'] == 0: #special final vertex continue if vertex['legs'][-1]['number'] < 3: #this means T-channel if abs(vertex['legs'][-1]['id']) <6: return True return False }}} {{{ def remove_diag(diag): """remove all diagram which are not pure QCD or pure QED: Fake example""" if diag.get('orders')['QCD'] >0 and diag.get('orders')['QED']>0: return True return False }}} {{{ import madgraph.various.misc as misc def remove_diag(diag): """force to have two s-channel W decaying into a specific way. Designed for interference studies where decay chain are not allowed This is designed for keeping the following diagram generate p p > j j w- w-, w- > e- ve~ from the following syntax: p p > j j e- ve~ e- ve~ """ found_w = 0 for vertex in diag['vertices']: #misc.sprint(vertex.nice_string()) if vertex.get('id') == 0: #special final vertex continue if len(vertex['legs'])!=3: continue for i, leg in enumerate(list(vertex['legs'])): #misc.sprint(i, leg) if abs(leg['id']) != 24: continue else: break else: continue # we have a vertex with a W if i == 2: #This means a vertex A B > W or W > A B if leg['number'] > 2: # means that we have W > A B #misc.sprint(vertex.nice_string()) # check that A B are what we want if not all(oleg['state'] for oleg in vertex['legs'][:2]) : # this means not final state continue #misc.sprint([oleg['id'] for oleg in vertex['legs'][:2] ]) if set([oleg['id'] for oleg in vertex['legs'][:2] ]) == set([11,-12]): found_w +=1 else: # this means A W > B if vertex['legs'][-1].get('number') < 3: # T-channel -> continue continue else: #check that they are both final state if not vertex['legs'][-1]['state']: continue if not vertex['legs'][1 if i==0 else 0]['state']: continue other_id = [vertex['legs'][-1].get('id'), vertex['legs'][1 if i==0 else 0]['id']] if set(other_id) == set([11,-12]): found_w += 1 misc.sprint(found_w) if found_w == 2: return True else: return False }}} === running with user_filter to activate the filtering, you have to add '--diagram_filter' to the command example {{{ generate p p > w+ w+ j j --diagram_filter }}} If you remove any diagram you should see on the screen: {{{ INFO: Trying process: c c > w+ w+ s s WEIGHTED<=6 @1 WARNING: Diagram filter is ON and removed 12 diagrams for this subprocess. }}}