rivet is hosted by Hepforge, IPPP Durham
LHCB_2011_I917009.cc
Go to the documentation of this file.
00001 // -*- C++ -*-
00002 #include "Rivet/Analysis.hh"
00003 #include "Rivet/Projections/UnstableFinalState.hh"
00004 #include "Rivet/Math/MathUtils.hh"
00005 #include "Rivet/Math/Constants.hh"
00006 
00007 #include "HepMC/GenEvent.h"
00008 #include "HepMC/GenParticle.h"
00009 #include "HepMC/GenVertex.h"
00010 #include "HepMC/SimpleVector.h"
00011 
00012 #include <iostream>
00013 #include <sstream>
00014 #include <string>
00015 
00016 namespace Rivet {
00017 
00018 
00019   class LHCB_2011_I917009 : public Analysis {
00020   public:
00021 
00022     /// @name Constructors etc.
00023     //@{
00024 
00025     /// Constructor
00026     LHCB_2011_I917009()
00027       : Analysis("LHCB_2011_I917009"),
00028         rap_beam(0.0), pt_min(0.0),
00029         pt1_edge(0.65), pt2_edge(1.0),
00030         pt3_edge(2.5), rap_min(2.),
00031         rap_max(0.0), dsShift(0)
00032     {   }
00033 
00034     //@}
00035 
00036 
00037   public:
00038 
00039     /// @name Analysis methods
00040     //@{
00041 
00042     /// Book histograms and initialise projections before the run
00043     void init() {
00044       int y_nbins = 4;
00045       fillMap(partLftMap);
00046       if (fuzzyEquals(sqrtS(), 0.9*TeV)) {
00047         rap_beam = 6.87;
00048         rap_max = 4.;
00049         pt_min = 0.25;
00050       } else if (fuzzyEquals(sqrtS(), 7*TeV)) {
00051         rap_beam = 8.92;
00052         rap_max = 4.5;
00053         pt_min = 0.15;
00054         y_nbins = 5;
00055         dsShift = 8;
00056       } else {
00057         MSG_ERROR("Incompatible beam energy!");
00058       }
00059 
00060       // Create the sets of temporary histograms that will be used to make the ratios in the finalize()
00061       for (size_t i = 0; i < 12; ++i) _tmphistos[i] = YODA::Histo1D(y_nbins, rap_min, rap_max);
00062       for (size_t i = 12; i < 15; ++i) _tmphistos[i] = YODA::Histo1D(refData(dsShift+5, 1, 1));
00063       for (size_t i = 15; i < 18; ++i) _tmphistos[i] = YODA::Histo1D(y_nbins, rap_beam - rap_max, rap_beam - rap_min);
00064 
00065       addProjection(UnstableFinalState(), "UFS");
00066     }
00067 
00068 
00069     /// Perform the per-event analysis
00070     void analyze(const Event& event) {
00071       const double weight = event.weight();
00072       const UnstableFinalState& ufs = applyProjection<UnstableFinalState>(event, "UFS");
00073       double ancestor_lftsum = 0.0;
00074       double y, pT;
00075       int id;
00076       int partIdx = -1;
00077       foreach (const Particle& p, ufs.particles()) {
00078         id = p.pdgId();
00079         // continue if particle not a K0s nor (anti-)Lambda
00080         if ( (id == 310) || (id == -310) )  {
00081           partIdx = 2;
00082         } else if ( id == 3122 ) {
00083           partIdx = 1;
00084         } else if ( id == -3122 ) {
00085           partIdx = 0;
00086         } else {
00087           continue;
00088         }
00089         ancestor_lftsum = getMotherLifeTimeSum(p);
00090         // Lifetime cut: ctau sum of all particle ancestors < 10^-9 m according to the paper (see eq. 5)
00091         const double MAX_CTAU = 1.0E-9; // [m]
00092         if ( (ancestor_lftsum < 0.0) || (ancestor_lftsum > MAX_CTAU) ) continue;
00093         const FourMomentum& qmom = p.momentum();
00094         y = log((qmom.E() + qmom.pz())/(qmom.E() - qmom.pz()))/2.;
00095         // skip this particle if it has too high or too low rapidity (extremely rare cases when E = +- pz)
00096         if ( std::isnan(y) || std::isinf(y) ) continue;
00097         y = fabs(y);
00098         if (!inRange(y, rap_min, rap_max)) continue;
00099         pT = sqrt((qmom.px() * qmom.px()) + (qmom.py() * qmom.py()));
00100         if (!inRange(pT, pt_min, pt3_edge)) continue;
00101         // Filling corresponding temporary histograms for pT intervals
00102         if (inRange(pT, pt_min, pt1_edge)) _tmphistos[partIdx*3].fill(y, weight);
00103         if (inRange(pT, pt1_edge, pt2_edge)) _tmphistos[partIdx*3+1].fill(y, weight);
00104         if (inRange(pT, pt2_edge, pt3_edge)) _tmphistos[partIdx*3+2].fill(y, weight);
00105         // Fill histo in rapidity for whole pT interval
00106         _tmphistos[partIdx+9].fill(y, weight);
00107         // Fill histo in pT for whole rapidity interval
00108         _tmphistos[partIdx+12].fill(pT, weight);
00109         // Fill histo in rapidity loss for whole pT interval
00110         _tmphistos[partIdx+15].fill(rap_beam - y, weight);
00111       }
00112     }
00113 
00114 
00115     // Generate the ratio histograms
00116     void finalize() {
00117       int dsId = dsShift + 1;
00118       for (size_t j = 0; j < 3; ++j) {
00119         /// @todo Compactify to two one-liners
00120         Scatter2DPtr s1 = bookScatter2D(dsId, 1, j+1);
00121         divide(_tmphistos[j], _tmphistos[3+j], s1);
00122         Scatter2DPtr s2 = bookScatter2D(dsId+1, 1, j+1);
00123         divide(_tmphistos[j], _tmphistos[6+j], s2);
00124       }
00125       dsId += 2;
00126       for (size_t j = 3; j < 6; ++j) {
00127         /// @todo Compactify to two one-liners
00128         Scatter2DPtr s1 = bookScatter2D(dsId, 1, 1);
00129         divide(_tmphistos[3*j], _tmphistos[3*j+1], s1);
00130         dsId += 1;
00131         Scatter2DPtr s2 = bookScatter2D(dsId, 1, 1);
00132         divide(_tmphistos[3*j], _tmphistos[3*j+2], s2);
00133         dsId += 1;
00134       }
00135     }
00136 
00137     //@}
00138 
00139   private:
00140 
00141 
00142     // Get particle lifetime from hardcoded data
00143     double getLifeTime(int pid) {
00144       double lft = -1.0;
00145       if (pid < 0) pid = - pid;
00146       // Correct Pythia6 PIDs for f0(980), f0(1370) mesons
00147       if (pid == 10331) pid = 30221;
00148       if (pid == 10221) pid = 9010221;
00149       map<int, double>::iterator pPartLft = partLftMap.find(pid);
00150       // search stable particle list
00151       if (pPartLft == partLftMap.end()) {
00152         if (pid <= 100) return 0.0;
00153         for (size_t i=0; i < sizeof(stablePDGIds)/sizeof(unsigned int); i++) {
00154           if (pid == stablePDGIds[i]) { lft = 0.0; break; }
00155         }
00156       } else {
00157         lft = (*pPartLft).second;
00158       }
00159       if (lft < 0.0 && PID::isHadron(pid)) {
00160         MSG_ERROR("Could not determine lifetime for particle with PID " << pid
00161                   << "... This V^0 will be considered unprompt!");
00162       }
00163       return lft;
00164     }
00165 
00166     // Data members like post-cuts event weight counters go here
00167     const double getMotherLifeTimeSum(const Particle& p) {
00168       if (p.genParticle() == NULL) return -1.;
00169       double lftSum = 0.;
00170       double plft = 0.;
00171       const GenParticle* part = p.genParticle();
00172       GenVertex* ivtx = part->production_vertex();
00173       while(ivtx)
00174         {
00175           if (ivtx->particles_in_size() < 1) { lftSum = -1.; break; };
00176           const HepMC::GenVertex::particles_in_const_iterator iPart_invtx = ivtx->particles_in_const_begin();
00177           part = (*iPart_invtx);
00178           if ( !(part) ) { lftSum = -1.; break; };
00179           ivtx = part->production_vertex();
00180           if ( (part->pdg_id() == 2212) || !(ivtx) ) break; //reached beam
00181           plft = getLifeTime(part->pdg_id());
00182           if (plft < 0.) { lftSum = -1.; break; };
00183           lftSum += plft;
00184         };
00185       return (lftSum * c_light);
00186     }
00187 
00188     /// @name Private variables
00189     //@{
00190 
00191     // The rapidity of the beam according to the selected beam energy
00192     double rap_beam;
00193 
00194     // The edges of the intervals of transverse momentum
00195     double pt_min, pt1_edge, pt2_edge, pt3_edge;
00196 
00197     // The limits of the rapidity window
00198     double rap_min;
00199     double rap_max;
00200 
00201     // Indicates which set of histograms will be output to yoda file (according to beam energy)
00202     int dsShift;
00203 
00204     // Map between PDG id and particle lifetimes in seconds
00205     std::map<int, double> partLftMap;
00206 
00207     // Set of PDG Ids for stable particles (PDG Id <= 100 are considered stable)
00208     static const int stablePDGIds[205];
00209 
00210     //@}
00211 
00212     /// @name Helper histograms
00213     //@{
00214     /// Histograms are defined in the following order: anti-Lambda, Lambda and K0s.
00215     /// First 3 suites of 3 histograms correspond to each particle in bins of y for the 3 pT intervals. (9 histos)
00216     /// Next 3 histograms contain the particles in y bins for the whole pT interval (3 histos)
00217     /// Next 3 histograms contain the particles in y_loss bins for the whole pT interval (3 histos)
00218     /// Last 3 histograms contain the particles in pT bins for the whole rapidity (y) interval (3 histos)
00219     YODA::Histo1D _tmphistos[18];
00220     //@}
00221 
00222     // Fill the PDG Id to Lifetime[seconds] map
00223     // Data was extracted from LHCb Particle Table through LHCb::ParticlePropertySvc
00224     bool fillMap(map<int, double>& m) {
00225       m[6] =  4.707703E-25;  m[11] =  1.E+16;  m[12] =  1.E+16;
00226       m[13] =  2.197019E-06;  m[14] =  1.E+16;  m[15] =  2.906E-13;  m[16] =  1.E+16;  m[22] =  1.E+16;
00227       m[23] =  2.637914E-25;  m[24] =  3.075758E-25;  m[25] =  9.4E-26;  m[35] =  9.4E-26;
00228       m[36] =  9.4E-26;  m[37] =  9.4E-26;  m[84] =  3.335641E-13;  m[85] =  1.290893E-12;
00229       m[111] =  8.4E-17;  m[113] =  4.405704E-24;  m[115] =  6.151516E-24;  m[117] =  4.088275E-24;
00230       m[119] =  2.102914E-24;  m[130] =  5.116E-08;  m[150] =  1.525E-12;  m[211] =  2.6033E-08;
00231       m[213] =  4.405704E-24;  m[215] =  6.151516E-24;  m[217] =  4.088275E-24;  m[219] =  2.102914E-24;
00232       m[221] =  5.063171E-19;  m[223] =  7.752794E-23;  m[225] =  3.555982E-24;  m[227] =  3.91793E-24;
00233       m[229] =  2.777267E-24;  m[310] =  8.953E-11;  m[313] =  1.308573E-23;  m[315] =  6.038644E-24;
00234       m[317] =  4.139699E-24;  m[319] =  3.324304E-24;  m[321] =  1.238E-08;  m[323] =  1.295693E-23;
00235       m[325] =  6.682357E-24;  m[327] =  4.139699E-24;  m[329] =  3.324304E-24;  m[331] =  3.210791E-21;
00236       m[333] =  1.545099E-22;  m[335] =  9.016605E-24;  m[337] =  7.565657E-24;  m[350] =  1.407125E-12;
00237       m[411] =  1.04E-12;  m[413] =  6.856377E-21;  m[415] =  1.778952E-23;  m[421] =  4.101E-13;
00238       m[423] =  1.000003E-19;  m[425] =  1.530726E-23;  m[431] =  5.E-13;  m[433] =  1.000003E-19;
00239       m[435] =  3.291061E-23;  m[441] =  2.465214E-23;  m[443] =  7.062363E-21;  m[445] =  3.242425E-22;
00240       m[510] =  1.525E-12;  m[511] =  1.525E-12;  m[513] =  1.000019E-19;  m[515] =  1.31E-23;
00241       m[521] =  1.638E-12;  m[523] =  1.000019E-19;  m[525] =  1.31E-23;  m[530] =  1.536875E-12;
00242       m[531] =  1.472E-12;  m[533] =  1.E-19;  m[535] =  1.31E-23;  m[541] =  4.5E-13;
00243       m[553] =  1.218911E-20;  m[1112] =  4.539394E-24;  m[1114] =  5.578069E-24;  m[1116] =  1.994582E-24;
00244       m[1118] =  2.269697E-24;  m[1212] =  4.539394E-24;  m[1214] =  5.723584E-24;  m[1216] =  1.994582E-24;
00245       m[1218] =  1.316424E-24;  m[2112] =  8.857E+02;  m[2114] =  5.578069E-24;  m[2116] =  4.388081E-24;
00246       m[2118] =  2.269697E-24;  m[2122] =  4.539394E-24;  m[2124] =  5.723584E-24;  m[2126] =  1.994582E-24;
00247       m[2128] =  1.316424E-24;  m[2212] =  1.E+16;  m[2214] =  5.578069E-24;  m[2216] =  4.388081E-24;
00248       m[2218] =  2.269697E-24;  m[2222] =  4.539394E-24;  m[2224] =  5.578069E-24;  m[2226] =  1.994582E-24;
00249       m[2228] =  2.269697E-24;  m[3112] =  1.479E-10;  m[3114] =  1.670589E-23;  m[3116] =  5.485102E-24;
00250       m[3118] =  3.656734E-24;  m[3122] =  2.631E-10;  m[3124] =  4.219309E-23;  m[3126] =  8.227653E-24;
00251       m[3128] =  3.291061E-24;  m[3212] =  7.4E-20;  m[3214] =  1.828367E-23;  m[3216] =  5.485102E-24;
00252       m[3218] =  3.656734E-24;  m[3222] =  8.018E-11;  m[3224] =  1.838582E-23;  m[3226] =  5.485102E-24;
00253       m[3228] =  3.656734E-24;  m[3312] =  1.639E-10;  m[3314] =  6.648608E-23;  m[3322] =  2.9E-10;
00254       m[3324] =  7.233101E-23;  m[3334] =  8.21E-11;  m[4112] =  2.991874E-22;  m[4114] =  4.088274E-23;
00255       m[4122] =  2.E-13;  m[4132] =  1.12E-13;  m[4212] =  3.999999E-22;  m[4214] =  3.291061E-22;
00256       m[4222] =  2.951624E-22;  m[4224] =  4.417531E-23;  m[4232] =  4.42E-13;  m[4332] =  6.9E-14;
00257       m[4412] =  3.335641E-13;  m[4422] =  3.335641E-13;  m[4432] =  3.335641E-13;  m[5112] =  1.E-19;
00258       m[5122] =  1.38E-12;  m[5132] =  1.42E-12;  m[5142] =  1.290893E-12;  m[5212] =  1.E-19;
00259       m[5222] =  1.E-19;  m[5232] =  1.42E-12;  m[5242] =  1.290893E-12;  m[5312] =  1.E-19;
00260       m[5322] =  1.E-19;  m[5332] =  1.55E-12;  m[5342] =  1.290893E-12;  m[5442] =  1.290893E-12;
00261       m[5512] =  1.290893E-12;  m[5522] =  1.290893E-12;  m[5532] =  1.290893E-12;  m[5542] =  1.290893E-12;
00262       m[10111] =  2.48382E-24;  m[10113] =  4.635297E-24;  m[10115] =  2.54136E-24;  m[10211] =  2.48382E-24;
00263       m[10213] =  4.635297E-24;  m[10215] =  2.54136E-24;  m[10223] =  1.828367E-24;  m[10225] =  3.636531E-24;
00264       m[10311] =  2.437823E-24;  m[10313] =  7.313469E-24;  m[10315] =  3.538775E-24;
00265       m[10321] =  2.437823E-24;  m[10323] =  7.313469E-24;  m[10325] =  3.538775E-24;
00266       m[10331] =  4.804469E-24;  m[10411] =  4.38E-24;  m[10413] =  3.29E-23;  m[10421] =  4.38E-24;
00267       m[10423] =  3.22653E-23;  m[10431] =  6.5821E-22;  m[10433] =  6.5821E-22;  m[10441] =  6.453061E-23;
00268       m[10511] =  4.39E-24;  m[10513] =  1.65E-23;  m[10521] =  4.39E-24;  m[10523] =  1.65E-23;
00269       m[10531] =  4.39E-24;  m[10533] =  1.65E-23;  m[11114] =  2.194041E-24;  m[11116] =  1.828367E-24;
00270       m[11212] =  1.880606E-24;  m[11216] =  1.828367E-24;  m[12112] =  2.194041E-24;
00271       m[12114] =  2.194041E-24;  m[12116] =  5.063171E-24;  m[12126] =  1.828367E-24;
00272       m[12212] =  2.194041E-24;  m[12214] =  2.194041E-24;  m[12216] =  5.063171E-24;
00273       m[12224] =  2.194041E-24;  m[12226] =  1.828367E-24;  m[13112] =  6.582122E-24;  m[13114] =  1.09702E-23;
00274       m[13116] =  5.485102E-24;  m[13122] =  1.316424E-23;  m[13124] =  1.09702E-23;  m[13126] =  6.928549E-24;
00275       m[13212] =  6.582122E-24;  m[13214] =  1.09702E-23;  m[13216] =  5.485102E-24;  m[13222] =  6.582122E-24;
00276       m[13224] =  1.09702E-23;  m[13226] =  5.485102E-24;  m[13314] =  2.742551E-23;
00277       m[13324] =  2.742551E-23;  m[14122] =  1.828367E-22;  m[20022] =  1.E+16;  m[20113] =  1.567172E-24;
00278       m[20213] =  1.567172E-24;  m[20223] =  2.708692E-23;  m[20313] =  3.782829E-24;
00279       m[20315] =  2.384827E-24;  m[20323] =  3.782829E-24;  m[20325] =  2.384827E-24;
00280       m[20333] =  1.198929E-23;  m[20413] =  2.63E-24;  m[20423] =  2.63E-24;  m[20433] =  6.5821E-22;
00281       m[20443] =  7.395643E-22;  m[20513] =  2.63E-24;  m[20523] =  2.63E-24;  m[20533] =  2.63E-24;
00282       m[21112] =  2.632849E-24;  m[21114] =  3.291061E-24;  m[21212] =  2.632849E-24;
00283       m[21214] =  6.582122E-24;  m[22112] =  4.388081E-24;  m[22114] =  3.291061E-24;
00284       m[22122] =  2.632849E-24;  m[22124] =  6.582122E-24;  m[22212] =  4.388081E-24;
00285       m[22214] =  3.291061E-24;  m[22222] =  2.632849E-24;  m[22224] =  3.291061E-24;
00286       m[23112] =  7.313469E-24;  m[23114] =  2.991874E-24;  m[23122] =  4.388081E-24;
00287       m[23124] =  6.582122E-24;  m[23126] =  3.291061E-24;  m[23212] =  7.313469E-24;
00288       m[23214] =  2.991874E-24;  m[23222] =  7.313469E-24;  m[23224] =  2.991874E-24;
00289       m[30113] =  2.632849E-24;  m[30213] =  2.632849E-24;  m[30221] =  1.880606E-24;
00290       m[30223] =  2.089563E-24;  m[30313] =  2.056913E-24;  m[30323] =  2.056913E-24;
00291       m[30443] =  2.419898E-23;  m[31114] =  1.880606E-24;  m[31214] =  3.291061E-24;
00292       m[32112] =  3.989164E-24;  m[32114] =  1.880606E-24;  m[32124] =  3.291061E-24;
00293       m[32212] =  3.989164E-24;  m[32214] =  1.880606E-24;  m[32224] =  1.880606E-24;
00294       m[33122] =  1.880606E-23;  m[42112] =  6.582122E-24;  m[42212] =  6.582122E-24;
00295       m[43122] =  2.194041E-24;  m[53122] =  4.388081E-24;  m[100111] =  1.645531E-24;
00296       m[100113] =  1.64553E-24;  m[100211] =  1.645531E-24;  m[100213] =  1.64553E-24;
00297       m[100221] =  1.196749E-23;  m[100223] =  3.061452E-24;  m[100313] =  2.837122E-24;
00298       m[100323] =  2.837122E-24;  m[100331] =  4.459432E-25;  m[100333] =  4.388081E-24;
00299       m[100441] =  4.701516E-23;  m[100443] =  2.076379E-21;  m[100553] =  2.056913E-20;
00300       m[200553] =  3.242425E-20;  m[300553] =  3.210791E-23;  m[9000111] =  8.776163E-24;
00301       m[9000211] =  8.776163E-24;  m[9000443] =  8.227652E-24;  m[9000553] =  5.983747E-24;
00302       m[9010111] =  3.164482E-24;  m[9010211] =  3.164482E-24;  m[9010221] =  9.403031E-24;
00303       m[9010443] =  8.438618E-24;  m[9010553] =  8.3318E-24;  m[9020443] =  1.061633E-23;
00304       m[9030221] =  6.038644E-24;  m[9042413] =  2.07634E-21;  m[9050225] =  1.394517E-24;
00305       m[9060225] =  3.291061E-24;  m[9080225] =  4.388081E-24;  m[9090225] =  2.056913E-24;
00306       m[9910445] =  2.07634E-21;  m[9920443] =  2.07634E-21;
00307       return true;
00308     }
00309 
00310   };
00311 
00312 
00313   const int LHCB_2011_I917009::stablePDGIds[205] = {
00314     311, 543, 545, 551, 555, 557, 1103, 2101, 2103, 2203, 3101, 3103, 3201, 3203, 3303,
00315     4101, 4103, 4124, 4201, 4203, 4301, 4303, 4312, 4314, 4322, 4324, 4334, 4403, 4414,
00316     4424, 4434, 4444, 5101, 5103, 5114, 5201, 5203, 5214, 5224, 5301, 5303, 5314, 5324,
00317     5334, 5401, 5403, 5412, 5414, 5422, 5424, 5432, 5434, 5444, 5503, 5514, 5524, 5534,
00318     5544, 5554, 10022, 10333, 10335, 10443, 10541, 10543, 10551, 10553, 10555, 11112,
00319     12118, 12122, 12218, 12222, 13316, 13326, 20543, 20553, 20555, 23314, 23324, 30343,
00320     30353, 30363, 30553, 33314, 33324, 41214, 42124, 52114, 52214, 100311, 100315, 100321,
00321     100325, 100411, 100413, 100421, 100423, 100551, 100555, 100557, 110551, 110553, 110555,
00322     120553, 120555, 130553, 200551, 200555, 210551, 210553, 220553, 1000001, 1000002,
00323     1000003, 1000004, 1000005, 1000006, 1000011, 1000012, 1000013, 1000014, 1000015,
00324     1000016, 1000021, 1000022, 1000023, 1000024, 1000025, 1000035, 1000037, 1000039,
00325     2000001, 2000002, 2000003, 2000004, 2000005, 2000006, 2000011, 2000012, 2000013,
00326     2000014, 2000015, 2000016, 3000111, 3000113, 3000211, 3000213, 3000221, 3000223,
00327     3000331, 3100021, 3100111, 3100113, 3200111, 3200113, 3300113, 3400113, 4000001,
00328     4000002, 4000011, 4000012, 5000039, 9000221, 9900012, 9900014, 9900016, 9900023,
00329     9900024, 9900041, 9900042 };
00330 
00331 
00332   // Hook for the plugin system
00333   DECLARE_RIVET_PLUGIN(LHCB_2011_I917009);
00334 
00335 }