CMS 3D CMS Logo

CosMuoGenProducer.cc
Go to the documentation of this file.
1 
4 
8 
10 
12  : //RanS(pset.getParameter<int>("RanSeed", 123456)), //get seed now from Framework
13  MinP(pset.getParameter<double>("MinP")),
14  MinP_CMS(pset.getParameter<double>("MinP_CMS")),
15  MaxP(pset.getParameter<double>("MaxP")),
16  MinT(pset.getParameter<double>("MinTheta")),
17  MaxT(pset.getParameter<double>("MaxTheta")),
18  MinPh(pset.getParameter<double>("MinPhi")),
19  MaxPh(pset.getParameter<double>("MaxPhi")),
20  MinS(pset.getParameter<double>("MinT0")),
21  MaxS(pset.getParameter<double>("MaxT0")),
22  ELSF(pset.getParameter<double>("ElossScaleFactor")),
23  RTarget(pset.getParameter<double>("RadiusOfTarget")),
24  ZTarget(pset.getParameter<double>("ZDistOfTarget")),
25  ZCTarget(pset.getParameter<double>("ZCentrOfTarget")),
26  TrackerOnly(pset.getParameter<bool>("TrackerOnly")),
27  MultiMuon(pset.getParameter<bool>("MultiMuon")),
28  MultiMuonFileName(pset.getParameter<std::string>("MultiMuonFileName")),
29  MultiMuonFileFirstEvent(pset.getParameter<int>("MultiMuonFileFirstEvent")),
30  MultiMuonNmin(pset.getParameter<int>("MultiMuonNmin")),
31  TIFOnly_constant(pset.getParameter<bool>("TIFOnly_constant")),
32  TIFOnly_linear(pset.getParameter<bool>("TIFOnly_linear")),
33  MTCCHalf(pset.getParameter<bool>("MTCCHalf")),
34  PlugVtx(pset.getParameter<double>("PlugVx")),
35  PlugVtz(pset.getParameter<double>("PlugVz")),
36  VarRhoAir(pset.getParameter<double>("RhoAir")),
37  VarRhoWall(pset.getParameter<double>("RhoWall")),
38  VarRhoRock(pset.getParameter<double>("RhoRock")),
39  VarRhoClay(pset.getParameter<double>("RhoClay")),
40  VarRhoPlug(pset.getParameter<double>("RhoPlug")),
41  ClayLayerWidth(pset.getParameter<double>("ClayWidth")),
42  MinEn(pset.getParameter<double>("MinEnu")),
43  MaxEn(pset.getParameter<double>("MaxEnu")),
44  NuPrdAlt(pset.getParameter<double>("NuProdAlt")),
45  AllMu(pset.getParameter<bool>("AcptAllMu")),
46  extCrossSect(pset.getUntrackedParameter<double>("crossSection", -1.)),
47  extFilterEff(pset.getUntrackedParameter<double>("filterEfficiency", -1.)),
48  cmVerbosity_(pset.getParameter<bool>("Verbosity")),
49  isInitialized_(false) {
50  //if not specified (i.e. negative) then use MinP also for MinP_CMS
51  if (MinP_CMS < 0)
52  MinP_CMS = MinP;
53 
54  // set up the generator
55  CosMuoGen = std::make_unique<CosmicMuonGenerator>();
56  // Begin JMM change
57  // CosMuoGen->setNumberOfEvents(numberEventsInRun());
58  CosMuoGen->setNumberOfEvents(999999999);
59  // End of JMM change
60  CosMuoGen->setRanSeed(RanS);
61  CosMuoGen->setMinP(MinP);
62  CosMuoGen->setMinP_CMS(MinP_CMS);
63  CosMuoGen->setMaxP(MaxP);
64  CosMuoGen->setMinTheta(MinT);
65  CosMuoGen->setMaxTheta(MaxT);
66  CosMuoGen->setMinPhi(MinPh);
67  CosMuoGen->setMaxPhi(MaxPh);
68  CosMuoGen->setMinT0(MinS);
69  CosMuoGen->setMaxT0(MaxS);
70  CosMuoGen->setElossScaleFactor(ELSF);
71  CosMuoGen->setRadiusOfTarget(RTarget);
72  CosMuoGen->setZDistOfTarget(ZTarget);
73  CosMuoGen->setZCentrOfTarget(ZCTarget);
74  CosMuoGen->setTrackerOnly(TrackerOnly);
75  CosMuoGen->setMultiMuon(MultiMuon);
76  CosMuoGen->setMultiMuonFileName(MultiMuonFileName);
77  CosMuoGen->setMultiMuonFileFirstEvent(MultiMuonFileFirstEvent);
78  CosMuoGen->setMultiMuonNmin(MultiMuonNmin);
79  CosMuoGen->setTIFOnly_constant(TIFOnly_constant);
80  CosMuoGen->setTIFOnly_linear(TIFOnly_linear);
81  CosMuoGen->setMTCCHalf(MTCCHalf);
82  CosMuoGen->setPlugVx(PlugVtx);
83  CosMuoGen->setPlugVz(PlugVtz);
84  CosMuoGen->setRhoAir(VarRhoAir);
85  CosMuoGen->setRhoWall(VarRhoWall);
86  CosMuoGen->setRhoRock(VarRhoRock);
87  CosMuoGen->setRhoClay(VarRhoClay);
88  CosMuoGen->setRhoPlug(VarRhoPlug);
89  CosMuoGen->setClayWidth(ClayLayerWidth);
90  CosMuoGen->setMinEnu(MinEn);
91  CosMuoGen->setMaxEnu(MaxEn);
92  CosMuoGen->setNuProdAlt(NuPrdAlt);
93  CosMuoGen->setAcptAllMu(AllMu);
94  produces<HepMCProduct>("unsmeared");
95  produces<GenEventInfoProduct>();
96  produces<GenRunInfoProduct, edm::Transition::EndRun>();
97 }
98 
100 
102  if (!isInitialized_) {
103  isInitialized_ = true;
104  RandomEngineSentry<CosmicMuonGenerator> randomEngineSentry(CosMuoGen.get(), lumi.index());
105  CosMuoGen->initialize(randomEngineSentry.randomEngine());
106  }
107 }
108 
110  std::unique_ptr<GenRunInfoProduct> genRunInfo(new GenRunInfoProduct());
111 
112  double cs = CosMuoGen->getRate(); // flux in Hz, not s^-1m^-2
113  if (MultiMuon)
114  genRunInfo->setInternalXSec(0.);
115  else
116  genRunInfo->setInternalXSec(cs);
117  genRunInfo->setExternalXSecLO(extCrossSect);
118  genRunInfo->setFilterEfficiency(extFilterEff);
119 
120  run.put(std::move(genRunInfo));
121 
122  CosMuoGen->terminate();
123 }
124 
126 
128  RandomEngineSentry<CosmicMuonGenerator> randomEngineSentry(CosMuoGen.get(), e.streamID());
129 
130  // generate event
131  if (!MultiMuon) {
132  CosMuoGen->nextEvent();
133  } else {
134  bool success = CosMuoGen->nextMultiEvent();
135  if (!success)
136  std::cout << "CosMuoGenProducer.cc: CosMuoGen->nextMultiEvent() failed!" << std::endl;
137  }
138 
139  if (Debug) {
140  std::cout << "CosMuoGenProducer.cc: CosMuoGen->EventWeight=" << CosMuoGen->EventWeight
141  << " CosMuoGen: Nmuons=" << CosMuoGen->Id_sf.size() << std::endl;
142  std::cout << "CosMuoGen->Id_at=" << CosMuoGen->Id_at << " CosMuoGen->Vx_at=" << CosMuoGen->Vx_at
143  << " CosMuoGen->Vy_at=" << CosMuoGen->Vy_at << " CosMuoGen->Vz_at=" << CosMuoGen->Vz_at
144  << " CosMuoGen->T0_at=" << CosMuoGen->T0_at << std::endl;
145  std::cout << " Px=" << CosMuoGen->Px_at << " Py=" << CosMuoGen->Py_at << " Pz=" << CosMuoGen->Pz_at << std::endl;
146  for (unsigned int i = 0; i < CosMuoGen->Id_sf.size(); ++i) {
147  std::cout << "Id_sf[" << i << "]=" << CosMuoGen->Id_sf[i] << " Vx_sf[" << i << "]=" << CosMuoGen->Vx_sf[i]
148  << " Vy_sf=" << CosMuoGen->Vy_sf[i] << " Vz_sf=" << CosMuoGen->Vz_sf[i]
149  << " T0_sf=" << CosMuoGen->T0_sf[i] << " Px_sf=" << CosMuoGen->Px_sf[i]
150  << " Py_sf=" << CosMuoGen->Py_sf[i] << " Pz_sf=" << CosMuoGen->Pz_sf[i] << std::endl;
151  std::cout << "phi_sf=" << atan2(CosMuoGen->Px_sf[i], CosMuoGen->Pz_sf[i]) << std::endl;
152  std::cout << "Id_ug[" << i << "]=" << CosMuoGen->Id_ug[i] << " Vx_ug[" << i << "]=" << CosMuoGen->Vx_ug[i]
153  << " Vy_ug=" << CosMuoGen->Vy_ug[i] << " Vz_ug=" << CosMuoGen->Vz_ug[i]
154  << " T0_ug=" << CosMuoGen->T0_ug[i] << " Px_ug=" << CosMuoGen->Px_ug[i]
155  << " Py_ug=" << CosMuoGen->Py_ug[i] << " Pz_ug=" << CosMuoGen->Pz_ug[i] << std::endl;
156  std::cout << "phi_ug=" << atan2(CosMuoGen->Px_ug[i], CosMuoGen->Pz_ug[i]) << std::endl;
157  ;
158  }
159  }
160 
161  auto fEvt = std::make_unique<HepMC::GenEvent>();
162 
163  HepMC::GenVertex* Vtx_at = new HepMC::GenVertex(HepMC::FourVector(CosMuoGen->Vx_at, //[mm]
164  CosMuoGen->Vy_at, //[mm]
165  CosMuoGen->Vz_at, //[mm]
166  CosMuoGen->T0_at)); //[mm]
167  //cout << "CosMuoGenProducer.cc: Vy_at=" << CosMuoGen->Vy_at << endl;
168  HepMC::FourVector p_at(CosMuoGen->Px_at, CosMuoGen->Py_at, CosMuoGen->Pz_at, CosMuoGen->E_at);
169  HepMC::GenParticle* Part_at = new HepMC::GenParticle(p_at, CosMuoGen->Id_at, 3); //Comment mother particle in
170  Vtx_at->add_particle_in(Part_at);
171 
172  //loop here in case of multi muon events (else just one iteration)
173  for (unsigned int i = 0; i < CosMuoGen->Id_sf.size(); ++i) {
174  HepMC::FourVector p_sf(CosMuoGen->Px_sf[i], CosMuoGen->Py_sf[i], CosMuoGen->Pz_sf[i], CosMuoGen->E_sf[i]);
175  HepMC::GenParticle* Part_sf_in = new HepMC::GenParticle(p_sf, CosMuoGen->Id_sf[i], 3); //Comment daughter particle
176  Vtx_at->add_particle_out(Part_sf_in);
177 
178  HepMC::GenVertex* Vtx_sf = new HepMC::GenVertex(
179  HepMC::FourVector(CosMuoGen->Vx_sf[i], CosMuoGen->Vy_sf[i], CosMuoGen->Vz_sf[i], CosMuoGen->T0_sf[i])); //[mm]
180  HepMC::GenParticle* Part_sf_out = new HepMC::GenParticle(p_sf, CosMuoGen->Id_sf[i], 3); //Comment daughter particle
181 
182  Vtx_sf->add_particle_in(Part_sf_in);
183  Vtx_sf->add_particle_out(Part_sf_out);
184 
185  fEvt->add_vertex(Vtx_sf); //one per muon
186 
187  HepMC::GenVertex* Vtx_ug = new HepMC::GenVertex(
188  HepMC::FourVector(CosMuoGen->Vx_ug[i], CosMuoGen->Vy_ug[i], CosMuoGen->Vz_ug[i], CosMuoGen->T0_ug[i])); //[mm]
189 
190  HepMC::FourVector p_ug(CosMuoGen->Px_ug[i], CosMuoGen->Py_ug[i], CosMuoGen->Pz_ug[i], CosMuoGen->E_ug[i]);
191  HepMC::GenParticle* Part_ug = new HepMC::GenParticle(p_ug, CosMuoGen->Id_ug[i], 1); //Final state daughter particle
192 
193  Vtx_ug->add_particle_in(Part_sf_out);
194  Vtx_ug->add_particle_out(Part_ug);
195 
196  fEvt->add_vertex(Vtx_ug); //one per muon
197  }
198 
199  fEvt->add_vertex(Vtx_at);
200  fEvt->set_signal_process_vertex(Vtx_at);
201 
202  fEvt->set_event_number(e.id().event());
203  fEvt->set_signal_process_id(13);
204 
205  fEvt->weights().push_back(CosMuoGen->EventWeight); // just one event weight
206  fEvt->weights().push_back(CosMuoGen->Trials); // int Trials number (unweighted)
207 
208  if (cmVerbosity_)
209  fEvt->print();
210 
211  std::unique_ptr<GenEventInfoProduct> genEventInfo(new GenEventInfoProduct(fEvt.get()));
212  e.put(std::move(genEventInfo));
213 
214  //This causes fEvt to be deleted
215  std::unique_ptr<HepMCProduct> CMProduct(new HepMCProduct());
216  CMProduct->addHepMCData(fEvt.release());
217  e.put(std::move(CMProduct), "unsmeared");
218 }
void endRunProduce(Run &r, const EventSetup &es) override
std::unique_ptr< CosmicMuonGenerator > CosMuoGen
CosMuoGenProducer(const ParameterSet &)
void produce(Event &e, const EventSetup &es) override
void beginLuminosityBlock(LuminosityBlock const &, EventSetup const &) override
MaxP
negative means MinP_CMS = MinP.
void clear(EGIsoObj &c)
Definition: egamma.h:82
const bool Debug
def move(src, dest)
Definition: eostools.py:511
Definition: Run.h:45