def setUp(self):

        # create histograms
        h_bkg1_1 = Hist(100, 40, 200, title='Background')
        h_signal_1 = h_bkg1_1.Clone(title='Signal')
        h_data_1 = h_bkg1_1.Clone(title='Data')
        h_bkg1_2 = h_bkg1_1.Clone(title='Background')
        h_signal_2 = h_bkg1_1.Clone(title='Signal')
        h_data_2 = h_bkg1_1.Clone(title='Data')

        # fill the histograms with our distributions
        map(h_bkg1_1.Fill, x1)
        map(h_signal_1.Fill, x2)
        map(h_data_1.Fill, x1_obs)
        map(h_data_1.Fill, x2_obs)

        map(h_bkg1_2.Fill, x3)
        map(h_signal_2.Fill, x4)
        map(h_data_2.Fill, x3_obs)
        map(h_data_2.Fill, x4_obs)

        h_data_1.Scale(data_scale)
        h_data_2.Scale(data_scale)

        histograms_1 = {'signal': h_signal_1, 'bkg1': h_bkg1_1}

        histograms_2 = {'signal': h_signal_2, 'bkg1': h_bkg1_2}

        fit_data_1 = FitData(h_data_1, histograms_1, fit_boundaries=(40, 200))
        fit_data_2 = FitData(h_data_2, histograms_2, fit_boundaries=(40, 200))

        single_fit_collection = FitDataCollection()
        single_fit_collection.add(fit_data_1)

        collection_1 = FitDataCollection()
        collection_1.add(fit_data_1, 'var1')
        collection_1.add(fit_data_2, 'var2')

        collection_2 = FitDataCollection()
        collection_2.add(fit_data_1, 'var1')
        collection_2.add(fit_data_2, 'var2')
        collection_2.set_normalisation_constraints({'bkg1': 0.5})

        collection_3 = FitDataCollection()
        collection_3.add(fit_data_1, 'var1')
        collection_3.add(fit_data_2, 'var2')
        collection_3.set_normalisation_constraints({'bkg1': 0.001})

        self.minuit_fitter = Minuit(single_fit_collection)
        self.minuit_fitter.fit()

        self.simultaneous_fit = Minuit(collection_1)
        self.simultaneous_fit.fit()

        self.simultaneous_fit_with_constraints = Minuit(collection_2)
        self.simultaneous_fit_with_constraints.fit()

        self.simultaneous_fit_with_bad_constraints = Minuit(collection_3)
        self.simultaneous_fit_with_bad_constraints.fit()
    def setUp(self):

        # create histograms
        h_bkg1_1 = Hist(100, 40, 200, title="Background")
        h_signal_1 = h_bkg1_1.Clone(title="Signal")
        h_data_1 = h_bkg1_1.Clone(title="Data")
        h_bkg1_2 = h_bkg1_1.Clone(title="Background")
        h_signal_2 = h_bkg1_1.Clone(title="Signal")
        h_data_2 = h_bkg1_1.Clone(title="Data")

        # fill the histograms with our distributions
        map(h_bkg1_1.Fill, x1)
        map(h_signal_1.Fill, x2)
        map(h_data_1.Fill, x1_obs)
        map(h_data_1.Fill, x2_obs)

        map(h_bkg1_2.Fill, x3)
        map(h_signal_2.Fill, x4)
        map(h_data_2.Fill, x3_obs)
        map(h_data_2.Fill, x4_obs)

        h_data_1.Scale(data_scale)
        h_data_2.Scale(data_scale)

        histograms_1 = {"signal": h_signal_1, "bkg1": h_bkg1_1}

        histograms_2 = {"signal": h_signal_2, "bkg1": h_bkg1_2}

        fit_data_1 = FitData(h_data_1, histograms_1, fit_boundaries=(40, 200))
        fit_data_2 = FitData(h_data_2, histograms_2, fit_boundaries=(40, 200))

        single_fit_collection = FitDataCollection()
        single_fit_collection.add(fit_data_1)

        collection_1 = FitDataCollection()
        collection_1.add(fit_data_1, "var1")
        collection_1.add(fit_data_2, "var2")

        collection_2 = FitDataCollection()
        collection_2.add(fit_data_1, "var1")
        collection_2.add(fit_data_2, "var2")
        collection_2.set_normalisation_constraints({"bkg1": 0.5})

        collection_3 = FitDataCollection()
        collection_3.add(fit_data_1, "var1")
        collection_3.add(fit_data_2, "var2")
        collection_3.set_normalisation_constraints({"bkg1": 0.001})

        self.minuit_fitter = Minuit(single_fit_collection)
        self.minuit_fitter.fit()

        self.simultaneous_fit = Minuit(collection_1)
        self.simultaneous_fit.fit()

        self.simultaneous_fit_with_constraints = Minuit(collection_2)
        self.simultaneous_fit_with_constraints.fit()

        self.simultaneous_fit_with_bad_constraints = Minuit(collection_3)
        self.simultaneous_fit_with_bad_constraints.fit()
