File indexing completed on 2025-12-16 09:20:07
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022 #ifndef KFPARTICLESPHENIX_KFPARTICLESPHENIX_H
0023 #define KFPARTICLESPHENIX_KFPARTICLESPHENIX_H
0024
0025 #include "KFParticle_eventReconstruction.h"
0026
0027
0028
0029
0030
0031
0032
0033 #include "KFParticle_DST.h"
0034 #include "KFParticle_nTuple.h"
0035
0036
0037 #include <fun4all/SubsysReco.h>
0038
0039
0040 #include <KFParticle.h>
0041
0042 #include <algorithm> // for max
0043 #include <memory> // for allocator_traits<>::valu...
0044 #include <string>
0045 #include <utility> // for pair
0046 #include <vector> // for vector
0047
0048 class PHCompositeNode;
0049 class TFile;
0050
0051 class KFParticle_sPHENIX : public SubsysReco, public KFParticle_nTuple, public KFParticle_DST, protected KFParticle_eventReconstruction
0052 {
0053 public:
0054 KFParticle_sPHENIX();
0055
0056 explicit KFParticle_sPHENIX(const std::string &name);
0057
0058 ~KFParticle_sPHENIX() override = default;
0059
0060 int Init(PHCompositeNode *topNode) override;
0061
0062 int InitRun(PHCompositeNode *topNode) override;
0063
0064 int process_event(PHCompositeNode *topNode) override;
0065
0066 int End(PHCompositeNode *topNode) override;
0067
0068
0069
0070
0071
0072
0073 void printParticles(const KFParticle &motherParticle,
0074 const KFParticle &chosenVertex,
0075 const std::vector<KFParticle> &daughterParticles,
0076 const std::vector<KFParticle> &intermediateParticles,
0077 const int numPVs, const int numTracks);
0078
0079 int parseDecayDescriptor();
0080
0081
0082
0083 void setDecayDescriptor(const std::string &decayDescriptor) { m_decayDescriptor = decayDescriptor; }
0084
0085 static const int max_particles = 99;
0086
0087 void setMotherName(const std::string &mother_name)
0088 {
0089 m_mother_name = mother_name;
0090 m_mother_name_Tools = mother_name;
0091 }
0092
0093 void hasIntermediateStates(bool has_intermediates = true)
0094 {
0095 m_has_intermediates = has_intermediates;
0096 m_has_intermediates_nTuple = has_intermediates;
0097 m_has_intermediates_sPHENIX = has_intermediates;
0098 m_has_intermediates_DST = has_intermediates;
0099 }
0100
0101 void setNumberOfTracks(int num_tracks)
0102 {
0103 m_num_tracks = num_tracks;
0104 m_num_tracks_nTuple = num_tracks;
0105 }
0106
0107 void setNumberTracksFromIntermeditateState(const std::vector<int> &num_tracks)
0108 {
0109 for (unsigned int i = 0; i < num_tracks.size(); ++i)
0110 {
0111 m_num_tracks_from_intermediate.push_back(num_tracks[i]);
0112 m_num_tracks_from_intermediate_nTuple.push_back(num_tracks[i]);
0113 }
0114 }
0115
0116 void setNumberOfIntermediateStates(int n_intermediates)
0117 {
0118 m_num_intermediate_states = n_intermediates;
0119 m_num_intermediate_states_nTuple = n_intermediates;
0120 }
0121
0122 void getChargeConjugate(bool get_charge_conjugate = true)
0123 {
0124 m_get_charge_conjugate_nTuple = get_charge_conjugate;
0125 m_get_charge_conjugate = get_charge_conjugate;
0126 }
0127
0128 void setDaughters(std::vector<std::pair<std::string, int>> &daughter_list)
0129 {
0130 for (unsigned int i = 0; i < daughter_list.size(); ++i)
0131 {
0132 m_daughter_name.push_back(daughter_list[i].first);
0133 m_daughter_charge.push_back(daughter_list[i].second);
0134 }
0135 }
0136
0137 void setIntermediateStates(const std::vector<std::pair<std::string, int>> &intermediate_list)
0138 {
0139 for (unsigned int i = 0; i < intermediate_list.size(); ++i)
0140 {
0141 m_intermediate_name_ntuple.push_back(intermediate_list[i].first);
0142 m_intermediate_name.push_back(intermediate_list[i].first);
0143 m_intermediate_charge.push_back(intermediate_list[i].second);
0144 }
0145 }
0146
0147 void setMinimumMass(float min_mass) { m_min_mass = min_mass; }
0148
0149 void setMaximumMass(float max_mass) { m_max_mass = max_mass; }
0150
0151 void setDecayTimeRange_XY(float min_decayTime, float max_decayTime)
0152 {
0153 m_min_decayTime_xy = min_decayTime;
0154 m_max_decayTime_xy = max_decayTime;
0155 }
0156
0157 void setDecayLengthRange_XY(float min_decayLength, float max_decayLength)
0158 {
0159 m_min_decayLength_xy = min_decayLength;
0160 m_max_decayLength_xy = max_decayLength;
0161 }
0162
0163 void setDecayTimeRange(float min_decayTime, float max_decayTime)
0164 {
0165 m_min_decayTime = min_decayTime;
0166 m_max_decayTime = max_decayTime;
0167 }
0168
0169 void setDecayLengthRange(float min_decayLength, float max_decayLength)
0170 {
0171 m_min_decayLength = min_decayLength;
0172 m_max_decayLength = max_decayLength;
0173 }
0174
0175 void setMinDecayTimeSignificance(float min = 0) { m_mother_min_decay_time_significance = min; }
0176
0177 void setMinDecayLengthSignificance(float min = 0) { m_mother_min_decay_length_significance = min; }
0178
0179 void setMinDecayLengthSignificance_XY(float min = 0) { m_mother_min_decay_length_xy_significance = min; }
0180
0181 void setMinimumTrackPT(float pt) { m_track_min_pt = pt; }
0182
0183 void setMaximumTrackPT(float pt) { m_track_max_pt = pt; }
0184
0185 void setMaximumTrackPTchi2(float ptchi2) { m_track_ptchi2 = ptchi2; }
0186
0187 void setMinimumTrackIP_XY(float ip) { m_track_ip_xy = ip; }
0188
0189 void setMinimumTrackIPchi2_XY(float ipchi2) { m_track_ipchi2_xy = ipchi2; }
0190
0191 void setMinimumTrackIP(float ip) { m_track_ip = ip; }
0192
0193 void setMinimumTrackIPchi2(float ipchi2) { m_track_ipchi2 = ipchi2; }
0194
0195 void setMaximumTrackchi2nDOF(float trackchi2ndof) { m_track_chi2ndof = trackchi2ndof; }
0196
0197 void setMinMVTXhits(int nHits) { m_nMVTXStates = nHits; }
0198
0199 void setMinINTThits(int nHits) { m_nINTTStates = nHits; }
0200
0201 void setMinTPChits(int nHits) { m_nTPCStates = nHits; }
0202
0203 void setMinTPOThits(int nHits) { m_nTPCStates = nHits; }
0204
0205 void setMaximumDaughterDCA_XY(float dca) { m_comb_DCA_xy = dca; }
0206
0207 void setMaximumDaughterDCA(float dca) { m_comb_DCA = dca; }
0208
0209 void setMinimumRadialSV(float min_rad_sv) { m_min_radial_SV = min_rad_sv; }
0210
0211 void setMaximumVertexchi2nDOF(float vertexchi2nDOF) { m_vertex_chi2ndof = vertexchi2nDOF; }
0212
0213 void setFlightDistancechi2(float fdchi2) { m_fdchi2 = fdchi2; }
0214
0215 void setMinDIRA(float dira_min) { m_dira_min = dira_min; }
0216
0217 void setMaxDIRA(float dira_max) { m_dira_max = dira_max; }
0218
0219 void setMinDIRA_XY(float dira_min) { m_dira_xy_min = dira_min; }
0220
0221 void setMaxDIRA_XY(float dira_max) { m_dira_xy_max = dira_max; }
0222
0223 void setMotherPT(float mother_pt) { m_mother_pt = mother_pt; }
0224
0225 void setMotherIP(float mother_ip) { m_mother_ip = mother_ip; }
0226
0227 void setMotherIP_XY(float mother_ip) { m_mother_ip_xy = mother_ip; }
0228
0229 void setMotherIPchi2(float mother_ipchi2) { m_mother_ipchi2 = mother_ipchi2; }
0230
0231 void setMotherIPchi2_XY(float mother_ipchi2) { m_mother_ipchi2_xy = mother_ipchi2; }
0232
0233 void setMaximumMotherVertexVolume(float vertexvol) { m_mother_vertex_volume = vertexvol; }
0234
0235 void constrainToPrimaryVertex(bool constrain_to_vertex = true)
0236 {
0237 m_constrain_to_vertex = constrain_to_vertex;
0238 m_constrain_to_vertex_nTuple = constrain_to_vertex;
0239 m_constrain_to_vertex_sPHENIX = constrain_to_vertex;
0240 }
0241
0242 void useMbdVertex(bool use = true)
0243 {
0244 m_use_mbd_vertex = use;
0245 m_use_mbd_vertex_truth = use;
0246 }
0247
0248 void dontUseGlobalVertex(bool dont = true) { m_dont_use_global_vertex = m_dont_use_global_vertex_truth = dont; }
0249
0250 void useFakePrimaryVertex(bool use_fake = true)
0251 {
0252 m_use_fake_pv = use_fake;
0253 m_use_fake_pv_nTuple = use_fake;
0254 }
0255
0256 void allowZeroMassTracks(bool allow = true) { m_allowZeroMassTracks = allow; }
0257
0258 void extraolateTracksToSV(bool extrapolate = true)
0259 {
0260 m_extrapolateTracksToSV = extrapolate;
0261 m_extrapolateTracksToSV_nTuple = extrapolate;
0262 }
0263
0264 void constrainIntermediateMasses(bool constrain_int_mass = true) { m_constrain_int_mass = constrain_int_mass; }
0265
0266 void setIntermediateMassRange(const std::vector<std::pair<float, float>> &intermediate_mass_range)
0267 {
0268 for (unsigned int i = 0; i < intermediate_mass_range.size(); ++i) m_intermediate_mass_range.push_back(intermediate_mass_range[i]);
0269 }
0270
0271 void setIntermediateMinPT(const std::vector<float> &intermediate_min_pt)
0272 {
0273 m_intermediate_min_pt = intermediate_min_pt;
0274 }
0275
0276 void setIntermediateMinIP_XY(const std::vector<float> &intermediate_min_IP)
0277 {
0278 for (unsigned int i = 0; i < intermediate_min_IP.size(); ++i) m_intermediate_min_ip_xy.push_back(intermediate_min_IP[i]);
0279 }
0280
0281 void setIntermediateIPRange_XY(const std::vector<std::pair<float, float> > &intermediate_IP_range)
0282 {
0283 for (unsigned int i = 0; i < intermediate_IP_range.size(); ++i)
0284 {
0285 m_intermediate_min_ip_xy.push_back(intermediate_IP_range[i].first);
0286 m_intermediate_max_ip_xy.push_back(intermediate_IP_range[i].second);
0287 }
0288 }
0289
0290 void setIntermediateMinIP(const std::vector<float> &intermediate_min_IP)
0291 {
0292 for (unsigned int i = 0; i < intermediate_min_IP.size(); ++i) m_intermediate_min_ip.push_back(intermediate_min_IP[i]);
0293 }
0294
0295 void setIntermediateIPRange(const std::vector<std::pair<float, float> > &intermediate_IP_range)
0296 {
0297 for (unsigned int i = 0; i < intermediate_IP_range.size(); ++i)
0298 {
0299 m_intermediate_min_ip.push_back(intermediate_IP_range[i].first);
0300 m_intermediate_max_ip.push_back(intermediate_IP_range[i].second);
0301 }
0302 }
0303
0304 void setIntermediateMinIPchi2_XY(const std::vector<float> &intermediate_min_IPchi2)
0305 {
0306 for (unsigned int i = 0; i < intermediate_min_IPchi2.size(); ++i) m_intermediate_min_ipchi2_xy.push_back(intermediate_min_IPchi2[i]);
0307 }
0308
0309 void setIntermediateIPchi2Range_XY(const std::vector<std::pair<float, float> > &intermediate_IPchi2_range)
0310 {
0311 for (unsigned int i = 0; i < intermediate_IPchi2_range.size(); ++i)
0312 {
0313 m_intermediate_min_ipchi2_xy.push_back(intermediate_IPchi2_range[i].first);
0314 m_intermediate_max_ipchi2_xy.push_back(intermediate_IPchi2_range[i].second);
0315 }
0316 }
0317
0318 void setIntermediateMinIPchi2(const std::vector<float> &intermediate_min_IPchi2)
0319 {
0320 for (unsigned int i = 0; i < intermediate_min_IPchi2.size(); ++i) m_intermediate_min_ipchi2.push_back(intermediate_min_IPchi2[i]);
0321 }
0322
0323 void setIntermediateIPchi2Range(const std::vector<std::pair<float, float> > &intermediate_IPchi2_range)
0324 {
0325 for (unsigned int i = 0; i < intermediate_IPchi2_range.size(); ++i)
0326 {
0327 m_intermediate_min_ipchi2.push_back(intermediate_IPchi2_range[i].first);
0328 m_intermediate_max_ipchi2.push_back(intermediate_IPchi2_range[i].second);
0329 }
0330 }
0331
0332 void setIntermediateMinDIRA(const std::vector<float> &intermediate_min_DIRA)
0333 {
0334 for (unsigned int i = 0; i < intermediate_min_DIRA.size(); ++i) m_intermediate_min_dira.push_back(intermediate_min_DIRA[i]);
0335 }
0336
0337 void setIntermediateMinFDchi2(const std::vector<float> &intermediate_min_FDchi2)
0338 {
0339 for (unsigned int i = 0; i < intermediate_min_FDchi2.size(); ++i) m_intermediate_min_fdchi2.push_back(intermediate_min_FDchi2[i]);
0340 }
0341
0342 void setIntermediateMaxVertexVolume(const std::vector<float> &intermediate_max_vertexvol)
0343 {
0344 for (unsigned int i = 0; i < intermediate_max_vertexvol.size(); ++i) m_intermediate_vertex_volume.push_back(intermediate_max_vertexvol[i]);
0345 }
0346
0347 void use2Dmatching(bool use_2D_matching_tools = true) { m_use_2D_matching_tools = use_2D_matching_tools; }
0348
0349 void useMVA(bool require_mva = true) { m_require_mva = require_mva; }
0350
0351 void setNumMVAPars(unsigned int nPars) { m_nPars = nPars; }
0352
0353 void setMVAVarList(const std::vector<std::string> &mva_variable_list)
0354 {
0355 for (unsigned int i = 0; i < mva_variable_list.size(); ++i) m_mva_variable_list.push_back(mva_variable_list[i]);
0356 }
0357
0358 void setMVAType(const std::string &mva_type) { m_mva_type = mva_type; }
0359
0360 void setMVAWeightsPath(const std::string &mva_weights_path) { m_mva_path = mva_weights_path; }
0361
0362 void setMVACutValue(float cut_value) { m_mva_cut_value = cut_value; }
0363
0364 void saveDST(bool save = true) { m_save_dst = save; }
0365
0366 void saveTrackContainer(bool save = true) { m_write_track_container = save; }
0367
0368 void saveParticleContainer(bool save = true) { m_write_particle_container = save; }
0369
0370 void setContainerName(const std::string &name) { m_container_name = name; }
0371
0372 void saveOutput(bool save = true) { m_save_output = save; }
0373
0374 void setOutputName(const std::string &name) { m_outfile_name = name; }
0375
0376 void doTruthMatching(bool truth = true) { m_truth_matching = truth; }
0377
0378 void getTriggerInfo(bool get = true) { m_get_trigger_info = get; }
0379
0380 void getDetectorInfo(bool detinfo = true) { m_detector_info = detinfo; }
0381
0382 void getCaloInfo(bool caloinfo = true) { m_calo_info = caloinfo; }
0383
0384 void requireTrackEMCalMatch(bool require = true) { m_require_track_emcal_match = require; }
0385
0386 void getAllPVInfo(bool pvinfo = true) { m_get_all_PVs = pvinfo; }
0387
0388 void bunchCrossingZeroOnly(bool bcZeroOnly = true) { m_bunch_crossing_zero_only = bcZeroOnly; }
0389
0390 void requireBunchCrossingMatch(bool require = true) { m_require_bunch_crossing_match = require; }
0391
0392 void requireTrackVertexBunchCrossingMatch(bool require = true) { m_require_track_and_vertex_match = require; }
0393
0394 void selectMotherByMassError(bool select = true) { m_select_by_mass_error = select; }
0395
0396 void usePID(bool use = true){ m_use_PID = use; }
0397
0398 void setPIDacceptFraction(float frac = 0.2){ m_dEdx_band_width = frac; }
0399
0400
0401 void setVertexMapNodeName(const std::string &vtx_map_node_name) { m_vtx_map_node_name = m_vtx_map_node_name_nTuple = vtx_map_node_name; }
0402
0403
0404 void setTrackMapNodeName(const std::string &trk_map_node_name) { m_trk_map_node_name = m_trk_map_node_name_nTuple = m_origin_track_map_node_name = trk_map_node_name; }
0405
0406 void magFieldFile(const std::string &fname) { m_magField = fname; }
0407
0408 void getField();
0409
0410 void incrementCandidateCounter(){ candidateCounter += 1; }
0411 void setCandidateCounter(int countNum) { candidateCounter = countNum; }
0412 int getCandidateCounter() { return candidateCounter; }
0413
0414 private:
0415 bool m_has_intermediates_sPHENIX;
0416 bool m_constrain_to_vertex_sPHENIX;
0417 bool m_require_mva;
0418 bool m_save_dst;
0419 bool m_save_output;
0420 int candidateCounter = 0;
0421 std::string m_outfile_name;
0422 TFile *m_outfile;
0423 std::string m_decayDescriptor;
0424 std::string m_magField = "FIELDMAP_TRACKING";
0425 };
0426
0427 #endif