File indexing completed on 2025-10-25 09:06:15
0001
0002
0003
0004
0005
0006
0007
0008
0009 #include "TMath.h"
0010
0011
0012 using P3EVector=ROOT::Math::PxPyPzEVector;
0013 using P3MVector=ROOT::Math::PxPyPzMVector;
0014 using MomVector=ROOT::Math::DisplacementVector3D<ROOT::Math::Cartesian3D<Double_t>,ROOT::Math::DefaultCoordinateSystemTag>;
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029
0030
0031 template<typename h>
0032 void calcTenths(const h& hist){
0033 int iTenthBin{1};
0034
0035
0036 for(int iHistBin{1}; iHistBin<hist->GetNbinsX(); iHistBin++){
0037
0038 if(iTenthBin == 10) break;
0039
0040
0041 float frac = (float)hist->Integral(1,iHistBin)/hist->Integral();
0042
0043
0044 if(frac > (float)iTenthBin/10){
0045 cout<<(int)iTenthBin*10<<"% \t bin no. "<<iHistBin-1<<"\t bin centre "<<hist->GetBinCenter(iHistBin-1)<<endl;
0046 iTenthBin++;
0047 }
0048 }
0049
0050 return;
0051 }
0052
0053
0054
0055
0056
0057 template<typename P>
0058 Double_t calcE(const P& mom, const Float_t& M){
0059 return TMath::Sqrt(mom.Mag2() + TMath::Power(M,2));
0060 }
0061
0062 Double_t calcE(const Float_t& px, const Float_t& py, const Float_t& pz, const Float_t& M){
0063 return TMath::Sqrt(TMath::Power(px,2) + TMath::Power(py,2) + TMath::Power(pz,2) + TMath::Power(M,2));
0064 }
0065
0066
0067
0068
0069
0070
0071
0072
0073 template <typename V>
0074 Double_t calcT_BABE(const V& be, const V& ba){
0075 double t = (ba - be).M2();
0076
0077 return TMath::Abs(t);
0078 }
0079
0080
0081
0082
0083
0084
0085
0086
0087 template <typename V>
0088 Double_t calcT_eX(const V& e, const V& ep, const V& X){
0089 double t = (e - ep - X).M2();
0090 return TMath::Abs(t);
0091 }
0092
0093 template <typename V>
0094 Double_t calcT_eX(const V& q, const V& X){
0095 double t = (q - X).M2();
0096 return TMath::Abs(t);
0097 }
0098
0099
0100
0101
0102
0103
0104
0105 template <typename V>
0106 Double_t calcT_eXBA(const V& e, const V& ep, const V& pp, const V& X){
0107
0108 double E_ep = ep.E();
0109 double theta_ep = ep.Theta();
0110
0111
0112 P3EVector q(e.X()-ep.X(), e.Y()-ep.Y(), e.Z()-ep.Z(), e.E()-ep.E());
0113 double sigma_h = (pp+X).E() - (pp+X).Z();
0114 double sigterm = sigma_h/2;
0115 double eterm = (E_ep*(1+TMath::Cos(theta_ep)))/2;
0116
0117 P3EVector pcorr(q.X(), q.Y(), -sigterm-eterm, sigterm-eterm);
0118
0119 double t = (pcorr - X).M2();
0120 return TMath::Abs(t);
0121 }
0122
0123
0124
0125
0126
0127
0128
0129 template<typename V>
0130 Double_t calcT_eXBE(const V& e, const V& p, const V& ep, const V& pp, const V& X){
0131
0132 P3EVector p4miss((e+p-ep-X).X(),(e+p-ep-X).Y(),(e+p-ep-X).Z(),(e+p-ep-X).E());
0133
0134
0135 Float_t pmiss_mag = p4miss.Vect().R();
0136 Float_t pcorr_mag = TMath::Sqrt(TMath::Power(pmiss_mag,2) + TMath::Power(pp.M(),2));
0137 P3EVector pcorr(p4miss.Vect().X(), p4miss.Vect().Y(), p4miss.Vect().Z(), pcorr_mag);
0138
0139 double t = (pcorr-p).M2();
0140 return TMath::Abs(t);
0141 }
0142
0143 template<typename V>
0144 Double_t calcT_eXBE(const V& p, const V& q, const V& pp, const V& X){
0145
0146 P3EVector p4miss((p+q-X).X(),(p+q-X).Y(),(p+q-X).Z(),(p+q-X).E());
0147
0148
0149 Float_t pmiss_mag = p4miss.Vect().R();
0150 Float_t pcorr_mag = TMath::Sqrt(TMath::Power(pmiss_mag,2) + TMath::Power(pp.M(),2));
0151 P3EVector pcorr(p4miss.Vect().X(), p4miss.Vect().Y(), p4miss.Vect().Z(), pcorr_mag);
0152
0153 double t = (pcorr-p).M2();
0154 return TMath::Abs(t);
0155 }
0156
0157 template<typename V>
0158 Double_t calcT_eXBE(const V& e, const V& p, const V& ep, const Float_t& mb, const V& X){
0159
0160 P3EVector p4miss((e+p-ep-X).X(),(e+p-ep-X).Y(),(e+p-ep-X).Z(),(e+p-ep-X).E());
0161
0162
0163 Float_t pmiss_mag = p4miss.Vect().R();
0164 Float_t pcorr_mag = TMath::Sqrt(TMath::Power(pmiss_mag,2) + TMath::Power(mb,2));
0165 P3EVector pcorr(p4miss.Vect().X(), p4miss.Vect().Y(), p4miss.Vect().Z(), pcorr_mag);
0166
0167 double t = (pcorr-p).M2();
0168 return TMath::Abs(t);
0169 }
0170
0171 template<typename V>
0172 Double_t calcT_eXBE(const V& p, const V& q, const Float_t& mb, const V& X){
0173
0174 P3EVector p4miss((p+q-X).X(),(p+q-X).Y(),(p+q-X).Z(),(p+q-X).E());
0175
0176
0177 Float_t pmiss_mag = p4miss.Vect().R();
0178 Float_t pcorr_mag = TMath::Sqrt(TMath::Power(pmiss_mag,2) + TMath::Power(mb,2));
0179 P3EVector pcorr(p4miss.Vect().X(), p4miss.Vect().Y(), p4miss.Vect().Z(), pcorr_mag);
0180
0181 double t = (pcorr-p).M2();
0182 return TMath::Abs(t);
0183 }
0184
0185
0186
0187
0188
0189
0190
0191 template<typename V>
0192 Double_t calcT_eBABE(const V& e, const V& p, const V& ep, const V& pp){
0193
0194 P3EVector q(e.X()-ep.X(), e.Y()-ep.Y(), e.Z()-ep.Z(), e.E()-ep.E());
0195 P3EVector pcorr(-q.X(), -q.Y(), pp.Z(), pp.E());
0196
0197 double t = (pcorr - p).M2();
0198 return TMath::Abs(t);
0199 }
0200
0201 template <typename V>
0202 Double_t calcT_eBABE(const V& p, const V& q, const V& pp){
0203 P3EVector pcorr(-q.X(), -q.Y(), pp.Z(), pp.E());
0204
0205 double t = (pcorr - p).M2();
0206 return TMath::Abs(t);
0207 }
0208
0209
0210
0211
0212
0213
0214
0215 template<typename V>
0216 Double_t calcT_XBABE(const V& p, const V& pp, const V& X){
0217 P3EVector pcorr(-X.X(), -X.Y(), pp.Z(), pp.E());
0218
0219 double t = (pcorr - p).M2();
0220 return TMath::Abs(t);
0221 }
0222
0223
0224
0225
0226
0227
0228
0229 template<typename V>
0230 Double_t calcT_eXBABE(const V& e, const V& p, const V& ep, const V& pp, const V& X){
0231
0232 P3EVector p4miss((e+p-ep-X).X(),(e+p-ep-X).Y(),(e+p-ep-X).Z(),(e+p-ep-X).E());
0233
0234
0235 Float_t pmiss_mag = p4miss.Vect().R();
0236 ROOT::Math::Polar3DVector pcorr_vect(pmiss_mag, pp.Theta(), pp.Phi());
0237 Float_t pcorr_mag = TMath::Sqrt(TMath::Power(pmiss_mag,2) + TMath::Power(pp.M(),2));
0238
0239 P3EVector pcorr(pcorr_vect.X(), pcorr_vect.Y(), pcorr_vect.Z(), pcorr_mag);
0240
0241 double t = (pcorr-p).M2();
0242 return TMath::Abs(t);
0243 }
0244
0245 template<typename V>
0246 Double_t calcT_eXBABE(const V& p, const V& q, const V& pp, const V& X){
0247
0248 P3EVector p4miss((p+q-X).X(),(p+q-X).Y(),(p+q-X).Z(),(p+q-X).E());
0249
0250
0251 Float_t pmiss_mag = p4miss.Vect().R();
0252 ROOT::Math::Polar3DVector pcorr_vect(pmiss_mag, pp.Theta(), pp.Phi());
0253 Float_t pcorr_mag = TMath::Sqrt(TMath::Power(pmiss_mag,2) + TMath::Power(pp.M(),2));
0254
0255 P3EVector pcorr(pcorr_vect.X(), pcorr_vect.Y(), pcorr_vect.Z(), pcorr_mag);
0256
0257 double t = (pcorr-p).M2();
0258 return TMath::Abs(t);
0259 }
0260
0261
0262
0263
0264 template<typename V>
0265 Double_t calcT_eHe(const V& e, const V& p, const V& ep, const V& pp, const V& X){
0266
0267 double M = p.M();
0268 double nu = e.E() - ep.E();
0269 double Q2 = (e-ep).M2();
0270
0271
0272 P3EVector q((e-ep).X(), (e-ep).Y(), (e-ep).Z(), (e-ep).E());
0273
0274 double cTheta = TMath::Cos( (q-X).Theta() );
0275
0276 double cosTerm = TMath::Sqrt((nu*nu)+Q2)*cTheta;
0277 double num = M*Q2 + (2*M*nu)*(nu-cosTerm);
0278 double den = M + nu - cosTerm;
0279
0280 double t = num/den;
0281 return TMath::Abs(t);
0282 }
0283
0284
0285
0286
0287 template <typename V>
0288 Double_t calcPMiss_3Body(const V& a, const V& b, const V& c, const V& d, const V& f){
0289 return (a+b-c-d-f).P();
0290 }
0291
0292 template <typename V>
0293 Double_t calcPtMiss_3Body(const V& a, const V& b, const V& c, const V& d, const V& f){
0294 return (a+b-c-d-f).Pt();
0295 }
0296
0297 template <typename V>
0298 Double_t calcEMiss_3Body(const V& a, const V& b, const V& c, const V& d, const V& f){
0299 return (a+b-c-d-f).E();
0300 }
0301
0302 template <typename V>
0303 Double_t calcM2Miss_3Body(const V& a, const V& b, const V& c, const V& d, const V& f){
0304 Float_t fEMiss = (a+b-c-d-f).E();
0305 Float_t fPMiss = (a+b-c-d-f).P();
0306
0307 Float_t fM2Miss = TMath::Power(fEMiss,2) - TMath::Power(fPMiss,2);
0308 return fM2Miss;
0309 }
0310
0311
0312
0313 template <typename V>
0314 Double_t calcPMiss_2Body(const V& a, const V& b, const V& c, const V& d){
0315 return (a+b-c-d).P();
0316 }
0317
0318 template <typename V>
0319 Double_t calcPtMiss_2Body(const V& a, const V& b, const V& c, const V& d){
0320 return (a+b-c-d).Pt();
0321 }
0322
0323 template <typename V>
0324 Double_t calcEMiss_2Body(const V& a, const V& b, const V& c, const V& d){
0325 return (a+b-c-d).E();
0326 }
0327
0328 template <typename V>
0329 Double_t calcM2Miss_2Body(const V& a, const V& b, const V& c, const V& d){
0330 Float_t fEMiss = (a+b-c-d).E();
0331 Float_t fPMiss = (a+b-c-d).P();
0332
0333 Float_t fM2Miss = TMath::Power(fEMiss,2) - TMath::Power(fPMiss,2);
0334 return fM2Miss;
0335 }