docs: def afterglow(self, src=None, event=None, dst=None, **kargs):
          """Experimental clone attempt of http://sourceforge.net/projects/afterglow
          each datum is reduced as src -> event -> dst and the data are graphed.
          by default we have IP.src -> IP.dport -> IP.dst"""
          if src is None:
              src = lambda x: x['IP'].src
          if event is None:
              event = lambda x: x['IP'].dport
          if dst is None:
              dst = lambda x: x['IP'].dst
          sl = {}
          el = {}
          dl = {}
          for i in self.res:
              try:
                  s, e, d = src(i), event(i), dst(i)
                  if s in sl:
                      n, lst = sl[s]
                      n += 1
                      if e not in lst:
                          lst.append(e)
                      sl[s] = (n, lst)
                  else:
                      sl[s] = (1, [e])
                  if e in el:
                      n, lst = el[e]
                      n += 1
                      if d not in lst:
                          lst.append(d)
                      el[e] = (n, lst)
                  else:
                      el[e] = (1, [d])
                  dl[d] = dl.get(d, 0) + 1
              except Exception:
                  continue
  
          import math
  
          def normalize(n):
              return 2 + math.log(n) / 4.0
  
          def minmax(x):
              m, M = reduce(lambda a, b: (min(a[0], b[0]), max(a[1], b[1])),
                            ((a, a) for a in x))
              if m == M:
                  m = 0
              if M == 0:
                  M = 1
              return m, M
  
          mins, maxs = minmax(x for x, _ in six.itervalues(sl))
          mine, maxe = minmax(x for x, _ in six.itervalues(el))
          mind, maxd = minmax(six.itervalues(dl))
  
          gr = 'digraph "afterglow" {\n\tedge [len=2.5];\n'
  
          gr += "# src nodes\n"
          for s in sl:
              n, _ = sl[s]
              n = 1 + float(n - mins) / (maxs - mins)
              gr += '"src.%s" [label = "%s", shape=box, fillcolor="#FF0000", style=filled, fixedsize=1, height=%.2f,width=%.2f];\n' % (repr(s), repr(s), n, n)  # noqa: E501
          gr += "# event nodes\n"
          for e in el:
              n, _ = el[e]
              n = n = 1 + float(n - mine) / (maxe - mine)
              gr += '"evt.%s" [label = "%s", shape=circle, fillcolor="#00FFFF", style=filled, fixedsize=1, height=%.2f, width=%.2f];\n' % (repr(e), repr(e), n, n)  # noqa: E501
          for d in dl:
              n = dl[d]
              n = n = 1 + float(n - mind) / (maxd - mind)
              gr += '"dst.%s" [label = "%s", shape=triangle, fillcolor="#0000ff", style=filled, fixedsize=1, height=%.2f, width=%.2f];\n' % (repr(d), repr(d), n, n)  # noqa: E501
  
          gr += "###\n"
          for s in sl:
              n, lst = sl[s]
              for e in lst:
                  gr += ' "src.%s" -> "evt.%s";\n' % (repr(s), repr(e))
          for e in el:
              n, lst = el[e]
              for d in lst:
                  gr += ' "evt.%s" -> "dst.%s";\n' % (repr(e), repr(d))
  
          gr += "}"
          return do_graph(gr, **kargs)