d4sigma_hist.C
Go to the documentation of this file.
1 // *********************************************************************
2 // Generate 4D diff-xsec histograms - Martti Nirkko (28th Nov 2014)
3 // Compile and run in terminal: root -l -q d4sigma_hist.C+g
4 // *********************************************************************
5 
6 #include "code/singlekaon_xsec.cxx"
7 #include <TMath.h>
8 #include <TFile.h>
9 #include <TH3D.h>
10 
11 // Compile using: root -l -b -q d4sigma_hist.C+g
12 void d4sigma_hist() {
13 
14  // ***************************
15  // * STEERING PARAMETERS *
16  // ***************************
17  const int COMP = 10; // time complexity (runs with O(n^4)...)
18  const int pLeptonIsUsed = 0; // use momentum instead of kinetic energy
19  const int thetaIsUsed = 0; // use angle instead of cosine
20  const double pi = TMath::Pi();
21 
22  // NOTE: All results for a changing "pleptonIsUsed" and "thetaIsUsed" give the same results within
23  // about 1% regarding the total cross-section. Here, for making histograms of the differential
24  // 1D cross-section, I use the variables I want to actually plot (Tlep and costheta)
25 
26  int type = 2; // lepton: 1=electron, 2=muon, 3=tau
27  int reac = 3; // reaction: 1=NN, 2=NP, 3=PP
28 
29  double Enu; // neutrino energy [GeV]
30  printf("Please enter neutrino energy: ");
31  scanf("%lf", &Enu);
32  printf("E_nu set to %.3lf GeV...\n", Enu);
34  inst->init(Enu, type, reac);
35 
36  double Mlep = 0.; // lepton mass [GeV]
37  if (type==1) Mlep = 0.510998928e-3;
38  else if (type==2) Mlep = 0.1056583715;
39  else if (type==3) Mlep = 1.77682;
40  else {std::cout<<"ERROR: Invalid type!"<<std::endl; return;}
41 
42  double Mkaon = 0.; // kaon mass [GeV]
43  if (reac==1) Mkaon = 0.493677;
44  else if (reac==2) Mkaon = 0.497614;
45  else if (reac==3) Mkaon = 0.493677;
46  else {std::cout<<"ERROR: Invalid reaction!"<<std::endl; return;}
47 
48  // Initialisation of variables
49  int i,j,k,l;
50  const int nsteps1 = 10*COMP, nsteps2 = 10*COMP, nsteps3 = 10*COMP, nsteps4 = 2*COMP;
51  double varmin1, varmin2, varmin3, varmin4, varmax1, varmax2, varmax3, varmax4, temp;
52  double binsvar1[nsteps1+1], binsvar2[nsteps2+1], binsvar3[nsteps3+1], binsvar4[nsteps4+1];
53  double varvals1[nsteps1], varvals2[nsteps2], varvals3[nsteps3], varvals4[nsteps4];
54 
55  double Tlep, Elep; // LEPTON ENERGY [GeV]
56  double Tkaon; // KAON ENERGY [GeV]
57  double theta; // LEPTON ANGLE [rad]
58  double phikq; // KAON ANGLE [rad]
59  double diff4sigma; // DIFFERENTIAL CROSS SECTION [cm^2/GeV^2/rad^2]
60 
61  // Integration ranges
62  varmin1 = 0.; varmax1 = Enu-Mkaon-Mlep; // Tkaon
63  if (pLeptonIsUsed) { // plep
64  varmin2 = 0.;
65  varmax2 = sqrt((Enu-Mkaon)*(Enu-Mkaon)-Mlep*Mlep);
66  } else { // Tlep
67  varmin2 = 0.;
68  varmax2 = Enu-Mkaon-Mlep;
69  }
70  if (thetaIsUsed) { // theta
71  varmin3 = 0.;
72  varmax3 = pi;
73  } else { // cos(theta)
74  varmin3 = -1.0;
75  varmax3 = 1.0;
76  }
77  varmin4 = -pi; varmax4 = pi; // phi_kq
78 
79  // Calculate edges of bins
80  for (i=0; i<=nsteps1; i++) {
81  binsvar1[i] = varmin1 + i*(varmax1-varmin1)/nsteps1;
82  }
83  for (j=0; j<=nsteps2; j++) {
84  temp = varmin2 + j*(varmax2-varmin2)/nsteps2; // plep OR Tlep
85  if (pLeptonIsUsed) {
86  binsvar2[j] = sqrt(temp*temp+Mlep*Mlep)-Mlep; // plep -> Tlep
87  } else {
88  binsvar2[j] = temp; // Tlep
89  }
90  }
91  for (k=0; k<=nsteps3; k++) {
92  if (thetaIsUsed) {
93  temp = varmax3 - k*(varmax3-varmin3)/nsteps3; // theta
94  binsvar3[k] = cos(temp); // cos(theta)
95  } else {
96  binsvar3[k] = varmin3 + k*(varmax3-varmin3)/nsteps3;
97  }
98  }
99  for (l=0; l<=nsteps4; l++) {
100  binsvar4[l] = varmin4 + l*(varmax4-varmin4)/nsteps4;
101  }
102 
103  // Calculate edges of bins (NEW / TEST)
104  /*for (i=0; i<=nsteps1; i++) binsvar1[i] = varmin1 + i*(varmax1-varmin1)/nsteps1;
105  for (j=0; j<=nsteps2; j++) binsvar2[j] = varmin2 + j*(varmax2-varmin2)/nsteps2; // plep OR Tlep
106  for (k=0; k<=nsteps3; k++) binsvar3[k] = varmin3 + k*(varmax3-varmin3)/nsteps3; // theta OR costh
107  for (l=0; l<=nsteps4; l++) binsvar4[l] = varmin4 + l*(varmax4-varmin4)/nsteps4;*/
108 
109  // Calculate central bin values (average of left and right edge of bin)
110  for (i=0; i<nsteps1; i++) varvals1[i] = 0.5*(binsvar1[i+1]+binsvar1[i]);
111  for (j=0; j<nsteps2; j++) varvals2[j] = 0.5*(binsvar2[j+1]+binsvar2[j]);
112  for (k=0; k<nsteps3; k++) varvals3[k] = 0.5*(binsvar3[k+1]+binsvar3[k]);
113  for (l=0; l<nsteps4; l++) varvals4[l] = 0.5*(binsvar4[l+1]+binsvar4[l]);
114 
115  TH3D *hist[nsteps4];
116  for (l=0; l<nsteps4; l++) {
117  hist[l] = new TH3D(Form("hist_%2d",l), "diff4sigma", nsteps1, binsvar1, nsteps2, binsvar2, nsteps3, binsvar3);
118  }
119 
120  // CALCULATE CROSS-SECTION
121  // -----------------------
122 
123  for (i=0; i<nsteps1; i++) {
124  if (binsvar1[i+1]==binsvar1[i]) continue;
125  Tkaon = varvals1[i];
126 
127  for (j=0; j<nsteps2; j++) {
128  if (binsvar2[j+1]==binsvar2[j]) continue;
129  Tlep = varvals2[j];
130  Elep = Tlep+Mlep;
131 
132  for (k=0; k<nsteps3; k++) {
133  if (binsvar3[k+1]==binsvar3[k]) continue;
134  theta = acos(varvals3[k]);
135 
136  for (l=0; l<nsteps4; l++) {
137  if (binsvar4[l+1]==binsvar4[l]) continue;
138  phikq = varvals4[l];
139 
140  // Calculate 4D differential xsec
141  diff4sigma = inst->diffxsec(Tlep,Tkaon,theta,phikq);
142  diff4sigma *= 2*pi;
143 
144  // This Jacobian no longer needed, since binning is adjusted to cos(theta)
145  // diff4sigma *= sin(theta);
146 
147  // Multiplication with Jacobian for transformation plep->Tlep (it is E/p)
148  diff4sigma *= Elep/sqrt(Elep*Elep-Mlep*Mlep);
149 
150  hist[l]->SetBinContent(i+1,j+1,k+1,diff4sigma);
151  }
152 
153  }
154 
155  }
156 
157  if ((i+1)%5==0)
158  std::cout << "Processing... (" << 100.*(i+1.)/nsteps1 << "%)" << std::endl;
159 
160  }
161 
162  std::string fname = Form("data/d4sigma_hist_%3.1lfGeV.root", Enu);
163  TFile* outfile = new TFile(fname.c_str(), "RECREATE");
164  for (l=0; l<nsteps4; l++) hist[l]->Write(Form("d4sigma_hist_%d",l));
165  outfile->Close();
166  std::cout << std::endl << "Output written to file: " << fname << std::endl << std::endl;
167 
168 }
169 
void d4sigma_hist()
Definition: d4sigma_hist.C:12
size_t i(0)
art art Framework Principal Run temp
std::string string
Definition: nybbler.cc:12
const double pi
Definition: LAr.C:31
the ParameterSet object passed in for the configuration of a destination should be the only source that can affect the behavior of that destination This is to eliminate the dependencies of configuring a destination from multiple mostly from the defaults It suppresses possible glitches about changing the configuration file somewhere outside of a destination segament might still affect the behavior of that destination In the previous configuration for a specific the value of a certain e may come from following and have been suppressed It the configuring ParameterSet object for each destination will be required to carry a parameter list as complete as possible If a parameter still cannot be found in the ParameterSet the configuration code will go look for a hardwired default directly The model is a great simplicity comparing with the previous especially when looking for default values Another great advantage is most of the parameters now have very limited places that allows to appear Usually they can only appear at one certain level in a configuration file For in the old configuring model or in a default ParameterSet object inside of a or in a category or in a severity object This layout of multiple sources for a single parameter brings great confusion in both writing a configuration and in processing the configuration file Under the new the only allowed place for the parameter limit to appear is inside of a category which is inside of a destination object Other improvements simplify the meaning of a destination name In the old a destination name has multiple folds of meanings the e cout and cerr have the special meaning of logging messages to standard output or standard error the name also serves as the output filename if the destination is a file these names are also references to look up for detailed configurations in configuring the MessageFacility The multi purpose of the destination name might cause some unwanted behavior in either writing or parsing the configuration file To amend in the new model the destination name is now merely a name for a which might represent the literal purpose of this or just an id All other meanings of the destinations names now go into the destination ParameterSet as individual such as the type parameter and filename parameter Following is the deatiled rule for the new configuring Everything that is related with MessageFacility configuration must be wrapped in a single ParameterSet object with the name MessageFacility The MessageFacility ParameterSet object contains a series of top level parameters These parameters can be chosen a vector of string listing the name of debug enabled models Or use *to enable debug messages in all modules a vector of string a vector of string a vector of string a ParameterSet object containing the list of all destinations The destinations ParameterSet object is a combination of ParameterSet objects for individual destinations There are two types of destinations that you can insert in the destinations ParameterSet ordinary including cout
double diffxsec(double Tlep, double Tkaon, double theta, double phikq)
these are called *plugin *libraries Plugin libraries are loaded by the *LibraryManager *see above The source file in which a module is implemented must be named< module > _plugin cc It must contain an invocation of the *DEFINE_EDM_PLUGIN *macro The *DEFINE_EDM_PLUGIN *macro is responsible for writing the appropriate *factory **function and that takes a const reference to a *ParameterSet *and that returns a newly created instance of the associated module type
ServiceRegistry * inst
void init(double Etot, int type, int reac)
gm Write()