00001
00002 #include "Rivet/Analysis.hh"
00003 #include "Rivet/RivetAIDA.hh"
00004 #include "Rivet/Tools/Logging.hh"
00005 #include "Rivet/Projections/UnstableFinalState.hh"
00006 #include "Rivet/Math/Constants.hh"
00007 #include "Rivet/Math/Units.hh"
00008 #include "HepMC/GenEvent.h"
00009 #include "HepMC/GenParticle.h"
00010 #include "HepMC/GenVertex.h"
00011 #include "HepMC/SimpleVector.h"
00012
00013 namespace Rivet {
00014
00015 using namespace HepMC;
00016 using namespace std;
00017
00018
00019 const double MAX_CTAU = 1.0E-11;
00020 const double MIN_pT = 0.0001;
00021
00022 class LHCB_2010_S8758301 : public Analysis {
00023 public:
00024
00025
00026
00027 LHCB_2010_S8758301()
00028 : Analysis("LHCB_2010_S8758301"),
00029 sumKs0_30(0.0), sumKs0_35(0.0),
00030 sumKs0_40(0.0), sumKs0_badnull(0),
00031 sumKs0_badlft(0), sumKs0_all(0),
00032 sumKs0_outup(0), sumKs0_outdwn(0),
00033 sum_low_pt_loss(0), sum_high_pt_loss(0)
00034 {
00035 setNeedsCrossSection(true);
00036 }
00037
00038
00039
00040
00041 void init() {
00042 MSG_DEBUG("Initializing analysis!");
00043 fillMap(partLftMap);
00044 _h_K0s_pt_30 = bookHistogram1D(1,1,1);
00045 _h_K0s_pt_35 = bookHistogram1D(1,1,2);
00046 _h_K0s_pt_40 = bookHistogram1D(1,1,3);
00047 _h_K0s_pt_y_30 = bookHistogram1D(2,1,1);
00048 _h_K0s_pt_y_35 = bookHistogram1D(2,1,2);
00049 _h_K0s_pt_y_40 = bookHistogram1D(2,1,3);
00050 _h_K0s_pt_y_all = bookHistogram1D(3,1,1);
00051 addProjection(UnstableFinalState(), "UFS");
00052 }
00053
00054
00055 void analyze(const Event& event) {
00056 int id;
00057 double y, pT;
00058 const double weight = event.weight();
00059 const UnstableFinalState& ufs = applyProjection<UnstableFinalState>(event, "UFS");
00060 double ancestor_lftime;
00061 foreach (const Particle& p, ufs.particles()) {
00062 id = p.pdgId();
00063 if ((id != 310) && (id != -310)) continue;
00064 sumKs0_all ++;
00065 ancestor_lftime = 0.;
00066 const GenParticle* long_ancestor = getLongestLivedAncestor(p, ancestor_lftime);
00067 if ( !(long_ancestor) )
00068 {
00069 sumKs0_badnull ++;
00070 continue;
00071 };
00072 if ( ancestor_lftime > MAX_CTAU ) {
00073 sumKs0_badlft ++;
00074 MSG_DEBUG("Ancestor " << long_ancestor->pdg_id() << ", ctau: " << ancestor_lftime << " [m]");
00075 continue;
00076 }
00077 const FourMomentum& qmom = p.momentum();
00078 y = 0.5 * log((qmom.E() + qmom.pz())/(qmom.E() - qmom.pz()));
00079 pT = sqrt((qmom.px() * qmom.px()) + (qmom.py() * qmom.py()));
00080 if (pT < MIN_pT) {
00081 sum_low_pt_loss ++;
00082 MSG_DEBUG("Small pT K^0_S: " << pT << " GeV/c.");
00083 }
00084 if (pT > 1.6) {
00085 sum_high_pt_loss ++;
00086 }
00087 if (y > 2.5 && y < 4.0) {
00088 _h_K0s_pt_y_all->fill(pT, weight);
00089 if (y > 2.5 && y < 3.0) {
00090 _h_K0s_pt_y_30->fill(pT, weight);
00091 _h_K0s_pt_30->fill(pT, weight);
00092 sumKs0_30 += weight;
00093 } else if (y > 3.0 && y < 3.5) {
00094 _h_K0s_pt_y_35->fill(pT, weight);
00095 _h_K0s_pt_35->fill(pT, weight);
00096 sumKs0_35 += weight;
00097 } else if (y > 3.5 && y < 4.0) {
00098 _h_K0s_pt_y_40->fill(pT, weight);
00099 _h_K0s_pt_40->fill(pT, weight);
00100 sumKs0_40 += weight;
00101 }
00102 } else if (y < 2.5) {
00103 sumKs0_outdwn ++;
00104 } else if (y > 4.0) {
00105 sumKs0_outup ++;
00106 }
00107 }
00108 }
00109
00110
00111
00112 void finalize() {
00113 MSG_DEBUG("Total number Ks0: " << sumKs0_all << endl
00114 << "Sum of weights: " << sumOfWeights() << endl
00115 << "Weight Ks0 (2.5 < y < 3.0): " << sumKs0_30 << endl
00116 << "Weight Ks0 (3.0 < y < 3.5): " << sumKs0_35 << endl
00117 << "Weight Ks0 (3.5 < y < 4.0): " << sumKs0_40 << endl
00118 << "Nb. unprompt Ks0 [null mother]: " << sumKs0_badnull << endl
00119 << "Nb. unprompt Ks0 [mother lifetime exceeded]: " << sumKs0_badlft << endl
00120 << "Nb. Ks0 (y > 4.0): " << sumKs0_outup << endl
00121 << "Nb. Ks0 (y < 2.5): " << sumKs0_outdwn << endl
00122 << "Nb. Ks0 (pT < " << (MIN_pT/MeV) << " MeV/c): " << sum_low_pt_loss << endl
00123 << "Nb. Ks0 (pT > 1.6 GeV/c): " << sum_high_pt_loss << endl
00124 << "Cross-section [mb]: " << crossSection()/millibarn << endl
00125 << "Nb. events: " << numEvents());
00126
00127
00128 double xsection_factor = crossSection()/sumOfWeights();
00129
00130 scale(_h_K0s_pt_30, 0.2*xsection_factor/microbarn);
00131 scale(_h_K0s_pt_35, 0.2*xsection_factor/microbarn);
00132 scale(_h_K0s_pt_40, 0.2*xsection_factor/microbarn);
00133
00134 scale(_h_K0s_pt_y_30, xsection_factor/0.5/millibarn);
00135 scale(_h_K0s_pt_y_35, xsection_factor/0.5/millibarn);
00136 scale(_h_K0s_pt_y_40, xsection_factor/0.5/millibarn);
00137 scale(_h_K0s_pt_y_all, xsection_factor/1.5/millibarn);
00138 }
00139
00140
00141
00142
00143 private:
00144
00145
00146 double getLifeTime(int pid) {
00147 double lft = -1.0;
00148 if (pid < 0) pid = - pid;
00149
00150 if (pid == 10331) pid = 30221;
00151 if (pid == 10221) pid = 9010221;
00152 map<int, double>::iterator pPartLft = partLftMap.find(pid);
00153
00154 if (pPartLft == partLftMap.end()) {
00155 if (pid <= 100) return 0.0;
00156 for (unsigned int i=0; i < sizeof(stablePDGIds)/sizeof(unsigned int); i++ ) {
00157 if (pid == stablePDGIds[i]) { lft = 0.0; break; };
00158 }
00159 } else {
00160 lft = (*pPartLft).second;
00161 }
00162 if (lft < 0.0)
00163 MSG_ERROR("Could not determine lifetime for particle with PID " << pid
00164 << "... This K_s^0 will be considered unprompt!");
00165 return lft;
00166 }
00167
00168 const GenParticle* getLongestLivedAncestor(const Particle& p, double& lifeTime) {
00169 const GenParticle* ret = NULL;
00170 lifeTime = 1.;
00171 if (!p.hasGenParticle()) return NULL;
00172 const GenParticle* pmother = &(p.genParticle());
00173 double longest_ctau = 0.;
00174 double mother_ctau;
00175 int mother_pid, n_inparts;
00176 GenVertex* ivertex = pmother->production_vertex();
00177 while (ivertex) {
00178 n_inparts = ivertex->particles_in_size();
00179 if (n_inparts < 1) {ret = NULL; break;};
00180 const HepMC::GenVertex::particles_in_const_iterator iPart_invtx = ivertex->particles_in_const_begin();
00181 pmother = (*iPart_invtx);
00182 mother_pid = pmother->pdg_id();
00183 ivertex = pmother->production_vertex();
00184 if ( (mother_pid == 2212) || (mother_pid <= 100) ) {
00185 if (ret == NULL) ret = pmother;
00186 continue;
00187 }
00188 mother_ctau = getLifeTime(mother_pid);
00189 if (mother_ctau < 0.) { ret= NULL; break; }
00190 if (mother_ctau > longest_ctau) {
00191 longest_ctau = mother_ctau;
00192 ret = pmother;
00193 }
00194 }
00195 if (ret) lifeTime = longest_ctau * c_light;
00196 return ret;
00197 }
00198
00199
00200
00201 bool fillMap(map<int, double> &m) {
00202 m[6] = 4.707703E-25; m[11] = 1.E+16; m[12] = 1.E+16;
00203 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;
00204 m[23] = 2.637914E-25; m[24] = 3.075758E-25; m[25] = 9.4E-26; m[35] = 9.4E-26;
00205 m[36] = 9.4E-26; m[37] = 9.4E-26; m[84] = 3.335641E-13; m[85] = 1.290893E-12;
00206 m[111] = 8.4E-17; m[113] = 4.405704E-24; m[115] = 6.151516E-24; m[117] = 4.088275E-24;
00207 m[119] = 2.102914E-24; m[130] = 5.116E-08; m[150] = 1.525E-12; m[211] = 2.6033E-08;
00208 m[213] = 4.405704E-24; m[215] = 6.151516E-24; m[217] = 4.088275E-24; m[219] = 2.102914E-24;
00209 m[221] = 5.063171E-19; m[223] = 7.752794E-23; m[225] = 3.555982E-24; m[227] = 3.91793E-24;
00210 m[229] = 2.777267E-24; m[310] = 8.953E-11; m[313] = 1.308573E-23; m[315] = 6.038644E-24;
00211 m[317] = 4.139699E-24; m[319] = 3.324304E-24; m[321] = 1.238E-08; m[323] = 1.295693E-23;
00212 m[325] = 6.682357E-24; m[327] = 4.139699E-24; m[329] = 3.324304E-24; m[331] = 3.210791E-21;
00213 m[333] = 1.545099E-22; m[335] = 9.016605E-24; m[337] = 7.565657E-24; m[350] = 1.407125E-12;
00214 m[411] = 1.04E-12; m[413] = 6.856377E-21; m[415] = 1.778952E-23; m[421] = 4.101E-13;
00215 m[423] = 1.000003E-19; m[425] = 1.530726E-23; m[431] = 5.E-13; m[433] = 1.000003E-19;
00216 m[435] = 3.291061E-23; m[441] = 2.465214E-23; m[443] = 7.062363E-21; m[445] = 3.242425E-22;
00217 m[510] = 1.525E-12; m[511] = 1.525E-12; m[513] = 1.000019E-19; m[515] = 1.31E-23;
00218 m[521] = 1.638E-12; m[523] = 1.000019E-19; m[525] = 1.31E-23; m[530] = 1.536875E-12;
00219 m[531] = 1.472E-12; m[533] = 1.E-19; m[535] = 1.31E-23; m[541] = 4.5E-13;
00220 m[553] = 1.218911E-20; m[1112] = 4.539394E-24; m[1114] = 5.578069E-24; m[1116] = 1.994582E-24;
00221 m[1118] = 2.269697E-24; m[1212] = 4.539394E-24; m[1214] = 5.723584E-24; m[1216] = 1.994582E-24;
00222 m[1218] = 1.316424E-24; m[2112] = 8.857E+02; m[2114] = 5.578069E-24; m[2116] = 4.388081E-24;
00223 m[2118] = 2.269697E-24; m[2122] = 4.539394E-24; m[2124] = 5.723584E-24; m[2126] = 1.994582E-24;
00224 m[2128] = 1.316424E-24; m[2212] = 1.E+16; m[2214] = 5.578069E-24; m[2216] = 4.388081E-24;
00225 m[2218] = 2.269697E-24; m[2222] = 4.539394E-24; m[2224] = 5.578069E-24; m[2226] = 1.994582E-24;
00226 m[2228] = 2.269697E-24; m[3112] = 1.479E-10; m[3114] = 1.670589E-23; m[3116] = 5.485102E-24;
00227 m[3118] = 3.656734E-24; m[3122] = 2.631E-10; m[3124] = 4.219309E-23; m[3126] = 8.227653E-24;
00228 m[3128] = 3.291061E-24; m[3212] = 7.4E-20; m[3214] = 1.828367E-23; m[3216] = 5.485102E-24;
00229 m[3218] = 3.656734E-24; m[3222] = 8.018E-11; m[3224] = 1.838582E-23; m[3226] = 5.485102E-24;
00230 m[3228] = 3.656734E-24; m[3312] = 1.639E-10; m[3314] = 6.648608E-23; m[3322] = 2.9E-10;
00231 m[3324] = 7.233101E-23; m[3334] = 8.21E-11; m[4112] = 2.991874E-22; m[4114] = 4.088274E-23;
00232 m[4122] = 2.E-13; m[4132] = 1.12E-13; m[4212] = 3.999999E-22; m[4214] = 3.291061E-22;
00233 m[4222] = 2.951624E-22; m[4224] = 4.417531E-23; m[4232] = 4.42E-13; m[4332] = 6.9E-14;
00234 m[4412] = 3.335641E-13; m[4422] = 3.335641E-13; m[4432] = 3.335641E-13; m[5112] = 1.E-19;
00235 m[5122] = 1.38E-12; m[5132] = 1.42E-12; m[5142] = 1.290893E-12; m[5212] = 1.E-19;
00236 m[5222] = 1.E-19; m[5232] = 1.42E-12; m[5242] = 1.290893E-12; m[5312] = 1.E-19;
00237 m[5322] = 1.E-19; m[5332] = 1.55E-12; m[5342] = 1.290893E-12; m[5442] = 1.290893E-12;
00238 m[5512] = 1.290893E-12; m[5522] = 1.290893E-12; m[5532] = 1.290893E-12; m[5542] = 1.290893E-12;
00239 m[10111] = 2.48382E-24; m[10113] = 4.635297E-24; m[10115] = 2.54136E-24; m[10211] = 2.48382E-24;
00240 m[10213] = 4.635297E-24; m[10215] = 2.54136E-24; m[10223] = 1.828367E-24; m[10225] = 3.636531E-24;
00241 m[10311] = 2.437823E-24; m[10313] = 7.313469E-24; m[10315] = 3.538775E-24;
00242 m[10321] = 2.437823E-24; m[10323] = 7.313469E-24; m[10325] = 3.538775E-24;
00243 m[10331] = 4.804469E-24; m[10411] = 4.38E-24; m[10413] = 3.29E-23; m[10421] = 4.38E-24;
00244 m[10423] = 3.22653E-23; m[10431] = 6.5821E-22; m[10433] = 6.5821E-22; m[10441] = 6.453061E-23;
00245 m[10511] = 4.39E-24; m[10513] = 1.65E-23; m[10521] = 4.39E-24; m[10523] = 1.65E-23;
00246 m[10531] = 4.39E-24; m[10533] = 1.65E-23; m[11114] = 2.194041E-24; m[11116] = 1.828367E-24;
00247 m[11212] = 1.880606E-24; m[11216] = 1.828367E-24; m[12112] = 2.194041E-24;
00248 m[12114] = 2.194041E-24; m[12116] = 5.063171E-24; m[12126] = 1.828367E-24;
00249 m[12212] = 2.194041E-24; m[12214] = 2.194041E-24; m[12216] = 5.063171E-24;
00250 m[12224] = 2.194041E-24; m[12226] = 1.828367E-24; m[13112] = 6.582122E-24; m[13114] = 1.09702E-23;
00251 m[13116] = 5.485102E-24; m[13122] = 1.316424E-23; m[13124] = 1.09702E-23; m[13126] = 6.928549E-24;
00252 m[13212] = 6.582122E-24; m[13214] = 1.09702E-23; m[13216] = 5.485102E-24; m[13222] = 6.582122E-24;
00253 m[13224] = 1.09702E-23; m[13226] = 5.485102E-24; m[13314] = 2.742551E-23;
00254 m[13324] = 2.742551E-23; m[14122] = 1.828367E-22; m[20022] = 1.E+16; m[20113] = 1.567172E-24;
00255 m[20213] = 1.567172E-24; m[20223] = 2.708692E-23; m[20313] = 3.782829E-24;
00256 m[20315] = 2.384827E-24; m[20323] = 3.782829E-24; m[20325] = 2.384827E-24;
00257 m[20333] = 1.198929E-23; m[20413] = 2.63E-24; m[20423] = 2.63E-24; m[20433] = 6.5821E-22;
00258 m[20443] = 7.395643E-22; m[20513] = 2.63E-24; m[20523] = 2.63E-24; m[20533] = 2.63E-24;
00259 m[21112] = 2.632849E-24; m[21114] = 3.291061E-24; m[21212] = 2.632849E-24;
00260 m[21214] = 6.582122E-24; m[22112] = 4.388081E-24; m[22114] = 3.291061E-24;
00261 m[22122] = 2.632849E-24; m[22124] = 6.582122E-24; m[22212] = 4.388081E-24;
00262 m[22214] = 3.291061E-24; m[22222] = 2.632849E-24; m[22224] = 3.291061E-24;
00263 m[23112] = 7.313469E-24; m[23114] = 2.991874E-24; m[23122] = 4.388081E-24;
00264 m[23124] = 6.582122E-24; m[23126] = 3.291061E-24; m[23212] = 7.313469E-24;
00265 m[23214] = 2.991874E-24; m[23222] = 7.313469E-24; m[23224] = 2.991874E-24;
00266 m[30113] = 2.632849E-24; m[30213] = 2.632849E-24; m[30221] = 1.880606E-24;
00267 m[30223] = 2.089563E-24; m[30313] = 2.056913E-24; m[30323] = 2.056913E-24;
00268 m[30443] = 2.419898E-23; m[31114] = 1.880606E-24; m[31214] = 3.291061E-24;
00269 m[32112] = 3.989164E-24; m[32114] = 1.880606E-24; m[32124] = 3.291061E-24;
00270 m[32212] = 3.989164E-24; m[32214] = 1.880606E-24; m[32224] = 1.880606E-24;
00271 m[33122] = 1.880606E-23; m[42112] = 6.582122E-24; m[42212] = 6.582122E-24;
00272 m[43122] = 2.194041E-24; m[53122] = 4.388081E-24; m[100111] = 1.645531E-24;
00273 m[100113] = 1.64553E-24; m[100211] = 1.645531E-24; m[100213] = 1.64553E-24;
00274 m[100221] = 1.196749E-23; m[100223] = 3.061452E-24; m[100313] = 2.837122E-24;
00275 m[100323] = 2.837122E-24; m[100331] = 4.459432E-25; m[100333] = 4.388081E-24;
00276 m[100441] = 4.701516E-23; m[100443] = 2.076379E-21; m[100553] = 2.056913E-20;
00277 m[200553] = 3.242425E-20; m[300553] = 3.210791E-23; m[9000111] = 8.776163E-24;
00278 m[9000211] = 8.776163E-24; m[9000443] = 8.227652E-24; m[9000553] = 5.983747E-24;
00279 m[9010111] = 3.164482E-24; m[9010211] = 3.164482E-24; m[9010221] = 9.403031E-24;
00280 m[9010443] = 8.438618E-24; m[9010553] = 8.3318E-24; m[9020443] = 1.061633E-23;
00281 m[9030221] = 6.038644E-24; m[9042413] = 2.07634E-21; m[9050225] = 1.394517E-24;
00282 m[9060225] = 3.291061E-24; m[9080225] = 4.388081E-24; m[9090225] = 2.056913E-24;
00283 m[9910445] = 2.07634E-21; m[9920443] = 2.07634E-21;
00284 return true;
00285 }
00286
00287
00288
00289 AIDA::IHistogram1D *_h_K0s_pt_y_30;
00290 AIDA::IHistogram1D *_h_K0s_pt_y_35;
00291 AIDA::IHistogram1D *_h_K0s_pt_y_40;
00292 AIDA::IHistogram1D *_h_K0s_pt_30;
00293 AIDA::IHistogram1D *_h_K0s_pt_35;
00294 AIDA::IHistogram1D *_h_K0s_pt_40;
00295 AIDA::IHistogram1D *_h_K0s_pt_y_all;
00296 double sumKs0_30;
00297 double sumKs0_35;
00298 double sumKs0_40;
00299
00300 size_t sumKs0_badnull;
00301 size_t sumKs0_badlft;
00302 size_t sumKs0_all;
00303 size_t sumKs0_outup;
00304 size_t sumKs0_outdwn;
00305 size_t sum_low_pt_loss;
00306 size_t sum_high_pt_loss;
00307
00308 std::map<int, double> partLftMap;
00309
00310 static const int stablePDGIds[205];
00311
00312 };
00313
00314
00315
00316 const int LHCB_2010_S8758301::stablePDGIds[205] = {
00317 311, 543, 545, 551, 555, 557, 1103, 2101, 2103, 2203, 3101, 3103, 3201, 3203, 3303,
00318 4101, 4103, 4124, 4201, 4203, 4301, 4303, 4312, 4314, 4322, 4324, 4334, 4403, 4414,
00319 4424, 4434, 4444, 5101, 5103, 5114, 5201, 5203, 5214, 5224, 5301, 5303, 5314, 5324,
00320 5334, 5401, 5403, 5412, 5414, 5422, 5424, 5432, 5434, 5444, 5503, 5514, 5524, 5534,
00321 5544, 5554, 10022, 10333, 10335, 10443, 10541, 10543, 10551, 10553, 10555, 11112,
00322 12118, 12122, 12218, 12222, 13316, 13326, 20543, 20553, 20555, 23314, 23324, 30343,
00323 30353, 30363, 30553, 33314, 33324, 41214, 42124, 52114, 52214, 100311, 100315, 100321,
00324 100325, 100411, 100413, 100421, 100423, 100551, 100555, 100557, 110551, 110553, 110555,
00325 120553, 120555, 130553, 200551, 200555, 210551, 210553, 220553, 1000001, 1000002,
00326 1000003, 1000004, 1000005, 1000006, 1000011, 1000012, 1000013, 1000014, 1000015,
00327 1000016, 1000021, 1000022, 1000023, 1000024, 1000025, 1000035, 1000037, 1000039,
00328 2000001, 2000002, 2000003, 2000004, 2000005, 2000006, 2000011, 2000012, 2000013,
00329 2000014, 2000015, 2000016, 3000111, 3000113, 3000211, 3000213, 3000221, 3000223,
00330 3000331, 3100021, 3100111, 3100113, 3200111, 3200113, 3300113, 3400113, 4000001,
00331 4000002, 4000011, 4000012, 5000039, 9000221, 9900012, 9900014, 9900016, 9900023,
00332 9900024, 9900041, 9900042};
00333
00334
00335
00336 DECLARE_RIVET_PLUGIN(LHCB_2010_S8758301);
00337
00338 }