class Test(unittest.TestCase):

    def setUp(self):
        # create histograms
        h_bkg1_1 = Hist(100, 40, 200, title='Background')
        h_signal_1 = h_bkg1_1.Clone(title='Signal')
        h_data_1 = h_bkg1_1.Clone(title='Data')
    
        # fill the histograms with our distributions
        map(h_bkg1_1.Fill, x1)
        map(h_signal_1.Fill, x2)
        map(h_data_1.Fill, x1_obs)
        map(h_data_1.Fill, x2_obs)
        
        histograms_1 = {'signal': h_signal_1,
                      'bkg1': h_bkg1_1,
#                       'data': h_data_1
                      }
        fit_data_1 = FitData(h_data_1, histograms_1, fit_boundaries=(40, 200))
        self.single_fit_collection = FitDataCollection()
        self.single_fit_collection.add( fit_data_1 )
        
#         self.roofitFitter = RooFitFit(histograms_1, dataLabel='data', fit_boundries=(40, 200))
        self.roofitFitter = RooFitFit(self.single_fit_collection)

    def tearDown(self):
        pass

    def test_normalisation(self):
        normalisation = self.roofitFitter.normalisation
        self.assertAlmostEqual(normalisation["data"], N_data, delta=sqrt(N_data))
        self.assertAlmostEqual(normalisation["bkg1"], N_bkg1, delta=sqrt(N_bkg1))
        self.assertAlmostEqual(normalisation["signal"], N_signal, delta=sqrt(N_signal))
        
    def test_signal_result(self):
        self.roofitFitter.fit()
        results = self.roofitFitter.readResults()
        self.assertAlmostEqual(N_signal_obs, results['signal'][0], delta=2 * results['signal'][1])
        self.assertAlmostEqual(N_bkg1_obs, results['bkg1'][0], delta=2 * results['bkg1'][1])
        
    def test_constraints(self):
        self.single_fit_collection.set_normalisation_constraints({'signal': 0.8, 'bkg1': 0.5})
        self.roofitFitter = RooFitFit(self.single_fit_collection)
#         self.roofitFitter.set_fit_constraints({'signal': 0.8, 'bkg1': 0.5})
        self.roofitFitter.fit()
        results = self.roofitFitter.readResults()
        self.assertAlmostEqual(N_signal_obs, results['signal'][0], delta=2 * results['signal'][1])
        self.assertAlmostEqual(N_bkg1_obs, results['bkg1'][0], delta=2 * results['bkg1'][1])
