Hall-D Software  alpha
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
DTrackTimeBased_factory_Combo.cc
Go to the documentation of this file.
1 // $Id$
2 //
3 // File: DTrackTimeBased_factory_Combo.cc
4 // Created: Tue Aug 9 14:29:24 EST 2011
5 // Creator: pmatt
6 //
7 
8 #ifdef VTRACE
9 #include "vt_user.h"
10 #endif
11 
13 
14 //------------------
15 // init
16 //------------------
18 {
19  //BEWARE: IF THIS IS CHANGED, CHANGE IN THE ANALYSIS UTILITIES AND THE EVENT WRITER ALSO!!
20  dTrackSelectionTag = "PreSelect";
21  gPARMS->SetDefaultParameter("COMBO:TRACK_SELECT_TAG", dTrackSelectionTag);
22 
23  //remember, charge sign could have flipped during track reconstruction
24  //order of preference:
25  //very similar mass & charge (e.g. pi -> mu, e)
26  //slightly similar mass & charge (e.g. pi -> K)
27  //similar mass, different charge (e.g. pi+ -> pi-)
28  //don't need to list every PID: if none of the below PIDs are available, will choose the one with the best PID FOM
29 
30  dParticleIDsToTry.emplace(PiPlus, vector<Particle_t>{KPlus, PiMinus, KMinus, Proton});
31  dParticleIDsToTry.emplace(PiMinus, vector<Particle_t>{KMinus, PiPlus, KPlus});
32  dParticleIDsToTry.emplace(KPlus, vector<Particle_t>{PiPlus, KMinus, PiMinus, Proton});
33  dParticleIDsToTry.emplace(KMinus, vector<Particle_t>{PiMinus, KPlus, PiPlus, Proton});
34 
35  dParticleIDsToTry.emplace(Proton, vector<Particle_t>{KPlus, PiPlus, KMinus});
36  dParticleIDsToTry.emplace(AntiProton, vector<Particle_t>{KMinus, Proton, PiMinus, KPlus});
37 
38  dParticleIDsToTry.emplace(Positron, vector<Particle_t>{PiPlus, KPlus, PiMinus, KMinus});
39  dParticleIDsToTry.emplace(Electron, vector<Particle_t>{PiMinus, KMinus, PiPlus, KPlus});
40 
43 
44  dParticleIDsToTry.emplace(Deuteron, vector<Particle_t>{Proton, KPlus, PiPlus});
45 
46  return NOERROR;
47 }
48 
49 //------------------
50 // brun
51 //------------------
52 jerror_t DTrackTimeBased_factory_Combo::brun(jana::JEventLoop *locEventLoop, int32_t runnumber)
53 {
54  //Get Needed PIDs
55  auto locReactions = DAnalysis::Get_Reactions(locEventLoop);
56  for(size_t loc_i = 0; loc_i < locReactions.size(); ++loc_i)
57  {
58  auto locPositivePIDs = locReactions[loc_i]->Get_FinalPIDs(-1, false, false, d_Positive, false);
59  for(auto& locPID : locPositivePIDs)
60  dPositivelyChargedPIDs.insert(locPID);
61 
62  auto locNegativePIDs = locReactions[loc_i]->Get_FinalPIDs(-1, false, false, d_Negative, false);
63  for(auto& locPID : locNegativePIDs)
64  dNegativelyChargedPIDs.insert(locPID);
65  }
66 
67  return NOERROR;
68 }
69 
70 //------------------
71 // evnt
72 //------------------
73 jerror_t DTrackTimeBased_factory_Combo::evnt(jana::JEventLoop *locEventLoop, uint64_t eventnumber)
74 {
75 #ifdef VTRACE
76  VT_TRACER("DTrackTimeBased_factory_Combo::evnt()");
77 #endif
78 
79  vector<const DChargedTrack*> locChargedTracks;
80  locEventLoop->Get(locChargedTracks, dTrackSelectionTag.c_str());
81 
82  for(auto& locTrack : locChargedTracks)
83  {
84  if(locTrack->Contains_Charge(1))
86  if(locTrack->Contains_Charge(-1))
88  }
89 
90  return NOERROR;
91 }
92 
93 void DTrackTimeBased_factory_Combo::Create_PIDsAsNeeded(const DChargedTrack* locChargedTrack, set<Particle_t>& locPIDs)
94 {
95  for(auto& locPID : locPIDs)
96  {
97  if(locChargedTrack->Get_Hypothesis(locPID) != nullptr)
98  continue; //already exists
99 
100  const DChargedTrackHypothesis* locChargedTrackHypothesis = Get_ChargedHypothesisToUse(locChargedTrack, locPID);
101 
102  DTrackTimeBased* locTrackTimeBased = Convert_ChargedTrack(locChargedTrackHypothesis, locPID);
103  locTrackTimeBased->AddAssociatedObject(locChargedTrack);
104  _data.push_back(locTrackTimeBased);
105  }
106 }
107 
109 {
110  //pid not found for this track: loop over other possible pids
111  for(auto& locPID : dParticleIDsToTry[locDesiredPID])
112  {
113  const DChargedTrackHypothesis* locChargedTrackHypothesis = locChargedTrack->Get_Hypothesis(locPID);
114  if(locChargedTrackHypothesis != nullptr)
115  return locChargedTrackHypothesis;
116  }
117 
118  //still none found, take the one with the best FOM
119  return locChargedTrack->Get_BestFOM();
120 }
121 
123 {
124  auto locOriginalTrackTimeBased = locChargedTrackHypothesis->Get_TrackTimeBased();
125  auto locTrackTimeBased = new DTrackTimeBased(*locOriginalTrackTimeBased);
126  locTrackTimeBased->setPID(locNewPID);
127 
128  locTrackTimeBased->AddAssociatedObject(locOriginalTrackTimeBased);
129  return locTrackTimeBased;
130 }
jerror_t brun(jana::JEventLoop *locEventLoop, int32_t runnumber)
Called everytime a new run number is detected.
const DChargedTrackHypothesis * Get_ChargedHypothesisToUse(const DChargedTrack *locChargedTrack, Particle_t locDesiredPID)
vector< const DReaction * > Get_Reactions(JEventLoop *locEventLoop)
Definition: DReaction.cc:218
map< Particle_t, vector< Particle_t > > dParticleIDsToTry
const DTrackTimeBased * Get_TrackTimeBased(void) const
const DChargedTrackHypothesis * Get_Hypothesis(Particle_t locPID) const
Definition: DChargedTrack.h:59
DTrackTimeBased * Convert_ChargedTrack(const DChargedTrackHypothesis *locChargedTrackHypothesis, Particle_t locNewPID)
jerror_t init(void)
Called once at program start.
const DChargedTrackHypothesis * Get_BestFOM(void) const
Definition: DChargedTrack.h:69
void Create_PIDsAsNeeded(const DChargedTrack *locChargedTrack, set< Particle_t > &locPIDs)
jerror_t evnt(jana::JEventLoop *locEventLoop, uint64_t eventnumber)
Called every event.
Particle_t
Definition: particleType.h:12