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