code: def testImpulseTrain140Multifeature(self):
      impulseTrain140 = self._createPulseTrain140()
      (
          bpm,
          ticks,
          confidence,
          estimates,
          bpmIntervals,
      ) = self._runInstance(impulseTrain140, method="multifeature")
  
      expectedBpm = 140
      expectedTicks = [
          i / 44100.0
          for i in range(len(impulseTrain140))
          if impulseTrain140[i] != 0
      ]
  
      # In this tests a 200 ms tolerance for ticks is a good enough compromise
      # Hence the value 0.2 for BPM tolerance.
      # In other algos (e.g. tempotapmaxagreement) the max. confidence values is 5.32
      # Ballpark figure of 3.8 were observed in tests here.
      # This is approx. 70% of max conf. value in tempotapmaxagreement
      # On top of this we allow a margin of approx 20%
      # Hence, the tolerance for expectedConfidence is  1.0.
  
      expectedConfidence = 3.8
      self.assertAlmostEqual(bpm, expectedBpm, 0.2)
      self._assertVectorWithinVector(ticks, expectedTicks, 0.2)
      self.assertAlmostEqual(confidence, expectedConfidence, 1.0)
  
      for i in range(len(estimates)):
          self.assertAlmostEqual(estimates[i], expectedBpm, 0.5)
  
      for i in range(len(bpmIntervals)):
          self.assertAlmostEqual(
              bpmIntervals[i], 60.0 / expectedBpm, 0.2
          )
  
imports: from essentia_test import *
  from essentia.standard import MonoLoader, RhythmExtractor2013
  from math import fabs
  from math import floor
label_desc: Use image node_id 13 for calling the TestRhythmExtractor2013 obj's underlying member method code with example usage: obj.testImpulseTrain140Multifeature() without return types