Ejemplo n.º 1
0
int

main (int argc, char* argv[])
{
  MPI_Init (&argc, &argv);
  createParticleMPIType__ ();

  int P = mpih_getSize (MPI_COMM_WORLD);
  int rank = mpih_getRank (MPI_COMM_WORLD);

  int n; /* no. points */
  const double dt = DT; /* time step */
  int T; /* no. of time steps */
  const char* filename = NULL;
  FILE* fp_out = NULL;
  int save_data = 0;
  if (rank == 0) {
    if (argc < 3 || argc > 4) {
      usage__ (argv[0]);
      MPI_Abort (MPI_COMM_WORLD, 1);
    }
    sscanf (argv[1], "%d", &n); mpih_assert (n > 0);
    sscanf (argv[2], "%d", &T); mpih_assert (T > 0);
    if (argc == 4) {
      filename = argv[3];
      fp_out = fopen (filename, "wt");
      assert (fp_out);
      save_data = 1;
    }
  }
  MPI_Bcast (&n, 1, MPI_INT, 0, MPI_COMM_WORLD);
  MPI_Bcast (&T, 1, MPI_INT, 0, MPI_COMM_WORLD);
  MPI_Bcast (&save_data, 1, MPI_INT, 0, MPI_COMM_WORLD);
  if (rank == 0) {
    mpih_debugmsg (MPI_COMM_WORLD, "No. of points = %d\n", n);
    mpih_debugmsg (MPI_COMM_WORLD, "No. of time steps = %d\n", T);
    if (fp_out && filename) {
      mpih_debugmsg (MPI_COMM_WORLD, "Will save point location data in '%s'\n",
		     filename);
    }
  }

  if (rank == 0) mpih_debugmsg (MPI_COMM_WORLD, "Creating points...\n");
  int n_local = 0;
  particle_t* particles_local = NULL;
  createParticles__ (n, &n_local, &particles_local, MPI_COMM_WORLD);
  mpih_assert (particles_local || !n_local);

  /* If making a movie, try to get at least DEF_NUM_FRAMES frames */
  const int FRAMEFREQ = env_getInt_mpi__ (MPI_COMM_WORLD, "FRAMEFREQ",
					  max_int (T/DEF_NUM_FRAMES, 1));
  saveDistributedParticles__ (save_data, fp_out, n_local, particles_local,
			      MPI_COMM_WORLD);

  /* REDISTRIBUTE PARTICLES */
  fixBins(n_local, particles_local, MPI_COMM_WORLD);
  
  MPI_Recv(
  /* Main simulator loop */
  mpih_debugmsg (MPI_COMM_WORLD, "Simulating...\n");
  for (int t = 0; t < T; t += FRAMEFREQ) {
    const int num_steps = min_int (FRAMEFREQ, T-t);
    integrate (n_local, particles_local, num_steps, dt, MPI_COMM_WORLD);
    saveDistributedParticles__ (save_data, fp_out, n_local, particles_local,
				MPI_COMM_WORLD);
  }
  mpih_debugmsg (MPI_COMM_WORLD, "Done!\n");

  if (rank == 0) { /* Print execution time stats */
    fprintf (stdout, "%d %d %d %g %g %g %g %g %g %g\n",
             n, P, T, DOMAIN_SIZE, MASS, dt, VEL0, CUTOFF, t_net__, t_all__);
  }

  /* Clean-up */
  if (rank == 0) {
    if (n_local && particles_local) free (particles_local);
    if (fp_out) fclose (fp_out);
  }

  MPI_Finalize ();
  return 0;
}
Ejemplo n.º 2
0
void mssmHiggsLimit()
{
    double eff_times_acc120 = 0.018;  // 1.8%
    double xSection_times_br120 = 86; // 86pb (value taken from CMS AN-2009/143 for mHiggs = 115 GeV, tan(beta) = 30)
    double luminosity = 200;          // computed expected limits for 200pb^-1 of data recorded at centre-of-mass energy sqrt(s) = 7 TeV

    TString inputFileName = "plotsAHtoMuTau_all.root";
    //TString inputFileName = ""rfio:/castor/cern.ch/user/v/veelken/CMSSW_3_3_x/plots/AHtoMuTau/7TeVrelIso/plotsAHtoMuTau_all.root";

//--- define observable used as fit variable
//
//    NOTE: when using the invariant mass of muon plus tau-jet reconstructed by collinear approximation,
//          need to set eff_time_acc120 to 1.0%
//          (mass reconstruction via collinear approximation yields "valid"/"physical" solution
//           for 55% of A/H --> tau+ tau- events passing all selection criteria
//           of final A/H --> tau+ tau- analysis only)
//
    TString meName_fitVar = "DiTauCandidateQuantities/VisMass"; // visible invariant mass of muon plus tau-jet
    //TString meName_fitVar = "DiTauCandidateQuantities/CollinearApproxMass"; // invariant mass reconstructed by collinear approximation
    //TString meName_fitVar = "DiTauCandidateQuantities/SVfitMass"; // invariant mass reconstructed by secondary vertex based mass reconstruction algorithm
    //TString meName_fitVar = "DiTauCandidateQuantities/CDFmethodMass"; // invariant mass reconstructed by "CDF" method

    double xMin_fitVar = 20;
    double xMax_fitVar = 200;

    TString dqmDirectory_Ztautau = "DQMData/harvested/Ztautau/ahMuTauAnalyzer_woBtag/afterEvtSelNonCentralJetEt20bTag/";
    TString dqmDirectory_Zmumu = "DQMData/harvested/Zmumu/ahMuTauAnalyzer_woBtag/afterEvtSelNonCentralJetEt20bTag/";
    TString dqmDirectory_WplusJets = "DQMData/harvested/WplusJets/ahMuTauAnalyzer_woBtag/afterEvtSelNonCentralJetEt20bTag/";
    TString dqmDirectory_TTplusJets = "DQMData/harvested/TTplusJets/ahMuTauAnalyzer_woBtag/afterEvtSelNonCentralJetEt20bTag/";
    TString dqmDirectory_QCD = "DQMData/harvested/qcdSum/ahMuTauAnalyzer_woBtag/afterEvtSelNonCentralJetEt20bTag/";
    TString dqmDirectory_AH120 = "DQMData/harvested/AHsum120_tautau/ahMuTauAnalyzer_woBtag/afterEvtSelNonCentralJetEt20bTag/";
    TString dqmDirectory_Data = "DQMData/harvested/smSum/ahMuTauAnalyzer_woBtag/afterEvtSelNonCentralJetEt20bTag/";

    TString meName_Ztautau = TString(dqmDirectory_Ztautau).Append(meName_fitVar);
    TString meName_Zmumu = TString(dqmDirectory_Zmumu).Append(meName_fitVar);
    TString meName_WplusJets = TString(dqmDirectory_WplusJets).Append(meName_fitVar);
    TString meName_TTplusJets = TString(dqmDirectory_TTplusJets).Append(meName_fitVar);
    TString meName_QCD = TString(dqmDirectory_QCD).Append(meName_fitVar);
    TString meName_AH120 = TString(dqmDirectory_AH120).Append(meName_fitVar);
    TString meName_Data = TString(dqmDirectory_Data).Append(meName_fitVar);

//--- open input file
//    (produced by 'cmsRun TauAnalysis/Configuration/test/makeAHtoMuTauPlots_cfg.py')
    TFile* inputFile = TFile::Open(inputFileName.Data());

    TH1* me_Ztautau = (TH1*)inputFile->Get(meName_Ztautau);
    std::cout << "me_Ztautau = " << me_Ztautau << ": integral = " << me_Ztautau->Integral() << std::endl;
    TH1* me_Zmumu = (TH1*)inputFile->Get(meName_Zmumu);
    std::cout << "me_Zmumu = " << me_Zmumu << ": integral = " << me_Zmumu->Integral() << std::endl;
    TH1* me_WplusJets = (TH1*)inputFile->Get(meName_WplusJets);
    std::cout << "me_WplusJets = " << me_WplusJets << ": integral = " << me_WplusJets->Integral() << std::endl;
    TH1* me_TTplusJets = (TH1*)inputFile->Get(meName_TTplusJets);
    std::cout << "me_TTplusJets = " << me_TTplusJets << ": integral = " << me_TTplusJets->Integral() << std::endl;
    TH1* me_QCD = (TH1*)inputFile->Get(meName_QCD);
    std::cout << "me_QCD = " << me_QCD << ": integral = " << me_QCD->Integral() << std::endl;
    TH1* me_AH120 = (TH1*)inputFile->Get(meName_AH120);
    std::cout << "me_AH120 = " << me_AH120 << ": integral = " << me_AH120->Integral() << std::endl;
    TH1* me_Data = (TH1*)inputFile->Get(meName_Data);
    std::cout << "me_Data = " << me_Data << ": integral = " << me_Data->Integral() << std::endl;

//--- set bin-contents of histogram representing distribution of fit variable
//    observed in (pseudo)data sample to (positive) integer values and all bin-errors to sqrt(bin-content),
//    as expected for "real" data
    fixBins(me_Data);
    std::cout << "me_Data: integral (rounded) = " << me_Data->Integral() << std::endl;

//--- make control plot of distribution of fit variable
    drawFitVarDistribution(me_Ztautau, me_Zmumu, me_WplusJets, me_TTplusJets, me_QCD, me_AH120, me_Data);

//--- create fit variable
    RooRealVar* fitVar = new RooRealVar("fitVar", "fitVar", xMin_fitVar, xMax_fitVar);

//--- create probability density functions (pdfs)
//    for A/H --> tau+ tau- signal and Standard Model background processes
    RooDataHist* hist_Ztautau = new RooDataHist("hist_Ztautau", "hist_Ztautau", *fitVar, me_Ztautau);
    RooHistPdf* pdf_Ztautau = new RooHistPdf("pdf_Ztautau", "pdf_Ztautau", *fitVar, *hist_Ztautau);
    RooDataHist* hist_Zmumu = new RooDataHist("hist_Zmumu", "hist_Zmumu", *fitVar, me_Zmumu);
    RooHistPdf* pdf_Zmumu = new RooHistPdf("pdf_Zmumu", "pdf_Zmumu", *fitVar, *hist_Zmumu);
    RooDataHist* hist_WplusJets = new RooDataHist("hist_WplusJets", "hist_WplusJets", *fitVar, me_WplusJets);
    RooHistPdf* pdf_WplusJets = new RooHistPdf("pdf_WplusJets", "pdf_WplusJets", *fitVar, *hist_WplusJets);
    RooDataHist* hist_TTplusJets = new RooDataHist("hist_TTplusJets", "hist_TTplusJets", *fitVar, me_TTplusJets);
    RooHistPdf* pdf_TTplusJets = new RooHistPdf("pdf_TTplusJets", "pdf_TTplusJets", *fitVar, *hist_TTplusJets);
    //RooDataHist* hist_QCD = new RooDataHist("hist_QCD", "hist_QCD", *fitVar, me_QCD);
    //RooHistPdf* pdf_QCD = new RooHistPdf("pdf_QCD", "pdf_QCD", *fitVar, *hist_QCD);
    RooDataHist* hist_AH120 = new RooDataHist("hist_AH120", "hist_AH120", *fitVar, me_AH120);
    RooHistPdf* pdf_AH120 = new RooHistPdf("pdf_AH120", "pdf_AH120", *fitVar, *hist_AH120);

//--- create variables representing normalization factors
//    (allow negative values for normalization factors,
//     in order to avoid running into problems of numerical stability
//     arising in case lower bound on normalization factor is set to zero
//     and Minuit fit gets close to that bound)
    RooRealVar* norm_Ztautau = new RooRealVar("norm_Ztautau" , "norm_Ztautau", me_Ztautau->Integral(), 0., 1e+4);
    RooRealVar* norm_Zmumu = new RooRealVar("norm_Zmumu" , "norm_Zmumu", me_Zmumu->Integral(), 0., 1e+4);
    RooRealVar* norm_WplusJets = new RooRealVar("norm_WplusJets" , "norm_WplusJets", me_WplusJets->Integral(), 0., 1e+4);
    RooRealVar* norm_TTplusJets = new RooRealVar("norm_TTplusJets" , "norm_TTplusJets", me_TTplusJets->Integral(), 0., 1e+4);
    //RooRealVar* norm_QCD = new RooRealVar("norm_QCD" , "norm_QCD", me_QCD->Integral(), 0., 1e+4);
    RooRealVar* norm_AH120 = new RooRealVar("norm_AH120" , "norm_AH120", me_AH120->Integral(), 0., 1e+4);

//--- create "background" pdf
    TObjArray pdf_SM_pdfCollection;
    TObjArray pdf_SM_normCollection;
    pdf_SM_pdfCollection.Add(pdf_Ztautau);
    pdf_SM_normCollection.Add(norm_Ztautau);
    pdf_SM_pdfCollection.Add(pdf_Zmumu);
    pdf_SM_normCollection.Add(norm_Zmumu);
    pdf_SM_pdfCollection.Add(pdf_WplusJets);
    pdf_SM_normCollection.Add(norm_WplusJets);
    pdf_SM_pdfCollection.Add(pdf_TTplusJets);
    pdf_SM_normCollection.Add(norm_TTplusJets);
//--- need to exclude QCD background from pdf for now,
//    because empty histogram causes errors in RooStats fit
    //pdf_SM_pdfCollection.Add(pdf_QCD);
    //pdf_SM_normCollection.Add(norm_QCD);
    std::cout << "pdf_SM_pdfCollection: entries = " << pdf_SM_pdfCollection.GetEntries() << std::endl;
    std::cout << "pdf_SM_normCollection: entries = " << pdf_SM_normCollection.GetEntries() << std::endl;
    RooAddPdf* pdf_SM = new RooAddPdf("pdf_SM", "pdf_SM", RooArgList(pdf_SM_pdfCollection), RooArgList(pdf_SM_normCollection));

//--- create "signal + background" pdf
    TObjArray pdf_BSM_pdfCollection(pdf_SM_pdfCollection);
    TObjArray pdf_BSM_normCollection(pdf_SM_normCollection);
    pdf_BSM_pdfCollection.Add(pdf_AH120);
    pdf_BSM_normCollection.Add(norm_AH120);
    std::cout << "pdf_BSM_pdfCollection: entries = " << pdf_BSM_pdfCollection.GetEntries() << std::endl;
    std::cout << "pdf_BSM_normCollection: entries = " << pdf_BSM_normCollection.GetEntries() << std::endl;
    RooAddPdf* pdf_BSM = new RooAddPdf("pdf_BSM", "pdf_BSM", RooArgList(pdf_BSM_pdfCollection), RooArgList(pdf_BSM_normCollection));

//--- create histogram object representing distribution of fit variable
//    observed in (pseudo)data sample of events passing all selection criteria of final A/H --> tau+ tau- analysis
//    (in channel without b-tag requirements)
    RooDataHist* data = new RooDataHist("data", "data", *fitVar, me_Data);

//--- compute upper limit on number of A/H --> tau+ tau- events
//    based on distribution of fit variable observed in (pseudo)data sample
    double numEvents_AH120_upperLimit = compNumEvents_profileLikelihoodUpperLimit(data, pdf_BSM, pdf_SM, norm_AH120);
    //double numEvents_AH120_upperLimit = compNumEvents_hybridUpperLimit(data, pdf_BSM, pdf_SM, norm_AH120);
    std::cout << "numEvents_AH120_upperLimit = " << numEvents_AH120_upperLimit << std::endl;

//--- compute upper limit on A/H production cross-section
//    times branching ration A/H --> tau+ tau- decays
    double xSection_times_br_upperLimit = numEvents_AH120_upperLimit/(luminosity * eff_times_acc120);
    std::cout << "xSection_times_br_upperLimit = " << xSection_times_br_upperLimit << std::endl;

//--- compute upper limit on tan(beta)
    double tanBeta_upperLimit = TMath::Sqrt(xSection_times_br_upperLimit/xSection_times_br120) * 30;
    std::cout << "tanBeta_upperLimit = " << tanBeta_upperLimit << std::endl;

//--- close input file
//    (objects created by 'new' will be deleted by ROOT automatically)
    delete inputFile;
}