All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
Public Member Functions | Private Attributes | List of all members
evgen::ldm::HiggsMakeDecay Class Reference

HiggsMakeDecay class definiton. More...

Inheritance diagram for evgen::ldm::HiggsMakeDecay:
evgen::ldm::IMeVPrtlDecay evgen::ldm::IMeVPrtlStage

Public Member Functions

 HiggsMakeDecay (fhicl::ParameterSet const &pset)
 Constructor. More...
 
 ~HiggsMakeDecay ()
 Destructor. More...
 
void configure (fhicl::ParameterSet const &pset) override
 Interface for configuring the particular algorithm tool. More...
 
bool Decay (const MeVPrtlFlux &flux, const TVector3 &in, const TVector3 &out, MeVPrtlDecay &decay, double &weight) override
 
int RandDaughter (double elec_width, double muon_width, double piplus_width, double pizero_width)
 
double MaxWeight () override
 
- Public Member Functions inherited from evgen::ldm::IMeVPrtlDecay
virtual ~IMeVPrtlDecay () noexcept=default
 Virtual Destructor. More...
 
- Public Member Functions inherited from evgen::ldm::IMeVPrtlStage
virtual ~IMeVPrtlStage () noexcept
 Virtual Destructor. More...
 
 IMeVPrtlStage (const char *name)
 
TVector3 RandomUnitVector ()
 
double GetRandom ()
 
const char * Name ()
 

Private Attributes

double fReferenceRayLength
 
double fReferenceRayDistance
 
double fReferenceHiggsMass
 
double fReferenceHiggsMixing
 
double fReferenceHiggsEnergy
 
double fReferenceHiggsKaonEnergy
 
double fMaxWeight
 
bool fAllowElectronDecay
 
bool fAllowMuonDecay
 
bool fAllowPionDecay
 
bool fAllowPi0Decay
 

Additional Inherited Members

- Protected Member Functions inherited from evgen::ldm::IMeVPrtlDecay
double TimeOfFlight (const MeVPrtlFlux &flux, TVector3 decay)
 
- Protected Attributes inherited from evgen::ldm::IMeVPrtlStage
CLHEP::HepRandomEngine * fEngine
 
const char * fName
 

Detailed Description

HiggsMakeDecay class definiton.

Implementation of model taken from: https://arxiv.org/abs/1909.11670

Definition at line 49 of file HiggsMakeDecay_tool.cc.

Constructor & Destructor Documentation

evgen::ldm::HiggsMakeDecay::HiggsMakeDecay ( fhicl::ParameterSet const &  pset)

Constructor.

Definition at line 149 of file HiggsMakeDecay_tool.cc.

149  :
150  IMeVPrtlStage("HiggsMakeDecay")
151 {
152  this->configure(pset);
153 }
void configure(fhicl::ParameterSet const &pset) override
Interface for configuring the particular algorithm tool.
IMeVPrtlStage(const char *name)
Definition: IMeVPrtlStage.h:46
evgen::ldm::HiggsMakeDecay::~HiggsMakeDecay ( )

Destructor.

Definition at line 157 of file HiggsMakeDecay_tool.cc.

158 {
159 }

Member Function Documentation

void evgen::ldm::HiggsMakeDecay::configure ( fhicl::ParameterSet const &  )
overridevirtual

Interface for configuring the particular algorithm tool.

Parameters
ParameterSetThe input set of parameters for configuration

Implements evgen::ldm::IMeVPrtlStage.

Definition at line 162 of file HiggsMakeDecay_tool.cc.

163 {
164  fReferenceRayLength = pset.get<double>("ReferenceRayLength", -1);
165  fReferenceRayDistance = pset.get<double>("ReferenceRayDistance", 0.);
166  fReferenceHiggsMass = pset.get<double>("ReferenceHiggsMass", -1);
167  fReferenceHiggsMixing = pset.get<double>("ReferenceHiggsMixing", -1);
168  fReferenceHiggsEnergy = pset.get<double>("ReferenceHiggsEnergy", -1);
169  fReferenceHiggsKaonEnergy = pset.get<double>("ReferenceHiggsEnergyFromKaonEnergy", -1.);
170 
171  fAllowElectronDecay = pset.get<bool>("AllowElectronDecay", true);
172  fAllowMuonDecay = pset.get<bool>("AllowMuonDecay", true);
173  fAllowPionDecay = pset.get<bool>("AllowPionDecay", true);
174  fAllowPi0Decay = pset.get<bool>("AllowPi0Decay", true);
175 
176  if (fReferenceHiggsEnergy < 0. && fReferenceHiggsKaonEnergy > 0.) {
179  }
180 
181  // if configured to, divide out some of the decay weight
183  // Get each partial width
188 
189  // total lifetime
190  double lifetime_ns = Constants::Instance().hbar / (width_elec + width_muon + width_piplus + width_pizero);
191 
192  // multiply by gamma*v to get the length
194  double mean_dist = lifetime_ns * gamma_v;
195 
196  // compute the decay weight
198 
199  // Scale by the allowed BR
200  fMaxWeight *= (width_elec*fAllowElectronDecay + width_muon*fAllowMuonDecay + width_piplus*fAllowPionDecay + width_pizero*fAllowPi0Decay) / (width_elec + width_muon + width_piplus + width_pizero);
201 
202  }
203  else {
204  fMaxWeight = -1.;
205  }
206 }
double forcedecay_weight(double mean, double a, double b)
double PiZeroPartialWidth(double higs_mass, double mixing)
double ElectronPartialWidth(double higs_mass, double mixing)
double MuonPartialWidth(double higs_mass, double mixing)
static const Constants & Instance()
Definition: Constants.h:68
double PiPlusPartialWidth(double higs_mass, double mixing)
double forwardPrtlEnergy(double parentM, double secM, double prtlM, double parentE)
Definition: Constants.cpp:212
bool evgen::ldm::HiggsMakeDecay::Decay ( const MeVPrtlFlux flux,
const TVector3 &  in,
const TVector3 &  out,
MeVPrtlDecay decay,
double &  weight 
)
overridevirtual

