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 
28 
30 {
31  // \param traj trajectory currently being scanned
32  // \param node current detector on trajectory to test
33  // \returns pointer to a new reconstructed particle added to this group's event; nullptr if nothing is to be done
34  //
35  // Specialised particle reconstruction for INDRA data.
36  //
37  // If the fired detector in question is a CsI we check, if identification is available, whether
38  // this corresponds to a 'gamma'. If so we count it (event parameter "INDRA_GAMMA_MULT")
39  // and add the name of the detector to the parameter "INDRA_GAMMA_DETS"
40  // but do not begin the reconstruction of a particle. This allows to continue along the trajectory and
41  // directly reconstruct any charged particle which may stop in the Si detector in coincidence with
42  // a 'gamma' in the CsI.
43 
44  if (node->GetDetector()->IsType("CSI")) {
45 
46  if (node->GetDetector()->Fired(GetPartSeedCond())) {
47 
48  ++nfireddets;
50  if (idt) {
51 
53  if (idt->IsReadyForID()) {
54 
55  idt->Identify(&idr);
56  if (idr.IDOK && (idr.IDcode == KVINDRA::IDCodes::ID_GAMMA || idr.IDquality == KVIDGCsI::kICODE10)) { // gamma in CsI
57  GetEventFragment()->GetParameters()->IncrementValue("INDRA_GAMMA_MULT", 1);
58  GetEventFragment()->GetParameters()->IncrementValue("INDRA_GAMMA_DETS", node->GetName());
59  node->GetDetector()->SetAnalysed();
60  return nullptr;
61  }
62 
63  // if we arrive here, CSI identification for the particle has been performed and
64  // the result is not a gamma (which are rejected; no particle is reconstructed).
65  // as the coordinates in the identification map are randomized (KVACQParamSignal),
66  // we do not want to perform a second identification attempt in KVINDRAGroupReconstructor::IdentifyParticle:
67  // the results may not be the same, and for particles close to the threshold a charged particle
68  // identified here may be subsequently identified as a gamma in a second identification attempt,
69  // leading to the incoherency that there are gamma particles (IDcode=KVINDRA::IDCodes::ID_GAMMA)
70  // in the final reconstructed event.
71  // therefore in this case we add a new particle to the event, and copy the results of this
72  // first identification into the particle, with IDR->IDattempted=true, so that in
73  // KVINDRAGroupReconstructor::IdentifyParticle the CSI identification will not be redone.
74 
75  auto new_part = GetEventFragment()->AddParticle();
76  *(new_part->GetIdentificationResult(1)) = idr;
77  return new_part;
78  }
79  }
80  return GetEventFragment()->AddParticle();
81  }
82  return nullptr;
83  }
85 }
86 
87 
88 
90 
92 {
94  for (KVReconstructedEvent::Iterator it = GetEventFragment()->begin(); it != GetEventFragment()->end(); ++it) {
95 
96  KVReconstructedNucleus* d = it.get_pointer();
97 
98  if (!d->IsIdentified()) d->SetIDCode(KVINDRA::IDCodes::NO_IDENTIFICATION); // unidentifiable particle
99  else {
100  if (d->GetIDCode() == KVINDRA::IDCodes::ID_CSI_PSA && d->GetZ() == 0) {
101  std::cout << "\n\n";
102  std::cout << " GAMMA\n\n";
103  d->Print();
104  std::cout << "\n\n";
105  auto traj = (KVGeoDNTrajectory*)d->GetStoppingDetector()->GetNode()->GetTrajectories()->First();
106  KVIDINDRACsI* idt = (KVIDINDRACsI*)traj->GetIDTelescopes()->FindObjectByType(CSI_ID_TYPE);
107  std::cout << idt << std::endl;
108  std::cout << "Type: " << d->GetStoppingDetector()->GetType() << std::endl;
109  std::cout << "Fired: " << d->GetStoppingDetector()->Fired(GetPartSeedCond()) << std::endl;
110  std::cout << "ReadyforID: " << d->GetIdentifyingTelescope()->IsReadyForID() << std::endl;
111  std::cout << "\n\n";
112  exit(1);
113  }
114  }
115  }
116 }
117 
118 
119 
138 
140 {
141  // INDRA-specific particle identification.
142  // Here we attribute the Veda6-style general identification codes depending on the
143  // result of KVReconstructedNucleus::Identify and the subcodes from the different
144  // identification algorithms:
145  // If the particle's mass A was NOT measured, we make sure that it is calculated
146  // from the measured Z using the mass formula defined by default
147  //
148  //IDENTIFIED PARTICLES
149  //Identified particles with ID code = 2 with subcodes 4 & 5
150  //(masse hors limite superieure/inferieure) are relabelled
151  //with kIDCode10 (identification entre les lignes CsI)
152  //
153  //UNIDENTIFIED PARTICLES
154  //Unidentified particles receive the general ID code for non-identified particles (kIDCode14)
155  //EXCEPT if their identification in CsI gave subcodes 6 or 7
156  //(Zmin) then they are relabelled "Identified" with IDcode = 9 (ident. incomplete dans CsI ou Phoswich (Z.min))
157  //Their "identifying" telescope is set to the CsI ID telescope
158 
160  // if a successful identification has occured, identifying_telescope & partID are now set
161  // and the particle has IsIdentified()=true
162 
163  // INDRA coherency treatment
164  PART.SetParameter("Coherent", kTRUE);
165  PART.SetParameter("Pileup", kFALSE);
166  PART.SetParameter("UseFullChIoEnergyForCalib", kTRUE);
167  Bool_t ok = DoCoherencyAnalysis(PART);
168 
169  if (ok) { // identification may change here due to coherency analysis
170  PART.SetIsIdentified();
172  } // if not ok, do we need to unset any previously identified particle?
173 
174  if (PART.IsIdentified()) {
175 
176  /******* IDENTIFIED PARTICLES *******/
177  if (partID.IsType(CSI_ID_TYPE)) { /**** CSI IDENTIFICATION ****/
178 
179  //Identified particles with ID code = 2 with subcodes 4 & 5
180  //(masse hors limite superieure/inferieure) are relabelled
181  //with kIDCode10 (identification entre les lignes CsI)
182 
183  Int_t grid_code = partID.IDquality;
184  if (grid_code == KVIDGCsI::kICODE4 || grid_code == KVIDGCsI::kICODE5) {
185  partID.IDcode = KVINDRA::IDCodes::ID_CSI_MASS_OUT_OF_RANGE;
187  }
188 
189  }
190 
191  }
192  else {
193 
194  /******* UNIDENTIFIED PARTICLES *******/
195 
196  /*** general ID code for non-identified particles ***/
197  PART.SetIDCode(KVINDRA::IDCodes::NO_IDENTIFICATION);
198  auto csirl = id_by_type.find(CSI_ID_TYPE.Data());
199  if (csirl != id_by_type.end()) {
200  //Particles remaining unidentified are checked:
201  // - if in CsI identification they were in a zone marked 'nomassid|Z=...', we label them as identified
202  // in Z only (no mass identification), with the usual CsI IDCODE. This was introduced for E818 to handle
203  // the effects of defects in CsI crystals leading to poor discrimination of (p,d,t) above a certain energy/light
204  // - if their identification in CsI gave subcodes 6 or 7 (Zmin) then they are relabelled "Identified" with IDcode = 9
205  // (ident. incomplete dans CsI ou Phoswich (Z.min))
206  // - subcodes 4 & 5 (masse hors limite superieure/inferieure) are relabelled with kIDCode10
207  // (identification entre les lignes CsI)
208  //In each case their "identifying" telescope is set to the CsI ID telescope
209  KVIdentificationResult* idr = csirl->second;
210  if (idr->IDattempted) {
211  if (idr->IdentifyingGridHasFlagWhichBegins("nomassid|Z=")) {
212  KVString flag = idr->IdentifyingGridGetFlagWhichBegins("nomassid|Z=");
213  flag.Begin("=");
214  flag.Next(); // split e.g. "nomassid|Z=1" into "nomassid|Z=" and "1"
215  auto z = flag.Next().Atoi();
216  PART.SetIsIdentified();
217  idr->IDcode = KVINDRA::IDCodes::ID_CSI_PSA;
218  idr->Z = z;
219  idr->Zident = true;
220  idr->Aident = false;
221  idr->SetComment(Form("Z=%d identified without mass discrimination (due to CsI crystal defects)", z));
222  partID = *idr;
225  }
226  else if (idr->IDquality == KVIDGCsI::kICODE6 || idr->IDquality == KVIDGCsI::kICODE7) {
227  PART.SetIsIdentified();
228  idr->IDcode = KVINDRA::IDCodes::ID_CSI_FRAGMENT;
229  partID = *idr;
232  }
233  else if (idr->IDquality == KVIDGCsI::kICODE4 || idr->IDquality == KVIDGCsI::kICODE5) {
234  PART.SetIsIdentified();
235  idr->IDcode = KVINDRA::IDCodes::ID_CSI_MASS_OUT_OF_RANGE;
236  partID = *idr;
239  }
240  }
241  }
242 
243  }
244 }
245 
246 
247 
254 
256 {
257  // calculate fEChIo from residual energy
258  //
259  // returns kFALSE if it doesn't work, and sets particle bad calibration status
260  //
261  // returns kTRUE if it works, and sets calib status to SOME_ENERGY_LOSSES_CALCULATED
262 
263  Double_t e0 = theChio->GetDeltaEFromERes(n->GetZ(), n->GetA(), ERES);
266  if (fEChIo <= 0) {
268  fEChIo = 0;
269  return kFALSE;
270  }
272  n->SetECode(KVINDRA::ECodes::SOME_ENERGY_LOSSES_CALCULATED);
273  return kTRUE;
274 }
275 
276 
277 
283 
285 {
286  // Calculate and set the energy of a (previously identified) reconstructed particle
287  //
288  // This is only possible for correctly identified particles.
289  // We exclude IDCODE9 particles (Zmin in CsI-RL)
290 
291  fEChIo = fESi = fECsI = 0;
292 
293  print_part = false;
294 
296 
297  if (PART->GetIDCode() != KVINDRA::IDCodes::ID_CSI_FRAGMENT && PART->GetIDCode() != KVINDRA::IDCodes::ID_CSI_MASS_OUT_OF_RANGE) {
298  // this status may be modified depending on what happens in DoCalibration
299  SetCalibrationStatus(*PART, KVINDRA::ECodes::NORMAL_CALIBRATION);
300  DoCalibration(PART);
301  }
302 
303  PART->SetParameter("INDRA.ECHIO", fEChIo);
304  PART->SetParameter("INDRA.ESI", fESi);
305  PART->SetParameter("INDRA.ECSI", fECsI);
306  //add correction for target energy loss - moving charged particles only!
307  Double_t E_targ = 0.;
308  if (PART->GetZ() && PART->GetEnergy() > 0) {
309  E_targ = GetTargetEnergyLossCorrection(PART);
310  PART->SetTargetEnergyLoss(E_targ);
311  }
312  Double_t E_tot = PART->GetEnergy() + E_targ;
313  PART->SetEnergy(E_tot);
314  // set particle momentum from telescope dimensions (random)
316  CheckCsIEnergy(PART);
317 
318  //if(print_part) PART->Print();
319 }
320 
321 
322 
328 
330 {
331  // Beryllium-8 = 2 alpha particles of same energy
332  // We halve the total light output of the CsI to calculate the energy of 1 alpha
333  // Then multiply resulting energy by 2
334  // Note: fECsI is -ve, because energy is calculated not measured
335 
336  auto csi = GetCsI(n);
337  // energy is usually calculated from "TotLight", but it could be "ScaledTotLight", or something else...
338  auto input_signal = ((KVCalibratedSignal*)csi->GetDetectorSignal("Energy"))->GetInputSignal();
339  Double_t half_light = input_signal->GetValue(Form("Z=%d,A=%d", n->GetZ(), n->GetA())) * 0.5;
340  KVNucleus tmp(2, 4);
341  double ecsi = 2.*csi->GetCorrectedEnergy(&tmp, half_light, kFALSE);
342  if (ecsi > 0) {
343  SetCalibrationStatus(*n, KVINDRA::ECodes::SOME_ENERGY_LOSSES_CALCULATED);
344  // calculated energy returned as negative value
345  return -ecsi;
346  }
348  return 0;
349 }
350 
351 
352 
359 
361 {
362  // Check calculated CsI energy loss of particle:
363  // - If the particle was identified by the CsI but only in Z (case of particles falling in zones labelled "nomassid|Z=...")
364  // then we give it the (bad) calibration code KVINDRA::ECodes::WARNING_CSI_NO_MASS_ID
365  // - If it is greater than the maximum theoretical energy loss (depending on the length of CsI, the Z & A of the particle)
366  // 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)
367 
368  if (n->GetIDCode() == KVINDRA::IDCodes::ID_CSI_PSA && !n->IsAMeasured()) {
369  SetCalibrationStatus(*n, KVINDRA::ECodes::WARNING_CSI_NO_MASS_ID);
370  return;
371  }
372  KVDetector* csi = GetCsI(n);
373  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()))) {
374  SetCalibrationStatus(*n, KVINDRA::ECodes::WARNING_CSI_MAX_ENERGY);
375  }
376 }
377 
378 
379 /*
380  The following is a copy of the old
381 void KVINDRAReconEvent::SecondaryAnalyseGroup(KVGroup* grp)
382  method from branch 1.10
383 
384 void KVINDRAGroupReconstructor:PerformSecondaryAnalysis()
385 {
386  // Perform identifications and calibrations of particles not included
387  // in first round (methods IdentifyEvent() and CalibrateEvent()).
388  //
389  // Here we treat particles with GetStatus()==KVReconstructedNucleus::kStatusOKafterSub
390  // after subtracting the energy losses of all previously calibrated particles in group from the
391  // measured energy losses in the detectors they crossed.
392 
393  // loop over al identified & calibrated particles in group and subtract calculated
394  // energy losses from all detectors
395  KVINDRAReconNuc* nuc;
396  TList sixparts;
397  TIter parts(grp->GetParticles());
398  while ((nuc = (KVINDRAReconNuc*)parts())) {
399  if (nuc->IsIdentified() && nuc->IsCalibrated()) {
400  nuc->SubtractEnergyFromAllDetectors();
401  // reconstruct particles from pile-up in silicon detectors revealed by coherency CsIR/L - SiCsI
402  if (nuc->IsSiPileup() && nuc->GetSi()->GetEnergy() > 0.1) {
403  KVINDRAReconNuc* SIX = AddParticle();
404  SIX->Reconstruct(nuc->GetSi());
405  sixparts.Add(SIX);
406  }
407  // reconstruct particles from pile-up in si75 detectors revealed by coherency
408  if (nuc->IsSi75Pileup()) {
409  KVINDRAReconNuc* SIX = AddParticle();
410  SIX->Reconstruct(nuc->GetSi75());
411  sixparts.Add(SIX);
412  }
413  // reconstruct particles from pile-up in sili detectors revealed by coherency
414  if (nuc->IsSiLiPileup()) {
415  KVINDRAReconNuc* SIX = AddParticle();
416  SIX->Reconstruct(nuc->GetSiLi());
417  sixparts.Add(SIX);
418  }
419 
420  // reconstruct particles from pile-up in ChIo detectors revealed by coherency CsIR/L - ChIoCsI
421  if (nuc->IsChIoPileup() && nuc->GetChIo()->GetEnergy() > 1.0) {
422  KVINDRAReconNuc* SIX = AddParticle();
423  SIX->Reconstruct(nuc->GetChIo());
424  sixparts.Add(SIX);
425  }
426  }
427  }
428  // reanalyse group
429  KVReconstructedNucleus::AnalyseParticlesInGroup(grp);
430 
431  Int_t nident = 0; //number of particles identified in each step
432  if (sixparts.GetEntries()) { // identify any particles added by coherency CsIR/L - SiCsI
433  KVINDRAReconNuc* SIX;
434  TIter nextsix(&sixparts);
435  while ((SIX = (KVINDRAReconNuc*)nextsix())) {
436  if (SIX->GetStatus() == KVReconstructedNucleus::kStatusOK) {
437  SIX->Identify();
438  if (SIX->IsIdentified()) {
439  nident++;
440  if (SIX->GetCodes().TestIDCode(kIDCode5)) SIX->SetIDCode(kIDCode7);
441  else SIX->SetIDCode(kIDCode6);
442  SIX->Calibrate();
443  if (SIX->IsCalibrated()) SIX->SubtractEnergyFromAllDetectors();
444  } else {
445  // failure of ChIo-Si identification: particle stopped in ChIo ?
446  // estimation of Z (minimum) from energy loss (if detector is calibrated)
447  UInt_t zmin = ((KVDetector*)SIX->GetDetectorList()->Last())->FindZmin(-1., SIX->GetMassFormula());
448  if (zmin) {
449  SIX->SetZ(zmin);
450  SIX->SetIsIdentified();
451  SIX->SetIDCode(kIDCode7);
452  // "Identifying" telescope is taken from list of ID telescopes
453  // to which stopping detector belongs
454  SIX->SetIdentifyingTelescope((KVIDTelescope*)SIX->GetStoppingDetector()->GetIDTelescopes()->Last());
455  SIX->Calibrate();
456  }
457  }
458  }
459  }
460  }
461  if (nident) { // newly-identified particles may change status of others in group
462  // reanalyse group
463  KVReconstructedNucleus::AnalyseParticlesInGroup(grp);
464  nident = 0;
465  }
466 
467  TIter parts2(grp->GetParticles()); // list may have changed if we have added particles
468  // identify & calibrate any remaining particles with status=KVReconstructedNucleus::kStatusOK
469  while ((nuc = (KVINDRAReconNuc*)parts2())) {
470  if (!nuc->IsIdentified() && nuc->GetStatus() == KVReconstructedNucleus::kStatusOK) {
471  nuc->ResetNSegDet();
472  nuc->Identify();
473  if (nuc->IsIdentified()) {
474  nident++;
475  nuc->Calibrate();
476  if (nuc->IsCalibrated()) nuc->SubtractEnergyFromAllDetectors();
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  // any kStatusOKafterShare particles ?
487  TList shareChIo;
488  parts2.Reset();
489  while ((nuc = (KVINDRAReconNuc*)parts2())) {
490  if (!nuc->IsIdentified() && nuc->GetStatus() == KVReconstructedNucleus::kStatusOKafterShare) {
491  shareChIo.Add(nuc);
492  }
493  }
494  Int_t nshares = shareChIo.GetEntries();
495  if (nshares) {
496  KVChIo* theChIo = ((KVINDRAReconNuc*)shareChIo.At(0))->GetChIo();
497  if (theChIo && nshares > 1) {
498  // divide chio energy equally
499  Double_t Eshare = theChIo->GetEnergyLoss() / nshares;
500  theChIo->SetEnergyLoss(Eshare);
501  // modify PG and GG of ChIo according to new energy loss
502  Double_t volts = theChIo->GetVoltsFromEnergy(Eshare);
503  Double_t GG = theChIo->GetCanalGGFromVolts(volts);
504  Double_t PG = theChIo->GetCanalPGFromVolts(volts);
505  theChIo->GetACQParam("PG")->SetData(TMath::Min(4095, (Int_t)PG));
506  theChIo->GetACQParam("GG")->SetData(TMath::Min(4095, (Int_t)GG));
507  }
508  // now try to identify
509  TIter nextSh(&shareChIo);
510  while ((nuc = (KVINDRAReconNuc*)nextSh())) {
511  nuc->SetNSegDet(10);
512  nuc->Identify();
513  if (nuc->IsIdentified()) {
514  nuc->SetIDCode(kIDCode8);
515  nuc->Calibrate();
516  }
517  }
518  }
519 
520  // any remaining stopped in first stage particles ?
521  parts2.Reset();
522  while ((nuc = (KVINDRAReconNuc*)parts2())) {
523  if (!nuc->IsIdentified() && nuc->GetStatus() == KVReconstructedNucleus::kStatusStopFirstStage) {
524  // estimation of Z (minimum) from energy loss (if detector is calibrated)
525  UInt_t zmin = ((KVDetector*)nuc->GetDetectorList()->Last())->FindZmin(-1., nuc->GetMassFormula());
526  if (zmin) {
527  nuc->SetZ(zmin);
528  nuc->SetIsIdentified();
529  nuc->SetIDCode(kIDCode5);
530  // "Identifying" telescope is taken from list of ID telescopes
531  // to which stopping detector belongs
532  nuc->SetIdentifyingTelescope((KVIDTelescope*)nuc->GetStoppingDetector()->GetIDTelescopes()->Last());
533  nuc->Calibrate();
534  }
535  }
536  }
537 }
538 */
539 
int Int_t
#define d(i)
bool Bool_t
constexpr Bool_t kFALSE
double Double_t
constexpr Bool_t kTRUE
char * Form(const char *fmt,...)
virtual Bool_t IsType(const Char_t *typ) const
Definition: KVBase.h:185
Output signal from detector obtained by calibration.
Base class for detector geometry description.
Definition: KVDetector.h:160
virtual Double_t GetMaxDeltaE(Int_t Z, Int_t A)
virtual Bool_t Fired(Option_t *opt="any") const
Definition: KVDetector.h:451
Double_t GetDetectorSignalValue(const KVString &type, const KVNameValueList &params="") const
Definition: KVDetector.h:493
virtual void SetEResAfterDetector(Double_t e)
Definition: KVDetector.h:630
virtual Double_t GetDeltaEFromERes(Int_t Z, Int_t A, Double_t Eres)
void SetAnalysed(Bool_t b=kTRUE)
Definition: KVDetector.h:447
virtual Double_t GetCorrectedEnergy(KVNucleus *, Double_t e=-1., Bool_t transmission=kTRUE)
Definition: KVDetector.cpp:811
KVNameValueList * GetParameters() const
Definition: KVEvent.h:179
Path taken by particles through multidetector geometry.
const KVSeqCollection * GetIDTelescopes() const
Information on relative positions of detectors & particle trajectories.
const Char_t * GetName() const
Name of node is same as name of associated detector.
KVDetector * GetDetector() const
virtual KVReconstructedNucleus * ReconstructTrajectory(const KVGeoDNTrajectory *traj, const KVGeoDetectorNode *node)
KVIDTelescope * identifying_telescope
telescope which identified current particle
std::unordered_map< std::string, KVIdentificationResult * > id_by_type
identification results by type for current particle
KVReconstructedEvent * GetEventFragment() const
int nfireddets
number of fired detectors in group for current event
Double_t GetTargetEnergyLossCorrection(KVReconstructedNucleus *ion)
void SetCalibrationStatus(KVReconstructedNucleus &PART, UShort_t code)
virtual void IdentifyParticle(KVReconstructedNucleus &)
TString GetPartSeedCond() const
KVIdentificationResult partID
identification to be applied to current particle
virtual Bool_t Identify(KVIdentificationResult *, Double_t x=-1., Double_t y=-1.)
Base class for all detectors or associations of detectors in array which can identify charged particl...
Definition: KVIDTelescope.h:84
virtual Bool_t IsReadyForID()
Reconstruct particles in INDRA groups.
void SetNoCalibrationStatus(KVReconstructedNucleus *n)
void IdentifyParticle(KVReconstructedNucleus &PART)
Bool_t CalculateChIoDEFromResidualEnergy(KVReconstructedNucleus *n, Double_t ERES)
double DoBeryllium8Calibration(KVReconstructedNucleus *n)
virtual bool DoCoherencyAnalysis(KVReconstructedNucleus &)=0
void CalibrateParticle(KVReconstructedNucleus *PART)
void CheckCsIEnergy(KVReconstructedNucleus *n)
KVDetector * GetCsI(KVReconstructedNucleus *n)
virtual void DoCalibration(KVReconstructedNucleus *)
void SetBadCalibrationStatus(KVReconstructedNucleus *n)
KVReconstructedNucleus * ReconstructTrajectory(const KVGeoDNTrajectory *traj, const KVGeoDetectorNode *node)
KVDetector * theChio
the ChIo of the group
Full result of one attempted particle identification.
Bool_t IDattempted
=kTRUE if identification was attempted
Bool_t IDOK
general quality of identification, =kTRUE if acceptable identification made
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 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
void IncrementValue(const Char_t *name, value_type value)
Description of properties and kinematics of atomic nuclei.
Definition: KVNucleus.h:126
Int_t GetZ() const
Return the number of proton / atomic number.
Definition: KVNucleus.cpp:773
Double_t GetEnergy() const
Definition: KVParticle.h:621
void SetParameter(const Char_t *name, ValType value) const
Definition: KVParticle.h:819
void SetEnergy(Double_t e)
Definition: KVParticle.h:599
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
Iterator end() const
Particle * AddParticle()
Int_t Atoi() const
const char * Data() const
const Int_t n
Double_t Abs(Double_t d)
ClassImp(TPyArg)