ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/UserCode/dasu/UltraFastSim/generateData.cc
Revision: 1.16
Committed: Wed Mar 2 21:57:09 2011 UTC (14 years, 2 months ago) by dasu
Content type: text/plain
Branch: MAIN
CVS Tags: v2
Changes since 1.15: +23 -2 lines
Log Message:
Added Poisson generator -- for some reason it is missing in Pythia

File Contents

# Content
1 // This simple program generates various signal processes for
2 // MSSM bbPhi process and its backgrounds.
3 // It includes the mixing of required level of pileup.
4 // It then takes pythia output and runs it through very simplistic
5 // detector simulation using parameterizations, including making
6 // isolated light leptons, photons, composite tau, jet and b-tagged
7 // jet objects.
8 // It saves the output in root format for later analysis.
9
10 using namespace std;
11 #include <math.h>
12
13 #include "Pythia.h"
14 using namespace Pythia8;
15
16 #include "UltraFastSim.h"
17 #include "UFSDataStore.h"
18
19 int poisson(double mean, Rndm *rndmPtr) {
20 static double oldMean = -1;
21 static double g;
22 if(mean != oldMean) {
23 oldMean = mean;
24 if(mean == 0) {
25 g = 0;
26 }
27 else {
28 g = exp(-mean);
29 }
30 }
31 double em = -1;
32 double t = 1;
33 do {
34 em++;
35 t *= rndmPtr->flat();
36 } while(t > g);
37 return em;
38 }
39
40 int main(int argc, char **argv) {
41 // Generator. Process selection. LHC initialization. Histogram.
42 Pythia pythia;
43 int nEvents = 0;
44 int runNumber = 0;
45 int meanPileupEventCount = 0;
46 if(argc < 3 || argc > 5)
47 {
48 cerr << "Command syntax: " << argv[0] << " ZHmmbb[...]" << " <nEvents> [RandomSeed] [meanPileupEventCount]" << endl;
49 cerr << "or " << argv[0] << " ZHeebb[...]" << " <nEvents> [RandomSeed] [meanPileupEventCount]" << endl;
50 cerr << "or " << argv[0] << " ZZmmbb[...]" << " <nEvents> [RandomSeed] [meanPileupEventCount]" << endl;
51 cerr << "or " << argv[0] << " BBHmh[...] " << " <nEvents> [RandomSeed] [meanPileupEventCount]" << endl;
52 cerr << "or " << argv[0] << " BBAmh[...] " << " <nEvents> [RandomSeed] [meanPileupEventCount]" << endl;
53 cerr << "or " << argv[0] << " Zee[...] " << " <nEvents> [RandomSeed] [meanPileupEventCount]" << endl;
54 cerr << "or " << argv[0] << " Zmm[...] " << " <nEvents> [RandomSeed] [meanPileupEventCount]" << endl;
55 cerr << "or " << argv[0] << " Zeh[...] " << " <nEvents> [RandomSeed] [meanPileupEventCount]" << endl;
56 cerr << "or " << argv[0] << " Zmh[...] " << " <nEvents> [RandomSeed] [meanPileupEventCount]" << endl;
57 cerr << "or " << argv[0] << " Zhh[...] " << " <nEvents> [RandomSeed] [meanPileupEventCount]" << endl;
58 cerr << "or " << argv[0] << " Wen[...] " << " <nEvents> [RandomSeed] [meanPileupEventCount]" << endl;
59 cerr << "or " << argv[0] << " Wmn[...] " << " <nEvents> [RandomSeed] [meanPileupEventCount]" << endl;
60 cerr << "or " << argv[0] << " Ten[...] " << " <nEvents> [RandomSeed] [meanPileupEventCount]" << endl;
61 cerr << "or " << argv[0] << " Tmn[...] " << " <nEvents> [RandomSeed] [meanPileupEventCount]" << endl;
62 cerr << "In above e-electron, m-muon, h-hadronic tau. n-neutrino" << endl;
63 exit(1);
64 }
65 else {
66 nEvents = atoi(argv[2]);
67 if(argc >= 4) runNumber = atoi(argv[3]);
68 if(argc >= 5) meanPileupEventCount = atoi(argv[4]);
69 if(strncmp(argv[1], "Zee", 3) == 0)
70 {
71 pythia.readString("WeakSingleBoson:ffbar2gmZ = on");
72 pythia.readString("PhaseSpace:mHatMin = 60.");
73 pythia.readString("PhaseSpace:mHatMax = -1");
74 pythia.readString("23:onMode = 0"); // Z decays to electrons only
75 pythia.readString("23:onIfAny = 11");
76 }
77 else if(strncmp(argv[1], "Zmm", 3) == 0)
78 {
79 pythia.readString("WeakSingleBoson:ffbar2gmZ = on");
80 pythia.readString("PhaseSpace:mHatMin = 60.");
81 pythia.readString("PhaseSpace:mHatMax = -1");
82 pythia.readString("23:onMode = 0"); // Z decays to muons only
83 pythia.readString("23:onIfAny = 13");
84 }
85 else if(strncmp(argv[1], "Zeh", 3) == 0)
86 {
87 pythia.readString("WeakSingleBoson:ffbar2gmZ = on");
88 pythia.readString("PhaseSpace:mHatMin = 60.");
89 pythia.readString("PhaseSpace:mHatMax = -1");
90 pythia.readString("23:onMode = 0"); // Z decays to taus only
91 pythia.readString("23:onIfAny = 15");
92 pythia.readString("15:onMode = 2"); // tau- decays to electrons - second tau decays in all modes
93 pythia.readString("15:onIfAny = 11");
94 }
95 else if(strncmp(argv[1], "Zmh", 3) == 0)
96 {
97 pythia.readString("WeakSingleBoson:ffbar2gmZ = on");
98 pythia.readString("PhaseSpace:mHatMin = 60.");
99 pythia.readString("PhaseSpace:mHatMax = -1");
100 pythia.readString("23:onMode = 0"); // Z decays to taus only
101 pythia.readString("23:onIfAny = 15");
102 pythia.readString("15:onMode = 2"); // tau- decays to muons - second tau decays in all modes
103 pythia.readString("15:onIfAny = 13");
104 }
105 else if(strncmp(argv[1], "Zhh", 3) == 0)
106 {
107 pythia.readString("WeakSingleBoson:ffbar2gmZ = on");
108 pythia.readString("PhaseSpace:mHatMin = 60.");
109 pythia.readString("PhaseSpace:mHatMax = -1");
110 pythia.readString("23:onMode = 0"); // Z decays to taus only
111 pythia.readString("23:onIfAny = 15");
112 }
113 else if(strncmp(argv[1], "Wen", 3) == 0)
114 {
115 pythia.readString("WeakSingleBoson:ffbar2W = on");
116 pythia.readString("24:onMode = 0"); // W decays to electron
117 pythia.readString("24:onIfAny = 11");
118 }
119 else if(strncmp(argv[1], "Wmn", 3) == 0)
120 {
121 pythia.readString("WeakSingleBoson:ffbar2W = on");
122 pythia.readString("24:onMode = 0"); // W decays to muon
123 pythia.readString("24:onIfAny = 13");
124 }
125 else if(strncmp(argv[1], "Ten", 3) == 0)
126 {
127 pythia.readString("Top:all = on");
128 pythia.readString("24:onMode = 2"); // W+ decays to electron
129 pythia.readString("24:onIfAny = 11");
130 }
131 else if(strncmp(argv[1], "Tmn", 3) == 0)
132 {
133 pythia.readString("Top:all = on");
134 pythia.readString("24:onMode = 2"); // W+ decays to muon
135 pythia.readString("24:onIfAny = 13");
136 }
137 else if(strncmp(argv[1], "ZHmmbb", 6) == 0)
138 {
139 pythia.readString("HiggsSM:ffbar2HZ = on");
140 pythia.readString("25:m0 = 120");
141 pythia.readString("25:onMode = 0"); // Higgs decays to bbBar only
142 pythia.readString("25:onIfAny = 5");
143 pythia.readString("23:onMode = 0"); // Z decays to mu+,mu- only (for trigger)
144 pythia.readString("23:onIfAny = 13");
145 }
146 else if(strncmp(argv[1], "ZHeebb", 6) == 0)
147 {
148 pythia.readString("HiggsSM:ffbar2HZ = on");
149 pythia.readString("25:m0 = 120");
150 pythia.readString("25:onMode = 0"); // Higgs decays to bbBar only
151 pythia.readString("25:onIfAny = 5");
152 pythia.readString("23:onMode = 0"); // Z decays to e+,e- only (for trigger)
153 pythia.readString("23:onIfAny = 11");
154 }
155 else if(strncmp(argv[1], "BB", 2) == 0)
156 {
157 pythia.readString("Higgs:useBSM = on");
158 pythia.readString("25:m0 = 129");
159 pythia.readString("35:m0 = 499.7");
160 pythia.readString("36:m0 = 500");
161 pythia.readString("37:m0 = 506");
162 pythia.readString("HiggsHchg:tanBeta = 30");
163 if(strncmp(argv[1], "BBH", 3) == 0) {
164 pythia.readString("HiggsBSM:gg2H2bbbar = on");
165 pythia.readString("35:onMode = 0"); // H2(H_2) decays only to tau-pairs
166 pythia.readString("35:onIfAny = 15");
167 }
168 else {
169 pythia.readString("HiggsBSM:gg2A3bbbar = on");
170 pythia.readString("36:onMode = 0"); // A0(H_3) decays only to tau-pairs
171 pythia.readString("36:onIfAny = 15");
172 }
173 if(strncmp(argv[1], "BBHmh", 5) == 0 ||
174 strncmp(argv[1], "BBAmh", 5) == 0) {
175 pythia.readString("15:onMode = 2"); // tau- decays to muons - second tau decays in all modes
176 pythia.readString("15:onIfAny = 13");
177 }
178 }
179 else if(strncmp(argv[1], "ZZmmbb", 6) == 0)
180 {
181 pythia.readString("WeakDoubleBoson:ffbar2gmZgmZ = on");
182 pythia.readString("23:onMode = 0");
183 pythia.readString("23:onIfAny = 5 13"); // Let the Z decay to bQuarks or muons
184 }
185 else
186 {
187 cerr << "Unknown process type " << argv[1] << " - aborting" << endl;
188 exit(1);
189 }
190 }
191
192 // Initialize pythia
193
194 pythia.init( 2212, 2212, 14000.);
195 pythia.particleData.listAll();
196 Rndm * rndmPtr = &pythia.rndm;
197 rndmPtr->init(runNumber);
198
199 // Pileup pythia
200
201 Pythia pileupPythia;
202 pileupPythia.readString("SoftQCD:minBias = on");
203 pileupPythia.init( 2212, 2212, 14000.);
204 pileupPythia.rndm.init(runNumber);
205
206 // Ultra Fast Simulator
207
208 UltraFastSim ufs;
209 char jobName[256];
210 sprintf(jobName, "%s-PU%3.3d-%4.4d", argv[1], meanPileupEventCount, runNumber);
211 UFSDataStore dataStore(jobName, &ufs);
212
213 // Begin event loop
214 for (int iEvent = 0; iEvent < nEvents; ) {
215
216 // Generate event. Skip if error. List first one.
217 if (!pythia.next()) continue;
218
219 if(iEvent < 10) pythia.event.list();
220
221 // Add pileup
222
223 int pileupEventCount = 0;
224 if(meanPileupEventCount > 0) pileupEventCount = poisson(meanPileupEventCount, rndmPtr);
225 for (int puEvent = 0; puEvent < pileupEventCount; ) {
226 if(!pileupPythia.next()) continue;
227 double vx = rndmPtr->gauss()*2.; // Mean beam spread is 2 mm in x-y and 75 mm in z
228 double vy = rndmPtr->gauss()*2.;
229 double vz = rndmPtr->gauss()*75.;
230 for(int i = 0; i < pileupPythia.event.size(); i++) {
231 Particle& particle = pileupPythia.event[i];
232 particle.xProd(vx+particle.xProd());
233 particle.yProd(vy+particle.yProd());
234 particle.zProd(vz+particle.zProd());
235 if(particle.status() > 0) {
236 if(particle.isVisible()) {
237 if(particle.pT() > 0.5) {
238 pythia.event.append(particle);
239 }
240 }
241 }
242 }
243 puEvent++;
244 }
245
246 // Ultra fast simulation
247
248 if(!ufs.run(pythia.event, rndmPtr))
249 {
250 cerr << "Ultra fast simulation failed - aborting" << endl;
251 exit(1);
252 }
253
254 // Store data
255
256 if(!dataStore.run())
257 {
258 cerr << "Failed to store data" << endl;
259 exit(3);
260 }
261
262 // End of event loop. Statistics. Histogram. Done.
263
264 if(!(iEvent % 100)) cout << "Processed event " << iEvent << endl;
265 iEvent++;
266
267 }
268
269 // Save output
270
271 pythia.statistics();
272 pileupPythia.statistics();
273
274 return 0;
275
276 }