Implements evgen::ldm::IMeVPrtlDecay.

Definition at line 230 of file HiggsMakeDecay_tool.cc.

230  {
231  // Handle bad mass value
232  if (flux.mass < 2*Constants::Instance().elec_mass) {
233  throw cet::exception("HiggsMakeDecay Tool: BAD MASS. Configured mass (" + std::to_string(flux.mass) +
234  ") is smaller than lowest mass available decay e+e- (" + std::to_string(2*Constants::Instance().elec_mass) +")");
235  }
236 
237  double mixing = flux.C1; // constant-1 saves the mixing
238 
239  // Get each partial width
240  double width_elec = ElectronPartialWidth(flux.mass, mixing);
241  double width_muon = MuonPartialWidth(flux.mass, mixing);
242  double width_piplus = PiPlusPartialWidth(flux.mass, mixing);
243  double width_pizero = PiZeroPartialWidth(flux.mass, mixing);
244 
245  // total lifetime
246  double lifetime_ns = Constants::Instance().hbar / (width_elec + width_muon + width_piplus + width_pizero);
247 
248  // multiply by gamma*v to get the length
249  double mean_dist = lifetime_ns * flux.mom.Gamma() * flux.mom.Beta() * Constants::Instance().c_cm_per_ns;
250 
251  // distance inside detector
252  double in_dist = (flux.pos.Vect() - in).Mag();
253  double out_dist = (flux.pos.Vect() - out).Mag();
254 
255  // compute the decay weight
256  weight = forcedecay_weight(mean_dist, in_dist, out_dist);
257 
258  // if the weight is literally zero, then there is no way in hell
259  // that this higgs is going to decay in the detector -- reject it
260  if (weight == 0) {
261  return false;
262  }
263 
264  // Scale by the allowed BR
265  weight *= (width_elec*fAllowElectronDecay + width_muon*fAllowMuonDecay + width_piplus*fAllowPionDecay + width_pizero*fAllowPi0Decay) / (width_elec + width_muon + width_piplus + width_pizero);
266 
267  // get the decay location
268  double flat_rand = CLHEP::RandFlat::shoot(fEngine, 0, 1.);
269  double decay_rand = flat_to_exp_rand(flat_rand, mean_dist, in_dist, out_dist);
270  TVector3 decay_pos3 = flux.pos.Vect() + decay_rand * (in - flux.pos.Vect()).Unit();
271 
272  // decay time
273  double decay_time = TimeOfFlight(flux, decay_pos3);
274  TLorentzVector decay_pos(decay_pos3, decay_time);
275 
276  // get the decay type
277  int daughter_pdg = RandDaughter(width_elec*fAllowElectronDecay, width_muon*fAllowMuonDecay, width_piplus*fAllowPionDecay, width_pizero*fAllowPi0Decay);
278 
279  double daughter_mass = TDatabasePDG::Instance()->GetParticle(daughter_pdg)->Mass();
280 
281  // daughter mom+energy in the parent rest-frame
282  double daughterE_HRF = flux.mass / 2.;
283  double daughterP_HRF = sqrt(daughterE_HRF * daughterE_HRF - daughter_mass * daughter_mass);
284 
285  // make the two daughters in the higgs rest-frame with a random direction
286  TVector3 pA_HRF = RandomUnitVector() * daughterP_HRF;
287 
288  TVector3 pB_HRF = -pA_HRF;
289 
290  TLorentzVector p4A = TLorentzVector(pA_HRF, daughterE_HRF);
291  TLorentzVector p4B = TLorentzVector(pB_HRF, daughterE_HRF);
292 
293  // Boost
294  p4A.Boost(flux.mom.BoostVector());
295  p4B.Boost(flux.mom.BoostVector());
296 
297  // save the decay info
298  decay.decay_width = width_elec + width_muon + width_piplus + width_pizero;
299  decay.mean_lifetime = lifetime_ns;
300  decay.mean_distance = mean_dist;
301 
302  decay.pos = decay_pos;
303 
304  decay.daughter_mom.push_back(p4A.Vect());
305  decay.daughter_e.push_back(p4A.E());
306  decay.daughter_pdg.push_back(daughter_pdg);
307 
308  decay.daughter_mom.push_back(p4B.Vect());
309  decay.daughter_e.push_back(p4B.E());
310  // daughter B is anti-particle
311  if (daughter_pdg == 111) { // pi0 is its own anti-particle
312  decay.daughter_pdg.push_back(daughter_pdg);
313  }
314  else {
315  decay.daughter_pdg.push_back(-daughter_pdg);
316  }
317 
318  return true;
319 }
double forcedecay_weight(double mean, double a, double b)
double PiZeroPartialWidth(double higs_mass, double mixing)
double ElectronPartialWidth(double higs_mass, double mixing)
CLHEP::HepRandomEngine * fEngine
Definition: IMeVPrtlStage.h:79
double MuonPartialWidth(double higs_mass, double mixing)
static const Constants & Instance()
Definition: Constants.h:68
if &&[-z"$BASH_VERSION"] then echo Attempting to switch to bash bash shellSwitch exit fi &&["$1"= 'shellSwitch'] shift declare a IncludeDirectives for Dir in
std::string to_string(WindowPattern const &pattern)
double PiPlusPartialWidth(double higs_mass, double mixing)
double flat_to_exp_rand(double x, double mean, double a, double b)
double TimeOfFlight(const MeVPrtlFlux &flux, TVector3 decay)
Definition: IMeVPrtlDecay.h:47
int RandDaughter(double elec_width, double muon_width, double piplus_width, double pizero_width)
double evgen::ldm::HiggsMakeDecay::MaxWeight ( )
inlineoverridevirtual

