int main(int argc, char* argv[])
{

  //preparing objects for the HHTauTauEventGenerator

  TF1 *PDF1 = new TF1("PDF1","2*x",0,1);
  //TF1 *PDF1 = new TF1("PDF1","sqrt(x)",0,2);
  PDF1->SetNpx(100000);
  TF1 *PDF2= new TF1("PDF2","2-2*x",0,1);
  //TF1 *PDF2=new TF1("PDF2","1-sqrt(1-x)",0,2);
  PDF2->SetNpx(100000);
  TMatrixD covarmatrix(2,2);
  covarmatrix[0][0]=130;
  covarmatrix[0][1]=0;
  covarmatrix[1][0]=0;
  covarmatrix[1][1]=130;
  HHTauTauEventGenerator testgenerator(PDF1,PDF2,covarmatrix);
  //-------------------------------------------------------------------------
  //-------------------------------------------------------------------------
  // Define Histograms for observing the eventgenerator and the kinfit
  // Histos for the Generator data:
  TH1D h_invariantmass("h_invariantmass","invariant mass of the two tau-vectors in GeV",100,125.5,126);
  TH1D h_EtaTau1("h_EtaTau1","Eta from Tau1",100,-5,5);
  TH1D h_CthTau1("h_CthTau1","Cth from Tau1",100,-1,1);
  TH1D h_PhiTau1("h_PhiTau1","Phi from Tau1",100,-3.2,3.2);
  TH1D h_PtTau1("h_PtTau1","Pt from Tau1",100,0,100);
  TH1D h_ETau1("h_ETau1","Energy from Tau1",100,0,100);
  TH1D h_EtaTau2("h_EtaTau2","Eta from Tau2",100,-5,5);
  TH1D h_CthTau2("h_CthTau2","Cth from Tau2",100,-1,1);
  TH1D h_PhiTau2("h_PhiTau2","Phi from Tau2",100,-3.2,3.2);
  TH1D h_PtTau2("h_PtTau2","Pt from Tau2",100,0,100);
  TH1D h_invmassboosted("h_invmassboosted","invariant mass of the two boosted tau-vectors in GeV",100,125.5,126);
  TH1D h_ETau2("h_ETau2","Energy from Tau2",100,0,100);
  TH1D h_EtaISR("h_EtaISR","Eta from the ISR-jet",100,-6,6);
  TH1D h_CthISR("h_CthISR","Cth from ISR-jet",100,-1,1);
  TH1D h_PhiISR("h_PhiISR","Phi from ISR-jet",100,-3.2,3.2);
  TH1D h_PtISR("h_PtISR","Pt from ISR-jet",100,0,100);
  TH1D h_EtaHiggs("h_EtaHiggs","Eta from the Higgs",100,-5,5);
  TH1D h_CthHiggs("h_CthHiggs","Cth from Higgs",100,-1,1);
  TH1D h_PhiHiggs("h_PhiHiggs","Phi from Higgs",100,-3.2,3.2);
  TH1D h_PtHiggs("h_PtHiggs","Pt from Higgs",100,0,100);
  TH1D h_EtaTau1boosted("h_EtaTau1boosted","Eta from the boosted Tau1",100,-5,5);
  TH1D h_CthTau1boosted("h_CthTau1boosted","Cth from the boosted Tau1",100,-1,1);
  TH1D h_PhiTau1boosted("h_PhiTau1boosted","Phi from the boosted Tau1",100,-3.2,3.2);
  TH1D h_PtTau1boosted("h_PtTau1boosted","Pt from the boosted Tau1",100,0,100);
  TH1D h_ETau1boosted("h_ETau1boosted","Energy from Tau1boosted",100,0,100);
  TH1D h_EtaTau2boosted("h_EtaTau2boosted","Eta from the boosted Tau2",100,-5,5);
  TH1D h_CthTau2boosted("h_CthTau2boosted","Cth from the boosted Tau2",100,-1,1);
  TH1D h_PhiTau2boosted("h_PhiTau2boosted","Phi from the boosted Tau2",100,-3.2,3.2);
  TH1D h_PtTau2boosted("h_PtTau2boosted","Pt from the boosted Tau2",100,0,100);
  TH1D h_ETau2boosted("h_ETau2boosted","Energy from Tau2boosted",100,0,100);
  TH1D h_VisFracTau1("h_VisFracTau1","The Energy fraction from the visible Tau-Component form Tau1",100,0,1);
  TH1D h_VisFracTau2("h_VisFracTau2","The Energy fraction from the visible Tau-Component form Tau2",100,0,1);
  TH1D h_EtaTau1Vis("h_EtaTau1Vis","Eta from the visible component of Tau1",100,-5,5);
  TH1D h_CthTau1Vis("h_CthTau1Vis","Cth from the visible component of Tau1",100,-1,1);
  TH1D h_PhiTau1Vis("h_PhiTau1Vis","Phi from the visible component of Tau1",100,-3.2,3.2);
  TH1D h_PtTau1Vis("h_PtTau1Vis","Pt from the the visible component of Tau1",100,0,100);
  TH1D h_ETau1Vis("h_ETau1Vis","Energy from the the visible component of Tau1",100,0,100);
  TH1D h_EtaTau2Vis("h_EtaTau2Vis","Eta from the visible component of Tau2",100,-5,5);
  TH1D h_CthTau2Vis("h_CthTau2Vis","Cth from the visible component of Tau2",100,-1,1);
  TH1D h_PhiTau2Vis("h_PhiTau2Vis","Phi from the visible component of Tau2",100,-3.2,3.2);
  TH1D h_PtTau2Vis("h_PtTau2Vis","Pt from the the visible component of Tau2",100,0,100);
  TH1D h_ETau2Vis("h_ETau2Vis","Energy from the the visible component of Tau2",100,0,100);
  TH1D h_AbsPtmiss("h_AbsPtmiss","Absolute Value of the missing transverse momentum",100,0,100);
  TH1D h_Pxmiss("h_Pxmiss","Missing momentum in x-direction",200,-100,100);
  TH1D h_Pymiss("h_Pymiss","Missing momentum in y-direction",200,-100,100);
  TH1D h_PhiMET("h_PhiMET","Angle Phi of the missing transversal momentum vector",100,0,6.4);
  TH1D h_AbsPtmisswithsigma("h_AbsPtmisswithsigma","Absolute Value of the missing transverse momentum with measurmental errors",100,0,100);
  TH1D h_PhiMETwithsigma("h_PhiMETwithsigma","Angle Phi of the missing transversal momentum vector with measurmental errors",100,0,6.4);
  TH1D h_Pxmisswithsigma("h_Pxmisswithsigma","Missing momentum in x-direction with measurmental errors ",200,-100,100);
  TH1D h_Pymisswithsigma("h_Pymisswithsigma","Missing momentum in y-direction with measurmental errors",200,-100,100);
  TH1D h_EFracTau1Fit("h_EFracTau1Fit","h_EFracTau1Fit",100,0,1);
  TH1D h_EFracTau2Fit("h_EFracTau2Fit","h_EFracTau2Fit",100,0,1);
  TH1D h_EFracTau1Gen("h_EFracTau1Gen","h_EFracTau1Gen",100,0,1);
  TH1D h_EFracTau2Gen("h_EFracTau2Gen","h_EFracTau2Gen",100,0,1);
  //---------------------------------------------------------------------------------------------------------------
  //Histos for the kinfit:
  TH1D h_FitFinalChi2("h_FitFinalChi2","The Final chi2 from the KinFit",100,-6,6);
  TH1D h_FitFinalChi2prob("h_FitFinalChi2prob","The Final chi2 from the KinFit",20,0,1);
  TH1D h_FitlikelihoodFinalChi2("h_FitFinalChi2likelihood","The Final chi2 from the KinFit",50,-5,20);
  TH1D h_FitlikelihoodFinalChi2prob("h_FitFinalChi2likelihoodprob","The Final probability of the chi2 from the KinFit",20,0,1);
  TH1D h_fracresulutiontau1("h_fracresulutiontau1","resulution of the energyfraction from tau1vis",100,-1,1);
  TH1D h_fracresulutiontau2("h_fracresulutiontau2","resulution of the energyfraction from tau2vis",100,-1,1);
  TH1D h_fracresulutiontau1likelihood("h_fracresulutiontau1likelihood","resulution of the energyfraction from tau1vis in likelihood-fit",100,-1,1);
  TH1D h_fracresulutiontau2likelihood("h_fracresulutiontau2likelihood","resulution of the energyfraction from tau2vis in likelihood-fit",100,-1,1);
  TH1D h_energyresulution1("h_energyresulution1","the energyresulution of tau 1 in the KinFit",100,-1.3,1.3);
  TH1D h_energyresulution1likelihood("h_energyresulution1likelihood","the energyresulution of tau 1 in the Likelihood-KinFit",100,-1.3,1.3);
  TH1D h_energyresulution2("h_energyresulution2","the energyresulution of tau 2 in the KinFit",100,-1.3,1.3);
  TH1D h_energyresulution2likelihood("h_energyresulution2likelihood","the energyresulution of tau 2 in the Likelihood-KinFit",100,-1.3,1.3);
  TH1D h_fracresulutiontau1weighted("h_fracresulutiontau1weighted","weighted resulution of the energyfraction from tau1vis",100,-1,1);
  TH1D h_fracresulutiontau2weighted("h_fracresulutiontau2weighted","weighted resulution of the energyfraction from tau2vis",100,-1,1);
  TH1D h_energyresulution1weighted("h_energyresulutiontau1weighted","the weighted energyresulution of tau 1 in the KinFit",100,-1.3,1.3);
  TH1D h_energyresulution2weighted("h_energyresulutiontau2weighted","the weighted energyresulution of tau 2 in the KinFit",100,-1.3,1.3);
  TH1D h_testingfraclikelihood("h_testingfraclikelihood","visfracs in likelihood-fit",100,0,1.5);
  TH1D h_balanceconstraintwithlikelihood("h_balanceconstraintwithlikelihood","the chi2term for the balanceconstraint",50,-5,20);
  TH1D h_likelihoodconstraint("h_likelihoodconstraint","the chi2term for the likelihoodconstraint",100,-2,2);

  TH2D h_comparemine1("h_comparemine1","blub",100,0,1500,100,0,1500);
  TH2D h_L2D("h_L2D","h_L2D",100,0,0.005,100,0,0.005);





  //------------------------------------------------------------------------------------------------------------------------------------
  //------------------------------------------------------------------------------------------------------------------------------------
  // Generator and KinFit-Loop:
  for(unsigned int i=0; i<1000000; i++){
    try{
      testgenerator.generateEvent();
    }
    catch(const HHEnergyRangeException& e){
      i--;
      continue;
    }


    //Filling the Histograms for the eventgenerator
    h_invariantmass.Fill(testgenerator.getInveriantMass());
    h_EtaTau1.Fill(testgenerator.getTau1().Eta());
    h_CthTau1.Fill(testgenerator.getTau1().CosTheta());
    h_PhiTau1.Fill(testgenerator.getTau1().Phi());
    h_PtTau1.Fill(testgenerator.getTau1().Pt());
    h_ETau1.Fill(testgenerator.getTau1().E());
    h_EtaTau2.Fill(testgenerator.getTau2().Eta());
    h_CthTau2.Fill(testgenerator.getTau2().CosTheta());
    h_PhiTau2.Fill(testgenerator.getTau2().Phi());
    h_PtTau2.Fill(testgenerator.getTau2().Pt());
    h_ETau2.Fill(testgenerator.getTau2().E());
    h_EtaISR.Fill(testgenerator.getISR().Eta());
    h_CthISR.Fill(testgenerator.getISR().CosTheta());
    h_PhiISR.Fill(testgenerator.getISR().Phi());
    h_PtISR.Fill(testgenerator.getISR().Pt());
    h_EtaHiggs.Fill(testgenerator.getHiggs().Eta());
    h_CthHiggs.Fill(testgenerator.getHiggs().CosTheta());
    h_PhiHiggs.Fill(testgenerator.getHiggs().Phi());
    h_PtHiggs.Fill(testgenerator.getHiggs().Pt());
    h_EtaTau1boosted.Fill(testgenerator.getTau1boosted().Eta());
    h_CthTau1boosted.Fill(testgenerator.getTau1boosted().CosTheta());
    h_PhiTau1boosted.Fill(testgenerator.getTau1boosted().Phi());
    h_PtTau1boosted.Fill(testgenerator.getTau1boosted().Pt());
    h_ETau1boosted.Fill(testgenerator.getTau1boosted().E());
    h_EtaTau2boosted.Fill(testgenerator.getTau2boosted().Eta());
    h_CthTau2boosted.Fill(testgenerator.getTau2boosted().CosTheta());
    h_PhiTau2boosted.Fill(testgenerator.getTau2boosted().Phi());
    h_PtTau2boosted.Fill(testgenerator.getTau2boosted().Pt());
    h_ETau2boosted.Fill(testgenerator.getTau2boosted().E());
    h_VisFracTau1.Fill(testgenerator.getvisfrac1());
    h_VisFracTau2.Fill(testgenerator.getvisfrac2());
    h_EtaTau1Vis.Fill(testgenerator.getTau1Vis().Eta());
    h_CthTau1Vis.Fill(testgenerator.getTau1Vis().CosTheta());
    h_PhiTau1Vis.Fill(testgenerator.getTau1Vis().Phi());
    h_PtTau1Vis.Fill(testgenerator.getTau1Vis().Pt());
    h_ETau1Vis.Fill(testgenerator.getTau1Vis().E());
    h_EtaTau2Vis.Fill(testgenerator.getTau2Vis().Eta());
    h_CthTau2Vis.Fill(testgenerator.getTau2Vis().CosTheta());
    h_PhiTau2Vis.Fill(testgenerator.getTau2Vis().Phi());
    h_PtTau2Vis.Fill(testgenerator.getTau2Vis().Pt());
    h_ETau2Vis.Fill(testgenerator.getTau2Vis().E());
    h_AbsPtmiss.Fill(testgenerator.getAbsPtMET());
    h_Pxmiss.Fill(testgenerator.getMET()[0]);
    h_Pymiss.Fill(testgenerator.getMET()[1]);
    h_PhiMET.Fill(testgenerator.getPhiMET());
    h_AbsPtmisswithsigma.Fill(testgenerator.getAbsPtMETwithsigma());
    h_Pxmisswithsigma.Fill(testgenerator.getMETwithsigma()[0]);
    h_Pymisswithsigma.Fill(testgenerator.getMETwithsigma()[1]);
    h_PhiMETwithsigma.Fill(testgenerator.getPhiMETwithsigma());
    HHLorentzVector boostedsum= (testgenerator.getTau1boosted()+testgenerator.getTau2boosted());
    h_invmassboosted.Fill(boostedsum.M());


 //-----------------------------------------------------------------------------------------------------------------------------------
 //normal KinFit:
    
    //double mass = testgenerator.getMhiggs();
    double mass = 91;

    //prepare tau objects
    HHFitObjectE* tau1 = new HHFitObjectEConstM(testgenerator.getTau1Vis());//  visible Tau1-component from HHTauTauEventGenerator
    HHFitObjectE* tau2 = new HHFitObjectEConstM(testgenerator.getTau2Vis());//  visible Tau2-component from HHTauTauEventGenerator

    //prepare MET object
    HHFitObjectMET* met = new HHFitObjectMET(TVector2(testgenerator.getMETwithsigma()[0],testgenerator.getMETwithsigma()[1]));//Use Met components from HHTauTauEventGenerator
    met->setCovMatrix(testgenerator.getCovarmatrix()[0][0],testgenerator.getCovarmatrix()[1][1],testgenerator.getCovarmatrix()[1][0]); // set Covarmatrix with Matrix inserted in HHTauTauEventGenerator

    //prepare composite object: Higgs
    HHFitObject* higgs  = new HHFitObjectComposite(tau1, tau2, met);

   tau1->setLowerFitLimitE(tau1->getInitial4Vector());
   tau1->setUpperFitLimitE(mass,tau2->getInitial4Vector());
   tau2->setLowerFitLimitE(tau2->getInitial4Vector());
   tau2->setUpperFitLimitE(mass,tau1->getInitial4Vector());

    //prepare constraints
    HHFitConstraint* invm = new HHFitConstraintEHardM(tau1, tau2, mass);
    HHFitConstraint* balance = new HHFitConstraint4Vector(higgs, true, true, false, false);
    
    //fit
    HHKinFit* singlefit = new HHKinFit();
    singlefit->addFitObjectE(tau1);
    singlefit->addConstraint(invm);
    singlefit->addConstraint(balance);

    try {
    singlefit->fit();
    if (!((singlefit->getConvergence()==1)||(singlefit->getConvergence()==2))) continue;
    }
    catch(HHEnergyRangeException const& e){
    	std::cout << i << std::endl;
    	tau1->print();
    	tau2->print();
    	met->print();
    	higgs->print();
    	std::cout << e.what() << std::endl;
    	std::cout << testgenerator.m_seed << std::endl;
    	//throw(e);
    	std::cout << "-----------------------------------------------" << std::endl;
    	//continue;
    }

    //filling Fit-Histos
    h_FitFinalChi2.Fill(singlefit->getChi2());
    h_FitFinalChi2prob.Fill(TMath::Prob(singlefit->getChi2(),1));
	double  fitfractau1=tau1->getInitial4Vector().E()/tau1->getFit4Vector().E();
    double genfractau1=testgenerator.getvisfrac1();
    double comparefrac1=(genfractau1-fitfractau1)/genfractau1;
    h_fracresulutiontau1.Fill(comparefrac1);
    double  fitfractau2=tau2->getInitial4Vector().E()/tau2->getFit4Vector().E();
    double genfractau2=testgenerator.getvisfrac2();
    double comparefrac2=(genfractau2-fitfractau2)/genfractau2;
    h_fracresulutiontau2.Fill(comparefrac2);
    h_energyresulution1.Fill((testgenerator.getTau1boosted().E()-tau1->getFit4Vector().E())/testgenerator.getTau1boosted().E());
    h_energyresulution2.Fill((testgenerator.getTau2boosted().E()-tau2->getFit4Vector().E())/testgenerator.getTau2boosted().E());
    h_fracresulutiontau1weighted.Fill(comparefrac1,TMath::Prob(singlefit->getChi2(),1));
    h_fracresulutiontau2weighted.Fill(comparefrac2,TMath::Prob(singlefit->getChi2(),1));
    h_energyresulution1weighted.Fill((testgenerator.getTau1boosted().E()-tau1->getFit4Vector().E())/testgenerator.getTau1boosted().E(),TMath::Prob(singlefit->getChi2(),1));
    h_energyresulution2weighted.Fill((testgenerator.getTau2boosted().E()-tau2->getFit4Vector().E())/testgenerator.getTau2boosted().E(),TMath::Prob(singlefit->getChi2(),1));
    h_EFracTau1Fit.Fill(tau1->getInitial4Vector().E()/tau1->getFit4Vector().E());
    h_EFracTau2Fit.Fill(tau2->getInitial4Vector().E()/tau2->getFit4Vector().E());
    h_EFracTau1Gen.Fill(testgenerator.getTau1Vis().E()/testgenerator.getTau1boosted().E());
    h_EFracTau2Gen.Fill(testgenerator.getTau2Vis().E()/testgenerator.getTau2boosted().E());

    if(tau2->getInitial4Vector().E()/tau2->getFit4Vector().E()==1)
    {
    TCanvas *chi2canvas=new TCanvas("chi2canvas","chi2canvas",1000,1000);
    TGraph* g = singlefit->getChi2Function(100);
    g->Draw("APL");
    chi2canvas->Print("chi2.pdf");
    chi2canvas->Close();
    singlefit->getChi2();
    break;
    };

    //---------------------------------------------------------------------------------------------------------------------
	//#######################testing#likelihood########################################

    //prepare tau objects
       HHFitObjectE* tau1likelihood = new HHFitObjectEConstM(testgenerator.getTau1Vis());//  visible Tau1-component from HHTauTauEventGenerator
       HHFitObjectE* tau2likelihood = new HHFitObjectEConstM(testgenerator.getTau2Vis());//  visible Tau2-component from HHTauTauEventGenerator

       //prepare MET object
       HHFitObjectMET* metlikelihood = new HHFitObjectMET(TVector2(testgenerator.getMETwithsigma()[0],testgenerator.getMETwithsigma()[1]));//Use Met components from HHTauTauEventGenerator
       //met->setCovMatrix(100,-100,50);// set Covarmatrix with Matrix in HHTauTauEventGenerator
       metlikelihood->setCovMatrix(testgenerator.getCovarmatrix()[0][0],testgenerator.getCovarmatrix()[1][1],testgenerator.getCovarmatrix()[1][0]); // set Covarmatrix with Matrix inserted in HHTauTauEventGenerator

       //prepare composite object: Higgs
       HHFitObject* higgslikelihood  = new HHFitObjectComposite(tau1likelihood, tau2likelihood, metlikelihood);

       tau1likelihood->setLowerFitLimitE(tau1likelihood->getInitial4Vector());
       tau1likelihood->setUpperFitLimitE(mass,tau2likelihood->getInitial4Vector());
       tau2likelihood->setLowerFitLimitE(tau2likelihood->getInitial4Vector());
       tau2likelihood->setUpperFitLimitE(mass,tau1likelihood->getInitial4Vector());


       //prepare constraints
       HHFitConstraint* invmlikelihood = new HHFitConstraintEHardM(tau1likelihood, tau2likelihood, mass);
       HHFitConstraint* balancelikelihood = new HHFitConstraint4Vector(higgslikelihood, true, true, false, false);
       //HHFitConstraint* Likelihood = new HHFitConstraintLikelihood(tau1likelihood,tau2likelihood,PDF1,PDF2);
       HHFitConstraint* Likelihood = new HHFitConstraintLikelihood(tau1likelihood,tau2likelihood,PDF1,PDF1);


    //fit with likelihood
    HHKinFit* singlefitliekelihood = new HHKinFit();
    singlefitliekelihood->addFitObjectE(tau1likelihood);
    singlefitliekelihood->addConstraint(invmlikelihood);
    singlefitliekelihood->addConstraint(balancelikelihood);
    singlefitliekelihood->addConstraint(Likelihood);
    try {
    	singlefitliekelihood->fit();
    	 if (!((singlefitliekelihood->getConvergence()==1)||(singlefitliekelihood->getConvergence()==2))) continue;
        }
        catch(HHEnergyRangeException const& e){
        	std::cout << i << std::endl;
        	tau1->print();
        	tau2->print();
        	met->print();
        	higgs->print();
        	std::cout << e.what() << std::endl;
        	std::cout << testgenerator.m_seed << std::endl;
        	throw(e);
        	std::cout << "-----------------------------------------------" << std::endl;
        	continue;
        }
    h_FitlikelihoodFinalChi2.Fill(singlefitliekelihood->getChi2());
    h_FitlikelihoodFinalChi2prob.Fill(TMath::Prob(singlefitliekelihood->getChi2(),1));
    h_balanceconstraintwithlikelihood.Fill(balancelikelihood->getChi2());
	h_likelihoodconstraint.Fill(Likelihood->getChi2());


    double  fitfractau1likelihood=tau1likelihood->getInitial4Vector().E()/tau1likelihood->getFit4Vector().E();
        double genfractau1likelihood=testgenerator.getvisfrac1();
        double comparefrac1likelihood=(genfractau1likelihood-fitfractau1likelihood)/genfractau1likelihood;
        h_fracresulutiontau1likelihood.Fill(comparefrac1likelihood);
        double  fitfractau2likelihood=tau2likelihood->getInitial4Vector().E()/tau2likelihood->getFit4Vector().E();
               double genfractau2likelihood=testgenerator.getvisfrac2();
               double comparefrac2likelihood=(genfractau2likelihood-fitfractau2likelihood)/genfractau2likelihood;
               h_fracresulutiontau2likelihood.Fill(comparefrac2likelihood);
        h_testingfraclikelihood.Fill(fitfractau1likelihood);
        h_energyresulution1likelihood.Fill((testgenerator.getTau1boosted().E()-tau1likelihood->getFit4Vector().E())/testgenerator.getTau1boosted().E());
        h_energyresulution2likelihood.Fill((testgenerator.getTau2boosted().E()-tau2likelihood->getFit4Vector().E())/testgenerator.getTau2boosted().E());


        h_comparemine1.Fill(tau1->getE(),tau1likelihood->getE());
        h_L2D.Fill(singlefit->getL(),singlefitliekelihood->getL());



  }

  //------------------------------------------------------------------------------------------------------------------------------------
  //writing the Histos into a pdf-file
  TFile controlplots("controlplots.root","RECREATE");
  
  h_L2D.Write();
  h_comparemine1.Write();
  h_invariantmass.Write();
    h_EtaTau1.Write();
    h_CthTau1.Write();
    h_PhiTau1.Write();
    h_PtTau1.Write();
    h_ETau1.Write();
    h_EtaTau2.Write();
    h_CthTau2.Write();
    h_PhiTau2.Write();
    h_PtTau2.Write();
    h_ETau2.Write();
    h_EtaISR.Write();
    h_CthISR.Write();
    h_PhiISR.Write();
    h_PtISR.Write();
    h_EtaHiggs.Write();
    h_CthHiggs.Write();
    h_PhiHiggs.Write();
    h_PtHiggs.Write();
    h_EtaTau1boosted.Write();
    h_CthTau1boosted.Write();
    h_PhiTau1boosted.Write();
    h_PtTau1boosted.Write();
    h_ETau1boosted.Write();
    h_EtaTau2boosted.Write();
    h_CthTau2boosted.Write();
    h_PhiTau2boosted.Write();
    h_PtTau2boosted.Write();
    h_ETau2boosted.Write();
    h_invmassboosted.Write();
    h_VisFracTau1.Write();
    h_VisFracTau2.Write();
    h_EFracTau1Fit.Write();
    h_EFracTau2Fit.Write();
    h_EFracTau1Gen.Write();
    h_EFracTau2Gen.Write();
    h_EtaTau1Vis.Write();
    h_CthTau1Vis.Write();
    h_PhiTau1Vis.Write();
    h_PtTau1Vis.Write();
    h_ETau1Vis.Write();
    h_EtaTau2Vis.Write();
    h_CthTau2Vis.Write();
    h_PhiTau2Vis.Write();
    h_PtTau2Vis.Write();
    h_ETau2Vis.Write();
    h_AbsPtmiss.Write();
    h_Pxmiss.Write();
    h_Pymiss.Write();
    h_PhiMET.Write();
    h_AbsPtmisswithsigma.Write();
    h_Pxmisswithsigma.Write();
    h_Pymisswithsigma.Write();
    h_PhiMETwithsigma.Write();
    h_FitFinalChi2.Write();
    h_FitFinalChi2prob.Write();
    h_fracresulutiontau1.Write();
    h_fracresulutiontau1weighted.Write();
    h_fracresulutiontau2.Write();
    h_fracresulutiontau2weighted.Write();
    h_energyresulution1.Write();
    h_energyresulution1weighted.Write();
    h_energyresulution2.Write();
    h_energyresulution2weighted.Write();
    h_FitlikelihoodFinalChi2.Write();
    h_FitlikelihoodFinalChi2prob.Write();
    h_fracresulutiontau1likelihood.Write();
    h_fracresulutiontau2likelihood.Write();
    h_energyresulution1likelihood.Write();
    h_energyresulution2likelihood.Write();
    h_testingfraclikelihood.Write();
    h_balanceconstraintwithlikelihood.Write();
    h_likelihoodconstraint.Write();


  controlplots.Close();



  //---------------------------------------------------------------------------------------------------------------------------------
  return(0);
}
示例#2
0
int main(int argc, char* argv[])
{
  double mh1 = 111.0;
  double mh2 = 222.0;

  //prepare tau objects
  HHFitObjectE* tau1 = new HHFitObjectEConstM(HHLorentzVector(71,0,0,80));
  HHFitObjectE* tau2 = new HHFitObjectEConstM(HHLorentzVector(0,58,0,60));
  tau1->setFitLimitsE(tau1->getInitial4Vector(),mh1,tau2->getInitial4Vector());
  tau2->setFitLimitsE(tau2->getInitial4Vector(),mh1,tau1->getInitial4Vector());

  //prepare bjet objects
  HHFitObjectE* b1 = new HHFitObjectEConstBeta(HHLorentzVector(71,0,0,80));
  HHFitObjectE* b2 = new HHFitObjectEConstBeta(HHLorentzVector(0,58,0,60));
  b1->setFitLimitsE(0,400);
  b2->setFitLimitsE(0,400);
  b1->setCovMatrix(100);
  b2->setCovMatrix(100);

  //prepare MET object
  HHFitObjectMET* met = new HHFitObjectMET(TVector2(10,20));
  met->setCovMatrix(100,100,0);

  //prepare composite object: Higgs
  HHFitObject* higgs  = new HHFitObjectComposite(tau1,tau2,b1,b2,met);
  HHFitObject* higgs1  = new HHFitObjectComposite(tau1,tau2);
  HHFitObject* higgs2  = new HHFitObjectComposite(b1,b2);

  //prepare constraints
  HHFitConstraint* c_invmh1 = new HHFitConstraintEHardM(tau1, tau2, mh1);
  HHFitConstraint* c_invmh2 = new HHFitConstraintEHardM(b1, b2, mh2);
  HHFitConstraint* c_b1 = new HHFitConstraint4Vector(b1, false, false, false, true);
  HHFitConstraint* c_b2 = new HHFitConstraint4Vector(b2, false, false, false, true);
  HHFitConstraint* c_balance = new HHFitConstraint4Vector(higgs, true, true, false, false);

  //fit
  HHKinFit* singlefit = new HHKinFit();

  singlefit->addFitObjectE(tau1);
  singlefit->addFitObjectE(b1);

  singlefit->addConstraint(c_invmh1);
  singlefit->addConstraint(c_invmh2);
  singlefit->addConstraint(c_b1);
  singlefit->addConstraint(c_b2);
  singlefit->addConstraint(c_balance);

  singlefit->fit();

//  higgs->print();
  higgs1->print();
  higgs2->print();

  std::cout << "final chi2: " << singlefit->getChi2() << std::endl;

//  TGraph gr(singlefit->getChi2Function(100));
//  gr.Draw();
//
//  TFile f("out.root","UPDATE");
//  gr.Write();
//  f.Close();
//
//
//  try{
//    std::cout << singlefit->getChi2() << std::endl;
//  }
//  catch(const HHCovarianceMatrixException& e){
//    std::cout << e.what() << std::endl;
//    std::cout << "will fix it manually" << std::endl;
//    met->setCovMatrix(100,100,0);
//    std::cout << fit->getChi2() << std::endl;
//  }
//  catch(...){
//    std::cout << "caught an unexpected exception" << std::endl;
//  }

  return(0);
}
void HHKinFit2::HHKinFitMasterSingleHiggs::fit()
{
  for(unsigned int i = 0; i < m_hypos.size(); ++i)
    { 

      HHFitObjectE* tau1Fit = new HHFitObjectEConstM(m_tauvis1);
      HHFitObjectE* tau2Fit = new HHFitObjectEConstM(m_tauvis2);

      //prepare MET object
      HHFitObjectMET* metFit = new HHFitObjectMET(m_MET);
      metFit->setCovMatrix(m_MET_COV);
  
      //prepare composite object: Higgs
      HHFitObject* higgs  = new HHFitObjectComposite(tau1Fit, tau2Fit, metFit);
  
      int mh = m_hypos[i];

      try{
        tau1Fit->setFitLimitsE(tau1Fit->getInitial4Vector(),mh,tau2Fit->getInitial4Vector());
        tau2Fit->setFitLimitsE(tau2Fit->getInitial4Vector(),mh,tau1Fit->getInitial4Vector());
      }
      catch(HHLimitSettingException const& e){
        std::cout << "Exception while setting tau limits:" << std::endl;
        std::cout << e.what() << std::endl;
        std::cout << "Tau energies are not compatible with invariant mass constraint." << std::endl;

        m_map_chi2[m_hypos[i]] = -pow(10,10);
        m_map_prob[m_hypos[i]] = -pow(10,10);
        m_bestHypo =HHFitHypothesisSingleHiggs (-pow(10,10));
        m_chi2_best = -pow(10,10);
        continue;
      }
  


      //prepare constraints
      HHFitConstraint* c_invmh = new HHFitConstraintEHardM(tau1Fit, tau2Fit, mh);
      HHFitConstraint* c_balance = new HHFitConstraint4Vector(higgs, true, true, false, false);

      //fit
      HHKinFit2::HHKinFit* fitObject = new HHKinFit2::HHKinFit();

      tau1Fit->setInitStart((tau1Fit->getUpperFitLimitE()+tau1Fit->getLowerFitLimitE())/2);
      tau1Fit->setInitPrecision(0.1);
      tau1Fit->setInitStepWidth(0.1*(tau1Fit->getUpperFitLimitE() - tau1Fit->getLowerFitLimitE()));
      tau1Fit->setInitDirection(1.0);

      fitObject->addFitObjectE(tau1Fit);

      fitObject->addConstraint(c_invmh);
      fitObject->addConstraint(c_balance);

      fitObject->fit();

      m_map_convergence[m_hypos[i]] = fitObject->getConvergence();    
    


      double chi2 = fitObject->getChi2();
      m_map_chi2[m_hypos[i]] = chi2;
      m_map_prob[m_hypos[i]] = TMath::Prob(chi2, 1);

      if(chi2 < m_chi2_best)
        {
          m_bestHypo = m_hypos[i];
          m_chi2_best = chi2;
        }
    
      TLorentzVector fittedTau1 =  ( (TLorentzVector)tau1Fit->getFit4Vector()  );
      m_map_fittedTau1[m_hypos[i]] = fittedTau1;
      TLorentzVector fittedTau2 =  ( (TLorentzVector)tau2Fit->getFit4Vector()  );
      m_map_fittedTau2[m_hypos[i]] = fittedTau2;


      delete c_invmh;
      delete c_balance;
      delete fitObject;

      delete tau1Fit;
      delete tau2Fit;
      delete metFit;
      delete higgs;
    }
}