class Test( unittest.TestCase ):


    def setUp( self ):

        # create histograms
        h_bkg1_1 = Hist( 100, 40, 200, title = 'Background' )
        h_signal_1 = h_bkg1_1.Clone( title = 'Signal' )
        h_data_1 = h_bkg1_1.Clone( title = 'Data' )
        h_bkg1_2 = h_bkg1_1.Clone( title = 'Background' )
        h_signal_2 = h_bkg1_1.Clone( title = 'Signal' )
        h_data_2 = h_bkg1_1.Clone( title = 'Data' )
    
        # fill the histograms with our distributions
        map( h_bkg1_1.Fill, x1 )
        map( h_signal_1.Fill, x2 )
        map( h_data_1.Fill, x1_obs )
        map( h_data_1.Fill, x2_obs )
        
        map( h_bkg1_2.Fill, x3 )
        map( h_signal_2.Fill, x4 )
        map( h_data_2.Fill, x3_obs )
        map( h_data_2.Fill, x4_obs )
        
        h_data_1.Scale(data_scale)
        h_data_2.Scale(data_scale)
        
        self.histograms_1 = {'signal': h_signal_1,
                             'bkg1': h_bkg1_1}
        
        self.histograms_2 = {'signal': h_signal_2,
                             'bkg1': h_bkg1_2}
        
        self.histograms_3 = {'var1': h_signal_1,
                             'bkg1': h_bkg1_1}
        
        self.fit_data_1 = FitData( h_data_1, self.histograms_1, fit_boundaries = ( x_min, x_max ))
        self.fit_data_2 = FitData( h_data_2, self.histograms_2, fit_boundaries = ( x_min, x_max ))
        self.fit_data_3 = FitData( h_data_1, self.histograms_3, fit_boundaries = ( x_min, x_max ))

        self.collection_1 = FitDataCollection()
        self.collection_1.add( self.fit_data_1, 'signal region' )
        self.collection_1.add( self.fit_data_2, 'control region' )
        self.collection_1.set_normalisation_constraints({'bkg1': 0.5})
        
        self.collection_2 = FitDataCollection()
        self.collection_2.add( self.fit_data_1 )
        self.collection_2.add( self.fit_data_2 )
        self.collection_2.set_normalisation_constraints({'bkg1': 0.5})
        
        self.single_collection = FitDataCollection()
        self.single_collection.add( self.fit_data_1 )
        self.single_collection.set_normalisation_constraints({'bkg1': 0.5})
        
        self.non_simultaneous_fit_collection = FitDataCollection()
        self.non_simultaneous_fit_collection.add( self.fit_data_1 )
        self.non_simultaneous_fit_collection.add( self.fit_data_3 )
        
        self.h_data = h_data_1
        self.h_bkg1 = h_bkg1_1
        self.h_signal = h_signal_1
        
    def tearDown( self ):
        pass

    def test_is_valid_for_simultaneous_fit( self ):
        self.assertTrue( self.collection_1.is_valid_for_simultaneous_fit(), msg = 'has_same_n_samples: ' + str(self.collection_1.has_same_n_samples) + ', has_same_n_data: ' + str(self.collection_1.has_same_n_data) )
        self.assertTrue( self.collection_2.is_valid_for_simultaneous_fit(), msg = 'has_same_n_samples: ' + str(self.collection_1.has_same_n_samples) + ', has_same_n_data: ' + str(self.collection_1.has_same_n_data)  )
        self.assertFalse( self.non_simultaneous_fit_collection.is_valid_for_simultaneous_fit() )
        
    def test_samples( self ):
        samples = sorted( self.histograms_1.keys() )
        samples_from_fit_data = sorted( self.fit_data_1.samples )
        samples_from_fit_data_collection = self.collection_1.mc_samples()
        self.assertEqual( samples, samples_from_fit_data )
        self.assertEqual( samples, samples_from_fit_data_collection )
        
    def test_normalisation( self ):
        normalisation = {name:adjust_overflow_to_limit(histogram, x_min, x_max).Integral() for name, histogram in self.histograms_1.iteritems()}
        normalisation_from_fit_data = self.fit_data_1.normalisation
        normalisation_from_single_collection = self.single_collection.mc_normalisation()
        normalisation_from_collection = self.collection_1.mc_normalisation( 'signal region' )
        normalisation_from_collection_1 = self.collection_1.mc_normalisation()['signal region']
        for sample in normalisation.keys():
            self.assertEqual( normalisation[sample], normalisation_from_fit_data[sample] )
            self.assertEqual( normalisation[sample], normalisation_from_single_collection[sample] )
            self.assertEqual( normalisation[sample], normalisation_from_collection[sample] )
            self.assertEqual( normalisation[sample], normalisation_from_collection_1[sample] )
        
        # data normalisation
        normalisation = self.h_data.integral( overflow = True )
        normalisation_from_fit_data = self.fit_data_1.n_data()
        normalisation_from_single_collection = self.single_collection.n_data()
        normalisation_from_collection = self.collection_1.n_data( 'signal region' )
        normalisation_from_collection_1 = self.collection_1.n_data()['signal region']
        self.assertEqual( normalisation, normalisation_from_fit_data )
        self.assertEqual( normalisation, normalisation_from_single_collection )
        self.assertEqual( normalisation, normalisation_from_collection )
        self.assertEqual( normalisation, normalisation_from_collection_1 )
        
        self.assertAlmostEqual(normalisation, self.collection_1.max_n_data(), delta = 1 )
        
    def test_real_data( self ):
        real_data = self.fit_data_1.real_data_histogram()
        self.assertEqual( self.h_data.integral( overflow = True ), real_data.Integral() )
        
    def test_overwrite_warning( self ):
        c = FitDataCollection()
        c.add( self.fit_data_1, 'var1' )
        self.assertRaises( UserWarning, c.add, ( self.fit_data_1, 'var1' ) )
        
    def test_vectors( self ):
        h_signal = adjust_overflow_to_limit( self.h_signal, x_min, x_max )
        h_signal.Scale(1/h_signal.Integral())
        h_bkg1 = adjust_overflow_to_limit( self.h_bkg1, x_min, x_max )
        h_bkg1.Scale(1/h_bkg1.Integral())
        signal = list( h_signal.y() )
        bkg1 = list( h_bkg1.y() )
        
        v_from_fit_data = self.fit_data_1.vectors
        v_from_single_collection = self.single_collection.vectors()
