Go to the documentation of this file.00001 #include "GeneratorInterface/Pythia8Interface/plugins/Py8toJetInput.h"
00002
00003 #include "SimDataFormats/GeneratorProducts/interface/LHECommonBlocks.h"
00004 #include "GeneratorInterface/LHEInterface/interface/LHERunInfo.h"
00005 #include "GeneratorInterface/LHEInterface/interface/LHEEvent.h"
00006
00007 const std::vector<fastjet::PseudoJet>
00008 Py8toJetInput::fillJetAlgoInput( const Event& event, const Event& workEvent,
00009 const lhef::LHEEvent* lhee,
00010 const std::vector<int>* typeIdx )
00011 {
00012
00013 fJetInput.clear();
00014
00015 Event workEventJet = workEvent;
00016
00017 const lhef::HEPEUP& hepeup = *lhee->getHEPEUP();
00018
00019 std::set< int > typeSet[3];
00020
00021
00022
00023
00024
00025 for ( size_t i=0; i<3; i++ )
00026 {
00027 typeSet[i].clear();
00028 for ( size_t j=0; j<typeIdx[i].size(); j++ )
00029 {
00030
00031
00032
00033
00034
00035
00036
00037 int pos = typeIdx[i][j];
00038 int shift = 3;
00039
00040 for ( int ip=2; ip<pos; ip++ )
00041 {
00042
00043
00044
00045
00046 if ( hepeup.MOTHUP[ip].first == hepeup.MOTHUP[ip].second )
00047 {
00048 shift--;
00049 }
00050 }
00051 pos += shift;
00052
00053 typeSet[i].insert( pos );
00054 }
00055 }
00056
00057
00058
00059
00060 int iType = 0;
00061 int jetAllow = 0;
00062
00063
00064
00065
00066 for (int i = 0; i < workEventJet.size(); ++i)
00067 {
00068
00069 if (!workEventJet[i].isFinal()) continue;
00070
00071
00072 if (jetAllow == 1)
00073 {
00074
00075
00076
00077 int id = workEventJet[i].idAbs();
00078 if ((id >= 11 && id <= 16) || id == ID_TOP || id == ID_PHOTON)
00079 {
00080 workEventJet[i].statusNeg();
00081 continue;
00082 }
00083 }
00084
00085
00086 int idx = workEventJet[i].daughter1();
00087
00088
00089 while (true)
00090 {
00091
00092
00093 if (iType == 0)
00094 {
00095
00096
00097 if (typeSet[1].find(idx) != typeSet[1].end() ||
00098 typeSet[2].find(idx) != typeSet[2].end())
00099 {
00100 workEventJet[i].statusNeg();
00101 break;
00102 }
00103
00104
00105 if (idx == 0)
00106 {
00107 break;
00108 }
00109
00110 idx = event[idx].mother1();
00111
00112
00113 }
00114 else if (iType == 1)
00115 {
00116
00117
00118 if (typeSet[1].find(idx) != typeSet[1].end()) break;
00119
00120
00121
00122 if (idx == 0)
00123 {
00124 workEventJet[i].statusNeg();
00125 break;
00126 }
00127
00128
00129 idx = event[idx].mother1();
00130
00131 }
00132 }
00133 }
00134
00135
00136
00137
00138
00139
00140
00141
00142
00143
00144
00145
00146
00147
00148
00149
00150
00151
00152
00153
00154
00155
00156
00157
00158
00159
00160
00161
00162 for ( int i=0; i<workEventJet.size(); i++ )
00163 {
00164
00165
00166
00167 if ( workEventJet[i].status() < 0 ) continue;
00168
00169
00170
00171
00172
00173
00174 if ( fabs(workEventJet[i].eta()) > fJetEtaMax ) continue ;
00175
00176
00177
00178
00179 fastjet::PseudoJet partTmp = workEventJet[i];
00180 fJetInput.push_back( partTmp );
00181 }
00182
00183 return fJetInput;
00184
00185 }
00186
00187
00188 int Py8toJetInput::getAncestor( int pos, const Event& fullEvent, const Event& workEvent )
00189 {
00190
00191 int parentId = fullEvent[pos].mother1();
00192 int parentPrevId = 0;
00193 int counter = pos;
00194
00195 while ( parentId > 0 )
00196 {
00197 if ( parentId == fullEvent[counter].mother2() )
00198 {
00199 parentPrevId = parentId;
00200 counter = parentId;
00201 parentId = fullEvent[parentPrevId].mother1();
00202 continue;
00203 }
00204
00205
00206
00207
00208
00209 if ( (parentId < parentPrevId) || parentId < fullEvent[counter].mother2() )
00210 {
00211
00212
00213 if ( abs(fullEvent[counter].status()) == 22 || abs(fullEvent[counter].status()) == 23 )
00214 {
00215
00216
00217 parentId = counter;
00218 break;
00219 }
00220 else
00221 {
00222 parentPrevId = parentId;
00223 parentId = fullEvent[parentPrevId].mother1();
00224 }
00225 }
00226 else if ( parentId > parentPrevId || parentId > pos )
00227 {
00228 parentId = -1;
00229 break;
00230 }
00231
00232
00233
00234 if ( abs(fullEvent[parentId].status()) == 22 || abs(fullEvent[parentId].status())== 23 )
00235 {
00236 break;
00237 }
00238 if ( abs(fullEvent[parentId].status()) < 22 )
00239 {
00240 parentId = -1;
00241 break;
00242 }
00243 }
00244
00245 return parentId;
00246
00247 }
00248
00249 #include "HepMC/HEPEVT_Wrapper.h"
00250 #include <cassert>
00251
00252 const std::vector<fastjet::PseudoJet>
00253 Py8toJetInputHEPEVT::fillJetAlgoInput( const Event& event, const Event& workEvent,
00254 const lhef::LHEEvent* lhee,
00255 const std::vector<int>* )
00256 {
00257
00258 fJetInput.clear();
00259
00260 HepMC::HEPEVT_Wrapper::zero_everything();
00261
00262
00263
00264 std::vector<int> Py8PartonIdx;
00265 Py8PartonIdx.clear();
00266 std::vector<int> HEPEVTPartonIdx;
00267 HEPEVTPartonIdx.clear();
00268
00269
00270
00271 int index = 0;
00272
00273 int Py8PartonCounter = 0;
00274 int HEPEVTPartonCounter = 0;
00275
00276
00277
00278 for ( int iprt=1; iprt<event.size(); iprt++ )
00279 {
00280 const Particle& part = event[iprt];
00281 if ( abs(part.status()) < 22 ) continue;
00282
00283
00284 Py8PartonCounter = iprt;
00285 break;
00286 }
00287
00288 const lhef::HEPEUP& hepeup = *lhee->getHEPEUP();
00289
00290 for ( int iprt=2; iprt<hepeup.NUP; iprt++ )
00291 {
00292 index++;
00293 HepMC::HEPEVT_Wrapper::set_id( index, hepeup.IDUP[iprt] );
00294 HepMC::HEPEVT_Wrapper::set_status( index, 2 );
00295 HepMC::HEPEVT_Wrapper::set_momentum( index, hepeup.PUP[iprt][0], hepeup.PUP[iprt][1], hepeup.PUP[iprt][2], hepeup.PUP[iprt][4] );
00296 HepMC::HEPEVT_Wrapper::set_mass( index, hepeup.PUP[iprt][4] );
00297
00298 HepMC::HEPEVT_Wrapper::set_parents( index, 0, 0 );
00299 HepMC::HEPEVT_Wrapper::set_children( index, 0, 0 );
00300 if ( hepeup.MOTHUP[iprt].first > 2 && hepeup.MOTHUP[iprt].second > 2 )
00301 {
00302 HEPEVTPartonCounter++;
00303 continue;
00304 }
00305 Py8PartonIdx.push_back( Py8PartonCounter );
00306 Py8PartonCounter++;
00307 HEPEVTPartonIdx.push_back( HEPEVTPartonCounter);
00308 HEPEVTPartonCounter++;
00309 }
00310
00311 HepMC::HEPEVT_Wrapper::set_number_entries( index );
00312
00313
00314
00315
00316 for ( int iprt=1; iprt<workEvent.size(); iprt++ )
00317 {
00318
00319 const Particle& part = workEvent[iprt];
00320
00321
00322
00323 if ( part.status() < 51 ) continue;
00324 index++;
00325 HepMC::HEPEVT_Wrapper::set_id( index, part.id() );
00326
00327
00328 HepMC::HEPEVT_Wrapper::set_status( index, 1 );
00329 HepMC::HEPEVT_Wrapper::set_momentum( index, part.px(), part.py(), part.pz(), part.e() );
00330 HepMC::HEPEVT_Wrapper::set_mass( index, part.m() );
00331 HepMC::HEPEVT_Wrapper::set_position( index, part.xProd(), part.yProd(), part.zProd(), part.tProd() );
00332 HepMC::HEPEVT_Wrapper::set_parents( index, 0, 0 );
00333
00334 HepMC::HEPEVT_Wrapper::set_children( index, 0, 0 );
00335
00336
00337
00338 int parentId = getAncestor( part.daughter1(), event, workEvent );
00339
00340 if ( parentId <= 0 ) continue;
00341
00342 for ( int idx=0; idx<(int)Py8PartonIdx.size(); idx++ )
00343 {
00344 if ( parentId == Py8PartonIdx[idx] )
00345 {
00346 int idx1 = HEPEVTPartonIdx[idx];
00347 HepMC::HEPEVT_Wrapper::set_parents( index, idx1+1, idx1+1 );
00348 break;
00349 }
00350 }
00351
00352 }
00353
00354 HepMC::HEPEVT_Wrapper::set_number_entries( index );
00355
00356
00357
00358
00359
00360 return fJetInput;
00361
00362 }