Spring 2019
Week 1, Feb. 5
We met with Dr. Agashe to discuss the standard model, issues with the standard model, and the theory designed to resolve at least one of those issues. We will be using simulation tools such as Madgraph to analyze certain processes which occur within the framework of this theory. The following is Dr. Agashe's summary of what was discussed in the lecture:
"(1). SM itself, including the idea of Feynman diagram for force (EM, strong and weak)
between matter particles (quarks and leptons) from exchange of gauge bosons (photon, gluon and W/Z)
+ Higgs mechanism for giving mass etc.
(2). Planck-weak hierarchy (and briefly dark matter) problems of the SM and their resolution by
adding new, ~TeV mass particles which are related to the SM by some "symmetry".
(3). How a particle propagating in a compact, extra (general) dimension looks like from the viewpoint of
the infinite, usual 4D, i.e., KK tower corresponding to each SM particle
(based on rough analogy with solving Schroedinger equation for particle in 1D box).
(4). Specifically, a warped/curved extra dimension can explain why ~ TeV KK scale (as need to address problems of
the SM) is much smaller than Planck scale. I gave the analogy with expanding universe here, i.e., just like
3D (flat) space expands with time, here we have 4D (flat) space-time expands/contracts as we move along
extra dimension (leading to effective 4D mass scale varying with location in extra dimension).
So, the idea is that gravitational physics resides near one end (UV/Planck brane), while Higgs sector/weak scale originates
near the other, thus the associated mass scales can be vastly different (due to exponential warp/curvature factor).
(5). Outline of the signal that they will analyze, i.e., KK W -> radion (which is the particle parametrizing
fluctuation of size of extra dimension) + SM W, followed by radion -> 2 W's (in turn, W -> quarks or leptons)."
Week 2 Feb. 12
In the first of our weekly meetings with Peizhi, we discussed concepts in collider physics. The following topics were discussed:
Cross section
Luminosity
Partons and parton distribution functions
4-momentum, invariant mass, conservation of 4-momentum
Detector components (tracker, EM calorimeter, hadron calorimeter, muon chamber) and their role in identifying particles
Week 3, Feb. 19
This meeting concerned the use of Madgraph. The programs we will be using in the future are Madgraph, Pythia, and Delphes. Madgraph simulates parton-level events. Pythia simulates hadronization. Delphes simulates detector-level events. Given a specified process, Madgraph generates all the possible ways in which a process can take place, then simulates a specified number of random events of that process. Two "cards" allow the user to specify the parameters of the model, and the kinematic cuts to use. Kinematic cuts are bounds on quantities such as energy and transverse momentum. Only events within these bounds will be included. Using Madgraph in a virtual machine, we used Madgraph to simulate the process p p -> z -> e+ e- (two protons -> Z boson -> positron and electron). This is done from the command line as follows.
(In the Madgraph directory)
./bin/mg5_aMC
generate p p > z > e+ e-
output outputfilename
launch
After launch, there will be the option to open either of the cards, if desired. Continue according to on-screen directions
The output of the generated events will be stored in the location that was specified in the output command.
Week 4, Feb. 26
Madgraph was used in the computing cluster, unlike the previous meeting, in which it was used installed on a virtual machine. Since the last week, accounts for cluster access have been obtained and at the beginning of the meeting we installed Madgraph on the cluster. After downloading Madgraph from online, it was transferred to the cluster using the command scp (filename) (accountname)@hepcms.umd.edu:(destination) from the command line, then unzipped in the cluster. The cluster was accessed by SSH using PuTTY, with the command ssh (accountname)@hepcms.umd.edu. Once this was done, Pythia and Delphes were installed. This was done using the following commands within Madgraph, install pythia-pgs and install Delphes, respectively. When using Madgraph to simulate a process, as described above, Pythia and Delphes were enabled in the following way. After launch, when "shower = …" and "detector = …" the commands shower = Pythia6 and detector = Delphes were used. After continuing the run as normal and exiting Madgraph, the Delphes output could be found in (fileoutputname)/Events/run_01 as a root file. The .root file was converted to a .lhco file using
./(path to MG)/Delphes/root2lhco (.root file) (new .lhco file name)
Week 5, Mar. 5
Since last meeting, we were tasked with learning to understand the contents of an .lhco file. The following is an image of what such a file's contents may look like.
The first column is the event number. "typ" is a number corresponding to a type of object (muon, jet, etc.). The following columns are, respectively, the polar angle in the transverse plane, the transverse momentum, the invariant mass, the number of tracks (multiplied by the charge for leptons), the presence of a bottom quark, and the ratio of energy deposited in the hadronic calorimeter to the EM calorimeter. The remaining two columns are placeholders for potential future information and currently hold no purpose.
Mathematica was installed, and we were introduced to how Mathematica can be used to access and process the information in an .lhco file. This was done using code in a pre-existing Mathematica file applied to the .lhco file generated last week, as mentioned previously. It was shown how a function could be written to iterate through the events in an .lhco file and apply the kinematic cuts by evaluating the event data referred to above in comparison to desired limits, and determining which events to discard based on these criteria. The following is the relevant code.
Mathematica could also be used to plot histograms from this data.
Week 6, Mar. 12
Madgraph was used to simulate the signal processes. We will be examining same-sign dilepton channels, simulating the following process:
as well as its counterpart in which a WKK- is initially produced, resulting in a final state with two negative leptons. This simulation used the theory outside of the standard model, and Madgraph was told to use this model using the command import model Radion_EW_all. Radion_EW_all contained the contents of the model, which was downloaded as Rawion_EW.zip, transferred to the cluster using scp, and unzipped in the cluster. Once the correct model was imported, the two processes were simulated. The first process was generated with
generate p p > wkk+ > w+ r, (r > w+ w-, w+ > l+ vl, w- > j j), w+ > l+ vl @1
Following this, the second process, with the negative leptons in the final state, was added with
add process p p > wkk > w- r, (r > w+ w-, w+ > j j, w- > l- vl~), w- > l- vl~ @2
During the run, the parameter card was modified, replacing the numerical values left of "WWKK" and "WR" with "Auto". Aside from this, the run was continued as normal with Pythia6 and Delphes enabled until an .lhco file was obtained as described previously. The Mathematica program which was to be used to analyze the .lhco file contained an error, so that analysis will be performed once it has been revised to fix the problem.
Week 7, Mar. 26
Over spring break, an .lhco file was generated for the Standard Model background processes. The processes (as represented in Mapgraph) were as follows:
generate p p > w+ w+ w- > l+ vl l+ vl j j @1
add process p p > w- w- w+ > l- vl~ l- vl~ j j @2
A Mathematica notebook was used to generate plots for the signal process for invariant mass or jets, jet transverse momentum, and missing energy. Missing energy is useful for distinguishing signal from background in this case because the peaks do not coincide. A plot of the missing energy for the signal (blue) and background (red) is below.
A cut was applied for the region where signal exceeds background, approximated as 150 GeV. The calculation of weight and significance were also discussed, and applied to this example.
Week 8, Apr. 2
The concept of "cut flow" was introduced. Cut flows means to repeat the cycle of applying a cut for a kinematic variable, plotting other variables for that reduced data range, evaluating the significance, and choosing another cut to apply for one of the other variables if the significance is not as high as desired. A cut should be chosen which would maximize significance without losing too many signal events. This cycle should be repeated until the significance is sufficiently high. This process was performed on the events resulting from the MET cut performed last week. The calculated significance of approximately 0.97 was decided to be too low. After plotting, it was determined that the invariant mass of the leptons would be an appropriate variable for a cut, at 200 GeV. The Mll plot for the post-MET-cut events is below:
Another variable which had been considered, the invariant mass of the jets, was not selected for a cut because of the overlapping peaks for the signal and background. The Mjj plot for the post-MET-cut events is below:
The significance after the Mll cut was approximately 1.69, which was an improvement relative to the MET cut alone. Further cuts could be applied to increase the significance further.
In the coming week we will be working on considering additional Standard Model backgrounds such as resulting from jets being classified as leptons by the detector. We will also be increasing the beam energy from 13 TeV to 14 TeV and the luminosity from 300 fb-1 to 3000 fb-1.
Week 9, Apr. 9
The signal and the WWW background were re-simulated in Madgraph with 14 TeV beam energy. This was done by editing the run card and changing the value of both "ebeam1" and "ebeam2" to 7000. Two other backgrounds were also simulated. These were a WWJJ background and a WJJ background, which were respectively
generate p p > w+ w+ j j , w+ > l+ vl , w+> l+ vl @1
add process p p > w- w- j j , w- > l- vl~ , w- > l- vl~ @2
and
generate p p > w+ j j , w+ > j j @1
add process p p > w- j j , w- > j j @2
The latter background is associated with the aforementioned behavior of a jet "imitating" a lepton in the detector. Analysis of the significance after applying MET and Mll cuts will be performed by next week, for now only considering the WWW and WWjj backgrounds.
Week 10, Apr. 16
We continued with analysis of the signal, WWW background, and WWJJ background. It was determined that the WJJ background could be neglected because the probability of two jets being mistaken for leptons by the detector is low enough that this background does not need to be considered. A MET cut was performed preserving events above 175 GeV, followed by a Mll cut preserving events above 175 GeV and a Ptl1 cut preserving events above 200 GeV. This increased the significance to approximately 1.6, which was deemed acceptably high. The plots used to determine these cuts are show below.
Week 11, Apr. 23
Analysis has been completed the past week, and this week's meeting was for the most part a discussion of various questions about the theory and the implications of the research, among other things. It was also discussed how our significance could be increased by removing the limit on the minimum Rjj of 0.4.
Week 12, April 30
In our final meeting, we discussed miscellaneous questions mostly concerning the theory, similarly to last week's meeting.
Fall 2018
8/30
bash: mkedanlzr: command not found
solution: cmsenv first
9/3
The command "cd CMSSW_5_3_32/src" results in
bash: cd: CMSSW_5_3_32/src: No such file or directory
I most likely made a mistake at a prior point in the setup, possibly by entering the command "cmsenv" two steps
too late after realizing that step had been omitted. (see 8/30)
solution: Remove VM and restart the setup process with a new VM
The above attempted solution was not successful.
The same problem ocurred on the new VM, despite verifying that the VM was configured correctly.
solution: Enter the command "cmsrel CMSSW_5_3_32" before "cd CMSSW_5_3_32/src"
"TBrower t" fails to open the ROOT GUI.
Solution: "TBrowser t" is the correct command.
successfully opened ROOT GUI
==Commands==
ls
list files in a directory (current by default)
-l long listing format - additional information listed with files
-h human-readable format
find /dir -name "query" -print
list all files/directories in current directory which match name query
(tab) autocomplete path name
~ home directory (e.g. cd ~)
. current directory
.. one directory up
* wildcard character (e.g. "Direc*" or "*ory" would match with "Directory")
touch file1 file2 file3...
Update access and modification time of files to current time.
If files do not exist, they are created. -c suppresses file creation.
(command) > (destination)
write output to destination, overriding existing contents of destination
(command) >> (destination)
write output to destination, concatenating to the end of the existing contents
cat (file)
print contents of file to standard output
mv path1 path2
move/rename file at path1 to path2
cp path1 path2
copy file1 to file2
locate query
search entire file system for matches to query
df
display used and available disk space.
ps
display currently running processes
grep text file
search file for text
wc file
display number of lines, words, and bytes in a file
man commandname
display information about a command
history
display past commands
sed 's/tofind/replacewith/' file.txt
find and replace in a text file
ARG refers to the variable ARG
$ARG refers to the value stored in ARG
echo `command` (backticks) echoes the evaluation of command
chmod
add or remove permissions
rwx read, write execute
r-- read only
--x execute only
--- none
SCRIPTS (HW3)
write code in a .tcsh file, with the first line: #!/bin/tcsh
execute script with ./scriptname.tcsh
HW4
#include <iostream>
using namespace std;
int main() {
cout << "hello world" << end; //print "hello world" (end line)
int i=2; //declare the integer variable i and initialize it to 2
cout << "i = " <<i<<endl; //print "i = " followed by the value of i and end line
double a=3.3; //declare the double variable a and initialize it to 3.3
cout << "a = " <<a<<endl; //print "a = " followed by the value of a and end line
int j = a*i; //declare the integer variable j and initialize it to the product of a and i
cout << "a*i = "<<j<<endl; //print "a*i = " followed by the value of j and end line
return 0; //exit the program by returning zero
}
#include <iostream>
using namespace std;
int main() {
int n=10; //declare an integer n and initialize it to 10
cout << "n is "<<n<<endl; //print "n is" followed by the value of n and end line
n--; //decrease n by 1
cout<<"n is now "<<n<<endl; //print "n is" followed by the value of n and end line
n++; //increment n by 1
cout<<n is now "<<n<<endl; //print "n is" followed by the value of n and end line
return 0; //exit program by returning 0
}
#include <iostream>
using namespace std;
int main() {
bool prop; //declare a boolean variable prop
prop = (5>1); //initialize prop to the boolean value of 5 > 1 (1 i.e. true)
cout<<"prop is "<<prop<<endl; //print "prop is" followed by the value of prop and end line
prop = (1>5); //initialize prop to the boolean value of 1 > 5 (0 i.e. false)
cout<<"prop is "<<prop<<endl; //print "prop is" followed by the value of prop and end line
prop = (1 != 5); //initialize prop to the boolean value of "1 does not equal 5"
cout << "prop is " <<prop<<endl; //print "prop is" followed by the value of prop and end line
return 0; //end program by returning zero
}
#include <iostream>
using namespace std;
int main() {
int n=10; //declare an integer variable n and initialize it to 10
while(n>0) { //while n is greater than 0:
cout<<"n is "<<n<<endl; //print "n is " followed by the value of n and end line
n--; //decrease n by 1
}
return 0; //end program by returning zero
}
#include <iostream>
using namespace std;
int main() {
for (int n=10; n>0; n--) { //starting with n=10, loop as long as n is greater than 0, decreasing n by 1 after each iteration
cout<<"n is "<<n<<endl; //print "n is " followed by n and end line
}
return 0; //end the program by returning zero
}
#include <iostream>
using namespace std;
int main() {
for(int n = 0; n < 10; n++){ //starting with n = 0, loop while n is less than 10, incrementing n after each iteration
cout << "n is " << n << ": "; //print "n is " followed by the value of n and ": "
for(int m = 0; m <= n; m++){ //starting with m = 0, loop while m is less than or equal to n, incrementing m after each iteration
cout << m; //print the value of m
}
}
return 0; //end the program by returning zero
}
DEBUGGING WITH GDB
compile with the -g flag
run with "gdb a.out"
"break n" or "b n"
set a breakpoint at line n
"continue" or "c"
continue running the program
"watch i" or "wa i"
show when the value of variable i changes
10/16 (HW 5)
#include <iostream>
using namespace std;
int main() {
int n = 10; //declare in integer n and initialize it to 10
while (n>=10) { //repeat while n is greater than or equl to 10
if(n>5) { //if n is greater than 5
cout<<"n is "<<n<<endl; //print "n is " followed by the value of n and end line
}
else { //otherwise
cout<<"n = "<<n<<endl; //print "n = " followed by the value of n and end line
n--; //decrease n by 1
}
return 0; //end the program by returning 0
}
}
#include <iostream>
using namespace std;
int main(){
int i = 10; //declare an integer i and initialize it to 10
int j = i; //declare an integer j and initialize it to the value of i
cout << "i= " << i << " and j= " << j << "\n"; //print the values of i and j
i=5; //set i to 5
cout << "i= " << i << " and j= " << j << "\n"; //print the values of i and j
j=1; //set j to 1
cout << "i= " << i << " and j= " << j << "\n"; //print the values of i and j
return 0; //end the program by returning 0
}
#include <iostream>
using namespace std;
int main(){
int i = 10; //declare an integer i and initialize it to 10
int* p = &i; //declare a pointer p pointing to the memory address of i
cout << "i= " << i << " and *p= " << *p << "\n"; //print the value of i and the value stored at the memory address p points to (which are the same)
i=5; //set i to 5
cout << "i= " << i << " and *p= " << *p << "\n"; //print the value of i and the value stored at the memory address p points to (which are the same)
i=5; //set i to 5
*p=1; //set the value stored at the memory address pointed to by p to 1
cout << "i= " << i << " and *p= " << *p << "\n"; //print the value of i and the value stored at the memory address p points to (which are the same)
return 0; //end the program by returning 0
}
#include <iostream>
using namespace std;
int main(){
int* p = new int(5); //declare a pointer p pointing to an unused memory address storing the integer value 5
cout << "p points at address " << p << "\n"; //print "p points at address " followed by the memory address p points to
cout << "The data stored in address " << p << " is " << *p << "\n"; //print "the data stored in address " (memory address p points to) " is " (value stored at the memory address p points to) (new line)
*p = 10; //set the value stored at the memory address pointed to by p to 10
cout << "Now the data stored in address " << p << " is " << *p << "\n"; //print "Now the data stored in address " (memory address p points to) " is " (value stored at the memory address p points to) (new line)
return 0; //end the program by returning 0
}
10/25 (HW 6)
#include <iostream>
using namespace std;
int main() {
int ii[3] = {1,2,3}; //declare an integer array of size 3 and initialize it to {1, 2, 3}
int j=0; //declare an integer j and initialize it to 0
while (j<3) { //while j is less than 3
cout <<" ii of "<<j<<" is "<<ii[j]<<endl; //print the value at index j of ii
j++; //increase j by 1
}
int LL[2][3] = {1,2,3,4,5,6}; //declare a 2D array LL with 2 rows and 3 columns
j=0; //set j to 0
int k; //declare an integer k
while (j<2) { //while j is less than 2
k=0; //set k to zero
while (k<3) { //while k is less than 3
cout<<" LL of "<<j<<" "<<k<<" is "<<LL[j][k]<<endl; //print the value at row index j and column index k of LL
k++; //increase k by 1
}
j++; //increase j by 1
}
return 0; //end the program by returning 0
}
#include <iostream>
#include <fstream>
using namespace std;
int main() {
ofstream myfile; //declare an ofstream object called myfile
myfile.open("example.txt"); //open an output stream for example.txt
myfile<<"write some junk."; //append "write some junk" to the file
myfile.close(); //close the output stream
return 0; //end the program by returning zero
}
main.cpp
scalar_mult.cpp
output of main.cpp
HW 8
Modified code:
#define HiggsAnalysis_cxx
#include "HiggsAnalysis.h"
#include <TH2.h>
#include <TStyle.h>
#include <TCanvas.h>
void HiggsAnalysis::Loop()
{
// In a ROOT session, you can do:
// Root > .L HiggsAnalysis.C
// Root > HiggsAnalysis t
// Root > t.GetEntry(12); // Fill t data members with entry number 12
// Root > t.Show(); // Show values of entry 12
// Root > t.Show(16); // Read and show values of entry 16
// Root > t.Loop(); // Loop on all entries
//
// This is the loop skeleton where:
// jentry is the global entry number in the chain
// ientry is the entry number in the current Tree
// Note that the argument to GetEntry must be:
// jentry for TChain::GetEntry
// ientry for TTree::GetEntry and TBranch::GetEntry
//
// To read only selected branches, Insert statements like:
// METHOD1:
// fChain->SetBranchStatus("*",0); // disable all branches
// fChain->SetBranchStatus("branchname",1); // activate branchname
// METHOD2: replace line
// fChain->GetEntry(jentry); //read all branches
//by b_branchname->GetEntry(ientry); //read only this branch
if (fChain == 0) return;
Long64_t nentries = fChain->GetEntriesFast();
Long64_t nbytes = 0, nb = 0;
TFile* output = TFile::Open("Dielectron_MC.root", "RECREATE"); // "RECREATE" would produce a new root file with name Dielectron_MC.root every time you run the code
TH1F* Z_ee = new TH1F("Z_ee", "Di-electron candidate invariant mass", 200, 0, 200); //create a TH1F object for the Z -> e e histogram
TH1F* H_zz = new TH1F("H_zz", "ZZ candidate invariant mass", 200, 0, 300); //create a TH1F object for the H -> Z Z histogram
double el1mt = 0.0;
double el1pt = 0.0;
double el1eta = 0.0;
for (Long64_t jentry=0; jentry<nentries;jentry++) { //loop for each entry
Long64_t ientry = LoadTree(jentry);
if (ientry < 0) break;
nb = fChain->GetEntry(jentry); nbytes += nb;
// if (Cut(ientry) < 0) continue;
TLorentzVector el1, el2; //declare TLorentzVector objects el1 and el2
el1.SetPtEtaPhiM(f_lept1_pt, f_lept1_eta, f_lept1_phi, 0.0); //set the values of pt, eta, and phi, and m for el1
el2.SetPtEtaPhiM(f_lept2_pt, f_lept2_eta, f_lept2_phi, 0.0); //set the values of pt, eta, and phi, and m for el2
TLorentzVector zCandidate = el1 + el2; //create a new TLorentzVector, zCandidate, equal to the sum of el1 and el2
TLorentzVector el3, el4; //declare TLorentzVector objects el3 and el4
el3.SetPtEtaPhiM(f_lept1_pt, f_lept1_eta, f_lept1_phi, 0.0); //set the values of pt, eta, and phi, and m for el3
el4.SetPtEtaPhiM(f_lept2_pt, f_lept2_eta, f_lept2_phi, 0.0); //set the values of pt, eta, and phi, and m for el4
TLorentzVector zCandidate2 = el3 + el4; //create a new TLorentzVector, zCandidate2, equal to the sum of el1 and el2
TLorentzVector Higgs = zCandidate + zCandidate2; //create a new TLorentzVector, Higgs, equal to the sum of zCandidate and zCandidate2
H_zz->Fill(Higgs.M()); //fill H_zz histogram with Higgs candidate mass
Z_ee->Fill(zCandidate.M()); //fill Z_ee histogram with Z candidate mass
el1mt = el1.Mt(); //set el1mt to el1 mass
cout << el1mt << endl; //print el1 mass and end line
}
Z_ee->Write(); //write Z_ee histogram
H_zz->Write(); //write H_zz histogram
output->Close(); //close file stream
}