Implements evgen::ldm::IMeVPrtlStage.

Definition at line 67 of file HiggsMakeDecay_tool.cc.

67  {
68  return fMaxWeight;
69  }
int evgen::ldm::HiggsMakeDecay::RandDaughter ( double  elec_width,
double  muon_width,
double  piplus_width,
double  pizero_width 
)

Definition at line 208 of file HiggsMakeDecay_tool.cc.

208  {
209  double total_width = elec_width + muon_width + piplus_width + pizero_width;
210 
211  double flat_rand = CLHEP::RandFlat::shoot(fEngine, 0, 1.);
212 
213  if (flat_rand < elec_width / total_width) {
214  return 11;
215  }
216  else if (flat_rand < (elec_width + muon_width) / total_width) {
217  return 13;
218  }
219  else if (flat_rand < (elec_width + muon_width + piplus_width) / total_width) {
220  return 211;
221  }
222  else {
223  return 111;
224  }
225 
226  // unreachable
227  return -1;
228 }
CLHEP::HepRandomEngine * fEngine
Definition: IMeVPrtlStage.h:79

Member Data Documentation

bool evgen::ldm::HiggsMakeDecay::fAllowElectronDecay
private

Definition at line 81 of file HiggsMakeDecay_tool.cc.

bool evgen::ldm::HiggsMakeDecay::fAllowMuonDecay
private

Definition at line 82 of file HiggsMakeDecay_tool.cc.

bool evgen::ldm::HiggsMakeDecay::fAllowPi0Decay
private

Definition at line 84 of file HiggsMakeDecay_tool.cc.

bool evgen::ldm::HiggsMakeDecay::fAllowPionDecay
private

Definition at line 83 of file HiggsMakeDecay_tool.cc.

double evgen::ldm::HiggsMakeDecay::fMaxWeight
private

Definition at line 79 of file HiggsMakeDecay_tool.cc.

double evgen::ldm::HiggsMakeDecay::fReferenceHiggsEnergy
private

Definition at line 76 of file HiggsMakeDecay_tool.cc.

double evgen::ldm::HiggsMakeDecay::fReferenceHiggsKaonEnergy
private

Definition at line 77 of file HiggsMakeDecay_tool.cc.

double evgen::ldm::HiggsMakeDecay::fReferenceHiggsMass
private

Definition at line 74 of file HiggsMakeDecay_tool.cc.

double evgen::ldm::HiggsMakeDecay::fReferenceHiggsMixing
private

Definition at line 75 of file HiggsMakeDecay_tool.cc.

double evgen::ldm::HiggsMakeDecay::fReferenceRayDistance
private

Definition at line 73 of file HiggsMakeDecay_tool.cc.

double evgen::ldm::HiggsMakeDecay::fReferenceRayLength
private

Definition at line 72 of file HiggsMakeDecay_tool.cc.


The documentation for this class was generated from the following file: