SppChannel.h
Go to the documentation of this file.
1 //____________________________________________________________________________
2 /*!
3 
4 \class genie::SppChannel
5 
6 \brief Enumeration of single pion production channels
7 
8 \author Costas Andreopoulos <constantinos.andreopoulos \at cern.ch>
9  University of Liverpool & STFC Rutherford Appleton Laboratory
10 
11 \created December 16, 2004
12 
13 \cpright Copyright (c) 2003-2020, The GENIE Collaboration
14  For the full text of the license visit http://copyright.genie-mc.org
15 */
16 //____________________________________________________________________________
17 
18 #ifndef _SPP_CHANNEL_H_
19 #define _SPP_CHANNEL_H_
20 
21 #include <string>
22 
28 
29 using std::string;
30 
31 namespace genie {
32 
33 typedef enum ESppChannel {
34 
35  kSppNull = 0,
36 
37  /* [p,n,pi+,pi0,pi-] */
38 
39  kSpp_vp_cc_10100, /* neutrino CC */
42 
43  kSpp_vp_nc_10010, /* neutrino NC */
47 
48  kSpp_vbn_cc_01001, /* anti-neutrino CC */
51 
52  kSpp_vbp_nc_10010, /* anti-neutrino NC */
56 
57 } SppChannel_t;
58 
59 
61 {
62 public:
63 
64  //__________________________________________________________________________
65  static string AsString(SppChannel_t channel)
66  {
67  switch (channel) {
68 
69  case (kSpp_vp_cc_10100) : return "v p -> l- p pi+"; break;
70  case (kSpp_vn_cc_10010) : return "v n -> l- p pi0"; break;
71  case (kSpp_vn_cc_01100) : return "v n -> l- n pi+"; break;
72 
73  case (kSpp_vp_nc_10010) : return "v p -> v p pi0"; break;
74  case (kSpp_vp_nc_01100) : return "v p -> v n pi+"; break;
75  case (kSpp_vn_nc_01010) : return "v n -> v n pi0"; break;
76  case (kSpp_vn_nc_10001) : return "v n -> v p pi-"; break;
77 
78  case (kSpp_vbn_cc_01001): return "vb n -> l+ n pi-"; break;
79  case (kSpp_vbp_cc_01010): return "vb p -> l+ n pi0"; break;
80  case (kSpp_vbp_cc_10001): return "vb p -> l+ p pi-"; break;
81 
82  case (kSpp_vbp_nc_10010): return "vb p -> vb p pi0"; break;
83  case (kSpp_vbp_nc_01100): return "vb p -> vb n pi+"; break;
84  case (kSpp_vbn_nc_01010): return "vb n -> vb n pi0"; break;
85  case (kSpp_vbn_nc_10001): return "vb n -> vb p pi-"; break;
86 
87  default : return "Unknown"; break;
88  }
89  return "Unknown";
90  }
91  //__________________________________________________________________________
92  static int InitStateNucleon(SppChannel_t channel)
93  {
94  switch (channel) {
95 
96  case (kSpp_vp_cc_10100) : return kPdgProton; break;
97  case (kSpp_vn_cc_10010) : return kPdgNeutron; break;
98  case (kSpp_vn_cc_01100) : return kPdgNeutron; break;
99 
100  case (kSpp_vp_nc_10010) : return kPdgProton; break;
101  case (kSpp_vp_nc_01100) : return kPdgProton; break;
102  case (kSpp_vn_nc_01010) : return kPdgNeutron; break;
103  case (kSpp_vn_nc_10001) : return kPdgNeutron; break;
104 
105  case (kSpp_vbn_cc_01001): return kPdgNeutron; break;
106  case (kSpp_vbp_cc_01010): return kPdgProton; break;
107  case (kSpp_vbp_cc_10001): return kPdgProton; break;
108 
109  case (kSpp_vbp_nc_10010): return kPdgProton; break;
110  case (kSpp_vbp_nc_01100): return kPdgProton; break;
111  case (kSpp_vbn_nc_01010): return kPdgNeutron; break;
112  case (kSpp_vbn_nc_10001): return kPdgNeutron; break;
113 
114  default : return 0; break;
115  }
116  return 0;
117  }
118  //__________________________________________________________________________
119  static int FinStateNucleon(SppChannel_t channel)
120  {
121  switch (channel) {
122 
123  case (kSpp_vp_cc_10100) : return kPdgProton; break;
124  case (kSpp_vn_cc_10010) : return kPdgProton; break;
125  case (kSpp_vn_cc_01100) : return kPdgNeutron; break;
126 
127  case (kSpp_vp_nc_10010) : return kPdgProton; break;
128  case (kSpp_vp_nc_01100) : return kPdgNeutron; break;
129  case (kSpp_vn_nc_01010) : return kPdgNeutron; break;
130  case (kSpp_vn_nc_10001) : return kPdgProton; break;
131 
132  case (kSpp_vbn_cc_01001): return kPdgNeutron; break;
133  case (kSpp_vbp_cc_01010): return kPdgNeutron; break;
134  case (kSpp_vbp_cc_10001): return kPdgProton; break;
135 
136  case (kSpp_vbp_nc_10010): return kPdgProton; break;
137  case (kSpp_vbp_nc_01100): return kPdgNeutron; break;
138  case (kSpp_vbn_nc_01010): return kPdgNeutron; break;
139  case (kSpp_vbn_nc_10001): return kPdgProton; break;
140 
141  default : return 0; break;
142  }
143  return 0;
144  }
145  //__________________________________________________________________________
146  static int FinStatePion(SppChannel_t channel)
147  {
148  switch (channel) {
149 
150  case (kSpp_vp_cc_10100) : return kPdgPiP; break;
151  case (kSpp_vn_cc_10010) : return kPdgPi0; break;
152  case (kSpp_vn_cc_01100) : return kPdgPiP; break;
153 
154  case (kSpp_vp_nc_10010) : return kPdgPi0; break;
155  case (kSpp_vp_nc_01100) : return kPdgPiP; break;
156  case (kSpp_vn_nc_01010) : return kPdgPi0; break;
157  case (kSpp_vn_nc_10001) : return kPdgPiM; break;
158 
159  case (kSpp_vbn_cc_01001): return kPdgPiM; break;
160  case (kSpp_vbp_cc_01010): return kPdgPi0; break;
161  case (kSpp_vbp_cc_10001): return kPdgPiM; break;
162 
163  case (kSpp_vbp_nc_10010): return kPdgPi0; break;
164  case (kSpp_vbp_nc_01100): return kPdgPiP; break;
165  case (kSpp_vbn_nc_01010): return kPdgPi0; break;
166  case (kSpp_vbn_nc_10001): return kPdgPiM; break;
167 
168  default : return 0; break;
169  }
170  return 0;
171  }
172  //__________________________________________________________________________
173  static int ResonanceCharge(SppChannel_t channel)
174  {
175  switch (channel) {
176 
177  case (kSpp_vp_cc_10100) : return 2; break;
178  case (kSpp_vn_cc_10010) : return 1; break;
179  case (kSpp_vn_cc_01100) : return 1; break;
180 
181  case (kSpp_vp_nc_10010) : return 1; break;
182  case (kSpp_vp_nc_01100) : return 1; break;
183  case (kSpp_vn_nc_01010) : return 0; break;
184  case (kSpp_vn_nc_10001) : return 0; break;
185 
186  case (kSpp_vbn_cc_01001): return -1; break;
187  case (kSpp_vbp_cc_01010): return 0; break;
188  case (kSpp_vbp_cc_10001): return 0; break;
189 
190  case (kSpp_vbp_nc_10010): return 1; break;
191  case (kSpp_vbp_nc_01100): return 1; break;
192  case (kSpp_vbn_nc_01010): return 0; break;
193  case (kSpp_vbn_nc_10001): return 0; break;
194 
195  default : return 0; break;
196  }
197  return 0;
198  }
199  //__________________________________________________________________________
200  static double IsospinWeight(SppChannel_t channel, Resonance_t res)
201  {
202  // return the isospin Glebsch Gordon coefficient for the input resonance
203  // contribution to the input exclusive channel
204 
205  bool is_delta = utils::res::IsDelta(res);
206 
207  double iw_1_3 = 0.33333333;
208  double iw_2_3 = 0.66666666;
209 
210  switch (channel) {
211 
212  //-- v CC
213  case (kSpp_vp_cc_10100) : return (is_delta) ? (1.0) : (0.0); break;
214  case (kSpp_vn_cc_10010) : return (is_delta) ? (iw_2_3) : (iw_1_3); break;
215  case (kSpp_vn_cc_01100) : return (is_delta) ? (iw_1_3) : (iw_2_3); break;
216 
217  //-- v NC
218  case (kSpp_vp_nc_10010) : return (is_delta) ? (iw_2_3) : (iw_1_3); break;
219  case (kSpp_vp_nc_01100) : return (is_delta) ? (iw_1_3) : (iw_2_3); break;
220  case (kSpp_vn_nc_01010) : return (is_delta) ? (iw_2_3) : (iw_1_3); break;
221  case (kSpp_vn_nc_10001) : return (is_delta) ? (iw_1_3) : (iw_2_3); break;
222 
223  //-- same as for neutrinos (? - check)
224 
225  //-- vbar CC
226  case (kSpp_vbn_cc_01001): return (is_delta) ? (1.0) : (0.0); break;
227  case (kSpp_vbp_cc_01010): return (is_delta) ? (iw_2_3) : (iw_1_3); break;
228  case (kSpp_vbp_cc_10001): return (is_delta) ? (iw_1_3) : (iw_2_3); break;
229 
230  //-- vbar NC
231  case (kSpp_vbp_nc_10010): return (is_delta) ? (iw_2_3) : (iw_1_3); break;
232  case (kSpp_vbp_nc_01100): return (is_delta) ? (iw_1_3) : (iw_2_3); break;
233  case (kSpp_vbn_nc_01010): return (is_delta) ? (iw_2_3) : (iw_1_3); break;
234  case (kSpp_vbn_nc_10001): return (is_delta) ? (iw_1_3) : (iw_2_3); break;
235 
236  default : return 0; break;
237  }
238 
239  return 0;
240  }
241  //__________________________________________________________________________
242  // The values of resonance branching ratio is taken from
243  // K.A. Olive et al. (Particle Data Group), Chin. Phys. C, 38, 090001 (2014)
244  static double BranchingRatio(SppChannel_t /*channel*/, Resonance_t res)
245  {
246  // return the BR for the decay of the input resonance to the final state
247  // hadronic system of the input exclusive channel.
248 
249  // get list of TDecayChannels, match one with the input channel and get
250  // the branching ratio.
251 
252  switch(res) {
253  case kP33_1232 : return 0.994; break;
254  case kS11_1535 : return 0.450; break;
255  case kD13_1520 : return 0.600; break; // REMOVE HARDCODED DATA FROM
256  case kS11_1650 : return 0.700; break; // HERE AND GET BR's from PDG
257  case kD13_1700 : return 0.120; break; // TABLES via TDatabasePDG
258  case kD15_1675 : return 0.400; break;
259  case kS31_1620 : return 0.250; break;
260  case kD33_1700 : return 0.150; break;
261  case kP11_1440 : return 0.650; break;
262  case kP33_1600 : return 0.175; break;
263  case kP13_1720 : return 0.110; break;
264  case kF15_1680 : return 0.675; break;
265  case kP31_1910 : return 0.225; break;
266  case kP33_1920 : return 0.125; break;
267  case kF35_1905 : return 0.120; break;
268  case kF37_1950 : return 0.400; break;
269  case kP11_1710 : return 0.125; break;
270  case kF17_1970 : return 0.150; break;
271  default: break;
272  }
273  return 0;
274  }
275  //__________________________________________________________________________
276  static SppChannel_t FromInteraction(const Interaction * interaction)
277  {
278  const InitialState & init_state = interaction->InitState();
279  const ProcessInfo & proc_info = interaction->ProcInfo();
280  const XclsTag & xcls_tag = interaction->ExclTag();
281 
282  if( xcls_tag.NPions() != 1 ) return kSppNull;
283  if( xcls_tag.NNucleons() != 1 ) return kSppNull;
284 
285  // get struck nucleon
286  int hit_nucl_pdgc = init_state.Tgt().HitNucPdg();
287  if( ! pdg::IsNeutronOrProton(hit_nucl_pdgc) ) return kSppNull;
288  bool hit_p = pdg::IsProton(hit_nucl_pdgc);
289  bool hit_n = !hit_p;
290 
291  // the final state hadronic sytem has 1 pi and 1 nucleon
292  bool fs_pi_plus = ( xcls_tag.NPiPlus() == 1 );
293  bool fs_pi_minus = ( xcls_tag.NPiMinus() == 1 );
294  bool fs_pi_0 = ( xcls_tag.NPi0() == 1 );
295  bool fs_p = ( xcls_tag.NProtons() == 1 );
296  bool fs_n = ( xcls_tag.NNeutrons() == 1 );
297 
298  // get probe
299  int probe = init_state.ProbePdg();
300 
301  // figure out spp channel
302  if( pdg::IsNeutrino(probe) ) {
303 
304  if ( proc_info.IsWeakCC() ) {
305  if (hit_p && fs_p && fs_pi_plus ) return kSpp_vp_cc_10100;
306  else if (hit_n && fs_p && fs_pi_0 ) return kSpp_vn_cc_10010;
307  else if (hit_n && fs_n && fs_pi_plus ) return kSpp_vn_cc_01100;
308  else return kSppNull;
309  } else if ( proc_info.IsWeakNC() ) {
310  if (hit_p && fs_p && fs_pi_0 ) return kSpp_vp_nc_10010;
311  else if (hit_p && fs_n && fs_pi_plus ) return kSpp_vp_nc_01100;
312  else if (hit_n && fs_n && fs_pi_0 ) return kSpp_vn_nc_01010;
313  else if (hit_n && fs_p && fs_pi_minus) return kSpp_vn_nc_10001;
314  else return kSppNull;
315  } else return kSppNull;
316 
317  } else if( pdg::IsAntiNeutrino(probe) ) {
318 
319  if ( proc_info.IsWeakCC() ) {
320  if (hit_n && fs_n && fs_pi_minus) return kSpp_vbn_cc_01001;
321  else if (hit_p && fs_n && fs_pi_0 ) return kSpp_vbp_cc_01010;
322  else if (hit_p && fs_p && fs_pi_minus) return kSpp_vbp_cc_10001;
323  else return kSppNull;
324  } else if ( proc_info.IsWeakNC() ) {
325  if (hit_p && fs_p && fs_pi_0 ) return kSpp_vbp_nc_10010;
326  else if (hit_p && fs_n && fs_pi_plus ) return kSpp_vbp_nc_01100;
327  else if (hit_n && fs_n && fs_pi_0 ) return kSpp_vbn_nc_01010;
328  else if (hit_n && fs_p && fs_pi_minus) return kSpp_vbn_nc_10001;
329  else return kSppNull;
330  } else return kSppNull;
331  }
332 
333  return kSppNull;
334  }
335  //__________________________________________________________________________
336 };
337 
338 } // genie namespace
339 
340 #endif // _SPP_CHANNEL_H_
bool IsDelta(Resonance_t res)
is it a Delta resonance?
static SppChannel_t FromInteraction(const Interaction *interaction)
Definition: SppChannel.h:276
bool IsWeakCC(void) const
bool IsNeutrino(int pdgc)
Definition: PDGUtils.cxx:107
THE MAIN GENIE PROJECT NAMESPACE
Definition: AlgCmp.h:25
int HitNucPdg(void) const
Definition: Target.cxx:304
std::string string
Definition: nybbler.cc:12
int NPions(void) const
Definition: XclsTag.h:62
Enumeration of single pion production channels.
Definition: SppChannel.h:60
int NNeutrons(void) const
Definition: XclsTag.h:57
int NPiMinus(void) const
Definition: XclsTag.h:60
static int FinStateNucleon(SppChannel_t channel)
Definition: SppChannel.h:119
static double IsospinWeight(SppChannel_t channel, Resonance_t res)
Definition: SppChannel.h:200
uint8_t channel
Definition: CRTFragment.hh:201
enum genie::EResonance Resonance_t
Contains minimal information for tagging exclusive processes.
Definition: XclsTag.h:39
enum genie::ESppChannel SppChannel_t
static string AsString(SppChannel_t channel)
Definition: SppChannel.h:65
Summary information for an interaction.
Definition: Interaction.h:56
bool IsProton(int pdgc)
Definition: PDGUtils.cxx:333
bool IsWeakNC(void) const
static int ResonanceCharge(SppChannel_t channel)
Definition: SppChannel.h:173
static int InitStateNucleon(SppChannel_t channel)
Definition: SppChannel.h:92
A class encapsulating an enumeration of interaction types (EM, Weak-CC, Weak-NC) and scattering types...
Definition: ProcessInfo.h:46
ESppChannel
Definition: SppChannel.h:33
bool IsAntiNeutrino(int pdgc)
Definition: PDGUtils.cxx:115
int ProbePdg(void) const
Definition: InitialState.h:64
int NPiPlus(void) const
Definition: XclsTag.h:59
const int kPdgPiP
Definition: PDGCodes.h:158
const int kPdgPi0
Definition: PDGCodes.h:160
int NNucleons(void) const
Definition: XclsTag.h:61
int NPi0(void) const
Definition: XclsTag.h:58
static int FinStatePion(SppChannel_t channel)
Definition: SppChannel.h:146
static double BranchingRatio(SppChannel_t, Resonance_t res)
Definition: SppChannel.h:244
const XclsTag & ExclTag(void) const
Definition: Interaction.h:72
bool IsNeutronOrProton(int pdgc)
Definition: PDGUtils.cxx:348
const int kPdgPiM
Definition: PDGCodes.h:159
const InitialState & InitState(void) const
Definition: Interaction.h:69
const ProcessInfo & ProcInfo(void) const
Definition: Interaction.h:70
const int kPdgProton
Definition: PDGCodes.h:81
const Target & Tgt(void) const
Definition: InitialState.h:66
const int kPdgNeutron
Definition: PDGCodes.h:83
Most commonly used PDG codes. A set of utility functions to handle PDG codes is provided in PDGUtils...
Initial State information.
Definition: InitialState.h:48
int NProtons(void) const
Definition: XclsTag.h:56