filtering on non-loop part of loop diagrams

Asked by Richard Ruiz

Hi folks,

I think this one is for Valentin. I have a complicated, loop-induced 2 -> 4 process and want to filter like I would for tree-level processes but on the *non-loop* parts of the diagram. I want to filter on pieces that might *not* be touching the loop directly (interference diagrams). How can I do this?

It seems like the available documentation [1] and examples in loop_diagram_generation.py only addresses filtering/removing diagrams according to the loop part.

https://answers.launchpad.net/mg5amcnlo/+faq/3328

Similarly, when I try to "explore" the properties of diag in self['loop_diagrams'], 'vertices' seems to only include the loop sub-graphs. For clarity, I am working in "def user_filter", where the examples are given.

Best,
Richard

Question information

Language:
English Edit question
Status:
Solved
For:
MadGraph5_aMC@NLO Edit question
Assignee:
No assignee Edit question
Solved by:
Richard Ruiz
Solved:
Last query:
Last reply:
Revision history for this message
Olivier Mattelaer (olivier-mattelaer) said :
#1

That information should be in the canonical tag

Revision history for this message
Olivier Mattelaer (olivier-mattelaer) said :
#2

So the canonical tag can be related to the struct object. (that correspond to the tree attached to a point of the loop)
So maybe one option is to flag which of the the struct you want to veto
and store their canonical tag
and if such tag is present within the canonical tag of the loop then veto the loop.

Cheers,

Olivier

Revision history for this message
Richard Ruiz (rruiz) said :
#3

Hi Olivier,

How do I interpret the information contained in "canonical_tag"

for example, using the process
generate g g > e+ e- QCD=2 QED=2 [noborn=QCD] / u d s c b --loop_filter=True

with the filter commands:

canonList = diag.get('canonical_tag')
for item in canonList:
 print(item)

I get:
[-6, [3], 8]
[-6, [4], 8]
[-6, [2], 69]
[6, [3], 8]
[6, [4], 8]
[6, [2], 69]

WARNING:
    The user-defined loop diagrams filter is turned on and discarded 0 loops.
DEBUG: Coupling order combinations considered: (QCD,QED,WEIGHTED)
DEBUG: > No Born contributions for this process.
DEBUG: > loop : (4,4,W12)
INFO: Contributing diagrams generated: 0 Born, 2 loops, 1 R2, 0 UV
1 processes with 2 diagrams generated in 0.025 s
Total: 1 processes with 2 diagrams

I am guessing the first three "items" are from diagram 1 and the last three "items" are from diagram 2. However, I do not know what to do with this.

Revision history for this message
Richard Ruiz (rruiz) said :
#4

PS I am using version = 2.9.16LTS if it makes a difference

Revision history for this message
Olivier Mattelaer (olivier-mattelaer) said :
#5

So did you try to compare those with the canonical tag from the struct?

Olivier

Revision history for this message
Richard Ruiz (rruiz) said :
#6

Hi Olivier,

Thanks for pointing me to the 'structs' object.

I see now that 'structs' contains everything that I need. For future reference, here is a snippet that will parse structs, which is an instance of an FDStructureList class.

for vertex in structs:
                print("new effective vertex")
                outLegs = vertex.get('external_legs')
                for leg in outLegs:
                    print(leg.get('id'))
                bindingID = vertex.get('binding_leg').get('id')
                print(bindingID)

This will print out:
new effective vertex
21
21
21
new effective vertex
-11
11
22
new effective vertex
-11
11
23
new effective vertex
21
21
new effective vertex
21
21

cheers,
richard

Revision history for this message
Richard Ruiz (rruiz) said (last edit ):
#7

Hi,

I realized that the above example was not the clearest. Here is another example:

Consider the 2->4 process mediated by z and a diagrams:

MG5_aMC> generate g g > e+ e- mu+ mu- QCD=2 QED=4 [noborn=QCD] / u d s c b
INFO: Contributing diagrams generated: 0 Born, 42 loops, 13 R2, 0 UV

Removing all instances of the photon globally gives:
MG5_aMC> generate g g > e+ e- mu+ mu- QCD=2 QED=4 [noborn=QCD] / u d s c b a
INFO: Contributing diagrams generated: 0 Born, 16 loops, 6 R2, 0 UV

Removing all instances of the photon using the following filter gives:
MG5_aMC>generate g g > e+ e- mu+ mu- QCD=2 QED=4 [noborn=QCD] / u d s c b --loop_filter=True
INFO: Contributing diagrams generated: 0 Born, 16 loops, 6 R2, 0 UV

Now, in the file "loop_diagram_generation.py", there is the function "user_filter"

*before* the diag loop, add:

redList=[22]
vetoStrList=[]
# assume diagram will be accepted
valid_diag = True

for tree in structs:
   for vertex in tree.get('vertices'):
            for leg in vertex.get('legs'):
                if leg.get('id') in redList:
                    vetoStrList.append(tree.get('id'))

Note: tree.get('vertices') returns a list within a list, so the elements of this list need to be taken

*inside* the diag loop, add:

            canonList = diag.get('canonical_tag')
            for canon in canonList:
                if canon[1][0] in vetoStrList:
                    valid_diag = False
                    break

Note: canon[1] is a list, not a number, so the 0th element needs to be taken