#ifndef p0dReactionMode_hxx_seen #define p0dReactionMode_hxx_seen #include #include #include #include #include using namespace COMET; /// A class that 'reconstructs' interaction mode class IP0dReactionMode { public: explicit IP0dReactionMode(const ITruthVerticesModule::ITruthVertex* vertex); // Access interaction mode information TLorentzVector Position() const; size_t ReactionCode() const; size_t MuonCount() const; size_t ChargedPiCount() const; size_t ChargedKaonCount() const; size_t ProtonCount() const; size_t PizeroCount() const; TLorentzVector MuonMomentum() const; TLorentzVector PizeroMomentum() const; void ls(); private: size_t fCode; size_t fMuonCount; size_t fChargedPiCount; size_t fChargedKaonCount; size_t fProtonCount; size_t fPizeroCount; TLorentzVector fPosition; TLorentzVector fMuonMomentum; TLorentzVector fPizeroMomentum; }; IP0dReactionMode::IP0dReactionMode(const ITruthVerticesModule::ITruthVertex* vertex) : fCode(0), fMuonCount(0), fChargedPiCount(0), fChargedKaonCount(0), fProtonCount(0), fPizeroCount(0), fPosition(0.0, 0.0, 0.0, 0.0), fMuonMomentum(0.0, 0.0 ,0.0 ,0.0), fPizeroMomentum(0.0, 0.0, 0.0, 0.0) { fPosition = vertex->Vertex; std::stringstream name(vertex->ReactionCode); std::string generator; name >> generator >> fCode; typedef std::vector Vector; typedef std::vector Vector4; /// Get muon count and muon momentum; Vector leptonPDGVector = vertex->LeptonPDGs; Vector4 leptonP4Vector = vertex->LeptonMoms; Vector4::const_iterator p4 = leptonP4Vector.begin(); for (Vector::const_iterator i = leptonPDGVector.begin(); i != leptonPDGVector.end(); ++i) { const Int_t pdg = *i; if (pdg == 13) { ++fMuonCount; fMuonMomentum = *p4; } ++p4; } /// Get pi0 count and pi0 momentum Vector neutralPDGVector = vertex->OtherNeutralPDGs; Vector4 neutralP4Vector = vertex->OtherNeutralMoms; p4 = neutralP4Vector.begin(); for (Vector::const_iterator i = neutralPDGVector.begin(); i != neutralPDGVector.end(); ++i) { const Int_t pdg = *i; if (pdg == 111) { ++fPizeroCount; fPizeroMomentum = *p4; } ++p4; } /// Get charged pion count Vector chargedpiVector = vertex->MesonPDGs; for (Vector::const_iterator i = chargedpiVector.begin(); i != chargedpiVector.end(); ++i) { const Int_t pdg = *i; if (pdg == 211 || pdg == -211) ++fChargedPiCount; if (pdg == 321 || pdg == -321) ++fChargedKaonCount; } /// Get proton count; Vector baryonVector = vertex->BaryonPDGs; for (Vector::const_iterator i = baryonVector.begin(); i != baryonVector.end(); ++i) { const Int_t pdg = *i; if (pdg == 2212) ++fProtonCount; } } TLorentzVector IP0dReactionMode::Position() const { return fPosition; } size_t IP0dReactionMode::ReactionCode() const { return fCode; } size_t IP0dReactionMode::MuonCount() const { return fMuonCount; } size_t IP0dReactionMode::ChargedPiCount() const { return fChargedPiCount; } size_t IP0dReactionMode::ChargedKaonCount() const { return fChargedKaonCount; } size_t IP0dReactionMode::ProtonCount() const { return fProtonCount; } size_t IP0dReactionMode::PizeroCount() const { return fPizeroCount; } TLorentzVector IP0dReactionMode::MuonMomentum() const { return fMuonMomentum; } TLorentzVector IP0dReactionMode::PizeroMomentum() const { return fPizeroMomentum; } void IP0dReactionMode::ls() { std::cout << "\t NEW EVENT " << "\n"; std::cout << "\t Reaction code " << fCode << "\n"; std::cout << "\t Muon " << fMuonCount << "\n"; std::cout << "\t Charged pi " << fChargedPiCount << "\n"; std::cout << "\t Charged kaon " << fChargedKaonCount << "\n"; std::cout << "\t Proton " << fProtonCount << "\n"; std::cout << "\t Pizero " << fPizeroCount << std::endl; std::cout << std::endl; } #endif