ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/UserCode/dasu/UltraFastSim/generateData.cc
Revision: 1.18
Committed: Wed Nov 2 21:18:08 2011 UTC (13 years, 6 months ago) by dasu
Content type: text/plain
Branch: MAIN
Changes since 1.17: +83 -28 lines
Log Message:
Added invisible higgs + updated to later version of CMSSW

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