#         v_from_collection = self.collection_1.vectors( 'signal region' )
#         v_from_collection_1 = self.collection_1.vectors()['signal region']
        self.assertEqual(signal, v_from_fit_data['signal'])
        self.assertEqual(bkg1, v_from_fit_data['bkg1'])
        
        self.assertEqual(signal, v_from_single_collection['signal'])
        self.assertEqual(bkg1, v_from_single_collection['bkg1'])
    
    def test_constraints(self):
        constraint_from_single_collection = self.single_collection.constraints()['bkg1']
        self.assertEqual(0.5, constraint_from_single_collection)
class Test(unittest.TestCase):
    def setUp(self):
        # create histograms
        h_bkg1_1 = Hist(100, 40, 200, title='Background')
        h_signal_1 = h_bkg1_1.Clone(title='Signal')
        h_data_1 = h_bkg1_1.Clone(title='Data')

        # fill the histograms with our distributions
        map(h_bkg1_1.Fill, x1)
        map(h_signal_1.Fill, x2)
        map(h_data_1.Fill, x1_obs)
        map(h_data_1.Fill, x2_obs)

        histograms_1 = {
            'signal': h_signal_1,
            'bkg1': h_bkg1_1,
            #                       'data': h_data_1
        }
        fit_data_1 = FitData(h_data_1, histograms_1, fit_boundaries=(40, 200))
        self.single_fit_collection = FitDataCollection()
        self.single_fit_collection.add(fit_data_1)

        #         self.roofitFitter = RooFitFit(histograms_1, dataLabel='data', fit_boundries=(40, 200))
        self.roofitFitter = RooFitFit(self.single_fit_collection)

    def tearDown(self):
        pass

    def test_normalisation(self):
        normalisation = self.roofitFitter.normalisation
        self.assertAlmostEqual(normalisation["data"],
                               N_data,
                               delta=sqrt(N_data))
        self.assertAlmostEqual(normalisation["bkg1"],
                               N_bkg1,
                               delta=sqrt(N_bkg1))
        self.assertAlmostEqual(normalisation["signal"],
                               N_signal,
                               delta=sqrt(N_signal))

    def test_signal_result(self):
        self.roofitFitter.fit()
        results = self.roofitFitter.readResults()
        self.assertAlmostEqual(N_signal_obs,
                               results['signal'][0],
                               delta=2 * results['signal'][1])
        self.assertAlmostEqual(N_bkg1_obs,
                               results['bkg1'][0],
                               delta=2 * results['bkg1'][1])

    def test_constraints(self):
        self.single_fit_collection.set_normalisation_constraints({
            'signal': 0.8,
            'bkg1': 0.5
        })
        self.roofitFitter = RooFitFit(self.single_fit_collection)
        #         self.roofitFitter.set_fit_constraints({'signal': 0.8, 'bkg1': 0.5})
        self.roofitFitter.fit()
        results = self.roofitFitter.readResults()
        self.assertAlmostEqual(N_signal_obs,
                               results['signal'][0],
                               delta=2 * results['signal'][1])
        self.assertAlmostEqual(N_bkg1_obs,
                               results['bkg1'][0],
                               delta=2 * results['bkg1'][1])
