JHUGen MELA  v2.4.1
Matrix element calculations as used in JHUGen. MELA is an important tool that was used for the Higgs boson discovery and for precise measurements of its structure and interactions. Please see the website https://spin.pha.jhu.edu/ and papers cited there for more details, and kindly cite those papers when using this code.
TUtil.cc
Go to the documentation of this file.
1 #include <iostream>
2 #include <cstdio>
3 #include <cmath>
4 #include <iterator>
5 #include <utility>
6 #include <algorithm>
7 #include <cassert>
8 #include "MELAStreamHelpers.hh"
9 #include "TJHUGenUtils.hh"
10 #include "TUtilHelpers.hh"
11 #include "TUtil.hh"
12 #include "TMath.h"
13 #include "TLorentzRotation.h"
14 
15 
16 using namespace std;
21 using namespace TJHUGenUtils;
22 
23 
24 namespace TUtil{
25  bool forbidMassiveLeptons = true;
26  bool forbidMassiveJets = true;
29 }
30 
31 /***************************************************/
32 /***** Scripts for decay and production angles *****/
33 /***************************************************/
34 
39 void TUtil::constrainedRemovePairMass(TLorentzVector& p1, TLorentzVector& p2, double m1, double m2){
40  TLorentzVector const nullFourVector(0, 0, 0, 0);
41  TLorentzVector p1hat, p2hat;
42  if (p1==nullFourVector || p2==nullFourVector) return;
43 
44  /***** shiftMass in C++ *****/
45  TLorentzVector p12=p1+p2;
46  TLorentzVector diffp2p1=p2-p1;
47  double p1sq = p1.M2();
48  double p2sq = p2.M2();
49  double p1p2 = p1.Dot(p2);
50  double m1sq = m1*fabs(m1);
51  double m2sq = m2*fabs(m2);
52  double p12sq = p12.M2();
53 
54  TLorentzVector avec=(p1sq*p2 - p2sq*p1 + p1p2*diffp2p1);
55  double a = avec.M2();
56  double b = (p12sq + m2sq - m1sq) * (pow(p1p2, 2) - p1sq*p2sq);
57  double c = pow((p12sq + m2sq - m1sq), 2)*p1sq/4. - pow((p1sq + p1p2), 2)*m2sq;
58  double eta = (-b - sqrt(fabs(b*b -4.*a*c)))/(2.*a);
59  double xi = (p12sq + m2sq - m1sq - 2.*eta*(p2sq + p1p2))/(2.*(p1sq + p1p2));
60 
61  p1hat = (1.-xi)*p1 + (1.-eta)*p2;
62  p2hat = xi*p1 + eta*p2;
63  p1=p1hat;
64  p2=p2hat;
65 }
66 void TUtil::scaleMomentumToEnergy(const TLorentzVector& massiveJet, TLorentzVector& masslessJet, double mass){
67  double energy, p3, newp3, ratio;
68  energy = massiveJet.T();
69  p3 = massiveJet.P();
70  newp3 = sqrt(max(pow(energy, 2)-mass*fabs(mass), 0.));
71  ratio = (p3>0. ? (newp3/p3) : 1.);
72  masslessJet.SetXYZT(massiveJet.X()*ratio, massiveJet.Y()*ratio, massiveJet.Z()*ratio, energy);
73 }
74 std::pair<TLorentzVector, TLorentzVector> TUtil::removeMassFromPair(
75  TLorentzVector const& jet1, int const& jet1Id,
76  TLorentzVector const& jet2, int const& jet2Id,
77  double m1, double m2
78  ){
79  TLorentzVector const nullFourVector(0, 0, 0, 0);
80  TLorentzVector jet1massless(0, 0, 0, 0), jet2massless(0, 0, 0, 0);
81 
82  if (
84  &&
85  ((PDGHelpers::isAJet(jet1Id) && !PDGHelpers::isATopQuark(jet1Id)) || (PDGHelpers::isAJet(jet2Id) && !PDGHelpers::isATopQuark(jet2Id)))
86  ){
88  jet1massless=jet1;
89  jet2massless=jet2;
90  }
91  else if (jet1==nullFourVector || jet2==nullFourVector || jet1==jet2 || JetMassScheme==TVar::MomentumToEnergy){
92  TUtil::scaleMomentumToEnergy(jet1, jet1massless, m1);
93  TUtil::scaleMomentumToEnergy(jet2, jet2massless, m2);
94  }
96  jet1massless=jet1;
97  jet2massless=jet2;
98  TUtil::constrainedRemovePairMass(jet1massless, jet2massless, m1, m2);
99  }
100  else{
101  jet1massless=jet1;
102  jet2massless=jet2;
103  }
104  }
107  jet1massless=jet1;
108  jet2massless=jet2;
109  }
110  else if (jet1==nullFourVector || jet2==nullFourVector || jet1==jet2 || LeptonMassScheme==TVar::MomentumToEnergy){
111  TUtil::scaleMomentumToEnergy(jet1, jet1massless, m1);
112  TUtil::scaleMomentumToEnergy(jet2, jet2massless, m2);
113  }
115  jet1massless=jet1;
116  jet2massless=jet2;
117  TUtil::constrainedRemovePairMass(jet1massless, jet2massless, m1, m2);
118  }
119  else{
120  jet1massless=jet1;
121  jet2massless=jet2;
122  }
123  }
124  else{
125  jet1massless=jet1;
126  jet2massless=jet2;
127  }
128 
129  pair<TLorentzVector, TLorentzVector> result(jet1massless, jet2massless);
130  return result;
131 }
132 void TUtil::adjustTopDaughters(SimpleParticleCollection_t& daughters){ // Daughters are arranged as b, Wf, Wfb
133  if (daughters.size()!=3) return; // Cannot work if the number of daughters is not exactly 3.
134  pair<TLorentzVector, TLorentzVector> corrWpair = TUtil::removeMassFromPair(
135  daughters.at(1).second, daughters.at(1).first,
136  daughters.at(2).second, daughters.at(2).first
137  );
138  daughters.at(1).second = corrWpair.first;
139  daughters.at(2).second = corrWpair.second;
140  TLorentzVector pW = daughters.at(1).second+daughters.at(2).second;
141  TVector3 pW_boost_old = -pW.BoostVector();
142  pair<TLorentzVector, TLorentzVector> corrbW = TUtil::removeMassFromPair(
143  daughters.at(0).second, daughters.at(0).first,
144  pW, -daughters.at(0).first, // Trick the function
145  0., pW.M() // Conserve W mass, ensures Wf+Wfb=W after re-boosting Wf and Wfb to the new W frame.
146  );
147  daughters.at(0).second=corrbW.first;
148  pW=corrbW.second;
149  TVector3 pW_boost_new = pW.BoostVector();
150  for (unsigned int idau=1; idau<daughters.size(); idau++){
151  daughters.at(idau).second.Boost(pW_boost_old);
152  daughters.at(idau).second.Boost(pW_boost_new);
153  }
154 }
155 // Compute a fake jet
156 void TUtil::computeFakeJet(TLorentzVector const& realJet, TLorentzVector const& others, TLorentzVector& fakeJet){
157  TLorentzVector masslessRealJet(0, 0, 0, 0);
158  if (TUtil::forbidMassiveJets) TUtil::scaleMomentumToEnergy(realJet, masslessRealJet);
159  else masslessRealJet = realJet;
160  fakeJet = others + masslessRealJet;
161  fakeJet.SetVect(-fakeJet.Vect());
162  fakeJet.SetE(fakeJet.P());
163 }
164 
165 /***** Complex Boost *****/
166 std::pair<TLorentzVector, TLorentzVector> TUtil::ComplexBoost(TVector3 const& beta, TLorentzVector const& p4){
167  double bx=beta.X();
168  double by=beta.Y();
169  double bz=beta.Z();
170  double b2 = bx*bx + by*by + bz*bz;
171  double gammasqinv = 1.-b2;
172  double gamma=0.;
173 
174  double bp = bx*p4.X() + by*p4.Y() + bz*p4.Z();
175  double gammap_real=0;
176  double gammap_imag=0;
177  TLorentzVector p4new_real(0, 0, 0, 0), p4new_imag(0, 0, 0, 0);
178  if (gammasqinv>0.){
179  gamma = 1./sqrt(gammasqinv);
180  if (b2>0.) gammap_real = (gamma-1.)/b2;
181 
182  p4new_real.SetX(p4.X() + gammap_real*bp*bx + gamma*bx*p4.T());
183  p4new_real.SetY(p4.Y() + gammap_real*bp*by + gamma*by*p4.T());
184  p4new_real.SetZ(p4.Z() + gammap_real*bp*bz + gamma*bz*p4.T());
185  p4new_real.SetT(gamma*(p4.T() + bp));
186  }
187  else if (gammasqinv<0.){
188  gamma = -1./sqrt(-gammasqinv);
189  if (b2>0.){
190  gammap_real = -1./b2;
191  gammap_imag = gamma/b2;
192  }
193 
194  p4new_real.SetX(p4.X() + gammap_real*bp*bx);
195  p4new_real.SetY(p4.Y() + gammap_real*bp*by);
196  p4new_real.SetZ(p4.Z() + gammap_real*bp*bz);
197  p4new_real.SetT(0.);
198  p4new_imag.SetX(gammap_imag*bp*bx + gamma*bx*p4.T());
199  p4new_imag.SetY(gammap_imag*bp*by + gamma*by*p4.T());
200  p4new_imag.SetZ(gammap_imag*bp*bz + gamma*bz*p4.T());
201  p4new_imag.SetT(gamma*(p4.T() + bp));
202  }
203 
204  return (pair<TLorentzVector, TLorentzVector>(p4new_real, p4new_imag));
205 }
206 
207 /***** Decay angles *****/
209  float& costhetastar,
210  float& costheta1,
211  float& costheta2,
212  float& Phi,
213  float& Phi1,
214  TLorentzVector p4M11, int Z1_lept1Id,
215  TLorentzVector p4M12, int Z1_lept2Id,
216  TLorentzVector p4M21, int Z2_lept1Id,
217  TLorentzVector p4M22, int Z2_lept2Id
218  ){
219  TLorentzVector const nullFourVector(0, 0, 0, 0);
220  if (p4M12==nullFourVector || p4M22==nullFourVector){
221  pair<TLorentzVector, TLorentzVector> f13Pair = TUtil::removeMassFromPair(p4M11, Z1_lept1Id, p4M21, Z2_lept1Id);
222  p4M11 = f13Pair.first;
223  p4M21 = f13Pair.second;
224  }
225  else if (p4M11==nullFourVector || p4M21==nullFourVector){
226  pair<TLorentzVector, TLorentzVector> f24Pair = TUtil::removeMassFromPair(p4M12, Z1_lept2Id, p4M22, Z2_lept2Id);
227  p4M12 = f24Pair.first;
228  p4M22 = f24Pair.second;
229  }
230  else{
231  pair<TLorentzVector, TLorentzVector> f12Pair = TUtil::removeMassFromPair(p4M11, Z1_lept1Id, p4M12, Z1_lept2Id);
232  pair<TLorentzVector, TLorentzVector> f34Pair = TUtil::removeMassFromPair(p4M21, Z2_lept1Id, p4M22, Z2_lept2Id);
233  p4M11 = f12Pair.first;
234  p4M12 = f12Pair.second;
235  p4M21 = f34Pair.first;
236  p4M22 = f34Pair.second;
237  }
238 
239  //build Z 4-vectors
240  TLorentzVector p4Z1 = p4M11 + p4M12;
241  TLorentzVector p4Z2 = p4M21 + p4M22;
242 
243  // Sort Z1 leptons so that...
244  if (
245  Z1_lept2Id!=-9000
246  &&
247  (
248  (Z1_lept1Id*Z1_lept2Id<0 && Z1_lept1Id<0) // ...for OS pairs, lep1 is the particle.
249  ||
250  ((Z1_lept1Id*Z1_lept2Id>0 || (Z1_lept1Id==0 && Z1_lept2Id==0)) && p4M11.Phi()<=p4M12.Phi()) // ...for SS pairs, a random deterministic convention is used.
251  )
252  ) swap(p4M11, p4M12);
253  // Same for Z2 leptons
254  if (
255  Z2_lept2Id!=-9000
256  &&
257  (
258  (Z2_lept1Id*Z2_lept2Id<0 && Z2_lept1Id<0)
259  ||
260  ((Z2_lept1Id*Z2_lept2Id>0 || (Z2_lept1Id==0 && Z2_lept2Id==0)) && p4M21.Phi()<=p4M22.Phi())
261  )
262  ) swap(p4M21, p4M22);
263 
264  // BEGIN THE CALCULATION
265 
266  // build H 4-vectors
267  TLorentzVector p4H = p4Z1 + p4Z2;
268 
269  // -----------------------------------
270 
272  TVector3 boostX = -(p4H.BoostVector());
273  TLorentzVector thep4Z1inXFrame(p4Z1);
274  TLorentzVector thep4Z2inXFrame(p4Z2);
275  thep4Z1inXFrame.Boost(boostX);
276  thep4Z2inXFrame.Boost(boostX);
277  TVector3 theZ1X_p3 = thep4Z1inXFrame.Vect();
278  TVector3 theZ2X_p3 = thep4Z2inXFrame.Vect();
279  costhetastar = theZ1X_p3.CosTheta();
280 
281  TVector3 boostV1(0, 0, 0);
282  TVector3 boostV2(0, 0, 0);
284  if (!(fabs(Z1_lept1Id)==21 || fabs(Z1_lept1Id)==22 || fabs(Z1_lept2Id)==21 || fabs(Z1_lept2Id)==22)){
285  boostV1 = -(p4Z1.BoostVector());
286  if (boostV1.Mag()>=1.) {
287  MELAout << "Warning: Mela::computeAngles: Z1 boost with beta=1, scaling down" << endl;
288  boostV1*=0.9999/boostV1.Mag();
289  }
290  TLorentzVector p4M11_BV1(p4M11);
291  TLorentzVector p4M12_BV1(p4M12);
292  TLorentzVector p4M21_BV1(p4M21);
293  TLorentzVector p4M22_BV1(p4M22);
294  p4M11_BV1.Boost(boostV1);
295  p4M12_BV1.Boost(boostV1);
296  p4M21_BV1.Boost(boostV1);
297  p4M22_BV1.Boost(boostV1);
298 
299  TLorentzVector p4V2_BV1 = p4M21_BV1 + p4M22_BV1;
301  costheta1 = -p4V2_BV1.Vect().Unit().Dot(p4M11_BV1.Vect().Unit());
302  }
303  else costheta1 = 0;
304 
306  if (!(fabs(Z2_lept1Id)==21 || fabs(Z2_lept1Id)==22 || fabs(Z2_lept2Id)==21 || fabs(Z2_lept2Id)==22)){
307  boostV2 = -(p4Z2.BoostVector());
308  if (boostV2.Mag()>=1.) {
309  MELAout << "Warning: Mela::computeAngles: Z2 boost with beta=1, scaling down" << endl;
310  boostV2*=0.9999/boostV2.Mag();
311  }
312  TLorentzVector p4M11_BV2(p4M11);
313  TLorentzVector p4M12_BV2(p4M12);
314  TLorentzVector p4M21_BV2(p4M21);
315  TLorentzVector p4M22_BV2(p4M22);
316  p4M11_BV2.Boost(boostV2);
317  p4M12_BV2.Boost(boostV2);
318  p4M21_BV2.Boost(boostV2);
319  p4M22_BV2.Boost(boostV2);
320 
321  TLorentzVector p4V1_BV2 = p4M11_BV2 + p4M12_BV2;
323  costheta2 = -p4V1_BV2.Vect().Unit().Dot(p4M21_BV2.Vect().Unit());
324  }
325  else costheta2 = 0;
326 
328  TLorentzVector p4M11_BX(p4M11);
329  TLorentzVector p4M12_BX(p4M12);
330  TLorentzVector p4M21_BX(p4M21);
331  TLorentzVector p4M22_BX(p4M22);
332 
333  p4M11_BX.Boost(boostX);
334  p4M12_BX.Boost(boostX);
335  p4M21_BX.Boost(boostX);
336  p4M22_BX.Boost(boostX);
337  TLorentzVector p4V1_BX = p4M11_BX + p4M12_BX;
338 
339  TVector3 const beamAxis(0, 0, 1);
340  TVector3 p3V1_BX = p4V1_BX.Vect().Unit();
341  TVector3 normal1_BX = (p4M11_BX.Vect().Cross(p4M12_BX.Vect())).Unit();
342  TVector3 normal2_BX = (p4M21_BX.Vect().Cross(p4M22_BX.Vect())).Unit();
343  TVector3 normalSC_BX = (beamAxis.Cross(p3V1_BX)).Unit();
344 
345 
347  float tmpSgnPhi = p3V1_BX.Dot(normal1_BX.Cross(normal2_BX));
348  float sgnPhi = 0;
349  if (fabs(tmpSgnPhi)>0.) sgnPhi = tmpSgnPhi/fabs(tmpSgnPhi);
350  float dot_BX12 = normal1_BX.Dot(normal2_BX);
351  if (fabs(dot_BX12)>=1.) dot_BX12 *= 1./fabs(dot_BX12);
352  Phi = sgnPhi * acos(-1.*dot_BX12);
353 
354 
356  float tmpSgnPhi1 = p3V1_BX.Dot(normal1_BX.Cross(normalSC_BX));
357  float sgnPhi1 = 0;
358  if (fabs(tmpSgnPhi1)>0.) sgnPhi1 = tmpSgnPhi1/fabs(tmpSgnPhi1);
359  float dot_BX1SC = normal1_BX.Dot(normalSC_BX);
360  if (fabs(dot_BX1SC)>=1.) dot_BX1SC *= 1./fabs(dot_BX1SC);
361  Phi1 = sgnPhi1 * acos(dot_BX1SC);
362 
363  if (isnan(costhetastar) || isnan(costheta1) || isnan(costheta2) || isnan(Phi) || isnan(Phi1)){
364  MELAout << "WARNING: NaN in computeAngles: "
365  << costhetastar << " "
366  << costheta1 << " "
367  << costheta2 << " "
368  << Phi << " "
369  << Phi1 << " " << endl;
370  MELAout << " boostV1: " <<boostV1.Pt() << " " << boostV1.Eta() << " " << boostV1.Phi() << " " << boostV1.Mag() << endl;
371  MELAout << " boostV2: " <<boostV2.Pt() << " " << boostV2.Eta() << " " << boostV2.Phi() << " " << boostV2.Mag() << endl;
372  }
373 }
375  float const& pbeam,
376  float& costhetastar,
377  float& costheta1,
378  float& costheta2,
379  float& Phi,
380  float& Phi1,
381  TLorentzVector p4M11, int Z1_lept1Id,
382  TLorentzVector p4M12, int Z1_lept2Id,
383  TLorentzVector p4M21, int Z2_lept1Id,
384  TLorentzVector p4M22, int Z2_lept2Id
385  ){
386  TLorentzVector const nullFourVector(0, 0, 0, 0);
387  if (p4M12==nullFourVector || p4M22==nullFourVector){
388  pair<TLorentzVector, TLorentzVector> f13Pair = TUtil::removeMassFromPair(p4M11, Z1_lept1Id, p4M21, Z2_lept1Id);
389  p4M11 = f13Pair.first;
390  p4M21 = f13Pair.second;
391  }
392  else if (p4M11==nullFourVector || p4M21==nullFourVector){
393  pair<TLorentzVector, TLorentzVector> f24Pair = TUtil::removeMassFromPair(p4M12, Z1_lept2Id, p4M22, Z2_lept2Id);
394  p4M12 = f24Pair.first;
395  p4M22 = f24Pair.second;
396  }
397  else{
398  pair<TLorentzVector, TLorentzVector> f12Pair = TUtil::removeMassFromPair(p4M11, Z1_lept1Id, p4M12, Z1_lept2Id);
399  pair<TLorentzVector, TLorentzVector> f34Pair = TUtil::removeMassFromPair(p4M21, Z2_lept1Id, p4M22, Z2_lept2Id);
400  p4M11 = f12Pair.first;
401  p4M12 = f12Pair.second;
402  p4M21 = f34Pair.first;
403  p4M22 = f34Pair.second;
404  }
405 
406  TVector3 LabXaxis(1.0, 0.0, 0.0);
407  TVector3 LabYaxis(0.0, 1.0, 0.0);
408  TVector3 LabZaxis(0.0, 0.0, 1.0);
409 
410  float Mprot = 0.938;
411  float Ebeam = sqrt(pbeam*pbeam + Mprot*Mprot);
412 
413  TLorentzVector targ(0., 0., -pbeam, Ebeam);
414  TLorentzVector beam(0., 0., pbeam, Ebeam);
415 
416  //build Z 4-vectors
417  TLorentzVector p4Z1 = p4M11 + p4M12;
418  TLorentzVector p4Z2 = p4M21 + p4M22;
419 
420  // Sort Z1 leptons so that:
421  if (
422  Z1_lept2Id!=9000
423  &&
424  (
425  (Z1_lept1Id*Z1_lept2Id<0 && Z1_lept1Id<0) // for OS pairs: lep1 must be the negative one
426  ||
427  ((Z1_lept1Id*Z1_lept2Id>0 || (Z1_lept1Id==0 && Z1_lept2Id==0)) && p4M11.Phi()<=p4M12.Phi()) //for SS pairs: use random deterministic convention
428  )
429  ) swap(p4M11, p4M12);
430  // Same for Z2 leptons
431  if (
432  Z2_lept2Id!=9000
433  &&
434  (
435  (Z2_lept1Id*Z2_lept2Id<0 && Z2_lept1Id<0)
436  ||
437  ((Z2_lept1Id*Z2_lept2Id>0 || (Z2_lept1Id==0 && Z2_lept2Id==0)) && p4M21.Phi()<=p4M22.Phi())
438  )
439  ) swap(p4M21, p4M22);
440 
441 
442  //build H 4-vectors
443  TLorentzVector p4H = p4Z1 + p4Z2;
444  TVector3 boostX = -(p4H.BoostVector());
445 
447  // Collin-Sopper calculation:
448  // in the CS frame, the z-axis is along the bisectrice of one beam and the opposite of the other beam,
449  // after their boost in X
451  // Rotation for the CS Frame
452 
453  TRotation rotationCS;
454 
455  TLorentzVector beaminX(beam);
456  TLorentzVector targinX(targ);
457  targinX.Boost(boostX);
458  beaminX.Boost(boostX);
459 
460  //Bisectrice: sum of unit vectors (remember: you need to invert one beam vector)
461  TVector3 beam_targ_bisecinX((beaminX.Vect().Unit() - targinX.Vect().Unit()).Unit());
462 
463  // Define a rotationCS Matrix, with Z along the bisectric,
464  TVector3 newZaxisCS(beam_targ_bisecinX.Unit());
465  TVector3 newYaxisCS(beaminX.Vect().Unit().Cross(newZaxisCS).Unit());
466  TVector3 newXaxisCS(newYaxisCS.Unit().Cross(newZaxisCS).Unit());
467  rotationCS.RotateAxes(newXaxisCS, newYaxisCS, newZaxisCS);
468  rotationCS.Invert();
469 
471  TLorentzVector thep4Z1inXFrame_rotCS(p4Z1);
472  TLorentzVector thep4Z2inXFrame_rotCS(p4Z2);
473  thep4Z1inXFrame_rotCS.Transform(rotationCS);
474  thep4Z2inXFrame_rotCS.Transform(rotationCS);
475  thep4Z1inXFrame_rotCS.Boost(boostX);
476  thep4Z2inXFrame_rotCS.Boost(boostX);
477  TVector3 theZ1XrotCS_p3 = TVector3(thep4Z1inXFrame_rotCS.X(), thep4Z1inXFrame_rotCS.Y(), thep4Z1inXFrame_rotCS.Z());
478  costhetastar = theZ1XrotCS_p3.CosTheta();
479 
481  // TVector3 boostX = -(thep4H.BoostVector());
482  TLorentzVector p4M11_BX_rotCS(p4M11);
483  TLorentzVector p4M12_BX_rotCS(p4M12);
484  TLorentzVector p4M21_BX_rotCS(p4M21);
485  TLorentzVector p4M22_BX_rotCS(p4M22);
486  p4M11_BX_rotCS.Transform(rotationCS);
487  p4M12_BX_rotCS.Transform(rotationCS);
488  p4M21_BX_rotCS.Transform(rotationCS);
489  p4M22_BX_rotCS.Transform(rotationCS);
490  p4M11_BX_rotCS.Boost(boostX);
491  p4M12_BX_rotCS.Boost(boostX);
492  p4M21_BX_rotCS.Boost(boostX);
493  p4M22_BX_rotCS.Boost(boostX);
494 
495  TLorentzVector p4Z1_BX_rotCS = p4M11_BX_rotCS + p4M12_BX_rotCS;
496  TVector3 p3V1_BX_rotCS = (p4Z1_BX_rotCS.Vect()).Unit();
497  TVector3 const beamAxis(0, 0, 1);
498  TVector3 normal1_BX_rotCS = (p4M11_BX_rotCS.Vect().Cross(p4M12_BX_rotCS.Vect())).Unit();
499  TVector3 normal2_BX_rotCS = (p4M21_BX_rotCS.Vect().Cross(p4M22_BX_rotCS.Vect())).Unit();
500  TVector3 normalSC_BX_rotCS = (beamAxis.Cross(p3V1_BX_rotCS)).Unit();
501 
503  float tmpSgnPhi = p3V1_BX_rotCS.Dot(normal1_BX_rotCS.Cross(normal2_BX_rotCS));
504  float sgnPhi = 0;
505  if (fabs(tmpSgnPhi)>0.) sgnPhi = tmpSgnPhi/fabs(tmpSgnPhi);
506  float dot_BX12 = normal1_BX_rotCS.Dot(normal2_BX_rotCS);
507  if (fabs(dot_BX12)>=1.) dot_BX12 *= 1./fabs(dot_BX12);
508  Phi = sgnPhi * acos(-1.*dot_BX12);
509 
511  float tmpSgnPhi1 = p3V1_BX_rotCS.Dot(normal1_BX_rotCS.Cross(normalSC_BX_rotCS));
512  float sgnPhi1 = 0;
513  if (fabs(tmpSgnPhi1)>0.) sgnPhi1 = tmpSgnPhi1/fabs(tmpSgnPhi1);
514  float dot_BX1SC = normal1_BX_rotCS.Dot(normalSC_BX_rotCS);
515  if (fabs(dot_BX1SC)>=1.) dot_BX1SC *= 1./fabs(dot_BX1SC);
516  Phi1 = sgnPhi1 * acos(dot_BX1SC);
517 
519  if (!(fabs(Z1_lept1Id)==21 || fabs(Z1_lept1Id)==22 || fabs(Z1_lept2Id)==21 || fabs(Z1_lept2Id)==22)){
520  //define Z1 rotation
521  TRotation rotationZ1;
522  TVector3 newZaxisZ1(thep4Z1inXFrame_rotCS.Vect().Unit());
523  TVector3 newXaxisZ1(newYaxisCS.Cross(newZaxisZ1).Unit());
524  TVector3 newYaxisZ1(newZaxisZ1.Cross(newXaxisZ1).Unit());
525  rotationZ1.RotateAxes(newXaxisZ1, newYaxisZ1, newZaxisZ1);
526  rotationZ1.Invert();
527 
528  TLorentzVector thep4Z1inXFrame_rotCS_rotZ1(thep4Z1inXFrame_rotCS);
529  thep4Z1inXFrame_rotCS_rotZ1.Transform(rotationZ1);
530  TVector3 boostZ1inX_rotCS_rotZ1= -(thep4Z1inXFrame_rotCS_rotZ1.BoostVector());
531 
532  TLorentzVector p4M11_BX_rotCS_rotZ1(p4M11_BX_rotCS);
533  TLorentzVector p4M12_BX_rotCS_rotZ1(p4M12_BX_rotCS);
534  TLorentzVector p4M21_BX_rotCS_rotZ1(p4M21_BX_rotCS);
535  TLorentzVector p4M22_BX_rotCS_rotZ1(p4M22_BX_rotCS);
536  p4M11_BX_rotCS_rotZ1.Transform(rotationZ1);
537  p4M12_BX_rotCS_rotZ1.Transform(rotationZ1);
538  p4M21_BX_rotCS_rotZ1.Transform(rotationZ1);
539  p4M22_BX_rotCS_rotZ1.Transform(rotationZ1);
540  p4M11_BX_rotCS_rotZ1.Boost(boostZ1inX_rotCS_rotZ1);
541  p4M12_BX_rotCS_rotZ1.Boost(boostZ1inX_rotCS_rotZ1);
542  p4M21_BX_rotCS_rotZ1.Boost(boostZ1inX_rotCS_rotZ1);
543  p4M22_BX_rotCS_rotZ1.Boost(boostZ1inX_rotCS_rotZ1);
544 
545  TLorentzVector p4V2_BX_rotCS_rotZ1 = p4M21_BX_rotCS_rotZ1 + p4M22_BX_rotCS_rotZ1;
547  costheta1 = -p4V2_BX_rotCS_rotZ1.Vect().Dot(p4M11_BX_rotCS_rotZ1.Vect())/p4V2_BX_rotCS_rotZ1.Vect().Mag()/p4M11_BX_rotCS_rotZ1.Vect().Mag();
548  }
549  else costheta1=0;
550 
552  if (!(fabs(Z2_lept1Id)==21 || fabs(Z2_lept1Id)==22 || fabs(Z2_lept2Id)==21 || fabs(Z2_lept2Id)==22)){
553  //define Z2 rotation
554  TRotation rotationZ2;
555  TVector3 newZaxisZ2(thep4Z2inXFrame_rotCS.Vect().Unit());
556  TVector3 newXaxisZ2(newYaxisCS.Cross(newZaxisZ2).Unit());
557  TVector3 newYaxisZ2(newZaxisZ2.Cross(newXaxisZ2).Unit());
558  rotationZ2.RotateAxes(newXaxisZ2, newYaxisZ2, newZaxisZ2);
559  rotationZ2.Invert();
560 
561  TLorentzVector thep4Z2inXFrame_rotCS_rotZ2(thep4Z2inXFrame_rotCS);
562  thep4Z2inXFrame_rotCS_rotZ2.Transform(rotationZ2);
563  TVector3 boostZ2inX_rotCS_rotZ2= -(thep4Z2inXFrame_rotCS_rotZ2.BoostVector());
564 
565  TLorentzVector p4M11_BX_rotCS_rotZ2(p4M11_BX_rotCS);
566  TLorentzVector p4M12_BX_rotCS_rotZ2(p4M12_BX_rotCS);
567  TLorentzVector p4M21_BX_rotCS_rotZ2(p4M21_BX_rotCS);
568  TLorentzVector p4M22_BX_rotCS_rotZ2(p4M22_BX_rotCS);
569  p4M11_BX_rotCS_rotZ2.Transform(rotationZ2);
570  p4M12_BX_rotCS_rotZ2.Transform(rotationZ2);
571  p4M21_BX_rotCS_rotZ2.Transform(rotationZ2);
572  p4M22_BX_rotCS_rotZ2.Transform(rotationZ2);
573  p4M11_BX_rotCS_rotZ2.Boost(boostZ2inX_rotCS_rotZ2);
574  p4M12_BX_rotCS_rotZ2.Boost(boostZ2inX_rotCS_rotZ2);
575  p4M21_BX_rotCS_rotZ2.Boost(boostZ2inX_rotCS_rotZ2);
576  p4M22_BX_rotCS_rotZ2.Boost(boostZ2inX_rotCS_rotZ2);
577 
578 
579  TLorentzVector p4V1_BX_rotCS_rotZ2= p4M11_BX_rotCS_rotZ2 + p4M12_BX_rotCS_rotZ2;
581  costheta2 = -p4V1_BX_rotCS_rotZ2.Vect().Dot(p4M21_BX_rotCS_rotZ2.Vect())/p4V1_BX_rotCS_rotZ2.Vect().Mag()/p4M21_BX_rotCS_rotZ2.Vect().Mag();
582  }
583  else costheta2=0;
584 
585  if (isnan(costhetastar) || isnan(costheta1) || isnan(costheta2) || isnan(Phi) || isnan(Phi1)){
586  MELAout << "WARNING: NaN in computeAngles: "
587  << costhetastar << " "
588  << costheta1 << " "
589  << costheta2 << " "
590  << Phi << " "
591  << Phi1 << " " << endl;
592  }
593 }
594 
595 /***** Associated production angles *****/
597  float& costhetastar,
598  float& costheta1,
599  float& costheta2,
600  float& Phi,
601  float& Phi1,
602  float& Q2V1,
603  float& Q2V2,
604  TLorentzVector p4M11, int Z1_lept1Id,
605  TLorentzVector p4M12, int Z1_lept2Id,
606  TLorentzVector p4M21, int Z2_lept1Id,
607  TLorentzVector p4M22, int Z2_lept2Id,
608  TLorentzVector jet1, int jet1Id,
609  TLorentzVector jet2, int jet2Id,
610  TLorentzVector* injet1, int injet1Id, // Gen. partons in the lab frame
611  TLorentzVector* injet2, int injet2Id
612  ){
613  TLorentzVector const nullFourVector(0, 0, 0, 0);
614 
615  TLorentzVector jet1massless, jet2massless;
616  pair<TLorentzVector, TLorentzVector> jetPair = TUtil::removeMassFromPair(jet1, jet1Id, jet2, jet2Id);
617  jet1massless = jetPair.first;
618  jet2massless = jetPair.second;
619 
620  //build Z 4-vectors
621  TLorentzVector p4Z1 = p4M11 + p4M12;
622  TLorentzVector p4Z2 = p4M21 + p4M22;
623  TLorentzVector pH = p4Z1+p4Z2;
624  //jet1 is defined as going forwards (bigger pz), jet2 going backwards (smaller pz)
625  if (jet1massless.Z() < jet2massless.Z()) { swap(jet1massless, jet2massless); swap(jet1Id, jet2Id); }
626 
627  //Find the incoming partons - first boost so the pT(HJJ) = 0, then boost away the pz.
628  //This preserves the z direction. Then assume that the partons come in this z direction.
629  //This is exactly correct at LO (since pT=0 anyway).
630  //Then associate the one going forwards with jet1 and the one going backwards with jet2
631  TLorentzRotation movingframe;
632  TLorentzVector pHJJ = pH+jet1massless+jet2massless;
633  TLorentzVector pHJJ_perp(pHJJ.X(), pHJJ.Y(), 0, pHJJ.T());
634  movingframe.Boost(-pHJJ_perp.BoostVector());
635  pHJJ.Boost(-pHJJ_perp.BoostVector());
636  movingframe.Boost(-pHJJ.BoostVector());
637  pHJJ.Boost(-pHJJ.BoostVector()); //make sure to boost HJJ AFTER boosting movingframe
638 
639  TLorentzVector P1(0, 0, pHJJ.T()/2, pHJJ.T()/2);
640  TLorentzVector P2(0, 0, -pHJJ.T()/2, pHJJ.T()/2);
641  // Transform incoming partons back to original frame
642  P1.Transform(movingframe.Inverse());
643  P2.Transform(movingframe.Inverse());
644  pHJJ.Transform(movingframe.Inverse());
645  // movingframe and HJJ_T will not be used anymore
646  // Handle gen. partons if they are available
647  if (injet1 && injet2 && fabs((*injet1+*injet2).P()-pHJJ.P())<pHJJ.P()*1e-4){
648  P1=*injet1;
649  P2=*injet2;
650  if (P1.Z() < P2.Z()){
651  swap(P1, P2);
652  swap(injet1Id, injet2Id);
653  }
654  // In the case of gen. partons, check if the intermediates are a Z or a W.
655  int diff1Id = jet1Id-injet1Id;
656  int diff2Id = jet2Id-injet2Id;
657  if (
658  !( // THIS IS A NOT-IF!
659  (diff1Id==0 && diff2Id==0 && !(injet1Id==21 || injet2Id==21)) // Two Z bosons
660  ||
661  ((fabs(diff1Id)==1 || fabs(diff1Id)==3 || fabs(diff1Id)==5) && (fabs(diff2Id)==1 || fabs(diff2Id)==3 || fabs(diff2Id)==5)) // Two W bosons, do not check W+ vs W-
662  )
663  ){
664  int diff12Id = jet1Id-injet2Id;
665  int diff21Id = jet2Id-injet1Id;
666  if (
667  ((diff12Id==0 || diff21Id==0) && !(injet1Id==21 || injet2Id==21)) // At least one Z boson
668  ||
669  ((fabs(diff12Id)==1 || fabs(diff12Id)==3 || fabs(diff12Id)==5) || (fabs(diff21Id)==1 || fabs(diff21Id)==3 || fabs(diff21Id)==5)) // At least one W boson
670  ){
671  swap(P1, P2);
672  swap(injet1Id, injet2Id);
673  }
674  }
675  }
676 
677  TLorentzRotation ZZframe;
678  ZZframe.Boost(-pH.BoostVector());
679  P1.Transform(ZZframe);
680  P2.Transform(ZZframe);
681  p4Z1.Transform(ZZframe);
682  p4Z2.Transform(ZZframe);
683  jet1massless.Transform(ZZframe);
684  jet2massless.Transform(ZZframe);
685 
686  TLorentzVector fermion1, fermion2, antifermion1, antifermion2;
687  // Consider cases with gen. partons
688  // By default, fermion1/2 are jet1/2 unless incoming partons are specifically anti-quarks!
689  if (injet1 && injet1Id<0){
690  fermion1=-P1;
691  antifermion1 = jet1massless;
692  }
693  else{
694  fermion1 = jet1massless;
695  antifermion1=-P1;
696  }
697  if (injet2 && injet2Id<0){
698  fermion2=-P2;
699  antifermion2 = jet2massless;
700  }
701  else{
702  fermion2 = jet2massless;
703  antifermion2=-P2;
704  }
705 
706  // Computations in the frame of X
707  TLorentzVector V1 = fermion1 + antifermion1; // Outgoing V1
708  TLorentzVector V2 = fermion2 + antifermion2; // Outgoing V2
709  TVector3 normvec1 = fermion1.Vect().Cross(antifermion1.Vect()).Unit(); // p11 x p12
710  TVector3 normvec2 = fermion2.Vect().Cross(antifermion2.Vect()).Unit(); // p21 x p22
711  TVector3 normvec3 = p4Z2.Vect().Cross(V1.Vect()).Unit(); // z x V1
712  double cosPhi = normvec1.Dot(normvec2);
713  double sgnPhi = normvec1.Cross(normvec2).Dot(V1.Vect());
714  if (fabs(sgnPhi)>0.) sgnPhi = sgnPhi/fabs(sgnPhi);
715  double cosPhi1 = normvec1.Dot(normvec3);
716  double sgnPhi1 = normvec1.Cross(normvec3).Dot(V1.Vect());
717  if (fabs(sgnPhi1)>0.) sgnPhi1 = sgnPhi1/fabs(sgnPhi1);
718  if (fabs(cosPhi)>1) cosPhi *= 1./fabs(cosPhi);
719  if (fabs(cosPhi1)>1) cosPhi1 *= 1./fabs(cosPhi1);
720  Phi = acos(-cosPhi)*sgnPhi;
721  Phi1 = acos(cosPhi1)*sgnPhi1;
722  costhetastar = V1.Vect().Unit().Dot(p4Z2.Vect().Unit()); // Note that p4Z2 is still in outgoing convention, so in incoming terms, this is equivalent to putting p4Z1.
723  Q2V1 = -(V1.M2());
724  Q2V2 = -(V2.M2());
725 
726  // Computations that would have been in the frame of X had V1 and V2 not been virtual
727  costheta1 = V1.Vect().Unit().Dot(fermion1.Vect().Unit());
728  costheta2 = V2.Vect().Unit().Dot(fermion2.Vect().Unit());
729 }
731  float& costhetastar,
732  float& costheta1_real, float& costheta1_imag,
733  float& costheta2_real, float& costheta2_imag,
734  float& Phi,
735  float& Phi1,
736  float& Q2V1,
737  float& Q2V2,
738  TLorentzVector p4M11, int Z1_lept1Id,
739  TLorentzVector p4M12, int Z1_lept2Id,
740  TLorentzVector p4M21, int Z2_lept1Id,
741  TLorentzVector p4M22, int Z2_lept2Id,
742  TLorentzVector jet1, int jet1Id,
743  TLorentzVector jet2, int jet2Id,
744  TLorentzVector* injet1, int injet1Id, // Gen. partons in the lab frame
745  TLorentzVector* injet2, int injet2Id
746  ){
747  TLorentzVector const nullFourVector(0, 0, 0, 0);
748 
749  TLorentzVector jet1massless, jet2massless;
750  pair<TLorentzVector, TLorentzVector> jetPair = TUtil::removeMassFromPair(jet1, jet1Id, jet2, jet2Id);
751  jet1massless = jetPair.first;
752  jet2massless = jetPair.second;
753 
754  //build Z 4-vectors
755  TLorentzVector p4Z1 = p4M11 + p4M12;
756  TLorentzVector p4Z2 = p4M21 + p4M22;
757  TLorentzVector pH = p4Z1+p4Z2;
758  //jet1 is defined as going forwards (bigger pz), jet2 going backwards (smaller pz)
759  if (jet1massless.Z() < jet2massless.Z()) { swap(jet1massless, jet2massless); swap(jet1Id, jet2Id); }
760 
761  //Find the incoming partons - first boost so the pT(HJJ) = 0, then boost away the pz.
762  //This preserves the z direction. Then assume that the partons come in this z direction.
763  //This is exactly correct at LO (since pT=0 anyway).
764  //Then associate the one going forwards with jet1 and the one going backwards with jet2
765  TLorentzRotation movingframe;
766  TLorentzVector pHJJ = pH+jet1massless+jet2massless;
767  TLorentzVector pHJJ_perp(pHJJ.X(), pHJJ.Y(), 0, pHJJ.T());
768  movingframe.Boost(-pHJJ_perp.BoostVector());
769  pHJJ.Boost(-pHJJ_perp.BoostVector());
770  movingframe.Boost(-pHJJ.BoostVector());
771  pHJJ.Boost(-pHJJ.BoostVector()); //make sure to boost HJJ AFTER boosting movingframe
772 
773  TLorentzVector P1(0, 0, pHJJ.T()/2, pHJJ.T()/2);
774  TLorentzVector P2(0, 0, -pHJJ.T()/2, pHJJ.T()/2);
775  // Transform incoming partons back to original frame
776  P1.Transform(movingframe.Inverse());
777  P2.Transform(movingframe.Inverse());
778  pHJJ.Transform(movingframe.Inverse());
779  // movingframe and HJJ_T will not be used anymore
780  // Handle gen. partons if they are available
781  if (injet1 && injet2 && fabs((*injet1+*injet2).P()-pHJJ.P())<pHJJ.P()*1e-4){
782  P1=*injet1;
783  P2=*injet2;
784  if (P1.Z() < P2.Z()){
785  swap(P1, P2);
786  swap(injet1Id, injet2Id);
787  }
788  // In the case of gen. partons, check if the intermediates are a Z or a W.
789  int diff1Id = jet1Id-injet1Id;
790  int diff2Id = jet2Id-injet2Id;
791  if (
792  !( // THIS IS A NOT-IF!
793  (diff1Id==0 && diff2Id==0 && !(injet1Id==21 || injet2Id==21)) // Two Z bosons
794  ||
795  ((fabs(diff1Id)==1 || fabs(diff1Id)==3 || fabs(diff1Id)==5) && (fabs(diff2Id)==1 || fabs(diff2Id)==3 || fabs(diff2Id)==5)) // Two W bosons, do not check W+ vs W-
796  )
797  ){
798  int diff12Id = jet1Id-injet2Id;
799  int diff21Id = jet2Id-injet1Id;
800  if (
801  ((diff12Id==0 || diff21Id==0) && !(injet1Id==21 || injet2Id==21)) // At least one Z boson
802  ||
803  ((fabs(diff12Id)==1 || fabs(diff12Id)==3 || fabs(diff12Id)==5) || (fabs(diff21Id)==1 || fabs(diff21Id)==3 || fabs(diff21Id)==5)) // At least one W boson
804  ){
805  swap(P1, P2);
806  swap(injet1Id, injet2Id);
807  }
808  }
809  }
810 
811  TLorentzRotation ZZframe;
812  ZZframe.Boost(-pH.BoostVector());
813  P1.Transform(ZZframe);
814  P2.Transform(ZZframe);
815  p4Z1.Transform(ZZframe);
816  p4Z2.Transform(ZZframe);
817  jet1massless.Transform(ZZframe);
818  jet2massless.Transform(ZZframe);
819 
820  TLorentzVector fermion1, fermion2, antifermion1, antifermion2;
821  // Consider cases with gen. partons
822  // By default, fermion1/2 are jet1/2 unless incoming partons are specifically anti-quarks!
823  if (injet1 && injet1Id<0){
824  fermion1=-P1;
825  antifermion1 = jet1massless;
826  }
827  else{
828  fermion1 = jet1massless;
829  antifermion1=-P1;
830  }
831  if (injet2 && injet2Id<0){
832  fermion2=-P2;
833  antifermion2 = jet2massless;
834  }
835  else{
836  fermion2 = jet2massless;
837  antifermion2=-P2;
838  }
839 
840  // Computations in the frame of X
841  TLorentzVector V1 = fermion1 + antifermion1; // Outgoing V1
842  TLorentzVector V2 = fermion2 + antifermion2; // Outgoing V2
843  TVector3 normvec1 = fermion1.Vect().Cross(antifermion1.Vect()).Unit(); // p11 x p12
844  TVector3 normvec2 = fermion2.Vect().Cross(antifermion2.Vect()).Unit(); // p21 x p22
845  TVector3 normvec3 = p4Z2.Vect().Cross(V1.Vect()).Unit(); // z x V1
846  double cosPhi = normvec1.Dot(normvec2);
847  double sgnPhi = normvec1.Cross(normvec2).Dot(V1.Vect());
848  if (fabs(sgnPhi)>0.) sgnPhi = sgnPhi/fabs(sgnPhi);
849  double cosPhi1 = normvec1.Dot(normvec3);
850  double sgnPhi1 = normvec1.Cross(normvec3).Dot(V1.Vect());
851  if (fabs(sgnPhi1)>0.) sgnPhi1 = sgnPhi1/fabs(sgnPhi1);
852  if (fabs(cosPhi)>1) cosPhi *= 1./fabs(cosPhi);
853  if (fabs(cosPhi1)>1) cosPhi1 *= 1./fabs(cosPhi1);
854  Phi = acos(-cosPhi)*sgnPhi;
855  Phi1 = acos(cosPhi1)*sgnPhi1;
856  costhetastar = V1.Vect().Unit().Dot(p4Z2.Vect().Unit()); // Note that p4Z2 is still in outgoing convention, so in incoming terms, this is equivalent to putting p4Z1.
857  Q2V1 = -(V1.M2());
858  Q2V2 = -(V2.M2());
859 
860  // Up to here, everything has to be the same as TUtil::computeVBFAngles
861  // Computations that would have been truly in the frame of X had V1 and V2 not been virtual:
862  // Use TUtil::ComplexBoost to evade imaginary gamma problems when beta**2<0
863  pair<TLorentzVector, TLorentzVector> V2_BV1 = TUtil::ComplexBoost(V1.BoostVector(), V2);
864  pair<TLorentzVector, TLorentzVector> fermion1_BV1 = TUtil::ComplexBoost(V1.BoostVector(), fermion1);
865  costheta1_real = -(V2_BV1.first.Vect().Unit().Dot(fermion1_BV1.first.Vect().Unit()) - V2_BV1.second.Vect().Unit().Dot(fermion1_BV1.second.Vect().Unit()));
866  costheta1_imag = -(V2_BV1.first.Vect().Unit().Dot(fermion1_BV1.second.Vect().Unit()) + V2_BV1.second.Vect().Unit().Dot(fermion1_BV1.first.Vect().Unit()));
867 
868  pair<TLorentzVector, TLorentzVector> V1_BV2 = TUtil::ComplexBoost(V2.BoostVector(), V1);
869  pair<TLorentzVector, TLorentzVector> fermion2_BV2 = TUtil::ComplexBoost(V2.BoostVector(), fermion2);
870  costheta2_real = -(V1_BV2.first.Vect().Unit().Dot(fermion2_BV2.first.Vect().Unit()) - V1_BV2.second.Vect().Unit().Dot(fermion2_BV2.second.Vect().Unit()));
871  costheta2_imag = -(V1_BV2.first.Vect().Unit().Dot(fermion2_BV2.second.Vect().Unit()) + V1_BV2.second.Vect().Unit().Dot(fermion2_BV2.first.Vect().Unit()));
872 }
874  float& costhetastar,
875  float& costheta1,
876  float& costheta2,
877  float& Phi,
878  float& Phi1,
879  float& m1,
880  float& m2,
881  TLorentzVector p4M11, int Z1_lept1Id,
882  TLorentzVector p4M12, int Z1_lept2Id,
883  TLorentzVector p4M21, int Z2_lept1Id,
884  TLorentzVector p4M22, int Z2_lept2Id,
885  TLorentzVector jet1, int jet1Id,
886  TLorentzVector jet2, int jet2Id,
887  TLorentzVector* injet1, int injet1Id, // Gen. partons in the lab frame
888  TLorentzVector* injet2, int injet2Id
889  ){
890  TLorentzVector const nullFourVector(0, 0, 0, 0);
891 
892  TLorentzVector jet1massless, jet2massless;
893  pair<TLorentzVector, TLorentzVector> jetPair = TUtil::removeMassFromPair(jet1, jet1Id, jet2, jet2Id);
894  jet1massless = jetPair.first;
895  jet2massless = jetPair.second;
896 
897  // Build Z 4-vectors
898  TLorentzVector p4Z1 = p4M11 + p4M12;
899  TLorentzVector p4Z2 = p4M21 + p4M22;
900  TLorentzVector pH = p4Z1 + p4Z2;
901 
902  // Apply convention for outgoing particles
903  if (
904  (jet1Id*jet2Id<0 && jet1Id<0) // for OS pairs: jet1 must be the particle
905  ||
906  ((jet1Id*jet2Id>0 || (jet1Id==0 && jet2Id==0)) && jet1massless.Phi()<=jet2massless.Phi()) // for SS pairs: use random deterministic convention
907  ){
908  swap(jet1massless, jet2massless);
909  swap(jet1Id, jet2Id);
910  }
911 
912  //Find the incoming partons - first boost so the pT(HJJ) = 0, then boost away the pz.
913  //This preserves the z direction.
914  //Then, assume that the partons come in this z direction.
915  //This is exactly correct at LO (since pT=0 anyway).
916  //Then associate the one going forwards with jet1 and the one going backwards with jet2
917  TLorentzRotation movingframe;
918  TLorentzVector pHJJ = pH+jet1massless+jet2massless;
919  TLorentzVector pHJJ_perp(pHJJ.X(), pHJJ.Y(), 0, pHJJ.T());
920  movingframe.Boost(-pHJJ_perp.BoostVector());
921  pHJJ.Boost(-pHJJ_perp.BoostVector());
922  movingframe.Boost(-pHJJ.BoostVector());
923  pHJJ.Boost(-pHJJ.BoostVector()); //make sure to boost HJJ AFTER boosting movingframe
924 
925  TLorentzVector P1(0, 0, -pHJJ.T()/2, pHJJ.T()/2);
926  TLorentzVector P2(0, 0, pHJJ.T()/2, pHJJ.T()/2);
927  // Transform incoming partons back to the original frame
928  P1.Transform(movingframe.Inverse());
929  P2.Transform(movingframe.Inverse());
930  pHJJ.Transform(movingframe.Inverse());
931  // movingframe and HJJ_T will not be used anymore
932  // Handle gen. partons if they are available
933  if (injet1 && injet2 && fabs((*injet1+*injet2).P()-pHJJ.P())<pHJJ.P()*1e-4){
934  P1=*injet1;
935  P2=*injet2;
936  // Apply convention for incoming (!) particles
937  if (
938  (injet1Id*injet2Id<0 && injet1Id>0) // for OS pairs: parton 2 must be the particle
939  ||
940  (injet1Id*injet2Id>0 && P1.Z()>=P2.Z()) //for SS pairs: use random deterministic convention
941  ){
942  swap(P1, P2);
943  swap(injet1Id, injet2Id);
944  }
945  }
946 
947  // Rotate every vector such that Z1 - Z2 axis is the "beam axis" analogue of decay
948  TLorentzRotation ZZframe;
949  TVector3 const beamAxis(0, 0, 1);
950  if (p4Z1==nullFourVector || p4Z2==nullFourVector){
951  TVector3 pNewAxis = (p4Z2-p4Z1).Vect().Unit(); // Let Z2 be in the z direction so that once the direction of H is reversed, Z1 is in the z direction
952  if (pNewAxis != nullFourVector.Vect()){
953  TVector3 pNewAxisPerp = pNewAxis.Cross(beamAxis);
954  ZZframe.Rotate(acos(pNewAxis.Dot(beamAxis)), pNewAxisPerp);
955 
956  P1.Transform(ZZframe);
957  P2.Transform(ZZframe);
958  jet1massless = -jet1massless; jet1massless.Transform(ZZframe); jet1massless = -jet1massless;
959  jet2massless = -jet2massless; jet2massless.Transform(ZZframe); jet2massless = -jet2massless;
960  }
961  }
962  else{
963  ZZframe.Boost(-pH.BoostVector());
964  p4Z1.Boost(-pH.BoostVector());
965  p4Z2.Boost(-pH.BoostVector());
966  TVector3 pNewAxis = (p4Z2-p4Z1).Vect().Unit(); // Let Z2 be in the z direction so that once the direction of H is reversed, Z1 is in the z direction
967  TVector3 pNewAxisPerp = pNewAxis.Cross(beamAxis);
968  ZZframe.Rotate(acos(pNewAxis.Dot(beamAxis)), pNewAxisPerp);
969  P1.Transform(ZZframe);
970  P2.Transform(ZZframe);
971  jet1massless = -jet1massless; jet1massless.Transform(ZZframe); jet1massless = -jet1massless;
972  jet2massless = -jet2massless; jet2massless.Transform(ZZframe); jet2massless = -jet2massless;
973  }
974 
976  costhetastar,
977  costheta1,
978  costheta2,
979  Phi,
980  Phi1,
981  -P1, 23, // Id is 23 to avoid an attempt to remove quark mass
982  -P2, 0, // Id is 0 to avoid swapping
983  jet1massless, 23,
984  jet2massless, 0
985  );
986  m1 = (P1 + P2).M();
987  m2 = (jet1massless + jet2massless).M();
988 }
990  // ttH system
991  float& hs,
992  float& hincoming,
993  float& hTT,
994  float& PhiTT,
995  float& Phi1,
996 
997  // tt system
998  float& hbb,
999  float& hWW,
1000  float& Phibb,
1001  float& Phi1bb,
1002 
1003  // Wplus system
1004  float& hWplusf,
1005  float& PhiWplusf,
1006 
1007  // Wminus system
1008  float& hWminusf,
1009  float& PhiWminusf,
1010 
1011  TLorentzVector p4M11, int Z1_lept1Id,
1012  TLorentzVector p4M12, int Z1_lept2Id,
1013  TLorentzVector p4M21, int Z2_lept1Id,
1014  TLorentzVector p4M22, int Z2_lept2Id,
1015  TLorentzVector b, int bId,
1016  TLorentzVector Wplusf, int WplusfId,
1017  TLorentzVector Wplusfb, int WplusfbId,
1018  TLorentzVector bbar, int bbarId,
1019  TLorentzVector Wminusf, int WminusfId,
1020  TLorentzVector Wminusfb, int WminusfbId,
1021  TLorentzVector* injet1, int injet1Id, // Gen. partons in the lab frame
1022  TLorentzVector* injet2, int injet2Id
1023 ){
1024  TLorentzVector const nullFourVector(0, 0, 0, 0);
1025  TVector3 const beamAxis(0, 0, 1);
1026  TVector3 const xAxis(1, 0, 0);
1027 
1028  // Initialize output values
1029  hs=hincoming=hTT=PhiTT=Phi1
1030  =hbb=hWW=Phibb=Phi1bb
1031  =hWplusf=PhiWplusf
1032  =hWminusf=PhiWminusf=0;
1033  if (
1034  bId!=-9000 && !(PDGHelpers::isATopQuark(bId) || PDGHelpers::isATauLepton(bId)) && WplusfId==-9000 && WplusfbId==-9000
1035  &&
1036  bbarId!=-9000 && !(PDGHelpers::isATopQuark(bbarId) || PDGHelpers::isATauLepton(bbarId)) && WminusfId==-9000 && WminusfbId==-9000
1037  ){
1038  float m1_dummy=0, m2_dummy=0;
1039  return TUtil::computeVHAngles(
1040  hs, hincoming, hTT, PhiTT, Phi1,
1041  m1_dummy, m2_dummy,
1042  p4M11, Z1_lept1Id,
1043  p4M12, Z1_lept2Id,
1044  p4M21, Z2_lept1Id,
1045  p4M22, Z2_lept2Id,
1046  b, bId,
1047  bbar, bbarId,
1048  injet1, injet1Id,
1049  injet2, injet2Id
1050  );
1051  }
1052 
1053  // Swap Wplus daughters if needed
1054  if (
1055  WplusfId!=-9000 && WplusfbId!=-9000
1056  &&
1057  (
1058  (WplusfId*WplusfbId<0 && WplusfId<0) // for OS pairs: Wplusf must be the particle
1059  ||
1060  ((WplusfId*WplusfbId>0 || (WplusfId==0 && WplusfbId==0)) && Wplusf.Phi()<=Wplusfb.Phi()) // for SS pairs: use random deterministic convention
1061  )
1062  ){
1063  swap(Wplusf, Wplusfb);
1064  swap(WplusfId, WplusfbId);
1065  }
1066  // Swap Wminus daughters if needed
1067  if (
1068  WminusfId!=-9000 && WminusfbId!=-9000
1069  &&
1070  (
1071  (WminusfId*WminusfbId<0 && WminusfId<0) // for OS pairs: Wminusf must be the particle
1072  ||
1073  ((WminusfId*WminusfbId>0 || (WminusfId==0 && WminusfbId==0)) && Wminusf.Phi()<=Wminusfb.Phi()) // for SS pairs: use random deterministic convention
1074  )
1075  ){
1076  swap(Wminusf, Wminusfb);
1077  swap(WminusfId, WminusfbId);
1078  }
1079 
1080  // Correct the T daughters
1081  if (bId!=-9000 && WplusfId!=-9000 && WplusfbId!=-9000){
1082  SimpleParticleCollection_t tmp_daus;
1083  tmp_daus.reserve(3);
1084  tmp_daus.emplace_back(bId, b);
1085  tmp_daus.emplace_back(WplusfId, Wplusf);
1086  tmp_daus.emplace_back(WplusfbId, Wplusfb);
1087  TUtil::adjustTopDaughters(tmp_daus);
1088  b = tmp_daus.at(0).second;
1089  Wplusf = tmp_daus.at(1).second;
1090  Wplusfb = tmp_daus.at(2).second;
1091  }
1092  else if (WplusfId!=-9000 && WplusfbId!=-9000){
1093  pair<TLorentzVector, TLorentzVector> Wffb = TUtil::removeMassFromPair(Wplusf, WplusfId, Wplusfb, WplusfbId);
1094  Wplusf = Wffb.first;
1095  Wplusfb = Wffb.second;
1096  }
1097  // Correct the TBar daughters
1098  if (bbarId!=-9000 && WminusfId!=-9000 && WminusfbId!=-9000){
1099  SimpleParticleCollection_t tmp_daus;
1100  tmp_daus.reserve(3);
1101  tmp_daus.emplace_back(bbarId, bbar);
1102  tmp_daus.emplace_back(WminusfId, Wminusf);
1103  tmp_daus.emplace_back(WminusfbId, Wminusfb);
1104  TUtil::adjustTopDaughters(tmp_daus);
1105  bbar = tmp_daus.at(0).second;
1106  Wminusf = tmp_daus.at(1).second;
1107  Wminusfb = tmp_daus.at(2).second;
1108  }
1109  else if (WminusfId!=-9000 && WminusfbId!=-9000){
1110  pair<TLorentzVector, TLorentzVector> Wffb = TUtil::removeMassFromPair(Wminusf, WminusfId, Wminusfb, WminusfbId);
1111  Wminusf = Wffb.first;
1112  Wminusfb = Wffb.second;
1113  }
1114  // If the Ws are not present but the bs are, the masses of the bs should not be removed. This is because the bs are now either tops or taus (based on the similar if-statement above).
1115 
1116  // Build Z 4-vectors
1117  TLorentzVector p4Z1 = p4M11 + p4M12;
1118  TLorentzVector p4Z2 = p4M21 + p4M22;
1119  // No longer need to use p4Mxy
1120  TLorentzVector pH = p4Z1 + p4Z2;
1121 
1122  TLorentzVector pWplus = Wplusf + Wplusfb;
1123  TLorentzVector pTop = b + pWplus;
1124 
1125  TLorentzVector pWminus = Wminusf + Wminusfb;
1126  TLorentzVector pATop = bbar + pWminus;
1127 
1128  TLorentzVector pTT = pTop + pATop;
1129  TLorentzVector pTTH = pTT + pH;
1130 
1131  //Find the incoming partons - first boost so the pT(TTH) = 0, then boost away the pz.
1132  //This preserves the z direction.
1133  //Then, assume that the partons come in this z direction.
1134  //This is exactly correct at LO (since pT=0 anyway).
1135  //Then associate the one going forwards with jet1 and the one going backwards with jet2
1136  TLorentzRotation movingframe;
1137  TLorentzVector pTTH_perp(pTTH.X(), pTTH.Y(), 0, pTTH.T());
1138  movingframe.Boost(-pTTH_perp.BoostVector());
1139  pTTH.Boost(-pTTH_perp.BoostVector());
1140  movingframe.Boost(-pTTH.BoostVector());
1141  pTTH.Boost(-pTTH.BoostVector()); //make sure to boost TTH AFTER boosting movingframe
1142 
1143  TLorentzVector P1(0, 0, -pTTH.T()/2, pTTH.T()/2);
1144  TLorentzVector P2(0, 0, pTTH.T()/2, pTTH.T()/2);
1145  // Transform incoming partons back to the original frame
1146  P1.Transform(movingframe.Inverse());
1147  P2.Transform(movingframe.Inverse());
1148  pTTH.Transform(movingframe.Inverse());
1149  // movingframe and TTH_T will not be used anymore
1150  // Handle gen. partons if they are available
1151  if (injet1 && injet2 && fabs((*injet1+*injet2).P()-pTTH.P())<pTTH.P()*1e-4){
1152  P1=*injet1;
1153  P2=*injet2;
1154  // Apply convention for incoming (!) particles
1155  if (
1156  (injet1Id*injet2Id<0 && injet1Id>0) // for OS pairs: parton 2 must be the particle
1157  ||
1158  (injet1Id*injet2Id>0 && P1.Z()>=P2.Z()) //for SS pairs: parton 2 must have the greater pz
1159  ){
1160  swap(P1, P2);
1161  swap(injet1Id, injet2Id);
1162  }
1163  }
1164 
1165  // Rotate every vector such that Z1 - Z2 axis is the "beam axis" analogue of decay
1166  TLorentzRotation ZZframe;
1167  bool applyZZframe=false;
1168  if (p4Z1==nullFourVector || p4Z2==nullFourVector){ // Higgs is undecayed
1169  TVector3 pNewAxis = (p4Z2-p4Z1).Vect().Unit(); // Let Z2 be in the z direction so that once the direction of H is reversed, Z1 is in the z direction
1170  if (pNewAxis != nullFourVector.Vect()){
1171  TVector3 pNewAxisPerp = pNewAxis.Cross(beamAxis);
1172  ZZframe.Rotate(acos(pNewAxis.Dot(beamAxis)), pNewAxisPerp);
1173  applyZZframe=true;
1174  }
1175  }
1176  else{
1177  TVector3 pHboost = pH.BoostVector();
1178  ZZframe.Boost(-pHboost);
1179  p4Z1.Boost(-pHboost);
1180  p4Z2.Boost(-pHboost);
1181  TVector3 pNewAxis = (p4Z2-p4Z1).Vect().Unit(); // Let Z2 be in the z direction so that once the direction of H is reversed, Z1 is in the z direction
1182  TVector3 pNewAxisPerp = pNewAxis.Cross(beamAxis);
1183  ZZframe.Rotate(acos(pNewAxis.Dot(beamAxis)), pNewAxisPerp);
1184  // Boost p4Z1 and p4Z2 back so that you can apply the transformation separately
1185  p4Z1.Boost(pHboost);
1186  p4Z2.Boost(pHboost);
1187  applyZZframe=true;
1188  }
1189  if (applyZZframe){
1190  P1.Transform(ZZframe); P2.Transform(ZZframe);
1191  p4Z1 = -p4Z1; p4Z1.Transform(ZZframe); p4Z1 = -p4Z1;
1192  p4Z2 = -p4Z2; p4Z2.Transform(ZZframe); p4Z2 = -p4Z2;
1193  b = -b; b.Transform(ZZframe); b = -b;
1194  Wplusf = -Wplusf; Wplusf.Transform(ZZframe); Wplusf = -Wplusf;
1195  Wplusfb = -Wplusfb; Wplusfb.Transform(ZZframe); Wplusfb = -Wplusfb;
1196  bbar = -bbar; bbar.Transform(ZZframe); bbar = -bbar;
1197  Wminusf = -Wminusf; Wminusf.Transform(ZZframe); Wminusf = -Wminusf;
1198  Wminusfb = -Wminusfb; Wminusfb.Transform(ZZframe); Wminusfb = -Wminusfb;
1199  }
1200  // Re-assign derived momenta
1201  pH = p4Z1 + p4Z2;
1202  pWplus = Wplusf + Wplusfb;
1203  pTop = b + pWplus;
1204  pWminus = Wminusf + Wminusfb;
1205  pATop = bbar + pWminus;
1206  pTT = pTop + pATop;
1207  pTTH = pTT + pH;
1208 
1210  hs,
1211  hincoming,
1212  hTT,
1213  PhiTT,
1214  Phi1,
1215  -P1, 23, // Id is 23 to avoid an attempt to remove quark mass
1216  -P2, 0, // Id is 0 to avoid swapping
1217  pTop, 23,
1218  pATop, 0
1219  );
1220 
1221  // Boost everything to Higgs frame AFTER ttH-frame angle computations
1222  // This is to avoid an undetermined z axis in the above angles when Higgs is undecayed
1223  {
1224  TVector3 pHboost = pH.BoostVector();
1225 
1226  P1.Boost(-pHboost);
1227  P2.Boost(-pHboost);
1228  // No need for Z1 and Z2
1229  //p4Z1.Boost(-pHboost);
1230  //p4Z2.Boost(-pHboost);
1231  b.Boost(-pHboost);
1232  Wplusf.Boost(-pHboost);
1233  Wplusfb.Boost(-pHboost);
1234  bbar.Boost(-pHboost);
1235  Wminusf.Boost(-pHboost);
1236  Wminusfb.Boost(-pHboost);
1237 
1238  // Re-assign derived momenta
1239  // No need for the Higgs in Higgs frame
1240  //pH = p4Z1 + p4Z2;
1241  pWplus = Wplusf + Wplusfb;
1242  pTop = b + pWplus;
1243  pWminus = Wminusf + Wminusfb;
1244  pATop = bbar + pWminus;
1245  pTT = pTop + pATop;
1246  // No need for the TTH system in Higgs frame
1247  //pTTH = pTT + pH;
1248  }
1249 
1250  {
1251  TLorentzRotation TTframe;
1252 
1253  // z rotation
1254  TVector3 nNewZAxis = (-P1-P2-pTop-pATop).Vect().Unit(); // Let the z axis be formed by the (-P1-P2)--TT axis in the Higgs frame
1255  if (nNewZAxis != nullFourVector.Vect()){
1256  TVector3 nNewZAxisPerp = nNewZAxis.Cross(beamAxis);
1257  TTframe.Rotate(acos(nNewZAxis.Dot(beamAxis)), nNewZAxisPerp);
1258  }
1259 
1260  P1.Transform(TTframe);
1261  P2.Transform(TTframe);
1262  b.Transform(TTframe);
1263  Wplusf.Transform(TTframe);
1264  Wplusfb.Transform(TTframe);
1265  bbar.Transform(TTframe);
1266  Wminusf.Transform(TTframe);
1267  Wminusfb.Transform(TTframe);
1268 
1269  // Re-assign derived momenta
1270  pWplus = Wplusf + Wplusfb;
1271  pTop = b + pWplus;
1272  pWminus = Wminusf + Wminusfb;
1273  pATop = bbar + pWminus;
1274  }
1275 
1276  // Compute TT angles
1277  {
1278  float hs_dummy;
1279  int id_dummy_Wplus=24;
1280  int id_dummy_Wminus=-24;
1281  if (WplusfId!=-9000 && WplusfbId!=-9000) id_dummy_Wplus=-9000;
1282  if (WminusfId!=-9000 && WminusfbId!=-9000) id_dummy_Wminus=-9000;
1284  hs_dummy,
1285  hbb,
1286  hWW,
1287  Phibb, // -\Phi_b from arxiv:1606.03107
1288  Phi1bb, // This angle is the one between the bb plane and the TT-H plane instead of that between the WW plane and the TT-H plane as defined in arxiv:1606.03107.
1289  b, bId,
1290  bbar, bbarId,
1291  pWplus, id_dummy_Wplus,
1292  pWminus, id_dummy_Wminus
1293  );
1294  }
1295 
1296  // Wplus frame
1297  if (WplusfId!=-9000 && WplusfbId!=-9000){
1298  TLorentzVector pATop_tmp = pATop;
1299  TVector3 pWplus_boost = (Wplusf+Wplusfb).BoostVector();
1300  b.Boost(-pWplus_boost);
1301  Wplusf.Boost(-pWplus_boost);
1302  Wplusfb.Boost(-pWplus_boost);
1303  pATop_tmp.Boost(-pWplus_boost);
1304 
1305  TLorentzRotation Wplusframe;
1306 
1307  // z rotation
1308  TVector3 nNewZAxis = (b+Wplusf+Wplusfb-pATop_tmp).Vect().Unit(); // Let the z axis be formed by the TBar direction
1309  if (nNewZAxis != nullFourVector.Vect()){
1310  TVector3 nNewZAxisPerp = nNewZAxis.Cross(beamAxis);
1311  Wplusframe.Rotate(acos(nNewZAxis.Dot(beamAxis)), nNewZAxisPerp);
1312  }
1313 
1314  b.Transform(Wplusframe);
1315  Wplusf.Transform(Wplusframe);
1316  Wplusfb.Transform(Wplusframe);
1317 
1318  TVector3 n3_Wb = -b.Vect().Unit();
1319  TVector3 nW = ((Wplusf-Wplusfb).Vect().Cross(n3_Wb)).Unit();
1320  TVector3 nS = (beamAxis.Cross(n3_Wb)).Unit();
1321 
1322  // hWplusf
1323  hWplusf = n3_Wb.Dot(Wplusf.Vect().Unit());
1324  // PhiWplusf
1325  float tmpSgnPhiWplusf = n3_Wb.Dot(nW.Cross(nS));
1326  float sgnPhiWplusf = 0;
1327  if (fabs(tmpSgnPhiWplusf)>0.) sgnPhiWplusf = tmpSgnPhiWplusf/fabs(tmpSgnPhiWplusf);
1328  float dot_nWnS = nW.Dot(nS);
1329  if (fabs(dot_nWnS)>=1.) dot_nWnS *= 1./fabs(dot_nWnS);
1330  PhiWplusf = sgnPhiWplusf * acos(dot_nWnS);
1331  /*
1332  b.Transform(Wplusframe.Inverse());
1333  Wplusf.Transform(Wplusframe.Inverse());
1334  Wplusfb.Transform(Wplusframe.Inverse());
1335  */
1336  }
1337 
1338  // Wminus frame
1339  if (WminusfId!=-9000 && WminusfbId!=-9000){
1340  TLorentzVector pTop_tmp = pTop;
1341  TVector3 pWminus_boost = (Wminusf+Wminusfb).BoostVector();
1342  bbar.Boost(-pWminus_boost);
1343  Wminusf.Boost(-pWminus_boost);
1344  Wminusfb.Boost(-pWminus_boost);
1345  pTop_tmp.Boost(-pWminus_boost);
1346 
1347  TLorentzRotation Wminusframe;
1348 
1349  // z rotation
1350  TVector3 nNewZAxis = (pTop_tmp-bbar-Wminusf-Wminusfb).Vect().Unit(); // Let the z axis be formed by the T direction
1351  if (nNewZAxis != nullFourVector.Vect()){
1352  TVector3 nNewZAxisPerp = nNewZAxis.Cross(beamAxis);
1353  Wminusframe.Rotate(acos(nNewZAxis.Dot(beamAxis)), nNewZAxisPerp);
1354  }
1355 
1356  bbar.Transform(Wminusframe);
1357  Wminusf.Transform(Wminusframe);
1358  Wminusfb.Transform(Wminusframe);
1359 
1360  TVector3 n3_Wb = -bbar.Vect().Unit();
1361  TVector3 nW = ((Wminusf-Wminusfb).Vect().Cross(n3_Wb)).Unit();
1362  TVector3 nS = (beamAxis.Cross(n3_Wb)).Unit();
1363 
1364  // hWminusf
1365  hWminusf = n3_Wb.Dot(Wminusf.Vect().Unit());
1366  // PhiWminusf
1367  float tmpSgnPhiWminusf = n3_Wb.Dot(nW.Cross(nS));
1368  float sgnPhiWminusf = 0;
1369  if (fabs(tmpSgnPhiWminusf)>0.) sgnPhiWminusf = tmpSgnPhiWminusf/fabs(tmpSgnPhiWminusf);
1370  float dot_nWnS = nW.Dot(nS);
1371  if (fabs(dot_nWnS)>=1.) dot_nWnS *= 1./fabs(dot_nWnS);
1372  PhiWminusf = sgnPhiWminusf * acos(dot_nWnS);
1373  /*
1374  bbar.Transform(Wminusframe.Inverse());
1375  Wminusf.Transform(Wminusframe.Inverse());
1376  Wminusfb.Transform(Wminusframe.Inverse());
1377  */
1378  }
1379 }
1380 
1381 
1382 /****************************************************/
1383 /***** JHUGen- and MCFM-related ME computations *****/
1384 /****************************************************/
1385 
1386 void TUtil::SetEwkCouplingParameters(double ext_Gf, double ext_aemmz, double ext_mW, double ext_mZ, double ext_xW, int ext_ewscheme){
1387  // Set JHUGen couplings
1388  const double GeV=1./100.;
1389  double ext_mZ_jhu = ext_mZ*GeV;
1390  double ext_mW_jhu = ext_mW*GeV;
1391  double ext_Gf_jhu = ext_Gf/pow(GeV, 2);
1392  __modjhugenmela_MOD_setewparameters(&ext_mZ_jhu, &ext_mW_jhu, &ext_Gf_jhu, &ext_aemmz, &ext_xW);
1393 
1394  // Set MCFM couplings
1395  if (ext_ewscheme<-1 || ext_ewscheme>3) ext_ewscheme=3;
1396  ewinput_.Gf_inp = ext_Gf;
1397  ewinput_.aemmz_inp = ext_aemmz;
1398  ewinput_.wmass_inp = ext_mW;
1399  ewinput_.zmass_inp = ext_mZ;
1400  ewinput_.xw_inp = ext_xW;
1401  ewscheme_.ewscheme = ext_ewscheme;
1402  coupling_();
1403 
1404  // SETTINGS TO MATCH JHUGen ME/generator:
1405  /*
1406  ewscheme_.ewscheme = 3; // Switch ewscheme to full control, default is 1
1407  ewinput_.Gf_inp=1.16639E-05;
1408  ewinput_.aemmz_inp=1./128.;
1409  ewinput_.wmass_inp=80.399;
1410  ewinput_.zmass_inp=91.1876;
1411  ewinput_.xw_inp=0.23119;
1412  */
1413 
1414  // Settings used in Run I MC, un-synchronized to JHUGen and Run II generation
1415  /*
1416  ewinput_.Gf_inp = 1.16639E-05;
1417  ewinput_.wmass_inp = 80.385;
1418  ewinput_.zmass_inp = 91.1876;
1419  //ewinput_.aemmz_inp = 7.81751e-3; // Not used in the compiled new default MCFM ewcheme=1
1420  //ewinput_.xw_inp = 0.23116864; // Not used in the compiled new default MCFM ewcheme=1
1421  ewinput_.aemmz_inp = 7.562468901984759e-3;
1422  ewinput_.xw_inp = 0.2228972225239183;
1423  */
1424 
1425  // INPUT SETTINGS in default MCFM generator:
1426  /*
1427  ewscheme_.ewscheme = 1;
1428  ewinput_.Gf_inp=1.16639E-05;
1429  ewinput_.wmass_inp=80.398;
1430  ewinput_.zmass_inp=91.1876;
1431  ewinput_.aemmz_inp=7.7585538055706e-3;
1432  ewinput_.xw_inp=0.2312;
1433  */
1434 
1435  // ACTUAL SETTINGS in default MCFM generator, gives the same values as above but is more explicit
1436  /*
1437  ewscheme_.ewscheme = 3;
1438  ewinput_.Gf_inp=1.16639E-05;
1439  ewinput_.wmass_inp=80.398;
1440  ewinput_.zmass_inp=91.1876;
1441  ewinput_.aemmz_inp=7.55638390728736e-3;
1442  ewinput_.xw_inp=0.22264585341299625;
1443  */
1444 }
1445 void TUtil::SetMass(double inmass, int ipart){
1446  const int ipartabs = abs(ipart);
1447  bool runcoupling_mcfm=false;
1448  bool runcoupling_jhugen=false;
1449 
1450  // MCFM masses
1451  // Tprime and bprime masses are not defined in masses.f
1452  if (ipartabs==8) spinzerohiggs_anomcoupl_.mt_4gen = inmass;
1453  else if (ipartabs==7) spinzerohiggs_anomcoupl_.mb_4gen = inmass;
1454  else if (ipartabs==6){ masses_mcfm_.mt=inmass; runcoupling_mcfm=true; }
1455  else if (ipartabs==5){ masses_mcfm_.mb=inmass; masses_mcfm_.mbsq = pow(masses_mcfm_.mb, 2); runcoupling_mcfm=true; }
1456  else if (ipartabs==4){ masses_mcfm_.mc=inmass; masses_mcfm_.mcsq = pow(masses_mcfm_.mc, 2); runcoupling_mcfm=true; }
1457  else if (ipartabs==3) masses_mcfm_.ms=inmass;
1458  else if (ipartabs==2) masses_mcfm_.mu=inmass;
1459  else if (ipartabs==1) masses_mcfm_.md=inmass;
1460  else if (ipartabs==11) masses_mcfm_.mel=inmass;
1461  else if (ipartabs==13) masses_mcfm_.mmu=inmass;
1462  else if (ipartabs==15){ masses_mcfm_.mtau=inmass; masses_mcfm_.mtausq = pow(masses_mcfm_.mtau, 2); }
1463  else if (ipartabs==23){ masses_mcfm_.zmass=inmass; ewinput_.zmass_inp = inmass; runcoupling_mcfm=true; }
1464  else if (ipartabs==24){ masses_mcfm_.wmass=inmass; ewinput_.wmass_inp = inmass; runcoupling_mcfm=true; }
1465  else if (ipartabs==25) masses_mcfm_.hmass=inmass;
1466 
1467  // JHUGen masses
1468  if (
1469  ipartabs<=6
1470  ||
1471  (ipartabs>=11 && ipartabs<=16)
1472  ||
1473  ipartabs==23 || ipartabs==24 || ipartabs==25
1474  ||
1475  ipartabs==32 || ipartabs==34
1476  ){
1477  runcoupling_jhugen=(
1478  ipartabs==23
1479  ||
1480  ipartabs==24
1481  );
1482  const double GeV=1./100.;
1483  double jinmass = inmass*GeV;
1484  int jpart = convertLHEreverse(&ipart);
1485  __modparameters_MOD_setmass(&jinmass, &jpart);
1486  }
1487 
1488  // Recalculate couplings
1489  if (runcoupling_mcfm || runcoupling_jhugen) SetEwkCouplingParameters(ewcouple_.Gf, em_.aemmz, masses_mcfm_.wmass, masses_mcfm_.zmass, ewcouple_.xw, ewscheme_.ewscheme);
1490 }
1491 void TUtil::SetDecayWidth(double inwidth, int ipart){
1492  const int ipartabs = abs(ipart);
1493  // No need to recalculate couplings
1494  // MCFM masses
1495  if (ipartabs==6) masses_mcfm_.twidth=inwidth;
1496  else if (ipartabs==15) masses_mcfm_.tauwidth=inwidth;
1497  else if (ipartabs==23) masses_mcfm_.zwidth=inwidth;
1498  else if (ipartabs==24) masses_mcfm_.wwidth=inwidth;
1499  else if (ipartabs==25) masses_mcfm_.hwidth=inwidth;
1500 
1501  // JHUGen masses
1502  const double GeV=1./100.;
1503  double jinwidth = inwidth*GeV;
1504  int jpart = convertLHEreverse(&ipart);
1505  __modparameters_MOD_setdecaywidth(&jinwidth, &jpart);
1506 }
1507 void TUtil::SetCKMElements(double* invckm_ud, double* invckm_us, double* invckm_cd, double* invckm_cs, double* invckm_ts, double* invckm_tb, double* invckm_ub, double* invckm_cb, double* invckm_td){
1508  __modparameters_MOD_computeckmelements(invckm_ud, invckm_us, invckm_cd, invckm_cs, invckm_ts, invckm_tb, invckm_ub, invckm_cb, invckm_td);
1509 
1510  int i, j;
1511  i=2; j=1;
1512  cabib_.Vud = __modparameters_MOD_ckmbare(&i, &j);
1513  i=2; j=3;
1514  cabib_.Vus = __modparameters_MOD_ckmbare(&i, &j);
1515  i=2; j=5;
1516  cabib_.Vub = __modparameters_MOD_ckmbare(&i, &j);
1517  i=4; j=1;
1518  cabib_.Vcd = __modparameters_MOD_ckmbare(&i, &j);
1519  i=4; j=3;
1520  cabib_.Vcs = __modparameters_MOD_ckmbare(&i, &j);
1521  i=4; j=5;
1522  cabib_.Vcb = __modparameters_MOD_ckmbare(&i, &j);
1523  // Do not call ckmfill_(), it is called by MCFM_chooser!
1524 }
1525 double TUtil::GetCKMElement(int iquark, int jquark){
1526  return __modparameters_MOD_ckmbare(&iquark, &jquark);
1527 }
1528 
1529 double TUtil::GetMass(int ipart){
1530  const int ipartabs = abs(ipart);
1531 
1532  if (ipartabs==8) return spinzerohiggs_anomcoupl_.mt_4gen;
1533  else if (ipartabs==7) return spinzerohiggs_anomcoupl_.mb_4gen;
1534  else if (ipartabs==6) return masses_mcfm_.mt;
1535  else if (ipartabs==5) return masses_mcfm_.mb;
1536  else if (ipartabs==4) return masses_mcfm_.mc;
1537  else if (ipartabs==3) return masses_mcfm_.ms;
1538  else if (ipartabs==2) return masses_mcfm_.mu;
1539  else if (ipartabs==1) return masses_mcfm_.md;
1540  else if (ipartabs==11) return masses_mcfm_.mel;
1541  else if (ipartabs==13) return masses_mcfm_.mmu;
1542  else if (ipartabs==15) return masses_mcfm_.mtau;
1543  else if (ipartabs==23) return masses_mcfm_.zmass;
1544  else if (ipartabs==24) return masses_mcfm_.wmass;
1545  else if (ipartabs==25) return masses_mcfm_.hmass;
1546  else{
1547  // JHUGen masses
1548  if (
1549  ipartabs<=6 // (d, u, s, c, b, t)
1550  ||
1551  (ipartabs>=11 && ipartabs<=16) // (l, nu) x (e, mu, tau)
1552  ||
1553  ipartabs==23 || ipartabs==24 || ipartabs==25 // Z, W, H
1554  ||
1555  ipartabs==32 || ipartabs==34 // Z', W+-'
1556  ){
1557  const double GeV=1./100.;
1558  int jpart = convertLHEreverse(&ipart);
1559  double joutmass = __modparameters_MOD_getmass(&jpart);
1560  double outmass = joutmass/GeV;
1561  return outmass;
1562  }
1563  else return 0;
1564  }
1565 }
1566 double TUtil::GetDecayWidth(int ipart){
1567  const int ipartabs = abs(ipart);
1568 
1569  // MCFM widths
1570  if (ipartabs==6) return masses_mcfm_.twidth;
1571  else if (ipartabs==15) return masses_mcfm_.tauwidth;
1572  else if (ipartabs==23) return masses_mcfm_.zwidth;
1573  else if (ipartabs==24) return masses_mcfm_.wwidth;
1574  else if (ipartabs==25) return masses_mcfm_.hwidth;
1575  else{
1576  // JHUGen widths
1577  const double GeV=1./100.;
1578  int jpart = convertLHEreverse(&ipart);
1579  double joutwidth = __modparameters_MOD_getdecaywidth(&jpart);
1580  double outwidth = joutwidth/GeV;
1581  return outwidth;
1582  }
1583 }
1584 double TUtil::GetMass(const MELAParticle* part){
1585  if (part==nullptr) return GetMass(-9000);
1586  return GetMass(part->id);
1587 }
1589  if (part==nullptr) return GetDecayWidth(-9000);
1590  return GetDecayWidth(part->id);
1591 }
1592 void TUtil::GetMassWidth(int ipart, double& m, double& ga){
1593  m=TUtil::GetMass(ipart);
1594  ga=TUtil::GetDecayWidth(ipart);
1595 }
1596 void TUtil::GetMassWidth(const MELAParticle* part, double& m, double& ga){
1597  if (part==nullptr) return GetMassWidth(-9000, m, ga);
1598  return GetMassWidth(part->id, m, ga);
1599 }
1600 
1601 double TUtil::InterpretScaleScheme(const TVar::Production& production, const TVar::MatrixElement& matrixElement, const TVar::EventScaleScheme& scheme, TLorentzVector p[mxpart]){
1602  double Q=0;
1603  TLorentzVector const nullFourVector(0, 0, 0, 0);
1604  if (scheme == TVar::Fixed_mH) Q = masses_mcfm_.hmass;
1605  else if (scheme == TVar::Fixed_mW) Q = masses_mcfm_.wmass;
1606  else if (scheme == TVar::Fixed_mZ) Q = masses_mcfm_.zmass;
1607  else if (scheme == TVar::Fixed_mWPlusmH) Q = (masses_mcfm_.wmass+masses_mcfm_.hmass);
1608  else if (scheme == TVar::Fixed_mZPlusmH) Q = (masses_mcfm_.zmass+masses_mcfm_.hmass);
1609  else if (scheme == TVar::Fixed_TwomtPlusmH) Q = (2.*masses_mcfm_.mt+masses_mcfm_.hmass);
1610  else if (scheme == TVar::Fixed_mtPlusmH) Q = masses_mcfm_.mt+masses_mcfm_.hmass;
1611  else if (scheme == TVar::Dynamic_qH){
1612  TLorentzVector pTotal = p[2]+p[3]+p[4]+p[5];
1613  Q = fabs(pTotal.M());
1614  }
1615  else if (scheme == TVar::Dynamic_qJJH){
1616  TLorentzVector pTotal = p[2]+p[3]+p[4]+p[5]+p[6]+p[7];
1617  Q = fabs(pTotal.M());
1618  }
1619  else if (scheme == TVar::Dynamic_qJJ_qH){
1620  TLorentzVector qH = p[2]+p[3]+p[4]+p[5];
1621  TLorentzVector qJJ = p[6]+p[7];
1622  Q = fabs(qH.M()+qJJ.M());
1623  }
1624  else if (scheme == TVar::Dynamic_qJ_qJ_qH){
1625  TLorentzVector qH = p[2]+p[3]+p[4]+p[5];
1626  Q = fabs(qH.M()+p[6].M()+p[7].M());
1627  }
1628  else if (scheme == TVar::Dynamic_HT){
1629  for (int c=2; c<mxpart; c++) Q += p[c].Pt(); // Scalar sum of all pTs
1630  }
1631  else if (scheme == TVar::Dynamic_Leading_pTJ){
1632  // pT of the hardest jet, should be just p[6].Pt() if jets are already ordered in pT
1633  for (int c=6; c<mxpart; c++) Q = std::max(Q, p[c].Pt());
1634  }
1635  else if (scheme == TVar::Dynamic_Softest_pTJ){
1636  // pT of the softest jet, should be just p[7].Pt() if jets are already ordered in pT
1637  Q = p[6].Pt();
1638  for (int c=7; c<mxpart; c++){ if (p[c].Pt()>0.) Q = std::min(Q, p[c].Pt()); }
1639  if (Q<0.) Q = 0;
1640  }
1641  else if (scheme == TVar::DefaultScaleScheme){
1642  // Defaults are dynamic scales except in ttH and bbH.
1643  if (matrixElement==TVar::JHUGen){
1644  if (
1646  || production == TVar::JJVBF
1647  || production == TVar::JQCD
1648  || production == TVar::ZZGG
1649  || production == TVar::ZZQQB
1656  || production == TVar::GammaH
1657  ){
1658  TLorentzVector pTotal = p[2]+p[3]+p[4]+p[5];
1659  Q = fabs(pTotal.M());
1660  }
1661  else if (
1663  ||
1665  ) Q = (2.*masses_mcfm_.mt+masses_mcfm_.hmass);
1666  }
1667  else if (matrixElement==TVar::MCFM){
1668  if (
1671  || production == TVar::ZZQQB
1673 
1674  || production == TVar::JQCD
1675 
1676  || production == TVar::JJQCD
1677  || production == TVar::JJVBF
1678  || production == TVar::JJEW
1682 
1686  || production == TVar::JJEW_S
1690 
1698 
1699  || production == TVar::GammaH
1700  ){
1701  TLorentzVector pTotal = p[2]+p[3]+p[4]+p[5];
1702  Q = fabs(pTotal.M());
1703  }
1704  else if (
1706  || production == TVar::bbH
1707  ){ // ttH and bbH are not implemented through MCFM, will need revision if they are implemented.
1708  TLorentzVector pTotal = p[2]+p[3]+p[4]+p[5]+p[6]+p[7];
1709  Q = fabs(pTotal.M());
1710  }
1711  }
1712  }
1713 
1714  if (Q<=0.){
1715  MELAerr << "Scaling " << scheme << " fails for production " << production << ", defaulting to dynamic scheme m3456 " << endl;
1716  TLorentzVector pTotal = p[2]+p[3]+p[4]+p[5];
1717  Q = fabs(pTotal.M());
1718  }
1719  return Q;
1720 }
1721 void TUtil::SetAlphaS(double& Q_ren, double& Q_fac, double multiplier_ren, double multiplier_fac, int mynloop, int mynflav, string mypartons){
1722  bool hasReset=false;
1723  if (multiplier_ren<=0. || multiplier_fac<=0.){
1724  MELAerr << "TUtil::SetAlphaS: Invalid scale multipliers" << endl;
1725  return;
1726  }
1727  if (Q_ren<=1. || Q_fac<=1. || mynloop<=0 || mypartons.compare("Default")==0){
1728  if (Q_ren<0.) MELAout << "TUtil::SetAlphaS: Invalid QCD scale for alpha_s, setting to mH/2..." << endl;
1729  if (Q_fac<0.) MELAout << "TUtil::SetAlphaS: Invalid factorization scale, setting to mH/2..." << endl;
1730  Q_ren = (masses_mcfm_.hmass)*0.5;
1731  Q_fac = Q_ren;
1732  mynloop = 1;
1733  hasReset=true;
1734  }
1735  if (!hasReset){
1736  Q_ren *= multiplier_ren;
1737  Q_fac *= multiplier_fac;
1738  }
1739 
1740  /***** MCFM Alpha_S *****/
1741  bool nflav_is_same = (nflav_.nflav == mynflav);
1742  if (!nflav_is_same) MELAout << "TUtil::SetAlphaS: nflav=" << nflav_.nflav << " is the only one supported." << endl;
1743  scale_.scale = Q_ren;
1744  scale_.musq = Q_ren*Q_ren;
1745  facscale_.facscale = Q_fac;
1746  if (mynloop!=1){
1747  MELAout << "TUtil::SetAlphaS: Only nloop=1 is supported!" << endl;
1748  mynloop=1;
1749  }
1750  nlooprun_.nlooprun = mynloop;
1751 
1752  /***** JHUGen Alpha_S *****/
1753  /*
1755  // For proper pdfwrapper_linux.f execution (alpha_s computation does not use pdf but examines the pdf name to initialize amz.)
1756  if (mypartons.compare("Default")!=0 && mypartons.compare("cteq6_l")!=0 && mypartons.compare("cteq6l1")!=0){
1757  MELAout << "Only default=cteq6l1 or cteq6_l are supported. Modify mela.cc symlinks, put the pdf table into data/Pdfdata and retry. Setting mypartons to Default..." << endl;
1758  mypartons = "Default";
1759  }
1760  // From pdfwrapper_linux.f:
1761  if (mypartons.compare("cteq6_l")==0) couple_.amz = 0.118;
1762  else if (mypartons.compare("cteq6l1")==0 || mypartons.compare("Default")==0) couple_.amz = 0.130;
1763  else couple_.amz = 0.118; // Add pdf as appropriate
1764 
1765  if (!nflav_is_same){
1766  nflav_.nflav = mynflav;
1767 
1768  if (mypartons.compare("Default")!=0) sprintf(pdlabel_.pdlabel, "%s", mypartons.c_str());
1769  else sprintf(pdlabel_.pdlabel, "%s", "cteq6l1"); // Default pdf is cteq6l1
1770  coupling2_();
1771  }
1772  else qcdcouple_.as = alphas_(&(scale_.scale), &(couple_.amz), &(nlooprun_.nlooprun));
1773  */
1774 
1775  const double GeV=1./100.;
1776  double muren_jhu = scale_.scale*GeV;
1777  double mufac_jhu = facscale_.facscale*GeV;
1778  __modjhugenmela_MOD_setmurenfac(&muren_jhu, &mufac_jhu);
1780  TUtil::GetAlphaS(&(qcdcouple_.as), &(couple_.amz));
1781 
1782  qcdcouple_.gsq = 4.0*TMath::Pi()*qcdcouple_.as;
1783  qcdcouple_.ason2pi = qcdcouple_.as/(2.0*TMath::Pi());
1784  qcdcouple_.ason4pi = qcdcouple_.as/(4.0*TMath::Pi());
1785 
1786  // TEST RUNNING SCALE PER EVENT:
1787  /*
1788  if(verbosity >= TVar::DEBUG){
1789  MELAout << "My pdf is: " << pdlabel_.pdlabel << endl;
1790  MELAout << "My Q_ren: " << Q_ren << " | My alpha_s: " << qcdcouple_.as << " at order " << nlooprun_.nlooprun << " with a(m_Z): " << couple_.amz << '\t'
1791  << "Nflav: " << nflav_.nflav << endl;
1792  */
1793 }
1794 void TUtil::GetAlphaS(double* alphas_, double* alphasmz_){
1795  double alphasVal=0, alphasmzVal=0;
1796  __modjhugenmela_MOD_getalphasalphasmz(&alphasVal, &alphasmzVal);
1797  if (alphas_!=0) *alphas_ = alphasVal;
1798  if (alphasmz_!=0) *alphasmz_ = alphasmzVal;
1799 }
1800 
1801 // chooser.f split into 2 different functions
1803  const TVar::Process& process, const TVar::Production& production, const TVar::LeptonInterference& leptonInterf,
1804  const TVar::VerbosityLevel& verbosity,
1805  const simple_event_record& mela_event
1806  ){
1807  bool result = true;
1808 
1809  unsigned int ndau = mela_event.pDaughters.size();
1810  int* pId = new int[ndau];
1811  for (unsigned int ip=0; ip<ndau; ip++){
1812  pId[ip]=mela_event.pDaughters.at(ip).first;
1813  }
1814  bool isWW = (ndau>=4 && PDGHelpers::isAWBoson(mela_event.intermediateVid.at(0)) && PDGHelpers::isAWBoson(mela_event.intermediateVid.at(1)));
1815  bool isZZ = (ndau>=4 && PDGHelpers::isAZBoson(mela_event.intermediateVid.at(0)) && PDGHelpers::isAZBoson(mela_event.intermediateVid.at(1)));
1816  bool hasZZ4fInterf = isZZ && abs(pId[0])==abs(pId[2]) && abs(pId[1])==abs(pId[3]) && !PDGHelpers::isAnUnknownJet(pId[0]) && !PDGHelpers::isAnUnknownJet(pId[3]);
1817  //bool isZJJ = false;
1818  //if (ndau>=4) isZJJ = (PDGHelpers::isAZBoson(mela_event.intermediateVid.at(0)) && PDGHelpers::isAJet(pId[2]) && PDGHelpers::isAJet(pId[3])); // Notice both isZZ and isZJJ could be true
1819  //bool isZG = (ndau>=3 && PDGHelpers::isAZBoson(mela_event.intermediateVid.at(0)) && PDGHelpers::isAPhoton(mela_event.intermediateVid.at(1)));
1820  bool isGG = (ndau>=2 && PDGHelpers::isAPhoton(mela_event.intermediateVid.at(0)) && PDGHelpers::isAPhoton(mela_event.intermediateVid.at(1)));
1821  if (verbosity>=TVar::DEBUG) MELAout << "TUtil::MCFM_chooser: isWW=" << (int)isWW << ", isZZ=" << (int)isZZ << ", hasZZ4fInterf=" << (int)hasZZ4fInterf << endl;
1822 
1823  npart_.npart=4; // Default number of particles is just 4, indicating no associated particles
1824  sprintf(runstring_.runstring, "test");
1825 
1826  if (
1827  ndau>=4
1828  &&
1829  (
1831  ||
1833  )
1834  ){
1835  //81 ' f(p1)+f(p2) --> Z^0(-->mu^-(p3)+mu^+(p4)) + Z^0(-->e^-(p5)+e^+(p6))'
1836  //86 ' f(p1)+f(p2) --> Z^0(-->e^-(p5)+e^+(p6))+Z^0(-->mu^-(p3)+mu^+(p4)) (NO GAMMA*)'
1837  //90 ' f(p1)+f(p2) --> Z^0(-->e^-(p3)+e^+(p4)) + Z^0(-->e^-(p5)+e^+(p6))' 'L'
1838 
1839  nqcdjets_.nqcdjets=0;
1840  srdiags_.srdiags=true;
1841  nwz_.nwz=0; ckmfill_(&(nwz_.nwz));
1842  bveg1_mcfm_.ndim=10;
1843  breit_.n2=1;
1844  breit_.n3=1;
1845  breit_.mass2=masses_mcfm_.zmass;
1846  breit_.width2=masses_mcfm_.zwidth;
1847  breit_.mass3=masses_mcfm_.zmass;
1848  breit_.width3=masses_mcfm_.zwidth;
1849 
1850  vsymfact_.vsymfact=1.0;
1851  interference_.interference=false;
1852  if (hasZZ4fInterf && (leptonInterf==TVar::DefaultLeptonInterf || leptonInterf==TVar::InterfOn)){
1853  //90 ' f(p1)+f(p2) --> Z^0(-->e^-(p3)+e^+(p4)) + Z^0(-->e^-(p5)+e^+(p6))' 'L'
1854  vsymfact_.vsymfact=0.5;
1855  interference_.interference=true;
1856  }
1857 
1858  if (verbosity>=TVar::DEBUG) MELAout << "TUtil::MCFM_chooser: Setup is (production, process)=(" << TVar::ProductionName(production) << ", " << TVar::ProcessName(process) << ")" << endl;
1859 
1860  }
1861  else if (
1862  ndau>=4
1863  &&
1865  ){
1866  // Processes 61 (4l), 62 (2l2q), 64 (2q2l)
1867 
1868  nqcdjets_.nqcdjets=0;
1869  nwz_.nwz=1; ckmfill_(&(nwz_.nwz));
1870  bveg1_mcfm_.ndim=10;
1871  breit_.n2=1;
1872  breit_.n3=1;
1873  breit_.mass2=masses_mcfm_.wmass;
1874  breit_.width2=masses_mcfm_.wwidth;
1875  breit_.mass3=masses_mcfm_.wmass;
1876  breit_.width3=masses_mcfm_.wwidth;
1877  srdiags_.srdiags=true;
1878 
1879  if (verbosity>=TVar::DEBUG) MELAout << "TUtil::MCFM_chooser: Setup is (production, process)=(" << TVar::ProductionName(production) << ", " << TVar::ProcessName(process) << ")" << endl;
1880 
1881  }
1882  else if (
1883  (ndau>=4 || ndau==2)
1884  &&
1886  &&
1888  ){
1889  // -- 44 ' f(p1)+f(p2) --> Z^0(-->e^-(p3)+e^+(p4))+f(p5)+f(p6)'
1890  // these settings are identical to use the chooser_() function
1891 
1892  flags_.Gflag=true;
1893  flags_.Qflag=true;
1894  flags_.QandGflag=true; // This is in case NLO is implemented.
1895  bveg1_mcfm_.ndim=10;
1896  breit_.n2=0;
1897  breit_.n3=1;
1898  nqcdjets_.nqcdjets=2;
1899  nwz_.nwz=0; ckmfill_(&(nwz_.nwz));
1900  breit_.mass3=masses_mcfm_.zmass;
1901  breit_.width3=masses_mcfm_.zwidth;
1902 
1903  if (verbosity>=TVar::DEBUG) MELAout << "TUtil::MCFM_chooser: Setup is (production, process)=(" << TVar::ProductionName(production) << ", " << TVar::ProcessName(process) << ")" << endl;
1904 
1905  }
1906  else if (
1907  ndau==3
1908  &&
1910  &&
1912  ){
1913  // -- 300 ' f(p1)+f(p2) --> Z^0(-->e^-(p3)+e^+(p4))+gamma(p5)'
1914  // -- 305 ' f(p1)+f(p2) --> Z^0(-->3*(nu(p3)+nu~(p4)))-(sum over 3 nu)+gamma(p5)'
1915 
1916  nqcdjets_.nqcdjets=0;
1917  bveg1_mcfm_.ndim=7;
1918  breit_.n2=0;
1919  breit_.n3=1;
1920  breit_.mass3=masses_mcfm_.zmass;
1921  breit_.width3=masses_mcfm_.zwidth;
1922  //lastphot_.lastphot=5; // Done during particle label assignment
1923  nwz_.nwz=0; ckmfill_(&(nwz_.nwz));
1924 
1925  if (verbosity>=TVar::DEBUG) MELAout << "TUtil::MCFM_chooser: Setup is (production, process)=(" << TVar::ProductionName(production) << ", " << TVar::ProcessName(process) << ")" << endl;
1926 
1927  }
1928  else if (
1929  isGG
1930  &&
1932  &&
1934  ){
1935  // -- 285 ' f(p1)+f(p2) --> gamma(p3)+gamma(p4)'
1936 
1937  nqcdjets_.nqcdjets=0;
1938  bveg1_mcfm_.ndim=4;
1939  breit_.n3=0;
1940  lastphot_.lastphot=4;
1941  nwz_.nwz=0; ckmfill_(&(nwz_.nwz));
1942  if (production == TVar::ZZQQB || production == TVar::ZZINDEPENDENT) noglue_.omitgg=true;
1943  else noglue_.omitgg=false;
1944 
1945  if (verbosity>=TVar::DEBUG) MELAout << "TUtil::MCFM_chooser: Setup is (production, process)=(" << TVar::ProductionName(production) << ", " << TVar::ProcessName(process) << ")" << endl;
1946 
1947  }
1948  else if (
1949  ndau>=4
1950  &&
1952  &&
1954  ){
1955  /*
1956  nprocs:
1957  c--- 128 ' f(p1)+f(p2) --> H(--> Z^0(e^-(p3)+e^+(p4)) + Z^0(mu^-(p5)+mu^+(p6)) [top, bottom loops, exact]' 'L'
1958  c--- 129 ' f(p1)+f(p2) --> H(--> Z^0(e^-(p3)+e^+(p4)) + Z^0(mu^-(p5)+mu^+(p6)) [only H, gg->ZZ intf.]' 'L' -> NOT IMPLEMENTED
1959  c--- 130 ' f(p1)+f(p2) --> H(--> Z^0(e^-(p3)+e^+(p4)) + Z^0(mu^-(p5)+mu^+(p6)) [H squared and H, gg->ZZ intf.]' 'L'
1960  c--- 131 ' f(p1)+f(p2) --> Z^0(e^-(p3)+e^+(p4)) + Z^0(mu^-(p5)+mu^+(p6) [gg only, (H + gg->ZZ) squared]' 'L'
1961  c--- 132 ' f(p1)+f(p2) --> Z^0(e^-(p3)+e^+(p4)) + Z^0(mu^-(p5)+mu^+(p6) [(gg->ZZ) squared]' 'L'
1962  */
1963 
1964  nqcdjets_.nqcdjets=0;
1965  nwz_.nwz=0; ckmfill_(&(nwz_.nwz));
1966  bveg1_mcfm_.ndim=10;
1967  breit_.n2=1;
1968  breit_.n3=1;
1969  breit_.mass2 =masses_mcfm_.zmass;
1970  breit_.width2=masses_mcfm_.zwidth;
1971  breit_.mass3 =masses_mcfm_.zmass;
1972  breit_.width3=masses_mcfm_.zwidth;
1973 
1974  vsymfact_.vsymfact=1.0;
1975  interference_.interference=false;
1976  if (hasZZ4fInterf && (leptonInterf==TVar::DefaultLeptonInterf || leptonInterf==TVar::InterfOn)){
1977  vsymfact_.vsymfact=0.5;
1978  interference_.interference=true;
1979  }
1980 
1981  if (verbosity>=TVar::DEBUG) MELAout << "TUtil::MCFM_chooser: Setup is (production, process)=(" << TVar::ProductionName(production) << ", " << TVar::ProcessName(process) << ")" << endl;
1982 
1983  }
1984  else if (
1985  ndau>=4
1986  &&
1988  &&
1989  (
1990  (
1992  )
1993  ||
1994  (
1995  ((isWW || isZZ) && (process == TVar::bkgWWZZ || process == TVar::HSMHiggs_WWZZ || process == TVar::bkgWWZZ_SMHiggs))
1996  )
1997  )
1998  ){ // gg->VV
1999  // Processes 1281, 1311, 1321
2000 
2001  nwz_.nwz=0; ckmfill_(&(nwz_.nwz));
2002  nqcdjets_.nqcdjets=0;
2003  bveg1_mcfm_.ndim=10;
2004  breit_.n2=1;
2005  breit_.n3=1;
2006  nuflav_.nuflav=1; // Keep this at 1. Mela controls how many flavors in a more exact way.
2007 
2008  if (verbosity>=TVar::DEBUG) MELAout << "TUtil::MCFM_chooser: Setup is (production, process)=(" << TVar::ProductionName(production) << ", " << TVar::ProcessName(process) << ")" << endl;
2009 
2010  }
2011  // JJ + ZZ->4f
2012  else if ( // Check for support in qq'H+2J
2013  ndau>=4
2014  &&
2015  (
2025  )
2026  &&
2028  ){
2029  // 220 ' f(p1)+f(p2) --> Z(e-(p3),e^+(p4))Z(mu-(p5),mu+(p6)))+f(p7)+f(p8) [weak]' 'L'
2030 
2031  if (process == TVar::bkgZZ) sprintf(runstring_.runstring, "wbfBO");
2032  else if (process == TVar::HSMHiggs) sprintf(runstring_.runstring, "wbfHO");
2033 
2034  npart_.npart=6;
2035  nwz_.nwz=2; ckmfill_(&(nwz_.nwz));
2036  bveg1_mcfm_.ndim=16;
2037  nqcdjets_.nqcdjets=2;
2038  breit_.n2=1;
2039  breit_.n3=1;
2040  breit_.mass2 =masses_mcfm_.zmass;
2041  breit_.width2=masses_mcfm_.zwidth;
2042  breit_.mass3 =masses_mcfm_.zmass;
2043  breit_.width3=masses_mcfm_.zwidth;
2044 
2045  vsymfact_.vsymfact=1.0;
2046  interference_.interference=false;
2047  if (hasZZ4fInterf && (leptonInterf==TVar::DefaultLeptonInterf || leptonInterf==TVar::InterfOn)){
2048  vsymfact_.vsymfact=0.5;
2049  interference_.interference=true;
2050  }
2051 
2052  if (verbosity>=TVar::DEBUG) MELAout << "TUtil::MCFM_chooser: Setup is (production, process)=(" << TVar::ProductionName(production) << ", " << TVar::ProcessName(process) << ")" << endl;
2053 
2054  }
2055  // JJ + WW->4f
2056  else if ( // Check for support in qq'H+2J
2057  ndau>=4
2058  &&
2059  (
2069  )
2070  &&
2072  ){
2073  // Process 224
2074 
2075  if (process == TVar::bkgWW) sprintf(runstring_.runstring, "wbfBO");
2076  else if (process == TVar::HSMHiggs) sprintf(runstring_.runstring, "wbfHO");
2077 
2078  npart_.npart=6;
2079  nwz_.nwz=2; ckmfill_(&(nwz_.nwz));
2080  bveg1_mcfm_.ndim=16;
2081  nqcdjets_.nqcdjets=2;
2082  breit_.n2=1;
2083  breit_.n3=1;
2084  breit_.mass2 =masses_mcfm_.wmass;
2085  breit_.width2=masses_mcfm_.wwidth;
2086  breit_.mass3 =masses_mcfm_.wmass;
2087  breit_.width3=masses_mcfm_.wwidth;
2088 
2089  if (verbosity>=TVar::DEBUG) MELAout << "TUtil::MCFM_chooser: Setup is (production, process)=(" << TVar::ProductionName(production) << ", " << TVar::ProcessName(process) << ")" << endl;
2090 
2091  }
2092  // JJ + VV->4f
2093  else if ( // Check for support in qq'H+2J
2094  ndau>=4
2095  &&
2096  (
2106  )
2107  &&
2108  ((isZZ || isWW) && (process == TVar::bkgWWZZ || process == TVar::HSMHiggs_WWZZ || process == TVar::bkgWWZZ_SMHiggs))
2109  ){
2110  // Procsss 226
2111 
2112  if (process == TVar::bkgWWZZ) sprintf(runstring_.runstring, "wbfBO");
2113  else if (process == TVar::HSMHiggs_WWZZ) sprintf(runstring_.runstring, "wbfHO");
2114 
2115  npart_.npart=6;
2116  nwz_.nwz=2; ckmfill_(&(nwz_.nwz));
2117  bveg1_mcfm_.ndim=16;
2118  nqcdjets_.nqcdjets=2;
2119  breit_.n2=1;
2120  breit_.n3=1;
2121  breit_.mass2 =masses_mcfm_.wmass;
2122  breit_.width2=masses_mcfm_.wwidth;
2123  breit_.mass3 =masses_mcfm_.wmass;
2124  breit_.width3=masses_mcfm_.wwidth;
2125 
2126  if (verbosity>=TVar::DEBUG) MELAout << "TUtil::MCFM_chooser: Setup is (production, process)=(" << TVar::ProductionName(production) << ", " << TVar::ProcessName(process) << ")" << endl;
2127 
2128  }
2129  // JJ + ZZ->4f (QCD)
2130  else if (
2131  ndau>=4
2132  &&
2133  (
2134  production == TVar::JJQCD/* || production == TVar::JJQCD_S || production == TVar::JJQCD_TU*/
2136  )
2137  &&
2138  (isZZ && process == TVar::bkgZZ) // ME is bkg-only
2139  ){
2140  // 2201 ' f(p1)+f(p2) --> Z(e-(p3),e^+(p4))Z(mu-(p5),mu+(p6)))+f(p7)+f(p8) [strong]' 'L'
2141  /*
2142  NOTE TO DEVELOPER
2143  MCFM also sets common/VVstrong/VVstrong (logical) here, but it only controls which ww_ZZqq function is called.
2144  It is irrelevant as long as eventgeneration through lowint is not used directly through MELA.
2145  */
2146  npart_.npart=6;
2147  nwz_.nwz=2; ckmfill_(&(nwz_.nwz));
2148  bveg1_mcfm_.ndim=16;
2149  nqcdjets_.nqcdjets=2;
2150  breit_.n2=1;
2151  breit_.n3=1;
2152  breit_.mass2 =masses_mcfm_.zmass;
2153  breit_.width2=masses_mcfm_.zwidth;
2154  breit_.mass3 =masses_mcfm_.zmass;
2155  breit_.width3=masses_mcfm_.zwidth;
2156 
2157  vsymfact_.vsymfact=1.0;
2158  interference_.interference=false;
2159  if (hasZZ4fInterf && (leptonInterf==TVar::DefaultLeptonInterf || leptonInterf==TVar::InterfOn)){
2160  vsymfact_.vsymfact=0.5;
2161  interference_.interference=true;
2162  }
2163 
2164  if (verbosity>=TVar::DEBUG) MELAout << "TUtil::MCFM_chooser: Setup is (production, process)=(" << TVar::ProductionName(production) << ", " << TVar::ProcessName(process) << ")" << endl;
2165 
2166  }
2167  // JJ + WW->4f (QCD)
2168  else if (
2169  ndau>=4
2170  &&
2171  (
2172  production == TVar::JJQCD/* || production == TVar::JJQCD_S || production == TVar::JJQCD_TU*/
2174  )
2175  &&
2176  (isWW && process == TVar::bkgWW) // ME is bkg-only
2177  ){
2178  // Process 2241
2179  /*
2180  NOTE TO DEVELOPER
2181  MCFM also sets common/VVstrong/VVstrong (logical) here, but it only controls which ww_ZZqq function is called.
2182  It is irrelevant as long as eventgeneration through lowint is not used directly through MELA.
2183  */
2184  npart_.npart=6;
2185  nwz_.nwz=2; ckmfill_(&(nwz_.nwz));
2186  bveg1_mcfm_.ndim=16;
2187  nqcdjets_.nqcdjets=2;
2188  breit_.n2=1;
2189  breit_.n3=1;
2190  breit_.mass2 =masses_mcfm_.wmass;
2191  breit_.width2=masses_mcfm_.wwidth;
2192  breit_.mass3 =masses_mcfm_.wmass;
2193  breit_.width3=masses_mcfm_.wwidth;
2194 
2195  if (verbosity>=TVar::DEBUG) MELAout << "TUtil::MCFM_chooser: Setup is (production, process)=(" << TVar::ProductionName(production) << ", " << TVar::ProcessName(process) << ")" << endl;
2196 
2197  }
2198  // JJ + VV->4f (QCD)
2199  else if (
2200  ndau>=4
2201  &&
2202  (
2203  production == TVar::JJQCD/* || production == TVar::JJQCD_S || production == TVar::JJQCD_TU*/
2205  )
2206  &&
2207  ((isZZ || isWW) && process == TVar::bkgWWZZ)
2208  ){
2209  // Procsss 2261 (not supported yet)
2210  MELAerr << "TUtil::MCFM_chooser: MCFM does not support QCD JJ+VV->4f interaction yet. Please contact the MELA authors if you need more information." << endl;
2211  result = false;
2212 
2213  }
2214  else{
2215  MELAerr << "TUtil::MCFM_chooser: Can't identify (process, production) = (" << process << ", " << production << ")" << endl;
2216  MELAerr << "TUtil::MCFM_chooser: ndau: " << ndau << '\t';
2217  MELAerr << "TUtil::MCFM_chooser: isZZ: " << isZZ << '\t';
2218  MELAerr << "TUtil::MCFM_chooser: isWW: " << isWW << '\t';
2219  MELAerr << "TUtil::MCFM_chooser: isGG: " << isGG << '\t';
2220  MELAerr << endl;
2221  result = false;
2222  }
2223 
2224  delete[] pId;
2225  return result;
2226 }
2229  const TVar::VerbosityLevel& verbosity,
2230  const simple_event_record& mela_event,
2231  std::vector<int>* partOrder, std::vector<int>* apartOrder
2232  ){
2233  bool result=true;
2234 
2235  // Initialize Z couplings
2236  zcouple_.q1=0;
2237  zcouple_.l1=0;
2238  zcouple_.r1=0;
2239  zcouple_.q2=0;
2240  zcouple_.l2=0;
2241  zcouple_.r2=0;
2242 
2243  // Initialize plabels
2244  TString strplabel[mxpart];
2245  for (int ip=0; ip<mxpart; ip++) strplabel[ip]=" ";
2246 
2247  // Channel checks
2248  unsigned int ndau = mela_event.pDaughters.size();
2249  if (ndau<1) return false;
2250  unsigned int napart = mela_event.pAssociated.size();
2251  bool isWW = (ndau>=4 && PDGHelpers::isAWBoson(mela_event.intermediateVid.at(0)) && PDGHelpers::isAWBoson(mela_event.intermediateVid.at(1)));
2252  bool isZZ = (ndau>=4 && PDGHelpers::isAZBoson(mela_event.intermediateVid.at(0)) && PDGHelpers::isAZBoson(mela_event.intermediateVid.at(1)));
2253  //bool hasZZ4fInterf = isZZ && abs(pId[0])==abs(pId[2]) && abs(pId[1])==abs(pId[3]) && !PDGHelpers::isAnUnknownJet(pId[0]) && !PDGHelpers::isAnUnknownJet(pId[3]);
2254  bool isZJJ = false;
2255  if (ndau>=4) isZJJ = PDGHelpers::isAZBoson(mela_event.intermediateVid.at(0)); // No check on whether daughters 2 and 3 are jets. Notice both isZZ and isZJJ could be true
2256  else if (ndau==2 && process == TVar::bkgZJets){ // Check whether the two daughters can create a Z
2257  isZJJ = (
2259  ||
2260  ((PDGHelpers::isAnUnknownJet(mela_event.intermediateVid.at(0)) || PDGHelpers::isAQuark(mela_event.intermediateVid.at(0))) && (PDGHelpers::isAnUnknownJet(mela_event.intermediateVid.at(1)) || PDGHelpers::isAQuark(mela_event.intermediateVid.at(1))))
2261  );
2262  }
2263  bool isZG = (ndau>=3 && PDGHelpers::isAZBoson(mela_event.intermediateVid.at(0)) && PDGHelpers::isAPhoton(mela_event.intermediateVid.at(1)));
2264  bool isGG = (ndau>=2 && PDGHelpers::isAPhoton(mela_event.intermediateVid.at(0)) && PDGHelpers::isAPhoton(mela_event.intermediateVid.at(1)));
2265  bool hasZ1 = (isZZ || isZG || isZJJ);
2266  bool hasZ2 = isZZ;
2267  bool hasW1 = isWW;
2268  bool hasW2 = isWW;
2269  if (verbosity>=TVar::DEBUG){
2270  MELAout << "TUtil::MCFM_SetupParticleCouplings(" << TVar::ProductionName(production) << ", " << TVar::ProcessName(process) << "):\nInitial configuration ";
2271  vector<TString> strcfgs;
2272  if (isGG) strcfgs.push_back(TString("GG"));
2273  if (isZG) strcfgs.push_back(TString("ZG"));
2274  if (isZZ) strcfgs.push_back(TString("ZZ"));
2275  if (isZJJ) strcfgs.push_back(TString("ZJJ"));
2276  if (isWW) strcfgs.push_back(TString("WW"));
2277  if (!strcfgs.empty()){
2278  MELAout << "is ";
2279  for (unsigned int istr=0; istr<strcfgs.size(); istr++){
2280  if (istr==0) MELAout << strcfgs.at(istr);
2281  else MELAout << ", " << strcfgs.at(istr);
2282  }
2283  MELAout << ".";
2284  }
2285  else MELAout << "has no valid decay!";
2286  MELAout << endl;
2287  }
2288 
2289  // Setup the ordering arrays
2290  int* pApartOrder = 0;
2291  int* pApartId = 0;
2292  if (napart>0){
2293  pApartOrder = new int[napart];
2294  pApartId = new int[napart];
2295  for (unsigned int ip=0; ip<napart; ip++){
2296  pApartOrder[ip]=ip; // This order USUALLY does not change!
2297  pApartId[ip]=mela_event.pAssociated.at(ip).first; // This order does not change.
2298  }
2299  }
2300  int* pOrder = new int[ndau];
2301  int* pZOrder = new int[ndau];
2302  int* pWOrder = new int[ndau];
2303  int* pId = new int[ndau];
2304  for (unsigned int ip=0; ip<ndau; ip++){
2305  pOrder[ip]=ip; // This order does not change
2306  pZOrder[ip]=ip;
2307  pWOrder[ip]=ip;
2308  pId[ip]=mela_event.pDaughters.at(ip).first; // This order does not change.
2309  }
2310 
2311  // Special case checks
2312  bool useQQBZGAM = (isZG && process == TVar::bkgZGamma && (production == TVar::ZZQQB || production == TVar::ZZINDEPENDENT));
2313  bool useQQVVQQ =
2314  (
2317  || ((isZZ || isWW) && (process == TVar::bkgWWZZ || process == TVar::HSMHiggs_WWZZ || process == TVar::bkgWWZZ_SMHiggs)))
2318  &&
2328  );
2329  bool useQQVVQQstrong =
2330  (
2331  ((isZZ && process == TVar::bkgZZ) || (isWW && process == TVar::bkgWW) || ((isZZ || isWW) && process == TVar::bkgWWZZ))
2332  &&
2334  );
2335  bool useQQVVQQboth =
2336  (
2337  ((isZZ && process == TVar::bkgZZ) || (isWW && process == TVar::bkgWW) || ((isZZ || isWW) && process == TVar::bkgWWZZ))
2338  &&
2340  );
2341  bool useQQVVQQany = useQQVVQQ || useQQVVQQstrong || useQQVVQQboth;
2342 
2343  /**************************/
2344  /* Begin the setup checks */
2345  /**************************/
2346  // Check first if the decay mode is valid and the number of associated particles is consistent with the requested number
2347  if (
2348  !(isWW || isZZ || isZJJ || isZG || isGG) // Only ZZ, WW, ZG or GG supported in MCFM
2349  ||
2350  ((int)napart<(mela_event.nRequested_AssociatedJets+mela_event.nRequested_AssociatedLeptons)) // Associated particle not found
2351  ) result=false;
2352  else{
2353 
2354  if (isWW && !hasZ1 && !hasZ2){
2355  // Default swap is 3-5
2356  // For ggVV amplitudes, MCFM generates W+W- and does 3-5 swap inside the ME, so by definition, this is ok.
2357  // For VBFWW amplitudes, MCFM generates W-W+ in the phase space and does a 4-6 swap before passing to the ME. The ordering here is W+W-, so this is equivalent to doing a 3-5 swap to get the corresponding ZZ-like combinations.
2358  swap(pZOrder[0], pZOrder[2]);
2359 
2360  int V1id, V2id;
2361  if (!PDGHelpers::isAnUnknownJet(pId[pZOrder[0]]) && !PDGHelpers::isAnUnknownJet(pId[pZOrder[1]])) V1id = PDGHelpers::getCoupledVertex(pId[pZOrder[0]], pId[pZOrder[1]]);
2362  else V1id = 23;
2363  if (!PDGHelpers::isAnUnknownJet(pId[pZOrder[2]]) && !PDGHelpers::isAnUnknownJet(pId[pZOrder[3]])) V2id = PDGHelpers::getCoupledVertex(pId[pZOrder[2]], pId[pZOrder[3]]);
2364  else V2id = 23;
2365  hasZ1=hasZ1 || PDGHelpers::isAZBoson(V1id);
2366  hasZ2=hasZ2 || PDGHelpers::isAZBoson(V2id);
2367  if (!hasZ1 && hasZ2){
2368  swap(pZOrder[0], pZOrder[2]);
2369  swap(pZOrder[1], pZOrder[3]);
2370  swap(hasZ1, hasZ2);
2371  }
2372  if (verbosity>=TVar::DEBUG){
2373  if (hasZ1) MELAout << "TUtil::MCFM_SetupParticleCouplings: Found a Z1";
2374  if (hasZ2) MELAout << " and a Z2";
2375  if (hasZ1 || hasZ2) MELAout << " in WW." << endl;
2376  }
2377  }
2378  if (isZZ && !hasW1 && !hasW2){
2379  swap(pWOrder[0], pWOrder[2]);
2380 
2381  int V1id, V2id;
2382  if (!PDGHelpers::isAnUnknownJet(pId[pWOrder[0]]) && !PDGHelpers::isAnUnknownJet(pId[pWOrder[1]])) V1id = PDGHelpers::getCoupledVertex(pId[pWOrder[0]], pId[pWOrder[1]]);
2383  else V1id = 24;
2384  if (!PDGHelpers::isAnUnknownJet(pId[pWOrder[2]]) && !PDGHelpers::isAnUnknownJet(pId[pWOrder[3]])) V2id = PDGHelpers::getCoupledVertex(pId[pWOrder[2]], pId[pWOrder[3]]);
2385  else V2id = -24;
2386  if (PDGHelpers::isAWBoson(V1id) && PDGHelpers::isAWBoson(V2id)){
2387  if (V1id<0 || V2id>0){
2388  swap(pWOrder[0], pWOrder[2]);
2389  swap(pWOrder[1], pWOrder[3]);
2390  }
2391  hasW1=true;
2392  hasW2=true;
2393  }
2394  if (verbosity>=TVar::DEBUG){
2395  if (hasW1) MELAout << "TUtil::MCFM_SetupParticleCouplings: Found a W1(" << V1id << ")";
2396  if (hasW2) MELAout << " and a W2(" << V2id << ")";
2397  if (hasW1 || hasW2) MELAout << " in ZZ." << endl;
2398  }
2399  }
2400 
2401  /*******************/
2402  /* Particle labels */
2403  /*******************/
2404  // Mother particles
2405  // Default labels for most processes
2406  strplabel[0]="pp";
2407  strplabel[1]="pp";
2408  if (useQQVVQQany){ // Special case if using qqZZ/VVqq*
2409  if (verbosity>=TVar::DEBUG) MELAout << "TUtil::MCFM_SetupParticleCouplings: Setting up mother labels for MCFM:";
2410  for (int ip=0; ip<min(2, (int)mela_event.pMothers.size()); ip++){
2411  const int& idmot = mela_event.pMothers.at(ip).first;
2412  if (!PDGHelpers::isAnUnknownJet(idmot)) strplabel[ip]=TUtil::GetMCFMParticleLabel(idmot, false, useQQVVQQany);
2413  if (verbosity>=TVar::DEBUG) MELAout << " " << idmot << "=" << strplabel[ip];
2414  // No need to check unknown parton case, already "pp"
2415  }
2416  if (verbosity>=TVar::DEBUG) MELAout << endl;
2417  }
2418 
2419  // Decay and associated particles
2420  // 0-jet processes, set only decay labels (and plabel[5/6]=pp due to NLO stuff)
2421  if (isZJJ && production == TVar::JJQCD && process == TVar::bkgZJets){
2422  strplabel[2]="el";
2423  strplabel[3]="ea";
2424  strplabel[4]="pp";
2425  strplabel[5]="pp";
2426  strplabel[6]="pp";
2427  }
2428  else if (production == TVar::ZZGG && (
2430  ||
2431  ((isWW || isZZ) && (process == TVar::bkgWWZZ || process == TVar::HSMHiggs_WWZZ || process == TVar::bkgWWZZ_SMHiggs))
2432  )
2433  ){
2434  strplabel[2]="el";
2435  strplabel[3]="ea";
2436  strplabel[4]="nl";
2437  strplabel[5]="na";
2438  strplabel[6]="pp";
2439 
2440  string strrun = runstring_.runstring;
2441  if (isWW && ((!hasZ1 || !hasZ2) || (process == TVar::bkgWW || process == TVar::HSMHiggs || process == TVar::bkgWW_SMHiggs))) strrun += "_ww";
2442  else if (isZZ && (!hasW1 || !hasW2)) strrun += "_zz";
2443  sprintf(runstring_.runstring, strrun.c_str());
2444  }
2445  else if (isZG && (production == TVar::ZZQQB || production == TVar::ZZINDEPENDENT) && process == TVar::bkgZGamma){
2446  lastphot_.lastphot=5;
2447  strplabel[4]="ga";
2448  strplabel[5]="pp";
2449  }
2451  //lastphot_.lastphot=4; // Done in chooser
2452  strplabel[2]="ga";
2453  strplabel[3]="ga";
2454  strplabel[4]="pp";
2455  }
2456  else if (isWW && (production == TVar::ZZINDEPENDENT || production == TVar::ZZQQB) && process == TVar::bkgWW){
2457  strplabel[6]="pp";
2458  zcouple_.l1=1.;
2459 
2460  if (PDGHelpers::isANeutrino(pId[pWOrder[0]])){
2461  strplabel[2]="nl";
2462  strplabel[3]="ea";
2463  }
2464  else if (PDGHelpers::isAJet(pId[pWOrder[1]])){
2465  strplabel[2]="qj";
2466  strplabel[3]="qj";
2467  zcouple_.l1 *= sqrt(6.);
2468  nqcdjets_.nqcdjets += 2;
2469  }
2470  else result = false;
2471 
2472  if (PDGHelpers::isANeutrino(pId[pWOrder[3]])){
2473  strplabel[4]="el";
2474  strplabel[5]="na";
2475  }
2476  else if (PDGHelpers::isAJet(pId[pWOrder[3]])){
2477  strplabel[4]="qj";
2478  strplabel[5]="qj";
2479  zcouple_.l1 *= sqrt(6.);
2480  nqcdjets_.nqcdjets += 2;
2481  }
2482  else result = false;
2483  if (PDGHelpers::isAJet(pId[pWOrder[0]]) && PDGHelpers::isAJet(pId[pWOrder[3]])) result = false; // MCFM does not support WW->4q
2484  }
2485  // 2-jet processes
2486  // Most of the associated particle labels are set below
2487  // VH productions loop over all possible associated particles to assign V daughters as the first two particles in particle-antiparticle order
2488  else if ((isWW || isZZ) && napart>=2 && (production == TVar::Lep_ZH || production == TVar::Lep_ZH_S || production == TVar::Lep_ZH_TU)){
2490  spinzerohiggs_anomcoupl_.vvhvvtoggle_vbfvh = 1;
2491 
2493  string strrun = runstring_.runstring;
2494  if (isWW && (!hasZ1 || !hasZ2)) strrun += "_ww";
2495  else if (isZZ && (!hasW1 || !hasW2)) strrun += "_zz";
2496  sprintf(runstring_.runstring, strrun.c_str());
2497  }
2498 
2499  bool hasZll=false;
2500  bool hasZnn=false;
2501  for (unsigned int ix=0; ix<napart; ix++){
2502  if (PDGHelpers::isAJet(pApartId[ix])) continue;
2503  for (unsigned int iy=ix+1; iy<napart; iy++){
2504  if (PDGHelpers::isAJet(pApartId[iy])) continue;
2505  int Vid = PDGHelpers::getCoupledVertex(pApartId[ix], pApartId[iy]);
2506  if (PDGHelpers::isAZBoson(Vid) && PDGHelpers::isALepton(pApartId[ix])){
2507  int i1=ix; int i2=iy;
2508  if (pApartId[ix]<0){ swap(i1, i2); }
2509  int* tmpOrder = new int[napart];
2510  tmpOrder[0] = i1; tmpOrder[1] = i2;
2511  unsigned int ctr=2;
2512  for (unsigned int ipart=0; ipart<napart; ipart++){ if (ctr<napart && pApartOrder[ipart]!=i1 && pApartOrder[ipart]!=i2){ tmpOrder[ctr] = pApartOrder[ipart]; ctr++; } }
2513  delete[] pApartOrder; pApartOrder = tmpOrder;
2514  hasZll=true;
2515  break;
2516  }
2517  else if (PDGHelpers::isAZBoson(Vid) && PDGHelpers::isANeutrino(pApartId[ix])){
2518  int i1=ix; int i2=iy;
2519  if (pApartId[ix]<0){ swap(i1, i2); }
2520  int* tmpOrder = new int[napart];
2521  tmpOrder[0] = i1; tmpOrder[1] = i2;
2522  unsigned int ctr=2;
2523  for (unsigned int ipart=0; ipart<napart; ipart++){ if (ctr<napart && pApartOrder[ipart]!=i1 && pApartOrder[ipart]!=i2){ tmpOrder[ctr] = pApartOrder[ipart]; ctr++; } }
2524  delete[] pApartOrder; pApartOrder = tmpOrder;
2525  hasZnn=true;
2526  break;
2527  }
2528  if (hasZll || hasZnn) break;
2529  }
2530  }
2531  unsigned int iout=6;
2532  unsigned int jout=7;
2533  if (useQQVVQQany){
2534  int qqvvqq_apartordering[2]={ -1, -1 };
2536  mela_event.pMothers.at(0).first, mela_event.pMothers.at(1).first,
2537  pApartId[pApartOrder[0]], pApartId[pApartOrder[1]],
2538  qqvvqq_apartordering
2539  );
2540  if (qqvvqq_apartordering[0]==-1 || qqvvqq_apartordering[1]==-1) result=false;
2541  else if (qqvvqq_apartordering[0]>qqvvqq_apartordering[1]){
2542  swap(iout, jout);
2543  swap(pApartOrder[0], pApartOrder[1]);
2544  }
2545  }
2546  if (hasZll){
2547  strplabel[iout]="el";
2548  strplabel[jout]="ea";
2549  }
2550  else if (hasZnn){
2551  strplabel[iout]="nl";
2552  strplabel[jout]="na";
2553  }
2554  else result = false;
2555  }
2556  else if ((isWW || isZZ) && napart>=2 && (production == TVar::Lep_WH || production == TVar::Lep_WH_S || production == TVar::Lep_WH_TU)){
2558  spinzerohiggs_anomcoupl_.vvhvvtoggle_vbfvh = 1;
2559 
2561  string strrun = runstring_.runstring;
2562  if (isWW && (!hasZ1 || !hasZ2)) strrun += "_ww";
2563  else if (isZZ && (!hasW1 || !hasW2)) strrun += "_zz";
2564  sprintf(runstring_.runstring, strrun.c_str());
2565  }
2566 
2567  bool hasWplus=false;
2568  bool hasWminus=false;
2569  for (unsigned int ix=0; ix<napart; ix++){
2570  if (PDGHelpers::isAJet(pApartId[ix])) continue;
2571  for (unsigned int iy=ix+1; iy<napart; iy++){
2572  if (PDGHelpers::isAJet(pApartId[iy])) continue;
2573  int Vid = PDGHelpers::getCoupledVertex(pApartId[ix], pApartId[iy]);
2574  if (
2576  &&
2577  (
2578  (PDGHelpers::isALepton(pApartId[ix]) && pApartId[ix]<0)
2579  ||
2580  (PDGHelpers::isALepton(pApartId[iy]) && pApartId[iy]<0)
2581  )
2582  ){
2583  int i1=ix; int i2=iy;
2584  if (pApartId[ix]<0){ swap(i1, i2); }
2585  int* tmpOrder = new int[napart];
2586  tmpOrder[0] = i1; tmpOrder[1] = i2;
2587  unsigned int ctr=2;
2588  for (unsigned int ipart=0; ipart<napart; ipart++){ if (ctr<napart && pApartOrder[ipart]!=i1 && pApartOrder[ipart]!=i2){ tmpOrder[ctr] = pApartOrder[ipart]; ctr++; } }
2589  delete[] pApartOrder; pApartOrder = tmpOrder;
2590  hasWplus=true;
2591  break;
2592  }
2593  else if (
2595  &&
2596  (
2597  (PDGHelpers::isALepton(pApartId[ix]) && pApartId[ix]>0)
2598  ||
2599  (PDGHelpers::isALepton(pApartId[iy]) && pApartId[iy]>0)
2600  )
2601  ){
2602  int i1=ix; int i2=iy;
2603  if (pApartId[ix]<0){ swap(i1, i2); }
2604  int* tmpOrder = new int[napart];
2605  tmpOrder[0] = i1; tmpOrder[1] = i2;
2606  unsigned int ctr=2;
2607  for (unsigned int ipart=0; ipart<napart; ipart++){ if (ctr<napart && pApartOrder[ipart]!=i1 && pApartOrder[ipart]!=i2){ tmpOrder[ctr] = pApartOrder[ipart]; ctr++; } }
2608  delete[] pApartOrder; pApartOrder = tmpOrder;
2609  hasWminus=true;
2610  break;
2611  }
2612  }
2613  if (hasWplus || hasWminus) break;
2614  }
2615  unsigned int iout=6;
2616  unsigned int jout=7;
2617  if (useQQVVQQany){
2618  int qqvvqq_apartordering[2]={ -1, -1 };
2620  mela_event.pMothers.at(0).first, mela_event.pMothers.at(1).first,
2621  pApartId[pApartOrder[0]], pApartId[pApartOrder[1]],
2622  qqvvqq_apartordering
2623  );
2624  if (qqvvqq_apartordering[0]==-1 || qqvvqq_apartordering[1]==-1) result=false;
2625  else if (qqvvqq_apartordering[0]>qqvvqq_apartordering[1]){
2626  swap(iout, jout);
2627  swap(pApartOrder[0], pApartOrder[1]);
2628  }
2629  }
2630  if (hasWplus){ // W+
2631  strplabel[iout]="nl";
2632  strplabel[jout]="ea";
2633  }
2634  else if (hasWminus){ // W-
2635  strplabel[iout]="el";
2636  strplabel[jout]="na";
2637  }
2638  else result = false;
2639  }
2640  else if ((isWW || isZZ) && napart>=2 && (production == TVar::Had_ZH || production == TVar::Had_ZH_S || production == TVar::Had_ZH_TU)){
2642  spinzerohiggs_anomcoupl_.vvhvvtoggle_vbfvh = 1;
2643 
2645  string strrun = runstring_.runstring;
2646  if (isWW && (!hasZ1 || !hasZ2)) strrun += "_ww";
2647  else if (isZZ && (!hasW1 || !hasW2)) strrun += "_zz";
2648  sprintf(runstring_.runstring, strrun.c_str());
2649  }
2650 
2651  bool hasZuu=false;
2652  bool hasZdd=false;
2653  bool hasZjj=false;
2654  for (unsigned int ix=0; ix<napart; ix++){
2655  if (!PDGHelpers::isAJet(pApartId[ix])) continue;
2656  for (unsigned int iy=ix+1; iy<napart; iy++){
2657  if (!PDGHelpers::isAJet(pApartId[iy])) continue;
2658  int Vid;
2659  if (!PDGHelpers::isAnUnknownJet(pApartId[ix]) && !PDGHelpers::isAnUnknownJet(pApartId[iy])) Vid = PDGHelpers::getCoupledVertex(pApartId[ix], pApartId[iy]);
2660  else Vid = 23;
2661  if (PDGHelpers::isAZBoson(Vid) && (PDGHelpers::isUpTypeQuark(pApartId[ix]) || PDGHelpers::isUpTypeQuark(pApartId[iy]))){
2662  int i1=ix; int i2=iy;
2663  if (pApartId[ix]<0 || pApartId[iy]>0){ swap(i1, i2); }
2664  int* tmpOrder = new int[napart];
2665  tmpOrder[0] = i1; tmpOrder[1] = i2;
2666  unsigned int ctr=2;
2667  for (unsigned int ipart=0; ipart<napart; ipart++){ if (ctr<napart && pApartOrder[ipart]!=i1 && pApartOrder[ipart]!=i2){ tmpOrder[ctr] = pApartOrder[ipart]; ctr++; } }
2668  delete[] pApartOrder; pApartOrder = tmpOrder;
2669  hasZuu=true;
2670  break;
2671  }
2672  else if (PDGHelpers::isAZBoson(Vid) && (PDGHelpers::isDownTypeQuark(pApartId[ix]) || PDGHelpers::isDownTypeQuark(pApartId[iy]))){
2673  int i1=ix; int i2=iy;
2674  if (pApartId[ix]<0 || pApartId[iy]>0){ swap(i1, i2); }
2675  int* tmpOrder = new int[napart];
2676  tmpOrder[0] = i1; tmpOrder[1] = i2;
2677  unsigned int ctr=2;
2678  for (unsigned int ipart=0; ipart<napart; ipart++){ if (ctr<napart && pApartOrder[ipart]!=i1 && pApartOrder[ipart]!=i2){ tmpOrder[ctr] = pApartOrder[ipart]; ctr++; } }
2679  delete[] pApartOrder; pApartOrder = tmpOrder;
2680  hasZdd=true;
2681  break;
2682  }
2683  else if (PDGHelpers::isAZBoson(Vid)){
2684  int i1=ix; int i2=iy;
2685  int* tmpOrder = new int[napart];
2686  tmpOrder[0] = i1; tmpOrder[1] = i2;
2687  unsigned int ctr=2;
2688  for (unsigned int ipart=0; ipart<napart; ipart++){ if (ctr<napart && pApartOrder[ipart]!=i1 && pApartOrder[ipart]!=i2){ tmpOrder[ctr] = pApartOrder[ipart]; ctr++; } }
2689  delete[] pApartOrder; pApartOrder = tmpOrder;
2690  hasZjj=true;
2691  break;
2692  }
2693  if (hasZuu || hasZdd || hasZjj) break;
2694  }
2695  }
2696  if (useQQVVQQany){
2697  int qqvvqq_apartordering[2]={ -1, -1 };
2699  mela_event.pMothers.at(0).first, mela_event.pMothers.at(1).first,
2700  pApartId[pApartOrder[0]], pApartId[pApartOrder[1]],
2701  qqvvqq_apartordering
2702  );
2703  if (qqvvqq_apartordering[0]==-1 || qqvvqq_apartordering[1]==-1) result=false;
2704  else if (qqvvqq_apartordering[0]>qqvvqq_apartordering[1]) swap(pApartOrder[0], pApartOrder[1]);
2705  }
2706  if (hasZuu || hasZdd){
2707  strplabel[6]=TUtil::GetMCFMParticleLabel(pApartId[pApartOrder[0]], true, useQQVVQQany);
2708  strplabel[7]=TUtil::GetMCFMParticleLabel(pApartId[pApartOrder[1]], true, useQQVVQQany);
2709  }
2710  else if (hasZjj){
2711  strplabel[6]="qj";
2712  strplabel[7]="qj";
2713  }
2714  else result = false;
2715  }
2716  else if ((isWW || isZZ) && napart>=2 && (production == TVar::Had_WH || production == TVar::Had_WH_S || production == TVar::Had_WH_TU)){
2718  spinzerohiggs_anomcoupl_.vvhvvtoggle_vbfvh = 1;
2719 
2721  string strrun = runstring_.runstring;
2722  if (isWW && (!hasZ1 || !hasZ2)) strrun += "_ww";
2723  else if (isZZ && (!hasW1 || !hasW2)) strrun += "_zz";
2724  sprintf(runstring_.runstring, strrun.c_str());
2725  }
2726 
2727  bool hasWplus=false;
2728  bool hasWminus=false;
2729  bool hasWjj=false;
2730  for (unsigned int ix=0; ix<napart; ix++){
2731  if (!PDGHelpers::isAJet(pApartId[ix])) continue;
2732  for (unsigned int iy=ix+1; iy<napart; iy++){
2733  if (!PDGHelpers::isAJet(pApartId[iy])) continue;
2734  int Vid;
2735  if (!PDGHelpers::isAnUnknownJet(pApartId[ix]) && !PDGHelpers::isAnUnknownJet(pApartId[iy])) Vid = PDGHelpers::getCoupledVertex(pApartId[ix], pApartId[iy]);
2736  else if (
2737  (PDGHelpers::isUpTypeQuark(pApartId[ix]) && pApartId[ix]<0) || (PDGHelpers::isUpTypeQuark(pApartId[iy]) && pApartId[iy]<0) ||
2738  (PDGHelpers::isDownTypeQuark(pApartId[ix]) && pApartId[ix]>0) || (PDGHelpers::isDownTypeQuark(pApartId[iy]) && pApartId[iy]>0)
2739  ) Vid=-24;
2740  else Vid = 24;
2741  if (
2743  &&
2744  (
2745  ((PDGHelpers::isDownTypeQuark(pApartId[ix]) && pApartId[ix]<0) || (PDGHelpers::isUpTypeQuark(pApartId[iy]) && pApartId[iy]>0))
2746  ||
2747  ((PDGHelpers::isDownTypeQuark(pApartId[iy]) && pApartId[iy]<0) || (PDGHelpers::isUpTypeQuark(pApartId[ix]) && pApartId[ix]>0))
2748  )
2749  ){
2750  int i1=ix; int i2=iy;
2751  if (pApartId[ix]<0 || pApartId[iy]>0){ swap(i1, i2); }
2752  int* tmpOrder = new int[napart];
2753  tmpOrder[0] = i1; tmpOrder[1] = i2;
2754  unsigned int ctr=2;
2755  for (unsigned int ipart=0; ipart<napart; ipart++){ if (ctr<napart && pApartOrder[ipart]!=i1 && pApartOrder[ipart]!=i2){ tmpOrder[ctr] = pApartOrder[ipart]; ctr++; } }
2756  delete[] pApartOrder; pApartOrder = tmpOrder;
2757  hasWplus=true;
2758  break;
2759  }
2760  else if (
2762  &&
2763  (
2764  ((PDGHelpers::isDownTypeQuark(pApartId[ix]) && pApartId[ix]>0) || (PDGHelpers::isUpTypeQuark(pApartId[iy]) && pApartId[iy]<0))
2765  ||
2766  ((PDGHelpers::isDownTypeQuark(pApartId[iy]) && pApartId[iy]>0) || (PDGHelpers::isUpTypeQuark(pApartId[ix]) && pApartId[ix]<0))
2767  )
2768  ){
2769  int i1=ix; int i2=iy;
2770  if (pApartId[ix]<0 || pApartId[iy]>0){ swap(i1, i2); }
2771  int* tmpOrder = new int[napart];
2772  tmpOrder[0] = i1; tmpOrder[1] = i2;
2773  unsigned int ctr=2;
2774  for (unsigned int ipart=0; ipart<napart; ipart++){ if (ctr<napart && pApartOrder[ipart]!=i1 && pApartOrder[ipart]!=i2){ tmpOrder[ctr] = pApartOrder[ipart]; ctr++; } }
2775  delete[] pApartOrder; pApartOrder = tmpOrder;
2776  hasWminus=true;
2777  break;
2778  }
2779  else if (PDGHelpers::isAWBoson(Vid)){
2780  int i1=ix; int i2=iy;
2781  int* tmpOrder = new int[napart];
2782  tmpOrder[0] = i1; tmpOrder[1] = i2;
2783  unsigned int ctr=2;
2784  for (unsigned int ipart=0; ipart<napart; ipart++){ if (ctr<napart && pApartOrder[ipart]!=i1 && pApartOrder[ipart]!=i2){ tmpOrder[ctr] = pApartOrder[ipart]; ctr++; } }
2785  delete[] pApartOrder; pApartOrder = tmpOrder;
2786  hasWjj=true;
2787  break;
2788  }
2789  }
2790  if (hasWplus || hasWminus || hasWjj) break;
2791  }
2792  if (useQQVVQQany){
2793  int qqvvqq_apartordering[2]={ -1, -1 };
2795  mela_event.pMothers.at(0).first, mela_event.pMothers.at(1).first,
2796  pApartId[pApartOrder[0]], pApartId[pApartOrder[1]],
2797  qqvvqq_apartordering
2798  );
2799  if (qqvvqq_apartordering[0]==-1 || qqvvqq_apartordering[1]==-1) result=false;
2800  else if (qqvvqq_apartordering[0]>qqvvqq_apartordering[1]) swap(pApartOrder[0], pApartOrder[1]);
2801  }
2802  if (hasWplus || hasWminus){ // W+ or W-
2803  strplabel[6]=TUtil::GetMCFMParticleLabel(pApartId[pApartOrder[0]], true, useQQVVQQany);
2804  strplabel[7]=TUtil::GetMCFMParticleLabel(pApartId[pApartOrder[1]], true, useQQVVQQany);
2805  }
2806  else if (hasWjj){ // W+/-
2807  strplabel[6]="qj";
2808  strplabel[7]="qj";
2809  }
2810  else result = false;
2811  }
2812  else if ((isWW || isZZ) && napart>=2 && (production == TVar::JJQCD || production == TVar::JJQCD_S || production == TVar::JJQCD_TU)){
2814  spinzerohiggs_anomcoupl_.vvhvvtoggle_vbfvh = 2; // Doesn't matter, already JJQCD
2815 
2816  if (process == TVar::bkgWWZZ/* || process == TVar::HSMHiggs_WWZZ || process == TVar::bkgWWZZ_SMHiggs*/){
2817  string strrun = runstring_.runstring;
2818  if (isWW && (!hasZ1 || !hasZ2)) strrun += "_ww";
2819  else if (isZZ && (!hasW1 || !hasW2)) strrun += "_zz";
2820  sprintf(runstring_.runstring, strrun.c_str());
2821  }
2822 
2823  if (useQQVVQQany){
2824  int qqvvqq_apartordering[2]={ -1, -1 };
2826  mela_event.pMothers.at(0).first, mela_event.pMothers.at(1).first,
2827  pApartId[pApartOrder[0]], pApartId[pApartOrder[1]],
2828  qqvvqq_apartordering
2829  );
2830  if (qqvvqq_apartordering[0]==-1 || qqvvqq_apartordering[1]==-1) result=false;
2831  else if (qqvvqq_apartordering[0]>qqvvqq_apartordering[1]) swap(pApartOrder[0], pApartOrder[1]);
2832  }
2833  strplabel[6]=TUtil::GetMCFMParticleLabel(pApartId[pApartOrder[0]], false, useQQVVQQany);
2834  strplabel[7]=TUtil::GetMCFMParticleLabel(pApartId[pApartOrder[1]], false, useQQVVQQany);
2835  }
2836  else if ((isWW || isZZ) && napart>=2 && (production == TVar::JJVBF || production == TVar::JJVBF_S || production == TVar::JJVBF_TU)){
2838  spinzerohiggs_anomcoupl_.vvhvvtoggle_vbfvh = 0; // VBF-only process
2839 
2841  string strrun = runstring_.runstring;
2842  if (isWW && (!hasZ1 || !hasZ2)) strrun += "_ww";
2843  else if (isZZ && (!hasW1 || !hasW2)) strrun += "_zz";
2844  sprintf(runstring_.runstring, strrun.c_str());
2845  }
2846 
2847  if (useQQVVQQany){
2848  int qqvvqq_apartordering[2]={ -1, -1 };
2850  mela_event.pMothers.at(0).first, mela_event.pMothers.at(1).first,
2851  pApartId[pApartOrder[0]], pApartId[pApartOrder[1]],
2852  qqvvqq_apartordering
2853  );
2854  if (qqvvqq_apartordering[0]==-1 || qqvvqq_apartordering[1]==-1) result=false;
2855  else if (qqvvqq_apartordering[0]>qqvvqq_apartordering[1]) swap(pApartOrder[0], pApartOrder[1]);
2856  }
2857  strplabel[6]=TUtil::GetMCFMParticleLabel(pApartId[pApartOrder[0]], true, useQQVVQQany);
2858  strplabel[7]=TUtil::GetMCFMParticleLabel(pApartId[pApartOrder[1]], true, useQQVVQQany);
2859  }
2860  else if ((isWW || isZZ) && napart>=2 && (production == TVar::JJEW || production == TVar::JJEWQCD || production == TVar::JJEW_S || production == TVar::JJEWQCD_S || production == TVar::JJEW_TU || production == TVar::JJEWQCD_TU)){
2862  spinzerohiggs_anomcoupl_.vvhvvtoggle_vbfvh = 2; // VBF+VH process
2863 
2865  string strrun = runstring_.runstring;
2866  if (isWW && (!hasZ1 || !hasZ2)) strrun += "_ww";
2867  else if (isZZ && (!hasW1 || !hasW2)) strrun += "_zz";
2868  sprintf(runstring_.runstring, strrun.c_str());
2869  }
2870 
2871  if (useQQVVQQany){
2872  int qqvvqq_apartordering[2]={ -1, -1 };
2874  mela_event.pMothers.at(0).first, mela_event.pMothers.at(1).first,
2875  pApartId[pApartOrder[0]], pApartId[pApartOrder[1]],
2876  qqvvqq_apartordering
2877  );
2878  if (qqvvqq_apartordering[0]==-1 || qqvvqq_apartordering[1]==-1) result=false;
2879  else if (qqvvqq_apartordering[0]>qqvvqq_apartordering[1]) swap(pApartOrder[0], pApartOrder[1]);
2880  }
2881  strplabel[6]=TUtil::GetMCFMParticleLabel(pApartId[pApartOrder[0]], false, useQQVVQQany);
2882  strplabel[7]=TUtil::GetMCFMParticleLabel(pApartId[pApartOrder[1]], false, useQQVVQQany);
2883  }
2884 
2885  // Couplings for Z1
2886  if (isWW && (production == TVar::ZZINDEPENDENT || production == TVar::ZZQQB) && process == TVar::bkgWW){} // Skip this one, already handled above
2887  else if (hasZ1){
2888  if (PDGHelpers::isALepton(pId[pZOrder[0]]) && PDGHelpers::isALepton(pId[pZOrder[1]])){
2889  if (verbosity>=TVar::DEBUG) MELAout << "- Setting Z1->ll couplings." << endl;
2890 
2891  zcouple_.q1=-1.0;
2892  zcouple_.l1=zcouple_.le;
2893  zcouple_.r1=zcouple_.re;
2894 
2895  // Special Z1->ll cases
2896  if (useQQBZGAM){
2897  strplabel[2]="el";
2898  strplabel[3]="ea";
2899  }
2900  else if (useQQVVQQany){
2901  strplabel[2]=TUtil::GetMCFMParticleLabel(pId[pZOrder[0]], false, useQQVVQQany);
2902  strplabel[3]=TUtil::GetMCFMParticleLabel(pId[pZOrder[1]], false, useQQVVQQany);
2903  }
2904  else if (anomzffcouplings_.AllowAnomalousZffCouplings == 1){
2905  strplabel[2]=TUtil::GetMCFMParticleLabel(pId[pZOrder[2]], false, false);
2906  strplabel[3]=TUtil::GetMCFMParticleLabel(pId[pZOrder[2]], false, false);
2907  }
2908  // End special Z1->ll cases
2909  }
2910  else if (PDGHelpers::isANeutrino(pId[pZOrder[0]]) && PDGHelpers::isANeutrino(pId[pZOrder[1]])){
2911  if (verbosity>=TVar::DEBUG) MELAout << "- Setting Z1->nn couplings." << endl;
2912 
2913  zcouple_.q1=0;
2914  zcouple_.l1=zcouple_.ln;
2915  zcouple_.r1=zcouple_.rn;
2916 
2917  // Special Z1->nn cases
2918  if (useQQBZGAM){
2919  strplabel[2]="nl";
2920  strplabel[3]="na";
2921  }
2922  else if (useQQVVQQany){
2923  strplabel[2]=TUtil::GetMCFMParticleLabel(pId[pZOrder[0]], false, useQQVVQQany);
2924  strplabel[3]=TUtil::GetMCFMParticleLabel(pId[pZOrder[1]], false, useQQVVQQany);
2925  }
2926  else if (anomzffcouplings_.AllowAnomalousZffCouplings == 1){
2927  strplabel[2]=TUtil::GetMCFMParticleLabel(pId[pZOrder[2]], false, false);
2928  strplabel[3]=TUtil::GetMCFMParticleLabel(pId[pZOrder[2]], false, false);
2929  }
2930  // End special Z1->nn cases
2931  }
2932  else if (PDGHelpers::isAJet(pId[pZOrder[0]]) && PDGHelpers::isAJet(pId[pZOrder[1]])){
2933  if (verbosity>=TVar::DEBUG) MELAout << "- Setting Z1->jj couplings." << endl;
2934 
2935  nqcdjets_.nqcdjets += 2;
2936  int jetid=(PDGHelpers::isAnUnknownJet(pId[pZOrder[0]]) ? abs(pId[pZOrder[1]]) : abs(pId[pZOrder[0]]));
2937  if (!PDGHelpers::isAnUnknownJet(jetid)){
2938  if (jetid==6) jetid = 2;
2939  zcouple_.q1=ewcharge_.Q[5+jetid];
2940  zcouple_.l1=zcouple_.l[-1+jetid];
2941  zcouple_.r1=zcouple_.r[-1+jetid];
2942 
2943  // Special Z1->qq cases
2944  if (useQQBZGAM){
2945  strplabel[2]="el";// Trick MCFM, not implemented properly
2946  strplabel[3]="ea";
2947  }
2948  else if (useQQVVQQany){
2949  strplabel[2]=TUtil::GetMCFMParticleLabel(pId[pZOrder[0]], false, useQQVVQQany);
2950  strplabel[3]=TUtil::GetMCFMParticleLabel(pId[pZOrder[1]], false, useQQVVQQany);
2951  }
2952  else if (anomzffcouplings_.AllowAnomalousZffCouplings == 1){
2953  strplabel[2]=TUtil::GetMCFMParticleLabel(pId[pZOrder[2]], false, false);
2954  strplabel[3]=TUtil::GetMCFMParticleLabel(pId[pZOrder[2]], false, false);
2955  }
2956  }
2957  else{
2958  double gV_up = (zcouple_.l[-1+2]+zcouple_.r[-1+2])/2.;
2959  double gV_dn = (zcouple_.l[-1+1]+zcouple_.r[-1+1])/2.;
2960  double gA_up = (zcouple_.l[-1+2]-zcouple_.r[-1+2])/2.;
2961  double gA_dn = (zcouple_.l[-1+1]-zcouple_.r[-1+1])/2.;
2962  double yy_up = pow(gV_up, 2) + pow(gA_up, 2);
2963  double yy_dn = pow(gV_dn, 2) + pow(gA_dn, 2);
2964  double xx_up = gV_up*gA_up;
2965  double xx_dn = gV_dn*gA_dn;
2966  double yy = (2.*yy_up+3.*yy_dn);
2967  double xx = (2.*xx_up+3.*xx_dn);
2968  double discriminant = pow(yy, 2)-4.*pow(xx, 2);
2969  double gVsq = (yy+sqrt(fabs(discriminant)))/2.;
2970  double gAsq = pow(xx, 2)/gVsq;
2971  double gV=-sqrt(gVsq);
2972  double gA=-sqrt(gAsq);
2973  zcouple_.l1 = (gV+gA);
2974  zcouple_.r1 = (gV-gA);
2975  zcouple_.q1=sqrt(pow(ewcharge_.Q[5+1], 2)*3.+pow(ewcharge_.Q[5+2], 2)*2.);
2976 
2977  // Special Z1->qq cases
2978  if (useQQBZGAM){
2979  strplabel[2]="el";// Trick MCFM, not implemented properly
2980  strplabel[3]="ea";
2981  }
2982  else if (useQQVVQQany){
2983  strplabel[2]="qj";
2984  strplabel[3]="qj";
2985  }
2986  else if (anomzffcouplings_.AllowAnomalousZffCouplings == 1){
2987  strplabel[2]=TUtil::GetMCFMParticleLabel(pId[pZOrder[2]], false, false);
2988  strplabel[3]=TUtil::GetMCFMParticleLabel(pId[pZOrder[2]], false, false);
2989  }
2990  }
2991  if (!useQQVVQQany){ // colfac34_56 handles all couplings instead of this simple scaling (Reason: WW final states)
2992  zcouple_.l1 *= sqrt(3.);
2993  zcouple_.r1 *= sqrt(3.);
2994  zcouple_.q1 *= sqrt(3.);
2995  }
2996  } // End Z1 daughter id tests
2997  } // End ZZ/ZG/ZJJ Z1 couplings
2998  else if (useQQVVQQany){
2999  strplabel[2]=TUtil::GetMCFMParticleLabel(pId[pZOrder[0]], false, useQQVVQQany);
3000  strplabel[3]=TUtil::GetMCFMParticleLabel(pId[pZOrder[1]], false, useQQVVQQany);
3001  }
3002  else if (anomzffcouplings_.AllowAnomalousZffCouplings == 1){
3003  strplabel[2]=TUtil::GetMCFMParticleLabel(pId[pZOrder[2]], false, false);
3004  strplabel[3]=TUtil::GetMCFMParticleLabel(pId[pZOrder[2]], false, false);
3005  }
3006 
3007  // Couplings for Z2
3008  if (
3009  (isWW && (production == TVar::ZZINDEPENDENT || production == TVar::ZZQQB) && process == TVar::bkgWW) // Skip this one, already handled above
3010  ||
3011  (isZJJ && production == TVar::JJQCD && process == TVar::bkgZJets) // No need to handle
3012  ){}
3013  else if (hasZ2){
3014  if (PDGHelpers::isALepton(pId[pZOrder[2]]) && PDGHelpers::isALepton(pId[pZOrder[3]])){
3015  if (verbosity>=TVar::DEBUG) MELAout << "- Setting Z2->ll couplings." << endl;
3016  zcouple_.q2=-1.0;
3017  zcouple_.l2=zcouple_.le;
3018  zcouple_.r2=zcouple_.re;
3019 
3020  // Special Z2->ll cases
3021  if (useQQVVQQany){
3022  strplabel[4]=TUtil::GetMCFMParticleLabel(pId[pZOrder[2]], false, useQQVVQQany);
3023  strplabel[5]=TUtil::GetMCFMParticleLabel(pId[pZOrder[3]], false, useQQVVQQany);
3024  }
3025  else if (anomzffcouplings_.AllowAnomalousZffCouplings == 1){
3026  strplabel[4]=TUtil::GetMCFMParticleLabel(pId[pZOrder[2]], false, false);
3027  strplabel[5]=TUtil::GetMCFMParticleLabel(pId[pZOrder[2]], false, false);
3028  }
3029  // End special Z2->ll cases
3030  }
3031  else if (PDGHelpers::isANeutrino(pId[pZOrder[2]]) && PDGHelpers::isANeutrino(pId[pZOrder[3]])){
3032  if (verbosity>=TVar::DEBUG) MELAout << "- Setting Z2->nn couplings." << endl;
3033  zcouple_.q2=0;
3034  zcouple_.l2=zcouple_.ln;
3035  zcouple_.r2=zcouple_.rn;
3036 
3037  // Special Z2->nn cases
3038  if (useQQVVQQany){
3039  strplabel[4]=TUtil::GetMCFMParticleLabel(pId[pZOrder[2]], false, useQQVVQQany);
3040  strplabel[5]=TUtil::GetMCFMParticleLabel(pId[pZOrder[3]], false, useQQVVQQany);
3041  }
3042  else if (anomzffcouplings_.AllowAnomalousZffCouplings == 1){
3043  strplabel[4]=TUtil::GetMCFMParticleLabel(pId[pZOrder[2]], false, false);
3044  strplabel[5]=TUtil::GetMCFMParticleLabel(pId[pZOrder[2]], false, false);
3045  }
3046  // End special Z2->nn cases
3047  }
3048  else if (PDGHelpers::isAJet(pId[pZOrder[2]]) && PDGHelpers::isAJet(pId[pZOrder[3]])){
3049  if (verbosity>=TVar::DEBUG) MELAout << "- Setting Z2->jj couplings." << endl;
3050 
3051  nqcdjets_.nqcdjets += 2;
3052  int jetid=(PDGHelpers::isAnUnknownJet(pId[pZOrder[2]]) ? abs(pId[pZOrder[3]]) : abs(pId[pZOrder[2]]));
3053  if (!PDGHelpers::isAnUnknownJet(jetid)){
3054  if (jetid==6) jetid = 2;
3055  zcouple_.q2=ewcharge_.Q[5+jetid];
3056  zcouple_.l2=zcouple_.l[-1+jetid];
3057  zcouple_.r2=zcouple_.r[-1+jetid];
3058 
3059  // Special Z2->qq cases
3060  if (useQQVVQQany){
3061  strplabel[4]=TUtil::GetMCFMParticleLabel(pId[pZOrder[2]], false, useQQVVQQany);
3062  strplabel[5]=TUtil::GetMCFMParticleLabel(pId[pZOrder[3]], false, useQQVVQQany);
3063  }
3064  else if (anomzffcouplings_.AllowAnomalousZffCouplings == 1){
3065  strplabel[4]=TUtil::GetMCFMParticleLabel(pId[pZOrder[2]], false, false);
3066  strplabel[5]=TUtil::GetMCFMParticleLabel(pId[pZOrder[2]], false, false);
3067  }
3068  }
3069  else{
3070  double gV_up = (zcouple_.l[-1+2]+zcouple_.r[-1+2])/2.;
3071  double gV_dn = (zcouple_.l[-1+1]+zcouple_.r[-1+1])/2.;
3072  double gA_up = (zcouple_.l[-1+2]-zcouple_.r[-1+2])/2.;
3073  double gA_dn = (zcouple_.l[-1+1]-zcouple_.r[-1+1])/2.;
3074  double yy_up = pow(gV_up, 2) + pow(gA_up, 2);
3075  double yy_dn = pow(gV_dn, 2) + pow(gA_dn, 2);
3076  double xx_up = gV_up*gA_up;
3077  double xx_dn = gV_dn*gA_dn;
3078  double yy = (2.*yy_up+3.*yy_dn);
3079  double xx = (2.*xx_up+3.*xx_dn);
3080  double discriminant = pow(yy, 2)-4.*pow(xx, 2);
3081  double gVsq = (yy+sqrt(fabs(discriminant)))/2.;
3082  double gAsq = pow(xx, 2)/gVsq;
3083  double gV=-sqrt(gVsq);
3084  double gA=-sqrt(gAsq);
3085  zcouple_.l2 = (gV+gA);
3086  zcouple_.r2 = (gV-gA);
3087  zcouple_.q2=sqrt(pow(ewcharge_.Q[5+1], 2)*3.+pow(ewcharge_.Q[5+2], 2)*2.);
3088 
3089  // Special Z2->qq cases
3090  if (useQQVVQQany){
3091  strplabel[4]="qj";
3092  strplabel[5]="qj";
3093  }
3094  else if (anomzffcouplings_.AllowAnomalousZffCouplings == 1){
3095  strplabel[4]=TUtil::GetMCFMParticleLabel(pId[pZOrder[2]], false, false);
3096  strplabel[5]=TUtil::GetMCFMParticleLabel(pId[pZOrder[2]], false, false);
3097  }
3098  }
3099  if (!useQQVVQQany){ // colfac34_56 handles all couplings instead of this simple scaling (Reason: WW Final states)
3100  zcouple_.l2 *= sqrt(3.);
3101  zcouple_.r2 *= sqrt(3.);
3102  zcouple_.q2 *= sqrt(3.);
3103  }
3104  } // End Z2 daughter id tests
3105  } // End ZZ Z2 couplings
3106  else if (useQQVVQQany){
3107  strplabel[4]=TUtil::GetMCFMParticleLabel(pId[pZOrder[2]], false, useQQVVQQany);
3108  strplabel[5]=TUtil::GetMCFMParticleLabel(pId[pZOrder[3]], false, useQQVVQQany);
3109  }
3110  else if (anomzffcouplings_.AllowAnomalousZffCouplings == 1){
3111  strplabel[4]=TUtil::GetMCFMParticleLabel(pId[pZOrder[2]], false, false);
3112  strplabel[5]=TUtil::GetMCFMParticleLabel(pId[pZOrder[2]], false, false);
3113  }
3114 
3115  } // End check WW, ZZ, ZG etc.
3116 
3117  int* ordering=nullptr;
3118  if (ndau<=2){
3119  if (production == TVar::ZZGG){
3120  if (process == TVar::bkgGammaGamma){ ordering = pOrder; if (!isGG) result = false; }
3121  }
3123  if (process == TVar::bkgGammaGamma){ ordering = pZOrder; if (!isGG) result = false; }
3124  else if (process == TVar::bkgZGamma){ ordering = pZOrder; if (!hasZ1 || !isZG) result = false; }
3125  }
3126  else if (production == TVar::JJQCD){
3127  if (process == TVar::bkgZJets){ ordering = pZOrder; if (!hasZ1 || !isZJJ) result = false; }
3128  }
3129  }
3130  else if (ndau<=3){
3132  if (process == TVar::bkgZGamma){ ordering = pZOrder; if (!hasZ1 || !isZG) result = false; }
3133  }
3134  }
3135  else{
3136 
3137  if (
3139  ||
3141  ){
3142  // Just get the default ordering
3144  if (process == TVar::bkgZGamma){ ordering = pZOrder; if (!hasZ1) result = false; }
3145  else if (process == TVar::bkgZZ){ ordering = pZOrder; if (!hasZ1 || !hasZ2) result = false; }
3146  else if (process == TVar::bkgWW){ ordering = pWOrder; if (!hasW1 || !hasW2) result = false; }
3147  }
3148  // bkgZZ process with S/T+U/STU separation needs ZZ ordering
3149  else{ ordering = pZOrder; if (!hasZ1 || !hasZ2) result = false; }
3150  }
3151  else if (production == TVar::ZZGG){
3152  // ggZZ/WW/VV
3153  // All of these require ZZ ordering since they use either ZZ ME or VV ME
3155  ordering = pZOrder;
3156  if (
3157  !(
3158  (hasZ1 && hasZ2)
3159  ||
3160  (process == TVar::HSMHiggs && hasW1 && hasW2)
3161  )
3162  ) result = false;
3163  }
3165  ordering = pZOrder;
3166  if (!hasZ1 || !hasZ2 || !hasW1 || !hasW2) result = false;
3167  }
3168  else if (process == TVar::bkgWW_SMHiggs || process == TVar::bkgWW){
3169  ordering = pZOrder;
3170  if (!hasW1 || !hasW2) result = false;
3171  }
3172  }
3173  else if (
3184  ){
3185  // Z+2 jets
3186  // Just get the default ordering
3187  if (process == TVar::bkgZJets){ ordering = pZOrder; if (!hasZ1 || !isZJJ) result = false; }
3188  // VBF or QCD MCFM SBI, S or B
3189  // All of these require ZZ ordering since they use either ZZ ME or VV ME
3191  ordering = pZOrder;
3192  if (
3193  !(
3194  (hasZ1 && hasZ2)
3195  ||
3196  (process == TVar::HSMHiggs && hasW1 && hasW2)
3197  )
3198  ) result = false;
3199  }
3201  ordering = pZOrder;
3202  if (!hasZ1 || !hasZ2 || !hasW1 || !hasW2) result = false;
3203  }
3204  else if (process == TVar::bkgWW_SMHiggs || process == TVar::bkgWW){
3205  ordering = pZOrder;
3206  if (!hasW1 || !hasW2) result = false;
3207  }
3208  }
3209 
3210  }
3211 
3212  if (partOrder && ordering) { for (unsigned int ip=0; ip<ndau; ip++) partOrder->push_back(ordering[ip]); }
3213  if (apartOrder && pApartOrder) { for (unsigned int ip=0; ip<napart; ip++) apartOrder->push_back(pApartOrder[ip]); }
3214  for (int ip=0; ip<mxpart; ip++) sprintf((plabel_.plabel)[ip], strplabel[ip].Data());
3215 
3216  if (verbosity>=TVar::DEBUG){
3217  MELAout << "TUtil::MCFM_SetupParticleCouplings: Summary (result=" << (int)result << "):\n";
3218 
3219  MELAout << "\trunstring=" << runstring_.runstring << endl;
3220 
3221  if (hasZ1) MELAout << "\tProcess found a Z1." << endl;
3222  if (hasZ2) MELAout << "\tProcess found a Z2." << endl;
3223  if (hasW1) MELAout << "\tProcess found a W1." << endl;
3224  if (hasW2) MELAout << "\tProcess found a W2." << endl;
3225  MELAout << "\t(l1, l2) = (" << zcouple_.l1 << ", " << zcouple_.l2 << ")" << endl;
3226  MELAout << "\t(r1, r2) = (" << zcouple_.r1 << ", " << zcouple_.r2 << ")" << endl;
3227  MELAout << "\t(q1, q2) = (" << zcouple_.q1 << ", " << zcouple_.q2 << ")" << endl;
3228 
3229  MELAout << "\tplabels:\n";
3230  for (int ip=0; ip<mxpart; ip++) MELAout << "\t[" << ip << "]=" << (plabel_.plabel)[ip] << endl;
3231  if (partOrder){
3232  if (!partOrder->empty()) MELAout << "\tpartOrder[" << partOrder->size() << "]:\n";
3233  for (unsigned int ip=0; ip<partOrder->size(); ip++) MELAout << "\t[" << ip << "] -> " << partOrder->at(ip) << endl;
3234  }
3235  if (apartOrder){
3236  if (!apartOrder->empty()) MELAout << "\tapartOrder[" << apartOrder->size() << "]:\n";
3237  for (unsigned int ip=0; ip<apartOrder->size(); ip++) MELAout << "\t[" << ip << "] -> " << apartOrder->at(ip) << endl;
3238  }
3239  }
3240 
3241  delete[] pId;
3242  delete[] pWOrder;
3243  delete[] pZOrder;
3244  delete[] pOrder;
3245  if (pApartOrder) delete[] pApartOrder;
3246  if (pApartId) delete[] pApartId;
3247  return result;
3248 }
3249 TString TUtil::GetMCFMParticleLabel(const int& pid, bool useQJ, bool useExtendedConventions){
3250  if (PDGHelpers::isAnUnknownJet(pid)){
3251  if (useQJ) return TString("qj");
3252  else return TString("pp");
3253  }
3254  else if (PDGHelpers::isAGluon(pid)) return TString("ig");
3255  else if (pid==1) return TString("dq");
3256  else if (pid==2) return TString("uq");
3257  else if (pid==3) return TString("sq");
3258  else if (pid==4) return TString("cq");
3259  else if (pid==5) return TString("bq");
3260  else if (pid==-1) return TString("da");
3261  else if (pid==-2) return TString("ua");
3262  else if (pid==-3) return TString("sa");
3263  else if (pid==-4) return TString("ca");
3264  else if (pid==-5) return TString("ba");
3265  else if (abs(pid)==6) return TString("qj"); // No tops!
3266  else if (pid==11) return TString("el");
3267  else if (pid==13) return TString("ml");
3268  else if (pid==15) return TString("tl");
3269  else if (pid==-11) return TString("ea");
3270  else if (pid==-13) return TString("ma");
3271  else if (pid==-15) return TString("ta");
3272  else if (std::abs(pid)>=12 && std::abs(pid)<=16){
3273  if (!useExtendedConventions){
3274  if (pid>0) return TString("nl");
3275  else return TString("na");
3276  }
3277  else{
3278  if (pid==12) return TString("ne");
3279  else if (pid==14) return TString("nm");
3280  else if (pid==16) return TString("nt");
3281  else if (pid==-12) return TString("ke");
3282  else if (pid==-14) return TString("km");
3283  else/* if (pid==-16)*/ return TString("kt");
3284  }
3285  }
3286  else return TString(" ");
3287 }
3288 
3290  double minZmassSqr=10*10;
3291  if (
3292  process == TVar::bkgZZ
3293  &&
3294  (s[2][3]<minZmassSqr || s[4][5]<minZmassSqr)
3295  ) return true;
3296  return false;
3297 }
3298 bool TUtil::MCFM_smalls(double s[][mxpart], int npart){
3299 
3300  // Reject event if any s(i,j) is too small
3301  // cutoff is defined in technical.Dat
3302 
3303  if (
3304  npart == 3 &&
3305  (
3306  (-s[5-1][1-1]< cutoff_.cutoff) //gamma p1
3307  || (-s[5-1][2-1]< cutoff_.cutoff) //gamma p2
3308  || (-s[4-1][1-1]< cutoff_.cutoff) //e+ p1
3309  || (-s[4-1][2-1]< cutoff_.cutoff) //e- p2
3310  || (-s[3-1][1-1]< cutoff_.cutoff) //nu p1
3311  || (-s[3-1][2-1]< cutoff_.cutoff) //nu p2
3312  || (+s[5-1][4-1]< cutoff_.cutoff) //gamma e+
3313  || (+s[5-1][3-1]< cutoff_.cutoff) //gamma nu
3314  || (+s[4-1][3-1]< cutoff_.cutoff) //e+ nu
3315  )
3316  )
3317  return true;
3318 
3319  else if (
3320  npart == 4 &&
3321  (
3322  (-s[5-1][1-1]< cutoff_.cutoff) //e- p1
3323  || (-s[5-1][2-1]< cutoff_.cutoff) //e- p2
3324  || (-s[6-1][1-1]< cutoff_.cutoff) //nb p1
3325  || (-s[6-1][2-1]< cutoff_.cutoff) //nb p2
3326  || (+s[6-1][5-1]< cutoff_.cutoff) //e- nb
3327  )
3328 
3329  )
3330 
3331  return true;
3332 
3333  return false;
3334 }
3335 
3336 
3337 void TUtil::InitJHUGenMELA(const char* pathtoPDFSet, int PDFMember, double collider_sqrts){
3338  const double GeV = 1./100.;
3339  collider_sqrts *= GeV; // GeV units in JHUGen
3340 
3341  char path_pdf_c[200];
3342  sprintf(path_pdf_c, "%s", pathtoPDFSet);
3343  int pathpdfLength = strlen(path_pdf_c);
3344 
3345  __modjhugen_MOD_initfirsttime(path_pdf_c, &pathpdfLength, &PDFMember, &collider_sqrts);
3346 }
3347 void TUtil::SetJHUGenHiggsMassWidth(double MReso, double GaReso){
3348  const double GeV = 1./100.;
3349  MReso *= GeV; // GeV units in JHUGen
3350  GaReso *= GeV; // GeV units in JHUGen
3351  __modjhugenmela_MOD_sethiggsmasswidth(&MReso, &GaReso);
3352 }
3354  int iAllow = (doAllow ? 1 : 0);
3356 }
3359 }
3360 void TUtil::SetMCFMSpinZeroCouplings(bool useBSM, SpinZeroCouplings const* Hcouplings, bool forceZZ){
3361  if (!useBSM){
3362  spinzerohiggs_anomcoupl_.AllowAnomalousCouplings = 0;
3363  spinzerohiggs_anomcoupl_.distinguish_HWWcouplings = 0;
3364 
3365  /***** REGULAR RESONANCE *****/
3366  //
3367  spinzerohiggs_anomcoupl_.cz_q1sq = 0;
3368  spinzerohiggs_anomcoupl_.Lambda_z11 = 100;
3369  spinzerohiggs_anomcoupl_.Lambda_z21 = 100;
3370  spinzerohiggs_anomcoupl_.Lambda_z31 = 100;
3371  spinzerohiggs_anomcoupl_.Lambda_z41 = 100;
3372  spinzerohiggs_anomcoupl_.cz_q2sq = 0;
3373  spinzerohiggs_anomcoupl_.Lambda_z12 = 100;
3374  spinzerohiggs_anomcoupl_.Lambda_z22 = 100;
3375  spinzerohiggs_anomcoupl_.Lambda_z32 = 100;
3376  spinzerohiggs_anomcoupl_.Lambda_z42 = 100;
3377  spinzerohiggs_anomcoupl_.cz_q12sq = 0;
3378  spinzerohiggs_anomcoupl_.Lambda_z10 = 100;
3379  spinzerohiggs_anomcoupl_.Lambda_z20 = 100;
3380  spinzerohiggs_anomcoupl_.Lambda_z30 = 100;
3381  spinzerohiggs_anomcoupl_.Lambda_z40 = 100;
3382  //
3383  spinzerohiggs_anomcoupl_.cw_q1sq = 0;
3384  spinzerohiggs_anomcoupl_.Lambda_w11 = 100;
3385  spinzerohiggs_anomcoupl_.Lambda_w21 = 100;
3386  spinzerohiggs_anomcoupl_.Lambda_w31 = 100;
3387  spinzerohiggs_anomcoupl_.Lambda_w41 = 100;
3388  spinzerohiggs_anomcoupl_.cw_q2sq = 0;
3389  spinzerohiggs_anomcoupl_.Lambda_w12 = 100;
3390  spinzerohiggs_anomcoupl_.Lambda_w22 = 100;
3391  spinzerohiggs_anomcoupl_.Lambda_w32 = 100;
3392  spinzerohiggs_anomcoupl_.Lambda_w42 = 100;
3393  spinzerohiggs_anomcoupl_.cw_q12sq = 0;
3394  spinzerohiggs_anomcoupl_.Lambda_w10 = 100;
3395  spinzerohiggs_anomcoupl_.Lambda_w20 = 100;
3396  spinzerohiggs_anomcoupl_.Lambda_w30 = 100;
3397  spinzerohiggs_anomcoupl_.Lambda_w40 = 100;
3398  //
3399  // Just in case, not really needed to set to the default value
3400  spinzerohiggs_anomcoupl_.kappa_top[0] = 1; spinzerohiggs_anomcoupl_.kappa_top[1] = 0;
3401  spinzerohiggs_anomcoupl_.kappa_bot[0] = 1; spinzerohiggs_anomcoupl_.kappa_bot[1] = 0;
3402  spinzerohiggs_anomcoupl_.ghz1[0] = 1; spinzerohiggs_anomcoupl_.ghz1[1] = 0;
3403  spinzerohiggs_anomcoupl_.ghw1[0] = 1; spinzerohiggs_anomcoupl_.ghw1[1] = 0;
3404  for (int im=0; im<2; im++){
3405  spinzerohiggs_anomcoupl_.kappa_tilde_top[im] = 0;
3406  spinzerohiggs_anomcoupl_.kappa_tilde_bot[im] = 0;
3407  spinzerohiggs_anomcoupl_.ghg2[im] = 0;
3408  spinzerohiggs_anomcoupl_.ghg3[im] = 0;
3409  spinzerohiggs_anomcoupl_.ghg4[im] = 0;
3410  spinzerohiggs_anomcoupl_.kappa_4gen_top[im] = 0;
3411  spinzerohiggs_anomcoupl_.kappa_4gen_bot[im] = 0;
3412  spinzerohiggs_anomcoupl_.kappa_tilde_4gen_top[im] = 0;
3413  spinzerohiggs_anomcoupl_.kappa_tilde_4gen_bot[im] = 0;
3414  spinzerohiggs_anomcoupl_.ghg2_4gen[im] = 0;
3415  spinzerohiggs_anomcoupl_.ghg3_4gen[im] = 0;
3416  spinzerohiggs_anomcoupl_.ghg4_4gen[im] = 0;
3417  //
3418  spinzerohiggs_anomcoupl_.ghz2[im] = 0;
3419  spinzerohiggs_anomcoupl_.ghz3[im] = 0;
3420  spinzerohiggs_anomcoupl_.ghz4[im] = 0;
3421  spinzerohiggs_anomcoupl_.ghz1_prime[im] = 0;
3422  spinzerohiggs_anomcoupl_.ghz1_prime2[im] = 0;
3423  spinzerohiggs_anomcoupl_.ghz1_prime3[im] = 0;
3424  spinzerohiggs_anomcoupl_.ghz1_prime4[im] = 0;
3425  spinzerohiggs_anomcoupl_.ghz1_prime5[im] = 0;
3426  spinzerohiggs_anomcoupl_.ghz1_prime6[im] = 0;
3427  spinzerohiggs_anomcoupl_.ghz1_prime7[im] = 0;
3428  spinzerohiggs_anomcoupl_.ghz2_prime[im] = 0;
3429  spinzerohiggs_anomcoupl_.ghz2_prime2[im] = 0;
3430  spinzerohiggs_anomcoupl_.ghz2_prime3[im] = 0;
3431  spinzerohiggs_anomcoupl_.ghz2_prime4[im] = 0;
3432  spinzerohiggs_anomcoupl_.ghz2_prime5[im] = 0;
3433  spinzerohiggs_anomcoupl_.ghz2_prime6[im] = 0;
3434  spinzerohiggs_anomcoupl_.ghz2_prime7[im] = 0;
3435  spinzerohiggs_anomcoupl_.ghz3_prime[im] = 0;
3436  spinzerohiggs_anomcoupl_.ghz3_prime2[im] = 0;
3437  spinzerohiggs_anomcoupl_.ghz3_prime3[im] = 0;
3438  spinzerohiggs_anomcoupl_.ghz3_prime4[im] = 0;
3439  spinzerohiggs_anomcoupl_.ghz3_prime5[im] = 0;
3440  spinzerohiggs_anomcoupl_.ghz3_prime6[im] = 0;
3441  spinzerohiggs_anomcoupl_.ghz3_prime7[im] = 0;
3442  spinzerohiggs_anomcoupl_.ghz4_prime[im] = 0;
3443  spinzerohiggs_anomcoupl_.ghz4_prime2[im] = 0;
3444  spinzerohiggs_anomcoupl_.ghz4_prime3[im] = 0;
3445  spinzerohiggs_anomcoupl_.ghz4_prime4[im] = 0;
3446  spinzerohiggs_anomcoupl_.ghz4_prime5[im] = 0;
3447  spinzerohiggs_anomcoupl_.ghz4_prime6[im] = 0;
3448  spinzerohiggs_anomcoupl_.ghz4_prime7[im] = 0;
3449  //
3450  spinzerohiggs_anomcoupl_.ghzgs1_prime2[im] = 0;
3451  spinzerohiggs_anomcoupl_.ghzgs2[im] = 0;
3452  spinzerohiggs_anomcoupl_.ghzgs3[im] = 0;
3453  spinzerohiggs_anomcoupl_.ghzgs4[im] = 0;
3454  spinzerohiggs_anomcoupl_.ghgsgs2[im] = 0;
3455  spinzerohiggs_anomcoupl_.ghgsgs3[im] = 0;
3456  spinzerohiggs_anomcoupl_.ghgsgs4[im] = 0;
3457  //
3458  spinzerohiggs_anomcoupl_.ghw2[im] = 0;
3459  spinzerohiggs_anomcoupl_.ghw3[im] = 0;
3460  spinzerohiggs_anomcoupl_.ghw4[im] = 0;
3461  spinzerohiggs_anomcoupl_.ghw1_prime[im] = 0;
3462  spinzerohiggs_anomcoupl_.ghw1_prime2[im] = 0;
3463  spinzerohiggs_anomcoupl_.ghw1_prime3[im] = 0;
3464  spinzerohiggs_anomcoupl_.ghw1_prime4[im] = 0;
3465  spinzerohiggs_anomcoupl_.ghw1_prime5[im] = 0;
3466  spinzerohiggs_anomcoupl_.ghw1_prime6[im] = 0;
3467  spinzerohiggs_anomcoupl_.ghw1_prime7[im] = 0;
3468  spinzerohiggs_anomcoupl_.ghw2_prime[im] = 0;
3469  spinzerohiggs_anomcoupl_.ghw2_prime2[im] = 0;
3470  spinzerohiggs_anomcoupl_.ghw2_prime3[im] = 0;
3471  spinzerohiggs_anomcoupl_.ghw2_prime4[im] = 0;
3472  spinzerohiggs_anomcoupl_.ghw2_prime5[im] = 0;
3473  spinzerohiggs_anomcoupl_.ghw2_prime6[im] = 0;
3474  spinzerohiggs_anomcoupl_.ghw2_prime7[im] = 0;
3475  spinzerohiggs_anomcoupl_.ghw3_prime[im] = 0;
3476  spinzerohiggs_anomcoupl_.ghw3_prime2[im] = 0;
3477  spinzerohiggs_anomcoupl_.ghw3_prime3[im] = 0;
3478  spinzerohiggs_anomcoupl_.ghw3_prime4[im] = 0;
3479  spinzerohiggs_anomcoupl_.ghw3_prime5[im] = 0;
3480  spinzerohiggs_anomcoupl_.ghw3_prime6[im] = 0;
3481  spinzerohiggs_anomcoupl_.ghw3_prime7[im] = 0;
3482  spinzerohiggs_anomcoupl_.ghw4_prime[im] = 0;
3483  spinzerohiggs_anomcoupl_.ghw4_prime2[im] = 0;
3484  spinzerohiggs_anomcoupl_.ghw4_prime3[im] = 0;
3485  spinzerohiggs_anomcoupl_.ghw4_prime4[im] = 0;
3486  spinzerohiggs_anomcoupl_.ghw4_prime5[im] = 0;
3487  spinzerohiggs_anomcoupl_.ghw4_prime6[im] = 0;
3488  spinzerohiggs_anomcoupl_.ghw4_prime7[im] = 0;
3489 
3490  }
3491  /***** END REGULAR RESONANCE *****/
3492  //
3493  /***** SECOND RESONANCE *****/
3494  //
3495  spinzerohiggs_anomcoupl_.c2z_q1sq = 0;
3496  spinzerohiggs_anomcoupl_.Lambda2_z11 = 100;
3497  spinzerohiggs_anomcoupl_.Lambda2_z21 = 100;
3498  spinzerohiggs_anomcoupl_.Lambda2_z31 = 100;
3499  spinzerohiggs_anomcoupl_.Lambda2_z41 = 100;
3500  spinzerohiggs_anomcoupl_.c2z_q2sq = 0;
3501  spinzerohiggs_anomcoupl_.Lambda2_z12 = 100;
3502  spinzerohiggs_anomcoupl_.Lambda2_z22 = 100;
3503  spinzerohiggs_anomcoupl_.Lambda2_z32 = 100;
3504  spinzerohiggs_anomcoupl_.Lambda2_z42 = 100;
3505  spinzerohiggs_anomcoupl_.c2z_q12sq = 0;
3506  spinzerohiggs_anomcoupl_.Lambda2_z10 = 100;
3507  spinzerohiggs_anomcoupl_.Lambda2_z20 = 100;
3508  spinzerohiggs_anomcoupl_.Lambda2_z30 = 100;
3509  spinzerohiggs_anomcoupl_.Lambda2_z40 = 100;
3510  //
3511  spinzerohiggs_anomcoupl_.c2w_q1sq = 0;
3512  spinzerohiggs_anomcoupl_.Lambda2_w11 = 100;
3513  spinzerohiggs_anomcoupl_.Lambda2_w21 = 100;
3514  spinzerohiggs_anomcoupl_.Lambda2_w31 = 100;
3515  spinzerohiggs_anomcoupl_.Lambda2_w41 = 100;
3516  spinzerohiggs_anomcoupl_.c2w_q2sq = 0;
3517  spinzerohiggs_anomcoupl_.Lambda2_w12 = 100;
3518  spinzerohiggs_anomcoupl_.Lambda2_w22 = 100;
3519  spinzerohiggs_anomcoupl_.Lambda2_w32 = 100;
3520  spinzerohiggs_anomcoupl_.Lambda2_w42 = 100;
3521  spinzerohiggs_anomcoupl_.c2w_q12sq = 0;
3522  spinzerohiggs_anomcoupl_.Lambda2_w10 = 100;
3523  spinzerohiggs_anomcoupl_.Lambda2_w20 = 100;
3524  spinzerohiggs_anomcoupl_.Lambda2_w30 = 100;
3525  spinzerohiggs_anomcoupl_.Lambda2_w40 = 100;
3526  //
3527  // AllowAnomalousCouplings==0, so these are still treated as 1 when h2mass>=0
3528  spinzerohiggs_anomcoupl_.kappa2_top[0] = 0; spinzerohiggs_anomcoupl_.kappa2_top[1] = 0;
3529  spinzerohiggs_anomcoupl_.kappa2_bot[0] = 0; spinzerohiggs_anomcoupl_.kappa2_bot[1] = 0;
3530  spinzerohiggs_anomcoupl_.gh2z1[0] = 0; spinzerohiggs_anomcoupl_.gh2z1[1] = 0;
3531  spinzerohiggs_anomcoupl_.gh2w1[0] = 0; spinzerohiggs_anomcoupl_.gh2w1[1] = 0;
3532  for (int im=0; im<2; im++){
3533  spinzerohiggs_anomcoupl_.kappa2_tilde_top[im] = 0;
3534  spinzerohiggs_anomcoupl_.kappa2_tilde_bot[im] = 0;
3535  spinzerohiggs_anomcoupl_.gh2g2[im] = 0;
3536  spinzerohiggs_anomcoupl_.gh2g3[im] = 0;
3537  spinzerohiggs_anomcoupl_.gh2g4[im] = 0;
3538  spinzerohiggs_anomcoupl_.kappa2_4gen_top[im] = 0;
3539  spinzerohiggs_anomcoupl_.kappa2_4gen_bot[im] = 0;
3540  spinzerohiggs_anomcoupl_.kappa2_tilde_4gen_top[im] = 0;
3541  spinzerohiggs_anomcoupl_.kappa2_tilde_4gen_bot[im] = 0;
3542  spinzerohiggs_anomcoupl_.gh2g2_4gen[im] = 0;
3543  spinzerohiggs_anomcoupl_.gh2g3_4gen[im] = 0;
3544  spinzerohiggs_anomcoupl_.gh2g4_4gen[im] = 0;
3545  //
3546  spinzerohiggs_anomcoupl_.gh2z2[im] = 0;
3547  spinzerohiggs_anomcoupl_.gh2z3[im] = 0;
3548  spinzerohiggs_anomcoupl_.gh2z4[im] = 0;
3549  spinzerohiggs_anomcoupl_.gh2z1_prime[im] = 0;
3550  spinzerohiggs_anomcoupl_.gh2z1_prime2[im] = 0;
3551  spinzerohiggs_anomcoupl_.gh2z1_prime3[im] = 0;
3552  spinzerohiggs_anomcoupl_.gh2z1_prime4[im] = 0;
3553  spinzerohiggs_anomcoupl_.gh2z1_prime5[im] = 0;
3554  spinzerohiggs_anomcoupl_.gh2z1_prime6[im] = 0;
3555  spinzerohiggs_anomcoupl_.gh2z1_prime7[im] = 0;
3556  spinzerohiggs_anomcoupl_.gh2z2_prime[im] = 0;
3557  spinzerohiggs_anomcoupl_.gh2z2_prime2[im] = 0;
3558  spinzerohiggs_anomcoupl_.gh2z2_prime3[im] = 0;
3559  spinzerohiggs_anomcoupl_.gh2z2_prime4[im] = 0;
3560  spinzerohiggs_anomcoupl_.gh2z2_prime5[im] = 0;
3561  spinzerohiggs_anomcoupl_.gh2z2_prime6[im] = 0;
3562  spinzerohiggs_anomcoupl_.gh2z2_prime7[im] = 0;
3563  spinzerohiggs_anomcoupl_.gh2z3_prime[im] = 0;
3564  spinzerohiggs_anomcoupl_.gh2z3_prime2[im] = 0;
3565  spinzerohiggs_anomcoupl_.gh2z3_prime3[im] = 0;
3566  spinzerohiggs_anomcoupl_.gh2z3_prime4[im] = 0;
3567  spinzerohiggs_anomcoupl_.gh2z3_prime5[im] = 0;
3568  spinzerohiggs_anomcoupl_.gh2z3_prime6[im] = 0;
3569  spinzerohiggs_anomcoupl_.gh2z3_prime7[im] = 0;
3570  spinzerohiggs_anomcoupl_.gh2z4_prime[im] = 0;
3571  spinzerohiggs_anomcoupl_.gh2z4_prime2[im] = 0;
3572  spinzerohiggs_anomcoupl_.gh2z4_prime3[im] = 0;
3573  spinzerohiggs_anomcoupl_.gh2z4_prime4[im] = 0;
3574  spinzerohiggs_anomcoupl_.gh2z4_prime5[im] = 0;
3575  spinzerohiggs_anomcoupl_.gh2z4_prime6[im] = 0;
3576  spinzerohiggs_anomcoupl_.gh2z4_prime7[im] = 0;
3577  //
3578  spinzerohiggs_anomcoupl_.gh2zgs1_prime2[im] = 0;
3579  spinzerohiggs_anomcoupl_.gh2zgs2[im] = 0;
3580  spinzerohiggs_anomcoupl_.gh2zgs3[im] = 0;
3581  spinzerohiggs_anomcoupl_.gh2zgs4[im] = 0;
3582  spinzerohiggs_anomcoupl_.gh2gsgs2[im] = 0;
3583  spinzerohiggs_anomcoupl_.gh2gsgs3[im] = 0;
3584  spinzerohiggs_anomcoupl_.gh2gsgs4[im] = 0;
3585  //
3586  spinzerohiggs_anomcoupl_.gh2w2[im] = 0;
3587  spinzerohiggs_anomcoupl_.gh2w3[im] = 0;
3588  spinzerohiggs_anomcoupl_.gh2w4[im] = 0;
3589  spinzerohiggs_anomcoupl_.gh2w1_prime[im] = 0;
3590  spinzerohiggs_anomcoupl_.gh2w1_prime2[im] = 0;
3591  spinzerohiggs_anomcoupl_.gh2w1_prime3[im] = 0;
3592  spinzerohiggs_anomcoupl_.gh2w1_prime4[im] = 0;
3593  spinzerohiggs_anomcoupl_.gh2w1_prime5[im] = 0;
3594  spinzerohiggs_anomcoupl_.gh2w1_prime6[im] = 0;
3595  spinzerohiggs_anomcoupl_.gh2w1_prime7[im] = 0;
3596  spinzerohiggs_anomcoupl_.gh2w2_prime[im] = 0;
3597  spinzerohiggs_anomcoupl_.gh2w2_prime2[im] = 0;
3598  spinzerohiggs_anomcoupl_.gh2w2_prime3[im] = 0;
3599  spinzerohiggs_anomcoupl_.gh2w2_prime4[im] = 0;
3600  spinzerohiggs_anomcoupl_.gh2w2_prime5[im] = 0;
3601  spinzerohiggs_anomcoupl_.gh2w2_prime6[im] = 0;
3602  spinzerohiggs_anomcoupl_.gh2w2_prime7[im] = 0;
3603  spinzerohiggs_anomcoupl_.gh2w3_prime[im] = 0;
3604  spinzerohiggs_anomcoupl_.gh2w3_prime2[im] = 0;
3605  spinzerohiggs_anomcoupl_.gh2w3_prime3[im] = 0;
3606  spinzerohiggs_anomcoupl_.gh2w3_prime4[im] = 0;
3607  spinzerohiggs_anomcoupl_.gh2w3_prime5[im] = 0;
3608  spinzerohiggs_anomcoupl_.gh2w3_prime6[im] = 0;
3609  spinzerohiggs_anomcoupl_.gh2w3_prime7[im] = 0;
3610  spinzerohiggs_anomcoupl_.gh2w4_prime[im] = 0;
3611  spinzerohiggs_anomcoupl_.gh2w4_prime2[im] = 0;
3612  spinzerohiggs_anomcoupl_.gh2w4_prime3[im] = 0;
3613  spinzerohiggs_anomcoupl_.gh2w4_prime4[im] = 0;
3614  spinzerohiggs_anomcoupl_.gh2w4_prime5[im] = 0;
3615  spinzerohiggs_anomcoupl_.gh2w4_prime6[im] = 0;
3616  spinzerohiggs_anomcoupl_.gh2w4_prime7[im] = 0;
3617  }
3618  /***** END SECOND RESONANCE *****/
3619  }
3620  else{
3621  spinzerohiggs_anomcoupl_.AllowAnomalousCouplings = 1;
3622  spinzerohiggs_anomcoupl_.distinguish_HWWcouplings = ((Hcouplings->separateWWZZcouplings && !forceZZ) ? 1 : 0);
3623 
3624  /***** REGULAR RESONANCE *****/
3625  //
3641  //
3642  for (int im=0; im<2; im++){
3643  spinzerohiggs_anomcoupl_.kappa_top[im] = (Hcouplings->Httcoupl)[gHIGGS_KAPPA][im];
3644  spinzerohiggs_anomcoupl_.kappa_bot[im] = (Hcouplings->Hbbcoupl)[gHIGGS_KAPPA][im];
3645  spinzerohiggs_anomcoupl_.kappa_tilde_top[im] = (Hcouplings->Httcoupl)[gHIGGS_KAPPA_TILDE][im];
3646  spinzerohiggs_anomcoupl_.kappa_tilde_bot[im] = (Hcouplings->Hbbcoupl)[gHIGGS_KAPPA_TILDE][im];
3647  spinzerohiggs_anomcoupl_.ghg2[im] = (Hcouplings->Hggcoupl)[gHIGGS_GG_2][im];
3648  spinzerohiggs_anomcoupl_.ghg3[im] = (Hcouplings->Hggcoupl)[gHIGGS_GG_3][im];
3649  spinzerohiggs_anomcoupl_.ghg4[im] = (Hcouplings->Hggcoupl)[gHIGGS_GG_4][im];
3650  spinzerohiggs_anomcoupl_.kappa_4gen_top[im] = (Hcouplings->Ht4t4coupl)[gHIGGS_KAPPA][im];
3651  spinzerohiggs_anomcoupl_.kappa_4gen_bot[im] = (Hcouplings->Hb4b4coupl)[gHIGGS_KAPPA][im];
3652  spinzerohiggs_anomcoupl_.kappa_tilde_4gen_top[im] = (Hcouplings->Ht4t4coupl)[gHIGGS_KAPPA_TILDE][im];
3653  spinzerohiggs_anomcoupl_.kappa_tilde_4gen_bot[im] = (Hcouplings->Hb4b4coupl)[gHIGGS_KAPPA_TILDE][im];
3654  spinzerohiggs_anomcoupl_.ghg2_4gen[im] = (Hcouplings->Hg4g4coupl)[gHIGGS_GG_2][im];
3655  spinzerohiggs_anomcoupl_.ghg3_4gen[im] = (Hcouplings->Hg4g4coupl)[gHIGGS_GG_3][im];
3656  spinzerohiggs_anomcoupl_.ghg4_4gen[im] = (Hcouplings->Hg4g4coupl)[gHIGGS_GG_4][im];
3657  //
3658  spinzerohiggs_anomcoupl_.ghz1[im] = (Hcouplings->Hzzcoupl)[gHIGGS_VV_1][im];
3659  spinzerohiggs_anomcoupl_.ghz2[im] = (Hcouplings->Hzzcoupl)[gHIGGS_VV_2][im];
3660  spinzerohiggs_anomcoupl_.ghz3[im] = (Hcouplings->Hzzcoupl)[gHIGGS_VV_3][im];
3661  spinzerohiggs_anomcoupl_.ghz4[im] = (Hcouplings->Hzzcoupl)[gHIGGS_VV_4][im];
3662  spinzerohiggs_anomcoupl_.ghz1_prime[im] = (Hcouplings->Hzzcoupl)[gHIGGS_VV_1_PRIME][im];
3663  spinzerohiggs_anomcoupl_.ghz1_prime2[im] = (Hcouplings->Hzzcoupl)[gHIGGS_VV_1_PRIME2][im];
3664  spinzerohiggs_anomcoupl_.ghz1_prime3[im] = (Hcouplings->Hzzcoupl)[gHIGGS_VV_1_PRIME3][im];
3665  spinzerohiggs_anomcoupl_.ghz1_prime4[im] = (Hcouplings->Hzzcoupl)[gHIGGS_VV_1_PRIME4][im];
3666  spinzerohiggs_anomcoupl_.ghz1_prime5[im] = (Hcouplings->Hzzcoupl)[gHIGGS_VV_1_PRIME5][im];
3667  spinzerohiggs_anomcoupl_.ghz1_prime6[im] = (Hcouplings->Hzzcoupl)[gHIGGS_VV_1_PRIME6][im];
3668  spinzerohiggs_anomcoupl_.ghz1_prime7[im] = (Hcouplings->Hzzcoupl)[gHIGGS_VV_1_PRIME7][im];
3669  spinzerohiggs_anomcoupl_.ghz2_prime[im] = (Hcouplings->Hzzcoupl)[gHIGGS_VV_2_PRIME][im];
3670  spinzerohiggs_anomcoupl_.ghz2_prime2[im] = (Hcouplings->Hzzcoupl)[gHIGGS_VV_2_PRIME2][im];
3671  spinzerohiggs_anomcoupl_.ghz2_prime3[im] = (Hcouplings->Hzzcoupl)[gHIGGS_VV_2_PRIME3][im];
3672  spinzerohiggs_anomcoupl_.ghz2_prime4[im] = (Hcouplings->Hzzcoupl)[gHIGGS_VV_2_PRIME4][im];
3673  spinzerohiggs_anomcoupl_.ghz2_prime5[im] = (Hcouplings->Hzzcoupl)[gHIGGS_VV_2_PRIME5][im];
3674  spinzerohiggs_anomcoupl_.ghz2_prime6[im] = (Hcouplings->Hzzcoupl)[gHIGGS_VV_2_PRIME6][im];
3675  spinzerohiggs_anomcoupl_.ghz2_prime7[im] = (Hcouplings->Hzzcoupl)[gHIGGS_VV_2_PRIME7][im];
3676  spinzerohiggs_anomcoupl_.ghz3_prime[im] = (Hcouplings->Hzzcoupl)[gHIGGS_VV_3_PRIME][im];
3677  spinzerohiggs_anomcoupl_.ghz3_prime2[im] = (Hcouplings->Hzzcoupl)[gHIGGS_VV_3_PRIME2][im];
3678  spinzerohiggs_anomcoupl_.ghz3_prime3[im] = (Hcouplings->Hzzcoupl)[gHIGGS_VV_3_PRIME3][im];
3679  spinzerohiggs_anomcoupl_.ghz3_prime4[im] = (Hcouplings->Hzzcoupl)[gHIGGS_VV_3_PRIME4][im];
3680  spinzerohiggs_anomcoupl_.ghz3_prime5[im] = (Hcouplings->Hzzcoupl)[gHIGGS_VV_3_PRIME5][im];
3681  spinzerohiggs_anomcoupl_.ghz3_prime6[im] = (Hcouplings->Hzzcoupl)[gHIGGS_VV_3_PRIME6][im];
3682  spinzerohiggs_anomcoupl_.ghz3_prime7[im] = (Hcouplings->Hzzcoupl)[gHIGGS_VV_3_PRIME7][im];
3683  spinzerohiggs_anomcoupl_.ghz4_prime[im] = (Hcouplings->Hzzcoupl)[gHIGGS_VV_4_PRIME][im];
3684  spinzerohiggs_anomcoupl_.ghz4_prime2[im] = (Hcouplings->Hzzcoupl)[gHIGGS_VV_4_PRIME2][im];
3685  spinzerohiggs_anomcoupl_.ghz4_prime3[im] = (Hcouplings->Hzzcoupl)[gHIGGS_VV_4_PRIME3][im];
3686  spinzerohiggs_anomcoupl_.ghz4_prime4[im] = (Hcouplings->Hzzcoupl)[gHIGGS_VV_4_PRIME4][im];
3687  spinzerohiggs_anomcoupl_.ghz4_prime5[im] = (Hcouplings->Hzzcoupl)[gHIGGS_VV_4_PRIME5][im];
3688  spinzerohiggs_anomcoupl_.ghz4_prime6[im] = (Hcouplings->Hzzcoupl)[gHIGGS_VV_4_PRIME6][im];
3689  spinzerohiggs_anomcoupl_.ghz4_prime7[im] = (Hcouplings->Hzzcoupl)[gHIGGS_VV_4_PRIME7][im];
3690  //
3691  spinzerohiggs_anomcoupl_.ghzgs1_prime2[im] = (Hcouplings->Hzzcoupl)[gHIGGS_ZA_1_PRIME2][im];
3692  spinzerohiggs_anomcoupl_.ghzgs2[im] = (Hcouplings->Hzzcoupl)[gHIGGS_ZA_2][im];
3693  spinzerohiggs_anomcoupl_.ghzgs3[im] = (Hcouplings->Hzzcoupl)[gHIGGS_ZA_3][im];
3694  spinzerohiggs_anomcoupl_.ghzgs4[im] = (Hcouplings->Hzzcoupl)[gHIGGS_ZA_4][im];
3695  spinzerohiggs_anomcoupl_.ghgsgs2[im] = (Hcouplings->Hzzcoupl)[gHIGGS_AA_2][im];
3696  spinzerohiggs_anomcoupl_.ghgsgs3[im] = (Hcouplings->Hzzcoupl)[gHIGGS_AA_3][im];
3697  spinzerohiggs_anomcoupl_.ghgsgs4[im] = (Hcouplings->Hzzcoupl)[gHIGGS_AA_4][im];
3698  }
3699  //
3700  if (spinzerohiggs_anomcoupl_.distinguish_HWWcouplings==1){
3701  //
3717  //
3718  for (int im=0; im<2; im++){
3719  spinzerohiggs_anomcoupl_.ghw1[im] = (Hcouplings->Hwwcoupl)[gHIGGS_VV_1][im];
3720  spinzerohiggs_anomcoupl_.ghw2[im] = (Hcouplings->Hwwcoupl)[gHIGGS_VV_2][im];
3721  spinzerohiggs_anomcoupl_.ghw3[im] = (Hcouplings->Hwwcoupl)[gHIGGS_VV_3][im];
3722  spinzerohiggs_anomcoupl_.ghw4[im] = (Hcouplings->Hwwcoupl)[gHIGGS_VV_4][im];
3723  spinzerohiggs_anomcoupl_.ghw1_prime[im] = (Hcouplings->Hwwcoupl)[gHIGGS_VV_1_PRIME][im];
3724  spinzerohiggs_anomcoupl_.ghw1_prime2[im] = (Hcouplings->Hwwcoupl)[gHIGGS_VV_1_PRIME2][im];
3725  spinzerohiggs_anomcoupl_.ghw1_prime3[im] = (Hcouplings->Hwwcoupl)[gHIGGS_VV_1_PRIME3][im];
3726  spinzerohiggs_anomcoupl_.ghw1_prime4[im] = (Hcouplings->Hwwcoupl)[gHIGGS_VV_1_PRIME4][im];
3727  spinzerohiggs_anomcoupl_.ghw1_prime5[im] = (Hcouplings->Hwwcoupl)[gHIGGS_VV_1_PRIME5][im];
3728  spinzerohiggs_anomcoupl_.ghw1_prime6[im] = (Hcouplings->Hwwcoupl)[gHIGGS_VV_1_PRIME6][im];
3729  spinzerohiggs_anomcoupl_.ghw1_prime7[im] = (Hcouplings->Hwwcoupl)[gHIGGS_VV_1_PRIME7][im];
3730  spinzerohiggs_anomcoupl_.ghw2_prime[im] = (Hcouplings->Hwwcoupl)[gHIGGS_VV_2_PRIME][im];
3731  spinzerohiggs_anomcoupl_.ghw2_prime2[im] = (Hcouplings->Hwwcoupl)[gHIGGS_VV_2_PRIME2][im];
3732  spinzerohiggs_anomcoupl_.ghw2_prime3[im] = (Hcouplings->Hwwcoupl)[gHIGGS_VV_2_PRIME3][im];
3733  spinzerohiggs_anomcoupl_.ghw2_prime4[im] = (Hcouplings->Hwwcoupl)[gHIGGS_VV_2_PRIME4][im];
3734  spinzerohiggs_anomcoupl_.ghw2_prime5[im] = (Hcouplings->Hwwcoupl)[gHIGGS_VV_2_PRIME5][im];
3735  spinzerohiggs_anomcoupl_.ghw2_prime6[im] = (Hcouplings->Hwwcoupl)[gHIGGS_VV_2_PRIME6][im];
3736  spinzerohiggs_anomcoupl_.ghw2_prime7[im] = (Hcouplings->Hwwcoupl)[gHIGGS_VV_2_PRIME7][im];
3737  spinzerohiggs_anomcoupl_.ghw3_prime[im] = (Hcouplings->Hwwcoupl)[gHIGGS_VV_3_PRIME][im];
3738  spinzerohiggs_anomcoupl_.ghw3_prime2[im] = (Hcouplings->Hwwcoupl)[gHIGGS_VV_3_PRIME2][im];
3739  spinzerohiggs_anomcoupl_.ghw3_prime3[im] = (Hcouplings->Hwwcoupl)[gHIGGS_VV_3_PRIME3][im];
3740  spinzerohiggs_anomcoupl_.ghw3_prime4[im] = (Hcouplings->Hwwcoupl)[gHIGGS_VV_3_PRIME4][im];
3741  spinzerohiggs_anomcoupl_.ghw3_prime5[im] = (Hcouplings->Hwwcoupl)[gHIGGS_VV_3_PRIME5][im];
3742  spinzerohiggs_anomcoupl_.ghw3_prime6[im] = (Hcouplings->Hwwcoupl)[gHIGGS_VV_3_PRIME6][im];
3743  spinzerohiggs_anomcoupl_.ghw3_prime7[im] = (Hcouplings->Hwwcoupl)[gHIGGS_VV_3_PRIME7][im];
3744  spinzerohiggs_anomcoupl_.ghw4_prime[im] = (Hcouplings->Hwwcoupl)[gHIGGS_VV_4_PRIME][im];
3745  spinzerohiggs_anomcoupl_.ghw4_prime2[im] = (Hcouplings->Hwwcoupl)[gHIGGS_VV_4_PRIME2][im];
3746  spinzerohiggs_anomcoupl_.ghw4_prime3[im] = (Hcouplings->Hwwcoupl)[gHIGGS_VV_4_PRIME3][im];
3747  spinzerohiggs_anomcoupl_.ghw4_prime4[im] = (Hcouplings->Hwwcoupl)[gHIGGS_VV_4_PRIME4][im];
3748  spinzerohiggs_anomcoupl_.ghw4_prime5[im] = (Hcouplings->Hwwcoupl)[gHIGGS_VV_4_PRIME5][im];
3749  spinzerohiggs_anomcoupl_.ghw4_prime6[im] = (Hcouplings->Hwwcoupl)[gHIGGS_VV_4_PRIME6][im];
3750  spinzerohiggs_anomcoupl_.ghw4_prime7[im] = (Hcouplings->Hwwcoupl)[gHIGGS_VV_4_PRIME7][im];
3751  }
3752  }
3753  else{
3754  //
3770  //
3771  for (int im=0; im<2; im++){
3772  spinzerohiggs_anomcoupl_.ghw1[im] = (Hcouplings->Hzzcoupl)[gHIGGS_VV_1][im];
3773  spinzerohiggs_anomcoupl_.ghw2[im] = (Hcouplings->Hzzcoupl)[gHIGGS_VV_2][im];
3774  spinzerohiggs_anomcoupl_.ghw3[im] = (Hcouplings->Hzzcoupl)[gHIGGS_VV_3][im];
3775  spinzerohiggs_anomcoupl_.ghw4[im] = (Hcouplings->Hzzcoupl)[gHIGGS_VV_4][im];
3776  spinzerohiggs_anomcoupl_.ghw1_prime[im] = (Hcouplings->Hzzcoupl)[gHIGGS_VV_1_PRIME][im];
3777  spinzerohiggs_anomcoupl_.ghw1_prime2[im] = (Hcouplings->Hzzcoupl)[gHIGGS_VV_1_PRIME2][im];
3778  spinzerohiggs_anomcoupl_.ghw1_prime3[im] = (Hcouplings->Hzzcoupl)[gHIGGS_VV_1_PRIME3][im];
3779  spinzerohiggs_anomcoupl_.ghw1_prime4[im] = (Hcouplings->Hzzcoupl)[gHIGGS_VV_1_PRIME4][im];
3780  spinzerohiggs_anomcoupl_.ghw1_prime5[im] = (Hcouplings->Hzzcoupl)[gHIGGS_VV_1_PRIME5][im];
3781  spinzerohiggs_anomcoupl_.ghw1_prime6[im] = (Hcouplings->Hzzcoupl)[gHIGGS_VV_1_PRIME6][im];
3782  spinzerohiggs_anomcoupl_.ghw1_prime7[im] = (Hcouplings->Hzzcoupl)[gHIGGS_VV_1_PRIME7][im];
3783  spinzerohiggs_anomcoupl_.ghw2_prime[im] = (Hcouplings->Hzzcoupl)[gHIGGS_VV_2_PRIME][im];
3784  spinzerohiggs_anomcoupl_.ghw2_prime2[im] = (Hcouplings->Hzzcoupl)[gHIGGS_VV_2_PRIME2][im];
3785  spinzerohiggs_anomcoupl_.ghw2_prime3[im] = (Hcouplings->Hzzcoupl)[gHIGGS_VV_2_PRIME3][im];
3786  spinzerohiggs_anomcoupl_.ghw2_prime4[im] = (Hcouplings->Hzzcoupl)[gHIGGS_VV_2_PRIME4][im];
3787  spinzerohiggs_anomcoupl_.ghw2_prime5[im] = (Hcouplings->Hzzcoupl)[gHIGGS_VV_2_PRIME5][im];
3788  spinzerohiggs_anomcoupl_.ghw2_prime6[im] = (Hcouplings->Hzzcoupl)[gHIGGS_VV_2_PRIME6][im];
3789  spinzerohiggs_anomcoupl_.ghw2_prime7[im] = (Hcouplings->Hzzcoupl)[gHIGGS_VV_2_PRIME7][im];
3790  spinzerohiggs_anomcoupl_.ghw3_prime[im] = (Hcouplings->Hzzcoupl)[gHIGGS_VV_3_PRIME][im];
3791  spinzerohiggs_anomcoupl_.ghw3_prime2[im] = (Hcouplings->Hzzcoupl)[gHIGGS_VV_3_PRIME2][im];
3792  spinzerohiggs_anomcoupl_.ghw3_prime3[im] = (Hcouplings->Hzzcoupl)[gHIGGS_VV_3_PRIME3][im];
3793  spinzerohiggs_anomcoupl_.ghw3_prime4[im] = (Hcouplings->Hzzcoupl)[gHIGGS_VV_3_PRIME4][im];
3794  spinzerohiggs_anomcoupl_.ghw3_prime5[im] = (Hcouplings->Hzzcoupl)[gHIGGS_VV_3_PRIME5][im];
3795  spinzerohiggs_anomcoupl_.ghw3_prime6[im] = (Hcouplings->Hzzcoupl)[gHIGGS_VV_3_PRIME6][im];
3796  spinzerohiggs_anomcoupl_.ghw3_prime7[im] = (Hcouplings->Hzzcoupl)[gHIGGS_VV_3_PRIME7][im];
3797  spinzerohiggs_anomcoupl_.ghw4_prime[im] = (Hcouplings->Hzzcoupl)[gHIGGS_VV_4_PRIME][im];
3798  spinzerohiggs_anomcoupl_.ghw4_prime2[im] = (Hcouplings->Hzzcoupl)[gHIGGS_VV_4_PRIME2][im];
3799  spinzerohiggs_anomcoupl_.ghw4_prime3[im] = (Hcouplings->Hzzcoupl)[gHIGGS_VV_4_PRIME3][im];
3800  spinzerohiggs_anomcoupl_.ghw4_prime4[im] = (Hcouplings->Hzzcoupl)[gHIGGS_VV_4_PRIME4][im];
3801  spinzerohiggs_anomcoupl_.ghw4_prime5[im] = (Hcouplings->Hzzcoupl)[gHIGGS_VV_4_PRIME5][im];
3802  spinzerohiggs_anomcoupl_.ghw4_prime6[im] = (Hcouplings->Hzzcoupl)[gHIGGS_VV_4_PRIME6][im];
3803  spinzerohiggs_anomcoupl_.ghw4_prime7[im] = (Hcouplings->Hzzcoupl)[gHIGGS_VV_4_PRIME7][im];
3804  }
3805  }
3806  /***** END REGULAR RESONANCE *****/
3807  //
3808  /***** SECOND RESONANCE *****/
3809  //
3825  //
3826  for (int im=0; im<2; im++){
3827  spinzerohiggs_anomcoupl_.kappa2_top[im] = (Hcouplings->H2ttcoupl)[gHIGGS_KAPPA][im];
3828  spinzerohiggs_anomcoupl_.kappa2_bot[im] = (Hcouplings->H2bbcoupl)[gHIGGS_KAPPA][im];
3829  spinzerohiggs_anomcoupl_.kappa2_tilde_top[im] = (Hcouplings->H2ttcoupl)[gHIGGS_KAPPA_TILDE][im];
3830  spinzerohiggs_anomcoupl_.kappa2_tilde_bot[im] = (Hcouplings->H2bbcoupl)[gHIGGS_KAPPA_TILDE][im];
3831  spinzerohiggs_anomcoupl_.gh2g2[im] = (Hcouplings->H2ggcoupl)[gHIGGS_GG_2][im];
3832  spinzerohiggs_anomcoupl_.gh2g3[im] = (Hcouplings->H2ggcoupl)[gHIGGS_GG_3][im];
3833  spinzerohiggs_anomcoupl_.gh2g4[im] = (Hcouplings->H2ggcoupl)[gHIGGS_GG_4][im];
3834  spinzerohiggs_anomcoupl_.kappa2_4gen_top[im] = (Hcouplings->H2t4t4coupl)[gHIGGS_KAPPA][im];
3835  spinzerohiggs_anomcoupl_.kappa2_4gen_bot[im] = (Hcouplings->H2b4b4coupl)[gHIGGS_KAPPA][im];
3836  spinzerohiggs_anomcoupl_.kappa2_tilde_4gen_top[im] = (Hcouplings->H2t4t4coupl)[gHIGGS_KAPPA_TILDE][im];
3837  spinzerohiggs_anomcoupl_.kappa2_tilde_4gen_bot[im] = (Hcouplings->H2b4b4coupl)[gHIGGS_KAPPA_TILDE][im];
3838  spinzerohiggs_anomcoupl_.gh2g2_4gen[im] = (Hcouplings->H2g4g4coupl)[gHIGGS_GG_2][im];
3839  spinzerohiggs_anomcoupl_.gh2g3_4gen[im] = (Hcouplings->H2g4g4coupl)[gHIGGS_GG_3][im];
3840  spinzerohiggs_anomcoupl_.gh2g4_4gen[im] = (Hcouplings->H2g4g4coupl)[gHIGGS_GG_4][im];
3841  //
3842  spinzerohiggs_anomcoupl_.gh2z1[im] = (Hcouplings->H2zzcoupl)[gHIGGS_VV_1][im];
3843  spinzerohiggs_anomcoupl_.gh2z2[im] = (Hcouplings->H2zzcoupl)[gHIGGS_VV_2][im];
3844  spinzerohiggs_anomcoupl_.gh2z3[im] = (Hcouplings->H2zzcoupl)[gHIGGS_VV_3][im];
3845  spinzerohiggs_anomcoupl_.gh2z4[im] = (Hcouplings->H2zzcoupl)[gHIGGS_VV_4][im];
3846  spinzerohiggs_anomcoupl_.gh2z1_prime[im] = (Hcouplings->H2zzcoupl)[gHIGGS_VV_1_PRIME][im];
3847  spinzerohiggs_anomcoupl_.gh2z1_prime2[im] = (Hcouplings->H2zzcoupl)[gHIGGS_VV_1_PRIME2][im];
3848  spinzerohiggs_anomcoupl_.gh2z1_prime3[im] = (Hcouplings->H2zzcoupl)[gHIGGS_VV_1_PRIME3][im];
3849  spinzerohiggs_anomcoupl_.gh2z1_prime4[im] = (Hcouplings->H2zzcoupl)[gHIGGS_VV_1_PRIME4][im];
3850  spinzerohiggs_anomcoupl_.gh2z1_prime5[im] = (Hcouplings->H2zzcoupl)[gHIGGS_VV_1_PRIME5][im];
3851  spinzerohiggs_anomcoupl_.gh2z1_prime6[im] = (Hcouplings->H2zzcoupl)[gHIGGS_VV_1_PRIME6][im];
3852  spinzerohiggs_anomcoupl_.gh2z1_prime7[im] = (Hcouplings->H2zzcoupl)[gHIGGS_VV_1_PRIME7][im];
3853  spinzerohiggs_anomcoupl_.gh2z2_prime[im] = (Hcouplings->H2zzcoupl)[gHIGGS_VV_2_PRIME][im];
3854  spinzerohiggs_anomcoupl_.gh2z2_prime2[im] = (Hcouplings->H2zzcoupl)[gHIGGS_VV_2_PRIME2][im];
3855  spinzerohiggs_anomcoupl_.gh2z2_prime3[im] = (Hcouplings->H2zzcoupl)[gHIGGS_VV_2_PRIME3][im];
3856  spinzerohiggs_anomcoupl_.gh2z2_prime4[im] = (Hcouplings->H2zzcoupl)[gHIGGS_VV_2_PRIME4][im];
3857  spinzerohiggs_anomcoupl_.gh2z2_prime5[im] = (Hcouplings->H2zzcoupl)[gHIGGS_VV_2_PRIME5][im];
3858  spinzerohiggs_anomcoupl_.gh2z2_prime6[im] = (Hcouplings->H2zzcoupl)[gHIGGS_VV_2_PRIME6][im];
3859  spinzerohiggs_anomcoupl_.gh2z2_prime7[im] = (Hcouplings->H2zzcoupl)[gHIGGS_VV_2_PRIME7][im];
3860  spinzerohiggs_anomcoupl_.gh2z3_prime[im] = (Hcouplings->H2zzcoupl)[gHIGGS_VV_3_PRIME][im];
3861  spinzerohiggs_anomcoupl_.gh2z3_prime2[im] = (Hcouplings->H2zzcoupl)[gHIGGS_VV_3_PRIME2][im];
3862  spinzerohiggs_anomcoupl_.gh2z3_prime3[im] = (Hcouplings->H2zzcoupl)[gHIGGS_VV_3_PRIME3][im];
3863  spinzerohiggs_anomcoupl_.gh2z3_prime4[im] = (Hcouplings->H2zzcoupl)[gHIGGS_VV_3_PRIME4][im];
3864  spinzerohiggs_anomcoupl_.gh2z3_prime5[im] = (Hcouplings->H2zzcoupl)[gHIGGS_VV_3_PRIME5][im];
3865  spinzerohiggs_anomcoupl_.gh2z3_prime6[im] = (Hcouplings->H2zzcoupl)[gHIGGS_VV_3_PRIME6][im];
3866  spinzerohiggs_anomcoupl_.gh2z3_prime7[im] = (Hcouplings->H2zzcoupl)[gHIGGS_VV_3_PRIME7][im];
3867  spinzerohiggs_anomcoupl_.gh2z4_prime[im] = (Hcouplings->H2zzcoupl)[gHIGGS_VV_4_PRIME][im];
3868  spinzerohiggs_anomcoupl_.gh2z4_prime2[im] = (Hcouplings->H2zzcoupl)[gHIGGS_VV_4_PRIME2][im];
3869  spinzerohiggs_anomcoupl_.gh2z4_prime3[im] = (Hcouplings->H2zzcoupl)[gHIGGS_VV_4_PRIME3][im];
3870  spinzerohiggs_anomcoupl_.gh2z4_prime4[im] = (Hcouplings->H2zzcoupl)[gHIGGS_VV_4_PRIME4][im];
3871  spinzerohiggs_anomcoupl_.gh2z4_prime5[im] = (Hcouplings->H2zzcoupl)[gHIGGS_VV_4_PRIME5][im];
3872  spinzerohiggs_anomcoupl_.gh2z4_prime6[im] = (Hcouplings->H2zzcoupl)[gHIGGS_VV_4_PRIME6][im];
3873  spinzerohiggs_anomcoupl_.gh2z4_prime7[im] = (Hcouplings->H2zzcoupl)[gHIGGS_VV_4_PRIME7][im];
3874  //
3875  spinzerohiggs_anomcoupl_.gh2zgs1_prime2[im] = (Hcouplings->H2zzcoupl)[gHIGGS_ZA_1_PRIME2][im];
3876  spinzerohiggs_anomcoupl_.gh2zgs2[im] = (Hcouplings->H2zzcoupl)[gHIGGS_ZA_2][im];
3877  spinzerohiggs_anomcoupl_.gh2zgs3[im] = (Hcouplings->H2zzcoupl)[gHIGGS_ZA_3][im];
3878  spinzerohiggs_anomcoupl_.gh2zgs4[im] = (Hcouplings->H2zzcoupl)[gHIGGS_ZA_4][im];
3879  spinzerohiggs_anomcoupl_.gh2gsgs2[im] = (Hcouplings->H2zzcoupl)[gHIGGS_AA_2][im];
3880  spinzerohiggs_anomcoupl_.gh2gsgs3[im] = (Hcouplings->H2zzcoupl)[gHIGGS_AA_3][im];
3881  spinzerohiggs_anomcoupl_.gh2gsgs4[im] = (Hcouplings->H2zzcoupl)[gHIGGS_AA_4][im];
3882  }
3883  //
3884  if (spinzerohiggs_anomcoupl_.distinguish_HWWcouplings==1){
3885  //
3901  //
3902  for (int im=0; im<2; im++){
3903  spinzerohiggs_anomcoupl_.gh2w1[im] = (Hcouplings->H2wwcoupl)[gHIGGS_VV_1][im];
3904  spinzerohiggs_anomcoupl_.gh2w2[im] = (Hcouplings->H2wwcoupl)[gHIGGS_VV_2][im];
3905  spinzerohiggs_anomcoupl_.gh2w3[im] = (Hcouplings->H2wwcoupl)[gHIGGS_VV_3][im];
3906  spinzerohiggs_anomcoupl_.gh2w4[im] = (Hcouplings->H2wwcoupl)[gHIGGS_VV_4][im];
3907  spinzerohiggs_anomcoupl_.gh2w1_prime[im] = (Hcouplings->H2wwcoupl)[gHIGGS_VV_1_PRIME][im];
3908  spinzerohiggs_anomcoupl_.gh2w1_prime2[im] = (Hcouplings->H2wwcoupl)[gHIGGS_VV_1_PRIME2][im];
3909  spinzerohiggs_anomcoupl_.gh2w1_prime3[im] = (Hcouplings->H2wwcoupl)[gHIGGS_VV_1_PRIME3][im];
3910  spinzerohiggs_anomcoupl_.gh2w1_prime4[im] = (Hcouplings->H2wwcoupl)[gHIGGS_VV_1_PRIME4][im];
3911  spinzerohiggs_anomcoupl_.gh2w1_prime5[im] = (Hcouplings->H2wwcoupl)[gHIGGS_VV_1_PRIME5][im];
3912  spinzerohiggs_anomcoupl_.gh2w1_prime6[im] = (Hcouplings->H2wwcoupl)[gHIGGS_VV_1_PRIME6][im];
3913  spinzerohiggs_anomcoupl_.gh2w1_prime7[im] = (Hcouplings->H2wwcoupl)[gHIGGS_VV_1_PRIME7][im];
3914  spinzerohiggs_anomcoupl_.gh2w2_prime[im] = (Hcouplings->H2wwcoupl)[gHIGGS_VV_2_PRIME][im];
3915  spinzerohiggs_anomcoupl_.gh2w2_prime2[im] = (Hcouplings->H2wwcoupl)[gHIGGS_VV_2_PRIME2][im];
3916  spinzerohiggs_anomcoupl_.gh2w2_prime3[im] = (Hcouplings->H2wwcoupl)[gHIGGS_VV_2_PRIME3][im];
3917  spinzerohiggs_anomcoupl_.gh2w2_prime4[im] = (Hcouplings->H2wwcoupl)[gHIGGS_VV_2_PRIME4][im];
3918  spinzerohiggs_anomcoupl_.gh2w2_prime5[im] = (Hcouplings->H2wwcoupl)[gHIGGS_VV_2_PRIME5][im];
3919  spinzerohiggs_anomcoupl_.gh2w2_prime6[im] = (Hcouplings->H2wwcoupl)[gHIGGS_VV_2_PRIME6][im];
3920  spinzerohiggs_anomcoupl_.gh2w2_prime7[im] = (Hcouplings->H2wwcoupl)[gHIGGS_VV_2_PRIME7][im];
3921  spinzerohiggs_anomcoupl_.gh2w3_prime[im] = (Hcouplings->H2wwcoupl)[gHIGGS_VV_3_PRIME][im];
3922  spinzerohiggs_anomcoupl_.gh2w3_prime2[im] = (Hcouplings->H2wwcoupl)[gHIGGS_VV_3_PRIME2][im];
3923  spinzerohiggs_anomcoupl_.gh2w3_prime3[im] = (Hcouplings->H2wwcoupl)[gHIGGS_VV_3_PRIME3][im];
3924  spinzerohiggs_anomcoupl_.gh2w3_prime4[im] = (Hcouplings->H2wwcoupl)[gHIGGS_VV_3_PRIME4][im];
3925  spinzerohiggs_anomcoupl_.gh2w3_prime5[im] = (Hcouplings->H2wwcoupl)[gHIGGS_VV_3_PRIME5][im];
3926  spinzerohiggs_anomcoupl_.gh2w3_prime6[im] = (Hcouplings->H2wwcoupl)[gHIGGS_VV_3_PRIME6][im];
3927  spinzerohiggs_anomcoupl_.gh2w3_prime7[im] = (Hcouplings->H2wwcoupl)[gHIGGS_VV_3_PRIME7][im];
3928  spinzerohiggs_anomcoupl_.gh2w4_prime[im] = (Hcouplings->H2wwcoupl)[gHIGGS_VV_4_PRIME][im];
3929  spinzerohiggs_anomcoupl_.gh2w4_prime2[im] = (Hcouplings->H2wwcoupl)[gHIGGS_VV_4_PRIME2][im];
3930  spinzerohiggs_anomcoupl_.gh2w4_prime3[im] = (Hcouplings->H2wwcoupl)[gHIGGS_VV_4_PRIME3][im];
3931  spinzerohiggs_anomcoupl_.gh2w4_prime4[im] = (Hcouplings->H2wwcoupl)[gHIGGS_VV_4_PRIME4][im];
3932  spinzerohiggs_anomcoupl_.gh2w4_prime5[im] = (Hcouplings->H2wwcoupl)[gHIGGS_VV_4_PRIME5][im];
3933  spinzerohiggs_anomcoupl_.gh2w4_prime6[im] = (Hcouplings->H2wwcoupl)[gHIGGS_VV_4_PRIME6][im];
3934  spinzerohiggs_anomcoupl_.gh2w4_prime7[im] = (Hcouplings->H2wwcoupl)[gHIGGS_VV_4_PRIME7][im];
3935  }
3936  }
3937  else{
3938  //
3954  //
3955  for (int im=0; im<2; im++){
3956  spinzerohiggs_anomcoupl_.gh2w1[im] = (Hcouplings->H2zzcoupl)[gHIGGS_VV_1][im];
3957  spinzerohiggs_anomcoupl_.gh2w2[im] = (Hcouplings->H2zzcoupl)[gHIGGS_VV_2][im];
3958  spinzerohiggs_anomcoupl_.gh2w3[im] = (Hcouplings->H2zzcoupl)[gHIGGS_VV_3][im];
3959  spinzerohiggs_anomcoupl_.gh2w4[im] = (Hcouplings->H2zzcoupl)[gHIGGS_VV_4][im];
3960  spinzerohiggs_anomcoupl_.gh2w1_prime[im] = (Hcouplings->H2zzcoupl)[gHIGGS_VV_1_PRIME][im];
3961  spinzerohiggs_anomcoupl_.gh2w1_prime2[im] = (Hcouplings->H2zzcoupl)[gHIGGS_VV_1_PRIME2][im];
3962  spinzerohiggs_anomcoupl_.gh2w1_prime3[im] = (Hcouplings->H2zzcoupl)[gHIGGS_VV_1_PRIME3][im];
3963  spinzerohiggs_anomcoupl_.gh2w1_prime4[im] = (Hcouplings->H2zzcoupl)[gHIGGS_VV_1_PRIME4][im];
3964  spinzerohiggs_anomcoupl_.gh2w1_prime5[im] = (Hcouplings->H2zzcoupl)[gHIGGS_VV_1_PRIME5][im];
3965  spinzerohiggs_anomcoupl_.gh2w1_prime6[im] = (Hcouplings->H2zzcoupl)[gHIGGS_VV_1_PRIME6][im];
3966  spinzerohiggs_anomcoupl_.gh2w1_prime7[im] = (Hcouplings->H2zzcoupl)[gHIGGS_VV_1_PRIME7][im];
3967  spinzerohiggs_anomcoupl_.gh2w2_prime[im] = (Hcouplings->H2zzcoupl)[gHIGGS_VV_2_PRIME][im];
3968  spinzerohiggs_anomcoupl_.gh2w2_prime2[im] = (Hcouplings->H2zzcoupl)[gHIGGS_VV_2_PRIME2][im];
3969  spinzerohiggs_anomcoupl_.gh2w2_prime3[im] = (Hcouplings->H2zzcoupl)[gHIGGS_VV_2_PRIME3][im];
3970  spinzerohiggs_anomcoupl_.gh2w2_prime4[im] = (Hcouplings->H2zzcoupl)[gHIGGS_VV_2_PRIME4][im];
3971  spinzerohiggs_anomcoupl_.gh2w2_prime5[im] = (Hcouplings->H2zzcoupl)[gHIGGS_VV_2_PRIME5][im];
3972  spinzerohiggs_anomcoupl_.gh2w2_prime6[im] = (Hcouplings->H2zzcoupl)[gHIGGS_VV_2_PRIME6][im];
3973  spinzerohiggs_anomcoupl_.gh2w2_prime7[im] = (Hcouplings->H2zzcoupl)[gHIGGS_VV_2_PRIME7][im];
3974  spinzerohiggs_anomcoupl_.gh2w3_prime[im] = (Hcouplings->H2zzcoupl)[gHIGGS_VV_3_PRIME][im];
3975  spinzerohiggs_anomcoupl_.gh2w3_prime2[im] = (Hcouplings->H2zzcoupl)[gHIGGS_VV_3_PRIME2][im];
3976  spinzerohiggs_anomcoupl_.gh2w3_prime3[im] = (Hcouplings->H2zzcoupl)[gHIGGS_VV_3_PRIME3][im];
3977  spinzerohiggs_anomcoupl_.gh2w3_prime4[im] = (Hcouplings->H2zzcoupl)[gHIGGS_VV_3_PRIME4][im];
3978  spinzerohiggs_anomcoupl_.gh2w3_prime5[im] = (Hcouplings->H2zzcoupl)[gHIGGS_VV_3_PRIME5][im];
3979  spinzerohiggs_anomcoupl_.gh2w3_prime6[im] = (Hcouplings->H2zzcoupl)[gHIGGS_VV_3_PRIME6][im];
3980  spinzerohiggs_anomcoupl_.gh2w3_prime7[im] = (Hcouplings->H2zzcoupl)[gHIGGS_VV_3_PRIME7][im];
3981  spinzerohiggs_anomcoupl_.gh2w4_prime[im] = (Hcouplings->H2zzcoupl)[gHIGGS_VV_4_PRIME][im];
3982  spinzerohiggs_anomcoupl_.gh2w4_prime2[im] = (Hcouplings->H2zzcoupl)[gHIGGS_VV_4_PRIME2][im];
3983  spinzerohiggs_anomcoupl_.gh2w4_prime3[im] = (Hcouplings->H2zzcoupl)[gHIGGS_VV_4_PRIME3][im];
3984  spinzerohiggs_anomcoupl_.gh2w4_prime4[im] = (Hcouplings->H2zzcoupl)[gHIGGS_VV_4_PRIME4][im];
3985  spinzerohiggs_anomcoupl_.gh2w4_prime5[im] = (Hcouplings->H2zzcoupl)[gHIGGS_VV_4_PRIME5][im];
3986  spinzerohiggs_anomcoupl_.gh2w4_prime6[im] = (Hcouplings->H2zzcoupl)[gHIGGS_VV_4_PRIME6][im];
3987  spinzerohiggs_anomcoupl_.gh2w4_prime7[im] = (Hcouplings->H2zzcoupl)[gHIGGS_VV_4_PRIME7][im];
3988  }
3989  }
3990  /***** END SECOND RESONANCE *****/
3991  }
3992 }
3994  if (!useBSM){
3995  for (int im=0; im<2; im++){
3996  if (im==0){
3997  spinzerohiggs_anomcoupl_.dV_A[im] = 1;
3998  spinzerohiggs_anomcoupl_.dP_A[im] = 1;
3999  spinzerohiggs_anomcoupl_.dM_A[im] = 1;
4000 
4001  spinzerohiggs_anomcoupl_.dV_Z[im] = 1;
4002  spinzerohiggs_anomcoupl_.dP_Z[im] = 1;
4003  spinzerohiggs_anomcoupl_.dM_Z[im] = 1;
4004 
4005  spinzerohiggs_anomcoupl_.dZZWpWm[im] = 1;
4006  spinzerohiggs_anomcoupl_.dZAWpWm[im] = 1;
4007  spinzerohiggs_anomcoupl_.dAAWpWm[im] = 1;
4008  }
4009  else{
4010  spinzerohiggs_anomcoupl_.dV_A[im] = 0;
4011  spinzerohiggs_anomcoupl_.dP_A[im] = 0;
4012  spinzerohiggs_anomcoupl_.dM_A[im] = 0;
4013 
4014  spinzerohiggs_anomcoupl_.dV_Z[im] = 0;
4015  spinzerohiggs_anomcoupl_.dP_Z[im] = 0;
4016  spinzerohiggs_anomcoupl_.dM_Z[im] = 0;
4017 
4018  spinzerohiggs_anomcoupl_.dZZWpWm[im] = 0;
4019  spinzerohiggs_anomcoupl_.dZAWpWm[im] = 0;
4020  spinzerohiggs_anomcoupl_.dAAWpWm[im] = 0;
4021  }
4022  spinzerohiggs_anomcoupl_.dFour_A[im] = 0;
4023  spinzerohiggs_anomcoupl_.dFour_Z[im] = 0;
4024  }
4025  }
4026  else{
4027  for (int im=0; im<2; im++){
4028  spinzerohiggs_anomcoupl_.dV_A[im] = (couplings->aTQGCcoupl)[gATQGC_dVA][im];
4029  spinzerohiggs_anomcoupl_.dP_A[im] = (couplings->aTQGCcoupl)[gATQGC_dPA][im];
4030  spinzerohiggs_anomcoupl_.dM_A[im] = (couplings->aTQGCcoupl)[gATQGC_dMA][im];
4031  spinzerohiggs_anomcoupl_.dFour_A[im] = (couplings->aTQGCcoupl)[gATQGC_dFourA][im];
4032 
4033  spinzerohiggs_anomcoupl_.dV_Z[im] = (couplings->aTQGCcoupl)[gATQGC_dVZ][im];
4034  spinzerohiggs_anomcoupl_.dP_Z[im] = (couplings->aTQGCcoupl)[gATQGC_dPZ][im];
4035  spinzerohiggs_anomcoupl_.dM_Z[im] = (couplings->aTQGCcoupl)[gATQGC_dMZ][im];
4036  spinzerohiggs_anomcoupl_.dFour_Z[im] = (couplings->aTQGCcoupl)[gATQGC_dFourZ][im];
4037 
4038  spinzerohiggs_anomcoupl_.dAAWpWm[im] = (couplings->aTQGCcoupl)[gATQGC_dAAWpWm][im];
4039  spinzerohiggs_anomcoupl_.dZAWpWm[im] = (couplings->aTQGCcoupl)[gATQGC_dZAWpWm][im];
4040  spinzerohiggs_anomcoupl_.dZZWpWm[im] = (couplings->aTQGCcoupl)[gATQGC_dZZWpWm][im];
4041  }
4042  }
4043 }
4044 void TUtil::SetMCFMAZffCouplings(bool useBSM, AZffCouplings const* Zcouplings){
4045  if (useBSM){
4046  // BSM (all imaginary parts = 0 => unset, only setting the real parts)
4047  anomzffcouplings_.AllowAnomalousZffCouplings = 1;
4048  anomzffcouplings_.reZ = (Zcouplings->AZffcoupl)[gAZff_ZllRH][0];
4049  anomzffcouplings_.leZ = (Zcouplings->AZffcoupl)[gAZff_ZllLH][0];
4050  anomzffcouplings_.rquZ = (Zcouplings->AZffcoupl)[gAZff_ZuuRH][0];
4051  anomzffcouplings_.lquZ = (Zcouplings->AZffcoupl)[gAZff_ZuuLH][0];
4052  anomzffcouplings_.rqdZ = (Zcouplings->AZffcoupl)[gAZff_ZddRH][0];
4053  anomzffcouplings_.lqdZ = (Zcouplings->AZffcoupl)[gAZff_ZddLH][0];
4054  anomzffcouplings_.rnZ = (Zcouplings->AZffcoupl)[gAZff_ZnunuRH][0];
4055  anomzffcouplings_.lnZ = (Zcouplings->AZffcoupl)[gAZff_ZnunuLH][0];
4056  anomzffcouplings_.clanou = (Zcouplings->AZffcoupl)[gAZff_uZLH][0];
4057  anomzffcouplings_.cranou = (Zcouplings->AZffcoupl)[gAZff_uZRH][0];
4058  anomzffcouplings_.clanod = (Zcouplings->AZffcoupl)[gAZff_dZLH][0];
4059  anomzffcouplings_.cranod = (Zcouplings->AZffcoupl)[gAZff_dZRH][0];
4060  }
4061  else{
4062  // SM
4063  anomzffcouplings_.AllowAnomalousZffCouplings = 0;
4064  anomzffcouplings_.reZ = 0;
4065  anomzffcouplings_.leZ = 0;
4066  anomzffcouplings_.rquZ = 0;
4067  anomzffcouplings_.lquZ = 0;
4068  anomzffcouplings_.rqdZ = 0;
4069  anomzffcouplings_.lqdZ = 0;
4070  anomzffcouplings_.rnZ = 0;
4071  anomzffcouplings_.lnZ = 0;
4072  anomzffcouplings_.clanou = 0;
4073  anomzffcouplings_.cranou = 0;
4074  anomzffcouplings_.clanod = 0;
4075  anomzffcouplings_.cranod = 0;
4076  }
4077 }
4078 void TUtil::SetJHUGenSpinZeroVVCouplings(double Hvvcoupl[SIZE_HVV][2], double Hvvpcoupl[SIZE_HVV][2], double Hvpvpcoupl[SIZE_HVV][2], int Hvvcoupl_cqsq[SIZE_HVV_CQSQ], double HvvLambda_qsq[SIZE_HVV_LAMBDAQSQ][SIZE_HVV_CQSQ], bool useWWcoupl){
4079  const double GeV = 1./100.;
4080  int iWWcoupl = (useWWcoupl ? 1 : 0);
4081  for (int c=0; c<SIZE_HVV_LAMBDAQSQ; c++){ for (int k=0; k<SIZE_HVV_CQSQ; k++) HvvLambda_qsq[c][k] *= GeV; } // GeV units in JHUGen
4082  __modjhugenmela_MOD_setspinzerovvcouplings(Hvvcoupl, Hvvpcoupl, Hvpvpcoupl, Hvvcoupl_cqsq, HvvLambda_qsq, &iWWcoupl);
4083 }
4086 void TUtil::SetJHUGenSpinOneCouplings(double Zqqcoupl[SIZE_ZQQ][2], double Zvvcoupl[SIZE_ZVV][2]){ __modjhugenmela_MOD_setspinonecouplings(Zqqcoupl, Zvvcoupl); }
4087 void TUtil::SetJHUGenSpinTwoCouplings(double Gacoupl[SIZE_GGG][2], double Gvvcoupl[SIZE_GVV][2], double Gvvpcoupl[SIZE_GVV][2], double Gvpvpcoupl[SIZE_GVV][2], double qLeftRightcoupl[SIZE_GQQ][2]){
4088  __modjhugenmela_MOD_setspintwocouplings(Gacoupl, Gvvcoupl, Gvvpcoupl, Gvpvpcoupl, qLeftRightcoupl);
4089 }
4090 void TUtil::SetJHUGenVprimeContactCouplings(double Zpffcoupl[SIZE_Vpff][2], double Wpffcoupl[SIZE_Vpff][2]){
4091  __modjhugenmela_MOD_setvprimecontactcouplings(Zpffcoupl, Wpffcoupl);
4092 }
4093 void TUtil::SetJHUGenAZffCouplings(bool needAZff, double AZffcoupl[SIZE_AZff][2]){
4095  if (needAZff) __modjhugenmela_MOD_setazffcouplings(AZffcoupl);
4096 }
4097 
4098 //Make sure
4099 // 1. tot Energy Sum < 2EBEAM
4100 // 2. PartonEnergy Fraction minimum<x0,x1<1
4101 // 3. number of final state particle is defined
4102 //
4104  const TVar::Process& process, const TVar::Production& production, const TVar::MatrixElement& matrixElement, const TVar::LeptonInterference& leptonInterf,
4105  event_scales_type* event_scales, MelaIO* RcdME,
4106  const double& EBEAM,
4107  TVar::VerbosityLevel verbosity
4108  ){
4109  if (verbosity>=TVar::DEBUG) MELAout << "Begin SumMatrixElementPDF" << endl;
4110  double msqjk=0;
4111 
4112  int nRequested_AssociatedJets=0;
4113  int nRequested_AssociatedLeptons=0;
4114  int AssociationVCompatibility=0;
4115  int partIncCode=TVar::kNoAssociated; // Do not use associated particles in the pT=0 frame boost
4116  if (production == TVar::JQCD){ // Use asociated jets in the pT=0 frame boost
4117  partIncCode=TVar::kUseAssociated_Jets;
4118  nRequested_AssociatedJets = 1;
4119  if (verbosity>=TVar::DEBUG) MELAout << "TUtil::SumMatrixElementPDF: Requesting " << nRequested_AssociatedJets << " jets" << endl;
4120  }
4121  else if (
4130  ){ // Use associated jets in the pT=0 frame boost
4131  partIncCode=TVar::kUseAssociated_Jets;
4132  nRequested_AssociatedJets = 2;
4133  if (verbosity>=TVar::DEBUG) MELAout << "TUtil::SumMatrixElementPDF: Requesting " << nRequested_AssociatedJets << " jets" << endl;
4134  }
4135  else if (
4139  ){ // Only use associated leptons(+)neutrinos
4140  partIncCode=TVar::kUseAssociated_Leptons;
4141  nRequested_AssociatedLeptons = 2;
4142  }
4143  if (
4147  ) AssociationVCompatibility=24;
4148  else if (
4152  ) AssociationVCompatibility=23;
4153  simple_event_record mela_event;
4154  mela_event.AssociationCode=partIncCode;
4155  mela_event.AssociationVCompatibility=AssociationVCompatibility;
4156  mela_event.nRequested_AssociatedJets=nRequested_AssociatedJets;
4157  mela_event.nRequested_AssociatedLeptons=nRequested_AssociatedLeptons;
4159  RcdME->melaCand,
4160  mela_event,
4161  verbosity
4162  );
4163 
4164  double xx[2]={ 0 };
4165  vector<int> partOrder;
4166  vector<int> apartOrder;
4167  bool doProceed =
4168  CheckPartonMomFraction(mela_event.pMothers.at(0).second, mela_event.pMothers.at(1).second, xx, EBEAM, verbosity) // Check momentum transfers
4169  &&
4170  TUtil::MCFM_chooser(process, production, leptonInterf, verbosity, mela_event); // Set some of the specifics of the process through this function
4171  if (doProceed) doProceed = TUtil::MCFM_SetupParticleCouplings(process, production, verbosity, mela_event, &partOrder, &apartOrder); // Set the specifics of the daughter or associated particle couplings through this function
4172  if (doProceed){
4173  if (partOrder.size()!=mela_event.pDaughters.size()){
4174  if (verbosity >= TVar::ERROR){
4175  MELAerr << "TUtil::SumMatrixElementPDF: Ordering size " << partOrder.size() << " and number of daughter particles " << mela_event.pDaughters.size() << " are not the same!" << endl;
4176  TUtil::PrintCandidateSummary(&mela_event);
4177  }
4178  doProceed=false;
4179  }
4180  if (apartOrder.size()!=mela_event.pAssociated.size()){
4181  if (verbosity >= TVar::ERROR){
4182  MELAerr << "TUtil::SumMatrixElementPDF: Ordering size " << apartOrder.size() << " and number of associated particles " << mela_event.pAssociated.size() << " are not the same!" << endl;
4183  TUtil::PrintCandidateSummary(&mela_event);
4184  }
4185  doProceed=false;
4186  }
4187  }
4188  if (doProceed){
4189  int NPart=npart_.npart+2; // +2 for mothers
4190  double p4[4][mxpart]={ { 0 } };
4191  double p4_tmp[4][mxpart]={ { 0 } };
4192  int id[mxpart]; for (int ipar=0; ipar<mxpart; ipar++) id[ipar]=-9000;
4193  double msq[nmsq][nmsq]={ { 0 } };
4194  double msq_tmp[nmsq][nmsq]={ { 0 } };
4195  int channeltoggle=0;
4196 
4197  TLorentzVector MomStore[mxpart];
4198  for (int i = 0; i < mxpart; i++) MomStore[i].SetXYZT(0, 0, 0, 0);
4199 
4200  //Convert TLorentzVector into 4xNPart Matrix
4201  //reverse sign of incident partons
4202  for (int ipar=0; ipar<2; ipar++){
4203  if (mela_event.pMothers.at(ipar).second.T()>0.){
4204  p4[0][ipar] = -mela_event.pMothers.at(ipar).second.X();
4205  p4[1][ipar] = -mela_event.pMothers.at(ipar).second.Y();
4206  p4[2][ipar] = -mela_event.pMothers.at(ipar).second.Z();
4207  p4[3][ipar] = -mela_event.pMothers.at(ipar).second.T();
4208  MomStore[ipar] = mela_event.pMothers.at(ipar).second;
4209  id[ipar] = mela_event.pMothers.at(ipar).first;
4210  }
4211  else{
4212  p4[0][ipar] = mela_event.pMothers.at(ipar).second.X();
4213  p4[1][ipar] = mela_event.pMothers.at(ipar).second.Y();
4214  p4[2][ipar] = mela_event.pMothers.at(ipar).second.Z();
4215  p4[3][ipar] = mela_event.pMothers.at(ipar).second.T();
4216  MomStore[ipar] = -mela_event.pMothers.at(ipar).second;
4217  id[ipar] = mela_event.pMothers.at(ipar).first;
4218  }
4219  }
4220 
4221  // Determine if the decay mode involves WW or ZZ, to be used for ZZ or WW-specific signal MEs
4222  //bool isZG = (PDGHelpers::isAZBoson(mela_event.intermediateVid.at(0)) && PDGHelpers::isAPhoton(mela_event.intermediateVid.at(1)));
4223  bool isWW = (PDGHelpers::isAWBoson(mela_event.intermediateVid.at(0)) && PDGHelpers::isAWBoson(mela_event.intermediateVid.at(1)));
4224  bool isZZ = (PDGHelpers::isAZBoson(mela_event.intermediateVid.at(0)) && PDGHelpers::isAZBoson(mela_event.intermediateVid.at(1)));
4225  bool isGG = (PDGHelpers::isAPhoton(mela_event.intermediateVid.at(0)) && PDGHelpers::isAPhoton(mela_event.intermediateVid.at(1)));
4226  //initialize decayed particles
4227  for (int ix=0; ix<(int)partOrder.size(); ix++){
4228  int ipar = min((int)mxpart, min(NPart, 2))+ix;
4229  if (ipar>=mxpart) break;
4230  TLorentzVector* momTmp = &(mela_event.pDaughters.at(partOrder.at(ix)).second);
4231  p4[0][ipar] = momTmp->X();
4232  p4[1][ipar] = momTmp->Y();
4233  p4[2][ipar] = momTmp->Z();
4234  p4[3][ipar] = momTmp->T();
4235  MomStore[ipar]=*momTmp;
4236  id[ipar] = mela_event.pDaughters.at(partOrder.at(ix)).first;
4237  }
4238  for (int ix=0; ix<(int)apartOrder.size(); ix++){
4239  int ipar = min((int)mxpart, min(NPart, (int)(partOrder.size()+2)))+ix;
4240  if (ipar>=mxpart) break;
4241  TLorentzVector* momTmp = &(mela_event.pAssociated.at(apartOrder.at(ix)).second);
4242  p4[0][ipar] = momTmp->X();
4243  p4[1][ipar] = momTmp->Y();
4244  p4[2][ipar] = momTmp->Z();
4245  p4[3][ipar] = momTmp->T();
4246  MomStore[ipar]=*momTmp;
4247  id[ipar] = mela_event.pAssociated.at(apartOrder.at(ix)).first;
4248  }
4249 
4250  if (verbosity >= TVar::DEBUG){ for (int i=0; i<NPart; i++) MELAout << "p["<<i<<"] (Px, Py, Pz, E):\t" << p4[0][i] << '\t' << p4[1][i] << '\t' << p4[2][i] << '\t' << p4[3][i] << endl; }
4251 
4252  double defaultRenScale = scale_.scale;
4253  double defaultFacScale = facscale_.facscale;
4254  int defaultNloop = nlooprun_.nlooprun;
4255  int defaultNflav = nflav_.nflav;
4256  string defaultPdflabel = pdlabel_.pdlabel;
4257  double renQ = InterpretScaleScheme(production, matrixElement, event_scales->renomalizationScheme, MomStore);
4258  double facQ = InterpretScaleScheme(production, matrixElement, event_scales->factorizationScheme, MomStore);
4259  SetAlphaS(renQ, facQ, event_scales->ren_scale_factor, event_scales->fac_scale_factor, 1, 5, "cteq6_l");
4260  double alphasVal, alphasmzVal;
4261  GetAlphaS(&alphasVal, &alphasmzVal);
4262  RcdME->setRenormalizationScale(renQ);
4263  RcdME->setFactorizationScale(facQ);
4264  RcdME->setAlphaS(alphasVal);
4265  RcdME->setAlphaSatMZ(alphasmzVal);
4266  RcdME->setHiggsMassWidth(masses_mcfm_.hmass, masses_mcfm_.hwidth, 0);
4268  if (verbosity>=TVar::DEBUG){
4269  MELAout
4270  << "TUtil::SumMatrixElementPDF: Set AlphaS:\n"
4271  << "\tBefore set, alphas scale: " << defaultRenScale << ", PDF scale: " << defaultFacScale << '\n'
4272  << "\trenQ: " << renQ << " ( x " << event_scales->ren_scale_factor << "), facQ: " << facQ << " ( x " << event_scales->fac_scale_factor << ")\n"
4273  << "\tAfter set, alphas scale: " << scale_.scale << ", PDF scale: " << facscale_.facscale << ", alphas(Qren): " << alphasVal << ", alphas(MZ): " << alphasmzVal << endl;
4274  }
4275 
4276  int nInstances=0;
4277  if (
4279  ||
4281  ){
4283  if (process == TVar::bkgGammaGamma){ qqb_gamgam_(p4[0], msq[0]); msq[5][5]=0; } // This function actually computes qqb/gg -> GG, so need to set msq[g][g]=0
4284  else if (process == TVar::bkgZGamma) qqb_zgam_(p4[0], msq[0]);
4285  else if (process == TVar::bkgZZ) qqb_zz_(p4[0], msq[0]);
4286  else if (process == TVar::bkgWW) qqb_ww_(p4[0], msq[0]);
4287  }
4288  else{
4289  if (production == TVar::ZZQQB_STU) channeltoggle=0;
4290  else if (production == TVar::ZZQQB_S) channeltoggle=1;
4291  else/* if (production == TVar::ZZQQB_TU)*/ channeltoggle=2;
4292  qqb_zz_stu_(p4[0], msq[0], &channeltoggle);
4293  }
4294  nInstances=WipeMEArray(process, production, id, msq, verbosity);
4295 
4296  // Sum over valid MEs without PDF weights
4297  // By far the dominant contribution is uub initial state.
4298  for (int iquark=-5; iquark<=5; iquark++){
4299  for (int jquark=-5; jquark<=5; jquark++){
4300  if (
4301  (PDGHelpers::isAnUnknownJet(id[0]) || (PDGHelpers::isAGluon(id[0]) && iquark==0) || iquark==id[0])
4302  &&
4303  (PDGHelpers::isAnUnknownJet(id[1]) || (PDGHelpers::isAGluon(id[1]) && jquark==0) || jquark==id[1])
4304  ){
4305  if (
4307  &&
4309  ) msqjk = msq[3][7]+msq[7][3]; // Use only uub initial state
4310  else if (
4312  ) msqjk = msq[jquark+5][-jquark+5];
4313  else if (
4315  ) msqjk = msq[-iquark+5][iquark+5];
4316  else msqjk += msq[jquark+5][iquark+5];
4317  }
4318  }
4319  }
4320  SumMEPDF(MomStore[0], MomStore[1], msq, RcdME, EBEAM, verbosity);
4321  }
4322  else if (production == TVar::ZZGG){
4323  if (isZZ){
4324  if (process == TVar::HSMHiggs) gg_hzz_tb_(p4[0], msq[0]); // |ggHZZ|**2
4325  else if (process == TVar::bkgZZ_SMHiggs) gg_zz_all_(p4[0], msq[0]); // |ggZZ + ggHZZ|**2
4326  else if (process == TVar::bkgZZ) gg_zz_(p4[0], &(msq[5][5])); // |ggZZ|**2
4327  // The following WWZZ processes need no swapping because ZZ->4f (same type) is ordered such that 3/5 (C++: 2/4) swap gives W+W-.
4328  else if (process == TVar::HSMHiggs_WWZZ) gg_hvv_tb_(p4[0], msq[0]); // |ggHZZ+WW|**2
4329  else if (process == TVar::bkgWWZZ_SMHiggs) gg_vv_all_(p4[0], msq[0]); // |ggZZ + ggHZZ (+WW)|**2
4330  else if (process == TVar::bkgWWZZ) gg_vv_(p4[0], &(msq[5][5])); // |ggZZ+WW|**2
4331 
4332  if (verbosity>=TVar::DEBUG){
4333  MELAout << "\tTUtil::SumMatrixElementPDF: ZZGG && ZZ/WW/ZZ+WW MEs using ZZ (runstring: " << runstring_.runstring << ")" << endl;
4334  for (int i=0; i<NPart; i++) MELAout << "\tp["<<i<<"] (Px, Py, Pz, E):\t" << p4[0][i] << '\t' << p4[1][i] << '\t' << p4[2][i] << '\t' << p4[3][i] << endl;
4335  }
4336  }
4337  else if (isWW){
4338  if (process == TVar::HSMHiggs || process == TVar::HSMHiggs_WWZZ) gg_hvv_tb_(p4[0], msq[0]); // |ggHZZ+WW|**2
4339  else if (process == TVar::bkgWW_SMHiggs || process == TVar::bkgWWZZ_SMHiggs) gg_vv_all_(p4[0], msq[0]); // |ggZZ + ggHZZ (+WW)|**2
4340  else if (process == TVar::bkgWW || process == TVar::bkgWWZZ) gg_vv_(p4[0], &(msq[5][5])); // |ggZZ+WW|**2
4341  if (verbosity>=TVar::DEBUG){
4342  MELAout << "\tTUtil::SumMatrixElementPDF: ZZGG && ZZ/WW/ZZ+WW MEs using WW (runstring: " << runstring_.runstring << ")" << endl;
4343  for (int i=0; i<NPart; i++) MELAout << "\tp["<<i<<"] (Px, Py, Pz, E):\t" << p4[0][i] << '\t' << p4[1][i] << '\t' << p4[2][i] << '\t' << p4[3][i] << endl;
4344  }
4345  }
4346  else if (isGG){
4347  if (process == TVar::bkgGammaGamma){
4348  qqb_gamgam_(p4[0], msq[0]);
4349  for (int iquark=-5; iquark<=5; iquark++){
4350  for (int jquark=-5; jquark<=5; jquark++){
4351  if (iquark==0 && jquark==0) continue;
4352  msq[jquark+5][iquark+5] = 0;
4353  }
4354  }
4355  }
4356  }
4357 
4358  nInstances=WipeMEArray(process, production, id, msq, verbosity);
4359  if (
4361  &&
4363  ){
4364  msqjk = msq[5][5];
4365  }
4366  SumMEPDF(MomStore[0], MomStore[1], msq, RcdME, EBEAM, verbosity);
4367  }
4368  else if (
4379  ){
4380  // Z+2 jets
4381  if (process == TVar::bkgZJets) qqb_z2jet_(p4[0], msq[0]);
4382  // VBF or QCD MCFM SBI, S or B
4383  else if (isZZ && (process == TVar::bkgZZ_SMHiggs || process == TVar::HSMHiggs || process == TVar::bkgZZ)){
4384  if (
4394  ){
4395  /*
4396  if (process == TVar::bkgZZ){//
4397  qq_zzqq_bkg_(p4[0], msq[0]);
4398  if (PDGHelpers::isAnUnknownJet(id[partOrder.size()+2]) && PDGHelpers::isAnUnknownJet(id[partOrder.size()+3])){
4399  for (unsigned int ix=0; ix<4; ix++){
4400  for (int ip=0; ip<mxpart; ip++) p4_tmp[ix][ip]=p4[ix][ip];
4401  swap(p4_tmp[ix][partOrder.size()+2], p4_tmp[ix][partOrder.size()+3]);
4402  }
4403  qq_zzqq_bkg_(p4_tmp[0], msq_tmp[0]);
4404  for (int iquark=-5; iquark<=5; iquark++){ for (int jquark=-5; jquark<=5; jquark++){ msq[jquark+5][iquark+5] = (msq[jquark+5][iquark+5] + msq_tmp[jquark+5][iquark+5]); if (iquark==jquark) msq[jquark+5][iquark+5]*=0.5; } }
4405  }
4406  }
4407  else{//
4408  */
4409  qq_zzqq_(p4[0], msq[0]);
4410  if (PDGHelpers::isAnUnknownJet(id[partOrder.size()+2]) && PDGHelpers::isAnUnknownJet(id[partOrder.size()+3])){
4411  for (unsigned int ix=0; ix<4; ix++){
4412  for (int ip=0; ip<mxpart; ip++) p4_tmp[ix][ip]=p4[ix][ip];
4413  swap(p4_tmp[ix][partOrder.size()+2], p4_tmp[ix][partOrder.size()+3]);
4414  }
4415  qq_zzqq_(p4_tmp[0], msq_tmp[0]);
4416  for (int iquark=-5; iquark<=5; iquark++){ for (int jquark=-5; jquark<=5; jquark++){ msq[jquark+5][iquark+5] = (msq[jquark+5][iquark+5] + msq_tmp[jquark+5][iquark+5]); if (iquark==jquark) msq[jquark+5][iquark+5]*=0.5; } }
4417  }
4418  else if (PDGHelpers::isAnUnknownJet(id[partOrder.size()+2]) || PDGHelpers::isAnUnknownJet(id[partOrder.size()+3])){
4419  for (unsigned int ix=0; ix<4; ix++){
4420  for (int ip=0; ip<mxpart; ip++) p4_tmp[ix][ip]=p4[ix][ip];
4421  swap(p4_tmp[ix][partOrder.size()+2], p4_tmp[ix][partOrder.size()+3]);
4422  }
4423  TString strlabel[2] ={ (plabel_.plabel)[7], (plabel_.plabel)[6] }; for (unsigned int il=0; il<2; il++) strlabel[il].Resize(2);
4424  for (int ip=0; ip<mxpart; ip++){
4425  if (ip!=6 && ip!=7) sprintf((plabel_.plabel)[ip], (plabel_.plabel)[ip]);
4426  else sprintf((plabel_.plabel)[ip], strlabel[ip-6].Data());
4427  }
4428  qq_zzqq_(p4_tmp[0], msq_tmp[0]);
4429  if (verbosity>=TVar::DEBUG){
4430  MELAout << "TUtil::SumMatrixElementPDF: Adding missing contributions:\n";
4431  MELAout << "\tplabels:\n";
4432  for (int ip=0; ip<mxpart; ip++) MELAout << "\t[" << ip << "]=" << (plabel_.plabel)[ip] << endl;
4433  MELAout << "\tMEsq initial:" << endl;
4434  for (int iquark=-5; iquark<=5; iquark++){
4435  for (int jquark=-5; jquark<=5; jquark++) MELAout << msq[jquark+5][iquark+5] << '\t';
4436  MELAout << endl;
4437  }
4438  MELAout << "\tMEsq added:" << endl;
4439  for (int iquark=-5; iquark<=5; iquark++){
4440  for (int jquark=-5; jquark<=5; jquark++) MELAout << msq_tmp[jquark+5][iquark+5] << '\t';
4441  MELAout << endl;
4442  }
4443  }
4444  for (int iquark=-5; iquark<=5; iquark++){
4445  for (int jquark=-5; jquark<=5; jquark++){
4446  if (msq[jquark+5][iquark+5]==0.) msq[jquark+5][iquark+5] = msq_tmp[jquark+5][iquark+5];
4447  }
4448  }
4449  }
4450  //}//
4451  }
4452  else if (
4454  ){
4455  qq_zzqqstrong_(p4[0], msq[0]);
4456  if (PDGHelpers::isAnUnknownJet(id[partOrder.size()+2]) && PDGHelpers::isAnUnknownJet(id[partOrder.size()+3])){
4457  for (unsigned int ix=0; ix<4; ix++){
4458  for (int ip=0; ip<mxpart; ip++) p4_tmp[ix][ip]=p4[ix][ip];
4459  swap(p4_tmp[ix][partOrder.size()+2], p4_tmp[ix][partOrder.size()+3]);
4460  }
4461  qq_zzqqstrong_(p4_tmp[0], msq_tmp[0]);
4462  for (int iquark=-5; iquark<=5; iquark++){ for (int jquark=-5; jquark<=5; jquark++){ msq[jquark+5][iquark+5] = (msq[jquark+5][iquark+5] + msq_tmp[jquark+5][iquark+5]); if (iquark==jquark && iquark!=0) msq[jquark+5][iquark+5]*=0.5; } }
4463  // Subtract qqb/qbq->gg that was counted twice.
4464  TString gglabel = TUtil::GetMCFMParticleLabel(21, false, true);
4465  for (int ip=0; ip<mxpart; ip++){
4466  if (ip!=6 && ip!=7) sprintf((plabel_.plabel)[ip], (plabel_.plabel)[ip]);
4467  else sprintf((plabel_.plabel)[ip], gglabel.Data());
4468  }
4469  qq_zzqqstrong_(p4_tmp[0], msq_tmp[0]);
4470  for (int iquark=-5; iquark<=5; iquark++){ int jquark=-iquark; msq[jquark+5][iquark+5] = (msq[jquark+5][iquark+5] - msq_tmp[jquark+5][iquark+5]); }
4471  if (verbosity>=TVar::DEBUG){
4472  MELAout << "TUtil::SumMatrixElementPDF: Subtracting qqb/qbq->gg double-counted contribution:\n";
4473  MELAout << "\tplabels:\n";
4474  for (int ip=0; ip<mxpart; ip++) MELAout << "\t[" << ip << "]=" << (plabel_.plabel)[ip] << endl;
4475  MELAout << "\tMEsq:" << endl;
4476  for (int iquark=-5; iquark<=5; iquark++){
4477  for (int jquark=-5; jquark<=5; jquark++) MELAout << msq_tmp[jquark+5][iquark+5] << '\t';
4478  MELAout << endl;
4479  }
4480  }
4481  }
4482  else if ((PDGHelpers::isAnUnknownJet(id[partOrder.size()+2]) || PDGHelpers::isAnUnknownJet(id[partOrder.size()+3])) && !(PDGHelpers::isAGluon(id[partOrder.size()+2]) || PDGHelpers::isAGluon(id[partOrder.size()+3]))){
4483  for (unsigned int ix=0; ix<4; ix++){
4484  for (int ip=0; ip<mxpart; ip++) p4_tmp[ix][ip]=p4[ix][ip];
4485  swap(p4_tmp[ix][partOrder.size()+2], p4_tmp[ix][partOrder.size()+3]);
4486  }
4487  TString strlabel[2] ={ (plabel_.plabel)[7], (plabel_.plabel)[6] }; for (unsigned int il=0; il<2; il++) strlabel[il].Resize(2);
4488  for (int ip=0; ip<mxpart; ip++){
4489  if (ip!=6 && ip!=7) sprintf((plabel_.plabel)[ip], (plabel_.plabel)[ip]);
4490  else sprintf((plabel_.plabel)[ip], strlabel[ip-6].Data());
4491  }
4492  qq_zzqqstrong_(p4_tmp[0], msq_tmp[0]);
4493  if (verbosity>=TVar::DEBUG){
4494  MELAout << "TUtil::SumMatrixElementPDF: Adding missing contributions:\n";
4495  MELAout << "\tplabels:\n";
4496  for (int ip=0; ip<mxpart; ip++) MELAout << "\t[" << ip << "]=" << (plabel_.plabel)[ip] << endl;
4497  MELAout << "\tMEsq initial:" << endl;
4498  for (int iquark=-5; iquark<=5; iquark++){
4499  for (int jquark=-5; jquark<=5; jquark++) MELAout << msq[jquark+5][iquark+5] << '\t';
4500  MELAout << endl;
4501  }
4502  MELAout << "\tMEsq added:" << endl;
4503  for (int iquark=-5; iquark<=5; iquark++){
4504  for (int jquark=-5; jquark<=5; jquark++) MELAout << msq_tmp[jquark+5][iquark+5] << '\t';
4505  MELAout << endl;
4506  }
4507  }
4508  for (int iquark=-5; iquark<=5; iquark++){
4509  for (int jquark=-5; jquark<=5; jquark++){
4510  if (msq[jquark+5][iquark+5]==0.) msq[jquark+5][iquark+5] = msq_tmp[jquark+5][iquark+5];
4511  }
4512  }
4513  }
4514  }
4515  }
4516  else if (isWW && (process == TVar::bkgWW_SMHiggs || process == TVar::HSMHiggs || process == TVar::bkgWW)){
4517  if (
4527  ){
4528  qq_wwqq_(p4[0], msq[0]);
4529  if (PDGHelpers::isAnUnknownJet(id[partOrder.size()+2]) && PDGHelpers::isAnUnknownJet(id[partOrder.size()+3])){
4530  for (unsigned int ix=0; ix<4; ix++){
4531  for (int ip=0; ip<mxpart; ip++) p4_tmp[ix][ip]=p4[ix][ip];
4532  swap(p4_tmp[ix][partOrder.size()+2], p4_tmp[ix][partOrder.size()+3]);
4533  }
4534  qq_wwqq_(p4_tmp[0], msq_tmp[0]);
4535  for (int iquark=-5; iquark<=5; iquark++){ for (int jquark=-5; jquark<=5; jquark++){ msq[jquark+5][iquark+5] = (msq[jquark+5][iquark+5] + msq_tmp[jquark+5][iquark+5]); if (iquark==jquark) msq[jquark+5][iquark+5]*=0.5; } }
4536  }
4537  else if (PDGHelpers::isAnUnknownJet(id[partOrder.size()+2]) || PDGHelpers::isAnUnknownJet(id[partOrder.size()+3])){
4538  for (unsigned int ix=0; ix<4; ix++){
4539  for (int ip=0; ip<mxpart; ip++) p4_tmp[ix][ip]=p4[ix][ip];
4540  swap(p4_tmp[ix][partOrder.size()+2], p4_tmp[ix][partOrder.size()+3]);
4541  }
4542  TString strlabel[2] ={ (plabel_.plabel)[7], (plabel_.plabel)[6] }; for (unsigned int il=0; il<2; il++) strlabel[il].Resize(2);
4543  for (int ip=0; ip<mxpart; ip++){
4544  if (ip!=6 && ip!=7) sprintf((plabel_.plabel)[ip], (plabel_.plabel)[ip]);
4545  else sprintf((plabel_.plabel)[ip], strlabel[ip-6].Data());
4546  }
4547  qq_wwqq_(p4_tmp[0], msq_tmp[0]);
4548  if (verbosity>=TVar::DEBUG){
4549  MELAout << "TUtil::SumMatrixElementPDF: Adding missing contributions:\n";
4550  MELAout << "\tplabels:\n";
4551  for (int ip=0; ip<mxpart; ip++) MELAout << "\t[" << ip << "]=" << (plabel_.plabel)[ip] << endl;
4552  MELAout << "\tMEsq initial:" << endl;
4553  for (int iquark=-5; iquark<=5; iquark++){
4554  for (int jquark=-5; jquark<=5; jquark++) MELAout << msq[jquark+5][iquark+5] << '\t';
4555  MELAout << endl;
4556  }
4557  MELAout << "\tMEsq added:" << endl;
4558  for (int iquark=-5; iquark<=5; iquark++){
4559  for (int jquark=-5; jquark<=5; jquark++) MELAout << msq_tmp[jquark+5][iquark+5] << '\t';
4560  MELAout << endl;
4561  }
4562  }
4563  for (int iquark=-5; iquark<=5; iquark++){
4564  for (int jquark=-5; jquark<=5; jquark++){
4565  if (msq[jquark+5][iquark+5]==0.) msq[jquark+5][iquark+5] = msq_tmp[jquark+5][iquark+5];
4566  }
4567  }
4568  }
4569  }
4570  else if (
4572  ){
4573  qq_wwqqstrong_(p4[0], msq[0]);
4574  if (PDGHelpers::isAnUnknownJet(id[partOrder.size()+2]) && PDGHelpers::isAnUnknownJet(id[partOrder.size()+3])){
4575  for (unsigned int ix=0; ix<4; ix++){
4576  for (int ip=0; ip<mxpart; ip++) p4_tmp[ix][ip]=p4[ix][ip];
4577  swap(p4_tmp[ix][partOrder.size()+2], p4_tmp[ix][partOrder.size()+3]);
4578  }
4579  qq_wwqqstrong_(p4_tmp[0], msq_tmp[0]);
4580  for (int iquark=-5; iquark<=5; iquark++){ for (int jquark=-5; jquark<=5; jquark++){ msq[jquark+5][iquark+5] = (msq[jquark+5][iquark+5] + msq_tmp[jquark+5][iquark+5]); if (iquark==jquark && iquark!=0) msq[jquark+5][iquark+5]*=0.5; } }
4581  // Subtract qqb/qbq->gg that was counted twice.
4582  TString gglabel = TUtil::GetMCFMParticleLabel(21, false, true);
4583  for (int ip=0; ip<mxpart; ip++){
4584  if (ip!=6 && ip!=7) sprintf((plabel_.plabel)[ip], (plabel_.plabel)[ip]);
4585  else sprintf((plabel_.plabel)[ip], gglabel.Data());
4586  }
4587  qq_wwqqstrong_(p4_tmp[0], msq_tmp[0]);
4588  for (int iquark=-5; iquark<=5; iquark++){ int jquark=-iquark; msq[jquark+5][iquark+5] = (msq[jquark+5][iquark+5] - msq_tmp[jquark+5][iquark+5]); }
4589  if (verbosity>=TVar::DEBUG){
4590  MELAout << "TUtil::SumMatrixElementPDF: Subtracting qqb/qbq->gg double-counted contribution:\n";
4591  MELAout << "\tplabels:\n";
4592  for (int ip=0; ip<mxpart; ip++) MELAout << "\t[" << ip << "]=" << (plabel_.plabel)[ip] << endl;
4593  MELAout << "\tMEsq:" << endl;
4594  for (int iquark=-5; iquark<=5; iquark++){
4595  for (int jquark=-5; jquark<=5; jquark++) MELAout << msq_tmp[jquark+5][iquark+5] << '\t';
4596  MELAout << endl;
4597  }
4598  }
4599  }
4600  else if ((PDGHelpers::isAnUnknownJet(id[partOrder.size()+2]) || PDGHelpers::isAnUnknownJet(id[partOrder.size()+3])) && !(PDGHelpers::isAGluon(id[partOrder.size()+2]) || PDGHelpers::isAGluon(id[partOrder.size()+3]))){
4601  for (unsigned int ix=0; ix<4; ix++){
4602  for (int ip=0; ip<mxpart; ip++) p4_tmp[ix][ip]=p4[ix][ip];
4603  swap(p4_tmp[ix][partOrder.size()+2], p4_tmp[ix][partOrder.size()+3]);
4604  }
4605  TString strlabel[2] ={ (plabel_.plabel)[7], (plabel_.plabel)[6] }; for (unsigned int il=0; il<2; il++) strlabel[il].Resize(2);
4606  for (int ip=0; ip<mxpart; ip++){
4607  if (ip!=6 && ip!=7) sprintf((plabel_.plabel)[ip], (plabel_.plabel)[ip]);
4608  else sprintf((plabel_.plabel)[ip], strlabel[ip-6].Data());
4609  }
4610  qq_wwqqstrong_(p4_tmp[0], msq_tmp[0]);
4611  if (verbosity>=TVar::DEBUG){
4612  MELAout << "TUtil::SumMatrixElementPDF: Adding missing contributions:\n";
4613  MELAout << "\tplabels:\n";
4614  for (int ip=0; ip<mxpart; ip++) MELAout << "\t[" << ip << "]=" << (plabel_.plabel)[ip] << endl;
4615  MELAout << "\tMEsq initial:" << endl;
4616  for (int iquark=-5; iquark<=5; iquark++){
4617  for (int jquark=-5; jquark<=5; jquark++) MELAout << msq[jquark+5][iquark+5] << '\t';
4618  MELAout << endl;
4619  }
4620  MELAout << "\tMEsq added:" << endl;
4621  for (int iquark=-5; iquark<=5; iquark++){
4622  for (int jquark=-5; jquark<=5; jquark++) MELAout << msq_tmp[jquark+5][iquark+5] << '\t';
4623  MELAout << endl;
4624  }
4625  }
4626  for (int iquark=-5; iquark<=5; iquark++){
4627  for (int jquark=-5; jquark<=5; jquark++){
4628  if (msq[jquark+5][iquark+5]==0.) msq[jquark+5][iquark+5] = msq_tmp[jquark+5][iquark+5];
4629  }
4630  }
4631  }
4632  }
4633  }
4634  else if ((isWW || isZZ) && (process == TVar::bkgWWZZ_SMHiggs || process == TVar::HSMHiggs_WWZZ || process == TVar::bkgWWZZ)){
4635  if (
4645  ){
4646  qq_vvqq_(p4[0], msq[0]);
4647  if (PDGHelpers::isAnUnknownJet(id[partOrder.size()+2]) && PDGHelpers::isAnUnknownJet(id[partOrder.size()+3])){
4648  for (unsigned int ix=0; ix<4; ix++){
4649  for (int ip=0; ip<mxpart; ip++) p4_tmp[ix][ip]=p4[ix][ip];
4650  swap(p4_tmp[ix][partOrder.size()+2], p4_tmp[ix][partOrder.size()+3]);
4651  }
4652  qq_vvqq_(p4_tmp[0], msq_tmp[0]);
4653  for (int iquark=-5; iquark<=5; iquark++){ for (int jquark=-5; jquark<=5; jquark++){ msq[jquark+5][iquark+5] = (msq[jquark+5][iquark+5] + msq_tmp[jquark+5][iquark+5]); if (iquark==jquark) msq[jquark+5][iquark+5]*=0.5; } }
4654  }
4655  else if (PDGHelpers::isAnUnknownJet(id[partOrder.size()+2]) || PDGHelpers::isAnUnknownJet(id[partOrder.size()+3])){
4656  for (unsigned int ix=0; ix<4; ix++){
4657  for (int ip=0; ip<mxpart; ip++) p4_tmp[ix][ip]=p4[ix][ip];
4658  swap(p4_tmp[ix][partOrder.size()+2], p4_tmp[ix][partOrder.size()+3]);
4659  }
4660  TString strlabel[2] ={ (plabel_.plabel)[7], (plabel_.plabel)[6] }; for (unsigned int il=0; il<2; il++) strlabel[il].Resize(2);
4661  for (int ip=0; ip<mxpart; ip++){
4662  if (ip!=6 && ip!=7) sprintf((plabel_.plabel)[ip], (plabel_.plabel)[ip]);
4663  else sprintf((plabel_.plabel)[ip], strlabel[ip-6].Data());
4664  }
4665  qq_vvqq_(p4_tmp[0], msq_tmp[0]);
4666  if (verbosity>=TVar::DEBUG){
4667  MELAout << "TUtil::SumMatrixElementPDF: Adding missing contributions:\n";
4668  MELAout << "\tplabels:\n";
4669  for (int ip=0; ip<mxpart; ip++) MELAout << "\t[" << ip << "]=" << (plabel_.plabel)[ip] << endl;
4670  MELAout << "\tMEsq initial:" << endl;
4671  for (int iquark=-5; iquark<=5; iquark++){
4672  for (int jquark=-5; jquark<=5; jquark++) MELAout << msq[jquark+5][iquark+5] << '\t';
4673  MELAout << endl;
4674  }
4675  MELAout << "\tMEsq added:" << endl;
4676  for (int iquark=-5; iquark<=5; iquark++){
4677  for (int jquark=-5; jquark<=5; jquark++) MELAout << msq_tmp[jquark+5][iquark+5] << '\t';
4678  MELAout << endl;
4679  }
4680  }
4681  for (int iquark=-5; iquark<=5; iquark++){
4682  for (int jquark=-5; jquark<=5; jquark++){
4683  if (msq[jquark+5][iquark+5]==0.) msq[jquark+5][iquark+5] = msq_tmp[jquark+5][iquark+5];
4684  }
4685  }
4686  }
4687  }
4688  //else if (
4689  // production == TVar::JJQCD || production == TVar::JJQCD_S || production == TVar::JJQCD_TU
4690  // ); // No JJQCD-VV ME in MCFM
4691  }
4692 
4693  nInstances=WipeMEArray(process, production, id, msq, verbosity);
4694  msqjk = SumMEPDF(MomStore[0], MomStore[1], msq, RcdME, EBEAM, verbosity);
4695  }
4696 
4697  // Set aL/R 1,2 into RcdME
4698  if (PDGHelpers::isAZBoson(mela_event.intermediateVid.at(0))) RcdME->setVDaughterCouplings(zcouple_.l1, zcouple_.r1, 0);
4699  else if (PDGHelpers::isAWBoson(mela_event.intermediateVid.at(0))) RcdME->setVDaughterCouplings(1., 0., 0);
4700  else RcdME->setVDaughterCouplings(0., 0., 0);
4701  if (PDGHelpers::isAZBoson(mela_event.intermediateVid.at(1))) RcdME->setVDaughterCouplings(zcouple_.l2, zcouple_.r2, 1);
4702  else if (PDGHelpers::isAWBoson(mela_event.intermediateVid.at(1))) RcdME->setVDaughterCouplings(1., 0., 1);
4703  else RcdME->setVDaughterCouplings(0., 0., 1);
4704  // Reset some of these couplings if the decay is not actually ZZ or WW.
4705  if (
4707  ||
4709  ) RcdME->setVDaughterCouplings(0., 0., 1);
4710 
4711  if (msqjk != msqjk){
4712  if (verbosity>=TVar::ERROR) MELAout << "TUtil::SumMatrixElementPDF: "<< TVar::ProcessName(process) << " msqjk=" << msqjk << endl;
4713  for (int i=0; i<NPart; i++) MELAout << "p["<<i<<"] (Px, Py, Pz, E):\t" << p4[0][i] << '\t' << p4[1][i] << '\t' << p4[2][i] << '\t' << p4[3][i] << endl;
4714  MELAout << "TUtil::SumMatrixElementPDF: The number of ME instances: " << nInstances << ". MEsq[ip][jp] = " << endl;
4715  for (int iquark=-5; iquark<=5; iquark++){
4716  for (int jquark=-5; jquark<=5; jquark++) MELAout << msq[jquark+5][iquark+5] << '\t';
4717  MELAout << endl;
4718  }
4719  msqjk=0;
4720  }
4721  else if (verbosity>=TVar::DEBUG){
4722  MELAout << "TUtil::SumMatrixElementPDF: The number of ME instances: " << nInstances << ". MEsq[ip][jp] = " << endl;
4723  for (int iquark=-5; iquark<=5; iquark++){
4724  for (int jquark=-5; jquark<=5; jquark++) MELAout << msq[jquark+5][iquark+5] << '\t';
4725  MELAout << endl;
4726  }
4727  }
4728 
4729  if (verbosity>=TVar::DEBUG) MELAout
4730  << "TUtil::SumMatrixElementPDF: Reset AlphaS:\n"
4731  << "\tBefore reset, alphas scale: " << scale_.scale
4732  << ", PDF scale: " << facscale_.facscale
4733  << endl;
4734  SetAlphaS(defaultRenScale, defaultFacScale, 1., 1., defaultNloop, defaultNflav, defaultPdflabel);
4735  if (verbosity>=TVar::DEBUG) MELAout
4736  << "TUtil::SumMatrixElementPDF: Reset AlphaS result:\n"
4737  << "\tAfter reset, alphas scale: " << scale_.scale
4738  << ", PDF scale: " << facscale_.facscale
4739  << endl;
4740  } // End if doProceed
4741  if (verbosity>=TVar::DEBUG) MELAout << "End TUtil::SumMatrixElementPDF(" << msqjk << ")" << endl;
4742  return msqjk;
4743 }
4744 
4745 // ggHdec+0J or Hdec+0J
4747  const TVar::Process& process, const TVar::Production& production, const TVar::MatrixElement& matrixElement,
4748  event_scales_type* event_scales, MelaIO* RcdME,
4749  const double& EBEAM,
4750  TVar::VerbosityLevel verbosity
4751  ){
4752  const double GeV=1./100.; // JHUGen mom. scale factor
4753  double MatElSq=0; // Return value
4754 
4755  if (matrixElement!=TVar::JHUGen){ if (verbosity>=TVar::ERROR) MELAerr << "TUtil::JHUGenMatEl: Non-JHUGen MEs are not supported" << endl; return MatElSq; }
4756  bool isSpinZero = (
4758  || process == TVar::H0minus
4759  || process == TVar::H0hplus
4761  || process == TVar::H0_Zgs
4762  || process == TVar::H0_gsgs
4763  || process == TVar::H0_Zgs_PS
4767  );
4768  bool isSpinOne = (
4770  || process == TVar::H1plus
4772  );
4773  bool isSpinTwo = (
4775  || process == TVar::H2_g1
4776  || process == TVar::H2_g8
4777  || process == TVar::H2_g4
4778  || process == TVar::H2_g5
4779  || process == TVar::H2_g2
4780  || process == TVar::H2_g3
4781  || process == TVar::H2_g6
4782  || process == TVar::H2_g7
4783  || process == TVar::H2_g9
4784  || process == TVar::H2_g10
4786  );
4787  if (!(isSpinZero || isSpinOne || isSpinTwo)){ if (verbosity>=TVar::ERROR) MELAerr << "TUtil::JHUGenMatEl: Process " << TVar::ProcessName(process) << " (" << process << ")" << " not supported." << endl; return MatElSq; }
4788  if (verbosity>=TVar::DEBUG){
4789  MELAout << "TUtil::JHUGenMatEl: Process " << TVar::ProcessName(process) << " is computing a spin-";
4790  if (isSpinZero) MELAout << "0";
4791  else if (isSpinOne) MELAout << "1";
4792  else if (isSpinTwo) MELAout << "2";
4793  else MELAout << "?";
4794  MELAout << " ME with production " << TVar::ProductionName(production) << "." << endl;
4795  }
4796 
4797  double msq[nmsq][nmsq]={ { 0 } }; // ME**2[parton2][parton1] for each incoming parton 1 and 2, used in RcdME
4798  int MYIDUP_tmp[4]={ 0 }; // Initial assignment array, unconverted. 0==Unassigned
4799  vector<pair<int, int>> idarray[2]; // All possible ids for each daughter based on the value of MYIDUP_tmp[0:3] and the desired V ids taken from mela_event.intermediateVid.at(0:1)
4800  int MYIDUP[4]={ 0 }; // "Working" assignment, converted
4801  int idfirst[2]={ 0 }; // Used to set DecayMode1, = MYIDUP[0:1]
4802  int idsecond[2]={ 0 }; // Used to set DecayMode2, = MYIDUP[2:3]
4803  double p4[6][4]={ { 0 } }; // Mom (*GeV) to pass into JHUGen
4804  TLorentzVector MomStore[mxpart]; // Mom (in natural units) to compute alphaS
4805  for (int i = 0; i < mxpart; i++) MomStore[i].SetXYZT(0, 0, 0, 0);
4806 
4807  // Notice that partIncCode is specific for this subroutine
4808  int partIncCode=TVar::kNoAssociated; // Do not use associated particles in the pT=0 frame boost
4809  simple_event_record mela_event;
4810  mela_event.AssociationCode=partIncCode;
4812  RcdME->melaCand,
4813  mela_event,
4814  verbosity
4815  );
4816  if (mela_event.pDaughters.size()<2 || mela_event.intermediateVid.size()!=2){
4817  if (verbosity>=TVar::ERROR) MELAerr << "TUtil::JHUGenMatEl: Number of daughters " << mela_event.pDaughters.size() << " or number of intermediate Vs " << mela_event.intermediateVid << " not supported!" << endl;
4818  return MatElSq;
4819  }
4820 
4821  // p(i,0:3) = (E(i),px(i),py(i),pz(i))
4822  // i=0,1: g1,g2 or q1, qb2 (outgoing convention)
4823  // i=2,3: correspond to MY_IDUP(0),MY_IDUP(1)
4824  // i=4,5: correspond to MY_IDUP(2),MY_IDUP(3)
4825  for (int ipar=0; ipar<2; ipar++){
4826  if (mela_event.pMothers.at(ipar).second.T()>0.){
4827  p4[ipar][0] = -mela_event.pMothers.at(ipar).second.T()*GeV;
4828  p4[ipar][1] = -mela_event.pMothers.at(ipar).second.X()*GeV;
4829  p4[ipar][2] = -mela_event.pMothers.at(ipar).second.Y()*GeV;
4830  p4[ipar][3] = -mela_event.pMothers.at(ipar).second.Z()*GeV;
4831  MomStore[ipar] = mela_event.pMothers.at(ipar).second;
4832  }
4833  else{
4834  p4[ipar][0] = mela_event.pMothers.at(ipar).second.T()*GeV;
4835  p4[ipar][1] = mela_event.pMothers.at(ipar).second.X()*GeV;
4836  p4[ipar][2] = mela_event.pMothers.at(ipar).second.Y()*GeV;
4837  p4[ipar][3] = mela_event.pMothers.at(ipar).second.Z()*GeV;
4838  MomStore[ipar] = -mela_event.pMothers.at(ipar).second;
4839  }
4840  // From Markus:
4841  // Note that the momentum no.2, p(1:4, 2), is a dummy which is not used in case production == TVar::ZZINDEPENDENT.
4842  if (ipar==1 && production == TVar::ZZINDEPENDENT){ for (int ix=0; ix<4; ix++){ p4[0][ix] += p4[ipar][ix]; p4[ipar][ix]=0.; } }
4843  }
4844  //initialize decayed particles
4845  if (mela_event.pDaughters.size()==2){
4846  for (unsigned int ipar=0; ipar<mela_event.pDaughters.size(); ipar++){
4847  TLorentzVector* momTmp = &(mela_event.pDaughters.at(ipar).second);
4848  int* idtmp = &(mela_event.pDaughters.at(ipar).first);
4849 
4850  int arrindex = 2*ipar;
4851  if (!PDGHelpers::isAnUnknownJet(*idtmp)) MYIDUP_tmp[arrindex] = *idtmp;
4852  else MYIDUP_tmp[arrindex] = 0;
4853  MYIDUP_tmp[arrindex+1] = -9000;
4854  p4[arrindex+2][0] = momTmp->T()*GeV;
4855  p4[arrindex+2][1] = momTmp->X()*GeV;
4856  p4[arrindex+2][2] = momTmp->Y()*GeV;
4857  p4[arrindex+2][3] = momTmp->Z()*GeV;
4858  MomStore[arrindex+2] = *momTmp;
4859  if (verbosity >= TVar::DEBUG) MELAout << "MYIDUP_tmp[" << arrindex << "(" << ipar << ")" << "]=" << MYIDUP_tmp[arrindex] << endl;
4860  }
4861  }
4862  else{
4863  for (unsigned int ipar=0; ipar<4; ipar++){
4864  if (ipar<mela_event.pDaughters.size()){
4865  TLorentzVector* momTmp = &(mela_event.pDaughters.at(ipar).second);
4866  int* idtmp = &(mela_event.pDaughters.at(ipar).first);
4867 
4868  if (!PDGHelpers::isAnUnknownJet(*idtmp)) MYIDUP_tmp[ipar] = *idtmp;
4869  else MYIDUP_tmp[ipar] = 0;
4870  p4[ipar+2][0] = momTmp->T()*GeV;
4871  p4[ipar+2][1] = momTmp->X()*GeV;
4872  p4[ipar+2][2] = momTmp->Y()*GeV;
4873  p4[ipar+2][3] = momTmp->Z()*GeV;
4874  MomStore[ipar+2] = *momTmp;
4875  }
4876  else MYIDUP_tmp[ipar] = -9000; // No need to set p4, which is already 0 by initialization
4877  // __modparameters_MOD_not_a_particle__?
4878  if (verbosity >= TVar::DEBUG) MELAout << "MYIDUP_tmp[" << ipar << "]=" << MYIDUP_tmp[ipar] << endl;
4879  }
4880  }
4881 
4882  // Set alphas
4883  double defaultRenScale = scale_.scale;
4884  double defaultFacScale = facscale_.facscale;
4885  int defaultNloop = nlooprun_.nlooprun;
4886  int defaultNflav = nflav_.nflav;
4887  string defaultPdflabel = pdlabel_.pdlabel;
4888  double renQ = InterpretScaleScheme(production, matrixElement, event_scales->renomalizationScheme, MomStore);
4889  double facQ = InterpretScaleScheme(production, matrixElement, event_scales->factorizationScheme, MomStore);
4890  SetAlphaS(renQ, facQ, event_scales->ren_scale_factor, event_scales->fac_scale_factor, 1, 5, "cteq6_l"); // Set AlphaS(|Q|/2, mynloop, mynflav, mypartonPDF)
4891  double alphasVal, alphasmzVal;
4892  GetAlphaS(&alphasVal, &alphasmzVal);
4893  RcdME->setRenormalizationScale(renQ);
4894  RcdME->setFactorizationScale(facQ);
4895  RcdME->setAlphaS(alphasVal);
4896  RcdME->setAlphaSatMZ(alphasmzVal);
4897  RcdME->setHiggsMassWidth(masses_mcfm_.hmass, masses_mcfm_.hwidth, 0);
4899  if (verbosity>=TVar::DEBUG){
4900  MELAout
4901  << "TUtil::JHUGenMatEl: Set AlphaS:\n"
4902  << "\tBefore set, alphas scale: " << defaultRenScale << ", PDF scale: " << defaultFacScale << '\n'
4903  << "\trenQ: " << renQ << " ( x " << event_scales->ren_scale_factor << "), facQ: " << facQ << " ( x " << event_scales->fac_scale_factor << ")\n"
4904  << "\tAfter set, alphas scale: " << scale_.scale << ", PDF scale: " << facscale_.facscale << ", alphas(Qren): " << alphasVal << ", alphas(MZ): " << alphasmzVal << endl;
4905  }
4906 
4907  // Determine te actual ids to compute the ME. Assign ids if any are unknown.
4908  for (int iv=0; iv<2; iv++){ // Max. 2 vector bosons
4909  if (MYIDUP_tmp[2*iv+0]!=0 && MYIDUP_tmp[2*iv+1]!=0){ // Z->2l,2nu,2q, W->lnu,qq', G
4910  // OSSF pairs or just one "V-daughter"
4911  if (
4912  TMath::Sign(1, MYIDUP_tmp[2*iv+0])==TMath::Sign(1, -MYIDUP_tmp[2*iv+1])
4913  ||
4914  (MYIDUP_tmp[2*iv+0]==-9000 || MYIDUP_tmp[2*iv+1]==-9000)
4915  ) idarray[iv].push_back(pair<int, int>(MYIDUP_tmp[2*iv+0], MYIDUP_tmp[2*iv+1]));
4916  // SSSF pairs, ordered already by phi, so avoid the re-ordering inside the ME
4917  else if (MYIDUP_tmp[2*iv+0]<0) idarray[iv].push_back(pair<int, int>(-MYIDUP_tmp[2*iv+0], MYIDUP_tmp[2*iv+1])); // Reverse sign of first daughter if SS(--)SF pair
4918  else idarray[iv].push_back(pair<int, int>(MYIDUP_tmp[2*iv+0], -MYIDUP_tmp[2*iv+1])); // Reverse sign of daughter if SS(++)SF pair
4919  }
4920  else if (MYIDUP_tmp[2*iv+0]!=0){ // ->f?, one quark is known
4921  if (PDGHelpers::isAWBoson(mela_event.intermediateVid.at(iv))){ // (W+/-)->f?
4922  if (PDGHelpers::isUpTypeQuark(MYIDUP_tmp[2*iv+0])){ // (W+)->u?
4923  int id_dn = TMath::Sign(1, -MYIDUP_tmp[2*iv+0]);
4924  int id_st = TMath::Sign(3, -MYIDUP_tmp[2*iv+0]);
4925  int id_bt = TMath::Sign(5, -MYIDUP_tmp[2*iv+0]);
4926  idarray[iv].push_back(pair<int, int>(MYIDUP_tmp[2*iv+0], id_dn));
4927  idarray[iv].push_back(pair<int, int>(MYIDUP_tmp[2*iv+0], id_st));
4928  idarray[iv].push_back(pair<int, int>(MYIDUP_tmp[2*iv+0], id_bt));
4929  }
4930  else if (PDGHelpers::isDownTypeQuark(MYIDUP_tmp[2*iv+0])){ // (W-)->d?
4931  int id_up = TMath::Sign(2, -MYIDUP_tmp[2*iv+0]);
4932  int id_ch = TMath::Sign(4, -MYIDUP_tmp[2*iv+0]);
4933  idarray[iv].push_back(pair<int, int>(MYIDUP_tmp[2*iv+0], id_up));
4934  idarray[iv].push_back(pair<int, int>(MYIDUP_tmp[2*iv+0], id_ch));
4935  }
4936  }
4937  else if (PDGHelpers::isAZBoson(mela_event.intermediateVid.at(iv))){ // Z->f?
4938  idarray[iv].push_back(pair<int, int>(MYIDUP_tmp[2*iv+0], -MYIDUP_tmp[2*iv+0]));
4939  }
4940  }
4941  else if (MYIDUP_tmp[2*iv+1]!=0){ // ->?fb, one quark is known
4942  if (PDGHelpers::isAWBoson(mela_event.intermediateVid.at(iv))){ // (W+/-)->?fb
4943  if (PDGHelpers::isUpTypeQuark(MYIDUP_tmp[2*iv+1])){ // (W-)->?ub
4944  int id_dn = TMath::Sign(1, -MYIDUP_tmp[2*iv+1]);
4945  int id_st = TMath::Sign(3, -MYIDUP_tmp[2*iv+1]);
4946  int id_bt = TMath::Sign(5, -MYIDUP_tmp[2*iv+1]);
4947  idarray[iv].push_back(pair<int, int>(id_dn, MYIDUP_tmp[2*iv+1]));
4948  idarray[iv].push_back(pair<int, int>(id_st, MYIDUP_tmp[2*iv+1]));
4949  idarray[iv].push_back(pair<int, int>(id_bt, MYIDUP_tmp[2*iv+1]));
4950  }
4951  else if (PDGHelpers::isDownTypeQuark(MYIDUP_tmp[2*iv+1])){ // (W+)->?db
4952  int id_up = TMath::Sign(2, -MYIDUP_tmp[2*iv+1]);
4953  int id_ch = TMath::Sign(4, -MYIDUP_tmp[2*iv+1]);
4954  idarray[iv].push_back(pair<int, int>(id_up, MYIDUP_tmp[2*iv+1]));
4955  idarray[iv].push_back(pair<int, int>(id_ch, MYIDUP_tmp[2*iv+1]));
4956  }
4957  }
4958  else if (PDGHelpers::isAZBoson(mela_event.intermediateVid.at(iv))){ // Z->?fb
4959  idarray[iv].push_back(pair<int, int>(-MYIDUP_tmp[2*iv+1], MYIDUP_tmp[2*iv+1]));
4960  }
4961  }
4962  else{ // Both fermions unknown
4963  if (PDGHelpers::isAWBoson(mela_event.intermediateVid.at(iv))){ // (W+/-)->??
4964  for (int iqu=1; iqu<=2; iqu++){
4965  int id_up = iqu*2;
4966  for (int iqd=1; iqd<=3; iqd++){
4967  int id_dn = iqd*2-1;
4968  if (iv==0){ idarray[iv].push_back(pair<int, int>(id_up, -id_dn)); idarray[iv].push_back(pair<int, int>(-id_dn, id_up)); }
4969  else{ idarray[iv].push_back(pair<int, int>(id_dn, -id_up)); idarray[iv].push_back(pair<int, int>(-id_up, id_dn)); }
4970  }
4971  }
4972  }
4973  else if (PDGHelpers::isAZBoson(mela_event.intermediateVid.at(iv))){ // Z->??
4974  for (int iq=1; iq<=5; iq++){ idarray[iv].push_back(pair<int, int>(iq, -iq)); idarray[iv].push_back(pair<int, int>(-iq, iq)); }
4975  }
4976  }
4977  }
4978 
4979  // Variables to set L1/2 and R1/2 couplings into RcdME
4980  const int InvalidMode=-1, WWMode=0, ZZMode=1, ZgMode=5, ggMode=7;
4981  int VVMode=InvalidMode;
4982  if (PDGHelpers::isAWBoson(mela_event.intermediateVid.at(0)) && PDGHelpers::isAWBoson(mela_event.intermediateVid.at(1))) VVMode=WWMode;
4983  else if (PDGHelpers::isAZBoson(mela_event.intermediateVid.at(0)) && PDGHelpers::isAZBoson(mela_event.intermediateVid.at(1))) VVMode=ZZMode;
4984  else if (PDGHelpers::isAPhoton(mela_event.intermediateVid.at(0)) && PDGHelpers::isAPhoton(mela_event.intermediateVid.at(1))) VVMode=ggMode;
4985  else if (
4986  (PDGHelpers::isAZBoson(mela_event.intermediateVid.at(0)) && PDGHelpers::isAPhoton(mela_event.intermediateVid.at(1)))
4987  ||
4988  (PDGHelpers::isAZBoson(mela_event.intermediateVid.at(1)) && PDGHelpers::isAPhoton(mela_event.intermediateVid.at(0)))
4989  ) VVMode=ZgMode;
4990  double aL1=0, aL2=0, aR1=0, aR2=0;
4991 
4992  int nNonZero=0;
4993  for (unsigned int v1=0; v1<idarray[0].size(); v1++){
4994  for (unsigned int v2=0; v2<idarray[1].size(); v2++){
4995  // Convert the particle ids to JHU convention
4996  if (idarray[0].at(v1).first!=-9000) MYIDUP[0] = convertLHEreverse(&(idarray[0].at(v1).first));
4997  if (idarray[0].at(v1).second!=-9000) MYIDUP[1] = convertLHEreverse(&(idarray[0].at(v1).second));
4998  if (idarray[1].at(v2).first!=-9000) MYIDUP[2] = convertLHEreverse(&(idarray[1].at(v2).first));
4999  if (idarray[1].at(v2).second!=-9000) MYIDUP[3] = convertLHEreverse(&(idarray[1].at(v2).second));
5000 
5001  // Check working ids
5002  if (verbosity>=TVar::DEBUG){ for (unsigned int idau=0; idau<4; idau++) MELAout << "MYIDUP[" << idau << "]=" << MYIDUP[idau] << endl; }
5003 
5004  // Determine M_V and Ga_V in JHUGen, needed for g1 vs everything else.
5005  for (int ip=0; ip<2; ip++){ idfirst[ip]=MYIDUP[ip]; idsecond[ip]=MYIDUP[ip+2]; }
5006  __modjhugenmela_MOD_setdecaymodes(idfirst, idsecond); // Set M_V and Ga_V in JHUGen
5007  if (verbosity>=TVar::DEBUG){
5008  double mv, gv;
5009  __modjhugenmela_MOD_getmvgv(&mv, &gv);
5010  MELAout << "TUtil::JHUGenMatEl: M_V=" << mv/GeV << ", Ga_V=" << gv/GeV << endl;
5012  MELAout << "TUtil::JHUGenMatEl: M_Vprime=" << mv/GeV << ", Ga_Vprime=" << gv/GeV << endl;
5013  }
5014 
5015  // Sum over possible left/right couplings of the Vs
5016  double aLRtmp[4]={ 0 };
5017  __modjhugenmela_MOD_getdecaycouplings(&VVMode, MYIDUP, &(aLRtmp[0]), &(aLRtmp[1]), &(aLRtmp[2]), &(aLRtmp[3]));
5018  if (idarray[0].size()>1){
5019  aL1 = sqrt(pow(aL1, 2)+pow(aLRtmp[0], 2));
5020  aR1 = sqrt(pow(aR1, 2)+pow(aLRtmp[1], 2));
5021  }
5022  else{
5023  aL1 = aLRtmp[0];
5024  aR1 = aLRtmp[1];
5025  }
5026  if (idarray[1].size()>1){
5027  aL2 = sqrt(pow(aL2, 2)+pow(aLRtmp[2], 2));
5028  aR2 = sqrt(pow(aR2, 2)+pow(aLRtmp[3], 2));
5029  }
5030  else{
5031  aL2 = aLRtmp[2];
5032  aR2 = aLRtmp[3];
5033  }
5034 
5035  double MatElTmp=0.;
5036  if (production == TVar::ZZGG){
5037  if (isSpinZero) __modhiggs_MOD_evalamp_gg_h_vv(p4, MYIDUP, &MatElTmp);
5038  else if (isSpinTwo) __modgraviton_MOD_evalamp_gg_g_vv(p4, MYIDUP, &MatElTmp);
5039  }
5040  else if (production == TVar::ZZQQB){
5041  if (isSpinOne) __modzprime_MOD_evalamp_qqb_zprime_vv(p4, MYIDUP, &MatElTmp);
5042  else if (isSpinTwo) __modgraviton_MOD_evalamp_qqb_g_vv(p4, MYIDUP, &MatElTmp);
5043  }
5044  else if (production == TVar::ZZINDEPENDENT){
5045  if (isSpinZero) __modhiggs_MOD_evalamp_h_vv(p4, MYIDUP, &MatElTmp);
5046  else if (isSpinOne) __modzprime_MOD_evalamp_zprime_vv(p4, MYIDUP, &MatElTmp);
5047  else if (isSpinTwo) __modgraviton_MOD_evalamp_g_vv(p4, MYIDUP, &MatElTmp);
5048  }
5049  // Add CKM elements since they are not included
5050  if (PDGHelpers::isAWBoson(mela_event.intermediateVid.at(0))) MatElTmp *= pow(__modparameters_MOD_ckmbare(&(idarray[0].at(v1).first), &(idarray[0].at(v1).second)), 2);
5051  if (PDGHelpers::isAWBoson(mela_event.intermediateVid.at(1))) MatElTmp *= pow(__modparameters_MOD_ckmbare(&(idarray[1].at(v2).first), &(idarray[1].at(v2).second)), 2);
5052 
5053  if (verbosity >= TVar::DEBUG) MELAout << "=====\nTUtil::JHUGenMatEl: Instance MatElTmp = " << MatElTmp << "\n=====" << endl;
5054  MatElSq += MatElTmp;
5055  if (MatElTmp>0.) nNonZero++;
5056  }
5057  }
5058  if (nNonZero>0) MatElSq /= ((double)nNonZero);
5059  if (verbosity >= TVar::DEBUG){
5060  MELAout << "TUtil::JHUGenMatEl: Number of matrix element instances computed: " << nNonZero << endl;
5061  MELAout << "TUtil::JHUGenMatEl: MatElSq after division = " << MatElSq << endl;
5062  }
5063 
5064  // Set aL/R 1,2 into RcdME
5065  RcdME->setVDaughterCouplings(aL1, aR1, 0);
5066  RcdME->setVDaughterCouplings(aL2, aR2, 1);
5067  if (verbosity >= TVar::DEBUG_VERBOSE) MELAout
5068  << "TUtil::JHUGenMatEl: aL1, aR1, aL2, aR2: "
5069  << aL1 << ", " << aR1 << ", " << aL2 << ", " << aR2
5070  << endl;
5071 
5072  // This constant is needed to account for the different units used in JHUGen compared to MCFM
5073  int GeVexponent_MEsq = 4-((int)mela_event.pDaughters.size())*2;
5074  if (production == TVar::ZZINDEPENDENT) GeVexponent_MEsq += 2; // Amplitude missing m from production and 1/m**2 from propagator == Amplitude missing 1/m == MEsq missing 1/m**2
5075  double constant = pow(GeV, -GeVexponent_MEsq);
5076  MatElSq *= constant;
5077 
5078  // Set RcdME information for ME and parton distributions, taking into account the mothers if id!=0 (i.e. if not unknown).
5079  if (mela_event.pMothers.at(0).first!=0 && mela_event.pMothers.at(1).first!=0){
5080  int ix=5, iy=5;
5081  if (abs(mela_event.pMothers.at(0).first)<6) ix=mela_event.pMothers.at(0).first + 5;
5082  if (abs(mela_event.pMothers.at(1).first)<6) iy=mela_event.pMothers.at(1).first + 5;
5083  msq[iy][ix]=MatElSq; // Note that SumMEPdf receives a transposed msq
5084  }
5085  else{
5086  if (production == TVar::ZZGG || production == TVar::ZZINDEPENDENT) msq[5][5]=MatElSq;
5087  else if (production == TVar::ZZQQB){
5088  for (int ix=0; ix<5; ix++){ msq[ix][10-ix]=MatElSq; msq[10-ix][ix]=MatElSq; }
5089  }
5090  }
5091  if (production!=TVar::ZZINDEPENDENT) SumMEPDF(MomStore[0], MomStore[1], msq, RcdME, EBEAM, verbosity);
5092  else{ // If production is ZZINDEPENDENT, only set gg index with fx1,2[g,g]=1.
5093  double fx_dummy[nmsq]={ 0 }; fx_dummy[5]=1.;
5094  RcdME->setPartonWeights(fx_dummy, fx_dummy);
5095  RcdME->setMEArray(msq, true);
5096  RcdME->computeWeightedMEArray();
5097  }
5098 
5099  if (verbosity >= TVar::DEBUG) MELAout << "TUtil::JHUGenMatEl: Final MatElSq = " << MatElSq << endl;
5100 
5101  // Reset alphas
5102  if (verbosity>=TVar::DEBUG){
5103  MELAout
5104  << "TUtil::JHUGenMatEl: Reset AlphaS:\n"
5105  << "\tBefore reset, alphas scale: " << scale_.scale << ", PDF scale: " << facscale_.facscale << endl;
5106  }
5107  SetAlphaS(defaultRenScale, defaultFacScale, 1., 1., defaultNloop, defaultNflav, defaultPdflabel);
5108  if (verbosity>=TVar::DEBUG){
5109  GetAlphaS(&alphasVal, &alphasmzVal);
5110  MELAout
5111  << "TUtil::JHUGenMatEl: Reset AlphaS result:\n"
5112  << "\tAfter reset, alphas scale: " << scale_.scale << ", PDF scale: " << facscale_.facscale << ", alphas(Qren): " << alphasVal << ", alphas(MZ): " << alphasmzVal << endl;
5113  }
5114  return MatElSq;
5115 }
5116 
5117 // VBF and HJJ (QCD), H undecayed, includes H BW
5119  const TVar::Process& process, const TVar::Production& production, const TVar::MatrixElement& matrixElement,
5120  event_scales_type* event_scales, MelaIO* RcdME,
5121  const double& EBEAM,
5122  TVar::VerbosityLevel verbosity
5123  ){
5124  const double GeV=1./100.; // JHUGen mom. scale factor
5125  double sum_msqjk = 0;
5126  // by default assume only gg productions
5127  // FOTRAN convention -5 -4 -3 -2 -1 0 1 2 3 4 5
5128  // parton flavor bbar cbar sbar ubar dbar g d u s c b
5129  // C++ convention 0 1 2 3 4 5 6 7 8 9 10
5130  //2-D matrix is reversed in fortran
5131  // msq[ parton2 ] [ parton1 ]
5132  // flavor_msq[jj][ii] = fx1[ii]*fx2[jj]*msq[jj][ii];
5133  double MatElsq[nmsq][nmsq]={ { 0 } };
5134  double MatElsq_tmp[nmsq][nmsq]={ { 0 } }; // For H+J
5135  double msq_tmp=0; // For "*_exact"
5136 
5137  if (matrixElement!=TVar::JHUGen){ if (verbosity>=TVar::ERROR) MELAerr << "TUtil::HJJMatEl: Non-JHUGen MEs are not supported" << endl; return sum_msqjk; }
5138  if (!(production == TVar::JJQCD || production == TVar::JJVBF || production == TVar::JQCD)){ if (verbosity>=TVar::ERROR) MELAerr << "TUtil::HJJMatEl: Production is not supported!" << endl; return sum_msqjk; }
5139 
5140  // Notice that partIncCode is specific for this subroutine
5141  int nRequested_AssociatedJets=2;
5142  if (production == TVar::JQCD) nRequested_AssociatedJets=1;
5143  int partIncCode=TVar::kUseAssociated_Jets; // Only use associated partons in the pT=0 frame boost
5144  simple_event_record mela_event;
5145  mela_event.AssociationCode=partIncCode;
5146  mela_event.nRequested_AssociatedJets=nRequested_AssociatedJets;
5148  RcdME->melaCand,
5149  mela_event,
5150  verbosity
5151  );
5152  if (mela_event.pAssociated.size()==0){ if (verbosity>=TVar::ERROR) MELAerr << "TUtil::HJJMatEl: Number of associated particles is 0!" << endl; return sum_msqjk; }
5153 
5154  int MYIDUP_tmp[4]={ 0 }; // "Incoming" partons 1, 2, "outgoing" partons 3, 4
5155  double p4[5][4]={ { 0 } };
5156  double pOneJet[4][4] ={ { 0 } }; // For HJ
5157  TLorentzVector MomStore[mxpart];
5158  for (int i = 0; i < mxpart; i++) MomStore[i].SetXYZT(0, 0, 0, 0);
5159 
5160  // p4(0:4,i) = (E(i),px(i),py(i),pz(i))
5161  // i=0,1: g1,g2 or q1, qb2 (outgoing convention)
5162  // i=2,3: J1, J2 in outgoing convention when possible
5163  // i=4: H
5164  for (int ipar=0; ipar<2; ipar++){
5165  TLorentzVector* momTmp = &(mela_event.pMothers.at(ipar).second);
5166  int* idtmp = &(mela_event.pMothers.at(ipar).first);
5167  if (!PDGHelpers::isAnUnknownJet(*idtmp)) MYIDUP_tmp[ipar] = *idtmp;
5168  else MYIDUP_tmp[ipar] = 0;
5169  if (momTmp->T()>0.){
5170  p4[ipar][0] = momTmp->T()*GeV;
5171  p4[ipar][1] = momTmp->X()*GeV;
5172  p4[ipar][2] = momTmp->Y()*GeV;
5173  p4[ipar][3] = momTmp->Z()*GeV;
5174  MomStore[ipar] = (*momTmp);
5175  }
5176  else{
5177  p4[ipar][0] = -momTmp->T()*GeV;
5178  p4[ipar][1] = -momTmp->X()*GeV;
5179  p4[ipar][2] = -momTmp->Y()*GeV;
5180  p4[ipar][3] = -momTmp->Z()*GeV;
5181  MomStore[ipar] = -(*momTmp);
5182  MYIDUP_tmp[ipar] = -MYIDUP_tmp[ipar];
5183  }
5184  }
5185  for (unsigned int ipar=0; ipar<2; ipar++){
5186  if (ipar<mela_event.pAssociated.size()){
5187  TLorentzVector* momTmp = &(mela_event.pAssociated.at(ipar).second);
5188  int* idtmp = &(mela_event.pAssociated.at(ipar).first);
5189  if (!PDGHelpers::isAnUnknownJet(*idtmp)) MYIDUP_tmp[ipar+2] = *idtmp;
5190  else MYIDUP_tmp[ipar+2] = 0;
5191  p4[ipar+2][0] = momTmp->T()*GeV;
5192  p4[ipar+2][1] = momTmp->X()*GeV;
5193  p4[ipar+2][2] = momTmp->Y()*GeV;
5194  p4[ipar+2][3] = momTmp->Z()*GeV;
5195  MomStore[ipar+6] = (*momTmp); // i==(2, 3, 4) is (J1, J2, H), recorded as MomStore (I1, I2, 0, 0, 0, H, J1, J2)
5196  }
5197  else MYIDUP_tmp[ipar+2] = -9000; // No need to set p4, which is already 0 by initialization
5198  }
5199  for (unsigned int ipar=0; ipar<mela_event.pDaughters.size(); ipar++){
5200  TLorentzVector* momTmp = &(mela_event.pDaughters.at(ipar).second);
5201  p4[4][0] += momTmp->T()*GeV;
5202  p4[4][1] += momTmp->X()*GeV;
5203  p4[4][2] += momTmp->Y()*GeV;
5204  p4[4][3] += momTmp->Z()*GeV;
5205  MomStore[5] = MomStore[5] + (*momTmp); // i==(2, 3, 4) is (J1, J2, H), recorded as MomStore (I1, I2, 0, 0, 0, H, J1, J2)
5206  }
5207  // Momenta for HJ
5208  for (unsigned int i = 0; i < 4; i++){
5209  if (i<2){ for (unsigned int j = 0; j < 4; j++) pOneJet[i][j] = p4[i][j]; } // p1 p2
5210  else if (i==2){ for (unsigned int j = 0; j < 4; j++) pOneJet[i][j] = p4[4][j]; } // H
5211  else{ for (unsigned int j = 0; j < 4; j++) pOneJet[i][j] = p4[2][j]; } // J1
5212  }
5213  if (verbosity >= TVar::DEBUG){
5214  for (unsigned int i=0; i<5; i++) MELAout << "p["<<i<<"] (Px, Py, Pz, E, M):\t" << p4[i][1]/GeV << '\t' << p4[i][2]/GeV << '\t' << p4[i][3]/GeV << '\t' << p4[i][0]/GeV << '\t' << sqrt(fabs(pow(p4[i][0], 2)-pow(p4[i][1], 2)-pow(p4[i][2], 2)-pow(p4[i][3], 2)))/GeV << endl;
5215  MELAout << "One-jet momenta: " << endl;
5216  for (unsigned int i=0; i<4; i++) MELAout << "pOneJet["<<i<<"] (Px, Py, Pz, E, M):\t" << pOneJet[i][1]/GeV << '\t' << pOneJet[i][2]/GeV << '\t' << pOneJet[i][3]/GeV << '\t' << pOneJet[i][0]/GeV << '\t' << sqrt(fabs(pow(pOneJet[i][0], 2)-pow(pOneJet[i][1], 2)-pow(pOneJet[i][2], 2)-pow(pOneJet[i][3], 2)))/GeV << endl;
5217  }
5218 
5219  double defaultRenScale = scale_.scale;
5220  double defaultFacScale = facscale_.facscale;
5221  int defaultNloop = nlooprun_.nlooprun;
5222  int defaultNflav = nflav_.nflav;
5223  string defaultPdflabel = pdlabel_.pdlabel;
5224  double renQ = InterpretScaleScheme(production, matrixElement, event_scales->renomalizationScheme, MomStore);
5225  double facQ = InterpretScaleScheme(production, matrixElement, event_scales->factorizationScheme, MomStore);
5226  SetAlphaS(renQ, facQ, event_scales->ren_scale_factor, event_scales->fac_scale_factor, 1, 5, "cteq6_l");
5227  double alphasVal, alphasmzVal;
5228  GetAlphaS(&alphasVal, &alphasmzVal);
5229  RcdME->setRenormalizationScale(renQ);
5230  RcdME->setFactorizationScale(facQ);
5231  RcdME->setAlphaS(alphasVal);
5232  RcdME->setAlphaSatMZ(alphasmzVal);
5233  RcdME->setHiggsMassWidth(masses_mcfm_.hmass, masses_mcfm_.hwidth, 0);
5235  if (verbosity>=TVar::DEBUG){
5236  MELAout
5237  << "TUtil::HJJMatEl: Set AlphaS:\n"
5238  << "\tBefore set, alphas scale: " << defaultRenScale << ", PDF scale: " << defaultFacScale << '\n'
5239  << "\trenQ: " << renQ << " ( x " << event_scales->ren_scale_factor << "), facQ: " << facQ << " ( x " << event_scales->fac_scale_factor << ")\n"
5240  << "\tAfter set, alphas scale: " << scale_.scale << ", PDF scale: " << facscale_.facscale << ", alphas(Qren): " << alphasVal << ", alphas(MZ): " << alphasmzVal << endl;
5241  }
5242 
5243  // Since we have a lot of these checks, do them here.
5244  bool partonIsUnknown[4];
5245  for (unsigned int ip=0; ip<4; ip++) partonIsUnknown[ip] = (MYIDUP_tmp[ip]==0);
5246 
5247  // NOTE ON HJ AND HJJ CHANNEL HASHES:
5248  // THEY ONLY RETURN ISEL>=JSEL CASES. ISEL<JSEL NEEDS TO BE DONE MANUALLY.
5249  if (production == TVar::JQCD){ // Computation is already for all possible qqb/qg/qbg/gg, and incoming q, qb and g flavor have 1-1 correspondence to the outgoing jet flavor.
5250  __modhiggsj_MOD_evalamp_hj(pOneJet, MatElsq_tmp);
5251  for (int isel=-5; isel<=5; isel++){
5252  if (!partonIsUnknown[0] && !((PDGHelpers::isAGluon(MYIDUP_tmp[0]) && isel==0) || MYIDUP_tmp[0]==isel)) continue;
5253  for (int jsel=-5; jsel<=5; jsel++){
5254  if (!partonIsUnknown[1] && !((PDGHelpers::isAGluon(MYIDUP_tmp[1]) && jsel==0) || MYIDUP_tmp[1]==jsel)) continue;
5255  int rsel;
5256  if (isel!=0 && jsel!=0) rsel=0; // Covers qqb->Hg
5257  else if (isel==0) rsel=jsel; // Covers gg->Hg, gq->Hq, gqb->Hqb
5258  else rsel=isel; // Covers qg->Hq, qbg->Hqb
5259  if (!partonIsUnknown[2] && !((PDGHelpers::isAGluon(MYIDUP_tmp[2]) && rsel==0) || MYIDUP_tmp[2]==rsel)) continue;
5260  MatElsq[jsel+5][isel+5] = MatElsq_tmp[jsel+5][isel+5]; // Assign only those that match gen. info, if present at all.
5261  if (verbosity >= TVar::DEBUG) MELAout << "Channel (isel, jsel)=" << isel << ", " << jsel << endl;
5262  }
5263  }
5264  }
5265  else if (production == TVar::JJQCD){
5266  const std::vector<TNumericUtil::intTriplet_t>& ijsel = Get_JHUGenHash_OnshellHJJHash();
5267  int nijchannels = ijsel.size();
5268  for (int ic=0; ic<nijchannels; ic++){
5269  // Emulate EvalWeighted_HJJ_test
5270  int isel = ijsel[ic][0];
5271  int jsel = ijsel[ic][1];
5272  int code = ijsel[ic][2];
5273 
5274  if (verbosity >= TVar::DEBUG_VERBOSE) MELAout << "HJJ channel " << ic << " code " << code << endl;
5275 
5276  // Default assignments
5277  if (verbosity >= TVar::DEBUG_VERBOSE) MELAout << "HJJ mother unswapped case" << endl;
5278  int rsel=isel;
5279  int ssel=jsel;
5280 
5281  if (
5282  (partonIsUnknown[0] || ((PDGHelpers::isAGluon(MYIDUP_tmp[0]) && isel==0) || MYIDUP_tmp[0]==isel))
5283  &&
5284  (partonIsUnknown[1] || ((PDGHelpers::isAGluon(MYIDUP_tmp[1]) && jsel==0) || MYIDUP_tmp[1]==jsel))
5285  ){ // Do it this way to be able to swap isel and jsel later
5286 
5287  if (isel==0 && jsel==0){ // gg->?
5288  if (code==2){ // gg->qqb
5289  // Only compute u-ub. The amplitude is multiplied by nf=5
5290  rsel=1;
5291  ssel=-1;
5292  if (
5293  (partonIsUnknown[2] || (PDGHelpers::isAQuark(MYIDUP_tmp[2]) && MYIDUP_tmp[2]>0))
5294  &&
5295  (partonIsUnknown[3] || (PDGHelpers::isAQuark(MYIDUP_tmp[3]) && MYIDUP_tmp[3]<0))
5296  ){
5297  __modhiggsjj_MOD_evalamp_sbfh_unsymm_sa_select_exact(p4, &isel, &jsel, &rsel, &ssel, &msq_tmp);
5298  MatElsq[jsel+5][isel+5] += msq_tmp; // Assign only those that match gen. info, if present at all.
5299  if (verbosity >= TVar::DEBUG_VERBOSE) MELAout << "Channel (isel, jsel, rsel, ssel)=" << isel << ", " << jsel << ", " << rsel << ", " << ssel << '\t' << msq_tmp << endl;
5300  }
5301  if (
5302  (partonIsUnknown[2] || (PDGHelpers::isAQuark(MYIDUP_tmp[2]) && MYIDUP_tmp[2]<0))
5303  &&
5304  (partonIsUnknown[3] || (PDGHelpers::isAQuark(MYIDUP_tmp[3]) && MYIDUP_tmp[3]>0))
5305  ){
5306  __modhiggsjj_MOD_evalamp_sbfh_unsymm_sa_select_exact(p4, &isel, &jsel, &ssel, &rsel, &msq_tmp);
5307  MatElsq[jsel+5][isel+5] += msq_tmp; // Assign only those that match gen. info, if present at all.
5308  if (verbosity >= TVar::DEBUG_VERBOSE) MELAout << "Channel (isel, jsel, rsel, ssel)=" << isel << ", " << jsel << ", " << ssel << ", " << rsel << '\t' << msq_tmp << endl;
5309  }
5310  }
5311  else{ // gg->gg
5312  // rsel=ssel=g already
5313  if (
5314  (partonIsUnknown[2] || (PDGHelpers::isAGluon(MYIDUP_tmp[2]) && rsel==0))
5315  &&
5316  (partonIsUnknown[3] || (PDGHelpers::isAGluon(MYIDUP_tmp[3]) && ssel==0))
5317  ){
5318  __modhiggsjj_MOD_evalamp_sbfh_unsymm_sa_select_exact(p4, &isel, &jsel, &rsel, &ssel, &msq_tmp);
5319  MatElsq[jsel+5][isel+5] += msq_tmp; // Assign only those that match gen. info, if present at all.
5320  if (verbosity >= TVar::DEBUG_VERBOSE) MELAout << "Channel (isel, jsel, rsel, ssel)=" << isel << ", " << jsel << ", " << rsel << ", " << ssel << '\t' << msq_tmp << endl;
5321  }
5322  }
5323  }
5324  else if (isel==0 || jsel==0){ // qg/qbg/gq/gqb->qg/qbg/gq/gqb
5325  if (
5326  (partonIsUnknown[2] || ((PDGHelpers::isAGluon(MYIDUP_tmp[2]) && rsel==0) || MYIDUP_tmp[2]==rsel))
5327  &&
5328  (partonIsUnknown[3] || ((PDGHelpers::isAGluon(MYIDUP_tmp[3]) && ssel==0) || MYIDUP_tmp[3]==ssel))
5329  ){
5330  __modhiggsjj_MOD_evalamp_sbfh_unsymm_sa_select_exact(p4, &isel, &jsel, &rsel, &ssel, &msq_tmp);
5331  MatElsq[jsel+5][isel+5] += msq_tmp; // Assign only those that match gen. info, if present at all.
5332  if (verbosity >= TVar::DEBUG_VERBOSE) MELAout << "Channel (isel, jsel, rsel, ssel)=" << isel << ", " << jsel << ", " << rsel << ", " << ssel << '\t' << msq_tmp << endl;
5333  }
5334  if (
5335  (partonIsUnknown[2] || ((PDGHelpers::isAGluon(MYIDUP_tmp[2]) && ssel==0) || MYIDUP_tmp[2]==ssel))
5336  &&
5337  (partonIsUnknown[3] || ((PDGHelpers::isAGluon(MYIDUP_tmp[3]) && rsel==0) || MYIDUP_tmp[3]==rsel))
5338  ){
5339  __modhiggsjj_MOD_evalamp_sbfh_unsymm_sa_select_exact(p4, &isel, &jsel, &ssel, &rsel, &msq_tmp);
5340  MatElsq[jsel+5][isel+5] += msq_tmp; // Assign only those that match gen. info, if present at all.
5341  if (verbosity >= TVar::DEBUG_VERBOSE) MELAout << "Channel (isel, jsel, rsel, ssel)=" << isel << ", " << jsel << ", " << ssel << ", " << rsel << '\t' << msq_tmp << endl;
5342  }
5343  }
5344  else if ((isel>0 && jsel<0) || (isel<0 && jsel>0)){ // qQb/qbQ->?
5345  if (code==1 && isel==-jsel){ // qqb/qbq->gg
5346  rsel=0; ssel=0;
5347  if (
5348  (partonIsUnknown[2] || PDGHelpers::isAGluon(MYIDUP_tmp[2]))
5349  &&
5350  (partonIsUnknown[3] || PDGHelpers::isAGluon(MYIDUP_tmp[3]))
5351  ){
5352  __modhiggsjj_MOD_evalamp_sbfh_unsymm_sa_select_exact(p4, &isel, &jsel, &rsel, &ssel, &msq_tmp);
5353  MatElsq[jsel+5][isel+5] += msq_tmp; // Assign only those that match gen. info, if present at all.
5354  if (verbosity >= TVar::DEBUG_VERBOSE) MELAout << "Channel (isel, jsel, rsel, ssel)=" << isel << ", " << jsel << ", " << rsel << ", " << ssel << '\t' << msq_tmp << endl;
5355  }
5356  }
5357  else if (code==3 && isel==-jsel){ // qqb->QQb
5358  if (abs(isel)!=1){ rsel=1; ssel=-1; } // Make sure rsel, ssel are not of same flavor as isel, jsel
5359  else{ rsel=2; ssel=-2; }
5360  // The amplitude is aready multiplied by nf-1, so no need to calculate everything (nf-1) times.
5361  if (
5362  (partonIsUnknown[2] && partonIsUnknown[3])
5363  ||
5364  (partonIsUnknown[2] && std::abs(MYIDUP_tmp[3])!=std::abs(isel) && MYIDUP_tmp[3]<0)
5365  ||
5366  (std::abs(MYIDUP_tmp[2])!=std::abs(isel) && MYIDUP_tmp[2]>0 && partonIsUnknown[3])
5367  ||
5368  (std::abs(MYIDUP_tmp[2])!=std::abs(isel) && MYIDUP_tmp[2]==-MYIDUP_tmp[3] && MYIDUP_tmp[2]>0)
5369  ){
5370  __modhiggsjj_MOD_evalamp_sbfh_unsymm_sa_select_exact(p4, &isel, &jsel, &rsel, &ssel, &msq_tmp);
5371  MatElsq[jsel+5][isel+5] += msq_tmp; // Assign only those that match gen. info, if present at all.
5372  if (verbosity >= TVar::DEBUG_VERBOSE) MELAout << "Channel (isel, jsel, rsel, ssel)=" << isel << ", " << jsel << ", " << rsel << ", " << ssel << '\t' << msq_tmp << endl;
5373  }
5374  if (
5375  (partonIsUnknown[2] && partonIsUnknown[3])
5376  ||
5377  (partonIsUnknown[2] && std::abs(MYIDUP_tmp[3])!=std::abs(isel) && MYIDUP_tmp[3]>0)
5378  ||
5379  (std::abs(MYIDUP_tmp[2])!=std::abs(isel) && MYIDUP_tmp[2]<0 && partonIsUnknown[3])
5380  ||
5381  (std::abs(MYIDUP_tmp[2])!=std::abs(isel) && MYIDUP_tmp[2]==-MYIDUP_tmp[3] && MYIDUP_tmp[2]<0)
5382  ){
5383  __modhiggsjj_MOD_evalamp_sbfh_unsymm_sa_select_exact(p4, &isel, &jsel, &ssel, &rsel, &msq_tmp);
5384  MatElsq[jsel+5][isel+5] += msq_tmp; // Assign only those that match gen. info, if present at all.
5385  if (verbosity >= TVar::DEBUG_VERBOSE) MELAout << "Channel (isel, jsel, rsel, ssel)=" << isel << ", " << jsel << ", " << ssel << ", " << rsel << '\t' << msq_tmp << endl;
5386  }
5387  }
5388  else{ // qQb/qbQ->qQb/qbQ
5389  if (
5390  (partonIsUnknown[2] || MYIDUP_tmp[2]==rsel)
5391  &&
5392  (partonIsUnknown[3] || MYIDUP_tmp[3]==ssel)
5393  ){
5394  __modhiggsjj_MOD_evalamp_sbfh_unsymm_sa_select_exact(p4, &isel, &jsel, &rsel, &ssel, &msq_tmp);
5395  MatElsq[jsel+5][isel+5] += msq_tmp; // Assign only those that match gen. info, if present at all.
5396  if (verbosity >= TVar::DEBUG_VERBOSE) MELAout << "Channel (isel, jsel, rsel, ssel)=" << isel << ", " << jsel << ", " << rsel << ", " << ssel << '\t' << msq_tmp << endl;
5397  }
5398  if (
5399  (partonIsUnknown[2] || MYIDUP_tmp[2]==ssel)
5400  &&
5401  (partonIsUnknown[3] || MYIDUP_tmp[3]==rsel)
5402  ){
5403  __modhiggsjj_MOD_evalamp_sbfh_unsymm_sa_select_exact(p4, &isel, &jsel, &ssel, &rsel, &msq_tmp);
5404  MatElsq[jsel+5][isel+5] += msq_tmp; // Assign only those that match gen. info, if present at all.
5405  if (verbosity >= TVar::DEBUG_VERBOSE) MELAout << "Channel (isel, jsel, rsel, ssel)=" << isel << ", " << jsel << ", " << rsel << ", " << ssel << '\t' << msq_tmp << endl;
5406  }
5407  }
5408  }
5409  else{
5410  if (
5411  (partonIsUnknown[2] || MYIDUP_tmp[2]==rsel)
5412  &&
5413  (partonIsUnknown[3] || MYIDUP_tmp[3]==ssel)
5414  ){
5415  __modhiggsjj_MOD_evalamp_sbfh_unsymm_sa_select_exact(p4, &isel, &jsel, &rsel, &ssel, &msq_tmp);
5416  MatElsq[jsel+5][isel+5] += msq_tmp; // Assign only those that match gen. info, if present at all.
5417  if (verbosity >= TVar::DEBUG_VERBOSE) MELAout << "Channel (isel, jsel, rsel, ssel)=" << isel << ", " << jsel << ", " << rsel << ", " << ssel << '\t' << msq_tmp << endl;
5418  }
5419  if (
5420  rsel!=ssel
5421  &&
5422  (partonIsUnknown[2] || MYIDUP_tmp[2]==ssel)
5423  &&
5424  (partonIsUnknown[3] || MYIDUP_tmp[3]==rsel)
5425  ){
5426  __modhiggsjj_MOD_evalamp_sbfh_unsymm_sa_select_exact(p4, &isel, &jsel, &ssel, &rsel, &msq_tmp);
5427  MatElsq[jsel+5][isel+5] += msq_tmp; // Assign only those that match gen. info, if present at all.
5428  if (verbosity >= TVar::DEBUG_VERBOSE) MELAout << "Channel (isel, jsel, rsel, ssel)=" << isel << ", " << jsel << ", " << ssel << ", " << rsel << '\t' << msq_tmp << endl;
5429  }
5430  }
5431  } // End unswapped isel>=jsel cases
5432 
5433  if (isel==jsel) continue;
5434  isel = ijsel[ic][1];
5435  jsel = ijsel[ic][0];
5436 
5437  if (verbosity >= TVar::DEBUG_VERBOSE) MELAout << "HJJ mother swapped case" << endl;
5438  // Reset to default assignments
5439  rsel=isel;
5440  ssel=jsel;
5441 
5442  if (
5443  (partonIsUnknown[0] || ((PDGHelpers::isAGluon(MYIDUP_tmp[0]) && isel==0) || MYIDUP_tmp[0]==isel))
5444  &&
5445  (partonIsUnknown[1] || ((PDGHelpers::isAGluon(MYIDUP_tmp[1]) && jsel==0) || MYIDUP_tmp[1]==jsel))
5446  ){
5447  // isel==jsel==0 is already eliminated by isel!=jsel condition
5448  if (isel==0 || jsel==0){ // qg/qbg/gq/gqb->qg/qbg/gq/gqb
5449  if (
5450  (partonIsUnknown[2] || ((PDGHelpers::isAGluon(MYIDUP_tmp[2]) && rsel==0) || MYIDUP_tmp[2]==rsel))
5451  &&
5452  (partonIsUnknown[3] || ((PDGHelpers::isAGluon(MYIDUP_tmp[3]) && ssel==0) || MYIDUP_tmp[3]==ssel))
5453  ){
5454  __modhiggsjj_MOD_evalamp_sbfh_unsymm_sa_select_exact(p4, &isel, &jsel, &rsel, &ssel, &msq_tmp);
5455  MatElsq[jsel+5][isel+5] += msq_tmp; // Assign only those that match gen. info, if present at all.
5456  if (verbosity >= TVar::DEBUG_VERBOSE) MELAout << "Channel (isel, jsel, rsel, ssel)=" << isel << ", " << jsel << ", " << rsel << ", " << ssel << '\t' << msq_tmp << endl;
5457  }
5458  if (
5459  (partonIsUnknown[2] || ((PDGHelpers::isAGluon(MYIDUP_tmp[2]) && ssel==0) || MYIDUP_tmp[2]==ssel))
5460  &&
5461  (partonIsUnknown[3] || ((PDGHelpers::isAGluon(MYIDUP_tmp[3]) && rsel==0) || MYIDUP_tmp[3]==rsel))
5462  ){
5463  __modhiggsjj_MOD_evalamp_sbfh_unsymm_sa_select_exact(p4, &isel, &jsel, &ssel, &rsel, &msq_tmp);
5464  MatElsq[jsel+5][isel+5] += msq_tmp; // Assign only those that match gen. info, if present at all.
5465  if (verbosity >= TVar::DEBUG_VERBOSE) MELAout << "Channel (isel, jsel, rsel, ssel)=" << isel << ", " << jsel << ", " << ssel << ", " << rsel << '\t' << msq_tmp << endl;
5466  }
5467  }
5468  else if ((isel>0 && jsel<0) || (isel<0 && jsel>0)){ // qQb/qbQ->?
5469  if (code==1 && isel==-jsel){ // qqb/qbq->gg
5470  rsel=0; ssel=0;
5471  if (
5472  (partonIsUnknown[2] || PDGHelpers::isAGluon(MYIDUP_tmp[2]))
5473  &&
5474  (partonIsUnknown[3] || PDGHelpers::isAGluon(MYIDUP_tmp[3]))
5475  ){
5476  __modhiggsjj_MOD_evalamp_sbfh_unsymm_sa_select_exact(p4, &isel, &jsel, &rsel, &ssel, &msq_tmp);
5477  MatElsq[jsel+5][isel+5] += msq_tmp; // Assign only those that match gen. info, if present at all.
5478  if (verbosity >= TVar::DEBUG_VERBOSE) MELAout << "Channel (isel, jsel, rsel, ssel)=" << isel << ", " << jsel << ", " << rsel << ", " << ssel << '\t' << msq_tmp << endl;
5479  }
5480  }
5481  else if(code==3 && isel==-jsel){ // qqb->QQb
5482  if (abs(isel)!=1){ rsel=1; ssel=-1; } // Make sure rsel, ssel are not of same flavor as isel, jsel
5483  else{ rsel=2; ssel=-2; }
5484  // The amplitude is aready multiplied by nf-1, so no need to calculate everything (nf-1) times.
5485  if (
5486  (partonIsUnknown[2] && partonIsUnknown[3])
5487  ||
5488  (partonIsUnknown[2] && std::abs(MYIDUP_tmp[3])!=std::abs(isel) && MYIDUP_tmp[3]<0)
5489  ||
5490  (std::abs(MYIDUP_tmp[2])!=std::abs(isel) && MYIDUP_tmp[2]>0 && partonIsUnknown[3])
5491  ||
5492  (std::abs(MYIDUP_tmp[2])!=std::abs(isel) && MYIDUP_tmp[2]==-MYIDUP_tmp[3] && MYIDUP_tmp[2]>0)
5493  ){
5494  __modhiggsjj_MOD_evalamp_sbfh_unsymm_sa_select_exact(p4, &isel, &jsel, &rsel, &ssel, &msq_tmp);
5495  MatElsq[jsel+5][isel+5] += msq_tmp; // Assign only those that match gen. info, if present at all.
5496  if (verbosity >= TVar::DEBUG_VERBOSE) MELAout << "Channel (isel, jsel, rsel, ssel)=" << isel << ", " << jsel << ", " << rsel << ", " << ssel << '\t' << msq_tmp << endl;
5497  }
5498  if (
5499  (partonIsUnknown[2] && partonIsUnknown[3])
5500  ||
5501  (partonIsUnknown[2] && std::abs(MYIDUP_tmp[3])!=std::abs(isel) && MYIDUP_tmp[3]>0)
5502  ||
5503  (std::abs(MYIDUP_tmp[2])!=std::abs(isel) && MYIDUP_tmp[2]<0 && partonIsUnknown[3])
5504  ||
5505  (std::abs(MYIDUP_tmp[2])!=std::abs(isel) && MYIDUP_tmp[2]==-MYIDUP_tmp[3] && MYIDUP_tmp[2]<0)
5506  ){
5507  __modhiggsjj_MOD_evalamp_sbfh_unsymm_sa_select_exact(p4, &isel, &jsel, &ssel, &rsel, &msq_tmp);
5508  MatElsq[jsel+5][isel+5] += msq_tmp; // Assign only those that match gen. info, if present at all.
5509  if (verbosity >= TVar::DEBUG_VERBOSE) MELAout << "Channel (isel, jsel, rsel, ssel)=" << isel << ", " << jsel << ", " << ssel << ", " << rsel << '\t' << msq_tmp << endl;
5510  }
5511  }
5512  else{ // qQb/qbQ->qQb/qbQ
5513  if (
5514  (partonIsUnknown[2] || MYIDUP_tmp[2]==rsel)
5515  &&
5516  (partonIsUnknown[3] || MYIDUP_tmp[3]==ssel)
5517  ){
5518  __modhiggsjj_MOD_evalamp_sbfh_unsymm_sa_select_exact(p4, &isel, &jsel, &rsel, &ssel, &msq_tmp);
5519  MatElsq[jsel+5][isel+5] += msq_tmp; // Assign only those that match gen. info, if present at all.
5520  if (verbosity >= TVar::DEBUG_VERBOSE) MELAout << "Channel (isel, jsel, rsel, ssel)=" << isel << ", " << jsel << ", " << rsel << ", " << ssel << '\t' << msq_tmp << endl;
5521  }
5522  if (
5523  (partonIsUnknown[2] || MYIDUP_tmp[2]==ssel)
5524  &&
5525  (partonIsUnknown[3] || MYIDUP_tmp[3]==rsel)
5526  ){
5527  __modhiggsjj_MOD_evalamp_sbfh_unsymm_sa_select_exact(p4, &isel, &jsel, &ssel, &rsel, &msq_tmp);
5528  MatElsq[jsel+5][isel+5] += msq_tmp; // Assign only those that match gen. info, if present at all.
5529  if (verbosity >= TVar::DEBUG_VERBOSE) MELAout << "Channel (isel, jsel, rsel, ssel)=" << isel << ", " << jsel << ", " << ssel << ", " << rsel << '\t' << msq_tmp << endl;
5530  }
5531  }
5532  }
5533  else{
5534  if (
5535  (partonIsUnknown[2] || MYIDUP_tmp[2]==rsel)
5536  &&
5537  (partonIsUnknown[3] || MYIDUP_tmp[3]==ssel)
5538  ){
5539  __modhiggsjj_MOD_evalamp_sbfh_unsymm_sa_select_exact(p4, &isel, &jsel, &rsel, &ssel, &msq_tmp);
5540  MatElsq[jsel+5][isel+5] += msq_tmp; // Assign only those that match gen. info, if present at all.
5541  if (verbosity >= TVar::DEBUG_VERBOSE) MELAout << "Channel (isel, jsel, rsel, ssel)=" << isel << ", " << jsel << ", " << rsel << ", " << ssel << '\t' << msq_tmp << endl;
5542  }
5543  if (
5544  rsel!=ssel
5545  &&
5546  (partonIsUnknown[2] || MYIDUP_tmp[2]==ssel)
5547  &&
5548  (partonIsUnknown[3] || MYIDUP_tmp[3]==rsel)
5549  ){
5550  __modhiggsjj_MOD_evalamp_sbfh_unsymm_sa_select_exact(p4, &isel, &jsel, &ssel, &rsel, &msq_tmp);
5551  MatElsq[jsel+5][isel+5] += msq_tmp; // Assign only those that match gen. info, if present at all.
5552  if (verbosity >= TVar::DEBUG_VERBOSE) MELAout << "Channel (isel, jsel, rsel, ssel)=" << isel << ", " << jsel << ", " << ssel << ", " << rsel << '\t' << msq_tmp << endl;
5553  }
5554  }
5555  } // End swapped isel<jsel cases
5556  } // End loop over ic<nijchannels
5557  } // End production == TVar::JJQCD
5558  else if (production == TVar::JJVBF){
5559  int isel, jsel, rsel, ssel;
5560  /*
5561  1234/1243 [0] vs [1] correspond to transposing 12 and 34 at the same time.
5562  Eg. 12->34 == udbar->udbar
5563  1234[0] : 1=u, 2=dbar, 3=u, 4=dbar
5564  1243[0] : 1=u, 2=dbar, 4=u, 3=dbar
5565  1234[1] : 2=u, 1=dbar, 4=u, 3=dbar
5566  1243[1] : 2=u, 1=dbar, 3=u, 4=dbar
5567  */
5568  double ckm_takeout=1;
5569  double msq_uu_zz_ijrs1234[2]={ 0 };
5570  double msq_uu_zz_ijrs1243[2]={ 0 };
5571  double msq_dd_zz_ijrs1234[2]={ 0 };
5572  double msq_dd_zz_ijrs1243[2]={ 0 };
5573  double msq_ubarubar_zz_ijrs1234[2]={ 0 };
5574  double msq_ubarubar_zz_ijrs1243[2]={ 0 };
5575  double msq_dbardbar_zz_ijrs1234[2]={ 0 };
5576  double msq_dbardbar_zz_ijrs1243[2]={ 0 };
5577  double msq_uu_zzid_ijrs1234[2]={ 0 };
5578  double msq_uu_zzid_ijrs1243[2]={ 0 };
5579  double msq_dd_zzid_ijrs1234[2]={ 0 };
5580  double msq_dd_zzid_ijrs1243[2]={ 0 };
5581  double msq_ubarubar_zzid_ijrs1234[2]={ 0 };
5582  double msq_ubarubar_zzid_ijrs1243[2]={ 0 };
5583  double msq_dbardbar_zzid_ijrs1234[2]={ 0 };
5584  double msq_dbardbar_zzid_ijrs1243[2]={ 0 };
5585  double msq_udbar_zz_ijrs1234[2]={ 0 };
5586  double msq_udbar_zz_ijrs1243[2]={ 0 };
5587  double msq_dubar_zz_ijrs1234[2]={ 0 };
5588  double msq_dubar_zz_ijrs1243[2]={ 0 };
5589 
5590  double msq_uubar_zz_ijrs1234[2]={ 0 };
5591  double msq_uubar_zz_ijrs1243[2]={ 0 };
5592  double msq_ddbar_zz_ijrs1234[2]={ 0 };
5593  double msq_ddbar_zz_ijrs1243[2]={ 0 };
5594  double msq_uubar_ww_ijrs1234[2]={ 0 };
5595  double msq_uubar_ww_ijrs1243[2]={ 0 };
5596  double msq_ddbar_ww_ijrs1234[2]={ 0 };
5597  double msq_ddbar_ww_ijrs1243[2]={ 0 };
5598 
5599  double msq_ud_wwonly_ijrs1234[2]={ 0 };
5600  double msq_ud_wwonly_ijrs1243[2]={ 0 };
5601  double msq_ubardbar_wwonly_ijrs1234[2]={ 0 };
5602  double msq_ubardbar_wwonly_ijrs1243[2]={ 0 };
5603  // ud, ubardbar ZZ(+)WW case to be added separately inside a loop.
5604 
5605  // NOTE: The order should be u>c>d>s>b; particle>antiparticle
5606  if (
5607  (partonIsUnknown[0] || (PDGHelpers::isUpTypeQuark(MYIDUP_tmp[0]) && MYIDUP_tmp[0]>0))
5608  &&
5609  (partonIsUnknown[1] || (PDGHelpers::isUpTypeQuark(MYIDUP_tmp[1]) && MYIDUP_tmp[1]>0))
5610  &&
5611  (partonIsUnknown[2] || (PDGHelpers::isUpTypeQuark(MYIDUP_tmp[2]) && MYIDUP_tmp[2]>0))
5612  &&
5613  (partonIsUnknown[3] || (PDGHelpers::isUpTypeQuark(MYIDUP_tmp[3]) && MYIDUP_tmp[3]>0))
5614  ){
5615  isel=2; jsel=4; // uu'->(ZZ)->uu'
5616  rsel=isel; ssel=jsel;
5617  __modhiggsjj_MOD_evalamp_wbfh_unsymm_sa_select_exact(p4, &isel, &jsel, &rsel, &ssel, &(msq_uu_zz_ijrs1234[0]));
5618  __modhiggsjj_MOD_evalamp_wbfh_unsymm_sa_select_exact(p4, &isel, &jsel, &ssel, &rsel, &(msq_uu_zz_ijrs1243[0]));
5619  // Swapping i/j vs r/s makes no physical difference here.
5620  msq_uu_zz_ijrs1234[1] = msq_uu_zz_ijrs1234[0];
5621  msq_uu_zz_ijrs1243[1] = msq_uu_zz_ijrs1243[0];
5622 
5623  isel=2; jsel=2; // uu->(ZZ)->uu
5624  rsel=isel; ssel=jsel;
5625  __modhiggsjj_MOD_evalamp_wbfh_unsymm_sa_select_exact(p4, &isel, &jsel, &rsel, &ssel, &(msq_uu_zzid_ijrs1234[0]));
5626  __modhiggsjj_MOD_evalamp_wbfh_unsymm_sa_select_exact(p4, &isel, &jsel, &ssel, &rsel, &(msq_uu_zzid_ijrs1243[0]));
5627  // Swapping i/j vs r/s makes no physical difference here.
5628  msq_uu_zzid_ijrs1234[1] = msq_uu_zzid_ijrs1234[0];
5629  msq_uu_zzid_ijrs1243[1] = msq_uu_zzid_ijrs1243[0];
5630  }
5631 
5632  if (
5633  (partonIsUnknown[0] || (PDGHelpers::isDownTypeQuark(MYIDUP_tmp[0]) && MYIDUP_tmp[0]>0))
5634  &&
5635  (partonIsUnknown[1] || (PDGHelpers::isDownTypeQuark(MYIDUP_tmp[1]) && MYIDUP_tmp[1]>0))
5636  &&
5637  (partonIsUnknown[2] || (PDGHelpers::isDownTypeQuark(MYIDUP_tmp[2]) && MYIDUP_tmp[2]>0))
5638  &&
5639  (partonIsUnknown[3] || (PDGHelpers::isDownTypeQuark(MYIDUP_tmp[3]) && MYIDUP_tmp[3]>0))
5640  ){
5641  isel=1; jsel=3; // dd'->(ZZ)->dd'
5642  rsel=isel; ssel=jsel;
5643  __modhiggsjj_MOD_evalamp_wbfh_unsymm_sa_select_exact(p4, &isel, &jsel, &rsel, &ssel, &(msq_dd_zz_ijrs1234[0]));
5644  __modhiggsjj_MOD_evalamp_wbfh_unsymm_sa_select_exact(p4, &isel, &jsel, &ssel, &rsel, &(msq_dd_zz_ijrs1243[0]));
5645  // Swapping i/j vs r/s makes no physical difference here.
5646  msq_dd_zz_ijrs1234[1] = msq_dd_zz_ijrs1234[0];
5647  msq_dd_zz_ijrs1243[1] = msq_dd_zz_ijrs1243[0];
5648 
5649  isel=1; jsel=1; // dd->(ZZ)->dd
5650  rsel=isel; ssel=jsel;
5651  __modhiggsjj_MOD_evalamp_wbfh_unsymm_sa_select_exact(p4, &isel, &jsel, &rsel, &ssel, &(msq_dd_zzid_ijrs1234[0]));
5652  __modhiggsjj_MOD_evalamp_wbfh_unsymm_sa_select_exact(p4, &isel, &jsel, &ssel, &rsel, &(msq_dd_zzid_ijrs1243[0]));
5653  // Swapping i/j vs r/s makes no physical difference here.
5654  msq_dd_zzid_ijrs1234[1] = msq_dd_zzid_ijrs1234[0];
5655  msq_dd_zzid_ijrs1243[1] = msq_dd_zzid_ijrs1243[0];
5656  }
5657 
5658  if (
5659  (partonIsUnknown[0] || (PDGHelpers::isUpTypeQuark(MYIDUP_tmp[0]) && MYIDUP_tmp[0]<0))
5660  &&
5661  (partonIsUnknown[1] || (PDGHelpers::isUpTypeQuark(MYIDUP_tmp[1]) && MYIDUP_tmp[1]<0))
5662  &&
5663  (partonIsUnknown[2] || (PDGHelpers::isUpTypeQuark(MYIDUP_tmp[2]) && MYIDUP_tmp[2]<0))
5664  &&
5665  (partonIsUnknown[3] || (PDGHelpers::isUpTypeQuark(MYIDUP_tmp[3]) && MYIDUP_tmp[3]<0))
5666  ){
5667  isel=-2; jsel=-4; // ubarubar'->(ZZ)->ubarubar'
5668  rsel=isel; ssel=jsel;
5669  __modhiggsjj_MOD_evalamp_wbfh_unsymm_sa_select_exact(p4, &isel, &jsel, &rsel, &ssel, &(msq_ubarubar_zz_ijrs1234[0]));
5670  __modhiggsjj_MOD_evalamp_wbfh_unsymm_sa_select_exact(p4, &isel, &jsel, &ssel, &rsel, &(msq_ubarubar_zz_ijrs1243[0]));
5671  // Swapping i/j vs r/s makes no physical difference here.
5672  msq_ubarubar_zz_ijrs1234[1] = msq_ubarubar_zz_ijrs1234[0];
5673  msq_ubarubar_zz_ijrs1243[1] = msq_ubarubar_zz_ijrs1243[0];
5674 
5675  isel=-2; jsel=-2; // ubarubar->(ZZ)->ubarubar
5676  rsel=isel; ssel=jsel;
5677  __modhiggsjj_MOD_evalamp_wbfh_unsymm_sa_select_exact(p4, &isel, &jsel, &rsel, &ssel, &(msq_ubarubar_zzid_ijrs1234[0]));
5678  __modhiggsjj_MOD_evalamp_wbfh_unsymm_sa_select_exact(p4, &isel, &jsel, &ssel, &rsel, &(msq_ubarubar_zzid_ijrs1243[0]));
5679  // Swapping i/j vs r/s makes no physical difference here.
5680  msq_ubarubar_zzid_ijrs1234[1] = msq_ubarubar_zzid_ijrs1234[0];
5681  msq_ubarubar_zzid_ijrs1243[1] = msq_ubarubar_zzid_ijrs1243[0];
5682  }
5683 
5684  if (
5685  (partonIsUnknown[0] || (PDGHelpers::isDownTypeQuark(MYIDUP_tmp[0]) && MYIDUP_tmp[0]<0))
5686  &&
5687  (partonIsUnknown[1] || (PDGHelpers::isDownTypeQuark(MYIDUP_tmp[1]) && MYIDUP_tmp[1]<0))
5688  &&
5689  (partonIsUnknown[2] || (PDGHelpers::isDownTypeQuark(MYIDUP_tmp[2]) && MYIDUP_tmp[2]<0))
5690  &&
5691  (partonIsUnknown[3] || (PDGHelpers::isDownTypeQuark(MYIDUP_tmp[3]) && MYIDUP_tmp[3]<0))
5692  ){
5693  isel=-1; jsel=-3; // dbardbar'->(ZZ)->dbardbar'
5694  rsel=isel; ssel=jsel;
5695  __modhiggsjj_MOD_evalamp_wbfh_unsymm_sa_select_exact(p4, &isel, &jsel, &rsel, &ssel, &(msq_dbardbar_zz_ijrs1234[0]));
5696  __modhiggsjj_MOD_evalamp_wbfh_unsymm_sa_select_exact(p4, &isel, &jsel, &ssel, &rsel, &(msq_dbardbar_zz_ijrs1243[0]));
5697  // Swapping i/j vs r/s makes no physical difference here.
5698  msq_dbardbar_zz_ijrs1234[1] = msq_dbardbar_zz_ijrs1234[0];
5699  msq_dbardbar_zz_ijrs1243[1] = msq_dbardbar_zz_ijrs1243[0];
5700 
5701  isel=-1; jsel=-1; // dbardbar->(ZZ)->dbardbar
5702  rsel=isel; ssel=jsel;
5703  __modhiggsjj_MOD_evalamp_wbfh_unsymm_sa_select_exact(p4, &isel, &jsel, &rsel, &ssel, &(msq_dbardbar_zzid_ijrs1234[0]));
5704  __modhiggsjj_MOD_evalamp_wbfh_unsymm_sa_select_exact(p4, &isel, &jsel, &ssel, &rsel, &(msq_dbardbar_zzid_ijrs1243[0]));
5705  // Swapping i/j vs r/s makes no physical difference here.
5706  msq_dbardbar_zzid_ijrs1234[1] = msq_dbardbar_zzid_ijrs1234[0];
5707  msq_dbardbar_zzid_ijrs1243[1] = msq_dbardbar_zzid_ijrs1243[0];
5708  }
5709 
5710  if (
5711  (
5712  (partonIsUnknown[0] && partonIsUnknown[1])
5713  ||
5714  (
5715  (PDGHelpers::isUpTypeQuark(MYIDUP_tmp[0]) && MYIDUP_tmp[0]>0 && PDGHelpers::isDownTypeQuark(MYIDUP_tmp[1]) && MYIDUP_tmp[1]<0)
5716  ||
5717  (PDGHelpers::isUpTypeQuark(MYIDUP_tmp[1]) && MYIDUP_tmp[1]>0 && PDGHelpers::isDownTypeQuark(MYIDUP_tmp[0]) && MYIDUP_tmp[0]<0)
5718  )
5719  ||
5720  (partonIsUnknown[0] && ((PDGHelpers::isUpTypeQuark(MYIDUP_tmp[1]) && MYIDUP_tmp[1]>0) || (PDGHelpers::isDownTypeQuark(MYIDUP_tmp[1]) && MYIDUP_tmp[1]<0)))
5721  ||
5722  (partonIsUnknown[1] && ((PDGHelpers::isUpTypeQuark(MYIDUP_tmp[0]) && MYIDUP_tmp[0]>0) || (PDGHelpers::isDownTypeQuark(MYIDUP_tmp[0]) && MYIDUP_tmp[0]<0)))
5723  )
5724  &&
5725  (
5726  (partonIsUnknown[2] && partonIsUnknown[3])
5727  ||
5728  (
5729  (PDGHelpers::isUpTypeQuark(MYIDUP_tmp[2]) && MYIDUP_tmp[2]>0 && PDGHelpers::isDownTypeQuark(MYIDUP_tmp[3]) && MYIDUP_tmp[3]<0)
5730  ||
5731  (PDGHelpers::isUpTypeQuark(MYIDUP_tmp[3]) && MYIDUP_tmp[3]>0 && PDGHelpers::isDownTypeQuark(MYIDUP_tmp[2]) && MYIDUP_tmp[2]<0)
5732  )
5733  ||
5734  (partonIsUnknown[2] && ((PDGHelpers::isUpTypeQuark(MYIDUP_tmp[3]) && MYIDUP_tmp[3]>0) || (PDGHelpers::isDownTypeQuark(MYIDUP_tmp[3]) && MYIDUP_tmp[3]<0)))
5735  ||
5736  (partonIsUnknown[3] && ((PDGHelpers::isUpTypeQuark(MYIDUP_tmp[2]) && MYIDUP_tmp[2]>0) || (PDGHelpers::isDownTypeQuark(MYIDUP_tmp[2]) && MYIDUP_tmp[2]<0)))
5737  )
5738  ){
5739  isel=2; jsel=-1; // udbar->(ZZ)->udbar
5740  rsel=isel; ssel=jsel;
5741  __modhiggsjj_MOD_evalamp_wbfh_unsymm_sa_select_exact(p4, &isel, &jsel, &rsel, &ssel, &(msq_udbar_zz_ijrs1234[0]));
5742  __modhiggsjj_MOD_evalamp_wbfh_unsymm_sa_select_exact(p4, &isel, &jsel, &ssel, &rsel, &(msq_udbar_zz_ijrs1243[0]));
5743  __modhiggsjj_MOD_evalamp_wbfh_unsymm_sa_select_exact(p4, &jsel, &isel, &ssel, &rsel, &(msq_udbar_zz_ijrs1234[1]));
5744  __modhiggsjj_MOD_evalamp_wbfh_unsymm_sa_select_exact(p4, &jsel, &isel, &rsel, &ssel, &(msq_udbar_zz_ijrs1243[1]));
5745  }
5746 
5747  if (
5748  (
5749  (partonIsUnknown[0] && partonIsUnknown[1])
5750  ||
5751  (
5752  (PDGHelpers::isUpTypeQuark(MYIDUP_tmp[0]) && MYIDUP_tmp[0]<0 && PDGHelpers::isDownTypeQuark(MYIDUP_tmp[1]) && MYIDUP_tmp[1]>0)
5753  ||
5754  (PDGHelpers::isUpTypeQuark(MYIDUP_tmp[1]) && MYIDUP_tmp[1]<0 && PDGHelpers::isDownTypeQuark(MYIDUP_tmp[0]) && MYIDUP_tmp[0]>0)
5755  )
5756  ||
5757  (partonIsUnknown[0] && ((PDGHelpers::isUpTypeQuark(MYIDUP_tmp[1]) && MYIDUP_tmp[1]<0) || (PDGHelpers::isDownTypeQuark(MYIDUP_tmp[1]) && MYIDUP_tmp[1]>0)))
5758  ||
5759  (partonIsUnknown[1] && ((PDGHelpers::isUpTypeQuark(MYIDUP_tmp[0]) && MYIDUP_tmp[0]<0) || (PDGHelpers::isDownTypeQuark(MYIDUP_tmp[0]) && MYIDUP_tmp[0]>0)))
5760  )
5761  &&
5762  (
5763  (partonIsUnknown[2] && partonIsUnknown[3])
5764  ||
5765  (
5766  (PDGHelpers::isUpTypeQuark(MYIDUP_tmp[2]) && MYIDUP_tmp[2]<0 && PDGHelpers::isDownTypeQuark(MYIDUP_tmp[3]) && MYIDUP_tmp[3]>0)
5767  ||
5768  (PDGHelpers::isUpTypeQuark(MYIDUP_tmp[3]) && MYIDUP_tmp[3]<0 && PDGHelpers::isDownTypeQuark(MYIDUP_tmp[2]) && MYIDUP_tmp[2]>0)
5769  )
5770  ||
5771  (partonIsUnknown[2] && ((PDGHelpers::isUpTypeQuark(MYIDUP_tmp[3]) && MYIDUP_tmp[3]<0) || (PDGHelpers::isDownTypeQuark(MYIDUP_tmp[3]) && MYIDUP_tmp[3]>0)))
5772  ||
5773  (partonIsUnknown[3] && ((PDGHelpers::isUpTypeQuark(MYIDUP_tmp[2]) && MYIDUP_tmp[2]<0) || (PDGHelpers::isDownTypeQuark(MYIDUP_tmp[2]) && MYIDUP_tmp[2]>0)))
5774  )
5775  ){
5776  isel=1; jsel=-2; // dubar->(ZZ)->dubar
5777  rsel=isel; ssel=jsel;
5778  __modhiggsjj_MOD_evalamp_wbfh_unsymm_sa_select_exact(p4, &isel, &jsel, &rsel, &ssel, &(msq_dubar_zz_ijrs1234[0]));
5779  __modhiggsjj_MOD_evalamp_wbfh_unsymm_sa_select_exact(p4, &isel, &jsel, &ssel, &rsel, &(msq_dubar_zz_ijrs1243[0]));
5780  __modhiggsjj_MOD_evalamp_wbfh_unsymm_sa_select_exact(p4, &jsel, &isel, &ssel, &rsel, &(msq_dubar_zz_ijrs1234[1]));
5781  __modhiggsjj_MOD_evalamp_wbfh_unsymm_sa_select_exact(p4, &jsel, &isel, &rsel, &ssel, &(msq_dubar_zz_ijrs1243[1]));
5782  }
5783 
5784  if (
5785  (partonIsUnknown[0] && partonIsUnknown[1])
5786  ||
5787  (PDGHelpers::isUpTypeQuark(MYIDUP_tmp[0]) && PDGHelpers::isUpTypeQuark(MYIDUP_tmp[1]) && MYIDUP_tmp[0]*MYIDUP_tmp[1]<0)
5788  ||
5789  (partonIsUnknown[0] && PDGHelpers::isUpTypeQuark(MYIDUP_tmp[1]))
5790  ||
5791  (partonIsUnknown[1] && PDGHelpers::isUpTypeQuark(MYIDUP_tmp[0]))
5792  ){
5793  isel=2; jsel=-2; // uubar->(ZZ)->uubar
5794  if (
5795  (partonIsUnknown[2] && partonIsUnknown[3])
5796  ||
5797  (PDGHelpers::isUpTypeQuark(MYIDUP_tmp[2]) && PDGHelpers::isUpTypeQuark(MYIDUP_tmp[3]) && MYIDUP_tmp[2]*MYIDUP_tmp[3]<0)
5798  ||
5799  (partonIsUnknown[2] && PDGHelpers::isUpTypeQuark(MYIDUP_tmp[3]))
5800  ||
5801  (partonIsUnknown[3] && PDGHelpers::isUpTypeQuark(MYIDUP_tmp[2]))
5802  ){
5803  rsel=isel; ssel=jsel; // uubar->(ZZ)->uubar
5804  __modhiggsjj_MOD_evalamp_wbfh_unsymm_sa_select_exact(p4, &isel, &jsel, &rsel, &ssel, &(msq_uubar_zz_ijrs1234[0]));
5805  __modhiggsjj_MOD_evalamp_wbfh_unsymm_sa_select_exact(p4, &isel, &jsel, &ssel, &rsel, &(msq_uubar_zz_ijrs1243[0]));
5806  __modhiggsjj_MOD_evalamp_wbfh_unsymm_sa_select_exact(p4, &jsel, &isel, &ssel, &rsel, &(msq_uubar_zz_ijrs1234[1]));
5807  __modhiggsjj_MOD_evalamp_wbfh_unsymm_sa_select_exact(p4, &jsel, &isel, &rsel, &ssel, &(msq_uubar_zz_ijrs1243[1]));
5808  }
5809  if (
5810  (partonIsUnknown[2] && partonIsUnknown[3])
5811  ||
5812  (PDGHelpers::isDownTypeQuark(MYIDUP_tmp[2]) && PDGHelpers::isDownTypeQuark(MYIDUP_tmp[3]) && MYIDUP_tmp[2]*MYIDUP_tmp[3]<0)
5813  ||
5814  (partonIsUnknown[2] && PDGHelpers::isDownTypeQuark(MYIDUP_tmp[3]))
5815  ||
5816  (partonIsUnknown[3] && PDGHelpers::isDownTypeQuark(MYIDUP_tmp[2]))
5817  ){
5818  rsel=-1; ssel=1; // uubar->(WW)->ddbar
5819  double ckm_ir = 0.;
5820  double ckm_js = 0.;
5821  while (ckm_ir==0.){
5822  rsel += 2;
5823  ssel -= 2;
5824  if (abs(rsel)>=6){
5825  rsel=-1; ssel=1;
5826  isel+=2; jsel-=2;
5827  continue;
5828  }
5829  if (abs(isel)>=6) break;
5830  ckm_ir = __modparameters_MOD_ckmbare(&isel, &rsel);
5831  ckm_js = __modparameters_MOD_ckmbare(&jsel, &ssel);
5832  }
5833  if (ckm_ir!=0.){
5834  __modhiggsjj_MOD_evalamp_wbfh_unsymm_sa_select_exact(p4, &isel, &jsel, &rsel, &ssel, &(msq_uubar_ww_ijrs1234[0]));
5835  __modhiggsjj_MOD_evalamp_wbfh_unsymm_sa_select_exact(p4, &isel, &jsel, &ssel, &rsel, &(msq_uubar_ww_ijrs1243[0]));
5836  __modhiggsjj_MOD_evalamp_wbfh_unsymm_sa_select_exact(p4, &jsel, &isel, &ssel, &rsel, &(msq_uubar_ww_ijrs1234[1]));
5837  __modhiggsjj_MOD_evalamp_wbfh_unsymm_sa_select_exact(p4, &jsel, &isel, &rsel, &ssel, &(msq_uubar_ww_ijrs1243[1]));
5838  ckm_takeout = pow(ckm_ir*ckm_js, 2);
5839  for (unsigned int iswap=0; iswap<2; iswap++){
5840  msq_uubar_ww_ijrs1234[iswap] /= ckm_takeout;
5841  msq_uubar_ww_ijrs1243[iswap] /= ckm_takeout;
5842  }
5843  }
5844  }
5845  }
5846 
5847  if (
5848  (partonIsUnknown[0] && partonIsUnknown[1])
5849  ||
5850  (PDGHelpers::isDownTypeQuark(MYIDUP_tmp[0]) && PDGHelpers::isDownTypeQuark(MYIDUP_tmp[1]) && MYIDUP_tmp[0]*MYIDUP_tmp[1]<0)
5851  ||
5852  (partonIsUnknown[0] && PDGHelpers::isDownTypeQuark(MYIDUP_tmp[1]))
5853  ||
5854  (partonIsUnknown[1] && PDGHelpers::isDownTypeQuark(MYIDUP_tmp[0]))
5855  ){
5856  isel=1; jsel=-1;
5857  if (
5858  (partonIsUnknown[2] && partonIsUnknown[3])
5859  ||
5860  (PDGHelpers::isDownTypeQuark(MYIDUP_tmp[2]) && PDGHelpers::isDownTypeQuark(MYIDUP_tmp[3]) && MYIDUP_tmp[2]*MYIDUP_tmp[3]<0)
5861  ||
5862  (partonIsUnknown[2] && PDGHelpers::isDownTypeQuark(MYIDUP_tmp[3]))
5863  ||
5864  (partonIsUnknown[3] && PDGHelpers::isDownTypeQuark(MYIDUP_tmp[2]))
5865  ){
5866  rsel=isel; ssel=jsel; // ddbar->(ZZ)->ddbar
5867  __modhiggsjj_MOD_evalamp_wbfh_unsymm_sa_select_exact(p4, &isel, &jsel, &rsel, &ssel, &(msq_ddbar_zz_ijrs1234[0]));
5868  __modhiggsjj_MOD_evalamp_wbfh_unsymm_sa_select_exact(p4, &isel, &jsel, &ssel, &rsel, &(msq_ddbar_zz_ijrs1243[0]));
5869  __modhiggsjj_MOD_evalamp_wbfh_unsymm_sa_select_exact(p4, &jsel, &isel, &ssel, &rsel, &(msq_ddbar_zz_ijrs1234[1]));
5870  __modhiggsjj_MOD_evalamp_wbfh_unsymm_sa_select_exact(p4, &jsel, &isel, &rsel, &ssel, &(msq_ddbar_zz_ijrs1243[1]));
5871  }
5872  if (
5873  (partonIsUnknown[2] && partonIsUnknown[3])
5874  ||
5875  (PDGHelpers::isUpTypeQuark(MYIDUP_tmp[2]) && PDGHelpers::isUpTypeQuark(MYIDUP_tmp[3]) && MYIDUP_tmp[2]*MYIDUP_tmp[3]<0)
5876  ||
5877  (partonIsUnknown[2] && PDGHelpers::isUpTypeQuark(MYIDUP_tmp[3]))
5878  ||
5879  (partonIsUnknown[3] && PDGHelpers::isUpTypeQuark(MYIDUP_tmp[2]))
5880  ){
5881  rsel=0; ssel=0; // ddbar->(WW)->uubar
5882  double ckm_ir = 0.;
5883  double ckm_js = 0.;
5884  while (ckm_ir==0.){
5885  rsel += 2;
5886  ssel -= 2;
5887  if (abs(rsel)>=6){
5888  rsel=0; ssel=0;
5889  isel+=2; jsel-=2;
5890  continue;
5891  }
5892  if (abs(isel)>=6) break;
5893  ckm_ir = __modparameters_MOD_ckmbare(&isel, &rsel);
5894  ckm_js = __modparameters_MOD_ckmbare(&jsel, &ssel);
5895  }
5896  if (ckm_ir!=0.){
5897  __modhiggsjj_MOD_evalamp_wbfh_unsymm_sa_select_exact(p4, &isel, &jsel, &rsel, &ssel, &(msq_ddbar_ww_ijrs1234[0]));
5898  __modhiggsjj_MOD_evalamp_wbfh_unsymm_sa_select_exact(p4, &isel, &jsel, &ssel, &rsel, &(msq_ddbar_ww_ijrs1243[0]));
5899  __modhiggsjj_MOD_evalamp_wbfh_unsymm_sa_select_exact(p4, &jsel, &isel, &ssel, &rsel, &(msq_ddbar_ww_ijrs1234[1]));
5900  __modhiggsjj_MOD_evalamp_wbfh_unsymm_sa_select_exact(p4, &jsel, &isel, &rsel, &ssel, &(msq_ddbar_ww_ijrs1243[1]));
5901  ckm_takeout = pow(ckm_ir*ckm_js, 2);
5902  for (unsigned int iswap=0; iswap<2; iswap++){
5903  msq_ddbar_ww_ijrs1234[iswap] /= ckm_takeout;
5904  msq_ddbar_ww_ijrs1243[iswap] /= ckm_takeout;
5905  }
5906  }
5907  }
5908  }
5909 
5910  if (
5911  (
5912  (partonIsUnknown[0] && partonIsUnknown[1])
5913  ||
5914  (
5915  (PDGHelpers::isUpTypeQuark(MYIDUP_tmp[0]) && MYIDUP_tmp[0]>0 && PDGHelpers::isDownTypeQuark(MYIDUP_tmp[1]) && MYIDUP_tmp[1]>0)
5916  ||
5917  (PDGHelpers::isUpTypeQuark(MYIDUP_tmp[1]) && MYIDUP_tmp[1]>0 && PDGHelpers::isDownTypeQuark(MYIDUP_tmp[0]) && MYIDUP_tmp[0]>0)
5918  )
5919  ||
5920  (partonIsUnknown[0] && ((PDGHelpers::isUpTypeQuark(MYIDUP_tmp[1]) && MYIDUP_tmp[1]>0) || (PDGHelpers::isDownTypeQuark(MYIDUP_tmp[1]) && MYIDUP_tmp[1]>0)))
5921  ||
5922  (partonIsUnknown[1] && ((PDGHelpers::isUpTypeQuark(MYIDUP_tmp[0]) && MYIDUP_tmp[0]>0) || (PDGHelpers::isDownTypeQuark(MYIDUP_tmp[0]) && MYIDUP_tmp[0]>0)))
5923  )
5924  &&
5925  (
5926  (partonIsUnknown[2] && partonIsUnknown[3])
5927  ||
5928  (
5929  (PDGHelpers::isUpTypeQuark(MYIDUP_tmp[2]) && MYIDUP_tmp[2]>0 && PDGHelpers::isDownTypeQuark(MYIDUP_tmp[3]) && MYIDUP_tmp[3]>0)
5930  ||
5931  (PDGHelpers::isUpTypeQuark(MYIDUP_tmp[3]) && MYIDUP_tmp[3]>0 && PDGHelpers::isDownTypeQuark(MYIDUP_tmp[2]) && MYIDUP_tmp[2]>0)
5932  )
5933  ||
5934  (partonIsUnknown[2] && ((PDGHelpers::isUpTypeQuark(MYIDUP_tmp[3]) && MYIDUP_tmp[3]>0) || (PDGHelpers::isDownTypeQuark(MYIDUP_tmp[3]) && MYIDUP_tmp[3]>0)))
5935  ||
5936  (partonIsUnknown[3] && ((PDGHelpers::isUpTypeQuark(MYIDUP_tmp[2]) && MYIDUP_tmp[2]>0) || (PDGHelpers::isDownTypeQuark(MYIDUP_tmp[2]) && MYIDUP_tmp[2]>0)))
5937  )
5938  ){
5939  // ud->(WW)->d'u'
5940  double ckm_ir = 0.;
5941  double ckm_js = 0.;
5942  const unsigned int nCombinations = 6;
5943  int ijrs_arr[nCombinations][4] ={
5944  { 2, 3, 1, 4 },
5945  { 2, 3, 5, 4 },
5946  { 2, 5, 1, 4 },
5947  { 2, 5, 3, 4 },
5948  { 2, 1, 3, 4 },
5949  { 2, 1, 5, 4 }
5950  };
5951  for (unsigned int ijrs=0; ijrs<nCombinations; ijrs++){
5952  isel = ijrs_arr[ijrs][0];
5953  jsel = ijrs_arr[ijrs][1];
5954  rsel = ijrs_arr[ijrs][2];
5955  ssel = ijrs_arr[ijrs][3];
5956  ckm_ir = __modparameters_MOD_ckmbare(&isel, &rsel);
5957  ckm_js = __modparameters_MOD_ckmbare(&jsel, &ssel);
5958  if (ckm_ir!=0. && ckm_js!=0.) break;
5959  }
5960  if (ckm_ir!=0. && ckm_js!=0.){
5961  __modhiggsjj_MOD_evalamp_wbfh_unsymm_sa_select_exact(p4, &isel, &jsel, &rsel, &ssel, &(msq_ud_wwonly_ijrs1234[0]));
5962  __modhiggsjj_MOD_evalamp_wbfh_unsymm_sa_select_exact(p4, &isel, &jsel, &ssel, &rsel, &(msq_ud_wwonly_ijrs1243[0]));
5963  __modhiggsjj_MOD_evalamp_wbfh_unsymm_sa_select_exact(p4, &jsel, &isel, &ssel, &rsel, &(msq_ud_wwonly_ijrs1234[1]));
5964  __modhiggsjj_MOD_evalamp_wbfh_unsymm_sa_select_exact(p4, &jsel, &isel, &rsel, &ssel, &(msq_ud_wwonly_ijrs1243[1]));
5965  ckm_takeout = pow(ckm_ir*ckm_js, 2);
5966  for (unsigned int iswap=0; iswap<2; iswap++){
5967  msq_ud_wwonly_ijrs1234[iswap] /= ckm_takeout;
5968  msq_ud_wwonly_ijrs1243[iswap] /= ckm_takeout;
5969  }
5970  }
5971  }
5972 
5973  if (
5974  (
5975  (partonIsUnknown[0] && partonIsUnknown[1])
5976  ||
5977  (
5978  (PDGHelpers::isUpTypeQuark(MYIDUP_tmp[0]) && MYIDUP_tmp[0]<0 && PDGHelpers::isDownTypeQuark(MYIDUP_tmp[1]) && MYIDUP_tmp[1]<0)
5979  ||
5980  (PDGHelpers::isUpTypeQuark(MYIDUP_tmp[1]) && MYIDUP_tmp[1]<0 && PDGHelpers::isDownTypeQuark(MYIDUP_tmp[0]) && MYIDUP_tmp[0]<0)
5981  )
5982  ||
5983  (partonIsUnknown[0] && ((PDGHelpers::isUpTypeQuark(MYIDUP_tmp[1]) && MYIDUP_tmp[1]<0) || (PDGHelpers::isDownTypeQuark(MYIDUP_tmp[1]) && MYIDUP_tmp[1]<0)))
5984  ||
5985  (partonIsUnknown[1] && ((PDGHelpers::isUpTypeQuark(MYIDUP_tmp[0]) && MYIDUP_tmp[0]<0) || (PDGHelpers::isDownTypeQuark(MYIDUP_tmp[0]) && MYIDUP_tmp[0]<0)))
5986  )
5987  &&
5988  (
5989  (partonIsUnknown[2] && partonIsUnknown[3])
5990  ||
5991  (
5992  (PDGHelpers::isUpTypeQuark(MYIDUP_tmp[2]) && MYIDUP_tmp[2]<0 && PDGHelpers::isDownTypeQuark(MYIDUP_tmp[3]) && MYIDUP_tmp[3]<0)
5993  ||
5994  (PDGHelpers::isUpTypeQuark(MYIDUP_tmp[3]) && MYIDUP_tmp[3]<0 && PDGHelpers::isDownTypeQuark(MYIDUP_tmp[2]) && MYIDUP_tmp[2]<0)
5995  )
5996  ||
5997  (partonIsUnknown[2] && ((PDGHelpers::isUpTypeQuark(MYIDUP_tmp[3]) && MYIDUP_tmp[3]<0) || (PDGHelpers::isDownTypeQuark(MYIDUP_tmp[3]) && MYIDUP_tmp[3]<0)))
5998  ||
5999  (partonIsUnknown[3] && ((PDGHelpers::isUpTypeQuark(MYIDUP_tmp[2]) && MYIDUP_tmp[2]<0) || (PDGHelpers::isDownTypeQuark(MYIDUP_tmp[2]) && MYIDUP_tmp[2]<0)))
6000  )
6001  ){
6002  // ubardbar->(WW)->dbar'ubar'
6003  double ckm_ir = 0.;
6004  double ckm_js = 0.;
6005  const unsigned int nCombinations = 6;
6006  int ijrs_arr[nCombinations][4] ={
6007  { -2, -3, -1, -4 },
6008  { -2, -3, -5, -4 },
6009  { -2, -5, -1, -4 },
6010  { -2, -5, -3, -4 },
6011  { -2, -1, -3, -4 },
6012  { -2, -1, -5, -4 }
6013  };
6014  for (unsigned int ijrs=0; ijrs<nCombinations; ijrs++){
6015  isel = ijrs_arr[ijrs][0];
6016  jsel = ijrs_arr[ijrs][1];
6017  rsel = ijrs_arr[ijrs][2];
6018  ssel = ijrs_arr[ijrs][3];
6019  ckm_ir = __modparameters_MOD_ckmbare(&isel, &rsel);
6020  ckm_js = __modparameters_MOD_ckmbare(&jsel, &ssel);
6021  if (ckm_ir!=0. && ckm_js!=0.) break;
6022  }
6023  if (ckm_ir!=0. && ckm_js!=0.){
6024  __modhiggsjj_MOD_evalamp_wbfh_unsymm_sa_select_exact(p4, &isel, &jsel, &rsel, &ssel, &(msq_ubardbar_wwonly_ijrs1234[0]));
6025  __modhiggsjj_MOD_evalamp_wbfh_unsymm_sa_select_exact(p4, &isel, &jsel, &ssel, &rsel, &(msq_ubardbar_wwonly_ijrs1243[0]));
6026  __modhiggsjj_MOD_evalamp_wbfh_unsymm_sa_select_exact(p4, &jsel, &isel, &ssel, &rsel, &(msq_ubardbar_wwonly_ijrs1234[1]));
6027  __modhiggsjj_MOD_evalamp_wbfh_unsymm_sa_select_exact(p4, &jsel, &isel, &rsel, &ssel, &(msq_ubardbar_wwonly_ijrs1243[1]));
6028  ckm_takeout = pow(ckm_ir*ckm_js, 2);
6029  for (unsigned int iswap=0; iswap<2; iswap++){
6030  msq_ubardbar_wwonly_ijrs1234[iswap] /= ckm_takeout;
6031  msq_ubardbar_wwonly_ijrs1243[iswap] /= ckm_takeout;
6032  }
6033  }
6034  }
6035 
6036  if (verbosity>=TVar::DEBUG_VERBOSE){
6037  MELAout << "TUtil::HJJMatEl: The pre-computed MEs:" << endl;
6038  for (unsigned int iswap=0; iswap<2; iswap++){
6039  MELAout
6040  << "\tmsq_uu_zz_ijrs1234[" << iswap << "] = " << msq_uu_zz_ijrs1234[iswap] << '\n'
6041  << "\tmsq_uu_zz_ijrs1243[" << iswap << "] = " << msq_uu_zz_ijrs1243[iswap] << '\n'
6042  << "\tmsq_dd_zz_ijrs1234[" << iswap << "] = " << msq_dd_zz_ijrs1234[iswap] << '\n'
6043  << "\tmsq_dd_zz_ijrs1243[" << iswap << "] = " << msq_dd_zz_ijrs1243[iswap] << '\n'
6044  << "\tmsq_ubarubar_zz_ijrs1234[" << iswap << "] = " << msq_ubarubar_zz_ijrs1234[iswap] << '\n'
6045  << "\tmsq_ubarubar_zz_ijrs1243[" << iswap << "] = " << msq_ubarubar_zz_ijrs1243[iswap] << '\n'
6046  << "\tmsq_dbardbar_zz_ijrs1234[" << iswap << "] = " << msq_dbardbar_zz_ijrs1234[iswap] << '\n'
6047  << "\tmsq_dbardbar_zz_ijrs1243[" << iswap << "] = " << msq_dbardbar_zz_ijrs1243[iswap] << '\n'
6048  << "\tmsq_uu_zzid_ijrs1234[" << iswap << "] = " << msq_uu_zzid_ijrs1234[iswap] << '\n'
6049  << "\tmsq_uu_zzid_ijrs1243[" << iswap << "] = " << msq_uu_zzid_ijrs1243[iswap] << '\n'
6050  << "\tmsq_dd_zzid_ijrs1234[" << iswap << "] = " << msq_dd_zzid_ijrs1234[iswap] << '\n'
6051  << "\tmsq_dd_zzid_ijrs1243[" << iswap << "] = " << msq_dd_zzid_ijrs1243[iswap] << '\n'
6052  << "\tmsq_ubarubar_zzid_ijrs1234[" << iswap << "] = " << msq_ubarubar_zzid_ijrs1234[iswap] << '\n'
6053  << "\tmsq_ubarubar_zzid_ijrs1243[" << iswap << "] = " << msq_ubarubar_zzid_ijrs1243[iswap] << '\n'
6054  << "\tmsq_dbardbar_zzid_ijrs1234[" << iswap << "] = " << msq_dbardbar_zzid_ijrs1234[iswap] << '\n'
6055  << "\tmsq_dbardbar_zzid_ijrs1243[" << iswap << "] = " << msq_dbardbar_zzid_ijrs1243[iswap] << '\n'
6056  << "\tmsq_udbar_zz_ijrs1234[" << iswap << "] = " << msq_udbar_zz_ijrs1234[iswap] << '\n'
6057  << "\tmsq_udbar_zz_ijrs1243[" << iswap << "] = " << msq_udbar_zz_ijrs1243[iswap] << '\n'
6058  << "\tmsq_dubar_zz_ijrs1234[" << iswap << "] = " << msq_dubar_zz_ijrs1234[iswap] << '\n'
6059  << "\tmsq_dubar_zz_ijrs1243[" << iswap << "] = " << msq_dubar_zz_ijrs1243[iswap] << '\n'
6060  << "\tmsq_uubar_zz_ijrs1234[" << iswap << "] = " << msq_uubar_zz_ijrs1234[iswap] << '\n'
6061  << "\tmsq_uubar_zz_ijrs1243[" << iswap << "] = " << msq_uubar_zz_ijrs1243[iswap] << '\n'
6062  << "\tmsq_ddbar_zz_ijrs1234[" << iswap << "] = " << msq_ddbar_zz_ijrs1234[iswap] << '\n'
6063  << "\tmsq_ddbar_zz_ijrs1243[" << iswap << "] = " << msq_ddbar_zz_ijrs1243[iswap] << '\n'
6064  << "\tmsq_uubar_ww_ijrs1234[" << iswap << "] = " << msq_uubar_ww_ijrs1234[iswap] << '\n'
6065  << "\tmsq_uubar_ww_ijrs1243[" << iswap << "] = " << msq_uubar_ww_ijrs1243[iswap] << '\n'
6066  << "\tmsq_ddbar_ww_ijrs1234[" << iswap << "] = " << msq_ddbar_ww_ijrs1234[iswap] << '\n'
6067  << "\tmsq_ddbar_ww_ijrs1243[" << iswap << "] = " << msq_ddbar_ww_ijrs1243[iswap] << '\n'
6068  << "\tmsq_ud_wwonly_ijrs1234[" << iswap << "] = " << msq_ud_wwonly_ijrs1234[iswap] << '\n'
6069  << "\tmsq_ud_wwonly_ijrs1243[" << iswap << "] = " << msq_ud_wwonly_ijrs1243[iswap] << '\n'
6070  << "\tmsq_ubardbar_wwonly_ijrs1234[" << iswap << "] = " << msq_ubardbar_wwonly_ijrs1234[iswap] << '\n'
6071  << "\tmsq_ubardbar_wwonly_ijrs1243[" << iswap << "] = " << msq_ubardbar_wwonly_ijrs1243[iswap]
6072  << endl;
6073  }
6074  }
6075 
6076  const std::vector<TNumericUtil::intTriplet_t>& ijsel = Get_JHUGenHash_OnshellVBFHash();
6077  int nijchannels = ijsel.size();
6078  // BEGIN COMPUTATION
6079  for (int ic=0; ic<nijchannels; ic++){
6080  // Emulate EvalWeighted_HJJ_test
6081  isel = ijsel[ic][0];
6082  jsel = ijsel[ic][1];
6083  int code = ijsel[ic][2];
6084  bool ijselIsUpType[2];
6085  bool ijselIsDownType[2];
6086  bool ijselIsParticle[2];
6087  bool ijselIsAntiparticle[2];
6088 
6089  if (verbosity >= TVar::DEBUG_VERBOSE) MELAout << "VBF channel " << ic << " code " << code << endl;
6090 
6091  // Default assignments
6092  if (verbosity >= TVar::DEBUG_VERBOSE) MELAout << "VBF mother unswapped case" << endl;
6093  // Set r=i, s=j default values
6094  rsel=isel;
6095  ssel=jsel;
6096  // Set i-j bools
6097  ijselIsUpType[0] = (PDGHelpers::isUpTypeQuark(isel));
6098  ijselIsUpType[1] = (PDGHelpers::isUpTypeQuark(jsel));
6099  ijselIsDownType[0] = (PDGHelpers::isDownTypeQuark(isel));
6100  ijselIsDownType[1] = (PDGHelpers::isDownTypeQuark(jsel));
6101  ijselIsParticle[0] = (isel>0); ijselIsAntiparticle[0] = (isel<0);
6102  ijselIsParticle[1] = (jsel>0); ijselIsAntiparticle[1] = (jsel<0);
6103 
6104  if (
6105  (partonIsUnknown[0] || MYIDUP_tmp[0]==isel)
6106  &&
6107  (partonIsUnknown[1] || MYIDUP_tmp[1]==jsel)
6108  ){ // Do it this way to be able to swap isel and jsel later
6109  if (code==1){ // Only ZZ->H possible
6110  // rsel=isel and ssel=jsel already
6111  if (
6112  (partonIsUnknown[2] || MYIDUP_tmp[2]==rsel)
6113  &&
6114  (partonIsUnknown[3] || MYIDUP_tmp[3]==ssel)
6115  ){
6116  msq_tmp=0;
6117  if (ijselIsUpType[0] && ijselIsUpType[1]){
6118  if (ijselIsParticle[0] && ijselIsParticle[1]){
6119  if (isel!=jsel) msq_tmp = msq_uu_zz_ijrs1234[0];
6120  else msq_tmp = msq_uu_zzid_ijrs1234[0];
6121  }
6122  else if (ijselIsAntiparticle[0] && ijselIsAntiparticle[1]){
6123  if (isel!=jsel) msq_tmp = msq_ubarubar_zz_ijrs1234[0];
6124  else msq_tmp = msq_ubarubar_zzid_ijrs1234[0];
6125  }
6126  else if (ijselIsParticle[0] && ijselIsAntiparticle[1]) msq_tmp = msq_uubar_zz_ijrs1234[0];
6127  }
6128  else if (ijselIsDownType[0] && ijselIsDownType[1]){
6129  if (ijselIsParticle[0] && ijselIsParticle[1]){
6130  if (isel!=jsel) msq_tmp = msq_dd_zz_ijrs1234[0];
6131  else msq_tmp = msq_dd_zzid_ijrs1234[0];
6132  }
6133  else if (ijselIsAntiparticle[0] && ijselIsAntiparticle[1]){
6134  if (isel!=jsel) msq_tmp = msq_dbardbar_zz_ijrs1234[0];
6135  else msq_tmp = msq_dbardbar_zzid_ijrs1234[0];
6136  }
6137  else if (ijselIsParticle[0] && ijselIsAntiparticle[1]) msq_tmp = msq_ddbar_zz_ijrs1234[0];
6138  }
6139  else if (ijselIsUpType[0] && ijselIsDownType[1] && ijselIsParticle[0] && ijselIsAntiparticle[1]) msq_tmp = msq_udbar_zz_ijrs1234[0];
6140  else if (ijselIsDownType[0] && ijselIsUpType[1] && ijselIsParticle[0] && ijselIsAntiparticle[1]) msq_tmp = msq_dubar_zz_ijrs1234[0];
6141  MatElsq[jsel+5][isel+5] += msq_tmp; // Assign only those that match gen. info, if present at all.
6142  if (verbosity >= TVar::DEBUG_VERBOSE) MELAout << "Channel (isel, jsel, rsel, ssel)=" << isel << ", " << jsel << ", " << rsel << ", " << ssel << '\t' << msq_tmp << endl;
6143  }
6144  if (
6145  rsel!=ssel
6146  &&
6147  (partonIsUnknown[2] || MYIDUP_tmp[2]==ssel)
6148  &&
6149  (partonIsUnknown[3] || MYIDUP_tmp[3]==rsel)
6150  ){
6151  msq_tmp=0;
6152  if (ijselIsUpType[0] && ijselIsUpType[1]){
6153  if (ijselIsParticle[0] && ijselIsParticle[1]){
6154  if (isel!=jsel) msq_tmp = msq_uu_zz_ijrs1243[0];
6155  else msq_tmp = msq_uu_zzid_ijrs1243[0];
6156  }
6157  else if (ijselIsAntiparticle[0] && ijselIsAntiparticle[1]){
6158  if (isel!=jsel) msq_tmp = msq_ubarubar_zz_ijrs1243[0];
6159  else msq_tmp = msq_ubarubar_zzid_ijrs1243[0];
6160  }
6161  else if (ijselIsParticle[0] && ijselIsAntiparticle[1]) msq_tmp = msq_uubar_zz_ijrs1243[0];
6162  }
6163  else if (ijselIsDownType[0] && ijselIsDownType[1]){
6164  if (ijselIsParticle[0] && ijselIsParticle[1]){
6165  if (isel!=jsel) msq_tmp = msq_dd_zz_ijrs1243[0];
6166  else msq_tmp = msq_dd_zzid_ijrs1243[0];
6167  }
6168  else if (ijselIsAntiparticle[0] && ijselIsAntiparticle[1]){
6169  if (isel!=jsel) msq_tmp = msq_dbardbar_zz_ijrs1243[0];
6170  else msq_tmp = msq_dbardbar_zzid_ijrs1243[0];
6171  }
6172  else if (ijselIsParticle[0] && ijselIsAntiparticle[1]) msq_tmp = msq_ddbar_zz_ijrs1243[0];
6173  }
6174  else if (ijselIsUpType[0] && ijselIsDownType[1] && ijselIsParticle[0] && ijselIsAntiparticle[1]) msq_tmp = msq_udbar_zz_ijrs1243[0];
6175  else if (ijselIsDownType[0] && ijselIsUpType[1] && ijselIsParticle[0] && ijselIsAntiparticle[1]) msq_tmp = msq_dubar_zz_ijrs1243[0];
6176  MatElsq[jsel+5][isel+5] += msq_tmp; // Assign only those that match gen. info, if present at all.
6177  if (verbosity >= TVar::DEBUG_VERBOSE) MELAout << "Channel (isel, jsel, rsel, ssel)=" << isel << ", " << jsel << ", " << ssel << ", " << rsel << '\t' << msq_tmp << endl;
6178  }
6179  }
6180  else if (code==0){ // code==0 means WW->H is also possible with no interference to ZZ->H, for example u ub -> d db.
6181  vector<int> possible_rsel;
6182  vector<int> possible_ssel;
6183  vector<double> possible_Vsqir;
6184  vector<double> possible_Vsqjs;
6185  if (ijselIsUpType[0]){ possible_rsel.push_back(1); possible_rsel.push_back(3); possible_rsel.push_back(5); }
6186  else if (ijselIsDownType[0]){ possible_rsel.push_back(2); possible_rsel.push_back(4); }
6187  for (unsigned int ix=0; ix<possible_rsel.size(); ix++){
6188  rsel=possible_rsel.at(ix);
6189  double ckmval = pow(__modparameters_MOD_ckmbare(&isel, &rsel), 2);
6190  possible_Vsqir.push_back(ckmval);
6191  }
6192  if (ijselIsUpType[1]){ possible_ssel.push_back(1); possible_ssel.push_back(3); possible_ssel.push_back(5); }
6193  else if (ijselIsDownType[1]){ possible_ssel.push_back(2); possible_ssel.push_back(4); }
6194  for (unsigned int iy=0; iy<possible_ssel.size(); iy++){
6195  ssel=possible_ssel.at(iy);
6196  double ckmval = pow(__modparameters_MOD_ckmbare(&jsel, &ssel), 2);
6197  possible_Vsqjs.push_back(ckmval);
6198  }
6199 
6200  // Combine the ME and ME_swap based on actual ids
6201  for (unsigned int ix=0; ix<possible_rsel.size(); ix++){
6202  rsel=possible_rsel.at(ix)*TMath::Sign(1, isel);
6203  for (unsigned int iy=0; iy<possible_ssel.size(); iy++){
6204  ssel=possible_ssel.at(iy)*TMath::Sign(1, jsel);
6205  double ckmval = possible_Vsqir.at(ix)*possible_Vsqjs.at(iy);
6206  if (
6207  (partonIsUnknown[2] || MYIDUP_tmp[2]==rsel)
6208  &&
6209  (partonIsUnknown[3] || MYIDUP_tmp[3]==ssel)
6210  ){
6211  msq_tmp=0;
6212  if (ijselIsUpType[0] && ijselIsUpType[1] && ijselIsParticle[0] && ijselIsAntiparticle[1]) msq_tmp = msq_uubar_ww_ijrs1234[0];
6213  else if (ijselIsDownType[0] && ijselIsDownType[1] && ijselIsParticle[0] && ijselIsAntiparticle[1]) msq_tmp = msq_ddbar_ww_ijrs1234[0];
6214  msq_tmp *= ckmval;
6215  MatElsq[jsel+5][isel+5] += msq_tmp; // Assign only those that match gen. info, if present at all.
6216  if (verbosity >= TVar::DEBUG_VERBOSE) MELAout << "Channel (isel, jsel, rsel, ssel)=" << isel << ", " << jsel << ", " << rsel << ", " << ssel << '\t' << msq_tmp << endl;
6217  }
6218  if (
6219  rsel!=ssel
6220  &&
6221  (partonIsUnknown[2] || MYIDUP_tmp[2]==ssel)
6222  &&
6223  (partonIsUnknown[3] || MYIDUP_tmp[3]==rsel)
6224  ){
6225  msq_tmp=0;
6226  if (ijselIsUpType[0] && ijselIsUpType[1] && ijselIsParticle[0] && ijselIsAntiparticle[1]) msq_tmp = msq_uubar_ww_ijrs1243[0];
6227  else if (ijselIsDownType[0] && ijselIsDownType[1] && ijselIsParticle[0] && ijselIsAntiparticle[1]) msq_tmp = msq_ddbar_ww_ijrs1243[0];
6228  msq_tmp *= ckmval;
6229  MatElsq[jsel+5][isel+5] += msq_tmp; // Assign only those that match gen. info, if present at all.
6230  if (verbosity >= TVar::DEBUG_VERBOSE) MELAout << "Channel (isel, jsel, rsel, ssel)=" << isel << ", " << jsel << ", " << ssel << ", " << rsel << '\t' << msq_tmp << endl;
6231  }
6232  }
6233  }
6234  }
6235  else{ // code==2 means states with WW/ZZ interference allowed, for example u1 d2 -> u3 d4 + d4 u3.
6236  vector<int> possible_rsel;
6237  vector<int> possible_ssel;
6238  vector<double> possible_Vsqir;
6239  vector<double> possible_Vsqjs;
6240  if (ijselIsUpType[0]){ possible_rsel.push_back(1); possible_rsel.push_back(3); possible_rsel.push_back(5); }
6241  else if (ijselIsDownType[0]){ possible_rsel.push_back(2); possible_rsel.push_back(4); }
6242  for (unsigned int ix=0; ix<possible_rsel.size(); ix++){
6243  rsel=possible_rsel.at(ix);
6244  double ckmval = pow(__modparameters_MOD_ckmbare(&isel, &rsel), 2);
6245  possible_Vsqir.push_back(ckmval);
6246  }
6247  if (ijselIsUpType[1]){ possible_ssel.push_back(1); possible_ssel.push_back(3); possible_ssel.push_back(5); }
6248  else if (ijselIsDownType[1]){ possible_ssel.push_back(2); possible_ssel.push_back(4); }
6249  for (unsigned int iy=0; iy<possible_ssel.size(); iy++){
6250  ssel=possible_ssel.at(iy);
6251  double ckmval = pow(__modparameters_MOD_ckmbare(&jsel, &ssel), 2);
6252  possible_Vsqjs.push_back(ckmval);
6253  }
6254 
6255  // Loop over all possible combinations to get interference correct
6256  for (unsigned int ix=0; ix<possible_rsel.size(); ix++){
6257  rsel=possible_rsel.at(ix)*TMath::Sign(1, isel);
6258  for (unsigned int iy=0; iy<possible_ssel.size(); iy++){
6259  ssel=possible_ssel.at(iy)*TMath::Sign(1, jsel);
6260  double ckmval = possible_Vsqir.at(ix)*possible_Vsqjs.at(iy);
6261  if (
6262  (partonIsUnknown[2] || MYIDUP_tmp[2]==rsel)
6263  &&
6264  (partonIsUnknown[3] || MYIDUP_tmp[3]==ssel)
6265  ){
6266  if (rsel!=jsel && ssel!=isel){
6267  msq_tmp=0;
6268  if (ijselIsUpType[0] && ijselIsDownType[1]){
6269  if (ijselIsParticle[0] && ijselIsParticle[1]) msq_tmp = msq_ud_wwonly_ijrs1234[0];
6270  else if (ijselIsAntiparticle[0] && ijselIsAntiparticle[1]) msq_tmp = msq_ubardbar_wwonly_ijrs1234[0];
6271  }
6272  msq_tmp *= ckmval;
6273  MatElsq[jsel+5][isel+5] += msq_tmp; // Assign only those that match gen. info, if present at all.
6274  if (verbosity >= TVar::DEBUG_VERBOSE) MELAout << "Channel (isel, jsel, rsel, ssel)=" << isel << ", " << jsel << ", " << rsel << ", " << ssel << '\t' << msq_tmp << endl;
6275  }
6276  else{
6277  __modhiggsjj_MOD_evalamp_wbfh_unsymm_sa_select_exact(p4, &isel, &jsel, &rsel, &ssel, &msq_tmp);
6278  MatElsq[jsel+5][isel+5] += msq_tmp; // Assign only those that match gen. info, if present at all.
6279  if (verbosity >= TVar::DEBUG_VERBOSE) MELAout << "Channel (isel, jsel, rsel, ssel)=" << isel << ", " << jsel << ", " << rsel << ", " << ssel << '\t' << msq_tmp << endl;
6280  }
6281  }
6282  if (
6283  rsel!=ssel
6284  &&
6285  (partonIsUnknown[2] || MYIDUP_tmp[2]==ssel)
6286  &&
6287  (partonIsUnknown[3] || MYIDUP_tmp[3]==rsel)
6288  ){
6289  if (rsel!=jsel && ssel!=isel){
6290  msq_tmp=0;
6291  if (ijselIsUpType[0] && ijselIsDownType[1]){
6292  if (ijselIsParticle[0] && ijselIsParticle[1]) msq_tmp = msq_ud_wwonly_ijrs1243[0];
6293  else if (ijselIsAntiparticle[0] && ijselIsAntiparticle[1]) msq_tmp = msq_ubardbar_wwonly_ijrs1243[0];
6294  }
6295  msq_tmp *= ckmval;
6296  MatElsq[jsel+5][isel+5] += msq_tmp; // Assign only those that match gen. info, if present at all.
6297  if (verbosity >= TVar::DEBUG_VERBOSE) MELAout << "Channel (isel, jsel, rsel, ssel)=" << isel << ", " << jsel << ", " << ssel << ", " << rsel << '\t' << msq_tmp << endl;
6298  }
6299  else{
6300  __modhiggsjj_MOD_evalamp_wbfh_unsymm_sa_select_exact(p4, &isel, &jsel, &ssel, &rsel, &msq_tmp);
6301  MatElsq[jsel+5][isel+5] += msq_tmp; // Assign only those that match gen. info, if present at all.
6302  if (verbosity >= TVar::DEBUG_VERBOSE) MELAout << "Channel (isel, jsel, rsel, ssel)=" << isel << ", " << jsel << ", " << ssel << ", " << rsel << '\t' << msq_tmp << endl;
6303  }
6304  }
6305  }
6306  }
6307  }
6308  } // End unswapped isel>=jsel cases
6309 
6310  if (isel==jsel) continue;
6311  isel = ijsel[ic][1];
6312  jsel = ijsel[ic][0];
6313 
6314  // Reset to default assignments
6315  if (verbosity >= TVar::DEBUG_VERBOSE) MELAout << "VBF mother swapped case" << endl;
6316  // Set r=i, s=j default values
6317  rsel=isel;
6318  ssel=jsel;
6319  // Set i-j bools
6320  ijselIsUpType[0] = (PDGHelpers::isUpTypeQuark(isel));
6321  ijselIsUpType[1] = (PDGHelpers::isUpTypeQuark(jsel));
6322  ijselIsDownType[0] = (PDGHelpers::isDownTypeQuark(isel));
6323  ijselIsDownType[1] = (PDGHelpers::isDownTypeQuark(jsel));
6324  ijselIsParticle[0] = (isel>0); ijselIsAntiparticle[0] = (isel<0);
6325  ijselIsParticle[1] = (jsel>0); ijselIsAntiparticle[1] = (jsel<0);
6326 
6327  if (
6328  (partonIsUnknown[0] || ((PDGHelpers::isAGluon(MYIDUP_tmp[0]) && isel==0) || MYIDUP_tmp[0]==isel))
6329  &&
6330  (partonIsUnknown[1] || ((PDGHelpers::isAGluon(MYIDUP_tmp[1]) && jsel==0) || MYIDUP_tmp[1]==jsel))
6331  ){
6332  // isel==jsel==0 is already eliminated by isel!=jsel condition
6333  if (code==1){ // Only ZZ->H possible
6334  // rsel=isel and ssel=jsel already
6335  if (
6336  (partonIsUnknown[2] || MYIDUP_tmp[2]==rsel)
6337  &&
6338  (partonIsUnknown[3] || MYIDUP_tmp[3]==ssel)
6339  ){
6340  msq_tmp=0;
6341  if (ijselIsUpType[1] && ijselIsUpType[0]){
6342  if (ijselIsParticle[1] && ijselIsParticle[0]){
6343  if (isel!=jsel) msq_tmp = msq_uu_zz_ijrs1234[1];
6344  else msq_tmp = msq_uu_zzid_ijrs1234[1];
6345  }
6346  else if (ijselIsAntiparticle[1] && ijselIsAntiparticle[0]){
6347  if (isel!=jsel) msq_tmp = msq_ubarubar_zz_ijrs1234[1];
6348  else msq_tmp = msq_ubarubar_zzid_ijrs1234[1];
6349  }
6350  else if (ijselIsParticle[1] && ijselIsAntiparticle[0]) msq_tmp = msq_uubar_zz_ijrs1234[1];
6351  }
6352  else if (ijselIsDownType[1] && ijselIsDownType[0]){
6353  if (ijselIsParticle[1] && ijselIsParticle[0]){
6354  if (isel!=jsel) msq_tmp = msq_dd_zz_ijrs1234[1];
6355  else msq_tmp = msq_dd_zzid_ijrs1234[1];
6356  }
6357  else if (ijselIsAntiparticle[1] && ijselIsAntiparticle[0]){
6358  if (isel!=jsel) msq_tmp = msq_dbardbar_zz_ijrs1234[1];
6359  else msq_tmp = msq_dbardbar_zzid_ijrs1234[1];
6360  }
6361  else if (ijselIsParticle[1] && ijselIsAntiparticle[0]) msq_tmp = msq_ddbar_zz_ijrs1234[1];
6362  }
6363  else if (ijselIsUpType[1] && ijselIsDownType[0] && ijselIsParticle[1] && ijselIsAntiparticle[0]) msq_tmp = msq_udbar_zz_ijrs1234[1];
6364  else if (ijselIsDownType[1] && ijselIsUpType[0] && ijselIsParticle[1] && ijselIsAntiparticle[0]) msq_tmp = msq_dubar_zz_ijrs1234[1];
6365  MatElsq[jsel+5][isel+5] += msq_tmp; // Assign only those that match gen. info, if present at all.
6366  if (verbosity >= TVar::DEBUG_VERBOSE) MELAout << "Channel (isel, jsel, rsel, ssel)=" << isel << ", " << jsel << ", " << rsel << ", " << ssel << '\t' << msq_tmp << endl;
6367  }
6368  if (
6369  rsel!=ssel
6370  &&
6371  (partonIsUnknown[2] || MYIDUP_tmp[2]==ssel)
6372  &&
6373  (partonIsUnknown[3] || MYIDUP_tmp[3]==rsel)
6374  ){
6375  msq_tmp=0;
6376  if (ijselIsUpType[1] && ijselIsUpType[0]){
6377  if (ijselIsParticle[1] && ijselIsParticle[0]){
6378  if (isel!=jsel) msq_tmp = msq_uu_zz_ijrs1243[1];
6379  else msq_tmp = msq_uu_zzid_ijrs1243[1];
6380  }
6381  else if (ijselIsAntiparticle[1] && ijselIsAntiparticle[0]){
6382  if (isel!=jsel) msq_tmp = msq_ubarubar_zz_ijrs1243[1];
6383  else msq_tmp = msq_ubarubar_zzid_ijrs1243[1];
6384  }
6385  else if (ijselIsParticle[1] && ijselIsAntiparticle[0]) msq_tmp = msq_uubar_zz_ijrs1243[1];
6386  }
6387  else if (ijselIsDownType[1] && ijselIsDownType[0]){
6388  if (ijselIsParticle[1] && ijselIsParticle[0]){
6389  if (isel!=jsel) msq_tmp = msq_dd_zz_ijrs1243[1];
6390  else msq_tmp = msq_dd_zzid_ijrs1243[1];
6391  }
6392  else if (ijselIsAntiparticle[1] && ijselIsAntiparticle[0]){
6393  if (isel!=jsel) msq_tmp = msq_dbardbar_zz_ijrs1243[1];
6394  else msq_tmp = msq_dbardbar_zzid_ijrs1243[1];
6395  }
6396  else if (ijselIsParticle[1] && ijselIsAntiparticle[0]) msq_tmp = msq_ddbar_zz_ijrs1243[1];
6397  }
6398  else if (ijselIsUpType[1] && ijselIsDownType[0] && ijselIsParticle[1] && ijselIsAntiparticle[0]) msq_tmp = msq_udbar_zz_ijrs1243[1];
6399  else if (ijselIsDownType[1] && ijselIsUpType[0] && ijselIsParticle[1] && ijselIsAntiparticle[0]) msq_tmp = msq_dubar_zz_ijrs1243[1];
6400  MatElsq[jsel+5][isel+5] += msq_tmp; // Assign only those that match gen. info, if present at all.
6401  if (verbosity >= TVar::DEBUG_VERBOSE) MELAout << "Channel (isel, jsel, rsel, ssel)=" << isel << ", " << jsel << ", " << ssel << ", " << rsel << '\t' << msq_tmp << endl;
6402  }
6403  }
6404  else if (code==0){ // code==0 means WW->H is also possible with no interference to ZZ->H, for example u ub -> d db.
6405  vector<int> possible_rsel;
6406  vector<int> possible_ssel;
6407  vector<double> possible_Vsqir;
6408  vector<double> possible_Vsqjs;
6409  if (ijselIsUpType[0]){ possible_rsel.push_back(1); possible_rsel.push_back(3); possible_rsel.push_back(5); }
6410  else if (ijselIsDownType[0]){ possible_rsel.push_back(2); possible_rsel.push_back(4); }
6411  for (unsigned int ix=0; ix<possible_rsel.size(); ix++){
6412  rsel=possible_rsel.at(ix);
6413  double ckmval = pow(__modparameters_MOD_ckmbare(&isel, &rsel), 2);
6414  possible_Vsqir.push_back(ckmval);
6415  }
6416  if (ijselIsUpType[1]){ possible_ssel.push_back(1); possible_ssel.push_back(3); possible_ssel.push_back(5); }
6417  else if (ijselIsDownType[1]){ possible_ssel.push_back(2); possible_ssel.push_back(4); }
6418  for (unsigned int iy=0; iy<possible_ssel.size(); iy++){
6419  ssel=possible_ssel.at(iy);
6420  double ckmval = pow(__modparameters_MOD_ckmbare(&jsel, &ssel), 2);
6421  possible_Vsqjs.push_back(ckmval);
6422  }
6423 
6424  // Combine the ME and ME_swap based on actual ids
6425  for (unsigned int ix=0; ix<possible_rsel.size(); ix++){
6426  rsel=possible_rsel.at(ix)*TMath::Sign(1, isel);
6427  for (unsigned int iy=0; iy<possible_ssel.size(); iy++){
6428  ssel=possible_ssel.at(iy)*TMath::Sign(1, jsel);
6429  double ckmval = possible_Vsqir.at(ix)*possible_Vsqjs.at(iy);
6430  if (
6431  (partonIsUnknown[2] || MYIDUP_tmp[2]==rsel)
6432  &&
6433  (partonIsUnknown[3] || MYIDUP_tmp[3]==ssel)
6434  ){
6435  msq_tmp=0;
6436  if (ijselIsUpType[1] && ijselIsUpType[0] && ijselIsParticle[1] && ijselIsAntiparticle[0]) msq_tmp = msq_uubar_ww_ijrs1234[1];
6437  else if (ijselIsDownType[1] && ijselIsDownType[0] && ijselIsParticle[1] && ijselIsAntiparticle[0]) msq_tmp = msq_ddbar_ww_ijrs1234[1];
6438  msq_tmp *= ckmval;
6439  MatElsq[jsel+5][isel+5] += msq_tmp; // Assign only those that match gen. info, if present at all.
6440  if (verbosity >= TVar::DEBUG_VERBOSE) MELAout << "Channel (isel, jsel, rsel, ssel)=" << isel << ", " << jsel << ", " << rsel << ", " << ssel << '\t' << msq_tmp << endl;
6441  }
6442  if (
6443  rsel!=ssel
6444  &&
6445  (partonIsUnknown[2] || MYIDUP_tmp[2]==ssel)
6446  &&
6447  (partonIsUnknown[3] || MYIDUP_tmp[3]==rsel)
6448  ){
6449  msq_tmp=0;
6450  if (ijselIsUpType[1] && ijselIsUpType[0] && ijselIsParticle[1] && ijselIsAntiparticle[0]) msq_tmp = msq_uubar_ww_ijrs1243[1];
6451  else if (ijselIsDownType[1] && ijselIsDownType[0] && ijselIsParticle[1] && ijselIsAntiparticle[0]) msq_tmp = msq_ddbar_ww_ijrs1243[1];
6452  msq_tmp *= ckmval;
6453  MatElsq[jsel+5][isel+5] += msq_tmp; // Assign only those that match gen. info, if present at all.
6454  if (verbosity >= TVar::DEBUG_VERBOSE) MELAout << "Channel (isel, jsel, rsel, ssel)=" << isel << ", " << jsel << ", " << ssel << ", " << rsel << '\t' << msq_tmp << endl;
6455  }
6456  }
6457  }
6458  }
6459  else{ // code==2 means states with WW/ZZ interference allowed, for example u1 d2 -> u3 d4 + d4 u3.
6460  vector<int> possible_rsel;
6461  vector<int> possible_ssel;
6462  vector<double> possible_Vsqir;
6463  vector<double> possible_Vsqjs;
6464  if (ijselIsUpType[0]){ possible_rsel.push_back(1); possible_rsel.push_back(3); possible_rsel.push_back(5); }
6465  else if (ijselIsDownType[0]){ possible_rsel.push_back(2); possible_rsel.push_back(4); }
6466  for (unsigned int ix=0; ix<possible_rsel.size(); ix++){
6467  rsel=possible_rsel.at(ix);
6468  double ckmval = pow(__modparameters_MOD_ckmbare(&isel, &rsel), 2);
6469  possible_Vsqir.push_back(ckmval);
6470  }
6471  if (ijselIsUpType[1]){ possible_ssel.push_back(1); possible_ssel.push_back(3); possible_ssel.push_back(5); }
6472  else if (ijselIsDownType[1]){ possible_ssel.push_back(2); possible_ssel.push_back(4); }
6473  for (unsigned int iy=0; iy<possible_ssel.size(); iy++){
6474  ssel=possible_ssel.at(iy);
6475  double ckmval = pow(__modparameters_MOD_ckmbare(&jsel, &ssel), 2);
6476  possible_Vsqjs.push_back(ckmval);
6477  }
6478 
6479  // Loop over all possible combinations to get interference correct
6480  for (unsigned int ix=0; ix<possible_rsel.size(); ix++){
6481  rsel=possible_rsel.at(ix)*TMath::Sign(1, isel);
6482  for (unsigned int iy=0; iy<possible_ssel.size(); iy++){
6483  ssel=possible_ssel.at(iy)*TMath::Sign(1, jsel);
6484  double ckmval = possible_Vsqir.at(ix)*possible_Vsqjs.at(iy);
6485  if (
6486  (partonIsUnknown[2] || MYIDUP_tmp[2]==rsel)
6487  &&
6488  (partonIsUnknown[3] || MYIDUP_tmp[3]==ssel)
6489  ){
6490  if (rsel!=jsel && ssel!=isel){
6491  msq_tmp=0;
6492  if (ijselIsUpType[1] && ijselIsDownType[0]){
6493  if (ijselIsParticle[1] && ijselIsParticle[0]) msq_tmp = msq_ud_wwonly_ijrs1234[1];
6494  else if (ijselIsAntiparticle[1] && ijselIsAntiparticle[0]) msq_tmp = msq_ubardbar_wwonly_ijrs1234[1];
6495  }
6496  msq_tmp *= ckmval;
6497  MatElsq[jsel+5][isel+5] += msq_tmp; // Assign only those that match gen. info, if present at all.
6498  if (verbosity >= TVar::DEBUG_VERBOSE) MELAout << "Channel (isel, jsel, rsel, ssel)=" << isel << ", " << jsel << ", " << rsel << ", " << ssel << '\t' << msq_tmp << endl;
6499  }
6500  else{
6501  __modhiggsjj_MOD_evalamp_wbfh_unsymm_sa_select_exact(p4, &isel, &jsel, &rsel, &ssel, &msq_tmp);
6502  MatElsq[jsel+5][isel+5] += msq_tmp; // Assign only those that match gen. info, if present at all.
6503  if (verbosity >= TVar::DEBUG_VERBOSE) MELAout << "Channel (isel, jsel, rsel, ssel)=" << isel << ", " << jsel << ", " << rsel << ", " << ssel << '\t' << msq_tmp << endl;
6504  }
6505  }
6506  if (
6507  rsel!=ssel
6508  &&
6509  (partonIsUnknown[2] || MYIDUP_tmp[2]==ssel)
6510  &&
6511  (partonIsUnknown[3] || MYIDUP_tmp[3]==rsel)
6512  ){
6513  if (rsel!=jsel && ssel!=isel){
6514  msq_tmp=0;
6515  if (ijselIsUpType[1] && ijselIsDownType[0]){
6516  if (ijselIsParticle[1] && ijselIsParticle[0]) msq_tmp = msq_ud_wwonly_ijrs1243[1];
6517  else if (ijselIsAntiparticle[1] && ijselIsAntiparticle[0]) msq_tmp = msq_ubardbar_wwonly_ijrs1243[1];
6518  }
6519  msq_tmp *= ckmval;
6520  MatElsq[jsel+5][isel+5] += msq_tmp; // Assign only those that match gen. info, if present at all.
6521  if (verbosity >= TVar::DEBUG_VERBOSE) MELAout << "Channel (isel, jsel, rsel, ssel)=" << isel << ", " << jsel << ", " << ssel << ", " << rsel << '\t' << msq_tmp << endl;
6522  }
6523  else{
6524  __modhiggsjj_MOD_evalamp_wbfh_unsymm_sa_select_exact(p4, &isel, &jsel, &ssel, &rsel, &msq_tmp);
6525  MatElsq[jsel+5][isel+5] += msq_tmp; // Assign only those that match gen. info, if present at all.
6526  if (verbosity >= TVar::DEBUG_VERBOSE) MELAout << "Channel (isel, jsel, rsel, ssel)=" << isel << ", " << jsel << ", " << ssel << ", " << rsel << '\t' << msq_tmp << endl;
6527  }
6528  }
6529  }
6530  }
6531  }
6532  } // End swapped isel<jsel cases
6533  } // End loop over ic<nijchannels
6534  // END COMPUTATION
6535  } // End production == TVar::JJVBF
6536 
6537  int GeVexponent_MEsq = 4-(1+nRequested_AssociatedJets)*2;
6538  double constant = pow(GeV, -GeVexponent_MEsq);
6539  for (int ii=0; ii<nmsq; ii++){ for (int jj=0; jj<nmsq; jj++) MatElsq[jj][ii] *= constant; }
6540  // FOTRAN convention -5 -4 -3 -2 -1 0 1 2 3 4 5
6541  // parton flavor bbar cbar sbar ubar dbar g d u s c b
6542  // C++ convention 0 1 2 3 4 5 6 7 8 9 10
6543  if (verbosity >= TVar::DEBUG){
6544  MELAout << "MatElsq:\n";
6545  for (int ii = 0; ii < nmsq; ii++){ for (int jj = 0; jj < nmsq; jj++) MELAout << MatElsq[jj][ii] << '\t'; MELAout << endl; }
6546  }
6547  sum_msqjk = SumMEPDF(MomStore[0], MomStore[1], MatElsq, RcdME, EBEAM, verbosity);
6548  /*
6549  if (verbosity >= TVar::ERROR && (std::isnan(sum_msqjk) || std::isinf(sum_msqjk))){
6550  MELAout << "TUtil::HJJMatEl: FAILURE!" << endl;
6551  MELAout << "MatElsq:\n";
6552  for (int ii = 0; ii < nmsq; ii++){ for (int jj = 0; jj < nmsq; jj++) MELAout << MatElsq[jj][ii] << '\t'; MELAout << endl; }
6553  double fx[2][nmsq];
6554  RcdME->getPartonWeights(fx[0], fx[1]);
6555  for (int ii = 0; ii < nmsq; ii++){ for (int jj = 0; jj < 2; jj++) MELAout << fx[jj][ii] << '\t'; MELAout << endl; }
6556  for (int i=0; i<5; i++) MELAout << "p["<<i<<"] (Px, Py, Pz, E, M):\t" << p4[i][1]/GeV << '\t' << p4[i][2]/GeV << '\t' << p4[i][3]/GeV << '\t' << p4[i][0]/GeV << '\t' << sqrt(fabs(pow(p4[i][0], 2)-pow(p4[i][1], 2)-pow(p4[i][2], 2)-pow(p4[i][3], 2)))/GeV << endl;
6557  TUtil::PrintCandidateSummary(RcdME->melaCand);
6558  MELAout << endl;
6559  }
6560  */
6561 
6562  if (verbosity>=TVar::DEBUG){
6563  MELAout
6564  << "TUtil::HJJMatEl: Reset AlphaS:\n"
6565  << "\tBefore reset, alphas scale: " << scale_.scale << ", PDF scale: " << facscale_.facscale << endl;
6566  }
6567  SetAlphaS(defaultRenScale, defaultFacScale, 1., 1., defaultNloop, defaultNflav, defaultPdflabel);
6568  if (verbosity>=TVar::DEBUG){
6569  GetAlphaS(&alphasVal, &alphasmzVal);
6570  MELAout
6571  << "TUtil::HJJMatEl: Reset AlphaS result:\n"
6572  << "\tAfter reset, alphas scale: " << scale_.scale << ", PDF scale: " << facscale_.facscale << ", alphas(Qren): " << alphasVal << ", alphas(MZ): " << alphasmzVal << endl;
6573  }
6574  return sum_msqjk;
6575 }
6576 
6577 // VH, H undecayed or Hbb
6579  const TVar::Process& process, const TVar::Production& production, const TVar::MatrixElement& matrixElement,
6580  event_scales_type* event_scales, MelaIO* RcdME,
6581  const double& EBEAM,
6582  bool includeHiggsDecay,
6583  TVar::VerbosityLevel verbosity
6584  ){
6585  const double GeV=1./100.; // JHUGen mom. scale factor
6586  double sum_msqjk = 0;
6587  // by default assume only gg productions
6588  // FOTRAN convention -5 -4 -3 -2 -1 0 1 2 3 4 5
6589  // parton flavor bbar cbar sbar ubar dbar g d u s c b
6590  // C++ convention 0 1 2 3 4 5 6 7 8 9 10
6591  //2-D matrix is reversed in fortran
6592  // msq[ parton2 ] [ parton1 ]
6593  // flavor_msq[jj][ii] = fx1[ii]*fx2[jj]*msq[jj][ii];
6594  double MatElsq[nmsq][nmsq]={ { 0 } };
6595 
6596  if (matrixElement!=TVar::JHUGen){ if (verbosity>=TVar::ERROR) MELAerr << "TUtil::VHiggsMatEl: Non-JHUGen MEs are not supported" << endl; return sum_msqjk; }
6597  if (!(production == TVar::Lep_ZH || production == TVar::Lep_WH || production == TVar::Had_ZH || production == TVar::Had_WH || production == TVar::GammaH)){ if (verbosity>=TVar::ERROR) MELAerr << "TUtil::VHiggsMatEl: Production is not supported!" << endl; return sum_msqjk; }
6598 
6599  int nRequested_AssociatedJets=0;
6600  int nRequested_AssociatedLeptons=0;
6601  int nRequested_AssociatedPhotons=0;
6602  int AssociationVCompatibility=0;
6603  int partIncCode=TVar::kNoAssociated; // Just to avoid warnings
6604  if (production == TVar::Had_ZH || production == TVar::Had_WH){ // Only use associated partons
6605  partIncCode=TVar::kUseAssociated_Jets;
6606  nRequested_AssociatedJets=2;
6607  }
6608  else if (production == TVar::Lep_ZH || production == TVar::Lep_WH){ // Only use associated leptons(+)neutrinos
6609  partIncCode=TVar::kUseAssociated_Leptons;
6610  nRequested_AssociatedLeptons=2;
6611  }
6612  else if (production == TVar::GammaH){ // Only use associated photon
6613  partIncCode=TVar::kUseAssociated_Photons;
6614  nRequested_AssociatedPhotons=1;
6615  }
6616  if (production == TVar::Lep_WH || production == TVar::Had_WH) AssociationVCompatibility=24;
6617  else if (production == TVar::Lep_ZH || production == TVar::Had_ZH) AssociationVCompatibility=23;
6618  else if (production == TVar::GammaH) AssociationVCompatibility=22;
6619  simple_event_record mela_event;
6620  mela_event.AssociationCode=partIncCode;
6621  mela_event.AssociationVCompatibility=AssociationVCompatibility;
6622  mela_event.nRequested_AssociatedJets=nRequested_AssociatedJets;
6623  mela_event.nRequested_AssociatedLeptons=nRequested_AssociatedLeptons;
6624  mela_event.nRequested_AssociatedPhotons=nRequested_AssociatedPhotons;
6626  RcdME->melaCand,
6627  mela_event,
6628  verbosity
6629  );
6630  if ((mela_event.pAssociated.size()<(unsigned int)(nRequested_AssociatedJets+nRequested_AssociatedLeptons) && production!=TVar::GammaH) || (mela_event.pAssociated.size()<(unsigned int)nRequested_AssociatedPhotons && production == TVar::GammaH)){
6631  if (verbosity>=TVar::ERROR){
6632  MELAerr << "TUtil::VHiggsMatEl: Number of associated particles (" << mela_event.pAssociated.size() << ") is less than ";
6633  if (production!=TVar::GammaH) MELAerr << (nRequested_AssociatedJets+nRequested_AssociatedLeptons);
6634  else MELAerr << nRequested_AssociatedPhotons;
6635  MELAerr << endl;
6636  }
6637  return sum_msqjk;
6638  }
6639 
6640  int MYIDUP_prod[4]={ 0 }; // "Incoming" partons 1, 2, "outgoing" partons 3, 4
6641  int MYIDUP_dec[2]={ -9000, -9000 }; // "Outgoing" partons 1, 2 from the Higgs (->bb)
6642  double p4[9][4] ={ { 0 } };
6643  double helicities[9] ={ 0 };
6644  int vh_ids[9] ={ 0 };
6645  TLorentzVector MomStore[mxpart];
6646  for (int i = 0; i < mxpart; i++) MomStore[i].SetXYZT(0, 0, 0, 0);
6647 
6648  // p4(0:8,i) = (E(i),px(i),py(i),pz(i))
6649  // i=0,1: q1, qb2 (outgoing convention)
6650  // i=2,3: V*, V
6651  // i=4: H
6652  // i=5,6: f, fb from V
6653  // i=7,8: b, bb from H
6654  for (int ipar=0; ipar<2; ipar++){
6655  TLorentzVector* momTmp = &(mela_event.pMothers.at(ipar).second);
6656  int* idtmp = &(mela_event.pMothers.at(ipar).first);
6657  if (!PDGHelpers::isAnUnknownJet(*idtmp)) MYIDUP_prod[ipar] = *idtmp;
6658  else MYIDUP_prod[ipar] = 0;
6659  if (momTmp->T()>0.){
6660  p4[ipar][0] = momTmp->T()*GeV;
6661  p4[ipar][1] = momTmp->X()*GeV;
6662  p4[ipar][2] = momTmp->Y()*GeV;
6663  p4[ipar][3] = momTmp->Z()*GeV;
6664  MomStore[ipar] = (*momTmp);
6665  }
6666  else{
6667  p4[ipar][0] = -momTmp->T()*GeV;
6668  p4[ipar][1] = -momTmp->X()*GeV;
6669  p4[ipar][2] = -momTmp->Y()*GeV;
6670  p4[ipar][3] = -momTmp->Z()*GeV;
6671  MomStore[ipar] = -(*momTmp);
6672  MYIDUP_prod[ipar] = -MYIDUP_prod[ipar];
6673  }
6674  }
6675  // Associated particles
6676  for (int ipar=0; ipar<(production!=TVar::GammaH ? 2 : 1); ipar++){
6677  TLorentzVector* momTmp = &(mela_event.pAssociated.at(ipar).second);
6678  int* idtmp = &(mela_event.pAssociated.at(ipar).first);
6679  if (!PDGHelpers::isAnUnknownJet(*idtmp)) MYIDUP_prod[ipar+2] = *idtmp;
6680  else MYIDUP_prod[ipar+2] = 0;
6681  p4[ipar+5][0] = momTmp->T()*GeV;
6682  p4[ipar+5][1] = momTmp->X()*GeV;
6683  p4[ipar+5][2] = momTmp->Y()*GeV;
6684  p4[ipar+5][3] = momTmp->Z()*GeV;
6685  MomStore[ipar+6] = (*momTmp);
6686  }
6687  if (production == TVar::GammaH) MYIDUP_prod[3]=-9000;
6688 
6689  if (PDGHelpers::isAGluon(MYIDUP_prod[0]) || PDGHelpers::isAGluon(MYIDUP_prod[1])){ if (verbosity>=TVar::INFO) MELAerr << "TUtil::VHiggsMatEl: Initial state gluons are not permitted!" << endl; return sum_msqjk; }
6690  if (PDGHelpers::isAGluon(MYIDUP_prod[2]) || PDGHelpers::isAGluon(MYIDUP_prod[3])){ if (verbosity>=TVar::INFO) MELAerr << "TUtil::VHiggsMatEl: Final state gluons are not permitted!" << endl; return sum_msqjk; }
6691  if (production == TVar::GammaH && !PDGHelpers::isAPhoton(MYIDUP_prod[2])){ if (verbosity>=TVar::ERROR) MELAerr << "TUtil::VHiggsMatEl: GammaH associated photon (id=" << MYIDUP_prod[2] << ") is not a photon! Please fix its id." << endl; return sum_msqjk; }
6692 
6693  // Decay V/f ids
6694  // MYIDUP_dec as size=2 because JHUGen supports b-bbar decay
6695  for (int iv=0; iv<2; iv++){
6696  int idtmp = mela_event.intermediateVid.at(iv);
6697  if (!PDGHelpers::isAnUnknownJet(idtmp)) MYIDUP_dec[iv] = idtmp;
6698  else MYIDUP_dec[iv] = 0;
6699  }
6700  // Decay daughters
6701  for (unsigned int ipar=0; ipar<mela_event.pDaughters.size(); ipar++){
6702  TLorentzVector* momTmp = &(mela_event.pDaughters.at(ipar).second);
6703  if (mela_event.pDaughters.size()==1){
6704  p4[ipar+7][0] = momTmp->T()*GeV;
6705  p4[ipar+7][1] = momTmp->X()*GeV;
6706  p4[ipar+7][2] = momTmp->Y()*GeV;
6707  p4[ipar+7][3] = momTmp->Z()*GeV;
6708  MomStore[5] = (*momTmp); // 5
6709  }
6710  else if (mela_event.pDaughters.size()==2){
6711  p4[ipar+7][0] = momTmp->T()*GeV;
6712  p4[ipar+7][1] = momTmp->X()*GeV;
6713  p4[ipar+7][2] = momTmp->Y()*GeV;
6714  p4[ipar+7][3] = momTmp->Z()*GeV;
6715  MomStore[2*ipar+2] = (*momTmp); // 2,4
6716  if (PDGHelpers::isAQuark(mela_event.pDaughters.at(ipar).first)) MYIDUP_dec[ipar]=mela_event.pDaughters.at(ipar).first;
6717  }
6718  else if (mela_event.pDaughters.size()==3){
6719  if (ipar<2){
6720  p4[7][0] += momTmp->T()*GeV;
6721  p4[7][1] += momTmp->X()*GeV;
6722  p4[7][2] += momTmp->Y()*GeV;
6723  p4[7][3] += momTmp->Z()*GeV;
6724  }
6725  else{
6726  p4[8][0] = momTmp->T()*GeV;
6727  p4[8][1] = momTmp->X()*GeV;
6728  p4[8][2] = momTmp->Y()*GeV;
6729  p4[8][3] = momTmp->Z()*GeV;
6730  }
6731  MomStore[ipar+2] = (*momTmp); // 2,3,4
6732  }
6733  else if (mela_event.pDaughters.size()==4){
6734  if (ipar<2){
6735  p4[7][0] += momTmp->T()*GeV;
6736  p4[7][1] += momTmp->X()*GeV;
6737  p4[7][2] += momTmp->Y()*GeV;
6738  p4[7][3] += momTmp->Z()*GeV;
6739  }
6740  else{
6741  p4[8][0] += momTmp->T()*GeV;
6742  p4[8][1] += momTmp->X()*GeV;
6743  p4[8][2] += momTmp->Y()*GeV;
6744  p4[8][3] += momTmp->Z()*GeV;
6745  }
6746  MomStore[ipar+2] = (*momTmp); // 2,3,4,5
6747  }
6748  else{ // Should never happen
6749  p4[7][0] += momTmp->T()*GeV;
6750  p4[7][1] += momTmp->X()*GeV;
6751  p4[7][2] += momTmp->Y()*GeV;
6752  p4[7][3] += momTmp->Z()*GeV;
6753  MomStore[5] = MomStore[5] + (*momTmp);
6754  }
6755  }
6756  for (int ix=0; ix<4; ix++){
6757  p4[3][ix] = p4[5][ix] + p4[6][ix];
6758  p4[4][ix] = p4[7][ix] + p4[8][ix];
6759  p4[2][ix] = p4[3][ix] + p4[4][ix];
6760  }
6761 
6762  vh_ids[4] = 25;
6763  if (production == TVar::Lep_ZH || production == TVar::Had_ZH || production == TVar::GammaH) vh_ids[2] = 23;
6764  else if (production == TVar::Lep_WH || production == TVar::Had_WH) vh_ids[2] = 24; // To be changed later
6765  if (production!=TVar::GammaH) vh_ids[3] = vh_ids[2]; // To be changed later for WH
6766  else vh_ids[3] = 22;
6767 
6768  // H->ffb decay is turned off, so no need to loop over helicities[7]=helicities[8]=+-1
6769  vh_ids[7] = 5; helicities[7] = 1;
6770  vh_ids[8] = -5; helicities[8] = 1;
6771  int HDKon = 0;
6772  if (includeHiggsDecay && MYIDUP_dec[0]!=-9000 && MYIDUP_dec[1]!=-9000 && MYIDUP_dec[0]==-MYIDUP_dec[1]){ // H->ffb
6773  HDKon=1;
6775  if (verbosity>=TVar::DEBUG) MELAout << "TUtil::VHiggsMatEl: HDKon" << endl;
6776  }
6777  else if (verbosity>=TVar::INFO && includeHiggsDecay) MELAerr << "TUtil::VHiggsMatEl: includeHiggsDecay=true is not supported for the present decay mode." << endl;
6778 
6779  if (verbosity>=TVar::DEBUG){
6780  for (int i=0; i<9; i++) MELAout << "p4(" << vh_ids[i] << ") = " << p4[i][0] << ", " << p4[i][1] << ", " << p4[i][2] << ", " << p4[i][3] << "\n";
6781  }
6782 
6783  double defaultRenScale = scale_.scale;
6784  double defaultFacScale = facscale_.facscale;
6785  int defaultNloop = nlooprun_.nlooprun;
6786  int defaultNflav = nflav_.nflav;
6787  string defaultPdflabel = pdlabel_.pdlabel;
6788  double renQ = InterpretScaleScheme(production, matrixElement, event_scales->renomalizationScheme, MomStore);
6789  double facQ = InterpretScaleScheme(production, matrixElement, event_scales->factorizationScheme, MomStore);
6790  SetAlphaS(renQ, facQ, event_scales->ren_scale_factor, event_scales->fac_scale_factor, 1, 5, "cteq6_l");
6791  double alphasVal, alphasmzVal;
6792  GetAlphaS(&alphasVal, &alphasmzVal);
6793  RcdME->setRenormalizationScale(renQ);
6794  RcdME->setFactorizationScale(facQ);
6795  RcdME->setAlphaS(alphasVal);
6796  RcdME->setAlphaSatMZ(alphasmzVal);
6797  RcdME->setHiggsMassWidth(masses_mcfm_.hmass, masses_mcfm_.hwidth, 0);
6799  if (verbosity>=TVar::DEBUG){
6800  MELAout
6801  << "TUtil::VHiggsMatEl: Set AlphaS:\n"
6802  << "\tBefore set, alphas scale: " << defaultRenScale << ", PDF scale: " << defaultFacScale << '\n'
6803  << "\trenQ: " << renQ << " ( x " << event_scales->ren_scale_factor << "), facQ: " << facQ << " ( x " << event_scales->fac_scale_factor << ")\n"
6804  << "\tAfter set, alphas scale: " << scale_.scale << ", PDF scale: " << facscale_.facscale << ", alphas(Qren): " << alphasVal << ", alphas(MZ): " << alphasmzVal << endl;
6805  }
6806 
6807  // Since we have a lot of these checks, do them here.
6808  bool partonIsKnown[4];
6809  for (unsigned int ip=0; ip<4; ip++) partonIsKnown[ip] = (MYIDUP_prod[ip]!=0);
6810  if ((production == TVar::Lep_WH || production == TVar::Lep_ZH || production == TVar::GammaH) && !(partonIsKnown[2] && partonIsKnown[3])){ if (verbosity>=TVar::INFO) MELAerr << "TUtil::VHiggsMatEl: Final state particles in leptonic/photonic VH have to have a definite id!" << endl; return sum_msqjk; }
6811 
6812  const double allowed_helicities[2] ={ -1, 1 }; // L,R
6813  // Setup outgoing H decay products (H->f fbar), templated with H->b bar if both fermions are unknown.
6814  vector<pair<int, int>> Hffparticles;
6815  double Hffscale=1;
6816  if (HDKon!=0){
6817  if (!PDGHelpers::isAnUnknownJet(MYIDUP_dec[0]) || !PDGHelpers::isAnUnknownJet(MYIDUP_dec[1])){ // If one particle is known, pick that line
6818  if (!PDGHelpers::isAnUnknownJet(MYIDUP_dec[0])) Hffparticles.push_back(pair<int, int>(MYIDUP_dec[0], -MYIDUP_dec[0]));
6819  else Hffparticles.push_back(pair<int, int>(-MYIDUP_dec[1], MYIDUP_dec[1]));
6820  }
6821  else{ // Else loop over possible quark lines
6822  double Hffscalesum=0;
6823  for (int hquark=1; hquark<=5; hquark++){
6824  double Hffmass = __modparameters_MOD_getmass(&hquark);
6825  Hffscalesum += Hffmass;
6826  if (hquark==5){
6827  Hffparticles.push_back(pair<int, int>(hquark, -hquark));
6828  Hffparticles.push_back(pair<int, int>(-hquark, hquark));
6829  Hffscale /= Hffmass;
6830  }
6831  }
6832  Hffscale *= Hffscalesum;
6833  }
6834  }
6835  if (verbosity>=TVar::DEBUG){
6836  MELAout << "TUtil::VHiggsMatEl: Outgoing H-> f fbar particles to compute for the ME template:" << endl;
6837  for (unsigned int ihf=0; ihf<Hffparticles.size(); ihf++) MELAout << "\t - (id8, id9) = (" << Hffparticles.at(ihf).first << ", " << Hffparticles.at(ihf).second << ")" << endl;
6838  MELAout << "TUtil::VHiggsMatEl: ME scale for the H-> f fbar particles: " << Hffscale << endl;
6839  }
6840 
6842  // Setup incoming partons
6843  vector<pair<int, int>> incomingPartons;
6844  if (partonIsKnown[0] && partonIsKnown[1]) incomingPartons.push_back(pair<int, int>(MYIDUP_prod[0], MYIDUP_prod[1])); // Parton 0 and 1 are both known
6845  // FIXME: The following 2/1 assignments assume the CKM element for this pair is non-zero (there are divisions by Vckmsq_in/out later on).
6846  else if (!partonIsKnown[0] && !partonIsKnown[1]){ // Parton 0 and 1 are unknown
6847  // Consider all 4 incoming cases: d au, au d, u ad, ad u
6848  incomingPartons.push_back(pair<int, int>(1, -2)); // du~ -> W-
6849  incomingPartons.push_back(pair<int, int>(-2, 1)); // u~d -> W-
6850  incomingPartons.push_back(pair<int, int>(2, -1)); // ud~ -> W+
6851  incomingPartons.push_back(pair<int, int>(-1, 2)); // d~u -> W+
6852  }
6853  else if (!partonIsKnown[1] && partonIsKnown[0]){ // Parton 0 is known
6854  // Consider the only possible general cases
6855  if (PDGHelpers::isUpTypeQuark(MYIDUP_prod[0])){ // ud~ or u~d
6856  for (int iqf=1; iqf<=5; iqf++){
6857  if (iqf%2==0) continue;
6858  int jqf = -TMath::Sign(iqf, MYIDUP_prod[0]);
6859  double ckm_test = __modparameters_MOD_ckmbare(&(MYIDUP_prod[0]), &jqf);
6860  if (ckm_test!=0.){ incomingPartons.push_back(pair<int, int>(MYIDUP_prod[0], jqf)); break; }
6861  }
6862  }
6863  else if (PDGHelpers::isDownTypeQuark(MYIDUP_prod[0])){ // du~ or d~u
6864  for (int iqf=2; iqf<=4; iqf++){
6865  if (iqf%2==1) continue;
6866  int jqf = -TMath::Sign(iqf, MYIDUP_prod[0]);
6867  double ckm_test = __modparameters_MOD_ckmbare(&(MYIDUP_prod[0]), &jqf);
6868  if (ckm_test!=0.){ incomingPartons.push_back(pair<int, int>(MYIDUP_prod[0], jqf)); break; }
6869  }
6870  }
6871  }
6872  else/* if (!partonIsKnown[0] && partonIsKnown[1])*/{ // Parton 1 is known
6873  // Consider the only possible general cases
6874  if (PDGHelpers::isUpTypeQuark(MYIDUP_prod[1])){ // ud~ or u~d
6875  for (int iqf=1; iqf<=5; iqf++){
6876  if (iqf%2==0) continue;
6877  int jqf = -TMath::Sign(iqf, MYIDUP_prod[1]);
6878  double ckm_test = __modparameters_MOD_ckmbare(&jqf, &(MYIDUP_prod[1]));
6879  if (ckm_test!=0.){ incomingPartons.push_back(pair<int, int>(jqf, MYIDUP_prod[1])); break; }
6880  }
6881  }
6882  else if (PDGHelpers::isDownTypeQuark(MYIDUP_prod[1])){ // du~ or d~u
6883  for (int iqf=2; iqf<=4; iqf++){
6884  if (iqf%2==1) continue;
6885  int jqf = -TMath::Sign(iqf, MYIDUP_prod[1]);
6886  double ckm_test = __modparameters_MOD_ckmbare(&jqf, &(MYIDUP_prod[1]));
6887  if (ckm_test!=0.){ incomingPartons.push_back(pair<int, int>(jqf, MYIDUP_prod[1])); break; }
6888  }
6889  }
6890  }
6891  if (verbosity>=TVar::DEBUG){
6892  MELAout << "TUtil::VHiggsMatEl: Incoming partons to compute for the ME template:" << endl;
6893  for (auto& inpart:incomingPartons) MELAout << "\t - (id1, id2) = (" << inpart.first << ", " << inpart.second << ")" << endl;
6894  }
6895 
6896  // Setup outgoing partons
6897  vector<pair<int, int>> outgoingPartons;
6898  if (partonIsKnown[2] && partonIsKnown[3]) outgoingPartons.push_back(pair<int, int>(MYIDUP_prod[2], MYIDUP_prod[3])); // Parton 0 and 1 are both known or Lep_WH
6899  // FIXME: The following 2/1 assignments assume the CKM element for this pair is non-zero (there are divisions by Vckmsq_in/out later on).
6900  else if (!partonIsKnown[2] && !partonIsKnown[3]){ // Parton 0 and 1 are unknown
6901  // Consider all 4 outgoing cases: d au, au d, u ad, ad u
6902  outgoingPartons.push_back(pair<int, int>(1, -2)); // W- -> du~
6903  outgoingPartons.push_back(pair<int, int>(-2, 1)); // W- -> u~d
6904  outgoingPartons.push_back(pair<int, int>(2, -1)); // W+ -> ud~
6905  outgoingPartons.push_back(pair<int, int>(-1, 2)); // W+ -> d~u
6906  }
6907  else if (!partonIsKnown[3] && partonIsKnown[2]){ // Parton 0 is known
6908  // Consider the only possible general cases
6909  if (PDGHelpers::isUpTypeQuark(MYIDUP_prod[2])){ // ud~ or u~d
6910  for (int iqf=1; iqf<=5; iqf++){
6911  if (iqf%2==0) continue;
6912  int jqf = -TMath::Sign(iqf, MYIDUP_prod[2]);
6913  double ckm_test = __modparameters_MOD_ckmbare(&(MYIDUP_prod[2]), &jqf);
6914  if (ckm_test!=0.){ outgoingPartons.push_back(pair<int, int>(MYIDUP_prod[2], jqf)); break; }
6915  }
6916  }
6917  else if (PDGHelpers::isDownTypeQuark(MYIDUP_prod[2])){ // du~ or d~u
6918  for (int iqf=2; iqf<=4; iqf++){
6919  if (iqf%2==1) continue;
6920  int jqf = -TMath::Sign(iqf, MYIDUP_prod[2]);
6921  double ckm_test = __modparameters_MOD_ckmbare(&(MYIDUP_prod[2]), &jqf);
6922  if (ckm_test!=0.){ outgoingPartons.push_back(pair<int, int>(MYIDUP_prod[2], jqf)); break; }
6923  }
6924  }
6925  }
6926  else/* if (!partonIsKnown[2] && partonIsKnown[3])*/{ // Parton 1 is known
6927  // Consider the only possible general cases
6928  if (PDGHelpers::isUpTypeQuark(MYIDUP_prod[3])){ // ud~ or u~d
6929  for (int iqf=1; iqf<=5; iqf++){
6930  if (iqf%2==0) continue;
6931  int jqf = -TMath::Sign(iqf, MYIDUP_prod[3]);
6932  double ckm_test = __modparameters_MOD_ckmbare(&jqf, &(MYIDUP_prod[3]));
6933  if (ckm_test!=0.){ outgoingPartons.push_back(pair<int, int>(jqf, MYIDUP_prod[3])); break; }
6934  }
6935  }
6936  else if (PDGHelpers::isDownTypeQuark(MYIDUP_prod[3])){ // du~ or d~u
6937  for (int iqf=2; iqf<=4; iqf++){
6938  if (iqf%2==1) continue;
6939  int jqf = -TMath::Sign(iqf, MYIDUP_prod[3]);
6940  double ckm_test = __modparameters_MOD_ckmbare(&jqf, &(MYIDUP_prod[3]));
6941  if (ckm_test!=0.){ outgoingPartons.push_back(pair<int, int>(jqf, MYIDUP_prod[3])); break; }
6942  }
6943  }
6944  }
6945  if (verbosity>=TVar::DEBUG){
6946  MELAout << "TUtil::VHiggsMatEl: Outgoing particles to compute for the ME template:" << endl;
6947  for (auto& outpart:outgoingPartons) MELAout << "\t - (id6, id7) = (" << outpart.first << ", " << outpart.second << ")" << endl;
6948  }
6949 
6950  for (auto& inpart:incomingPartons){
6951  vh_ids[0] = inpart.first;
6952  vh_ids[1] = inpart.second;
6953  vh_ids[2] = PDGHelpers::getCoupledVertex(vh_ids[0], vh_ids[1]);
6954  if (!PDGHelpers::isAWBoson(vh_ids[2])) continue;
6955  if (verbosity>=TVar::DEBUG) MELAout << "\tIncoming " << vh_ids[0] << "," << vh_ids[1] << " -> " << vh_ids[2] << endl;
6956 
6957  double Vckmsq_in = pow(__modparameters_MOD_ckmbare(&(vh_ids[0]), &(vh_ids[1])), 2);
6958  if (verbosity>=TVar::DEBUG) MELAout << "\tNeed to divide the ME by |VCKM_incoming|**2 = " << Vckmsq_in << endl;
6959 
6960  for (auto& outpart:outgoingPartons){
6961  vh_ids[5] = outpart.first;
6962  vh_ids[6] = outpart.second;
6963  vh_ids[3] = PDGHelpers::getCoupledVertex(vh_ids[5], vh_ids[6]);
6964  if (vh_ids[2]!=vh_ids[3]) continue;
6965  if (verbosity>=TVar::DEBUG) MELAout << "\t\tOutgoing " << vh_ids[3] << " -> " << vh_ids[5] << "," << vh_ids[6] << endl;
6966 
6967  // Compute a raw ME
6968  double msq=0;
6969  for (int h01 = 0; h01 < 2; h01++){
6970  helicities[0] = allowed_helicities[h01];
6971  helicities[1] = -helicities[0];
6972  for (int h56 = 0; h56 < 2; h56++){
6973  helicities[5] = allowed_helicities[h56];
6974  helicities[6] = -helicities[5];
6975 
6976  double msq_inst=0;
6977  if (HDKon==0) __modvhiggs_MOD_evalamp_vhiggs(vh_ids, helicities, p4, &msq_inst);
6978  else{
6979  for (int h78=0; h78<2; h78++){
6980  helicities[7]=allowed_helicities[h78];
6981  helicities[8]=allowed_helicities[h78];
6982  for (unsigned int ihf=0; ihf<Hffparticles.size(); ihf++){
6983  vh_ids[7]=Hffparticles.at(ihf).first;
6984  vh_ids[8]=Hffparticles.at(ihf).second;
6985  double msq_inst_LR=0;
6986  __modvhiggs_MOD_evalamp_vhiggs(vh_ids, helicities, p4, &msq_inst_LR);
6987  msq_inst += msq_inst_LR;
6988  } // End loop over template H->f fbar products
6989  } // End loop over the spin of H->f fbar line
6990  msq_inst *= Hffscale;
6991  } // End HDKon!=0
6992  msq += msq_inst;
6993  } // End loop over h56
6994  } // End loop over h01
6995 
6996  // Determine the outgoing scale
6997  double scalesum_out=0;
6998  if (!(partonIsKnown[2] && partonIsKnown[3])){
6999  double Vckmsq_out = pow(__modparameters_MOD_ckm(&(vh_ids[5]), &(vh_ids[6])), 2);
7000  if (verbosity>=TVar::DEBUG) MELAout << "\t\tDividing ME by |VCKM_outgoing|**2 = " << Vckmsq_out << endl;
7001  msq /= Vckmsq_out;
7002  for (int outgoing1=1; outgoing1<=nf; outgoing1++){
7003  if (partonIsKnown[2] && outgoing1!=abs(vh_ids[5])) continue;
7004  if (outgoing1%2!=abs(vh_ids[5])%2 || outgoing1==6) continue;
7005  int iout = outgoing1 * TMath::Sign(1, vh_ids[5]);
7006  for (int outgoing2=1; outgoing2<=nf; outgoing2++){
7007  if (partonIsKnown[3] && outgoing2!=abs(vh_ids[6])) continue;
7008  if (outgoing2%2!=abs(vh_ids[6])%2 || outgoing2==6) continue;
7009  int jout = outgoing2 * TMath::Sign(1, vh_ids[6]);
7010  scalesum_out += pow(__modparameters_MOD_ckm(&(iout), &(jout)), 2);
7011  }
7012  }
7013  }
7014  else scalesum_out = 1;
7015  if (verbosity>=TVar::DEBUG) MELAout << "\t\tScale for outgoing particles: " << scalesum_out << endl;
7016 
7017  // Divide ME by the incoming scale factor (will be multiplied again inside the loop)
7018  if (!partonIsKnown[0] || !partonIsKnown[1]){
7019  if (verbosity>=TVar::DEBUG) MELAout << "\t\tDividing ME by |VCKM_incoming|**2 = " << Vckmsq_in << endl;
7020  msq /= Vckmsq_in;
7021  }
7022 
7023  // Sum all possible combinations
7024  for (int incoming1=1; incoming1<=nf; incoming1++){
7025  if (partonIsKnown[0] && incoming1!=abs(vh_ids[0])) continue;
7026  if (incoming1%2!=abs(vh_ids[0])%2 || incoming1==6) continue;
7027  int iin = incoming1 * TMath::Sign(1, vh_ids[0]);
7028  for (int incoming2=1; incoming2<=nf; incoming2++){
7029  if (partonIsKnown[1] && incoming2!=abs(vh_ids[1])) continue;
7030  if (incoming2%2!=abs(vh_ids[1])%2 || incoming2==6) continue;
7031  int jin = incoming2 * TMath::Sign(1, vh_ids[1]);
7032  if (verbosity>=TVar::DEBUG) MELAout << "\t\t\tiin,jin = " << iin << "," << jin << endl;
7033  double scale_in=1;
7034  if (!partonIsKnown[0] || !partonIsKnown[1]){
7035  scale_in = pow(__modparameters_MOD_ckmbare(&(iin), &(jin)), 2);
7036  if (verbosity>=TVar::DEBUG) MELAout << "\t\tScale for incoming particles: " << scale_in << endl;
7037  }
7038  MatElsq[jin+5][iin+5] += msq * 0.25 * scale_in *scalesum_out;
7039  }
7040  }
7041  // msq is now added to MatElSq.
7042  } // End loop over outgoing particle templates
7043  } // End loop over incoming parton templates
7044  } // End WH
7045  else{ // ZH, GammaH
7046  // Setup incoming partons
7047  vector<pair<int, int>> incomingPartons;
7048  if (partonIsKnown[0] && partonIsKnown[1]) incomingPartons.push_back(pair<int, int>(MYIDUP_prod[0], MYIDUP_prod[1])); // Parton 0 and 1 are both known
7049  else if (!partonIsKnown[0] && !partonIsKnown[1]){ // Parton 0 and 1 are unknown
7050  // Consider all 4 incoming cases: d ad, ad d, u au, au u
7051  incomingPartons.push_back(pair<int, int>(1, -1)); // dd~ -> Z
7052  incomingPartons.push_back(pair<int, int>(-1, 1)); // d~d -> Z
7053  incomingPartons.push_back(pair<int, int>(2, -2)); // uu~ -> Z
7054  incomingPartons.push_back(pair<int, int>(-2, 2)); // u~u -> Z
7055  }
7056  else if (!partonIsKnown[1] && partonIsKnown[0]) // Parton 0 is known
7057  incomingPartons.push_back(pair<int, int>(MYIDUP_prod[0], -MYIDUP_prod[0])); // id1, -id1
7058  else/* if (!partonIsKnown[0] && partonIsKnown[1])*/ // Parton 1 is known
7059  incomingPartons.push_back(pair<int, int>(-MYIDUP_prod[1], MYIDUP_prod[1])); // -id2, id2
7060  if (verbosity>=TVar::DEBUG){
7061  MELAout << "TUtil::VHiggsMatEl: Incoming partons to compute for the ME template:" << endl;
7062  for (auto& inpart:incomingPartons) MELAout << "\t - (id1, id2) = (" << inpart.first << ", " << inpart.second << ")" << endl;
7063  }
7064 
7065  // Setup outgoing partons
7066  vector<pair<int, int>> outgoingPartons;
7067  if ((partonIsKnown[2] && partonIsKnown[3]) || production == TVar::GammaH) outgoingPartons.push_back(pair<int, int>(MYIDUP_prod[2], MYIDUP_prod[3])); // Parton 0 and 1 are both known or Lep_ZH
7068  else if (!partonIsKnown[2] && !partonIsKnown[3]){ // Parton 0 and 1 are unknown
7069  // Consider all 4 outgoing cases: d au, au d, u ad, ad u
7070  outgoingPartons.push_back(pair<int, int>(1, -1)); // Z -> dd~
7071  outgoingPartons.push_back(pair<int, int>(-1, 1)); // Z -> d~d
7072  outgoingPartons.push_back(pair<int, int>(2, -2)); // Z -> uu~
7073  outgoingPartons.push_back(pair<int, int>(-2, 2)); // Z -> u~u
7074  }
7075  else if (!partonIsKnown[3] && partonIsKnown[2]) // Parton 0 is known
7076  outgoingPartons.push_back(pair<int, int>(MYIDUP_prod[2], -MYIDUP_prod[2])); // id1, -id1
7077  else/* if (!partonIsKnown[2] && partonIsKnown[3])*/ // Parton 1 is known
7078  outgoingPartons.push_back(pair<int, int>(-MYIDUP_prod[3], MYIDUP_prod[3])); // -id2, id2
7079  if (verbosity>=TVar::DEBUG){
7080  MELAout << "TUtil::VHiggsMatEl: Outgoing particles to compute for the ME template:" << endl;
7081  for (unsigned int op=0; op<outgoingPartons.size(); op++) MELAout << "\t - (id6, id7) = (" << outgoingPartons.at(op).first << ", " << outgoingPartons.at(op).second << ")" << endl;
7082  }
7083 
7084  for (auto& inpart:incomingPartons){
7085  vh_ids[0] = inpart.first;
7086  vh_ids[1] = inpart.second;
7087  vh_ids[2] = PDGHelpers::getCoupledVertex(vh_ids[0], vh_ids[1]);
7088  if (!PDGHelpers::isAZBoson(vh_ids[2])) continue; // Notice, Z-> Gamma + H should also have the id of the Z!
7089  if (verbosity>=TVar::DEBUG) MELAout << "\tIncoming " << vh_ids[0] << "," << vh_ids[1] << " -> " << vh_ids[2] << endl;
7090 
7091  // Scale for the incoming state is 1
7092 
7093  for (auto& outpart:outgoingPartons){
7094  vh_ids[5] = outpart.first;
7095  vh_ids[6] = outpart.second;
7096  if (production == TVar::GammaH) vh_ids[3] = 22;
7097  else{
7098  vh_ids[3] = PDGHelpers::getCoupledVertex(vh_ids[5], vh_ids[6]);
7099  if (vh_ids[2]!=vh_ids[3]) continue;
7100  }
7101  if (verbosity>=TVar::DEBUG) MELAout << "\t\tOutgoing " << vh_ids[3] << " -> " << vh_ids[5] << "," << vh_ids[6] << endl;
7102 
7103  // Compute a raw ME
7104  double msq=0;
7105  for (int h01 = 0; h01 < 2; h01++){
7106  helicities[0] = allowed_helicities[h01];
7107  helicities[1] = -helicities[0];
7108  for (int h56 = 0; h56 < 2; h56++){
7109  helicities[5] = allowed_helicities[h56];
7110  helicities[6] = -helicities[5];
7111 
7112  double msq_inst=0;
7113  if (HDKon==0) __modvhiggs_MOD_evalamp_vhiggs(vh_ids, helicities, p4, &msq_inst);
7114  else{
7115  for (int h78=0; h78<2; h78++){
7116  helicities[7]=allowed_helicities[h78];
7117  helicities[8]=allowed_helicities[h78];
7118  for (unsigned int ihf=0; ihf<Hffparticles.size(); ihf++){
7119  vh_ids[7]=Hffparticles.at(ihf).first;
7120  vh_ids[8]=Hffparticles.at(ihf).second;
7121  double msq_inst_LR=0;
7122  __modvhiggs_MOD_evalamp_vhiggs(vh_ids, helicities, p4, &msq_inst_LR);
7123  msq_inst += msq_inst_LR;
7124  } // End loop over template H->f fbar products
7125  } // End loop over the spin of H->f fbar line
7126  msq_inst *= Hffscale;
7127  } // End HDKon!=0
7128  msq += msq_inst;
7129  } // End loop over h56
7130  } // End loop over h01
7131 
7132  // Determine the outgoing scale
7133  double scale_out=1;
7134  if (!partonIsKnown[2] && !partonIsKnown[3] && production!=TVar::GammaH){
7135  if (PDGHelpers::isDownTypeQuark(vh_ids[5])) scale_out=3;
7136  else if (PDGHelpers::isUpTypeQuark(vh_ids[5])) scale_out=2;
7137  }
7138  if (verbosity>=TVar::DEBUG) MELAout << "\t\tScale for outgoing particles: " << scale_out << endl;
7139 
7140  // Sum all possible combinations
7141  for (int incoming1=1; incoming1<=nf; incoming1++){
7142  if (partonIsKnown[0] && incoming1!=abs(vh_ids[0])) continue;
7143  if (incoming1%2!=abs(vh_ids[0])%2 || incoming1==6) continue;
7144  int iin = incoming1 * TMath::Sign(1, vh_ids[0]);
7145  int jin=-iin;
7146  if (verbosity>=TVar::DEBUG) MELAout << "\t\t\tiin,jin = " << iin << "," << jin << endl;
7147  MatElsq[jin+5][iin+5] += msq * 0.25 * scale_out; // No incoming state scale
7148  }
7149  // msq is now added to MatElSq.
7150  } // End loop over outgoing particle templates
7151  } // End loop over incoming parton templates
7152  } // End ZH, GammaH
7153 
7154  int GeVexponent_MEsq;
7155  if (HDKon==0) GeVexponent_MEsq = 4-(1+nRequested_AssociatedJets+nRequested_AssociatedLeptons+nRequested_AssociatedPhotons)*2-4; // Amplitude has additional 1/m**2 from propagator == MEsq has additional 1/m**4
7156  else GeVexponent_MEsq = 4-(2+nRequested_AssociatedJets+nRequested_AssociatedLeptons+nRequested_AssociatedPhotons)*2;
7157  double constant = pow(GeV, -GeVexponent_MEsq);
7158  for (int ii=0; ii<nmsq; ii++){ for (int jj=0; jj<nmsq; jj++) MatElsq[jj][ii] *= constant; }
7159  if (verbosity >= TVar::DEBUG){
7160  MELAout << "MatElsq:\n";
7161  for (int ii = 0; ii < nmsq; ii++){ for (int jj = 0; jj < nmsq; jj++) MELAout << MatElsq[jj][ii] << '\t'; MELAout << endl; }
7162  }
7163  sum_msqjk = SumMEPDF(MomStore[0], MomStore[1], MatElsq, RcdME, EBEAM, verbosity);
7164 
7165  // Turn H_DK off
7166  if (HDKon!=0){
7167  HDKon=0;
7169  }
7170 
7171  if (verbosity>=TVar::DEBUG){
7172  MELAout
7173  << "TUtil::VHiggsMatEl: Reset AlphaS:\n"
7174  << "\tBefore reset, alphas scale: " << scale_.scale << ", PDF scale: " << facscale_.facscale << endl;
7175  }
7176  SetAlphaS(defaultRenScale, defaultFacScale, 1., 1., defaultNloop, defaultNflav, defaultPdflabel);
7177  if (verbosity>=TVar::DEBUG){
7178  GetAlphaS(&alphasVal, &alphasmzVal);
7179  MELAout
7180  << "TUtil::VHiggsMatEl: Reset AlphaS result:\n"
7181  << "\tAfter reset, alphas scale: " << scale_.scale << ", PDF scale: " << facscale_.facscale << ", alphas(Qren): " << alphasVal << ", alphas(MZ): " << alphasmzVal << endl;
7182  }
7183  return sum_msqjk;
7184 }
7185 
7186 // ttH, H undecayed
7188  const TVar::Process& process, const TVar::Production& production, const TVar::MatrixElement& matrixElement,
7189  event_scales_type* event_scales, MelaIO* RcdME,
7190  const double& EBEAM,
7191  int topDecay, int topProcess,
7192  TVar::VerbosityLevel verbosity
7193  ){
7194  const double GeV=1./100.; // JHUGen mom. scale factor
7195  double sum_msqjk = 0;
7196  double MatElsq[nmsq][nmsq]={ { 0 } };
7197 
7198  if (matrixElement!=TVar::JHUGen){ if (verbosity>=TVar::ERROR) MELAerr << "TUtil::TTHiggsMatEl: Non-JHUGen MEs are not supported." << endl; return sum_msqjk; }
7199  if (production!=TVar::ttH){ if (verbosity>=TVar::ERROR) MELAerr << "TUtil::TTHiggsMatEl: Only ttH is supported." << endl; return sum_msqjk; }
7200 
7201  int partIncCode;
7202  int nRequested_Tops=1;
7203  int nRequested_Antitops=1;
7204  if (topDecay>0) partIncCode=TVar::kUseAssociated_UnstableTops; // Look for unstable tops
7205  else partIncCode=TVar::kUseAssociated_StableTops; // Look for stable tops
7206 
7207  simple_event_record mela_event;
7208  mela_event.AssociationCode=partIncCode;
7209  mela_event.nRequested_Tops=nRequested_Tops;
7210  mela_event.nRequested_Antitops=nRequested_Antitops;
7212  RcdME->melaCand,
7213  mela_event,
7214  verbosity
7215  );
7216 
7217 
7218  if (topDecay==0 && (mela_event.pStableTops.size()<1 || mela_event.pStableAntitops.size()<1)){
7219  if (verbosity>=TVar::ERROR) MELAerr
7220  << "TUtil::TTHiggsMatEl: Number of stable tops (" << mela_event.pStableTops.size() << ")"
7221  << " and number of stable antitops (" << mela_event.pStableAntitops.size() << ")"
7222  << " in ttH process are not 1!" << endl;
7223  return sum_msqjk;
7224  }
7225  else if (topDecay>0 && (mela_event.pTopDaughters.size()<1 || mela_event.pAntitopDaughters.size()<1)){
7226  if (verbosity>=TVar::ERROR) MELAerr
7227  << "TUtil::TTHiggsMatEl: Number of set of top daughters (" << mela_event.pTopDaughters.size() << ")"
7228  << " and number of set of antitop daughters (" << mela_event.pAntitopDaughters.size() << ")"
7229  << " in ttH process are not 1!" << endl;
7230  return sum_msqjk;
7231  }
7232  else if (topDecay>0 && (mela_event.pTopDaughters.at(0).size()!=3 || mela_event.pAntitopDaughters.at(0).size()!=3)){
7233  if (verbosity>=TVar::ERROR) MELAerr
7234  << "TUtil::TTHiggsMatEl: Number of top daughters (" << mela_event.pTopDaughters.at(0).size() << ")"
7235  << " and number of antitop daughters (" << mela_event.pAntitopDaughters.at(0).size() << ")"
7236  << " in ttH process are not 3!" << endl;
7237  return sum_msqjk;
7238  }
7239 
7240  SimpleParticleCollection_t topDaughters;
7241  SimpleParticleCollection_t antitopDaughters;
7242  bool isUnknown[2]={ true, true };
7243 
7244  if (topDecay>0){
7245  // Daughters are assumed to have been ordered as b, Wf, Wfb already.
7246  for (unsigned int itd=0; itd<mela_event.pTopDaughters.at(0).size(); itd++) topDaughters.push_back(mela_event.pTopDaughters.at(0).at(itd));
7247  for (unsigned int itd=0; itd<mela_event.pAntitopDaughters.at(0).size(); itd++) antitopDaughters.push_back(mela_event.pAntitopDaughters.at(0).at(itd));
7248  }
7249  else{
7250  for (unsigned int itop=0; itop<mela_event.pStableTops.size(); itop++) topDaughters.push_back(mela_event.pStableTops.at(itop));
7251  for (unsigned int itop=0; itop<mela_event.pStableAntitops.size(); itop++) antitopDaughters.push_back(mela_event.pStableAntitops.at(itop));
7252  }
7253  // Check if either top is definitely identified
7254  for (unsigned int itd=0; itd<topDaughters.size(); itd++){ if (!PDGHelpers::isAnUnknownJet(topDaughters.at(itd).first)){ isUnknown[0]=false; break; } }
7255  for (unsigned int itd=0; itd<antitopDaughters.size(); itd++){ if (!PDGHelpers::isAnUnknownJet(antitopDaughters.at(itd).first)){ isUnknown[1]=false; break; } }
7256 
7257  // Start assigning the momenta
7258  // 0,1: p1 p2
7259  // 2-4: H,tb,t
7260  // 5-8: bb,W-,f,fb
7261  // 9-12: b,W+,fb,f
7262  double p4[13][4]={ { 0 } };
7263  double MYIDUP_prod[2]={ 0 };
7264  TLorentzVector MomStore[mxpart];
7265  for (int i = 0; i < mxpart; i++) MomStore[i].SetXYZT(0, 0, 0, 0);
7266  for (int ipar=0; ipar<2; ipar++){
7267  TLorentzVector* momTmp = &(mela_event.pMothers.at(ipar).second);
7268  int* idtmp = &(mela_event.pMothers.at(ipar).first);
7269  if (!PDGHelpers::isAnUnknownJet(*idtmp)) MYIDUP_prod[ipar] = *idtmp;
7270  else MYIDUP_prod[ipar] = 0;
7271  if (momTmp->T()>0.){
7272  p4[ipar][0] = -momTmp->T()*GeV;
7273  p4[ipar][1] = -momTmp->X()*GeV;
7274  p4[ipar][2] = -momTmp->Y()*GeV;
7275  p4[ipar][3] = -momTmp->Z()*GeV;
7276  MomStore[ipar] = (*momTmp);
7277  }
7278  else{
7279  p4[ipar][0] = momTmp->T()*GeV;
7280  p4[ipar][1] = momTmp->X()*GeV;
7281  p4[ipar][2] = momTmp->Y()*GeV;
7282  p4[ipar][3] = momTmp->Z()*GeV;
7283  MomStore[ipar] = -(*momTmp);
7284  MYIDUP_prod[ipar] = -MYIDUP_prod[ipar];
7285  }
7286  }
7287 
7288  // Assign top momenta
7289  // t(4) -> b(9) W+(10) (-> f(12) fb(11))
7290  const unsigned int t_pos=4;
7291  const unsigned int b_pos=9;
7292  const unsigned int Wp_pos=10;
7293  const unsigned int Wpf_pos=12;
7294  const unsigned int Wpfb_pos=11;
7295  for (unsigned int ipar=0; ipar<topDaughters.size(); ipar++){
7296  TLorentzVector* momTmp = &(topDaughters.at(ipar).second);
7297  if (topDaughters.size()==1){
7298  p4[t_pos][0] = momTmp->T()*GeV;
7299  p4[t_pos][1] = momTmp->X()*GeV;
7300  p4[t_pos][2] = momTmp->Y()*GeV;
7301  p4[t_pos][3] = momTmp->Z()*GeV;
7302  }
7303  // size==3
7304  else if (ipar==0){ // b
7305  p4[b_pos][0] = momTmp->T()*GeV;
7306  p4[b_pos][1] = momTmp->X()*GeV;
7307  p4[b_pos][2] = momTmp->Y()*GeV;
7308  p4[b_pos][3] = momTmp->Z()*GeV;
7309  }
7310  else if (ipar==2){ // Wfb
7311  p4[Wpfb_pos][0] = momTmp->T()*GeV;
7312  p4[Wpfb_pos][1] = momTmp->X()*GeV;
7313  p4[Wpfb_pos][2] = momTmp->Y()*GeV;
7314  p4[Wpfb_pos][3] = momTmp->Z()*GeV;
7315  p4[Wp_pos][0] += p4[Wpfb_pos][0];
7316  p4[Wp_pos][1] += p4[Wpfb_pos][1];
7317  p4[Wp_pos][2] += p4[Wpfb_pos][2];
7318  p4[Wp_pos][3] += p4[Wpfb_pos][3];
7319  }
7320  else/* if (ipar==1)*/{ // Wf
7321  p4[Wpf_pos][0] = momTmp->T()*GeV;
7322  p4[Wpf_pos][1] = momTmp->X()*GeV;
7323  p4[Wpf_pos][2] = momTmp->Y()*GeV;
7324  p4[Wpf_pos][3] = momTmp->Z()*GeV;
7325  p4[Wp_pos][0] += p4[Wpf_pos][0];
7326  p4[Wp_pos][1] += p4[Wpf_pos][1];
7327  p4[Wp_pos][2] += p4[Wpf_pos][2];
7328  p4[Wp_pos][3] += p4[Wpf_pos][3];
7329  }
7330  MomStore[6] = MomStore[6] + (*momTmp); // MomStore (I1, I2, 0, 0, 0, H, J1, J2)
7331  }
7332  if (topDaughters.size()!=1){ for (unsigned int ix=0; ix<4; ix++){ for (unsigned int ip=b_pos; ip<=Wp_pos; ip++) p4[t_pos][ix] = p4[ip][ix]; } }
7333 
7334  // Assign antitop momenta
7335  // tb(3) -> bb(5) W-(6) (-> f(7) fb(8))
7336  const unsigned int tb_pos=3;
7337  const unsigned int bb_pos=5;
7338  const unsigned int Wm_pos=6;
7339  const unsigned int Wmf_pos=7;
7340  const unsigned int Wmfb_pos=8;
7341  for (unsigned int ipar=0; ipar<antitopDaughters.size(); ipar++){
7342  TLorentzVector* momTmp = &(antitopDaughters.at(ipar).second);
7343  if (antitopDaughters.size()==1){
7344  p4[tb_pos][0] = momTmp->T()*GeV;
7345  p4[tb_pos][1] = momTmp->X()*GeV;
7346  p4[tb_pos][2] = momTmp->Y()*GeV;
7347  p4[tb_pos][3] = momTmp->Z()*GeV;
7348  }
7349  // size==3
7350  else if (ipar==0){ // bb
7351  p4[bb_pos][0] = momTmp->T()*GeV;
7352  p4[bb_pos][1] = momTmp->X()*GeV;
7353  p4[bb_pos][2] = momTmp->Y()*GeV;
7354  p4[bb_pos][3] = momTmp->Z()*GeV;
7355  }
7356  else if (ipar==1){ // Wf
7357  p4[Wmf_pos][0] = momTmp->T()*GeV;
7358  p4[Wmf_pos][1] = momTmp->X()*GeV;
7359  p4[Wmf_pos][2] = momTmp->Y()*GeV;
7360  p4[Wmf_pos][3] = momTmp->Z()*GeV;
7361  p4[Wm_pos][0] += p4[Wmf_pos][0];
7362  p4[Wm_pos][1] += p4[Wmf_pos][1];
7363  p4[Wm_pos][2] += p4[Wmf_pos][2];
7364  p4[Wm_pos][3] += p4[Wmf_pos][3];
7365  }
7366  else/* if (ipar==1)*/{ // Wfb
7367  p4[Wmfb_pos][0] = momTmp->T()*GeV;
7368  p4[Wmfb_pos][1] = momTmp->X()*GeV;
7369  p4[Wmfb_pos][2] = momTmp->Y()*GeV;
7370  p4[Wmfb_pos][3] = momTmp->Z()*GeV;
7371  p4[Wm_pos][0] += p4[Wmfb_pos][0];
7372  p4[Wm_pos][1] += p4[Wmfb_pos][1];
7373  p4[Wm_pos][2] += p4[Wmfb_pos][2];
7374  p4[Wm_pos][3] += p4[Wmfb_pos][3];
7375  }
7376  MomStore[7] = MomStore[7] + (*momTmp); // MomStore (I1, I2, 0, 0, 0, H, J1, J2)
7377  }
7378  if (antitopDaughters.size()!=1){ for (unsigned int ix=0; ix<4; ix++){ for (unsigned int ip=5; ip<=6; ip++) p4[tb_pos][ix] = p4[ip][ix]; } }
7379 
7380  for (unsigned int ipar=0; ipar<mela_event.pDaughters.size(); ipar++){
7381  TLorentzVector* momTmp = &(mela_event.pDaughters.at(ipar).second);
7382  p4[2][0] += momTmp->T()*GeV;
7383  p4[2][1] += momTmp->X()*GeV;
7384  p4[2][2] += momTmp->Y()*GeV;
7385  p4[2][3] += momTmp->Z()*GeV;
7386  MomStore[5] = MomStore[5] + (*momTmp); // i==(2, 3, 4) is (J1, J2, H), recorded as MomStore (I1, I2, 0, 0, 0, H, J1, J2)
7387  }
7388 
7389  if (verbosity >= TVar::DEBUG){
7390  for (int ii=0; ii<13; ii++){ MELAout << "p4[" << ii << "] = "; for (int jj=0; jj<4; jj++) MELAout << p4[ii][jj]/GeV << '\t'; MELAout << endl; }
7391  }
7392 
7393  double defaultRenScale = scale_.scale;
7394  double defaultFacScale = facscale_.facscale;
7395  int defaultNloop = nlooprun_.nlooprun;
7396  int defaultNflav = nflav_.nflav;
7397  string defaultPdflabel = pdlabel_.pdlabel;
7398  double renQ = InterpretScaleScheme(production, matrixElement, event_scales->renomalizationScheme, MomStore);
7399  double facQ = InterpretScaleScheme(production, matrixElement, event_scales->factorizationScheme, MomStore);
7400  SetAlphaS(renQ, facQ, event_scales->ren_scale_factor, event_scales->fac_scale_factor, 1, 5, "cteq6_l");
7401  double alphasVal, alphasmzVal;
7402  GetAlphaS(&alphasVal, &alphasmzVal);
7403  RcdME->setRenormalizationScale(renQ);
7404  RcdME->setFactorizationScale(facQ);
7405  RcdME->setAlphaS(alphasVal);
7406  RcdME->setAlphaSatMZ(alphasmzVal);
7407  RcdME->setHiggsMassWidth(masses_mcfm_.hmass, masses_mcfm_.hwidth, 0);
7409  if (verbosity>=TVar::DEBUG){
7410  MELAout
7411  << "TUtil::TTHiggsMatEl: Set AlphaS:\n"
7412  << "\tBefore set, alphas scale: " << defaultRenScale << ", PDF scale: " << defaultFacScale << '\n'
7413  << "\trenQ: " << renQ << " ( x " << event_scales->ren_scale_factor << "), facQ: " << facQ << " ( x " << event_scales->fac_scale_factor << ")\n"
7414  << "\tAfter set, alphas scale: " << scale_.scale << ", PDF scale: " << facscale_.facscale << ", alphas(Qren): " << alphasVal << ", alphas(MZ): " << alphasmzVal << endl;
7415  }
7416 
7418  /***** BEGIN TTH ME CALCULATION *****/
7419  for (unsigned int ib1=0; ib1<3; ib1++){
7420  if (topDaughters.size()==1 && ib1!=0) continue;
7421  else if (topDaughters.size()==3 && !PDGHelpers::isAnUnknownJet(topDaughters.at(0).first) && ib1!=0) continue;
7422  unsigned int b1index;
7423  if (ib1==0) b1index = b_pos;
7424  else if (ib1==1) b1index = Wpf_pos;
7425  else b1index = Wpfb_pos;
7426  for (unsigned int if1=0; if1<3; if1++){
7427  if (topDaughters.size()==1 && if1!=0) continue;
7428  else if (topDaughters.size()==3 && !PDGHelpers::isAnUnknownJet(topDaughters.at(1).first) && if1!=0) continue;
7429  unsigned int f1index;
7430  if (if1==0) f1index = Wpf_pos;
7431  else if (if1==2) f1index = b_pos;
7432  else f1index = Wpfb_pos;
7433  for (unsigned int ifb1=0; ifb1<3; ifb1++){
7434  if (topDaughters.size()==1 && ifb1!=0) continue;
7435  else if (topDaughters.size()==3 && !PDGHelpers::isAnUnknownJet(topDaughters.at(2).first) && ifb1!=0) continue;
7436  unsigned int fb1index;
7437  if (ifb1==2) fb1index = Wpf_pos;
7438  else if (ifb1==1) fb1index = b_pos;
7439  else fb1index = Wpfb_pos;
7440 
7441  if (b1index==f1index || b1index==fb1index || f1index==fb1index) continue;
7442 
7443  for (unsigned int ib2=0; ib2<3; ib2++){
7444  if (antitopDaughters.size()==1 && ib2!=0) continue;
7445  else if (antitopDaughters.size()==3 && !PDGHelpers::isAnUnknownJet(antitopDaughters.at(0).first) && ib2!=0) continue;
7446  unsigned int b2index;
7447  if (ib2==0) b2index = bb_pos;
7448  else if (ib2==1) b2index = Wmf_pos;
7449  else b2index = Wmfb_pos;
7450  for (unsigned int if2=0; if2<3; if2++){
7451  if (antitopDaughters.size()==1 && if2!=0) continue;
7452  else if (antitopDaughters.size()==3 && !PDGHelpers::isAnUnknownJet(antitopDaughters.at(1).first) && if2!=0) continue;
7453  unsigned int f2index;
7454  if (if2==0) f2index = Wmf_pos;
7455  else if (if2==2) f2index = bb_pos;
7456  else f2index = Wmfb_pos;
7457  for (unsigned int ifb2=0; ifb2<3; ifb2++){
7458  if (antitopDaughters.size()==1 && ifb2!=0) continue;
7459  else if (antitopDaughters.size()==3 && !PDGHelpers::isAnUnknownJet(antitopDaughters.at(2).first) && ifb2!=0) continue;
7460  unsigned int fb2index;
7461  if (ifb2==2) fb2index = Wmf_pos;
7462  else if (ifb2==1) fb2index = bb_pos;
7463  else fb2index = Wmfb_pos;
7464 
7465  if (b2index==f2index || b2index==fb2index || f2index==fb2index) continue;
7466 
7467  double p4_current[13][4]={ { 0 } };
7468  for (unsigned int ix=0; ix<4; ix++){
7469  for (unsigned int ip=0; ip<=2; ip++) p4_current[ip][ix] = p4[ip][ix]; // I1, I2, H do not change.
7470  p4_current[t_pos][ix] = p4[t_pos][ix]; // t does not change.
7471  p4_current[b1index][ix] = p4[b_pos][ix]; // Assign b to different position.
7472  p4_current[f1index][ix] = p4[Wpf_pos][ix]; // Assign Wp->f? to different position.
7473  p4_current[fb1index][ix] = p4[Wpfb_pos][ix]; // Assign Wp->?fb to different position.
7474  p4_current[Wp_pos][ix] = p4_current[Wpf_pos][ix] + p4_current[Wpfb_pos][ix]; // Re-sum W+ momentum.
7475 
7476  p4_current[tb_pos][ix] = p4[tb_pos][ix]; // tb does not change.
7477  p4_current[b2index][ix] = p4[bb_pos][ix]; // Assign bb to different position.
7478  p4_current[f2index][ix] = p4[Wmf_pos][ix]; // Assign Wm->f? to different position.
7479  p4_current[fb2index][ix] = p4[Wmfb_pos][ix]; // Assign Wm->?fb to different position.
7480  p4_current[Wm_pos][ix] = p4_current[Wmf_pos][ix] + p4_current[Wmfb_pos][ix]; // Re-sum W- momentum.
7481  }
7482  if (verbosity>=TVar::DEBUG){
7483  MELAout
7484  << "TUtil::TTHiggsMatEl: Unswapped instance for "
7485  << "b(" << b_pos << ") -> " << b1index << ", "
7486  << "Wpf(" << Wpf_pos << ") -> " << f1index << ", "
7487  << "Wpfb(" << Wpfb_pos << ") -> " << fb1index << ", "
7488  << "bb(" << bb_pos << ") -> " << b2index << ", "
7489  << "Wmf(" << Wmf_pos << ") -> " << f2index << ", "
7490  << "Wmfb(" << Wmfb_pos << ") -> " << fb2index << endl;
7491  for (int ii=0; ii<13; ii++){ MELAout << "p4_instance[" << ii << "] = "; for (int jj=0; jj<4; jj++) MELAout << p4_current[ii][jj]/GeV << '\t'; MELAout << endl; }
7492  MELAout << endl;
7493  }
7494 
7495  double MatElsq_tmp[nmsq][nmsq]={ { 0 } };
7496  double MatElsq_tmp_swap[nmsq][nmsq]={ { 0 } };
7497  __modttbhiggs_MOD_evalxsec_pp_ttbh(p4_current, &topProcess, MatElsq_tmp);
7498  if (isUnknown[0] && isUnknown[1]){
7499  for (unsigned int ix=0; ix<4; ix++){
7500  swap(p4_current[t_pos][ix], p4_current[tb_pos][ix]);
7501  swap(p4_current[b_pos][ix], p4_current[bb_pos][ix]);
7502  swap(p4_current[Wp_pos][ix], p4_current[Wm_pos][ix]);
7503  swap(p4_current[Wpf_pos][ix], p4_current[Wmf_pos][ix]);
7504  swap(p4_current[Wpfb_pos][ix], p4_current[Wmfb_pos][ix]);
7505  }
7506  __modttbhiggs_MOD_evalxsec_pp_ttbh(p4_current, &topProcess, MatElsq_tmp_swap);
7507  for (int ix=0; ix<11; ix++){ for (int iy=0; iy<11; iy++) MatElsq_tmp[iy][ix] = (MatElsq_tmp[iy][ix]+MatElsq_tmp_swap[iy][ix])/2.; }
7508  }
7509  for (int ix=0; ix<11; ix++){ for (int iy=0; iy<11; iy++) MatElsq[iy][ix] += MatElsq_tmp[iy][ix]; }
7510  if (verbosity>=TVar::DEBUG){
7511  MELAout
7512  << "TUtil::TTHiggsMatEl: Swapped instance for "
7513  << "b(" << b_pos << ") -> " << b1index << ", "
7514  << "Wpf(" << Wpf_pos << ") -> " << f1index << ", "
7515  << "Wpfb(" << Wpfb_pos << ") -> " << fb1index << ", "
7516  << "bb(" << bb_pos << ") -> " << b2index << ", "
7517  << "Wmf(" << Wmf_pos << ") -> " << f2index << ", "
7518  << "Wmfb(" << Wmfb_pos << ") -> " << fb2index << endl;
7519  for (int ii=0; ii<13; ii++){ MELAout << "p4_instance[" << ii << "] = "; for (int jj=0; jj<4; jj++) MELAout << p4_current[ii][jj]/GeV << '\t'; MELAout << endl; }
7520  MELAout << endl;
7521  }
7522  } // End loop over ifb2
7523  } // End loop over if2
7524  } // End loop over ib2
7525  } // End loop over ifb1
7526  } // End loop over if1
7527  } // End loop over ib1
7528  /***** END TTH ME CALCULATION *****/
7529  int defaultTopDecay=-1;
7530  __modjhugenmela_MOD_settopdecays(&defaultTopDecay); // reset top decay
7531 
7532  int GeVexponent_MEsq;
7533  if (topDecay>0) GeVexponent_MEsq = 4-(1+3*(nRequested_Tops+nRequested_Antitops))*2;
7534  else GeVexponent_MEsq = 4-(1+nRequested_Tops+nRequested_Antitops)*2;
7535  double constant = pow(GeV, -GeVexponent_MEsq);
7536  for (int ii=0; ii<nmsq; ii++){ for (int jj=0; jj<nmsq; jj++) MatElsq[jj][ii] *= constant; }
7537  if (verbosity>=TVar::DEBUG){
7538  MELAout << "TUtil::TTHiggsMatEl: MEsq[ip][jp] = " << endl;
7539  for (int iquark=-5; iquark<=5; iquark++){
7540  for (int jquark=-5; jquark<=5; jquark++) MELAout << MatElsq[jquark+5][iquark+5] << '\t';
7541  MELAout << endl;
7542  }
7543  }
7544  sum_msqjk = SumMEPDF(MomStore[0], MomStore[1], MatElsq, RcdME, EBEAM, verbosity);
7545 
7546  if (verbosity>=TVar::DEBUG){
7547  MELAout
7548  << "TUtil::TTHiggsMatEl: Reset AlphaS:\n"
7549  << "\tBefore reset, alphas scale: " << scale_.scale << ", PDF scale: " << facscale_.facscale << endl;
7550  }
7551  SetAlphaS(defaultRenScale, defaultFacScale, 1., 1., defaultNloop, defaultNflav, defaultPdflabel);
7552  if (verbosity>=TVar::DEBUG){
7553  GetAlphaS(&alphasVal, &alphasmzVal);
7554  MELAout
7555  << "TUtil::TTHiggsMatEl: Reset AlphaS result:\n"
7556  << "\tAfter reset, alphas scale: " << scale_.scale << ", PDF scale: " << facscale_.facscale << ", alphas(Qren): " << alphasVal << ", alphas(MZ): " << alphasmzVal << endl;
7557  }
7558  return sum_msqjk;
7559 }
7560 
7561 // bbH, H undecayed
7563  const TVar::Process& process, const TVar::Production& production, const TVar::MatrixElement& matrixElement,
7564  event_scales_type* event_scales, MelaIO* RcdME,
7565  const double& EBEAM,
7566  int botProcess,
7567  TVar::VerbosityLevel verbosity
7568  ){
7569  const double GeV=1./100.; // JHUGen mom. scale factor
7570  double sum_msqjk = 0;
7571  double MatElsq[nmsq][nmsq]={ { 0 } };
7572  double MatElsq_tmp[nmsq][nmsq]={ { 0 } };
7573 
7574  if (matrixElement!=TVar::JHUGen){ if (verbosity>=TVar::ERROR) MELAerr << "TUtil::BBHiggsMatEl: Non-JHUGen MEs are not supported." << endl; return sum_msqjk; }
7575  if (production!=TVar::bbH){ if (verbosity>=TVar::ERROR) MELAerr << "TUtil::BBHiggsMatEl: Only bbH is supported." << endl; return sum_msqjk; }
7576 
7577  int partIncCode=TVar::kUseAssociated_Jets; // Look for jets
7578  int nRequested_AssociatedJets=2;
7579 
7580  simple_event_record mela_event;
7581  mela_event.AssociationCode=partIncCode;
7582  mela_event.nRequested_AssociatedJets=nRequested_AssociatedJets;
7584  RcdME->melaCand,
7585  mela_event,
7586  verbosity
7587  );
7588 
7589  if (mela_event.pAssociated.size()<2){
7590  if (verbosity>=TVar::ERROR) MELAerr
7591  << "TUtil::BBHiggsMatEl: Number of stable bs (" << mela_event.pAssociated.size() << ")"
7592  <<" in bbH process is not 2!" << endl;
7593  return sum_msqjk;
7594  }
7595 
7596  SimpleParticleCollection_t topDaughters;
7597  SimpleParticleCollection_t antitopDaughters;
7598  bool isUnknown[2]; isUnknown[0]=false; isUnknown[1]=false;
7599 
7600  if (mela_event.pAssociated.at(0).first>=0){ topDaughters.push_back(mela_event.pAssociated.at(0)); isUnknown[0]=(PDGHelpers::isAnUnknownJet(mela_event.pAssociated.at(0).first)); }
7601  else antitopDaughters.push_back(mela_event.pAssociated.at(0));
7602  if (mela_event.pAssociated.at(1).first<=0){ antitopDaughters.push_back(mela_event.pAssociated.at(1)); isUnknown[1]=(PDGHelpers::isAnUnknownJet(mela_event.pAssociated.at(1).first)); }
7603  else topDaughters.push_back(mela_event.pAssociated.at(1));
7604 
7605  // Start assigning the momenta
7606  // 0,1: p1 p2
7607  // 2-4: H,tb,t
7608  // 5-8: bb,W-,f,fb
7609  // 9-12: b,W+,fb,f
7610  double p4[13][4]={ { 0 } };
7611  double MYIDUP_prod[2]={ 0 };
7612  TLorentzVector MomStore[mxpart];
7613  for (int i = 0; i < mxpart; i++) MomStore[i].SetXYZT(0, 0, 0, 0);
7614  for (int ipar=0; ipar<2; ipar++){
7615  TLorentzVector* momTmp = &(mela_event.pMothers.at(ipar).second);
7616  int* idtmp = &(mela_event.pMothers.at(ipar).first);
7617  if (!PDGHelpers::isAnUnknownJet(*idtmp)) MYIDUP_prod[ipar] = *idtmp;
7618  else MYIDUP_prod[ipar] = 0;
7619  if (momTmp->T()>0.){
7620  p4[ipar][0] = -momTmp->T()*GeV;
7621  p4[ipar][1] = -momTmp->X()*GeV;
7622  p4[ipar][2] = -momTmp->Y()*GeV;
7623  p4[ipar][3] = -momTmp->Z()*GeV;
7624  MomStore[ipar] = (*momTmp);
7625  }
7626  else{
7627  p4[ipar][0] = momTmp->T()*GeV;
7628  p4[ipar][1] = momTmp->X()*GeV;
7629  p4[ipar][2] = momTmp->Y()*GeV;
7630  p4[ipar][3] = momTmp->Z()*GeV;
7631  MomStore[ipar] = -(*momTmp);
7632  MYIDUP_prod[ipar] = -MYIDUP_prod[ipar];
7633  }
7634  }
7635 
7636  // Assign b momenta
7637  for (unsigned int ipar=0; ipar<topDaughters.size(); ipar++){
7638  TLorentzVector* momTmp = &(topDaughters.at(ipar).second);
7639  p4[4][0] = momTmp->T()*GeV;
7640  p4[4][1] = momTmp->X()*GeV;
7641  p4[4][2] = momTmp->Y()*GeV;
7642  p4[4][3] = momTmp->Z()*GeV;
7643  MomStore[6] = MomStore[6] + (*momTmp); // MomStore (I1, I2, 0, 0, 0, H, J1, J2)
7644  }
7645 
7646  // Assign bb momenta
7647  for (unsigned int ipar=0; ipar<antitopDaughters.size(); ipar++){
7648  TLorentzVector* momTmp = &(antitopDaughters.at(ipar).second);
7649  p4[3][0] = momTmp->T()*GeV;
7650  p4[3][1] = momTmp->X()*GeV;
7651  p4[3][2] = momTmp->Y()*GeV;
7652  p4[3][3] = momTmp->Z()*GeV;
7653  MomStore[7] = MomStore[7] + (*momTmp); // MomStore (I1, I2, 0, 0, 0, H, J1, J2)
7654  }
7655 
7656  for (unsigned int ipar=0; ipar<mela_event.pDaughters.size(); ipar++){
7657  TLorentzVector* momTmp = &(mela_event.pDaughters.at(ipar).second);
7658  p4[2][0] += momTmp->T()*GeV;
7659  p4[2][1] += momTmp->X()*GeV;
7660  p4[2][2] += momTmp->Y()*GeV;
7661  p4[2][3] += momTmp->Z()*GeV;
7662  MomStore[5] = MomStore[5] + (*momTmp); // i==(2, 3, 4) is (J1, J2, H), recorded as MomStore (I1, I2, 0, 0, 0, H, J1, J2)
7663  }
7664 
7665  if (verbosity >= TVar::DEBUG){
7666  for (int ii=0; ii<13; ii++){ MELAout << "p4[" << ii << "] = "; for (int jj=0; jj<4; jj++) MELAout << p4[ii][jj]/GeV << '\t'; MELAout << endl; }
7667  }
7668 
7669  double defaultRenScale = scale_.scale;
7670  double defaultFacScale = facscale_.facscale;
7671  //MELAout << "Default scales: " << defaultRenScale << '\t' << defaultFacScale << endl;
7672  int defaultNloop = nlooprun_.nlooprun;
7673  int defaultNflav = nflav_.nflav;
7674  string defaultPdflabel = pdlabel_.pdlabel;
7675  double renQ = InterpretScaleScheme(production, matrixElement, event_scales->renomalizationScheme, MomStore);
7676  double facQ = InterpretScaleScheme(production, matrixElement, event_scales->factorizationScheme, MomStore);
7677  SetAlphaS(renQ, facQ, event_scales->ren_scale_factor, event_scales->fac_scale_factor, 1, 5, "cteq6_l");
7678  double alphasVal, alphasmzVal;
7679  GetAlphaS(&alphasVal, &alphasmzVal);
7680  RcdME->setRenormalizationScale(renQ);
7681  RcdME->setFactorizationScale(facQ);
7682  RcdME->setAlphaS(alphasVal);
7683  RcdME->setAlphaSatMZ(alphasmzVal);
7684  RcdME->setHiggsMassWidth(masses_mcfm_.hmass, masses_mcfm_.hwidth, 0);
7686  if (verbosity>=TVar::DEBUG){
7687  MELAout
7688  << "TUtil::BBHiggsMatEl: Set AlphaS:\n"
7689  << "\tBefore set, alphas scale: " << defaultRenScale << ", PDF scale: " << defaultFacScale << '\n'
7690  << "\trenQ: " << renQ << " ( x " << event_scales->ren_scale_factor << "), facQ: " << facQ << " ( x " << event_scales->fac_scale_factor << ")\n"
7691  << "\tAfter set, alphas scale: " << scale_.scale << ", PDF scale: " << facscale_.facscale << ", alphas(Qren): " << alphasVal << ", alphas(MZ): " << alphasmzVal << endl;
7692  }
7693 
7694  __modttbhiggs_MOD_evalxsec_pp_bbbh(p4, &botProcess, MatElsq);
7695  if (isUnknown[0] && isUnknown[1]){
7696  for (unsigned int ix=0; ix<4; ix++) swap(p4[3][ix], p4[4][ix]);
7697  __modttbhiggs_MOD_evalxsec_pp_bbbh(p4, &botProcess, MatElsq_tmp);
7698  for (int ix=0; ix<11; ix++){ for (int iy=0; iy<11; iy++) MatElsq[iy][ix] = (MatElsq[iy][ix]+MatElsq_tmp[iy][ix])/2.; }
7699  }
7700 
7701  int GeVexponent_MEsq = 4-(1+nRequested_AssociatedJets)*2;
7702  double constant = pow(GeV, -GeVexponent_MEsq);
7703  for (int ii=0; ii<nmsq; ii++){ for (int jj=0; jj<nmsq; jj++) MatElsq[jj][ii] *= constant; }
7704  if (verbosity>=TVar::DEBUG){
7705  MELAout << "TUtil::BBHiggsMatEl: MEsq[ip][jp] = " << endl;
7706  for (int iquark=-5; iquark<=5; iquark++){
7707  for (int jquark=-5; jquark<=5; jquark++) MELAout << MatElsq[jquark+5][iquark+5] << '\t';
7708  MELAout << endl;
7709  }
7710  }
7711  sum_msqjk = SumMEPDF(MomStore[0], MomStore[1], MatElsq, RcdME, EBEAM, verbosity);
7712 
7713  if (verbosity>=TVar::DEBUG){
7714  MELAout
7715  << "TUtil::BBHiggsMatEl: Reset AlphaS:\n"
7716  << "\tBefore reset, alphas scale: " << scale_.scale << ", PDF scale: " << facscale_.facscale << endl;
7717  }
7718  SetAlphaS(defaultRenScale, defaultFacScale, 1., 1., defaultNloop, defaultNflav, defaultPdflabel);
7719  if (verbosity>=TVar::DEBUG){
7720  GetAlphaS(&alphasVal, &alphasmzVal);
7721  MELAout
7722  << "TUtil::BBHiggsMatEl: Reset AlphaS result:\n"
7723  << "\tAfter reset, alphas scale: " << scale_.scale << ", PDF scale: " << facscale_.facscale << ", alphas(Qren): " << alphasVal << ", alphas(MZ): " << alphasmzVal << endl;
7724  }
7725  return sum_msqjk;
7726 }
7727 
7728 // Wipe MEs
7729 int TUtil::WipeMEArray(const TVar::Process& process, const TVar::Production& production, const int id[mxpart], double msq[nmsq][nmsq], const TVar::VerbosityLevel& verbosity){
7730  if (verbosity>=TVar::DEBUG){
7731  MELAout << "TUtil::WipeMEArray: Initial MEsq:" << endl;
7732  for (int iquark=-5; iquark<=5; iquark++){
7733  for (int jquark=-5; jquark<=5; jquark++) MELAout << msq[jquark+5][iquark+5] << '\t';
7734  MELAout << endl;
7735  }
7736  }
7737  int nInstances=0;
7738  if (
7740  ||
7742  ){
7743  // Sum over valid MEs without PDF weights
7744  // By far the dominant contribution is uub initial state.
7745  for (int iquark=-5; iquark<=5; iquark++){
7746  for (int jquark=-5; jquark<=5; jquark++){
7747  if (
7748  (PDGHelpers::isAnUnknownJet(id[0]) || (PDGHelpers::isAGluon(id[0]) && iquark==0) || iquark==id[0])
7749  &&
7750  (PDGHelpers::isAnUnknownJet(id[1]) || (PDGHelpers::isAGluon(id[1]) && jquark==0) || jquark==id[1])
7751  ){
7752  if (msq[jquark+5][iquark+5]>0.) nInstances++;
7753  }
7754  else msq[jquark+5][iquark+5]=0; // Kill the ME instance if mothers are known and their ids do not match the PDF indices.
7755  }
7756  }
7757  }
7758  else if (production == TVar::ZZGG){
7759  if (
7761  &&
7763  ){
7764  if (msq[5][5]>0.) nInstances=1;
7765  }
7766  else msq[5][5]=0; // Kill the ME instance if mothers are known and their ids do not match to gluons.
7767  }
7768  else if (
7779  ){
7780  // Z+2 jets
7781  if (process == TVar::bkgZJets){
7782  for (int iquark=-5; iquark<=5; iquark++){
7783  for (int jquark=-5; jquark<=5; jquark++){
7784  if (
7785  (PDGHelpers::isAnUnknownJet(id[0]) || (PDGHelpers::isAGluon(id[0]) && iquark==0) || iquark==id[0])
7786  &&
7787  (PDGHelpers::isAnUnknownJet(id[1]) || (PDGHelpers::isAGluon(id[1]) && jquark==0) || jquark==id[1])
7788  ){
7789  if (msq[jquark+5][iquark+5]>0.) nInstances++;
7790  }
7791  else msq[jquark+5][iquark+5]=0; // Kill the ME instance if mothers are known and their ids do not match the PDF indices.
7792  }
7793  }
7794  }
7795  // VBF or QCD MCFM SBI, S or B
7796  else{
7797  for (int iquark=-5; iquark<=5; iquark++){
7798  for (int jquark=-5; jquark<=5; jquark++){
7799  if (
7800  (
7801  PDGHelpers::isAnUnknownJet(id[0]) || (PDGHelpers::isAGluon(id[0]) && iquark==0) || iquark==id[0]
7802  )
7803  &&
7804  (
7805  PDGHelpers::isAnUnknownJet(id[1]) || (PDGHelpers::isAGluon(id[1]) && jquark==0) || jquark==id[1]
7806  )
7807  ){
7808  // Kill all non-VH initial parton states
7809  if (
7810  (
7811  (
7815  )
7816  &&
7817  (
7818  (TMath::Sign(1, iquark)==TMath::Sign(1, jquark))
7819  ||
7821  ||
7823  )
7824  )
7825  ||
7826  (
7827  (
7831  )
7832  &&
7833  (iquark!=-jquark)
7834  )
7835  ) msq[jquark+5][iquark+5]=0;
7836 
7837  // Check against a hash
7838  int order[2]={ -1, -1 };
7839  TMCFMUtils::AssociatedParticleOrdering_QQVVQQAny(iquark, jquark, id[6], id[7], order);
7840  if (order[0]<0 || order[1]<0) msq[jquark+5][iquark+5]=0;
7841 
7842  if (msq[jquark+5][iquark+5]>0.) nInstances++;
7843  }
7844  else msq[jquark+5][iquark+5]=0; // Kill the ME instance if mothers are known and their ids do not match the PDF indices.
7845  }
7846  }
7847  }
7848  }
7849  return nInstances;
7850 }
7851 // CheckPartonMomFraction computes xx[0:1] based on p0, p1
7852 bool TUtil::CheckPartonMomFraction(const TLorentzVector& p0, const TLorentzVector& p1, double xx[2], const double& EBEAM, const TVar::VerbosityLevel& verbosity){
7853  //Make sure parton Level Energy fraction is [0,1]
7854  //phase space function already makes sure the parton energy fraction between [min,1]
7855  xx[0]=p0.P()/EBEAM;
7856  xx[1]=p1.P()/EBEAM;
7857  if (
7858  xx[0]>1. || xx[0]<=xmin_.xmin
7859  ||
7860  xx[1]>1. || xx[1]<=xmin_.xmin
7861  ||
7862  EBEAM<=0.
7863  ){
7864  if (verbosity>=TVar::ERROR){
7865  if (xx[0]>1. || xx[1]>1.) MELAerr << "TUtil::CheckPartonMomFraction: At least one of the parton momentum fractions is greater than 1." << endl;
7866  else if (xx[0]<=xmin_.xmin || xx[1]<=xmin_.xmin) MELAerr << "TUtil::CheckPartonMomFraction: At least one of the parton momentum fractions is less than or equal to " << xmin_.xmin << "." << endl;
7867  else MELAerr << "TUtil::CheckPartonMomFraction: EBEAM=" << EBEAM << "<=0." << endl;
7868  }
7869  return false;
7870  }
7871  else{
7872  if (verbosity>=TVar::DEBUG) MELAout << "TUtil::CheckPartonMomFraction: xx[0]: " << xx[0] << ", xx[1] = " << xx[1] << ", xmin = " << xmin_.xmin << endl;
7873  return true;
7874  }
7875 }
7876 // ComputePDF does the PDF computation
7877 void TUtil::ComputePDF(const TLorentzVector& p0, const TLorentzVector& p1, double fx1[nmsq], double fx2[nmsq], const double& EBEAM, const TVar::VerbosityLevel& verbosity){
7878  if (verbosity>=TVar::DEBUG) MELAout << "Begin TUtil::ComputePDF"<< endl;
7879  double xx[2]={ 0 };
7880  if (CheckPartonMomFraction(p0, p1, xx, EBEAM, verbosity)){
7882  double fx1x2_jhu[2][13]={ { 0 } };
7883  if (verbosity>=TVar::DEBUG) MELAout << "TUtil::ComputePDF: Calling setpdfs with xx[0]: " << xx[0] << ", xx[1] = " << xx[1] << endl;
7884  __modkinematics_MOD_setpdfs(&(xx[0]), &(xx[1]), fx1x2_jhu);
7885  if (verbosity>=TVar::DEBUG) MELAout << "TUtil::ComputePDF: called"<< endl;
7886  for (int ip=-6; ip<=6; ip++){
7887  // JHUGen assignment is in JHU id coventions (up <-> down, g==g)
7888  int fac=0;
7889  if (ip!=0 && (abs(ip)%2==0)) fac=-1;
7890  else if (ip!=0) fac=+1;
7891  if (ip<0) fac=-fac;
7892  int jp=ip+fac;
7893  fx1[jp+5]=fx1x2_jhu[0][ip+6];
7894  fx2[jp+5]=fx1x2_jhu[1][ip+6];
7895  }
7896  /*
7898  //Calculate Pdf
7899  //Parton Density Function is always evalualted at pT=0 frame
7900  //Always pass address through fortran function
7901  fdist_(&density_.ih1, &xx[0], &facscale_.facscale, fx1);
7902  fdist_(&density_.ih2, &xx[1], &facscale_.facscale, fx2);
7903  */
7904  }
7905  if (verbosity>=TVar::DEBUG){
7906  MELAout << "End TUtil::ComputePDF:"<< endl;
7907  for (int ip=-nf; ip<=nf; ip++) MELAout << "(fx1, fx2)[" << ip << "] = (" << fx1[ip+5] << " , " << fx2[ip+5] << ")" << endl;
7908  }
7909 }
7910 // SumMEPDF sums over all production parton flavors according to PDF and calls ComputePDF
7911 double TUtil::SumMEPDF(const TLorentzVector& p0, const TLorentzVector& p1, double msq[nmsq][nmsq], MelaIO* RcdME, const double& EBEAM, const TVar::VerbosityLevel& verbosity){
7912  if (verbosity>=TVar::DEBUG) MELAout << "Begin TUtil::SumMEPDF"<< endl;
7913  double fx1[nmsq]={ 0 };
7914  double fx2[nmsq]={ 0 };
7915  //double wgt_msq[nmsq][nmsq]={ { 0 } };
7916 
7917  ComputePDF(p0, p1, fx1, fx2, EBEAM, verbosity);
7918  if (verbosity>=TVar::DEBUG) MELAout << "TUtil::SumMEPDF: Setting RcdME"<< endl;
7919  RcdME->setPartonWeights(fx1, fx2);
7920  RcdME->setMEArray(msq, true);
7921  RcdME->computeWeightedMEArray();
7922  //RcdME->getWeightedMEArray(wgt_msq);
7923  if (verbosity>=TVar::DEBUG) MELAout << "End TUtil::SumMEPDF"<< endl;
7924  return RcdME->getSumME();
7925 }
7926 
7927 
7928 // Propagator reweighting
7931 
7932  const double GeV=1./100.; // JHUGen mom. scale factor
7933  int isch=(int)scheme;
7934  double shat_jhu = pow(sqrts*GeV, 2);
7935  double prop = __modkinematics_MOD_getbwpropagator(&shat_jhu, &isch);
7936  if (scheme!=TVar::NoPropagator) prop *= pow(GeV, 4);
7937  return prop;
7938 }
7939 
7940 
7941 // GetBoostedParticleVectors decomposes the MELACandidate object melaCand into mothers, daughters, associateds and tops
7942 // and boosts them to the pT=0 frame for the particular mela_event.AssociationCode, which is a product of TVar::kUseAssociated* (prime numbers).
7943 // If no mothers are present, it assigns mothers as Z>0, Z<0. If they are present, it orders them as "incoming" q-qbar / g-qbar / q-g / g-g
7944 // Associated particles passed are different based on the code. If code==1, no associated particles are passed.
7945 // mela_event.intermediateVids are needed to keep track of the decay mode. TVar::Process or TVar::Production do not keep track of the V/f decay modes.
7946 // This is the major replacement functionality of the TVar lepton flavors.
7948  MELACandidate* melaCand,
7949  simple_event_record& mela_event,
7950  TVar::VerbosityLevel verbosity
7951  ){
7952  if (verbosity>=TVar::DEBUG) MELAout << "Begin GetBoostedParticleVectors" << endl;
7953  // This is the beginning of one long function.
7954 
7955  int const& code = mela_event.AssociationCode;
7956  if (verbosity>=TVar::DEBUG) MELAout << "TUtil::GetBoostedParticleVectors: code=" << code << endl;
7957  int const& aVhypo = mela_event.AssociationVCompatibility;
7958  TLorentzVector const nullFourVector(0, 0, 0, 0);
7959 
7961  vector<int> idVstar; idVstar.reserve(2);
7962  if (melaCand->getNDaughters()==0){
7963  // Undecayed Higgs has V1=H, V2=empty, no sortedDaughters!
7964  daughters.push_back(SimpleParticle_t(melaCand->id, melaCand->p4));
7965  idVstar.push_back(melaCand->id);
7966  idVstar.push_back(-9000);
7967  }
7968  else{
7969  // H->ffb has V1=f->f, V2=fb->fb
7970  // H->GG has V1=G->G, V2=G->G
7971  // H->ZG has V1=Z->ffb, V2=G->G
7972  // Everything else is as expected.
7973  for (unsigned char iv=0; iv<2; iv++){ // 2 Vs are guaranteed in MELACandidate.
7974  MELAParticle* Vdau = melaCand->getSortedV(iv);
7975  if (Vdau){
7976  int idtmp = Vdau->id;
7977  for (MELAParticle* Vdau_i:Vdau->getDaughters()){
7978  if (Vdau_i && Vdau_i->passSelection) daughters.push_back(SimpleParticle_t(Vdau_i->id, Vdau_i->p4));
7979  }
7980  if (idtmp!=0 || Vdau->getNDaughters()>0){ // Avoid "empty" intermediate Vs of the MELACandidate object
7981  if (Vdau->getNDaughters()>=2 && PDGHelpers::isAPhoton(idtmp)) idtmp=23; // Special case to avoid V->2f with massless decay mode (could happen by mistake)
7982  idVstar.push_back(idtmp);
7983  }
7984  }
7985  else idVstar.push_back(-9000);
7986  }
7987  }
7988  if (daughters.size()>=2){
7989  size_t nffs = daughters.size()/2;
7990  for (size_t iv=0; iv<nffs; iv++){
7991  pair<TLorentzVector, TLorentzVector> corrPair = TUtil::removeMassFromPair(
7992  daughters.at(2*iv+0).second, daughters.at(2*iv+0).first,
7993  daughters.at(2*iv+1).second, daughters.at(2*iv+1).first
7994  );
7995  daughters.at(2*iv+0).second = corrPair.first;
7996  daughters.at(2*iv+1).second = corrPair.second;
7997  }
7998  if (2*nffs<daughters.size()){
7999  TLorentzVector tmp = nullFourVector;
8000  SimpleParticle_t& lastDau = daughters.back();
8001  pair<TLorentzVector, TLorentzVector> corrPair = TUtil::removeMassFromPair(
8002  lastDau.second, lastDau.first,
8003  tmp, -9000
8004  );
8005  lastDau.second = corrPair.first;
8006  }
8007  }
8008 
8009  /***** ASSOCIATED PARTICLES *****/
8010  if (verbosity>=TVar::DEBUG){
8011  MELAout << "TUtil::GetBoostedParticleVectors: nRequestedLeps=" << mela_event.nRequested_AssociatedLeptons << endl;
8012  MELAout << "TUtil::GetBoostedParticleVectors: nRequestedJets=" << mela_event.nRequested_AssociatedJets << endl;
8013  MELAout << "TUtil::GetBoostedParticleVectors: nRequestedPhotons=" << mela_event.nRequested_AssociatedPhotons << endl;
8014  }
8015  int nsatisfied_jets=0;
8016  int nsatisfied_lnus=0;
8017  int nsatisfied_gammas=0;
8018  vector<MELAParticle*> candidateVs; // Used if aVhypo!=0
8020  if (aVhypo!=0){
8021  if (verbosity>=TVar::DEBUG) MELAout << "TUtil::GetBoostedParticleVectors: aVhypo!=0 case start" << endl;
8022 
8023  vector<MELAParticle*> asortedVs = melaCand->getAssociatedSortedVs();
8024  for (MELAParticle* Vdau:asortedVs){ // Loop over associated Vs
8025  if (Vdau){
8026  bool doAdd=false;
8027  int idV = Vdau->id;
8028  if ((abs(idV)==aVhypo || idV==0) && Vdau->getNDaughters()>0 && Vdau->passSelection){ // If the V is unknown or compatible with the requested hypothesis
8029  doAdd=true;
8030  for (MELAParticle* Vdau_i:Vdau->getDaughters()){ // Loop over the daughters of V
8031  if (!Vdau_i){ doAdd=false; break; }
8032  else if (
8033  (mela_event.nRequested_AssociatedLeptons==0 && (PDGHelpers::isALepton(Vdau_i->id) || PDGHelpers::isANeutrino(Vdau_i->id)))
8034  ||
8035  (mela_event.nRequested_AssociatedJets==0 && PDGHelpers::isAJet(Vdau_i->id))
8036  ||
8037  !Vdau_i->passSelection // Protection against incorrect Vdau passSelection flag
8038  ){
8039  doAdd=false; break;
8040  }
8041  }
8042  }
8043  if (doAdd) candidateVs.push_back(Vdau);
8044  }
8045  } // End loop over associated Vs
8046 
8047  if (verbosity>=TVar::DEBUG) MELAout << "TUtil::GetBoostedParticleVectors: candidateVs size = " << candidateVs.size() << endl;
8048 
8049  // Pick however many candidates necessary to fill up the requested number of jets or lepton(+)neutrinos
8050  for (MELAParticle* Vdau:candidateVs){
8051  SimpleParticleCollection_t associated_tmp;
8052  for (MELAParticle* part:Vdau->getDaughters()){ // Loop over the daughters of V
8053  if (
8054  part->passSelection
8055  &&
8056  (PDGHelpers::isALepton(part->id) || PDGHelpers::isANeutrino(part->id))
8057  &&
8058  nsatisfied_lnus<mela_event.nRequested_AssociatedLeptons
8059  ){
8060  nsatisfied_lnus++;
8061  associated_tmp.push_back(SimpleParticle_t(part->id, part->p4));
8062  }
8063  else if (
8064  part->passSelection
8065  &&
8066  PDGHelpers::isAJet(part->id)
8067  &&
8068  nsatisfied_jets<mela_event.nRequested_AssociatedJets
8069  ){
8070  nsatisfied_jets++;
8071  associated_tmp.push_back(SimpleParticle_t(part->id, part->p4));
8072  }
8073  }
8074  // Add the id of the intermediate V into the idVstar array
8075  if (associated_tmp.size()>=2 || (associated_tmp.size()==1 && PDGHelpers::isAPhoton(associated_tmp.at(0).first))) idVstar.push_back(Vdau->id); // Only add the V-id of pairs that passed
8076  // Adjust the kinematics of associated V-originating particles
8077  if (associated_tmp.size()>=2){ // ==1 means a photon, so omit it here.
8078  unsigned int nffs = associated_tmp.size()/2;
8079  for (unsigned int iv=0; iv<nffs; iv++){
8080  pair<TLorentzVector, TLorentzVector> corrPair = TUtil::removeMassFromPair(
8081  associated_tmp.at(2*iv+0).second, associated_tmp.at(2*iv+0).first,
8082  associated_tmp.at(2*iv+1).second, associated_tmp.at(2*iv+1).first
8083  );
8084  associated_tmp.at(2*iv+0).second = corrPair.first;
8085  associated_tmp.at(2*iv+1).second = corrPair.second;
8086  }
8087  if (2*nffs<associated_tmp.size()){
8088  TLorentzVector tmp = nullFourVector;
8089  pair<TLorentzVector, TLorentzVector> corrPair = TUtil::removeMassFromPair(
8090  associated_tmp.at(associated_tmp.size()-1).second, associated_tmp.at(associated_tmp.size()-1).first,
8091  tmp, -9000
8092  );
8093  associated_tmp.at(associated_tmp.size()-1).second = corrPair.first;
8094  }
8095  }
8096  for (SimpleParticle_t& sp:associated_tmp) associated.push_back(sp); // Fill associated at the last step
8097  }
8098 
8099  if (verbosity>=TVar::DEBUG) MELAout << "TUtil::GetBoostedParticleVectors: aVhypo!=0 case associated.size=" << associated.size() << endl;
8100  }
8101  else{ // Could be split to aVhypo==0 and aVhypo<0 if associated V+jets is needed
8102  // Associated leptons
8103  if (verbosity>=TVar::DEBUG) MELAout << "TUtil::GetBoostedParticleVectors: aVhypo==0 case begin" << endl;
8104 
8105  if (code%TVar::kUseAssociated_Leptons==0){
8106  SimpleParticleCollection_t associated_tmp;
8107  for (MELAParticle* part:melaCand->getAssociatedLeptons()){
8108  if (part && part->passSelection && nsatisfied_lnus<mela_event.nRequested_AssociatedLeptons){
8109  nsatisfied_lnus++;
8110  associated_tmp.push_back(SimpleParticle_t(part->id, part->p4));
8111  }
8112  }
8113 
8114  if (verbosity>=TVar::DEBUG) MELAout << "TUtil::GetBoostedParticleVectors: aVhypo==0 lep case associated_tmp.size=" << associated_tmp.size() << endl;
8115 
8116  // Adjust the kinematics of associated non-V-originating particles
8117  if (associated_tmp.size()>=1){
8118  size_t nffs = associated_tmp.size()/2;
8119  for (size_t iv=0; iv<nffs; iv++){
8120  if (verbosity>=TVar::DEBUG) MELAout << "TUtil::GetBoostedParticleVectors: Removing mass from lepton pair " << 2*iv+0 << '\t' << 2*iv+1 << endl;
8121  pair<TLorentzVector, TLorentzVector> corrPair = TUtil::removeMassFromPair(
8122  associated_tmp.at(2*iv+0).second, associated_tmp.at(2*iv+0).first,
8123  associated_tmp.at(2*iv+1).second, associated_tmp.at(2*iv+1).first
8124  );
8125  associated_tmp.at(2*iv+0).second = corrPair.first;
8126  associated_tmp.at(2*iv+1).second = corrPair.second;
8127  }
8128  if (2*nffs<associated_tmp.size()){
8129  if (verbosity>=TVar::DEBUG) MELAout << "TUtil::GetBoostedParticleVectors: Removing mass from last lepton " << associated_tmp.size()-1 << endl;
8130  TLorentzVector tmp = nullFourVector;
8131  SimpleParticle_t& lastAssociated = associated_tmp.at(associated_tmp.size()-1);
8132  pair<TLorentzVector, TLorentzVector> corrPair = TUtil::removeMassFromPair(
8133  lastAssociated.second, lastAssociated.first,
8134  tmp, -9000
8135  );
8136  lastAssociated.second = corrPair.first;
8137  }
8138  }
8139  for (SimpleParticle_t& sp:associated_tmp) associated.push_back(sp); // Fill associated at the last step
8140  }
8141  // Associated jets
8142  if (code%TVar::kUseAssociated_Jets==0){
8143  SimpleParticleCollection_t associated_tmp;
8144  for (MELAParticle* part:melaCand->getAssociatedJets()){
8145  if (part && part->passSelection && nsatisfied_jets<mela_event.nRequested_AssociatedJets){
8146  nsatisfied_jets++;
8147  associated_tmp.push_back(SimpleParticle_t(part->id, part->p4));
8148  }
8149  }
8150 
8151  if (verbosity>=TVar::DEBUG) MELAout << "TUtil::GetBoostedParticleVectors: aVhypo==0 jet case associated_tmp.size=" << associated_tmp.size() << endl;
8152 
8153  // Adjust the kinematics of associated non-V-originating particles
8154  if (associated_tmp.size()>=1){
8155  unsigned int nffs = associated_tmp.size()/2;
8156  for (unsigned int iv=0; iv<nffs; iv++){
8157  if (verbosity>=TVar::DEBUG) MELAout << "TUtil::GetBoostedParticleVectors: Removing mass from jet pair " << 2*iv+0 << '\t' << 2*iv+1 << endl;
8158  pair<TLorentzVector, TLorentzVector> corrPair = TUtil::removeMassFromPair(
8159  associated_tmp.at(2*iv+0).second, associated_tmp.at(2*iv+0).first,
8160  associated_tmp.at(2*iv+1).second, associated_tmp.at(2*iv+1).first
8161  );
8162  associated_tmp.at(2*iv+0).second = corrPair.first;
8163  associated_tmp.at(2*iv+1).second = corrPair.second;
8164  }
8165  if (2*nffs<associated_tmp.size()){
8166  if (verbosity>=TVar::DEBUG) MELAout << "TUtil::GetBoostedParticleVectors: Removing mass from last jet " << associated_tmp.size()-1 << endl;
8167  TLorentzVector tmp = nullFourVector;
8168  SimpleParticle_t& lastAssociated = associated_tmp.at(associated_tmp.size()-1);
8169  pair<TLorentzVector, TLorentzVector> corrPair = TUtil::removeMassFromPair(
8170  lastAssociated.second, lastAssociated.first,
8171  tmp, -9000
8172  );
8173  lastAssociated.second = corrPair.first;
8174  }
8175  }
8176  for (SimpleParticle_t& sp:associated_tmp) associated.push_back(sp); // Fill associated at the last step
8177  }
8178 
8179  } // End if(aVhypo!=0)-else statement
8180 
8181  if (code%TVar::kUseAssociated_Photons==0){
8182  for (MELAParticle* part:melaCand->getAssociatedPhotons()){
8183  if (part && part->passSelection && nsatisfied_gammas<mela_event.nRequested_AssociatedPhotons){
8184  nsatisfied_gammas++;
8185  associated.push_back(SimpleParticle_t(part->id, part->p4));
8186  }
8187  }
8188  }
8189  /***** END ASSOCIATED PARTICLES *****/
8190 
8191  if (verbosity>=TVar::DEBUG) MELAout << "TUtil::GetBoostedParticleVectors: associated.size=" << associated.size() << endl;
8192 
8193  /***** ASSOCIATED TOP OBJECTS *****/
8194  int nsatisfied_tops=0;
8195  int nsatisfied_antitops=0;
8196  vector<SimpleParticleCollection_t> topDaughters;
8197  vector<SimpleParticleCollection_t> antitopDaughters;
8198  SimpleParticleCollection_t stableTops;
8199  SimpleParticleCollection_t stableAntitops;
8200 
8201  vector<MELATopCandidate_t*> tops;
8202  vector<MELATopCandidate_t*> topbars;
8203  vector<MELATopCandidate_t*> unknowntops;
8204  if (code%TVar::kUseAssociated_StableTops==0 && code%TVar::kUseAssociated_UnstableTops==0 && verbosity>=TVar::INFO) MELAerr << "TUtil::GetBoostedParticleVectors: Stable and unstable tops are not supported at the same time!" << endl;
8206 
8207  for (MELATopCandidate_t* theTop:melaCand->getAssociatedTops()){
8208  if (theTop && theTop->passSelection){
8209  vector<MELATopCandidate_t*>* particleArray;
8210  if (theTop->id==6) particleArray = &tops;
8211  else if (theTop->id==-6) particleArray = &topbars;
8212  else particleArray = &unknowntops;
8213  if (
8215  ||
8216  (theTop->getNDaughters()==3 && code%TVar::kUseAssociated_UnstableTops==0)
8217  ) particleArray->push_back(theTop);
8218  }
8219  }
8220  if (verbosity>=TVar::DEBUG){ MELAout << "TUtil::GetBoostedParticleVectors: tops.size=" << tops.size() << ", topbars.size=" << topbars.size() << ", unknowntops.size=" << unknowntops.size() << endl; }
8221 
8222  // Fill the stable/unstable top arrays
8223  for (MELATopCandidate_t* theTop:tops){
8224  if (code%TVar::kUseAssociated_StableTops==0 && nsatisfied_tops<mela_event.nRequested_Tops){ // Case with no daughters needed
8225  nsatisfied_tops++;
8226  stableTops.push_back(SimpleParticle_t(theTop->id, theTop->p4));
8227  }
8228  else if (code%TVar::kUseAssociated_UnstableTops==0 && theTop->getNDaughters()==3 && nsatisfied_tops<mela_event.nRequested_Tops){ // Case with daughters needed
8229  nsatisfied_tops++;
8230  SimpleParticleCollection_t vdaughters;
8231 
8232  MELAParticle* bottom = theTop->getPartnerParticle();
8233  MELAParticle* Wf = theTop->getWFermion();
8234  MELAParticle* Wfb = theTop->getWAntifermion();
8235  if (bottom) vdaughters.push_back(SimpleParticle_t(bottom->id, bottom->p4));
8236  if (Wf) vdaughters.push_back(SimpleParticle_t(Wf->id, Wf->p4));
8237  if (Wfb) vdaughters.push_back(SimpleParticle_t(Wfb->id, Wfb->p4));
8238 
8239  TUtil::adjustTopDaughters(vdaughters); // Adjust top daughter kinematics
8240  if (vdaughters.size()==3) topDaughters.push_back(vdaughters);
8241  }
8242  }
8243  for (MELATopCandidate_t* theTop:topbars){
8244  if (code%TVar::kUseAssociated_StableTops==0 && nsatisfied_antitops<mela_event.nRequested_Antitops){ // Case with no daughters needed
8245  nsatisfied_antitops++;
8246  stableAntitops.push_back(SimpleParticle_t(theTop->id, theTop->p4));
8247  }
8248  else if (code%TVar::kUseAssociated_UnstableTops==0 && nsatisfied_antitops<mela_event.nRequested_Antitops){ // Case with daughters needed
8249  nsatisfied_antitops++;
8250  SimpleParticleCollection_t vdaughters;
8251 
8252  MELAParticle* bottom = theTop->getPartnerParticle();
8253  MELAParticle* Wf = theTop->getWFermion();
8254  MELAParticle* Wfb = theTop->getWAntifermion();
8255  if (bottom) vdaughters.push_back(SimpleParticle_t(bottom->id, bottom->p4));
8256  if (Wf) vdaughters.push_back(SimpleParticle_t(Wf->id, Wf->p4));
8257  if (Wfb) vdaughters.push_back(SimpleParticle_t(Wfb->id, Wfb->p4));
8258 
8259  TUtil::adjustTopDaughters(vdaughters); // Adjust top daughter kinematics
8260  if (vdaughters.size()==3) antitopDaughters.push_back(vdaughters);
8261  }
8262  else break;
8263  }
8264  // Loop over the unknown-id tops
8265  // Fill tops, then antitops from the unknown tops
8266  for (MELATopCandidate_t* theTop:unknowntops){
8267  // t, then tb cases with no daughters needed
8268  if (code%TVar::kUseAssociated_StableTops==0 && nsatisfied_tops<mela_event.nRequested_Tops){
8269  nsatisfied_tops++;
8270  stableTops.push_back(SimpleParticle_t(theTop->id, theTop->p4));
8271  }
8272  else if (code%TVar::kUseAssociated_StableTops==0 && nsatisfied_antitops<mela_event.nRequested_Antitops){
8273  nsatisfied_antitops++;
8274  stableAntitops.push_back(SimpleParticle_t(theTop->id, theTop->p4));
8275  }
8276  // t, then tb cases with daughters needed
8277  else if (code%TVar::kUseAssociated_UnstableTops==0 && nsatisfied_tops<mela_event.nRequested_Tops){
8278  nsatisfied_tops++;
8279  SimpleParticleCollection_t vdaughters;
8280 
8281  MELAParticle* bottom = theTop->getPartnerParticle();
8282  MELAParticle* Wf = theTop->getWFermion();
8283  MELAParticle* Wfb = theTop->getWAntifermion();
8284  if (bottom) vdaughters.push_back(SimpleParticle_t(bottom->id, bottom->p4));
8285  if (Wf) vdaughters.push_back(SimpleParticle_t(Wf->id, Wf->p4));
8286  if (Wfb) vdaughters.push_back(SimpleParticle_t(Wfb->id, Wfb->p4));
8287 
8288  TUtil::adjustTopDaughters(vdaughters); // Adjust top daughter kinematics
8289  if (vdaughters.size()==3) topDaughters.push_back(vdaughters);
8290  }
8291  else if (code%TVar::kUseAssociated_UnstableTops==0 && nsatisfied_antitops<mela_event.nRequested_Antitops){
8292  nsatisfied_antitops++;
8293  SimpleParticleCollection_t vdaughters;
8294 
8295  MELAParticle* bottom = theTop->getPartnerParticle();
8296  MELAParticle* Wf = theTop->getWFermion();
8297  MELAParticle* Wfb = theTop->getWAntifermion();
8298  if (bottom) vdaughters.push_back(SimpleParticle_t(bottom->id, bottom->p4));
8299  if (Wf) vdaughters.push_back(SimpleParticle_t(Wf->id, Wf->p4));
8300  if (Wfb) vdaughters.push_back(SimpleParticle_t(Wfb->id, Wfb->p4));
8301 
8302  TUtil::adjustTopDaughters(vdaughters); // Adjust top daughter kinematics
8303  if (vdaughters.size()==3) antitopDaughters.push_back(vdaughters);
8304  }
8305  }
8306 
8307  }
8308  /***** END ASSOCIATED TOP OBJECTS *****/
8309  if (verbosity>=TVar::DEBUG){
8310  MELAout << "TUtil::GetBoostedParticleVectors: stableTops.size=" << stableTops.size() << endl;
8311  MELAout << "TUtil::GetBoostedParticleVectors: stableAntitops.size=" << stableAntitops.size() << endl;
8312  MELAout << "TUtil::GetBoostedParticleVectors: topDaughters.size=" << topDaughters.size() << endl;
8313  for (unsigned int itop=0; itop<topDaughters.size(); itop++) MELAout << "TUtil::GetBoostedParticleVectors: topDaughters.at(" << itop << ").size=" << topDaughters.at(itop).size() << endl;
8314  MELAout << "TUtil::GetBoostedParticleVectors: antitopDaughters.size=" << antitopDaughters.size() << endl;
8315  for (unsigned int itop=0; itop<antitopDaughters.size(); itop++) MELAout << "TUtil::GetBoostedParticleVectors: antitopDaughters.at(" << itop << ").size=" << antitopDaughters.at(itop).size() << endl;
8316  }
8317 
8318  /***** BOOSTS TO THE CORRECT PT=0 FRAME *****/
8319  // Gather all final state particles collected for this frame
8320  TLorentzVector pTotal(0, 0, 0, 0);
8321  for (SimpleParticle_t const& sp:daughters) pTotal = pTotal + sp.second;
8322  for (SimpleParticle_t const& sp:associated) pTotal = pTotal + sp.second;
8323  for (SimpleParticle_t const& sp:stableTops) pTotal = pTotal + sp.second;
8324  for (SimpleParticle_t const& sp:stableAntitops) pTotal = pTotal + sp.second;
8325  for (SimpleParticleCollection_t const& spc:topDaughters){ for (SimpleParticle_t const& sp:spc) pTotal = pTotal + sp.second; }
8326  for (SimpleParticleCollection_t const& spc:antitopDaughters){ for (SimpleParticle_t const& sp:spc) pTotal = pTotal + sp.second; }
8327 
8328  // Get the boost vector and boost all final state particles
8329  double qX = pTotal.X();
8330  double qY = pTotal.Y();
8331  double qE = pTotal.T();
8332  if ((qX*qX+qY*qY)>0.){
8333  TVector3 boostV(-qX/qE, -qY/qE, 0.);
8334  for (SimpleParticle_t& sp:daughters) sp.second.Boost(boostV);
8335  for (SimpleParticle_t& sp:associated) sp.second.Boost(boostV);
8336  for (SimpleParticle_t& sp:stableTops) sp.second.Boost(boostV);
8337  for (SimpleParticle_t& sp:stableAntitops) sp.second.Boost(boostV);
8338  for (SimpleParticleCollection_t& spc:topDaughters){ for (SimpleParticle_t& sp:spc) sp.second.Boost(boostV); }
8339  for (SimpleParticleCollection_t& spc:antitopDaughters){ for (SimpleParticle_t& sp:spc) sp.second.Boost(boostV); }
8340  pTotal.Boost(boostV);
8341  }
8342 
8343  // Mothers need special treatment:
8344  // In case they are undefined, mother id is unknown, and mothers are ordered as M1==(pz>0) and M2==(pz<0).
8345  // In case they are defined, mothers are first matched to the assumed momenta through their pz's.
8346  // They are ordered by M1==f, M2==fb afterward if this is possible.
8347  // Notice that the momenta of the mother objects are not actually used. If the event is truly a gen. particle, everything would be in the pT=0 frame to begin with, and everybody is happy in reweighting.
8348  double sysPz= pTotal.Z();
8349  double sysE = pTotal.T();
8350  double pz0 = (sysE+sysPz)/2.;
8351  double pz1 = -(sysE-sysPz)/2.;
8352  double E0 = pz0;
8353  double E1 = -pz1;
8354  int motherId[2]={ 0, 0 };
8355  if (melaCand->getNMothers()==2){
8356  for (int ip=0; ip<2; ip++) motherId[ip]=melaCand->getMother(ip)->id;
8357  // Match the "assumed" M'1==(larger signed pz) and M'2==(smaller signed pz) to the pz of the actual mothers:
8358  // Swap pZs to get the correct momentum matching default M1, M2.
8359  if (TMath::Sign(1., melaCand->getMother(0)->z()-melaCand->getMother(1)->z())!=TMath::Sign(1., pz0-pz1)){ swap(pz0, pz1); swap(E0, E1); }
8360  // Swap the ids of mothers and their pT=0-assumed momenta to achieve ordering as "incoming" q-qbar
8361  if ((motherId[0]<0 && motherId[1]>=0) || (motherId[1]>0 && motherId[0]<=0)){
8362  swap(pz0, pz1);
8363  swap(E0, E1);
8364  swap(motherId[0], motherId[1]);
8365  }
8366  }
8367  TLorentzVector pM[2];
8368  pM[0].SetXYZT(0., 0., pz0, E0);
8369  pM[1].SetXYZT(0., 0., pz1, E1);
8370 
8371  // Fill the ids of the V intermediates to the candidate daughters
8372  mela_event.intermediateVid.clear();
8373  TUtilHelpers::copyVector(idVstar, mela_event.intermediateVid);
8374  // Fill the mothers
8375  mela_event.pMothers.clear();
8376  for (unsigned int ip=0; ip<2; ip++){ mela_event.pMothers.push_back(SimpleParticle_t(motherId[ip], pM[ip])); }
8377  // Fill the daughters
8378  mela_event.pDaughters.clear();
8380  // Fill the associated particles
8381  mela_event.pAssociated.clear();
8383  // Fill the stable tops and antitops
8384  mela_event.pStableTops.clear();
8385  TUtilHelpers::copyVector(stableTops, mela_event.pStableTops);
8386  mela_event.pStableAntitops.clear();
8387  TUtilHelpers::copyVector(stableAntitops, mela_event.pStableAntitops);
8388  // Fill the daughters of unstable tops and antitops
8389  mela_event.pTopDaughters.clear();
8390  TUtilHelpers::copyVector(topDaughters, mela_event.pTopDaughters);
8391  mela_event.pAntitopDaughters.clear();
8392  TUtilHelpers::copyVector(antitopDaughters, mela_event.pAntitopDaughters);
8393 
8394  // This is the end of one long function.
8395  if (verbosity>=TVar::DEBUG){
8396  MELAout << "TUtil::GetBoostedParticleVectors mela_event.intermediateVid.size=" << mela_event.intermediateVid.size() << endl;
8397  MELAout << "TUtil::GetBoostedParticleVectors mela_event.pMothers.size=" << mela_event.pMothers.size() << endl;
8398  MELAout << "TUtil::GetBoostedParticleVectors mela_event.pDaughters.size=" << mela_event.pDaughters.size() << endl;
8399  MELAout << "TUtil::GetBoostedParticleVectors mela_event.pAssociated.size=" << mela_event.pAssociated.size() << endl;
8400  MELAout << "TUtil::GetBoostedParticleVectors mela_event.pStableTops.size=" << mela_event.pStableTops.size() << endl;
8401  MELAout << "TUtil::GetBoostedParticleVectors mela_event.pStableAntitops.size=" << mela_event.pStableAntitops.size() << endl;
8402  MELAout << "TUtil::GetBoostedParticleVectors mela_event.pTopDaughters.size=" << mela_event.pTopDaughters.size() << endl;
8403  MELAout << "TUtil::GetBoostedParticleVectors mela_event.pAntitopDaughters.size=" << mela_event.pAntitopDaughters.size() << endl;
8404  MELAout << "End GetBoostedParticleVectors" << endl;
8405  }
8406 }
8407 
8408 // Convert vectors of simple particles to MELAParticles and create a MELACandidate
8409 // The output lists could be members of TEvtProb directly.
8411  // Inputs
8412  SimpleParticleCollection_t* pDaughters,
8413  SimpleParticleCollection_t* pAssociated,
8414  SimpleParticleCollection_t* pMothers,
8415  bool isGen,
8416  // Outputs
8417  std::vector<MELAParticle*>* particleList,
8418  std::vector<MELACandidate*>* candList
8419  ){
8420  MELACandidate* cand=nullptr;
8421 
8422  if (!pDaughters){ MELAerr << "TUtil::ConvertVectorFormat: No daughters!" << endl; return cand; }
8423  else if (pDaughters->size()==0){ MELAerr << "TUtil::ConvertVectorFormat: Daughter size==0!" << endl; return cand; }
8424  else if (pDaughters->size()>4){ MELAerr << "TUtil::ConvertVectorFormat: Daughter size " << pDaughters->size() << ">4 is not supported!" << endl; return cand; }
8425  if (pMothers && pMothers->size()!=2){ MELAerr << "TUtil::ConvertVectorFormat: Mothers momentum size (" << pMothers->size() << ") has to have had been 2! Continuing by omitting mothers." << endl; /*return cand;*/ }
8426 
8427  // Create mother, daughter and associated particle MELAParticle objects
8428  std::vector<MELAParticle*> daughters;
8429  std::vector<MELAParticle*> aparticles;
8430  std::vector<MELAParticle*> mothers;
8431  for (auto& spart:(*pDaughters)){
8432  MELAParticle* onePart = new MELAParticle(spart.first, spart.second);
8433  onePart->setGenStatus(1); // Final state status
8434  if (particleList) particleList->push_back(onePart);
8435  daughters.push_back(onePart);
8436  }
8437  if (pAssociated){
8438  for (auto& spart:(*pAssociated)){
8439  MELAParticle* onePart = new MELAParticle(spart.first, spart.second);
8440  onePart->setGenStatus(1); // Final state status
8441  if (particleList) particleList->push_back(onePart);
8442  aparticles.push_back(onePart);
8443  }
8444  }
8445  if (pMothers && pMothers->size()==2){
8446  for (auto& spart:(*pMothers)){
8447  MELAParticle* onePart = new MELAParticle(spart.first, spart.second);
8448  onePart->setGenStatus(-1); // Mother status
8449  if (particleList) particleList->push_back(onePart);
8450  mothers.push_back(onePart);
8451  }
8452  }
8453 
8454  // Create the candidate
8455  /***** Adaptation of LHEAnalyzer::Event::constructVVCandidates *****/
8456  /*
8457  The assumption is that the daughters make sense for either ffb, gamgam, Zgam, ZZ or WW.
8458  No checking is done on whether particle-antiparticle pairing is correct when necessary.
8459  If not, you will get a seg. fault!
8460  */
8461 
8462  // Undecayed Higgs
8463  if (daughters.size()==1){
8464  cand = new MELACandidate(25, (daughters.at(0))->p4); // No sorting!
8465  cand->setDecayMode(TVar::CandidateDecay_Stable); // Explicitly set the decay mode in case the default of MELACandidate changes in the future
8466  }
8467  // GG / ff final states
8468  else if (daughters.size()==2){
8469  MELAParticle* F1 = daughters.at(0);
8470  MELAParticle* F2 = daughters.at(1);
8471  TLorentzVector pH = F1->p4+F2->p4;
8472  cand = new MELACandidate(25, pH);
8473  cand->addDaughter(F1);
8474  cand->addDaughter(F2);
8478  cand->sortDaughters();
8479  PDGHelpers::setCandidateDecayMode(defaultHDecayMode);
8480  }
8481  // ZG / WG
8482  else if (daughters.size()==3){
8483  MELAParticle* F1 = daughters.at(0);
8484  MELAParticle* F2 = daughters.at(1);
8485  MELAParticle* gamma = daughters.at(2);
8486  if (PDGHelpers::isAPhoton(F1->id)){
8487  MELAParticle* tmp = F1;
8488  F1 = gamma;
8489  gamma = tmp;
8490  }
8491  else if (PDGHelpers::isAPhoton(F2->id)){
8492  MELAParticle* tmp = F2;
8493  F2 = gamma;
8494  gamma = tmp;
8495  }
8496  TLorentzVector pH = F1->p4+F2->p4+gamma->p4;
8497  double charge = F1->charge()+F2->charge()+gamma->charge();
8498  cand = new MELACandidate(25, pH);
8499  cand->addDaughter(F1);
8500  cand->addDaughter(F2);
8501  cand->addDaughter(gamma);
8503  if (fabs(charge)<0.01) PDGHelpers::setCandidateDecayMode(TVar::CandidateDecay_ZG); // ZG
8505  cand->sortDaughters();
8506  PDGHelpers::setCandidateDecayMode(defaultHDecayMode);
8507  }
8508  // ZZ / WW / ZW (!)
8509  else/* if (daughters.size()==4)*/{
8510  TLorentzVector pH(0, 0, 0, 0);
8511  double charge = 0.;
8512  for (unsigned char ip=0; ip<4; ip++){ pH = pH + (daughters.at(ip))->p4; charge += (daughters.at(ip))->charge(); }
8513  cand = new MELACandidate(25, pH);
8514  for (unsigned char ip=0; ip<4; ip++) cand->addDaughter(daughters.at(ip));
8515  // FIXME/REIMPLEMENT: ZW trickier than I thought: Summing over charges over all 4f is not enough, affects SSSF pairing in ZZ
8516  //TVar::CandidateDecayMode defaultHDecayMode = PDGHelpers::HDecayMode;
8517  //if (fabs(charge)>0.01) PDGHelpers::setCandidateDecayMode(TVar::CandidateDecay_ZW);
8518  if (
8522  ){
8523  MELAerr << "TUtil::ConvertVectorFormat: PDGHelpers::HDecayMode = " << PDGHelpers::HDecayMode << " is set incorrectly for Ndaughters=" << daughters.size() << ". There is no automatic mechnism for this scenario. ";
8524  MELAerr << "Suggestion: Call PDGHelpers::setCandidateDecayMode(TVar::CandidateDecay_XY) before this call." << endl;
8525  assert(0);
8526  }
8527  cand->sortDaughters();
8528  //PDGHelpers::setCandidateDecayMode(defaultHDecayMode);
8529  }
8530 
8531  /***** Adaptation of LHEAnalyzer::Event::addVVCandidateMother *****/
8532  if (!mothers.empty()){ // ==2
8533  for (auto& part:mothers) cand->addMother(part);
8534  if (isGen) cand->setGenStatus(-1); // Candidate is a gen. particle!
8535  }
8536  /***** Adaptation of LHEAnalyzer::Event::addVVCandidateAppendages *****/
8537  if (!aparticles.empty()){
8538  for (auto& part:aparticles){
8539  const int& partId = part->id;
8540  if (PDGHelpers::isALepton(partId)) cand->addAssociatedLepton(part);
8541  else if (PDGHelpers::isANeutrino(partId)) cand->addAssociatedNeutrino(part); // Be careful: Neutrinos are neutrinos, but also "leptons" in MELACandidate!
8542  else if (PDGHelpers::isAPhoton(partId)) cand->addAssociatedPhoton(part);
8543  else if (PDGHelpers::isAJet(partId)) cand->addAssociatedJet(part);
8544  }
8545  cand->addAssociatedVs(); // For the VH topology
8546  }
8547 
8548  if (candList && cand) candList->push_back(cand);
8549  return cand;
8550 }
8551 
8552 // Convert the vector of three body decay daughters (as simple particles) to MELAParticles and create a MELAThreeBodyDecayCandidate
8553 // The output lists could be members of TEvtProb directly.
8555  // Input
8556  SimpleParticleCollection_t* tbdDaughters,
8557  // Outputs
8558  std::vector<MELAParticle*>* particleList,
8559  std::vector<MELAThreeBodyDecayCandidate*>* tbdCandList
8560  ){
8561  MELAThreeBodyDecayCandidate* cand=nullptr;
8562 
8563  if (!tbdDaughters){ MELAerr << "TUtil::ConvertThreeBodyDecayCandidate: No daughters!" << endl; return cand; }
8564  else if (tbdDaughters->empty()){ MELAerr << "TUtil::ConvertThreeBodyDecayCandidate: Daughter size==0!" << endl; return cand; }
8565  else if (!(tbdDaughters->size()==1 || tbdDaughters->size()==3)){ MELAerr << "TUtil::ConvertThreeBodyDecayCandidate: Daughter size " << tbdDaughters->size() << "!=1 or 3 is not supported!" << endl; return cand; }
8566 
8567  if (tbdDaughters->size()==1){
8568  if (abs((tbdDaughters->at(0)).first)==6 || (tbdDaughters->at(0)).first==0){
8569  cand = new MELAThreeBodyDecayCandidate((tbdDaughters->at(0)).first, (tbdDaughters->at(0)).second);
8570  tbdCandList->push_back(cand);
8571  }
8572  }
8573  else if (tbdDaughters->size()==3){
8574  MELAParticle* partnerPart = new MELAParticle((tbdDaughters->at(0)).first, (tbdDaughters->at(0)).second);
8575  MELAParticle* Wf = new MELAParticle((tbdDaughters->at(1)).first, (tbdDaughters->at(1)).second);
8576  MELAParticle* Wfb = new MELAParticle((tbdDaughters->at(2)).first, (tbdDaughters->at(2)).second);
8577 
8578  if (Wf->id<0 || Wfb->id>0) std::swap(Wf, Wfb);
8579 
8580  particleList->push_back(partnerPart);
8581  particleList->push_back(Wf);
8582  particleList->push_back(Wfb);
8583 
8584  cand = new MELAThreeBodyDecayCandidate(partnerPart, Wf, Wfb);
8585  tbdCandList->push_back(cand);
8586  }
8587  return cand;
8588 }
8589 
8591  MELAout << "***** TUtil::PrintCandidateSummary *****" << endl;
8592  MELAout << "Candidate: " << cand << endl;
8593  if (cand) MELAout << *cand;
8594 }
8595 
8597  MELAout << "***** TUtil::PrintCandidateSummary (Simple Event Record) *****" << endl;
8598  MELAout << "Candidate: " << cand << endl;
8599  if (cand){
8600  MELAout << "\tAssociationCode: " << cand->AssociationCode << endl;
8601  MELAout << "\tAssociationVCompatibility: " << cand->AssociationVCompatibility << endl;
8602  MELAout << "\tnRequested_AssociatedJets: " << cand->nRequested_AssociatedJets << endl;
8603  MELAout << "\tnRequested_AssociatedLeptons: " << cand->nRequested_AssociatedLeptons << endl;
8604  MELAout << "\tnRequested_AssociatedPhotons: " << cand->nRequested_AssociatedPhotons << endl;
8605  MELAout << "\tnRequested_Tops: " << cand->nRequested_Tops << endl;
8606  MELAout << "\tnRequested_Antitops: " << cand->nRequested_Antitops << endl;
8607  MELAout << "\tHas " << cand->pMothers.size() << " mothers" << endl;
8608  for (unsigned int ip=0; ip<cand->pMothers.size(); ip++){
8609  SimpleParticle_t* part = &(cand->pMothers.at(ip));
8610  MELAout
8611  << "\t\tV" << ip << " (" << part->first << ") (X,Y,Z,T)=( "
8612  << part->second.X() << " , "
8613  << part->second.Y() << " , "
8614  << part->second.Z() << " , "
8615  << part->second.T() << " )" << endl;
8616  }
8617  MELAout << "\tHas " << cand->intermediateVid.size() << " sorted daughter Vs" << endl;
8618  for (unsigned int iv=0; iv<cand->intermediateVid.size(); iv++) MELAout << "\t\tV" << iv << " (" << cand->intermediateVid.at(iv) << ")" << endl;
8619  MELAout << "\tHas " << cand->pDaughters.size() << " daughters" << endl;
8620  for (unsigned int ip=0; ip<cand->pDaughters.size(); ip++){
8621  SimpleParticle_t* part = &(cand->pDaughters.at(ip));
8622  MELAout
8623  << "\t\tDau[" << ip << "] (" << part->first << ") (X,Y,Z,T)=( "
8624  << part->second.X() << " , "
8625  << part->second.Y() << " , "
8626  << part->second.Z() << " , "
8627  << part->second.T() << " )" << endl;
8628  }
8629  MELAout << "\tHas " << cand->pAssociated.size() << " associated particles" << endl;
8630  for (unsigned int ip=0; ip<cand->pAssociated.size(); ip++){
8631  SimpleParticle_t* part = &(cand->pAssociated.at(ip));
8632  MELAout
8633  << "\t\tAPart[" << ip << "] (" << part->first << ") (X,Y,Z,T)=( "
8634  << part->second.X() << " , "
8635  << part->second.Y() << " , "
8636  << part->second.Z() << " , "
8637  << part->second.T() << " )" << endl;
8638  }
8639  MELAout << "\tHas " << cand->pStableTops.size() << " stable tops" << endl;
8640  for (unsigned int ip=0; ip<cand->pStableTops.size(); ip++){
8641  SimpleParticle_t* part = &(cand->pStableTops.at(ip));
8642  MELAout
8643  << "\t\tAPart[" << ip << "] (" << part->first << ") (X,Y,Z,T)=( "
8644  << part->second.X() << " , "
8645  << part->second.Y() << " , "
8646  << part->second.Z() << " , "
8647  << part->second.T() << " )" << endl;
8648  }
8649  MELAout << "\tHas " << cand->pStableAntitops.size() << " stable antitops" << endl;
8650  for (unsigned int ip=0; ip<cand->pStableAntitops.size(); ip++){
8651  SimpleParticle_t* part = &(cand->pStableAntitops.at(ip));
8652  MELAout
8653  << "\t\tAPart[" << ip << "] (" << part->first << ") (X,Y,Z,T)=( "
8654  << part->second.X() << " , "
8655  << part->second.Y() << " , "
8656  << part->second.Z() << " , "
8657  << part->second.T() << " )" << endl;
8658  }
8659 
8660  MELAout << "\tHas " << cand->pTopDaughters.size() << " unstable tops" << endl;
8661  for (unsigned int ip=0; ip<cand->pTopDaughters.size(); ip++){
8662  MELAout << "\t\tTop[" << ip << "] daughters:" << endl;
8663  for (unsigned int jp=0; jp<cand->pTopDaughters.at(ip).size(); jp++){
8664  SimpleParticle_t* part = &(cand->pTopDaughters.at(ip).at(jp));
8665  MELAout
8666  << "\t\t- Top daughter[" << ip << jp << "] (" << part->first << ") (X,Y,Z,T)=( "
8667  << part->second.X() << " , "
8668  << part->second.Y() << " , "
8669  << part->second.Z() << " , "
8670  << part->second.T() << " )" << endl;
8671  }
8672  }
8673  MELAout << "\tHas " << cand->pAntitopDaughters.size() << " unstable antitops" << endl;
8674  for (unsigned int ip=0; ip<cand->pAntitopDaughters.size(); ip++){
8675  MELAout << "\t\tAntitop[" << ip << "] daughters:" << endl;
8676  for (unsigned int jp=0; jp<cand->pAntitopDaughters.at(ip).size(); jp++){
8677  SimpleParticle_t* part = &(cand->pAntitopDaughters.at(ip).at(jp));
8678  MELAout
8679  << "\t\t- Antitop daughter[" << ip << jp << "] (" << part->first << ") (X,Y,Z,T)=( "
8680  << part->second.X() << " , "
8681  << part->second.Y() << " , "
8682  << part->second.Z() << " , "
8683  << part->second.T() << " )" << endl;
8684  }
8685  }
8686  }
8687 }
TVar::kUseAssociated_Photons
@ kUseAssociated_Photons
Definition: TVar.hh:32
TVar::H1plus
@ H1plus
Definition: TVar.hh:149
SpinZeroCouplings::HzzCLambda_qsq
int HzzCLambda_qsq[SIZE_HVV_CQSQ]
Definition: TCouplings.hh:39
TVar::ERROR
@ ERROR
Definition: TVar.hh:49
TVar::bkgWW_SMHiggs
@ bkgWW_SMHiggs
Definition: TVar.hh:171
MelaIO::setMEArray
void setMEArray(double MEsq_[nmsq][nmsq], bool transpose=false)
Definition: MelaIO.h:63
flags_
struct @21 flags_
gHIGGS_VV_4_PRIME7
@ gHIGGS_VV_4_PRIME7
Definition: raw_couplings.txt:55
SimpleParticle_t
std::pair< int, TLorentzVector > SimpleParticle_t
Definition: TVar.hh:24
TUtil::scaleMomentumToEnergy
void scaleMomentumToEnergy(const TLorentzVector &massiveJet, TLorentzVector &masslessJet, double mass=0)
Definition: TUtil.cc:66
TUtil::MCFM_chooser
bool MCFM_chooser(const TVar::Process &process, const TVar::Production &production, const TVar::LeptonInterference &leptonInterf, const TVar::VerbosityLevel &verbosity, const TVar::simple_event_record &mela_event)
Definition: TUtil.cc:1802
MelaIO::setFactorizationScale
void setFactorizationScale(const double &val)
Definition: MelaIO.h:135
__modhiggs_MOD_evalamp_h_vv
void __modhiggs_MOD_evalamp_h_vv(double P[6][4], int *MYIDUP, double *MatElSq)
gHIGGS_VV_4_PRIME4
@ gHIGGS_VV_4_PRIME4
Definition: raw_couplings.txt:43
TVar::JJVBF
@ JJVBF
Definition: TVar.hh:72
PDGHelpers::isALepton
bool isALepton(const int id)
Definition: PDGHelpers.cc:62
TVar::Dynamic_qJJ_qH
@ Dynamic_qJJ_qH
Definition: TVar.hh:207
TUtil::ResonancePropagator
double ResonancePropagator(double const &sqrts, TVar::ResonancePropagatorScheme scheme)
Definition: TUtil.cc:7929
TVar::simple_event_record::pTopDaughters
std::vector< SimpleParticleCollection_t > pTopDaughters
Definition: TVar.hh:242
aTQGCCouplings
Definition: TCouplings.hh:128
TVar::simple_event_record::pStableAntitops
SimpleParticleCollection_t pStableAntitops
Definition: TVar.hh:245
TUtil::SetJHUGenSpinZeroGGCouplings
void SetJHUGenSpinZeroGGCouplings(double Hggcoupl[SIZE_HGG][2])
Definition: TUtil.cc:4084
PDGHelpers::HDecayMode
TVar::CandidateDecayMode HDecayMode
Definition: PDGHelpers.cc:11
TVar::Had_ZH_S
@ Had_ZH_S
Definition: TVar.hh:86
TUtil::WipeMEArray
int WipeMEArray(const TVar::Process &process, const TVar::Production &production, const int id[mxpart], double msq[nmsq][nmsq], const TVar::VerbosityLevel &verbosity)
Definition: TUtil.cc:7729
mela.daughters
string daughters
Definition: mela.py:767
TVar::FermionMassRemoval
FermionMassRemoval
Definition: TVar.hh:111
MelaIO
Definition: MelaIO.h:8
TVar::LeptonInterference
LeptonInterference
Definition: TVar.hh:106
SIZE_GVV
@ SIZE_GVV
Definition: raw_couplings.txt:158
TVar::H0_Zgs_PS
@ H0_Zgs_PS
Definition: TVar.hh:132
gHIGGS_VV_3_PRIME4
@ gHIGGS_VV_3_PRIME4
Definition: raw_couplings.txt:37
TVar::kUseAssociated_Jets
@ kUseAssociated_Jets
Definition: TVar.hh:33
gHIGGS_VV_3_PRIME6
@ gHIGGS_VV_3_PRIME6
Definition: raw_couplings.txt:52
TUtil::MCFM_smalls
bool MCFM_smalls(double s[][mxpart], int npart)
Definition: TUtil.cc:3298
TVar::VerbosityLevel
VerbosityLevel
Definition: TVar.hh:47
MelaIO::computeWeightedMEArray
void computeWeightedMEArray()
Definition: MelaIO.h:94
SpinZeroCouplings::H2zzcoupl
double H2zzcoupl[SIZE_HVV][2]
Definition: TCouplings.hh:50
gATQGC_dZZWpWm
@ gATQGC_dZZWpWm
Definition: raw_couplings.txt:174
TUtil::SumMEPDF
double SumMEPDF(const TLorentzVector &p0, const TLorentzVector &p1, double msq[nmsq][nmsq], MelaIO *RcdME, const double &EBEAM, const TVar::VerbosityLevel &verbosity)
Definition: TUtil.cc:7911
vsymfact_
struct @31 vsymfact_
gHIGGS_KAPPA_TILDE
@ gHIGGS_KAPPA_TILDE
Definition: raw_couplings.txt:3
MELACandidate::addAssociatedJet
void addAssociatedJet(MELAParticle *myParticle)
Definition: MELACandidate.cc:616
MelaIO::getSumME
double getSumME() const
Definition: MelaIO.h:107
runstring_
struct @55 runstring_
TJHUGenUtils.hh
TUtil::BBHiggsMatEl
double BBHiggsMatEl(const TVar::Process &process, const TVar::Production &production, const TVar::MatrixElement &matrixElement, TVar::event_scales_type *event_scales, MelaIO *RcdME, const double &EBEAM, int botProcess, TVar::VerbosityLevel verbosity)
Definition: TUtil.cc:7562
TVar::Fixed_mH
@ Fixed_mH
Definition: TVar.hh:198
__modjhugenmela_MOD_setspinzerovvcouplings
void __modjhugenmela_MOD_setspinzerovvcouplings(double vvcoupl[SIZE_HVV][2], double vvpcoupl[SIZE_HVV][2], double vpvpcoupl[SIZE_HVV][2], int cqsq[SIZE_HVV_CQSQ], double Lambda_qsq[SIZE_HVV_LAMBDAQSQ][SIZE_HVV_CQSQ], int *usewwcoupl)
TJHUGenUtils::Get_JHUGenHash_OnshellVBFHash
const std::vector< TNumericUtil::intTriplet_t > & Get_JHUGenHash_OnshellVBFHash()
Definition: TJHUGenUtils.cc:42
SIZE_HVV_CQSQ
@ SIZE_HVV_CQSQ
Definition: raw_couplings.txt:74
TVar::JJEWQCD
@ JJEWQCD
Definition: TVar.hh:74
TVar::H0minus
@ H0minus
Definition: TVar.hh:129
MelaIO::setAlphaS
void setAlphaS(const double &val)
Definition: MelaIO.h:137
TUtil::InterpretScaleScheme
double InterpretScaleScheme(const TVar::Production &production, const TVar::MatrixElement &matrixElement, const TVar::EventScaleScheme &scheme, TLorentzVector p[mxpart])
Definition: TUtil.cc:1601
TVar::CandidateDecay_ZZ
@ CandidateDecay_ZZ
Definition: TVar.hh:41
anonymous_namespace{TCouplingsBase.hh}::gHIGGS_GG_3
@ gHIGGS_GG_3
Definition: TCouplingsBase.hh:37
gATQGC_dAAWpWm
@ gATQGC_dAAWpWm
Definition: raw_couplings.txt:172
MelaIO::setAlphaSatMZ
void setAlphaSatMZ(const double &val)
Definition: MelaIO.h:139
MELAParticle::getNDaughters
int getNDaughters() const
Definition: MELAParticle.h:50
TVar::simple_event_record::nRequested_AssociatedJets
int nRequested_AssociatedJets
Definition: TVar.hh:230
TUtil::SetJHUGenHiggsMassWidth
void SetJHUGenHiggsMassWidth(double MReso, double GaReso)
Definition: TUtil.cc:3347
TVar::Fixed_mWPlusmH
@ Fixed_mWPlusmH
Definition: TVar.hh:201
__modjhugenmela_MOD_setazffcouplings
void __modjhugenmela_MOD_setazffcouplings(double AZffcoupl[SIZE_AZff][2])
TVar::bkgGammaGamma
@ bkgGammaGamma
Definition: TVar.hh:163
TUtil::HJJMatEl
double HJJMatEl(const TVar::Process &process, const TVar::Production &production, const TVar::MatrixElement &matrixElement, TVar::event_scales_type *event_scales, MelaIO *RcdME, const double &EBEAM, TVar::VerbosityLevel verbosity)
Definition: TUtil.cc:5118
TUtil::SetCKMElements
void SetCKMElements(double *invckm_ud, double *invckm_us, double *invckm_cd, double *invckm_cs, double *invckm_ts, double *invckm_tb, double *invckm_ub=0, double *invckm_cb=0, double *invckm_td=0)
Definition: TUtil.cc:1507
gHIGGS_VV_1_PRIME4
@ gHIGGS_VV_1_PRIME4
Definition: raw_couplings.txt:25
TUtil::SetMCFMAZffCouplings
void SetMCFMAZffCouplings(bool useBSM, AZffCouplings const *Zcouplings)
Definition: TUtil.cc:4044
cLambdaHIGGS_VV_QSQ12
@ cLambdaHIGGS_VV_QSQ12
Definition: raw_couplings.txt:72
TVar::event_scales_type
Definition: TVar.hh:260
npart_
struct @29 npart_
TVar::INFO
@ INFO
Definition: TVar.hh:50
TVar::Lep_WH_S
@ Lep_WH_S
Definition: TVar.hh:89
SIZE_GGG
@ SIZE_GGG
Definition: raw_couplings.txt:131
gATQGC_dMZ
@ gATQGC_dMZ
Definition: raw_couplings.txt:169
TVar::kUseAssociated_UnstableTops
@ kUseAssociated_UnstableTops
Definition: TVar.hh:34
MELAParticle::getDaughters
std::vector< MELAParticle * > & getDaughters()
Definition: MELAParticle.h:59
MELACandidate::getSortedV
MELAParticle * getSortedV(int index) const
Definition: MELACandidate.cc:152
qqb_zgam_
void qqb_zgam_(double *p, double *msq)
AZffCouplings
Definition: TCouplings.hh:143
SpinZeroCouplings::Ht4t4coupl
double Ht4t4coupl[SIZE_HQQ][2]
Definition: TCouplings.hh:32
TVar::ProductionName
TString ProductionName(TVar::Production temp)
Definition: TVar.cc:64
MELACandidate::addAssociatedNeutrino
void addAssociatedNeutrino(MELAParticle *myParticle)
Definition: MELACandidate.cc:609
gATQGC_dPZ
@ gATQGC_dPZ
Definition: raw_couplings.txt:168
__modjhugenmela_MOD_getdecaycouplings
void __modjhugenmela_MOD_getdecaycouplings(int *VVMode, int idordered[4], double *aL1, double *aR1, double *aL2, double *aR2)
MELAParticle::setGenStatus
void setGenStatus(int status_)
Definition: MELAParticle.h:43
__modjhugenmela_MOD_setspinzeroqqcouplings
void __modjhugenmela_MOD_setspinzeroqqcouplings(double qqcoupl[SIZE_HQQ][2])
gATQGC_dVZ
@ gATQGC_dVZ
Definition: raw_couplings.txt:167
TVar::GammaH
@ GammaH
Definition: TVar.hh:102
gHIGGS_VV_2_PRIME6
@ gHIGGS_VV_2_PRIME6
Definition: raw_couplings.txt:50
__modjhugenmela_MOD_getalphasalphasmz
void __modjhugenmela_MOD_getalphasalphasmz(double *val_as, double *val_asmz)
TUtil::SetAlphaS
void SetAlphaS(double &Q_ren, double &Q_fac, double multiplier_ren, double multiplier_fac, int mynloop, int mynflav, std::string mypartons)
TVar::Dynamic_HT
@ Dynamic_HT
Definition: TVar.hh:209
qqb_gamgam_
void qqb_gamgam_(double *p, double *msq)
gHIGGS_VV_3_PRIME7
@ gHIGGS_VV_3_PRIME7
Definition: raw_couplings.txt:53
TVar::CandidateDecayMode
CandidateDecayMode
Definition: TVar.hh:37
qq_zzqq_
void qq_zzqq_(double *p, double *msq)
gAZff_ZuuRH
@ gAZff_ZuuRH
Definition: raw_couplings.txt:182
LambdaHIGGS_QSQ_VV_3
@ LambdaHIGGS_QSQ_VV_3
Definition: raw_couplings.txt:63
TVar::H2_g10
@ H2_g10
Definition: TVar.hh:161
testME_all.production
def production
Definition: testME_all.py:115
MelaIO::setRenormalizationScale
void setRenormalizationScale(const double &val)
Definition: MelaIO.h:133
TUtil::computeTTHAngles
void computeTTHAngles(float &hs, float &hincoming, float &hTT, float &PhiTT, float &Phi1, float &hbb, float &hWW, float &Phibb, float &Phi1bb, float &hWplusf, float &PhiWplusf, float &hWminusf, float &PhiWminusf, TLorentzVector p4M11, int Z1_lept1Id, TLorentzVector p4M12, int Z1_lept2Id, TLorentzVector p4M21, int Z2_lept1Id, TLorentzVector p4M22, int Z2_lept2Id, TLorentzVector b, int bId, TLorentzVector Wplusf, int WplusfId, TLorentzVector Wplusfb, int WplusfbId, TLorentzVector bbar, int bbarId, TLorentzVector Wminusf, int WminusfId, TLorentzVector Wminusfb, int WminusfbId, TLorentzVector *injet1=0, int injet1Id=0, TLorentzVector *injet2=0, int injet2Id=0)
Definition: TUtil.cc:989
__modjhugenmela_MOD_sethdk
void __modjhugenmela_MOD_sethdk(int *flag)
TVar::SelfDefine_spin2
@ SelfDefine_spin2
Definition: TVar.hh:182
SIZE_ZQQ
@ SIZE_ZQQ
Definition: raw_couplings.txt:107
TVar::CandidateDecay_Stable
@ CandidateDecay_Stable
Definition: TVar.hh:38
TVar::bkgZJets
@ bkgZJets
Definition: TVar.hh:165
breit_
struct @26 breit_
gg_vv_all_
void gg_vv_all_(double *p, double *msq)
TUtil::applyLeptonMassCorrection
void applyLeptonMassCorrection(bool flag=true)
Definition: TUtil.cc:35
TJHUGenUtils
Definition: TJHUGenUtils.hh:13
TVar::ZZINDEPENDENT
@ ZZINDEPENDENT
Definition: TVar.hh:64
TUtil::SetMass
void SetMass(double inmass, int ipart)
Definition: TUtil.cc:1445
gHIGGS_VV_4_PRIME3
@ gHIGGS_VV_4_PRIME3
Definition: raw_couplings.txt:42
TVar::simple_event_record::pDaughters
SimpleParticleCollection_t pDaughters
Definition: TVar.hh:238
TVar::Process
Process
Definition: TVar.hh:125
__modparameters_MOD_ckm
double __modparameters_MOD_ckm(int *id1in, int *id2in)
TVar::EventScaleScheme
EventScaleScheme
Definition: TVar.hh:196
MELACandidate::addAssociatedVs
void addAssociatedVs()
Definition: MELACandidate.cc:639
TVar::JJQCD
@ JJQCD
Definition: TVar.hh:71
__modgraviton_MOD_evalamp_qqb_g_vv
void __modgraviton_MOD_evalamp_qqb_g_vv(double P[6][4], int *MYIDUP, double *MatElSq)
TUtil::SetJHUGenVprimeContactCouplings
void SetJHUGenVprimeContactCouplings(double Zpffcoupl[SIZE_Vpff][2], double Wpffcoupl[SIZE_Vpff][2])
Definition: TUtil.cc:4090
MelaIO::setPartonWeights
void setPartonWeights(double partonOneWeight_[nmsq], double partonTwoWeight_[nmsq])
Definition: MelaIO.h:54
__modjhugenmela_MOD_setspinzeroggcouplings
void __modjhugenmela_MOD_setspinzeroggcouplings(double ggcoupl[SIZE_HGG][2])
qqb_zz_stu_
void qqb_zz_stu_(double *p, double *msq, int *channeltoggle)
gHIGGS_VV_2_PRIME3
@ gHIGGS_VV_2_PRIME3
Definition: raw_couplings.txt:30
SpinZeroCouplings::H2b4b4coupl
double H2b4b4coupl[SIZE_HQQ][2]
Definition: TCouplings.hh:48
TVar::HSMHiggs_WWZZ
@ HSMHiggs_WWZZ
Definition: TVar.hh:174
testME_all.p
p
Definition: testME_all.py:11
__modjhugenmela_MOD_setmurenfac
void __modjhugenmela_MOD_setmurenfac(double *muren, double *mufac)
gATQGC_dFourZ
@ gATQGC_dFourZ
Definition: raw_couplings.txt:170
TVar::ZZQQB
@ ZZQQB
Definition: TVar.hh:62
mela.m
m
Definition: mela.py:715
SpinZeroCouplings::HwwLambda_qsq
double HwwLambda_qsq[SIZE_HVV_LAMBDAQSQ][SIZE_HVV_CQSQ]
Definition: TCouplings.hh:38
TVar::CandidateDecay_WW
@ CandidateDecay_WW
Definition: TVar.hh:40
gHIGGS_VV_2_PRIME7
@ gHIGGS_VV_2_PRIME7
Definition: raw_couplings.txt:51
noglue_
struct @46 noglue_
gAZff_uZLH
@ gAZff_uZLH
Definition: raw_couplings.txt:190
gHIGGS_VV_4_PRIME
@ gHIGGS_VV_4_PRIME
Definition: raw_couplings.txt:40
TUtil::PrintCandidateSummary
void PrintCandidateSummary(MELACandidate *cand)
Definition: TUtil.cc:8590
__modzprime_MOD_evalamp_qqb_zprime_vv
void __modzprime_MOD_evalamp_qqb_zprime_vv(double P[6][4], int *MYIDUP, double *MatElSq)
TVar::H1minus
@ H1minus
Definition: TVar.hh:148
MELACandidate::addAssociatedPhoton
void addAssociatedPhoton(MELAParticle *myParticle)
Definition: MELACandidate.cc:613
PDGHelpers::isAZBoson
bool isAZBoson(const int id)
Definition: PDGHelpers.cc:76
gHIGGS_AA_2
@ gHIGGS_AA_2
Definition: raw_couplings.txt:18
TVar::simple_event_record::nRequested_AssociatedPhotons
int nRequested_AssociatedPhotons
Definition: TVar.hh:232
__modhiggsj_MOD_evalamp_hj
void __modhiggsj_MOD_evalamp_hj(double P[4][4], double MatElSq[11][11])
TUtil::SetMCFMSpinZeroCouplings
void SetMCFMSpinZeroCouplings(bool useBSM, SpinZeroCouplings const *Hcouplings, bool forceZZ)
Definition: TUtil.cc:3360
xmin_
struct @28 xmin_
qq_zzqqstrong_
void qq_zzqqstrong_(double *p, double *msq)
modparameters::second
real(8), parameter, public second
Definition: mod_Parameters.F90:105
modmisc::isnan
logical function isnan(x)
Definition: mod_Misc.F90:380
PDGHelpers::isAnUnknownJet
bool isAnUnknownJet(const int id)
Definition: PDGHelpers.cc:22
gHIGGS_VV_1_PRIME6
@ gHIGGS_VV_1_PRIME6
Definition: raw_couplings.txt:48
TVar::DEBUG_VERBOSE
@ DEBUG_VERBOSE
Definition: TVar.hh:52
hto_masses::msq
real *8, parameter msq
Definition: CALLING_cpHTO.f:83
TUtil::SetJHUGenSpinOneCouplings
void SetJHUGenSpinOneCouplings(double Zqqcoupl[SIZE_ZQQ][2], double Zvvcoupl[SIZE_ZVV][2])
Definition: TUtil.cc:4086
PDGHelpers::isAQuark
bool isAQuark(const int id)
Definition: PDGHelpers.cc:35
__modjhugenmela_MOD_resetamplitudeincludes
void __modjhugenmela_MOD_resetamplitudeincludes()
TVar::H2_g7
@ H2_g7
Definition: TVar.hh:158
SIZE_ZVV
@ SIZE_ZVV
Definition: raw_couplings.txt:114
TUtil::forbidMassiveLeptons
bool forbidMassiveLeptons
Remove fermion mass if the flag is set to true.
Definition: TUtil.cc:25
TVar::simple_event_record::AssociationVCompatibility
int AssociationVCompatibility
Definition: TVar.hh:229
mela.mothers
string mothers
Definition: mela.py:777
TUtil::GetAlphaS
void GetAlphaS(double *alphas_, double *alphasmz_)
Definition: TUtil.cc:1794
TVar::ZZQQB_TU
@ ZZQQB_TU
Definition: TVar.hh:92
gAZff_ZddLH
@ gAZff_ZddLH
Definition: raw_couplings.txt:185
gAZff_ZddRH
@ gAZff_ZddRH
Definition: raw_couplings.txt:184
SpinZeroCouplings::separateWWZZcouplings
bool separateWWZZcouplings
Definition: TCouplings.hh:62
SpinZeroCouplings::Httcoupl
double Httcoupl[SIZE_HQQ][2]
Definition: TCouplings.hh:29
gHIGGS_ZA_2
@ gHIGGS_ZA_2
Definition: raw_couplings.txt:14
PDGHelpers::isANeutrino
bool isANeutrino(const int id)
Definition: PDGHelpers.cc:67
TUtil::SetDecayWidth
void SetDecayWidth(double inwidth, int ipart)
Definition: TUtil.cc:1491
TVar::ZZGG
@ ZZGG
Definition: TVar.hh:61
nf
@ nf
Definition: TMCFM.hh:17
TVar::ProcessName
TString ProcessName(TVar::Process temp)
Definition: TVar.cc:6
TVar::MomentumToEnergy
@ MomentumToEnergy
Definition: TVar.hh:114
TJHUGenUtils::Get_JHUGenHash_OnshellHJJHash
const std::vector< TNumericUtil::intTriplet_t > & Get_JHUGenHash_OnshellHJJHash()
Definition: TJHUGenUtils.cc:41
TUtil::MCFM_masscuts
bool MCFM_masscuts(double s[][mxpart], const TVar::Process &process)
Definition: TUtil.cc:3289
PDGHelpers::isAPhoton
bool isAPhoton(const int id)
Definition: PDGHelpers.cc:72
TUtil::setLeptonMassScheme
void setLeptonMassScheme(TVar::FermionMassRemoval scheme=TVar::ConserveDifermionMass)
Definition: TUtil.cc:37
gATQGC_dZAWpWm
@ gATQGC_dZAWpWm
Definition: raw_couplings.txt:173
MelaIO::setHiggsMassWidth
void setHiggsMassWidth(const double &mass_, const double &width_, int jh)
Definition: MelaIO.h:143
TVar::H0_Zgsg1prime2
@ H0_Zgsg1prime2
Definition: TVar.hh:130
TVar::simple_event_record::nRequested_Tops
int nRequested_Tops
Definition: TVar.hh:233
MELAStreamHelpers::MELAout
MELAOutputStreamer MELAout
SpinZeroCouplings::Hg4g4coupl
double Hg4g4coupl[SIZE_HGG][2]
Definition: TCouplings.hh:31
TVar::simple_event_record::pMothers
SimpleParticleCollection_t pMothers
Definition: TVar.hh:240
__modjhugenmela_MOD_resetmubarhgabarh
void __modjhugenmela_MOD_resetmubarhgabarh()
TVar::bkgWW
@ bkgWW
Definition: TVar.hh:167
TVar::kNoAssociated
@ kNoAssociated
Definition: TVar.hh:30
TVar::DefaultLeptonInterf
@ DefaultLeptonInterf
Definition: TVar.hh:107
TVar::H2_g5
@ H2_g5
Definition: TVar.hh:155
TUtil::SetJHUGenSpinTwoCouplings
void SetJHUGenSpinTwoCouplings(double Gacoupl[SIZE_GGG][2], double Gvvcoupl[SIZE_GVV][2], double Gvvpcoupl[SIZE_GVV][2], double Gvpvpcoupl[SIZE_GVV][2], double qLeftRightcoupl[SIZE_GQQ][2])
Definition: TUtil.cc:4087
SIZE_HQQ
@ SIZE_HQQ
Definition: raw_couplings.txt:5
MELACandidate::getAssociatedPhotons
std::vector< MELAParticle * > & getAssociatedPhotons()
Definition: MELACandidate.cc:181
gHIGGS_VV_1_PRIME
@ gHIGGS_VV_1_PRIME
Definition: raw_couplings.txt:22
PDGHelpers::isDownTypeQuark
bool isDownTypeQuark(const int id)
Definition: PDGHelpers.cc:45
TVar::bkgWWZZ
@ bkgWWZZ
Definition: TVar.hh:168
TVar::H0_g1prime2
@ H0_g1prime2
Definition: TVar.hh:127
TUtil::ConvertVectorFormat
MELACandidate * ConvertVectorFormat(SimpleParticleCollection_t *pDaughters, SimpleParticleCollection_t *pAssociated, SimpleParticleCollection_t *pMothers, bool isGen, std::vector< MELAParticle * > *particleList, std::vector< MELACandidate * > *candList)
Definition: TUtil.cc:8410
ewscheme_
struct @36 ewscheme_
PDGHelpers::isATopQuark
bool isATopQuark(const int id)
Definition: PDGHelpers.cc:50
qqb_z2jet_
void qqb_z2jet_(double *p, double *msq)
anonymous_namespace{TCouplingsBase.hh}::SIZE_HGG
@ SIZE_HGG
Definition: TCouplingsBase.hh:40
TVar::kUseAssociated_Leptons
@ kUseAssociated_Leptons
Definition: TVar.hh:31
MELACandidate::getAssociatedSortedVs
std::vector< MELAParticle * > getAssociatedSortedVs()
Definition: MELACandidate.cc:193
MELAParticle::p4
TLorentzVector p4
Definition: MELAParticle.h:18
TVar::simple_event_record::intermediateVid
std::vector< int > intermediateVid
Definition: TVar.hh:237
TVar::H2_g3
@ H2_g3
Definition: TVar.hh:153
gHIGGS_VV_2_PRIME5
@ gHIGGS_VV_2_PRIME5
Definition: raw_couplings.txt:32
__modjhugenmela_MOD_settopdecays
void __modjhugenmela_MOD_settopdecays(int *flag)
cLambdaHIGGS_VV_QSQ2
@ cLambdaHIGGS_VV_QSQ2
Definition: raw_couplings.txt:71
interference_
struct @32 interference_
gg_zz_all_
void gg_zz_all_(double *p, double *msq)
cLambdaHIGGS_VV_QSQ1
@ cLambdaHIGGS_VV_QSQ1
Definition: raw_couplings.txt:70
MELAParticle::z
double z() const
Definition: MELAParticle.h:69
nqcdjets_
struct @27 nqcdjets_
gHIGGS_VV_3_PRIME2
@ gHIGGS_VV_3_PRIME2
Definition: raw_couplings.txt:35
__modjhugenmela_MOD_setspintwocouplings
void __modjhugenmela_MOD_setspintwocouplings(double acoupl[SIZE_GGG][2], double vvcoupl[SIZE_GVV][2], double vvpcoupl[SIZE_GVV][2], double vpvpcoupl[SIZE_GVV][2], double qlr[SIZE_GQQ][2])
testME_all.int
int
Definition: testME_all.py:13
TUtil::SetJHUGenSpinZeroVVCouplings
void SetJHUGenSpinZeroVVCouplings(double Hvvcoupl[SIZE_HVV][2], double Hvvpcoupl[SIZE_HVV][2], double Hvpvpcoupl[SIZE_HVV][2], int Hvvcoupl_cqsq[SIZE_HVV_CQSQ], double HvvLambda_qsq[SIZE_HVV_LAMBDAQSQ][SIZE_HVV_CQSQ], bool useWWcoupl)
Definition: TUtil.cc:4078
TVar::simple_event_record::AssociationCode
int AssociationCode
Definition: TVar.hh:228
gg_zz_
void gg_zz_(double *p, double *msq)
TVar::H0_gsgs_PS
@ H0_gsgs_PS
Definition: TVar.hh:134
testME_all.ratio
ratio
Definition: testME_all.py:136
__modjhugenmela_MOD_getmvprimegvprime
void __modjhugenmela_MOD_getmvprimegvprime(double *mv, double *gv)
TUtil::SetJHUGenDistinguishWWCouplings
void SetJHUGenDistinguishWWCouplings(bool doAllow)
Definition: TUtil.cc:3353
cutoff_
struct @33 cutoff_
gHIGGS_VV_1_PRIME7
@ gHIGGS_VV_1_PRIME7
Definition: raw_couplings.txt:49
anomzffcouplings_
struct @44 anomzffcouplings_
gHIGGS_VV_4_PRIME2
@ gHIGGS_VV_4_PRIME2
Definition: raw_couplings.txt:41
PDGHelpers::getCoupledVertex
int getCoupledVertex(const int idfirst, const int idsecond, int *hel=0, int *useAHcoupl=0)
Definition: PDGHelpers.cc:235
TVar::simple_event_record::pStableTops
SimpleParticleCollection_t pStableTops
Definition: TVar.hh:244
gATQGC_dPA
@ gATQGC_dPA
Definition: raw_couplings.txt:163
TVar::HSMHiggs
@ HSMHiggs
Definition: TVar.hh:126
TVar::H2_g2
@ H2_g2
Definition: TVar.hh:152
TUtil::SetJHUGenAZffCouplings
void SetJHUGenAZffCouplings(bool needAZff, double AZffcoupl[SIZE_AZff][2])
Definition: TUtil.cc:4093
PDGHelpers::isAWBoson
bool isAWBoson(const int id)
Definition: PDGHelpers.cc:80
facscale_
struct @25 facscale_
TVar::Lep_WH_TU
@ Lep_WH_TU
Definition: TVar.hh:100
MELAParticle::charge
double charge() const
Definition: MELAParticle.cc:90
SpinZeroCouplings::Hbbcoupl
double Hbbcoupl[SIZE_HQQ][2]
Definition: TCouplings.hh:30
TVar::bkgZGamma
@ bkgZGamma
Definition: TVar.hh:164
AZffCouplings::AZffcoupl
double AZffcoupl[SIZE_AZff][2]
Definition: TCouplings.hh:155
TVar::H2_g9
@ H2_g9
Definition: TVar.hh:160
gHIGGS_VV_2_PRIME2
@ gHIGGS_VV_2_PRIME2
Definition: raw_couplings.txt:29
__modparameters_MOD_getmass
double __modparameters_MOD_getmass(int *part)
ckmfill_
void ckmfill_(int *nwz)
__modparameters_MOD_computeckmelements
void __modparameters_MOD_computeckmelements(double *invckm_ud, double *invckm_us, double *invckm_cd, double *invckm_cs, double *invckm_ts, double *invckm_tb, double *invckm_ub=0, double *invckm_cb=0, double *invckm_td=0)
__modhiggs_MOD_evalamp_gg_h_vv
void __modhiggs_MOD_evalamp_gg_h_vv(double P[6][4], int *MYIDUP, double *MatElSq)
TVar::Fixed_mZPlusmH
@ Fixed_mZPlusmH
Definition: TVar.hh:202
anonymous_namespace{TCouplingsBase.hh}::gHIGGS_GG_4
@ gHIGGS_GG_4
Definition: TCouplingsBase.hh:38
TVar::H0_gsgs
@ H0_gsgs
Definition: TVar.hh:133
gHIGGS_VV_1_PRIME2
@ gHIGGS_VV_1_PRIME2
Definition: raw_couplings.txt:23
gAZff_ZllLH
@ gAZff_ZllLH
Definition: raw_couplings.txt:181
gHIGGS_VV_3_PRIME
@ gHIGGS_VV_3_PRIME
Definition: raw_couplings.txt:34
__modjhugenmela_MOD_setewparameters
void __modjhugenmela_MOD_setewparameters(double *inMZ, double *inMW, double *inGf, double *inalpha_QED, double *inxw)
gHIGGS_VV_4
@ gHIGGS_VV_4
Definition: raw_couplings.txt:12
TUtil::GetDecayWidth
double GetDecayWidth(int ipart)
Definition: TUtil.cc:1566
TUtil::GetCKMElement
double GetCKMElement(int iquark, int jquark)
Definition: TUtil.cc:1525
scale_
struct @24 scale_
MELACandidate::getAssociatedLeptons
std::vector< MELAParticle * > & getAssociatedLeptons()
Definition: MELACandidate.cc:179
__modttbhiggs_MOD_evalxsec_pp_ttbh
void __modttbhiggs_MOD_evalxsec_pp_ttbh(double Ptth[13][4], int *SelectProcess, double MatElSq[11][11])
MELACandidate::setDecayMode
void setDecayMode(TVar::CandidateDecayMode flag)
Definition: MELACandidate.cc:112
__modhiggsjj_MOD_evalamp_sbfh_unsymm_sa_select_exact
void __modhiggsjj_MOD_evalamp_sbfh_unsymm_sa_select_exact(double P[5][4], int *iSel, int *jSel, int *rSel, int *sSel, double *MatElSq)
TUtil::GetMCFMParticleLabel
TString GetMCFMParticleLabel(const int &pid, bool useQJ, bool useExtendedConventions)
Definition: TUtil.cc:3249
TUtil::computeVHAngles
void computeVHAngles(float &costhetastar, float &costheta1, float &costheta2, float &Phi, float &Phi1, float &m1, float &m2, TLorentzVector p4M11, int Z1_lept1Id, TLorentzVector p4M12, int Z1_lept2Id, TLorentzVector p4M21, int Z2_lept1Id, TLorentzVector p4M22, int Z2_lept2Id, TLorentzVector jet1, int jet1Id, TLorentzVector jet2, int jet2Id, TLorentzVector *injet1=0, int injet1Id=0, TLorentzVector *injet2=0, int injet2Id=0)
Definition: TUtil.cc:873
SpinZeroCouplings::H2zzCLambda_qsq
int H2zzCLambda_qsq[SIZE_HVV_CQSQ]
Definition: TCouplings.hh:54
TVar::Had_ZH_TU
@ Had_ZH_TU
Definition: TVar.hh:97
TVar::MCFM
@ MCFM
Definition: TVar.hh:56
TVar::Lep_ZH_S
@ Lep_ZH_S
Definition: TVar.hh:88
SIZE_Vpff
@ SIZE_Vpff
Definition: raw_couplings.txt:100
MELAParticle
Definition: MELAParticle.h:13
mela.associated
string associated
Definition: mela.py:773
pdlabel_
struct @56 pdlabel_
TUtil.hh
SpinZeroCouplings::Hzzcoupl
double Hzzcoupl[SIZE_HVV][2]
Definition: TCouplings.hh:35
TUtilHelpers::copyVector
void copyVector(std::vector< T > const &input, std::vector< T > &target)
Definition: TUtilHelpers.hh:24
LambdaHIGGS_QSQ_VV_1
@ LambdaHIGGS_QSQ_VV_1
Definition: raw_couplings.txt:61
__modgraviton_MOD_evalamp_g_vv
void __modgraviton_MOD_evalamp_g_vv(double P[6][4], int *MYIDUP, double *MatElSq)
TVar::JJEW_S
@ JJEW_S
Definition: TVar.hh:84
TVar::CandidateDecay_ZW
@ CandidateDecay_ZW
Definition: TVar.hh:42
couple_
struct @34 couple_
SpinZeroCouplings::H2wwcoupl
double H2wwcoupl[SIZE_HVV][2]
Definition: TCouplings.hh:51
coupling_
void coupling_()
TUtil::computeAngles
void computeAngles(float &costhetastar, float &costheta1, float &costheta2, float &Phi, float &Phi1, TLorentzVector Z1_lept1, int Z1_lept1Id, TLorentzVector Z1_lept2, int Z1_lept2Id, TLorentzVector Z2_lept1, int Z2_lept1Id, TLorentzVector Z2_lept2, int Z2_lept2Id)
Definition: TUtil.cc:208
TUtil::ComplexBoost
std::pair< TLorentzVector, TLorentzVector > ComplexBoost(TVector3 const &beta, TLorentzVector const &p4)
Definition: TUtil.cc:166
TUtil::SetEwkCouplingParameters
void SetEwkCouplingParameters(double ext_Gf, double ext_aemmz, double ext_mW, double ext_mZ, double ext_xW, int ext_ewscheme)
Definition: TUtil.cc:1386
__modgraviton_MOD_evalamp_gg_g_vv
void __modgraviton_MOD_evalamp_gg_g_vv(double P[6][4], int *MYIDUP, double *MatElSq)
__modjhugenmela_MOD_sethiggsmasswidth
void __modjhugenmela_MOD_sethiggsmasswidth(double *mass, double *width)
TVar::Dynamic_qJ_qJ_qH
@ Dynamic_qJ_qJ_qH
Definition: TVar.hh:208
SpinZeroCouplings::H2zzLambda_qsq
double H2zzLambda_qsq[SIZE_HVV_LAMBDAQSQ][SIZE_HVV_CQSQ]
Definition: TCouplings.hh:52
TVar::ConserveDifermionMass
@ ConserveDifermionMass
Definition: TVar.hh:113
TVar::Dynamic_Softest_pTJ
@ Dynamic_Softest_pTJ
Definition: TVar.hh:211
TVar::CandidateDecay_ZG
@ CandidateDecay_ZG
Definition: TVar.hh:43
gATQGC_dMA
@ gATQGC_dMA
Definition: raw_couplings.txt:164
PDGHelpers::setCandidateDecayMode
void setCandidateDecayMode(TVar::CandidateDecayMode mode)
Definition: PDGHelpers.cc:232
TUtil::computeAnglesCS
void computeAnglesCS(float const &pbeam, float &costhetastar, float &costheta1, float &costheta2, float &Phi, float &Phi1, TLorentzVector Z1_lept1, int Z1_lept1Id, TLorentzVector Z1_lept2, int Z1_lept2Id, TLorentzVector Z2_lept1, int Z2_lept1Id, TLorentzVector Z2_lept2, int Z2_lept2Id)
Definition: TUtil.cc:374
anonymous_namespace{TCouplingsBase.hh}::gHIGGS_GG_2
@ gHIGGS_GG_2
Definition: TCouplingsBase.hh:36
gHIGGS_AA_3
@ gHIGGS_AA_3
Definition: raw_couplings.txt:19
TVar::MatrixElement
MatrixElement
Definition: TVar.hh:55
TVar::event_scales_type::factorizationScheme
TVar::EventScaleScheme factorizationScheme
Definition: TVar.hh:262
SpinZeroCouplings::H2wwLambda_qsq
double H2wwLambda_qsq[SIZE_HVV_LAMBDAQSQ][SIZE_HVV_CQSQ]
Definition: TCouplings.hh:53
em_
struct @39 em_
MELACandidate::addAssociatedLepton
void addAssociatedLepton(MELAParticle *myParticle)
Definition: MELACandidate.cc:606
SpinZeroCouplings::HzzLambda_qsq
double HzzLambda_qsq[SIZE_HVV_LAMBDAQSQ][SIZE_HVV_CQSQ]
Definition: TCouplings.hh:37
plabel_
struct @57 plabel_
TVar::ZZQQB_STU
@ ZZQQB_STU
Definition: TVar.hh:63
TVar::JJVBF_TU
@ JJVBF_TU
Definition: TVar.hh:94
TVar::event_scales_type::fac_scale_factor
double fac_scale_factor
Definition: TVar.hh:264
TVar::H2_g1
@ H2_g1
Definition: TVar.hh:151
TVar::Fixed_mZ
@ Fixed_mZ
Definition: TVar.hh:200
gAZff_dZLH
@ gAZff_dZLH
Definition: raw_couplings.txt:192
nmsq
@ nmsq
Definition: TMCFM.hh:24
SpinZeroCouplings::Hwwcoupl
double Hwwcoupl[SIZE_HVV][2]
Definition: TCouplings.hh:36
TUtil::removeMassFromPair
std::pair< TLorentzVector, TLorentzVector > removeMassFromPair(TLorentzVector const &jet1, int const &jet1Id, TLorentzVector const &jet2, int const &jet2Id, double m1=0, double m2=0)
Definition: TUtil.cc:74
srdiags_
struct @45 srdiags_
TVar::bkgWWZZ_SMHiggs
@ bkgWWZZ_SMHiggs
Definition: TVar.hh:172
gHIGGS_VV_2_PRIME
@ gHIGGS_VV_2_PRIME
Definition: raw_couplings.txt:28
gHIGGS_VV_3_PRIME5
@ gHIGGS_VV_3_PRIME5
Definition: raw_couplings.txt:38
TUtil::LeptonMassScheme
TVar::FermionMassRemoval LeptonMassScheme
Definition: TUtil.cc:27
TVar::NoPropagator
@ NoPropagator
Definition: TVar.hh:118
TVar::JHUGen
@ JHUGen
Definition: TVar.hh:57
gHIGGS_AA_4
@ gHIGGS_AA_4
Definition: raw_couplings.txt:20
TUtil::GetMassWidth
void GetMassWidth(int ipart, double &m, double &ga)
Definition: TUtil.cc:1592
MELACandidate::getAssociatedTops
std::vector< MELATopCandidate_t * > & getAssociatedTops()
Definition: MELACandidate.cc:183
SIZE_HVV_LAMBDAQSQ
@ SIZE_HVV_LAMBDAQSQ
Definition: raw_couplings.txt:66
TVar::Had_ZH
@ Had_ZH
Definition: TVar.hh:75
qq_wwqqstrong_
void qq_wwqqstrong_(double *p, double *msq)
gHIGGS_VV_1_PRIME3
@ gHIGGS_VV_1_PRIME3
Definition: raw_couplings.txt:24
TVar::NoRemoval
@ NoRemoval
Definition: TVar.hh:112
TVar::H2_g1g5
@ H2_g1g5
Definition: TVar.hh:156
__modttbhiggs_MOD_evalxsec_pp_bbbh
void __modttbhiggs_MOD_evalxsec_pp_bbbh(double Ptth[13][4], int *SelectProcess, double MatElSq[11][11])
TVar::H2_g8
@ H2_g8
Definition: TVar.hh:159
TUtil::ConvertThreeBodyDecayCandidate
MELAThreeBodyDecayCandidate * ConvertThreeBodyDecayCandidate(SimpleParticleCollection_t *tbdDaughters, std::vector< MELAParticle * > *particleList, std::vector< MELAThreeBodyDecayCandidate * > *tbdCandList)
Definition: TUtil.cc:8554
SpinZeroCouplings::H2g4g4coupl
double H2g4g4coupl[SIZE_HGG][2]
Definition: TCouplings.hh:46
MELAParticle::addMother
void addMother(MELAParticle *myParticle)
Definition: MELAParticle.cc:62
TUtil::ComputePDF
void ComputePDF(const TLorentzVector &p0, const TLorentzVector &p1, double fx1[nmsq], double fx2[nmsq], const double &EBEAM, const TVar::VerbosityLevel &verbosity)
Definition: TUtil.cc:7877
TUtil::GetMass
double GetMass(int ipart)
Definition: TUtil.cc:1529
__modparameters_MOD_evalalphas
void __modparameters_MOD_evalalphas()
zcouple_
struct @47 zcouple_
__modvhiggs_MOD_evalamp_vhiggs
void __modvhiggs_MOD_evalamp_vhiggs(int id[9], double helicity[9], double MomExt[9][4], double *me2)
MELAStreamHelpers::MELAerr
MELAOutputStreamer MELAerr
SpinZeroCouplings::H2bbcoupl
double H2bbcoupl[SIZE_HQQ][2]
Definition: TCouplings.hh:45
__modparameters_MOD_computeewvariables
void __modparameters_MOD_computeewvariables()
spinzerohiggs_anomcoupl_
struct @43 spinzerohiggs_anomcoupl_
TVar::ResonancePropagatorScheme
ResonancePropagatorScheme
Definition: TVar.hh:117
alphas_
double alphas_(double *q, double *amz, int *nloop)
TUtil::MCFM_SetupParticleCouplings
bool MCFM_SetupParticleCouplings(const TVar::Process &process, const TVar::Production &production, const TVar::VerbosityLevel &verbosity, const TVar::simple_event_record &mela_event, std::vector< int > *partOrder, std::vector< int > *apartOrder)
Definition: TUtil.cc:2227
TVar::Dynamic_qH
@ Dynamic_qH
Definition: TVar.hh:205
TVar::Had_WH_S
@ Had_WH_S
Definition: TVar.hh:87
mxpart
@ mxpart
Definition: TMCFM.hh:19
TVar::JJEW
@ JJEW
Definition: TVar.hh:73
TUtil::forbidMassiveJets
bool forbidMassiveJets
Definition: TUtil.cc:26
modparameters::b2
complex(8), public b2
Definition: mod_Parameters.F90:937
gAZff_ZllRH
@ gAZff_ZllRH
Definition: raw_couplings.txt:180
TUtil::SetMCFMaTQGCCouplings
void SetMCFMaTQGCCouplings(bool useBSM, aTQGCCouplings const *couplings)
Definition: TUtil.cc:3993
gHIGGS_VV_3
@ gHIGGS_VV_3
Definition: raw_couplings.txt:11
__modkinematics_MOD_setpdfs
void __modkinematics_MOD_setpdfs(double *x1, double *x2, double pdf[2][13])
TUtilHelpers.hh
TVar::bkgZZ_SMHiggs
@ bkgZZ_SMHiggs
Definition: TVar.hh:170
qq_vvqq_
void qq_vvqq_(double *p, double *msq)
gHIGGS_VV_1_PRIME5
@ gHIGGS_VV_1_PRIME5
Definition: raw_couplings.txt:26
TUtil::computeFakeJet
void computeFakeJet(TLorentzVector const &realJet, TLorentzVector const &others, TLorentzVector &fakeJet)
Definition: TUtil.cc:156
TVar::CandidateDecay_WG
@ CandidateDecay_WG
Definition: TVar.hh:44
gHIGGS_ZA_3
@ gHIGGS_ZA_3
Definition: raw_couplings.txt:15
TVar::bkgZZ
@ bkgZZ
Definition: TVar.hh:166
SIZE_AZff
@ SIZE_AZff
Definition: raw_couplings.txt:194
TVar::simple_event_record::nRequested_Antitops
int nRequested_Antitops
Definition: TVar.hh:234
gAZff_ZnunuRH
@ gAZff_ZnunuRH
Definition: raw_couplings.txt:186
convertLHEreverse
#define convertLHEreverse
Definition: TModParameters.hh:12
TUtil::TTHiggsMatEl
double TTHiggsMatEl(const TVar::Process &process, const TVar::Production &production, const TVar::MatrixElement &matrixElement, TVar::event_scales_type *event_scales, MelaIO *RcdME, const double &EBEAM, int topDecay, int topProcess, TVar::VerbosityLevel verbosity)
Definition: TUtil.cc:7187
TVar::InterfOn
@ InterfOn
Definition: TVar.hh:108
__modparameters_MOD_ckmbare
double __modparameters_MOD_ckmbare(int *id1in, int *id2in)
__modhiggsjj_MOD_evalamp_wbfh_unsymm_sa_select_exact
void __modhiggsjj_MOD_evalamp_wbfh_unsymm_sa_select_exact(double P[5][4], int *iSel, int *jSel, int *rSel, int *sSel, double *MatElSq)
TVar::Fixed_mW
@ Fixed_mW
Definition: TVar.hh:199
TUtil::constrainedRemovePairMass
void constrainedRemovePairMass(TLorentzVector &p1, TLorentzVector &p2, double m1=0, double m2=0)
Definition: TUtil.cc:39
__modparameters_MOD_setmass
void __modparameters_MOD_setmass(double *mass, int *ipart)
TVar::Fixed_TwomtPlusmH
@ Fixed_TwomtPlusmH
Definition: TVar.hh:203
TVar::Had_WH_TU
@ Had_WH_TU
Definition: TVar.hh:98
TVar::event_scales_type::ren_scale_factor
double ren_scale_factor
Definition: TVar.hh:263
__modjhugenmela_MOD_getmvgv
void __modjhugenmela_MOD_getmvgv(double *mv, double *gv)
qq_wwqq_
void qq_wwqq_(double *p, double *msq)
TVar::H0_Zgs
@ H0_Zgs
Definition: TVar.hh:131
MELACandidate::getAssociatedJets
std::vector< MELAParticle * > & getAssociatedJets()
Definition: MELACandidate.cc:182
TVar::ttH
@ ttH
Definition: TVar.hh:66
SpinZeroCouplings
Definition: TCouplings.hh:7
TVar::SelfDefine_spin0
@ SelfDefine_spin0
Definition: TVar.hh:180
TUtil::InitJHUGenMELA
void InitJHUGenMELA(const char *pathtoPDFSet, int PDFMember, double collider_sqrts)
Definition: TUtil.cc:3337
ewcharge_
struct @40 ewcharge_
TUtil::SumMatrixElementPDF
double SumMatrixElementPDF(const TVar::Process &process, const TVar::Production &production, const TVar::MatrixElement &matrixElement, const TVar::LeptonInterference &leptonInterf, TVar::event_scales_type *event_scales, MelaIO *RcdME, const double &EBEAM, TVar::VerbosityLevel verbosity)
Definition: TUtil.cc:4103
gg_hvv_tb_
void gg_hvv_tb_(double *p, double *msq)
PDGHelpers::isAGluon
bool isAGluon(const int id)
Definition: PDGHelpers.cc:58
TVar::simple_event_record::pAssociated
SimpleParticleCollection_t pAssociated
Definition: TVar.hh:239
gHIGGS_ZA_4
@ gHIGGS_ZA_4
Definition: raw_couplings.txt:16
TVar::JQCD
@ JQCD
Definition: TVar.hh:69
MELAParticle::getMother
MELAParticle * getMother(int index) const
Definition: MELAParticle.cc:64
SpinZeroCouplings::HwwCLambda_qsq
int HwwCLambda_qsq[SIZE_HVV_CQSQ]
Definition: TCouplings.hh:40
npart
int npart
Definition: TMCFM.hh:77
TUtil::JetMassScheme
TVar::FermionMassRemoval JetMassScheme
Definition: TUtil.cc:28
__modparameters_MOD_getdecaywidth
double __modparameters_MOD_getdecaywidth(int *part)
gHIGGS_VV_4_PRIME5
@ gHIGGS_VV_4_PRIME5
Definition: raw_couplings.txt:44
ewcouple_
struct @38 ewcouple_
TVar::H2_g6
@ H2_g6
Definition: TVar.hh:157
cabib_
struct @49 cabib_
TVar::Lep_ZH
@ Lep_ZH
Definition: TVar.hh:77
masses_mcfm_
struct @42 masses_mcfm_
nwz_
struct @48 nwz_
__modparameters_MOD_setdecaywidth
void __modparameters_MOD_setdecaywidth(double *width, int *ipart)
__modjhugenmela_MOD_setdecaymodes
void __modjhugenmela_MOD_setdecaymodes(int idfirst[2], int idsecond[2])
TVar::event_scales_type::renomalizationScheme
TVar::EventScaleScheme renomalizationScheme
Definition: TVar.hh:261
TUtil::adjustTopDaughters
void adjustTopDaughters(SimpleParticleCollection_t &daughters)
Definition: TUtil.cc:132
MelaIO::setVDaughterCouplings
void setVDaughterCouplings(const double &left, const double &right, int iv)
Definition: MelaIO.h:147
gAZff_ZuuLH
@ gAZff_ZuuLH
Definition: raw_couplings.txt:183
gHIGGS_VV_1
@ gHIGGS_VV_1
Definition: raw_couplings.txt:9
gHIGGS_VV_2_PRIME4
@ gHIGGS_VV_2_PRIME4
Definition: raw_couplings.txt:31
TVar::ZZQQB_S
@ ZZQQB_S
Definition: TVar.hh:81
MELACandidate::sortDaughters
void sortDaughters()
Definition: MELACandidate.cc:117
TVar::simple_event_record::pAntitopDaughters
std::vector< SimpleParticleCollection_t > pAntitopDaughters
Definition: TVar.hh:243
Q
double Q[11]
Definition: TMCFM.hh:121
gHIGGS_VV_3_PRIME3
@ gHIGGS_VV_3_PRIME3
Definition: raw_couplings.txt:36
MELACandidate
Definition: MELACandidate.h:7
TUtil::CheckPartonMomFraction
bool CheckPartonMomFraction(const TLorentzVector &p0, const TLorentzVector &p1, double xx[2], const double &EBEAM, const TVar::VerbosityLevel &verbosity)
Definition: TUtil.cc:7852
qqb_ww_
void qqb_ww_(double *p, double *msq)
TUtil::SetJHUGenSpinZeroQQCouplings
void SetJHUGenSpinZeroQQCouplings(double Hqqcoupl[SIZE_HQQ][2])
Definition: TUtil.cc:4085
SIZE_HVV
@ SIZE_HVV
Definition: raw_couplings.txt:57
TVar::DEBUG
@ DEBUG
Definition: TVar.hh:51
TVar::JJEWQCD_S
@ JJEWQCD_S
Definition: TVar.hh:85
mela.couplings
tuple couplings
Definition: mela.py:791
SpinZeroCouplings::H2wwCLambda_qsq
int H2wwCLambda_qsq[SIZE_HVV_CQSQ]
Definition: TCouplings.hh:55
MELAStreamHelpers.hh
TVar::simple_event_record::nRequested_AssociatedLeptons
int nRequested_AssociatedLeptons
Definition: TVar.hh:231
MELAThreeBodyDecayCandidate
Definition: MELAThreeBodyDecayCandidate.h:7
TVar::H2_g4
@ H2_g4
Definition: TVar.hh:154
ewinput_
struct @35 ewinput_
TVar::JJEWQCD_TU
@ JJEWQCD_TU
Definition: TVar.hh:96
lastphot_
struct @54 lastphot_
SimpleParticleCollection_t
std::vector< SimpleParticle_t > SimpleParticleCollection_t
Definition: TVar.hh:25
TUtil
Definition: TUtil.hh:48
TVar::Dynamic_qJJH
@ Dynamic_qJJH
Definition: TVar.hh:206
__modjhugenmela_MOD_setspinonecouplings
void __modjhugenmela_MOD_setspinonecouplings(double qqcoupl[SIZE_ZQQ][2], double vvcoupl[SIZE_ZVV][2])
gHIGGS_VV_4_PRIME6
@ gHIGGS_VV_4_PRIME6
Definition: raw_couplings.txt:54
gg_vv_
void gg_vv_(double *p, double *msq)
SpinZeroCouplings::H2ttcoupl
double H2ttcoupl[SIZE_HQQ][2]
Definition: TCouplings.hh:44
TVar::DefaultScaleScheme
@ DefaultScaleScheme
Definition: TVar.hh:197
TVar::CandidateDecay_ff
@ CandidateDecay_ff
Definition: TVar.hh:39
PDGHelpers::isATauLepton
bool isATauLepton(const int id)
Definition: PDGHelpers.cc:54
TVar::Fixed_mtPlusmH
@ Fixed_mtPlusmH
Definition: TVar.hh:204
MELACandidate::getDecayMode
TVar::CandidateDecayMode getDecayMode() const
Definition: MELACandidate.h:55
__modkinematics_MOD_getbwpropagator
double __modkinematics_MOD_getbwpropagator(double *shat, int *scheme)
TVar::Had_WH
@ Had_WH
Definition: TVar.hh:76
bveg1_mcfm_
struct @22 bveg1_mcfm_
nlooprun_
struct @52 nlooprun_
sqrts
double sqrts
Definition: TMCFM.hh:290
gATQGC_dVA
@ gATQGC_dVA
Definition: raw_couplings.txt:162
TVar::JJEW_TU
@ JJEW_TU
Definition: TVar.hh:95
TVar::Dynamic_Leading_pTJ
@ Dynamic_Leading_pTJ
Definition: TVar.hh:210
MELAParticle::id
int id
Definition: MELAParticle.h:17
gAZff_dZRH
@ gAZff_dZRH
Definition: raw_couplings.txt:191
MelaIO::melaCand
MELACandidate * melaCand
Definition: MelaIO.h:29
TVar::Production
Production
Definition: TVar.hh:60
TMCFMUtils::AssociatedParticleOrdering_QQVVQQAny
void AssociatedParticleOrdering_QQVVQQAny(int iSel, int jSel, int rSel, int sSel, int order[2])
Definition: TMCFMUtils.cc:18
qqb_zz_
void qqb_zz_(double *p, double *msq)
SpinZeroCouplings::H2t4t4coupl
double H2t4t4coupl[SIZE_HQQ][2]
Definition: TCouplings.hh:47
nuflav_
struct @30 nuflav_
TUtil::setJetMassScheme
void setJetMassScheme(TVar::FermionMassRemoval scheme=TVar::ConserveDifermionMass)
Definition: TUtil.cc:38
TVar::JJVBF_S
@ JJVBF_S
Definition: TVar.hh:83
TVar::Lep_WH
@ Lep_WH
Definition: TVar.hh:78
TUtil::computeVBFAngles
void computeVBFAngles(float &costhetastar, float &costheta1, float &costheta2, float &Phi, float &Phi1, float &Q2V1, float &Q2V2, TLorentzVector p4M11, int Z1_lept1Id, TLorentzVector p4M12, int Z1_lept2Id, TLorentzVector p4M21, int Z2_lept1Id, TLorentzVector p4M22, int Z2_lept2Id, TLorentzVector jet1, int jet1Id, TLorentzVector jet2, int jet2Id, TLorentzVector *injet1=0, int injet1Id=0, TLorentzVector *injet2=0, int injet2Id=0)
Definition: TUtil.cc:596
qcdcouple_
struct @37 qcdcouple_
TVar::kUseAssociated_StableTops
@ kUseAssociated_StableTops
Definition: TVar.hh:35
TVar::JJQCD_TU
@ JJQCD_TU
Definition: TVar.hh:93
TVar::simple_event_record
Definition: TVar.hh:227
gHIGGS_VV_2
@ gHIGGS_VV_2
Definition: raw_couplings.txt:10
TVar::SelfDefine_spin1
@ SelfDefine_spin1
Definition: TVar.hh:181
SpinZeroCouplings::Hb4b4coupl
double Hb4b4coupl[SIZE_HQQ][2]
Definition: TCouplings.hh:33
LambdaHIGGS_QSQ_VV_4
@ LambdaHIGGS_QSQ_VV_4
Definition: raw_couplings.txt:64
SpinZeroCouplings::Hggcoupl
double Hggcoupl[SIZE_HGG][2]
Definition: TCouplings.hh:27
TVar::H0hplus
@ H0hplus
Definition: TVar.hh:128
TUtil::GetBoostedParticleVectors
void GetBoostedParticleVectors(MELACandidate *melaCand, TVar::simple_event_record &mela_event, TVar::VerbosityLevel verbosity=TVar::DEBUG)
Definition: TUtil.cc:7947
modparameters::process
integer, public process
Definition: mod_Parameters.F90:17
TUtil::JHUGenMatEl
double JHUGenMatEl(const TVar::Process &process, const TVar::Production &production, const TVar::MatrixElement &matrixElement, TVar::event_scales_type *event_scales, MelaIO *RcdME, const double &EBEAM, TVar::VerbosityLevel verbosity)
Definition: TUtil.cc:4746
gHIGGS_KAPPA
@ gHIGGS_KAPPA
Definition: raw_couplings.txt:2
TVar::bbH
@ bbH
Definition: TVar.hh:67
gAZff_uZRH
@ gAZff_uZRH
Definition: raw_couplings.txt:189
__modzprime_MOD_evalamp_zprime_vv
void __modzprime_MOD_evalamp_zprime_vv(double P[6][4], int *MYIDUP, double *MatElSq)
__modjhugenmela_MOD_setvprimecontactcouplings
void __modjhugenmela_MOD_setvprimecontactcouplings(double Zpffcoupl[SIZE_Vpff][2], double Wpffcoupl[SIZE_Vpff][2])
TUtil::VHiggsMatEl
double VHiggsMatEl(const TVar::Process &process, const TVar::Production &production, const TVar::MatrixElement &matrixElement, TVar::event_scales_type *event_scales, MelaIO *RcdME, const double &EBEAM, bool includeHiggsDecay, TVar::VerbosityLevel verbosity)
Definition: TUtil.cc:6578
MELAParticle::getNMothers
int getNMothers() const
Definition: MELAParticle.h:49
gAZff_ZnunuLH
@ gAZff_ZnunuLH
Definition: raw_couplings.txt:187
__modjhugen_MOD_initfirsttime
void __modjhugen_MOD_initfirsttime(char *gridfilename, int *lenfilename, int *irep, double *collider_sqrts)
TVar::JJQCD_S
@ JJQCD_S
Definition: TVar.hh:82
PDGHelpers::isUpTypeQuark
bool isUpTypeQuark(const int id)
Definition: PDGHelpers.cc:40
gg_hzz_tb_
void gg_hzz_tb_(double *p, double *msq)
SIZE_GQQ
@ SIZE_GQQ
Definition: raw_couplings.txt:121
nflav_
struct @53 nflav_
PDGHelpers::isAJet
bool isAJet(const int id)
Definition: PDGHelpers.cc:18
TVar::Lep_ZH_TU
@ Lep_ZH_TU
Definition: TVar.hh:99
gATQGC_dFourA
@ gATQGC_dFourA
Definition: raw_couplings.txt:165
LambdaHIGGS_QSQ_VV_2
@ LambdaHIGGS_QSQ_VV_2
Definition: raw_couplings.txt:62
TUtil::computeVBFAngles_ComplexBoost
void computeVBFAngles_ComplexBoost(float &costhetastar, float &costheta1_real, float &costheta1_imag, float &costheta2_real, float &costheta2_imag, float &Phi, float &Phi1, float &Q2V1, float &Q2V2, TLorentzVector p4M11, int Z1_lept1Id, TLorentzVector p4M12, int Z1_lept2Id, TLorentzVector p4M21, int Z2_lept1Id, TLorentzVector p4M22, int Z2_lept2Id, TLorentzVector jet1, int jet1Id, TLorentzVector jet2, int jet2Id, TLorentzVector *injet1=0, int injet1Id=0, TLorentzVector *injet2=0, int injet2Id=0)
Definition: TUtil.cc:730
SpinZeroCouplings::H2ggcoupl
double H2ggcoupl[SIZE_HGG][2]
Definition: TCouplings.hh:42
__modjhugenmela_MOD_setdistinguishwwcouplingsflag
void __modjhugenmela_MOD_setdistinguishwwcouplingsflag(int *doallow)
gHIGGS_ZA_1_PRIME2
@ gHIGGS_ZA_1_PRIME2
Definition: raw_couplings.txt:46
MELAParticle::addDaughter
void addDaughter(MELAParticle *myParticle)
Definition: MELAParticle.cc:63
TUtil::ResetAmplitudeIncludes
void ResetAmplitudeIncludes()
Definition: TUtil.cc:3357
TVar::CandidateDecay_GG
@ CandidateDecay_GG
Definition: TVar.hh:45
TUtil::applyJetMassCorrection
void applyJetMassCorrection(bool flag=true)
Definition: TUtil.cc:36