ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/UserCode/dasu/UltraFastSim/generateData.cc
Revision: 1.21
Committed: Tue Jul 31 23:40:10 2012 UTC (12 years, 9 months ago) by dasu
Content type: text/plain
Branch: MAIN
Changes since 1.20: +9 -0 lines
Log Message:
Added ZZTo4L

File Contents

# User Rev Content
1 dasu 1.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 dasu 1.13 #include "UFSDataStore.h"
18 dasu 1.1
19 dasu 1.16 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 dasu 1.1 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 dasu 1.18 float cmEnergy = 14000.;
47 dasu 1.19 bool cutOnMET = false;
48 dasu 1.18 if(argc < 3 || argc > 6)
49 dasu 1.1 {
50 dasu 1.18 cerr << "Command syntax: " << argv[0] << " ZHmmbb[...]" << " <nEvents> [RandomSeed] [meanPileupEventcount] [cmEnergy]" << endl;
51     cerr << "or " << argv[0] << " ZHeebb[...]" << " <nEvents> [RandomSeed] [meanPileupEventcount] [cmEnergy]" << endl;
52     cerr << "or " << argv[0] << " ZHmmXX[...]" << " <nEvents> [RandomSeed] [meanPileupEventcount] [cmEnergy]" << endl;
53     cerr << "or " << argv[0] << " ZHeeXX[...]" << " <nEvents> [RandomSeed] [meanPileupEventcount] [cmEnergy]" << endl;
54     cerr << "or " << argv[0] << " ZZmmbb[...]" << " <nEvents> [RandomSeed] [meanPileupEventcount] [cmEnergy]" << endl;
55     cerr << "or " << argv[0] << " ZZmmnn[...]" << " <nEvents> [RandomSeed] [meanPileupEventcount] [cmEnergy]" << endl;
56     cerr << "or " << argv[0] << " ZZeebb[...]" << " <nEvents> [RandomSeed] [meanPileupEventcount] [cmEnergy]" << endl;
57     cerr << "or " << argv[0] << " ZZeenn[...]" << " <nEvents> [RandomSeed] [meanPileupEventcount] [cmEnergy]" << endl;
58     cerr << "or " << argv[0] << " BBHmh[...] " << " <nEvents> [RandomSeed] [meanPileupEventcount] [cmEnergy]" << endl;
59     cerr << "or " << argv[0] << " BBAmh[...] " << " <nEvents> [RandomSeed] [meanPileupEventcount] [cmEnergy]" << endl;
60 dasu 1.19 cerr << "or " << argv[0] << " VBFHXX[..] " << " <nEvents> [RandomSeed] [meanPileupEventcount] [cmEnergy]" << endl;
61 dasu 1.18 cerr << "or " << argv[0] << " Zee[...] " << " <nEvents> [RandomSeed] [meanPileupEventcount] [cmEnergy]" << endl;
62     cerr << "or " << argv[0] << " Zmm[...] " << " <nEvents> [RandomSeed] [meanPileupEventcount] [cmEnergy]" << endl;
63     cerr << "or " << argv[0] << " Zeh[...] " << " <nEvents> [RandomSeed] [meanPileupEventcount] [cmEnergy]" << endl;
64     cerr << "or " << argv[0] << " Zmh[...] " << " <nEvents> [RandomSeed] [meanPileupEventcount] [cmEnergy]" << endl;
65     cerr << "or " << argv[0] << " Zhh[...] " << " <nEvents> [RandomSeed] [meanPileupEventcount] [cmEnergy]" << endl;
66 dasu 1.19 cerr << "or " << argv[0] << " Znn[...] " << " <nEvents> [RandomSeed] [meanPileupEventcount] [cmEnergy]" << endl;
67 dasu 1.18 cerr << "or " << argv[0] << " Wen[...] " << " <nEvents> [RandomSeed] [meanPileupEventcount] [cmEnergy]" << endl;
68     cerr << "or " << argv[0] << " Wmn[...] " << " <nEvents> [RandomSeed] [meanPileupEventcount] [cmEnergy]" << endl;
69     cerr << "or " << argv[0] << " Ten[...] " << " <nEvents> [RandomSeed] [meanPileupEventcount] [cmEnergy]" << endl;
70     cerr << "or " << argv[0] << " Tmn[...] " << " <nEvents> [RandomSeed] [meanPileupEventcount] [cmEnergy]" << endl;
71     cerr << "or " << argv[0] << " QCD[...] " << " <nEvents> [RandomSeed] [meanPileupEventcount] [cmEnergy]" << endl;
72     cerr << "or " << argv[0] << " QED[...] " << " <nEvents> [RandomSeed] [meanPileupEventcount] [cmEnergy]" << endl;
73     cerr << "or " << argv[0] << " EWK[...] " << " <nEvents> [RandomSeed] [meanPileupEventcount] [cmEnergy]" << endl;
74     cerr << "or " << argv[0] << " Top[...] " << " <nEvents> [RandomSeed] [meanPileupEventcount] [cmEnergy]" << endl;
75 dasu 1.19 cerr << "or " << argv[0] << " QCDMET[...]" << " <nEvents> [RandomSeed] [meanPileupEventcount] [cmEnergy]" << endl;
76     cerr << "or " << argv[0] << " ZnnMET[...]" << " <nEvents> [RandomSeed] [meanPileupEventcount] [cmEnergy]" << endl;
77 dasu 1.21 cerr << "or " << argv[0] << " ZZTo4L[...]" << " <nEvents> [RandomSeed] [meanPileupEventcount] [cmEnergy]" << endl;
78 dasu 1.6 cerr << "In above e-electron, m-muon, h-hadronic tau. n-neutrino" << endl;
79 dasu 1.18 cerr << "QCD, QED, EWK and Top do not specify the decays -- they are useful for generic BG production" << endl;
80 dasu 1.19 cerr << "QCDMET has MET > 50 GeV to make efficient to study QCD MET BG" << endl;
81     cerr << "ZnnMET has MET > 50 GeV to make efficient to study Znn MET BG" << endl;
82 dasu 1.1 exit(1);
83     }
84     else {
85     nEvents = atoi(argv[2]);
86     if(argc >= 4) runNumber = atoi(argv[3]);
87     if(argc >= 5) meanPileupEventCount = atoi(argv[4]);
88 dasu 1.18 if(argc >= 6) cmEnergy = atof(argv[5]);
89 dasu 1.6 if(strncmp(argv[1], "Zee", 3) == 0)
90 dasu 1.1 {
91     pythia.readString("WeakSingleBoson:ffbar2gmZ = on");
92     pythia.readString("PhaseSpace:mHatMin = 60.");
93     pythia.readString("PhaseSpace:mHatMax = -1");
94 dasu 1.6 pythia.readString("23:onMode = 0"); // Z decays to electrons only
95     pythia.readString("23:onIfAny = 11");
96 dasu 1.1 }
97 dasu 1.6 else if(strncmp(argv[1], "Zmm", 3) == 0)
98 dasu 1.3 {
99     pythia.readString("WeakSingleBoson:ffbar2gmZ = on");
100     pythia.readString("PhaseSpace:mHatMin = 60.");
101     pythia.readString("PhaseSpace:mHatMax = -1");
102     pythia.readString("23:onMode = 0"); // Z decays to muons only
103     pythia.readString("23:onIfAny = 13");
104     }
105 dasu 1.19 else if(strncmp(argv[1], "Znn", 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 neutrinos only
111     pythia.readString("23:onIfAny = 12, 14, 16");
112     if(strncmp(argv[1], "ZnnMET", 6) == 0) {
113     cutOnMET = true;
114     }
115     }
116 dasu 1.6 else if(strncmp(argv[1], "Zeh", 3) == 0)
117     {
118     pythia.readString("WeakSingleBoson:ffbar2gmZ = on");
119     pythia.readString("PhaseSpace:mHatMin = 60.");
120     pythia.readString("PhaseSpace:mHatMax = -1");
121     pythia.readString("23:onMode = 0"); // Z decays to taus only
122     pythia.readString("23:onIfAny = 15");
123     pythia.readString("15:onMode = 2"); // tau- decays to electrons - second tau decays in all modes
124     pythia.readString("15:onIfAny = 11");
125     }
126     else if(strncmp(argv[1], "Zmh", 3) == 0)
127     {
128     pythia.readString("WeakSingleBoson:ffbar2gmZ = on");
129     pythia.readString("PhaseSpace:mHatMin = 60.");
130     pythia.readString("PhaseSpace:mHatMax = -1");
131     pythia.readString("23:onMode = 0"); // Z decays to taus only
132     pythia.readString("23:onIfAny = 15");
133     pythia.readString("15:onMode = 2"); // tau- decays to muons - second tau decays in all modes
134     pythia.readString("15:onIfAny = 13");
135     }
136     else if(strncmp(argv[1], "Zhh", 3) == 0)
137     {
138     pythia.readString("WeakSingleBoson:ffbar2gmZ = on");
139     pythia.readString("PhaseSpace:mHatMin = 60.");
140     pythia.readString("PhaseSpace:mHatMax = -1");
141     pythia.readString("23:onMode = 0"); // Z decays to taus only
142     pythia.readString("23:onIfAny = 15");
143     }
144     else if(strncmp(argv[1], "Wen", 3) == 0)
145     {
146     pythia.readString("WeakSingleBoson:ffbar2W = on");
147     pythia.readString("24:onMode = 0"); // W decays to electron
148     pythia.readString("24:onIfAny = 11");
149     }
150     else if(strncmp(argv[1], "Wmn", 3) == 0)
151 dasu 1.1 {
152     pythia.readString("WeakSingleBoson:ffbar2W = on");
153 dasu 1.6 pythia.readString("24:onMode = 0"); // W decays to muon
154     pythia.readString("24:onIfAny = 13");
155 dasu 1.1 }
156 dasu 1.6 else if(strncmp(argv[1], "Ten", 3) == 0)
157 dasu 1.1 {
158     pythia.readString("Top:all = on");
159 dasu 1.6 pythia.readString("24:onMode = 2"); // W+ decays to electron
160     pythia.readString("24:onIfAny = 11");
161 dasu 1.1 }
162 dasu 1.6 else if(strncmp(argv[1], "Tmn", 3) == 0)
163     {
164     pythia.readString("Top:all = on");
165     pythia.readString("24:onMode = 2"); // W+ decays to muon
166     pythia.readString("24:onIfAny = 13");
167     }
168 dasu 1.20 else if(strncmp(argv[1], "HZGamma", 7) == 0)
169     {
170     pythia.readString("HiggsSM:all = on");
171     pythia.readString("25:m0 = 125");
172     pythia.readString("25:onMode = 0"); // Higgs decays to Zgamma only
173     pythia.readString("25:onIfMatch = 22 23");
174     pythia.readString("23:onMode = 0"); // Z decays to light leptons
175     pythia.readString("23:onIfAny = 11 13");
176     }
177 dasu 1.6 else if(strncmp(argv[1], "ZHmmbb", 6) == 0)
178 dasu 1.3 {
179     pythia.readString("HiggsSM:ffbar2HZ = on");
180 dasu 1.20 pythia.readString("25:m0 = 125");
181 dasu 1.3 pythia.readString("25:onMode = 0"); // Higgs decays to bbBar only
182     pythia.readString("25:onIfAny = 5");
183     pythia.readString("23:onMode = 0"); // Z decays to mu+,mu- only (for trigger)
184     pythia.readString("23:onIfAny = 13");
185     }
186 dasu 1.18 else if(strncmp(argv[1], "ZHmmXX", 6) == 0)
187     {
188     pythia.readString("HiggsSM:ffbar2HZ = on");
189 dasu 1.20 pythia.readString("25:m0 = 125");
190 dasu 1.18 pythia.readString("25:mayDecay = false"); // Higgs does not decay -- becomes invisible
191     pythia.readString("25:isVisible = false");
192     pythia.readString("23:onMode = 0"); // Z decays to mu+,mu- only (for trigger)
193     pythia.readString("23:onIfAny = 13");
194     }
195 dasu 1.6 else if(strncmp(argv[1], "ZHeebb", 6) == 0)
196     {
197     pythia.readString("HiggsSM:ffbar2HZ = on");
198 dasu 1.20 pythia.readString("25:m0 = 125");
199 dasu 1.6 pythia.readString("25:onMode = 0"); // Higgs decays to bbBar only
200     pythia.readString("25:onIfAny = 5");
201     pythia.readString("23:onMode = 0"); // Z decays to e+,e- only (for trigger)
202     pythia.readString("23:onIfAny = 11");
203     }
204 dasu 1.18 else if(strncmp(argv[1], "ZHeeXX", 6) == 0)
205     {
206     pythia.readString("HiggsSM:ffbar2HZ = on");
207 dasu 1.20 pythia.readString("25:m0 = 125");
208 dasu 1.18 pythia.readString("25:mayDecay = false"); // Higgs does not decay -- becomes invisible
209     pythia.readString("25:isVisible = false");
210     pythia.readString("23:onMode = 0"); // Z decays to mu+,mu- only (for trigger)
211     pythia.readString("23:onIfAny = 11");
212     }
213 dasu 1.3 else if(strncmp(argv[1], "BB", 2) == 0)
214 dasu 1.1 {
215     pythia.readString("Higgs:useBSM = on");
216 dasu 1.3 pythia.readString("25:m0 = 129");
217     pythia.readString("35:m0 = 499.7");
218     pythia.readString("36:m0 = 500");
219     pythia.readString("37:m0 = 506");
220     pythia.readString("HiggsHchg:tanBeta = 30");
221 dasu 1.6 if(strncmp(argv[1], "BBH", 3) == 0) {
222     pythia.readString("HiggsBSM:gg2H2bbbar = on");
223     pythia.readString("35:onMode = 0"); // H2(H_2) decays only to tau-pairs
224     pythia.readString("35:onIfAny = 15");
225     }
226     else {
227     pythia.readString("HiggsBSM:gg2A3bbbar = on");
228     pythia.readString("36:onMode = 0"); // A0(H_3) decays only to tau-pairs
229     pythia.readString("36:onIfAny = 15");
230     }
231     if(strncmp(argv[1], "BBHmh", 5) == 0 ||
232     strncmp(argv[1], "BBAmh", 5) == 0) {
233     pythia.readString("15:onMode = 2"); // tau- decays to muons - second tau decays in all modes
234     pythia.readString("15:onIfAny = 13");
235     }
236 dasu 1.1 }
237 dasu 1.9 else if(strncmp(argv[1], "ZZmmbb", 6) == 0)
238     {
239 dasu 1.10 pythia.readString("WeakDoubleBoson:ffbar2gmZgmZ = on");
240     pythia.readString("23:onMode = 0");
241     pythia.readString("23:onIfAny = 5 13"); // Let the Z decay to bQuarks or muons
242 dasu 1.9 }
243 dasu 1.21 else if(strncmp(argv[1], "ZZTo4L", 6) == 0)
244     {
245     pythia.readString("WeakDoubleBoson:ffbar2gmZgmZ = on");
246     pythia.readString("PhaseSpace:mHatMin = 60.");// Start way offshell for the ZZ to catch low M4L
247     pythia.readString("PhaseSpace:mHatMax = -1");
248     pythia.readString("23:onMode = 0");
249     pythia.readString("23:onIfAny = 11 13 15"); // Let the Z decay to charged lepton pairs
250     }
251 dasu 1.17 else if(strncmp(argv[1], "ZZmmnn", 6) == 0)
252     {
253     pythia.readString("WeakDoubleBoson:ffbar2gmZgmZ = on");
254     pythia.readString("23:onMode = 0");
255     pythia.readString("23:onIfAny = 13 12 14 16"); // Let the Z decay to muons or neutrinos
256     }
257 dasu 1.18 else if(strncmp(argv[1], "ZZeebb", 6) == 0)
258     {
259     pythia.readString("WeakDoubleBoson:ffbar2gmZgmZ = on");
260     pythia.readString("23:onMode = 0");
261     pythia.readString("23:onIfAny = 5 11"); // Let the Z decay to bQuarks or electrons
262     }
263     else if(strncmp(argv[1], "ZZeenn", 6) == 0)
264     {
265     pythia.readString("WeakDoubleBoson:ffbar2gmZgmZ = on");
266     pythia.readString("23:onMode = 0");
267     pythia.readString("23:onIfAny = 11 12 14 16"); // Let the Z decay to electrons or neutrinos
268     }
269     else if(strncmp(argv[1], "QCD", 3) == 0)
270     {
271     pythia.readString("HardQCD:all = on");
272 dasu 1.19 pythia.readString("PhaseSpace:pTHatMin = 50.");
273     if(strncmp(argv[1], "QCDMET", 6) == 0) {
274     cutOnMET = true;
275     }
276 dasu 1.18 }
277     else if(strcmp(argv[1], "QED") == 0)
278     {
279     pythia.readString("PromptPhoton:all = on");
280     pythia.readString("PhaseSpace:mHatMin = 60.");
281     pythia.readString("PhaseSpace:mHatMax = -1");
282     }
283     else if(strncmp(argv[1], "EWK", 3) == 0)
284     {
285     pythia.readString("WeakSingleBoson:all = on");
286     pythia.readString("PhaseSpace:mHatMin = 60.");
287     pythia.readString("PhaseSpace:mHatMax = -1");
288     pythia.readString("WeakDoubleBoson:all = on");
289     }
290     else if(strncmp(argv[1], "Top", 3) == 0)
291     {
292     pythia.readString("Top:all = on");
293     }
294 dasu 1.19 else if(strncmp(argv[1], "VBFHXX", 6) == 0)
295     {
296     pythia.readString("HiggsSM:ff2Hff(t:ZZ) = on");
297     pythia.readString("HiggsSM:ff2Hff(t:WW) = on");
298 dasu 1.20 pythia.readString("25:m0 = 125");
299 dasu 1.19 pythia.readString("25:mayDecay = false"); // Higgs does not decay -- becomes invisible
300     pythia.readString("25:isVisible = false");
301     }
302 dasu 1.18 else
303 dasu 1.17 {
304 dasu 1.18 cerr << "Unknown process type " << argv[1] << " - aborting" << endl;
305     exit(1);
306 dasu 1.17 }
307 dasu 1.1 }
308    
309     // Initialize pythia
310    
311 dasu 1.18 pythia.init(2212, 2212, cmEnergy);
312 dasu 1.1 pythia.particleData.listAll();
313     Rndm * rndmPtr = &pythia.rndm;
314     rndmPtr->init(runNumber);
315    
316     // Pileup pythia
317    
318     Pythia pileupPythia;
319     pileupPythia.readString("SoftQCD:minBias = on");
320     pileupPythia.init( 2212, 2212, 14000.);
321     pileupPythia.rndm.init(runNumber);
322    
323     // Ultra Fast Simulator
324    
325 dasu 1.14 UltraFastSim ufs;
326 dasu 1.15 char jobName[256];
327 dasu 1.16 sprintf(jobName, "%s-PU%3.3d-%4.4d", argv[1], meanPileupEventCount, runNumber);
328 dasu 1.15 UFSDataStore dataStore(jobName, &ufs);
329 dasu 1.1
330     // Begin event loop
331     for (int iEvent = 0; iEvent < nEvents; ) {
332    
333     // Generate event. Skip if error. List first one.
334     if (!pythia.next()) continue;
335    
336 dasu 1.4 if(iEvent < 10) pythia.event.list();
337    
338 dasu 1.1 // Add pileup
339    
340     int pileupEventCount = 0;
341 dasu 1.16 if(meanPileupEventCount > 0) pileupEventCount = poisson(meanPileupEventCount, rndmPtr);
342 dasu 1.1 for (int puEvent = 0; puEvent < pileupEventCount; ) {
343     if(!pileupPythia.next()) continue;
344 dasu 1.11 double vx = rndmPtr->gauss()*2.; // Mean beam spread is 2 mm in x-y and 75 mm in z
345     double vy = rndmPtr->gauss()*2.;
346     double vz = rndmPtr->gauss()*75.;
347 dasu 1.1 for(int i = 0; i < pileupPythia.event.size(); i++) {
348     Particle& particle = pileupPythia.event[i];
349 dasu 1.11 particle.xProd(vx+particle.xProd());
350     particle.yProd(vy+particle.yProd());
351     particle.zProd(vz+particle.zProd());
352 dasu 1.1 if(particle.status() > 0) {
353     if(particle.isVisible()) {
354     if(particle.pT() > 0.5) {
355     pythia.event.append(particle);
356     }
357     }
358     }
359     }
360     puEvent++;
361     }
362    
363     // Ultra fast simulation
364    
365 dasu 1.14 if(!ufs.run(pythia.event, rndmPtr))
366 dasu 1.1 {
367     cerr << "Ultra fast simulation failed - aborting" << endl;
368     exit(1);
369     }
370    
371 dasu 1.19 // If necessary, check MET and decide to store or not
372    
373     bool doStore = true;
374     if(cutOnMET) {
375     double MET = ufs.getMET().Pt();
376     if(MET < 50.) {
377     doStore = false;
378     }
379     }
380 dasu 1.13 // Store data
381 dasu 1.5
382 dasu 1.19 if(doStore && !dataStore.run())
383 dasu 1.5 {
384 dasu 1.13 cerr << "Failed to store data" << endl;
385     exit(3);
386 dasu 1.5 }
387    
388 dasu 1.1 // End of event loop. Statistics. Histogram. Done.
389    
390     if(!(iEvent % 100)) cout << "Processed event " << iEvent << endl;
391     iEvent++;
392    
393     }
394    
395     // Save output
396    
397     pythia.statistics();
398     pileupPythia.statistics();
399    
400     return 0;
401    
402     }