File indexing completed on 2026-07-16 08:13:22
0001 #include "MbdTrackVertex.h"
0002
0003 #include <fun4all/Fun4AllReturnCodes.h>
0004
0005 #include <phool/PHCompositeNode.h>
0006 #include <phool/getClass.h>
0007 #include <phool/phool.h>
0008
0009 #include <ffarawobjects/Gl1Packet.h>
0010
0011 #include <ffaobjects/EventHeader.h>
0012
0013 #include <globalvertex/GlobalVertex.h>
0014 #include <globalvertex/GlobalVertexMap.h>
0015 #include <globalvertex/MbdVertex.h>
0016 #include <globalvertex/MbdVertexMap.h>
0017 #include <globalvertex/SvtxVertex.h>
0018 #include <globalvertex/SvtxVertexMap.h>
0019
0020 constexpr GlobalVertex::VTXTYPE trkType = GlobalVertex::SVTX;
0021 constexpr GlobalVertex::VTXTYPE mbdType = GlobalVertex::MBD;
0022
0023 MbdTrackVertex::MbdTrackVertex(const std::string &name):
0024 SubsysReco(name)
0025 {
0026 std::cout << "MbdTrackVertex::MbdTrackVertex(const std::string &name) Calling ctor" << std::endl;
0027 }
0028
0029
0030 MbdTrackVertex::~MbdTrackVertex()
0031 {
0032 std::cout << "MbdTrackVertex::~MbdTrackVertex() Calling dtor" << std::endl;
0033 }
0034
0035
0036 int MbdTrackVertex::Init(PHCompositeNode * )
0037 {
0038 outFile = new TFile(outFileName.c_str(), "RECREATE");
0039 if (_treeflag)
0040 {
0041 outTree = new TTree("mz", "MBD-TRK ZVTX");
0042 outTree->OptimizeBaskets();
0043 outTree->SetAutoSave(-5e6);
0044
0045 outTree->Branch("evt", &_evt, "evt/I");
0046 outTree->Branch("mbdz", &_mbdVertex, "mbdz/F");
0047 outTree->Branch("trkz", &_trackerVertex, "trkz/F");
0048 outTree->Branch("ntrks", &_nTracks, "ntrks/i");
0049 outTree->Branch("nbz", &_nMBDVertex, "nbz/i");
0050 outTree->Branch("ntz", &_nTRKVertex, "ntz/i");
0051 }
0052
0053
0054 h_mbdtrkz = new TH1F("h_mbdtrkz", "MBD - Tracker z-vertex;dz (cm);Counts", 120, -15., 15.);
0055 h_bz = new TH1F("h_bz", "MBD z-vertex;z (cm);Counts", 400, -20., 20.);
0056 h_trkz = new TH1F("h_trkz", "Tracker z-vertex;z (cm);Counts", 400, -20., 20.);
0057
0058
0059 const int nbins2[2] = {400, 400};
0060 const double xmin2[2] = {-20., -20.};
0061 const double xmax2[2] = { 20., 20.};
0062 h2_mbdtrkz = new THnSparseF("h2_mbdtrkz", "MBD vs Tracker z-vertex", 2, nbins2, xmin2, xmax2);
0063 h2_mbdtrkz->GetAxis(0)->SetTitle("Tracker z (cm)");
0064 h2_mbdtrkz->GetAxis(1)->SetTitle("MBD z (cm)");
0065
0066 return Fun4AllReturnCodes::EVENT_OK;
0067 }
0068
0069
0070 int MbdTrackVertex::process_event(PHCompositeNode *topNode)
0071 {
0072 EventHeader *eventheader = findNode::getClass<EventHeader>(topNode, "EventHeader");
0073 _evt = eventheader ? eventheader->get_EvtSequence() : -1;
0074
0075 if (_gl1_trigmask != 0)
0076 {
0077 Gl1Packet *gl1 = findNode::getClass<Gl1Packet>(topNode, "GL1Packet");
0078 if (gl1)
0079 {
0080 if ((gl1->getScaledVector() & _gl1_trigmask) == 0)
0081 {
0082 return Fun4AllReturnCodes::DISCARDEVENT;
0083 }
0084 }
0085 else
0086 {
0087 std::cout << PHWHERE << " GL1Packet node not found; discarding event because trigger masking was requested" << std::endl;
0088 return Fun4AllReturnCodes::DISCARDEVENT;
0089 }
0090 }
0091
0092 MbdVertexMap *m_dst_mbdvertexmap = findNode::getClass<MbdVertexMap>(topNode, "MbdVertexMap");
0093 SvtxVertexMap *m_dst_vertexmap = findNode::getClass<SvtxVertexMap>(topNode, "SvtxVertexMap");
0094
0095 GlobalVertexMap *globalvertexmap = findNode::getClass<GlobalVertexMap>(topNode, "GlobalVertexMap");
0096 if (!m_dst_mbdvertexmap || !m_dst_vertexmap || !globalvertexmap)
0097 {
0098 std::cout << PHWHERE << " missing required vertex node(s)" << std::endl;
0099 return Fun4AllReturnCodes::DISCARDEVENT;
0100 }
0101
0102 _mbdVertex = _trackerVertex = std::numeric_limits<float>::quiet_NaN();
0103 _nTracks = _nMBDVertex = _nTRKVertex = std::numeric_limits<unsigned int>::quiet_NaN();
0104
0105 _hasMBD = false;
0106 _hasTRK = false;
0107
0108 for (GlobalVertexMap::ConstIter iter = globalvertexmap->begin(); iter != globalvertexmap->end(); ++iter)
0109 {
0110 GlobalVertex *gvertex = iter->second;
0111
0112 if (gvertex->count_vtxs(mbdType) != 0)
0113 {
0114 _hasMBD = true;
0115
0116 auto mbditer = gvertex->find_vertexes(mbdType);
0117 auto mbdvertexvector = mbditer->second;
0118
0119 _nMBDVertex = mbdvertexvector.size();
0120 for (auto &vertex : mbdvertexvector)
0121 {
0122 MbdVertex *m_dst_vertex = m_dst_mbdvertexmap->find(vertex->get_id())->second;
0123 _mbdVertex = m_dst_vertex->get_z();
0124 }
0125 }
0126
0127 if (gvertex->count_vtxs(trkType) != 0)
0128 {
0129 _hasTRK = true;
0130
0131 auto trkiter = gvertex->find_vertexes(trkType);
0132 auto trkvertexvector = trkiter->second;
0133
0134 _nTRKVertex = trkvertexvector.size();
0135 for (auto &vertex : trkvertexvector)
0136 {
0137 SvtxVertex *m_dst_vertex = m_dst_vertexmap->find(vertex->get_id())->second;
0138 if ( m_dst_vertex->get_beam_crossing() != 0 )
0139 {
0140 continue;
0141 }
0142 if ( m_dst_vertex->size_tracks() > _nTracks)
0143 {
0144 _trackerVertex = m_dst_vertex->get_z();
0145 _nTracks = m_dst_vertex->size_tracks();
0146 }
0147 if (_nTracks == 0)
0148 {
0149 _hasTRK = false;
0150 }
0151 }
0152 }
0153 }
0154
0155 if (_hasMBD)
0156 {
0157 h_bz->Fill(_mbdVertex);
0158 }
0159 if (_hasTRK)
0160 {
0161 h_trkz->Fill(_trackerVertex);
0162 }
0163
0164 if (_hasMBD && _hasTRK)
0165 {
0166 h_mbdtrkz->Fill(_mbdVertex - _trackerVertex);
0167 const double coords[2] = {_trackerVertex, _mbdVertex};
0168 h2_mbdtrkz->Fill(coords);
0169 }
0170
0171 if (_treeflag)
0172 {
0173 outTree->Fill();
0174 }
0175
0176 ++_counter;
0177
0178 return Fun4AllReturnCodes::EVENT_OK;
0179 }
0180
0181
0182 int MbdTrackVertex::End(PHCompositeNode * )
0183 {
0184 outFile->Write();
0185 outFile->Close();
0186 delete outFile;
0187
0188 return Fun4AllReturnCodes::EVENT_OK;
0189 }
0190