KaliVeda
Toolkit for HIC analysis
KVINDRAGroupReconstructor.cpp
1 //Created by KVClassFactory on Wed Feb 21 13:42:47 2018
2 //Author: John Frankland,,,
3 
4 #include "KVINDRAGroupReconstructor.h"
5 #include "KVCalibratedSignal.h"
6 #include <KVIDGCsI.h>
7 #include <KVIDINDRACsI.h>
8 #include <KVINDRADetector.h>
9 
11 
13 
14 
16 
18 {
20  for (auto& rnuc : ReconEventIterator(GetEventFragment()))
21  {
22  if (!rnuc.IsIdentified()) rnuc.SetIDCode(KVINDRA::IDCodes::NO_IDENTIFICATION); // unidentifiable particle
23  }
24 }
25 
26 
27 
46 
48 {
49  // INDRA-specific particle identification.
50  // Here we attribute the Veda6-style general identification codes depending on the
51  // result of KVReconstructedNucleus::Identify and the subcodes from the different
52  // identification algorithms:
53  // If the particle's mass A was NOT measured, we make sure that it is calculated
54  // from the measured Z using the mass formula defined by default
55  //
56  //IDENTIFIED PARTICLES
57  //Identified particles with ID code = 2 with subcodes 4 & 5
58  //(masse hors limite superieure/inferieure) are relabelled
59  //with kIDCode10 (identification entre les lignes CsI)
60  //
61  //UNIDENTIFIED PARTICLES
62  //Unidentified particles receive the general ID code for non-identified particles (kIDCode14)
63  //EXCEPT if their identification in CsI gave subcodes 6 or 7
64  //(Zmin) then they are relabelled "Identified" with IDcode = 9 (ident. incomplete dans CsI ou Phoswich (Z.min))
65  //Their "identifying" telescope is set to the CsI ID telescope
66 
68  // if a successful identification has occurred, identifying_telescope & partID are now set
69  // and the particle has IsIdentified()=true
70 
71  // INDRA coherency treatment
72  PART.SetParameter("Coherent", kTRUE);
73  PART.SetParameter("Pileup", kFALSE);
74  if(theChio)
75  PART.SetParameter("UseFullChIoEnergyForCalib", kTRUE);
76  Bool_t ok = DoCoherencyAnalysis(PART);
77 
78  if (ok) { // identification may change here due to coherency analysis
79  PART.SetIsIdentified();
81  } // if not ok, do we need to unset any previously identified particle?
82 
83  if (PART.IsIdentified()) {
84 
85  /******* IDENTIFIED PARTICLES *******/
86  if (partID.IsType(CSI_ID_TYPE)) { /**** CSI IDENTIFICATION ****/
87 
88  //Identified particles with ID code = 2 with subcodes 4 & 5
89  //(masse hors limite superieure/inferieure) are relabelled
90  //with kIDCode10 (identification entre les lignes CsI)
91 
92  Int_t grid_code = partID.IDquality;
93  if (grid_code == KVIDGCsI::kICODE4 || grid_code == KVIDGCsI::kICODE5) {
94  partID.IDcode = KVINDRA::IDCodes::ID_CSI_MASS_OUT_OF_RANGE;
96  }
97 
98  // gamma particles identified as such...
99  if(PART.GetZ()==0)
100  {
101  partID.IDcode = KVINDRA::IDCodes::ID_GAMMA;
102  partID.Aident = true;
103  partID.A = 0;
105  }
106 
107  }
108 
109  }
110  else {
111 
112  /******* UNIDENTIFIED PARTICLES *******/
113 
114  /*** general ID code for non-identified particles ***/
115  PART.SetIDCode(KVINDRA::IDCodes::NO_IDENTIFICATION);
116  auto csirl = id_by_type.find(CSI_ID_TYPE.Data());
117  if (csirl != id_by_type.end()) {
118  //Particles remaining unidentified are checked:
119  // - if in CsI identification they were in a zone marked 'nomassid|Z=...', we label them as identified
120  // in Z only (no mass identification), with the usual CsI IDCODE. This was introduced for E818 to handle
121  // the effects of defects in CsI crystals leading to poor discrimination of (p,d,t) above a certain energy/light
122  // - if their identification in CsI gave subcodes 6 or 7 (Zmin) then they are relabelled "Identified" with IDcode = 9
123  // (ident. incomplete dans CsI ou Phoswich (Z.min))
124  // - subcodes 4 & 5 (masse hors limite superieure/inferieure) are relabelled with kIDCode10
125  // (identification entre les lignes CsI)
126  //In each case their "identifying" telescope is set to the CsI ID telescope
127  KVIdentificationResult* idr = csirl->second;
128  if (idr->IDattempted) {
129  if (idr->IdentifyingGridHasFlagWhichBegins("nomassid|Z=")) {
130  KVString flag = idr->IdentifyingGridGetFlagWhichBegins("nomassid|Z=");
131  flag.Begin("=");
132  flag.Next(); // split e.g. "nomassid|Z=1" into "nomassid|Z=" and "1"
133  auto z = flag.Next().Atoi();
134  PART.SetIsIdentified();
135  idr->IDcode = KVINDRA::IDCodes::ID_CSI_PSA;
136  idr->Z = z;
137  idr->Zident = true;
138  idr->Aident = false;
139  idr->SetComment(Form("Z=%d identified without mass discrimination (due to CsI crystal defects)", z));
140  partID = *idr;
143  }
144  else if (idr->IDquality == KVIDGCsI::kICODE6 || idr->IDquality == KVIDGCsI::kICODE7) {
145  PART.SetIsIdentified();
146  idr->IDcode = KVINDRA::IDCodes::ID_CSI_FRAGMENT;
147  partID = *idr;
150  }
151  else if (idr->IDquality == KVIDGCsI::kICODE4 || idr->IDquality == KVIDGCsI::kICODE5) {
152  PART.SetIsIdentified();
153  idr->IDcode = KVINDRA::IDCodes::ID_CSI_MASS_OUT_OF_RANGE;
154  partID = *idr;
157  }
158  }
159  }
160 
161  }
162 }
163 
164 
165 
172 
174 {
175  // calculate fEChIo from residual energy
176  //
177  // returns kFALSE if it doesn't work, and sets particle bad calibration status
178  //
179  // returns kTRUE if it works, and sets calib status to SOME_ENERGY_LOSSES_CALCULATED
180 
181  Double_t e0 = theChio->GetDeltaEFromERes(n->GetZ(), n->GetA(), ERES);
184  if (fEChIo <= 0) {
186  fEChIo = 0;
187  return kFALSE;
188  }
190  n->SetECode(KVINDRA::ECodes::SOME_ENERGY_LOSSES_CALCULATED);
191  return kTRUE;
192 }
193 
194 
195 
197 
199 {
200  CalibrateParticle(nuc);
201 }
202 
203 
204 
210 
212 {
213  // Calculate and set the energy of a (previously identified) reconstructed particle
214  //
215  // This is only possible for correctly identified particles.
216  // We exclude IDCODE9 particles (Zmin in CsI-RL)
217 
218  fEChIo = fESi = fECsI = 0;
219 
220  print_part = false;
221 
223 
224  if (PART->GetIDCode() != KVINDRA::IDCodes::ID_CSI_FRAGMENT && PART->GetIDCode() != KVINDRA::IDCodes::ID_CSI_MASS_OUT_OF_RANGE) {
225  // this status may be modified depending on what happens in DoCalibration
226  SetCalibrationStatus(*PART, KVINDRA::ECodes::NORMAL_CALIBRATION);
227  DoCalibration(PART);
228  }
229 
230  if(theChio)
231  PART->SetParameter("INDRA.ECHIO", fEChIo);
232  PART->SetParameter("INDRA.ESI", fESi);
233  PART->SetParameter("INDRA.ECSI", fECsI);
234  //add correction for target energy loss - moving charged particles only!
235  Double_t E_targ = 0.;
236  if (PART->GetZ() && PART->GetEnergy() > 0) {
237  E_targ = GetTargetEnergyLossCorrection(PART);
238  PART->SetTargetEnergyLoss(E_targ);
239  }
240  Double_t E_tot = PART->GetEnergy() + E_targ;
241  PART->SetEnergy(E_tot);
242  // set particle momentum from telescope dimensions (random)
244  CheckCsIEnergy(PART);
245 
246  //if(print_part) PART->Print();
247 }
248 
249 
250 
256 
258 {
259  // Beryllium-8 = 2 alpha particles of same energy
260  // We halve the total light output of the CsI to calculate the energy of 1 alpha
261  // Then multiply resulting energy by 2
262  // Note: fECsI is -ve, because energy is calculated not measured
263 
264  auto csi = GetCsI(n);
265  // energy is usually calculated from "TotLight", but it could be "ScaledTotLight", or something else...
266  auto input_signal = ((KVCalibratedSignal*)csi->GetDetectorSignal("Energy"))->GetInputSignal();
267  Double_t half_light = input_signal->GetValue(Form("Z=%d,A=%d", n->GetZ(), n->GetA())) * 0.5;
268  KVNucleus tmp(2, 4);
269  double ecsi = 2.*csi->GetCorrectedEnergy(&tmp, half_light, kFALSE);
270  if (ecsi > 0) {
271  SetCalibrationStatus(*n, KVINDRA::ECodes::SOME_ENERGY_LOSSES_CALCULATED);
272  // calculated energy returned as negative value
273  return -ecsi;
274  }
276  return 0;
277 }
278 
279 
280 
287 
289 {
290  // Check calculated CsI energy loss of particle:
291  // - If the particle was identified by the CsI but only in Z (case of particles falling in zones labelled "nomassid|Z=...")
292  // then we give it the (bad) calibration code KVINDRA::ECodes::WARNING_CSI_NO_MASS_ID
293  // - If it is greater than the maximum theoretical energy loss (depending on the length of CsI, the Z & A of the particle)
294  // we set the energy calibration code to KVINDRA::ECodes::WARNING_CSI_MAX_ENERGY (=3, historical VEDA code for particles with E_csi > E_max_csi)
295 
296  if (n->GetIDCode() == KVINDRA::IDCodes::ID_CSI_PSA && !n->IsAMeasured()) {
297  SetCalibrationStatus(*n, KVINDRA::ECodes::WARNING_CSI_NO_MASS_ID);
298  return;
299  }
300  KVDetector* csi = GetCsI(n);
301  if (csi && (n->GetZ() > 0) && (n->GetZ() < 3) && (csi->GetDetectorSignalValue("Energy", Form("Z=%d,A=%d", n->GetZ(), n->GetA())) > csi->GetMaxDeltaE(n->GetZ(), n->GetA()))) {
302  SetCalibrationStatus(*n, KVINDRA::ECodes::WARNING_CSI_MAX_ENERGY);
303  }
304 }
305 
306 
307 
313 
315 {
316  // Called to add any nuclei not included in the initial reconstruction, but "revealed"
317  // by consistency checks between identifications and calibrations of other nuclei
318  //
319  // These particles have a (string) parameter "COHERENCY"
320 
321  for (auto& part : coherency_particles) {
322 
323  auto rnuc = GetEventFragment()->AddParticle();
324 
325  // reconstruction
326  auto Rtraj = (const KVReconNucTrajectory*)GetGroup()->GetTrajectoryForReconstruction(part.stopping_trajectory, part.stopping_detector_node);
327 
328  rnuc->SetReconstructionTrajectory(Rtraj);
329  rnuc->SetParameter("ARRAY", "INDRA");
330  rnuc->SetParameter("COHERENCY",
331  "Particle added to event after consistency checks between identifications and calibrations of other nuclei");
332  // for coherency particles in pileup with a charged particle (original particle has "Ion pileup" parameter),
333  // when possible, we subtract energy losses of original particle from detectors on this particle's trajectory
334  // this is only done if all detectors are calibrated and have invertible calibrations
335  bool ok = false;
336  if(part.original_particle->GetParameters()->HasParameter("Ion pileup"))
337  {
338  ok = true;
339  Rtraj->IterateFrom();
341  while( (N = Rtraj->GetNextNode() ))
342  {
343  auto d = N->GetDetector();
344  if(!d->IsCalibrated())
345  {
346  ok = false;
347  break;
348  }
349  }
350  if(ok)
351  {
352  Rtraj->IterateFrom();
353  while( (N = Rtraj->GetNextNode() ))
354  {
355  auto d = N->GetDetector();
356  TString eparam = Form("INDRA.E%s",d->GetType());
357  if(part.original_particle->GetParameters()->HasParameter(eparam))
358  {
359  auto de = TMath::Abs(part.original_particle->GetParameters()->GetDoubleValue(eparam));
360  auto cal = static_cast<KVCalibratedSignal*>(d->GetDetectorSignal("Energy"));
361  auto e_orig = cal->GetValue();
362  if(cal->GetParentSignal() && de < e_orig)
363  {
364  // store initial parameter values in original particle
365  part.original_particle->SetParameter(Form("%s.%s",d->GetType(),cal->GetParentSignal()->GetType()), cal->GetParentSignal()->GetValue());
366  ok = cal->SetRawValueFromCalibrated(e_orig - de);
367  }
368  else
369  ok = false;
370  if(!ok)
371  break;
372  }
373  }
374  }
375  }
376  if(ok) // for Ion pileup, if all went well, now (re)identify the particle
377  {
378  IdentifyParticle(*rnuc);
379  }
380  else // just reuse the identifications from the original particle
381  {
382  Int_t idnumber = 1;
383  for (int i = part.first_id_result_to_copy; i <= part.max_id_result_index; ++i) {
384  auto IDR = rnuc->GetIdentificationResult(idnumber++);
385  // copy existing identification results from "parent" particle
386  part.original_particle->GetIdentificationResult(i)->Copy(*IDR);
387  }
388  rnuc->SetIsIdentified();
389  rnuc->SetIdentification(rnuc->GetIdentificationResult(1), part.identifying_telescope);
390  rnuc->SetParameter("Pileup",false);
391  rnuc->SetParameter("Coherent",true);
392  }
394  }
395 }
396 
397 
398 /*
399  The following is a copy of the old
400 void KVINDRAReconEvent::SecondaryAnalyseGroup(KVGroup* grp)
401  method from branch 1.10
402 
403 void KVINDRAGroupReconstructor:PerformSecondaryAnalysis()
404 {
405  // Perform identifications and calibrations of particles not included
406  // in first round (methods IdentifyEvent() and CalibrateEvent()).
407  //
408  // Here we treat particles with GetStatus()==KVReconstructedNucleus::kStatusOKafterSub
409  // after subtracting the energy losses of all previously calibrated particles in group from the
410  // measured energy losses in the detectors they crossed.
411 
412  // loop over al identified & calibrated particles in group and subtract calculated
413  // energy losses from all detectors
414  KVINDRAReconNuc* nuc;
415  TList sixparts;
416  TIter parts(grp->GetParticles());
417  while ((nuc = (KVINDRAReconNuc*)parts())) {
418  if (nuc->IsIdentified() && nuc->IsCalibrated()) {
419  nuc->SubtractEnergyFromAllDetectors();
420  // reconstruct particles from pile-up in silicon detectors revealed by coherency CsIR/L - SiCsI
421  if (nuc->IsSiPileup() && nuc->GetSi()->GetEnergy() > 0.1) {
422  KVINDRAReconNuc* SIX = AddParticle();
423  SIX->Reconstruct(nuc->GetSi());
424  sixparts.Add(SIX);
425  }
426  // reconstruct particles from pile-up in si75 detectors revealed by coherency
427  if (nuc->IsSi75Pileup()) {
428  KVINDRAReconNuc* SIX = AddParticle();
429  SIX->Reconstruct(nuc->GetSi75());
430  sixparts.Add(SIX);
431  }
432  // reconstruct particles from pile-up in sili detectors revealed by coherency
433  if (nuc->IsSiLiPileup()) {
434  KVINDRAReconNuc* SIX = AddParticle();
435  SIX->Reconstruct(nuc->GetSiLi());
436  sixparts.Add(SIX);
437  }
438 
439  // reconstruct particles from pile-up in ChIo detectors revealed by coherency CsIR/L - ChIoCsI
440  if (nuc->IsChIoPileup() && nuc->GetChIo()->GetEnergy() > 1.0) {
441  KVINDRAReconNuc* SIX = AddParticle();
442  SIX->Reconstruct(nuc->GetChIo());
443  sixparts.Add(SIX);
444  }
445  }
446  }
447  // reanalyse group
448  KVReconstructedNucleus::AnalyseParticlesInGroup(grp);
449 
450  Int_t nident = 0; //number of particles identified in each step
451  if (sixparts.GetEntries()) { // identify any particles added by coherency CsIR/L - SiCsI
452  KVINDRAReconNuc* SIX;
453  TIter nextsix(&sixparts);
454  while ((SIX = (KVINDRAReconNuc*)nextsix())) {
455  if (SIX->GetStatus() == KVReconstructedNucleus::kStatusOK) {
456  SIX->Identify();
457  if (SIX->IsIdentified()) {
458  nident++;
459  if (SIX->GetCodes().TestIDCode(kIDCode5)) SIX->SetIDCode(kIDCode7);
460  else SIX->SetIDCode(kIDCode6);
461  SIX->Calibrate();
462  if (SIX->IsCalibrated()) SIX->SubtractEnergyFromAllDetectors();
463  } else {
464  // failure of ChIo-Si identification: particle stopped in ChIo ?
465  // estimation of Z (minimum) from energy loss (if detector is calibrated)
466  UInt_t zmin = ((KVDetector*)SIX->GetDetectorList()->Last())->FindZmin(-1., SIX->GetMassFormula());
467  if (zmin) {
468  SIX->SetZ(zmin);
469  SIX->SetIsIdentified();
470  SIX->SetIDCode(kIDCode7);
471  // "Identifying" telescope is taken from list of ID telescopes
472  // to which stopping detector belongs
473  SIX->SetIdentifyingTelescope((KVIDTelescope*)SIX->GetStoppingDetector()->GetIDTelescopes()->Last());
474  SIX->Calibrate();
475  }
476  }
477  }
478  }
479  }
480  if (nident) { // newly-identified particles may change status of others in group
481  // reanalyse group
482  KVReconstructedNucleus::AnalyseParticlesInGroup(grp);
483  nident = 0;
484  }
485 
486  TIter parts2(grp->GetParticles()); // list may have changed if we have added particles
487  // identify & calibrate any remaining particles with status=KVReconstructedNucleus::kStatusOK
488  while ((nuc = (KVINDRAReconNuc*)parts2())) {
489  if (!nuc->IsIdentified() && nuc->GetStatus() == KVReconstructedNucleus::kStatusOK) {
490  nuc->ResetNSegDet();
491  nuc->Identify();
492  if (nuc->IsIdentified()) {
493  nident++;
494  nuc->Calibrate();
495  if (nuc->IsCalibrated()) nuc->SubtractEnergyFromAllDetectors();
496  }
497  }
498  }
499  if (nident) { // newly-identified particles may change status of others in group
500  // reanalyse group
501  KVReconstructedNucleus::AnalyseParticlesInGroup(grp);
502  nident = 0;
503  }
504 
505  // any kStatusOKafterShare particles ?
506  TList shareChIo;
507  parts2.Reset();
508  while ((nuc = (KVINDRAReconNuc*)parts2())) {
509  if (!nuc->IsIdentified() && nuc->GetStatus() == KVReconstructedNucleus::kStatusOKafterShare) {
510  shareChIo.Add(nuc);
511  }
512  }
513  Int_t nshares = shareChIo.GetEntries();
514  if (nshares) {
515  KVChIo* theChIo = ((KVINDRAReconNuc*)shareChIo.At(0))->GetChIo();
516  if (theChIo && nshares > 1) {
517  // divide chio energy equally
518  Double_t Eshare = theChIo->GetEnergyLoss() / nshares;
519  theChIo->SetEnergyLoss(Eshare);
520  // modify PG and GG of ChIo according to new energy loss
521  Double_t volts = theChIo->GetVoltsFromEnergy(Eshare);
522  Double_t GG = theChIo->GetCanalGGFromVolts(volts);
523  Double_t PG = theChIo->GetCanalPGFromVolts(volts);
524  theChIo->GetACQParam("PG")->SetData(TMath::Min(4095, (Int_t)PG));
525  theChIo->GetACQParam("GG")->SetData(TMath::Min(4095, (Int_t)GG));
526  }
527  // now try to identify
528  TIter nextSh(&shareChIo);
529  while ((nuc = (KVINDRAReconNuc*)nextSh())) {
530  nuc->SetNSegDet(10);
531  nuc->Identify();
532  if (nuc->IsIdentified()) {
533  nuc->SetIDCode(kIDCode8);
534  nuc->Calibrate();
535  }
536  }
537  }
538 
539  // any remaining stopped in first stage particles ?
540  parts2.Reset();
541  while ((nuc = (KVINDRAReconNuc*)parts2())) {
542  if (!nuc->IsIdentified() && nuc->GetStatus() == KVReconstructedNucleus::kStatusStopFirstStage) {
543  // estimation of Z (minimum) from energy loss (if detector is calibrated)
544  UInt_t zmin = ((KVDetector*)nuc->GetDetectorList()->Last())->FindZmin(-1., nuc->GetMassFormula());
545  if (zmin) {
546  nuc->SetZ(zmin);
547  nuc->SetIsIdentified();
548  nuc->SetIDCode(kIDCode5);
549  // "Identifying" telescope is taken from list of ID telescopes
550  // to which stopping detector belongs
551  nuc->SetIdentifyingTelescope((KVIDTelescope*)nuc->GetStoppingDetector()->GetIDTelescopes()->Last());
552  nuc->Calibrate();
553  }
554  }
555  }
556 }
557 */
558 
int Int_t
#define d(i)
bool Bool_t
constexpr Bool_t kFALSE
double Double_t
constexpr Bool_t kTRUE
#define N
char * Form(const char *fmt,...)
virtual Bool_t IsType(const Char_t *typ) const
Definition: KVBase.h:184
Output signal from detector obtained by calibration.
Double_t GetValue(const KVNameValueList &params="") const override
Base class for detector geometry description, interface to energy-loss calculations.
Definition: KVDetector.h:160
Double_t GetDetectorSignalValue(const KVString &type, const KVNameValueList &params="") const
Definition: KVDetector.h:499
virtual void SetEResAfterDetector(Double_t e)
Definition: KVDetector.h:623
Double_t GetMaxDeltaE(Int_t Z, Int_t A) override
Double_t GetDeltaEFromERes(Int_t Z, Int_t A, Double_t Eres) override
virtual Double_t GetCorrectedEnergy(KVNucleus *, Double_t e=-1., Bool_t transmission=kTRUE)
Definition: KVDetector.cpp:749
void IterateFrom(const KVGeoDetectorNode *node0=nullptr) const
const KVSeqCollection * GetIDTelescopes() const
Information on relative positions of detectors & particle trajectories.
KVIDTelescope * identifying_telescope
telescope which identified current particle
KVGroup * GetGroup() const
std::unordered_map< std::string, KVIdentificationResult * > id_by_type
identification results by type for current particle
KVReconstructedEvent * GetEventFragment() const
Double_t GetTargetEnergyLossCorrection(KVReconstructedNucleus *ion)
void SetCalibrationStatus(KVReconstructedNucleus &PART, UShort_t code)
virtual void IdentifyParticle(KVReconstructedNucleus &)
KVIdentificationResult partID
identification to be applied to current particle
std::vector< particle_to_add_from_coherency_analysis > coherency_particles
const KVGeoDNTrajectory * GetTrajectoryForReconstruction(const KVGeoDNTrajectory *t, const KVGeoDetectorNode *n) const
Definition: KVGroup.h:117
Base class for all detectors or associations of detectors in array which can identify charged particl...
Definition: KVIDTelescope.h:85
Reconstruct particles in INDRA groups.
void SetNoCalibrationStatus(KVReconstructedNucleus *n)
void CalibrateParticle(KVReconstructedNucleus *PART) override
void IdentifyParticle(KVReconstructedNucleus &PART) override
Bool_t CalculateChIoDEFromResidualEnergy(KVReconstructedNucleus *n, Double_t ERES)
double DoBeryllium8Calibration(KVReconstructedNucleus *n)
virtual bool DoCoherencyAnalysis(KVReconstructedNucleus &)=0
void CheckCsIEnergy(KVReconstructedNucleus *n)
KVDetector * GetCsI(KVReconstructedNucleus *n)
void CalibrateCoherencyParticle(KVReconstructedNucleus *) override
virtual void DoCalibration(KVReconstructedNucleus *)
void SetBadCalibrationStatus(KVReconstructedNucleus *n)
KVDetector * theChio
the ChIo of the group
Full result of one attempted particle identification.
Bool_t IDattempted
=kTRUE if identification was attempted
void SetComment(const Char_t *c)
Bool_t IdentifyingGridHasFlagWhichBegins(TString flag_beginning)
Bool_t Aident
= kTRUE if A of particle established
TString IdentifyingGridGetFlagWhichBegins(TString flag_beginning)
Int_t A
A of particle found (if Aident==kTRUE)
Int_t Z
Z of particle found (if Zident==kTRUE)
Int_t IDquality
specific quality code returned by identification procedure
Int_t IDcode
a general identification code for this type of identification
Bool_t Zident
=kTRUE if Z of particle established
Description of properties and kinematics of atomic nuclei.
Definition: KVNucleus.h:123
Int_t GetZ() const
Return the number of proton / atomic number.
Definition: KVNucleus.cpp:767
Double_t GetEnergy() const
Definition: KVParticle.h:624
void SetParameter(const Char_t *name, ValType value) const
Definition: KVParticle.h:822
void SetEnergy(Double_t e)
Definition: KVParticle.h:602
Path through detector array used to reconstruct detected particle.
Nuclei reconstructed from data measured by a detector array .
virtual void SetIDCode(UShort_t s)
const KVReconNucTrajectory * GetReconstructionTrajectory() const
void SetIdentification(KVIdentificationResult *, KVIDTelescope *)
virtual Int_t GetIDCode() const
virtual void SetTargetEnergyLoss(Double_t e)
virtual void GetAnglesFromReconstructionTrajectory(Option_t *opt="random")
virtual TObject * FindObjectByType(const Char_t *) const
Extension of ROOT TString class which allows backwards compatibility with ROOT v3....
Definition: KVString.h:73
void Begin(TString delim) const
Definition: KVString.cpp:565
KVString Next(Bool_t strip_whitespace=kFALSE) const
Definition: KVString.cpp:695
Particle * AddParticle()
Wrapper class for iterating over nuclei in KVReconstructedEvent accessed through base pointer or refe...
Int_t Atoi() const
const char * Data() const
const Int_t n
Double_t Abs(Double_t d)
ClassImp(TPyArg)