Exemplo n.º 6
0
class Test(unittest.TestCase):
    def setUp(self):

        # create histograms
        h_bkg1_1 = Hist(100, 40, 200, title='Background')
        h_signal_1 = h_bkg1_1.Clone(title='Signal')
        h_data_1 = h_bkg1_1.Clone(title='Data')
        h_bkg1_2 = h_bkg1_1.Clone(title='Background')
        h_signal_2 = h_bkg1_1.Clone(title='Signal')
        h_data_2 = h_bkg1_1.Clone(title='Data')

        # fill the histograms with our distributions
        map(h_bkg1_1.Fill, x1)
        map(h_signal_1.Fill, x2)
        map(h_data_1.Fill, x1_obs)
        map(h_data_1.Fill, x2_obs)

        map(h_bkg1_2.Fill, x3)
        map(h_signal_2.Fill, x4)
        map(h_data_2.Fill, x3_obs)
        map(h_data_2.Fill, x4_obs)

        h_data_1.Scale(data_scale)
        h_data_2.Scale(data_scale)

        self.histograms_1 = {'signal': h_signal_1, 'bkg1': h_bkg1_1}

        self.histograms_2 = {'signal': h_signal_2, 'bkg1': h_bkg1_2}

        self.histograms_3 = {'var1': h_signal_1, 'bkg1': h_bkg1_1}

        self.fit_data_1 = FitData(h_data_1,
                                  self.histograms_1,
                                  fit_boundaries=(x_min, x_max))
        self.fit_data_2 = FitData(h_data_2,
                                  self.histograms_2,
                                  fit_boundaries=(x_min, x_max))
        self.fit_data_3 = FitData(h_data_1,
                                  self.histograms_3,
                                  fit_boundaries=(x_min, x_max))

        self.collection_1 = FitDataCollection()
        self.collection_1.add(self.fit_data_1, 'signal region')
        self.collection_1.add(self.fit_data_2, 'control region')
        self.collection_1.set_normalisation_constraints({'bkg1': 0.5})

        self.collection_2 = FitDataCollection()
        self.collection_2.add(self.fit_data_1)
        self.collection_2.add(self.fit_data_2)
        self.collection_2.set_normalisation_constraints({'bkg1': 0.5})

        self.single_collection = FitDataCollection()
        self.single_collection.add(self.fit_data_1)
        self.single_collection.set_normalisation_constraints({'bkg1': 0.5})

        self.non_simultaneous_fit_collection = FitDataCollection()
        self.non_simultaneous_fit_collection.add(self.fit_data_1)
        self.non_simultaneous_fit_collection.add(self.fit_data_3)

        self.h_data = h_data_1
        self.h_bkg1 = h_bkg1_1
        self.h_signal = h_signal_1

    def tearDown(self):
        pass

    def test_is_valid_for_simultaneous_fit(self):
        self.assertTrue(self.collection_1.is_valid_for_simultaneous_fit(),
                        msg='has_same_n_samples: ' +
                        str(self.collection_1.has_same_n_samples) +
                        ', has_same_n_data: ' +
                        str(self.collection_1.has_same_n_data))
        self.assertTrue(self.collection_2.is_valid_for_simultaneous_fit(),
                        msg='has_same_n_samples: ' +
                        str(self.collection_1.has_same_n_samples) +
                        ', has_same_n_data: ' +
                        str(self.collection_1.has_same_n_data))
        self.assertFalse(self.non_simultaneous_fit_collection.
                         is_valid_for_simultaneous_fit())

    def test_samples(self):
        samples = sorted(self.histograms_1.keys())
        samples_from_fit_data = sorted(self.fit_data_1.samples)
        samples_from_fit_data_collection = self.collection_1.mc_samples()
        self.assertEqual(samples, samples_from_fit_data)
        self.assertEqual(samples, samples_from_fit_data_collection)

    def test_normalisation(self):
        normalisation = {
            name: adjust_overflow_to_limit(histogram, x_min, x_max).Integral()
            for name, histogram in self.histograms_1.iteritems()
        }
        normalisation_from_fit_data = self.fit_data_1.normalisation
        normalisation_from_single_collection = self.single_collection.mc_normalisation(
        )
        normalisation_from_collection = self.collection_1.mc_normalisation(
            'signal region')
        normalisation_from_collection_1 = self.collection_1.mc_normalisation(
        )['signal region']
        for sample in normalisation.keys():
            self.assertEqual(normalisation[sample],
                             normalisation_from_fit_data[sample])
            self.assertEqual(normalisation[sample],
                             normalisation_from_single_collection[sample])
            self.assertEqual(normalisation[sample],
                             normalisation_from_collection[sample])
            self.assertEqual(normalisation[sample],
                             normalisation_from_collection_1[sample])

        # data normalisation
        normalisation = self.h_data.integral(overflow=True)
        normalisation_from_fit_data = self.fit_data_1.n_data()
        normalisation_from_single_collection = self.single_collection.n_data()
        normalisation_from_collection = self.collection_1.n_data(
            'signal region')
        normalisation_from_collection_1 = self.collection_1.n_data(
        )['signal region']
        self.assertEqual(normalisation, normalisation_from_fit_data)
        self.assertEqual(normalisation, normalisation_from_single_collection)
        self.assertEqual(normalisation, normalisation_from_collection)
        self.assertEqual(normalisation, normalisation_from_collection_1)

        self.assertAlmostEqual(normalisation,
                               self.collection_1.max_n_data(),
                               delta=1)

    def test_real_data(self):
        real_data = self.fit_data_1.real_data_histogram()
        self.assertEqual(self.h_data.integral(overflow=True),
                         real_data.Integral())

    def test_overwrite_warning(self):
        c = FitDataCollection()
        c.add(self.fit_data_1, 'var1')
        self.assertRaises(UserWarning, c.add, (self.fit_data_1, 'var1'))

    def test_vectors(self):
        h_signal = adjust_overflow_to_limit(self.h_signal, x_min, x_max)
        h_signal.Scale(1 / h_signal.Integral())
        h_bkg1 = adjust_overflow_to_limit(self.h_bkg1, x_min, x_max)
        h_bkg1.Scale(1 / h_bkg1.Integral())
        signal = list(h_signal.y())
        bkg1 = list(h_bkg1.y())

        v_from_fit_data = self.fit_data_1.vectors
        v_from_single_collection = self.single_collection.vectors()
        #         v_from_collection = self.collection_1.vectors( 'signal region' )
        #         v_from_collection_1 = self.collection_1.vectors()['signal region']
        self.assertEqual(signal, v_from_fit_data['signal'])
        self.assertEqual(bkg1, v_from_fit_data['bkg1'])

        self.assertEqual(signal, v_from_single_collection['signal'])
        self.assertEqual(bkg1, v_from_single_collection['bkg1'])

    def test_constraints(self):
        constraint_from_single_collection = self.single_collection.constraints(
        )['bkg1']
        self.assertEqual(0.5, constraint_from_single_collection)