00001 #include "TopQuarkAnalysis/TopEventSelection/interface/TtFullHadSignalSel.h"
00002 #include "PhysicsTools/CandUtils/interface/EventShapeVariables.h"
00003 #include "PhysicsTools/CandUtils/interface/Thrust.h"
00004 #include "DataFormats/Math/interface/deltaR.h"
00005 #include "TLorentzVector.h"
00006 #include "TVector3.h"
00007
00008 TtFullHadSignalSel::TtFullHadSignalSel()
00009 {
00010 }
00011
00012 std::vector<math::XYZVector> makeVecForEventShape(std::vector<pat::Jet> jets, bool only6Jets = true, ROOT::Math::Boost boost = ROOT::Math::Boost(0.,0.,0.)) {
00013 std::vector<math::XYZVector> p;
00014 bool doBoost = (boost == ROOT::Math::Boost(0.,0.,0.)) ? false : true;
00015 for(std::vector<pat::Jet>::const_iterator jet = jets.begin(); jet != jets.end(); ++jet){
00016 math::XYZVector Vjet;
00017 if(doBoost){
00018 ROOT::Math::LorentzVector<ROOT::Math::PxPyPzE4D<double> > Ljet(jet->px(), jet->py(), jet->pz(), jet->energy());
00019 Vjet = math::XYZVector(boost(Ljet).Px(), boost(Ljet).Py(), boost(Ljet).Pz());
00020 }
00021 else
00022 Vjet = math::XYZVector(jet->px(), jet->py(), jet->pz());
00023 p.push_back(Vjet);
00024 if(only6Jets && jet-jets.begin()==5) break;
00025 }
00026 return p;
00027 }
00028
00029 TtFullHadSignalSel::TtFullHadSignalSel(const std::vector<pat::Jet>& jets)
00030 {
00031
00032 H_ = -1.;
00033 Ht_ = -1.;
00034 Ht123_ = -1.;
00035 Ht3jet_ = -1.;
00036 Et56_ = -1.;
00037 sqrt_s_ = -1.;
00038 M3_ = -1.;
00039
00040 TCHE_Bjets_ = 0.;
00041 TCHP_Bjets_ = 0.;
00042 SSVHE_Bjets_ = 0.;
00043 SSVHP_Bjets_ = 0.;
00044 CSV_Bjets_ = 0.;
00045 CSVMVA_Bjets_ = 0.;
00046 SM_Bjets_ = 0.;
00047
00048 jets_etaetaMoment_ = 0.;
00049 jets_etaphiMoment_ = 0.;
00050 jets_phiphiMoment_ = 0.;
00051
00052 jets_etaetaMomentLogEt_ = 0.;
00053 jets_etaphiMomentLogEt_ = 0.;
00054 jets_phiphiMomentLogEt_ = 0.;
00055
00056 jets_etaetaMomentNoB_ = 0.;
00057 jets_etaphiMomentNoB_ = 0.;
00058 jets_phiphiMomentNoB_ = 0.;
00059
00060 aplanarity_ = -1.;
00061 sphericity_ = -1.;
00062 circularity_ = -1.;
00063 isotropy_ = -1.;
00064 C_ = -1.;
00065 D_ = -1.;
00066
00067 aplanarityAll_ = -1.;
00068 sphericityAll_ = -1.;
00069 circularityAll_ = -1.;
00070 isotropyAll_ = -1.;
00071 CAll_ = -1.;
00072 DAll_ = -1.;
00073
00074 aplanarityAllCMS_ = -1.;
00075 sphericityAllCMS_ = -1.;
00076 circularityAllCMS_ = -1.;
00077 isotropyAllCMS_ = -1.;
00078 CAllCMS_ = -1.;
00079 DAllCMS_ = -1.;
00080
00081 thrust_ = -1.;
00082 thrustCMS_ = -1.;
00083
00084 TCHE_BJet_Discs_ = std::vector<double>(0);
00085 TCHP_BJet_Discs_ = std::vector<double>(0);
00086 SSVHE_BJet_Discs_ = std::vector<double>(0);
00087 SSVHP_BJet_Discs_ = std::vector<double>(0);
00088 CSV_BJet_Discs_ = std::vector<double>(0);
00089 CSVMVA_BJet_Discs_ = std::vector<double>(0);
00090 SM_BJet_Discs_ = std::vector<double>(0);
00091
00092 pts_ = std::vector<double>(0);
00093 EtSin2Thetas_ = std::vector<double>(0);
00094 thetas_ = std::vector<double>(0);
00095 thetaStars_ = std::vector<double>(0);
00096 EtStars_ = std::vector<double>(0);
00097
00098 EtSin2Theta3jet_ = 0.;
00099 theta3jet_ = 0.;
00100 thetaStar3jet_ = 0.;
00101 sinTheta3jet_ = 0.;
00102 sinThetaStar3jet_ = 0.;
00103 EtStar3jet_ = 0.;
00104
00105 etaetaMoments_ = std::vector<double>(0);
00106 etaphiMoments_ = std::vector<double>(0);
00107 phiphiMoments_ = std::vector<double>(0);
00108
00109 etaetaMomentsLogEt_ = std::vector<double>(0);
00110 etaphiMomentsLogEt_ = std::vector<double>(0);
00111 phiphiMomentsLogEt_ = std::vector<double>(0);
00112
00113 etaetaMomentsMoment_ = std::vector<double>(0);
00114 etaphiMomentsMoment_ = std::vector<double>(0);
00115 phiphiMomentsMoment_ = std::vector<double>(0);
00116
00117 etaetaMomentsMomentLogEt_ = std::vector<double>(0);
00118 etaphiMomentsMomentLogEt_ = std::vector<double>(0);
00119 phiphiMomentsMomentLogEt_ = std::vector<double>(0);
00120
00121 etaetaMomentsNoB_ = std::vector<double>(0);
00122 etaphiMomentsNoB_ = std::vector<double>(0);
00123 phiphiMomentsNoB_ = std::vector<double>(0);
00124
00125 dR_ = std::vector<double>(0);
00126 dRMass_ = std::vector<double>(0);
00127 dRAngle_ = std::vector<double>(0);
00128
00129 dR3Jets_ = std::vector<double>(0);
00130 dR3JetsMass_ = std::vector<double>(0);
00131
00132 massDiffMWCands_ = std::vector<double>(0);
00133
00134 ROOT::Math::LorentzVector<ROOT::Math::PxPyPzE4D<double> > totalSystem(0.,0.,0.,0.);
00135
00136 std::vector< std::pair< double, std::vector<unsigned short> > > dRs(0);
00137 std::vector< std::pair< double, std::vector<unsigned short> > > dRs3Jets(0);
00138
00139 std::vector< std::pair< double, std::vector<unsigned short> > > M3s(0);
00140
00141 std::vector<ROOT::Math::LorentzVector<ROOT::Math::PxPyPzE4D<double> > > fourVectors(0);
00142
00143 unsigned short nonBJets = 0;
00144 for(std::vector<pat::Jet>::const_iterator jet = jets.begin(); jet != jets.end(); ++jet){
00145
00146 H_ += jet->energy();
00147 Ht_ += jet->et();
00148
00149 if(jet - jets.begin() < 3){
00150 Ht123_ += jet->et();
00151 }
00152 if(jet - jets.begin() == 4 || jet - jets.begin() == 5)
00153 Et56_ += jet->et();
00154
00155 if(jet - jets.begin() > 1){
00156 Ht3jet_ += jet->et();
00157 EtSin2Theta3jet_ += jet->et()*pow(sin(jet->theta()),2);
00158 theta3jet_ += (jet->theta() > M_PI/2.)? (M_PI - jet->theta()) : jet->theta();
00159 sinTheta3jet_ += sin(jet->theta());
00160 }
00161
00162 TCHE_BJet_Discs_ .push_back( jet->bDiscriminator("trackCountingHighEffBJetTags") );
00163 TCHP_BJet_Discs_ .push_back( jet->bDiscriminator("trackCountingHighPurBJetTags") );
00164 SSVHE_BJet_Discs_ .push_back( jet->bDiscriminator("simpleSecondaryVertexHighEffBJetTags") );
00165 SSVHP_BJet_Discs_ .push_back( jet->bDiscriminator("simpleSecondaryVertexHighPurBJetTags") );
00166 CSV_BJet_Discs_ .push_back( jet->bDiscriminator("combinedSecondaryVertexBJetTags") );
00167 CSVMVA_BJet_Discs_.push_back( jet->bDiscriminator("combinedSecondaryVertexMVABJetTags") );
00168 SM_BJet_Discs_ .push_back( jet->bDiscriminator("softMuonBJetTags") );
00169
00170 pts_ .push_back(jet->pt());
00171 EtSin2Thetas_.push_back(jet->et()*pow(sin(jet->theta()),2));
00172 thetas_ .push_back( (jet->theta() > M_PI/2.)? (M_PI - jet->theta()) : jet->theta() );
00173
00174 fourVectors.push_back(jet->p4());
00175
00176 if(jet->bDiscriminator("trackCountingHighEffBJetTags") > 3.3 ) ++TCHE_Bjets_;
00177 if(jet->bDiscriminator("trackCountingHighPurBJetTags") > 3.41 ) ++TCHP_Bjets_;
00178 if(jet->bDiscriminator("simpleSecondaryVertexHighEffBJetTags") > 1.74 ) ++SSVHE_Bjets_;
00179 if(jet->bDiscriminator("simpleSecondaryVertexHighPurBJetTags") > 2.0 ) ++SSVHP_Bjets_;
00180 if(jet->bDiscriminator("combinedSecondaryVertexBJetTags") > 0.75 ) ++CSV_Bjets_;
00181 if(jet->bDiscriminator("combinedSecondaryVertexMVABJetTags") > 0.75 ) ++CSVMVA_Bjets_;
00182 if(jet->bDiscriminator("softMuonBJetTags") > 0.3 ) ++SM_Bjets_;
00183
00184 if(jet->nConstituents() > 0){
00185
00186 etaetaMoments_.push_back( jet->etaetaMoment() );
00187 etaphiMoments_.push_back(std::abs(jet->etaphiMoment()));
00188 phiphiMoments_.push_back( jet->phiphiMoment() );
00189
00190 jets_etaetaMoment_ += jet->etaetaMoment();
00191 jets_etaphiMoment_ += std::abs(jet->etaphiMoment());
00192 jets_phiphiMoment_ += jet->phiphiMoment();
00193
00194 etaetaMomentsLogEt_.push_back( jet->etaetaMoment() *log(jet->et()));
00195 etaphiMomentsLogEt_.push_back(std::abs(jet->etaphiMoment())*log(jet->et()));
00196 phiphiMomentsLogEt_.push_back( jet->phiphiMoment() *log(jet->et()));
00197
00198 jets_etaetaMomentLogEt_ += jet->etaetaMoment() *log(jet->et());
00199 jets_etaphiMomentLogEt_ += std::abs(jet->etaphiMoment())*log(jet->et());
00200 jets_phiphiMomentLogEt_ += jet->phiphiMoment() *log(jet->et());
00201
00202 if(jet->bDiscriminator("trackCountingHighEffBJetTags") < 3.3 && jet->bDiscriminator("trackCountingHighPurBJetTags") < 1.93 &&
00203 jet->bDiscriminator("simpleSecondaryVertexHighEffBJetTags") < 1.74 && jet->bDiscriminator("simpleSecondaryVertexHighPurBJetTags") < 2.0 ){
00204
00205 ++nonBJets;
00206
00207 etaetaMomentsNoB_.push_back( jet->etaetaMoment() );
00208 etaphiMomentsNoB_.push_back(std::abs(jet->etaphiMoment()));
00209 phiphiMomentsNoB_.push_back( jet->phiphiMoment() );
00210
00211 jets_etaetaMomentNoB_ += jet->etaetaMoment();
00212 jets_etaphiMomentNoB_ += std::abs(jet->etaphiMoment());
00213 jets_phiphiMomentNoB_ += jet->phiphiMoment();
00214 }
00215
00216 }
00217
00218 for(std::vector<pat::Jet>::const_iterator jet2 = jet+1; jet2 != jets.end(); ++jet2){
00219 unsigned short comb2A[2] = { (unsigned short)(jet-jets.begin()) , (unsigned short)(jet2-jets.begin()) };
00220 std::vector<unsigned short> comb2(comb2A, comb2A + sizeof(comb2A) / sizeof(unsigned short));
00221 dRs.push_back( std::make_pair( deltaR( jet->phi(), jet->eta(), jet2->phi(), jet2->eta() ), comb2 ) );
00222
00223 for(std::vector<pat::Jet>::const_iterator jet3 = jet2+1; jet3 != jets.end(); ++jet3){
00224 unsigned short comb3A[3] = { (unsigned short)(jet-jets.begin()) , (unsigned short)(jet2-jets.begin()) , (unsigned short)(jet3-jets.begin()) };
00225 std::vector<unsigned short> comb3(comb3A, comb3A + sizeof(comb3A) / sizeof(unsigned short));
00226 double dR1 = deltaR( jet ->eta(), jet ->phi(), jet2->eta(), jet2->phi() );
00227 double dR2 = deltaR( jet ->eta(), jet ->phi(), jet3->eta(), jet3->phi() );
00228 double dR3 = deltaR( jet2->eta(), jet2->phi(), jet3->eta(), jet3->phi() );
00229 dRs3Jets.push_back( std::make_pair( dR1+dR2+dR3, comb3 ) );
00230 M3s.push_back( std::make_pair( ( jet->p4() + jet2->p4() + jet3->p4() ).pt(), comb3 ) );
00231 }
00232 }
00233
00234 totalSystem += jet->p4();
00235 }
00236
00237 ROOT::Math::Boost CoMBoostTotal(totalSystem.BoostToCM());
00238 std::vector<reco::LeafCandidate> boostedJets;
00239
00240 for(std::vector<pat::Jet>::const_iterator jet = jets.begin(); jet != jets.end(); ++jet){
00241 boostedJets.push_back(reco::LeafCandidate(jet->charge(), CoMBoostTotal(jet->p4()), jet->vertex(), jet->pdgId(), jet->status(), true));
00242 }
00243
00244 EtSin2Theta3jet_ /= ((double)(jets.size()-3));
00245 theta3jet_ /= ((double)(jets.size()-3));
00246 sinTheta3jet_ /= ((double)(jets.size()-3));
00247
00248 jets_etaetaMoment_ /= (double)jets.size();
00249 jets_etaphiMoment_ /= (double)jets.size();
00250 jets_phiphiMoment_ /= (double)jets.size();
00251
00252 jets_etaetaMomentLogEt_ /= (double)jets.size();
00253 jets_etaphiMomentLogEt_ /= (double)jets.size();
00254 jets_phiphiMomentLogEt_ /= (double)jets.size();
00255
00256 if(nonBJets){
00257 jets_etaetaMomentNoB_ /= (double)nonBJets;
00258 jets_etaphiMomentNoB_ /= (double)nonBJets;
00259 jets_phiphiMomentNoB_ /= (double)nonBJets;
00260 }
00261
00262 for(unsigned short i = 0 ; i < etaetaMoments_.size() ; ++i){
00263 etaetaMomentsMoment_.push_back(etaetaMoments_.at(i)/jets_etaetaMoment_);
00264 etaphiMomentsMoment_.push_back(etaphiMoments_.at(i)/jets_etaphiMoment_);
00265 phiphiMomentsMoment_.push_back(phiphiMoments_.at(i)/jets_phiphiMoment_);
00266
00267 etaetaMomentsMomentLogEt_.push_back(etaetaMomentsLogEt_.at(i)/jets_etaetaMomentLogEt_);
00268 etaphiMomentsMomentLogEt_.push_back(etaphiMomentsLogEt_.at(i)/jets_etaphiMomentLogEt_);
00269 phiphiMomentsMomentLogEt_.push_back(phiphiMomentsLogEt_.at(i)/jets_phiphiMomentLogEt_);
00270 }
00271
00272 std::sort(dRs .begin(), dRs .end());
00273 std::sort(dRs3Jets.begin(), dRs3Jets.end());
00274
00275 for(std::vector< std::pair< double, std::vector<unsigned short> > >::const_iterator dR = dRs.begin(); dR != dRs.end(); ++dR){
00276 dR_.push_back(dR->first);
00277 dRMass_.push_back((jets.at(dR->second.at(0)).p4()+jets.at(dR->second.at(1)).p4()).mass());
00278
00279 ROOT::Math::LorentzVector<ROOT::Math::PxPyPzE4D<double> > wHypo = jets.at(dR->second.at(0)).p4()+jets.at(dR->second.at(1)).p4();
00280 TLorentzVector wHypoHelper(wHypo.Px(), wHypo.Py(), wHypo.Pz(), wHypo.E());
00281 wHypoHelper.SetVectM(TVector3(wHypo.Px(), wHypo.Py(), wHypo.Pz()), 80.4);
00282 wHypo.SetPxPyPzE(wHypoHelper.Px(), wHypoHelper.Py(), wHypoHelper.Pz(), wHypoHelper.E());
00283 ROOT::Math::Boost CoMBoostWHypo(wHypo.BoostToCM());
00284 dRAngle_.push_back(ROOT::Math::VectorUtil::Angle(CoMBoostWHypo(jets.at(dR->second.at(0)).p4()), CoMBoostWHypo(jets.at(dR->second.at(1)).p4())));
00285 }
00286
00287 for(std::vector< std::pair< double, std::vector<unsigned short> > >::const_iterator dR = dRs3Jets.begin(); dR != dRs3Jets.end(); ++dR){
00288 dR3Jets_.push_back(dR->first);
00289 dR3JetsMass_.push_back((jets.at(dR->second.at(0)).p4()+jets.at(dR->second.at(1)).p4()+jets.at(dR->second.at(2)).p4()).mass());
00290 }
00291
00292 std::vector< std::pair< double, unsigned short > > massDiff2W;
00293
00294 for(std::vector< double >::const_iterator mass = dRMass_.begin(); mass != dRMass_.end(); ++mass){
00295 massDiff2W.push_back(std::make_pair(std::abs((*mass)-80.4), mass - dRMass_.begin()));
00296 }
00297
00298 std::sort(massDiff2W.begin(), massDiff2W.end());
00299
00300
00301
00302 for(std::vector< std::pair< double, unsigned short > >::const_iterator i = massDiff2W.begin(); i != massDiff2W.end(); ++i){
00303 unsigned int mass1 = i->second;
00304 for(std::vector< std::pair< double, unsigned short > >::const_iterator j = i + 1; j != massDiff2W.end(); ++j){
00305 unsigned int mass2 = j->second;
00306 if(dRs.at(mass1).second.at(0) != dRs.at(mass2).second.at(0) && dRs.at(mass1).second.at(0) != dRs.at(mass2).second.at(1) &&
00307 dRs.at(mass1).second.at(1) != dRs.at(mass2).second.at(0) && dRs.at(mass1).second.at(1) != dRs.at(mass2).second.at(1)){
00308
00309
00310
00311 massDiffMWCands_.push_back(std::abs(dRMass_.at(mass1)-dRMass_.at(mass2)));
00312 }
00313 }
00314 if(massDiffMWCands_.size() > 20) break;
00315 }
00316
00317
00318
00319
00320
00321
00322
00323
00324
00325
00326
00327 std::sort(TCHE_BJet_Discs_ .begin(), TCHE_BJet_Discs_ .end());
00328 std::sort(TCHP_BJet_Discs_ .begin(), TCHP_BJet_Discs_ .end());
00329 std::sort(SSVHE_BJet_Discs_ .begin(), SSVHE_BJet_Discs_ .end());
00330 std::sort(SSVHP_BJet_Discs_ .begin(), SSVHP_BJet_Discs_ .end());
00331 std::sort(CSV_BJet_Discs_ .begin(), CSV_BJet_Discs_ .end());
00332 std::sort(CSVMVA_BJet_Discs_.begin(), CSVMVA_BJet_Discs_.end());
00333 std::sort(SM_BJet_Discs_ .begin(), SM_BJet_Discs_ .end());
00334
00335 std::sort(etaetaMoments_.begin(), etaetaMoments_.end());
00336 std::sort(etaphiMoments_.begin(), etaphiMoments_.end());
00337 std::sort(phiphiMoments_.begin(), phiphiMoments_.end());
00338
00339 std::sort(etaetaMomentsLogEt_.begin(), etaetaMomentsLogEt_.end());
00340 std::sort(etaphiMomentsLogEt_.begin(), etaphiMomentsLogEt_.end());
00341 std::sort(phiphiMomentsLogEt_.begin(), phiphiMomentsLogEt_.end());
00342
00343 std::sort(etaetaMomentsMoment_.begin(), etaetaMomentsMoment_.end());
00344 std::sort(etaphiMomentsMoment_.begin(), etaphiMomentsMoment_.end());
00345 std::sort(phiphiMomentsMoment_.begin(), phiphiMomentsMoment_.end());
00346
00347 std::sort(etaetaMomentsMomentLogEt_.begin(), etaetaMomentsMomentLogEt_.end());
00348 std::sort(etaphiMomentsMomentLogEt_.begin(), etaphiMomentsMomentLogEt_.end());
00349 std::sort(phiphiMomentsMomentLogEt_.begin(), phiphiMomentsMomentLogEt_.end());
00350
00351 std::sort(etaetaMomentsNoB_.begin(), etaetaMomentsNoB_.end());
00352 std::sort(etaphiMomentsNoB_.begin(), etaphiMomentsNoB_.end());
00353 std::sort(phiphiMomentsNoB_.begin(), phiphiMomentsNoB_.end());
00354
00355 std::sort(M3s.begin(), M3s.end());
00356 M3_ = ( jets.at((M3s.back().second.at(0))).p4() + jets.at((M3s.back().second.at(1))).p4() + jets.at((M3s.back().second.at(2))).p4() ).mass();
00357
00358 sqrt_s_ = totalSystem.mass();
00359
00360 for(std::vector<ROOT::Math::LorentzVector<ROOT::Math::PxPyPzE4D<double> > >::const_iterator jet = fourVectors.begin(); jet != fourVectors.end(); ++jet){
00361 ROOT::Math::LorentzVector<ROOT::Math::PxPyPzE4D<double> > boostedJet = CoMBoostTotal( *jet );
00362 if(jet - fourVectors.begin() > 1){
00363 thetaStar3jet_ += (boostedJet.Theta() > M_PI/2.)? (M_PI - boostedJet.Theta()) : boostedJet.Theta();
00364 sinThetaStar3jet_ += sin(boostedJet.Theta());
00365 EtStar3jet_ += jet->Et() * pow( sin( boostedJet.Theta() ), 2);
00366 }
00367 thetaStars_.push_back((boostedJet.Theta() > M_PI/2.)? (M_PI - boostedJet.Theta()) : boostedJet.Theta());
00368 EtStars_.push_back( jet->Et() * pow( sin( boostedJet.Theta() ), 2) );
00369 }
00370
00371 theta3jet_ /= (double)fourVectors.size() - 2.;
00372 sinTheta3jet_ /= (double)fourVectors.size() - 2.;
00373 thetaStar3jet_ /= (double)fourVectors.size() - 2.;
00374 sinThetaStar3jet_ /= (double)fourVectors.size() - 2.;
00375
00376 EventShapeVariables eventshape(makeVecForEventShape(jets));
00377
00378 aplanarity_ = eventshape.aplanarity();
00379 sphericity_ = eventshape.sphericity();
00380 circularity_ = eventshape.circularity();
00381 isotropy_ = eventshape.isotropy();
00382 C_ = eventshape.C();
00383 D_ = eventshape.D();
00384
00385 EventShapeVariables eventshapeAll(makeVecForEventShape(jets,false));
00386
00387 aplanarityAll_ = eventshapeAll.aplanarity();
00388 sphericityAll_ = eventshapeAll.sphericity();
00389 circularityAll_ = eventshapeAll.circularity();
00390 isotropyAll_ = eventshapeAll.isotropy();
00391 CAll_ = eventshapeAll.C();
00392 DAll_ = eventshapeAll.D();
00393
00394 EventShapeVariables eventshapeAllCMS(makeVecForEventShape(jets,false,CoMBoostTotal));
00395
00396 aplanarityAllCMS_ = eventshapeAllCMS.aplanarity();
00397 sphericityAllCMS_ = eventshapeAllCMS.sphericity();
00398 circularityAllCMS_ = eventshapeAllCMS.circularity();
00399 isotropyAllCMS_ = eventshapeAllCMS.isotropy();
00400 CAllCMS_ = eventshapeAllCMS.C();
00401 DAllCMS_ = eventshapeAllCMS.D();
00402
00403 Thrust thrustAlgo(jets.begin(), jets.end());
00404 thrust_ = thrustAlgo.thrust();
00405
00406 Thrust thrustAlgoCMS(boostedJets.begin(), boostedJets.end());
00407 thrustCMS_ = thrustAlgoCMS.thrust();
00408
00409 }
00410
00411 TtFullHadSignalSel::~TtFullHadSignalSel()
00412 {
00413 }