1 #include "KVFilterGroupReconstructor.h"
2 #include "KVIDZAGrid.h"
3 #include "KVMultiDetArray.h"
4 #include "KVNucleusEvent.h"
20 TString stop =
n.GetParameters()->GetTStringValue(
"STOPPING DETECTOR");
26 auto traj_string =
n.GetParameters()->GetTStringValue(
"TRAJECTORY");
28 if ((Rtraj->GetPathString() == traj_string) || (traj_in_grp && Rtraj->ContainsTrajectory(traj_in_grp))) {
41 Info(
"get_recon_traj_for_particle",
"%p : sim event is empty",
this);
72 q.Merge(*
N->GetParameters());
78 sum_part.
Copy(*sim_part);
80 sim_part->SetParameter(
"PILEUP",
Form(
"%d particles in %s", multihit, nuc.GetStoppingDetector()->GetName()));
84 for (
auto& param : *sim_part->GetParameters()) {
86 if (param.IsString()) {
89 auto next = sparam.
Next();
93 if (next != unique_value) {
94 Warning(
"identify_particle",
"different values of %s for %d-particle pileup in %s:%s, %s, ...",
95 param.GetName(), multihit, nuc.GetStoppingDetector()->GetName(), unique_value.
Data(), next.Data());
98 param.Set(unique_value);
101 nuc.GetParameters()->Concatenate(*sim_part->GetParameters());
110 Info(
"identify_particle",
"sim_part=nullptr; multihit=%d", multihit);
111 Info(
"identify_particle",
"sim_event contains:");
115 Fatal(
"identify_particle",
"no sim_part for recon_nuc!");
120 int simA = sim_part->GetA();
122 std::stringstream comments;
126 IDR->
Z = sim_part->GetZ();
156 "%s : %s Z=%d A=%d E=%f", comments.str().c_str(),
157 idt->
GetName(), sim_part->GetZ(), sim_part->GetA(), sim_part->GetEnergy());
162 if (idt->
CanIdentify(sim_part->GetZ(), sim_part->GetA())) {
163 IDR->
Z = sim_part->GetZ();
164 IDR->
A = sim_part->GetA();
176 IDR->
SetComment(
"below threshold for identification");
186 if (sim_part->GetParameters()->HasDoubleParameter(
"RESIDUAL ENERGY")) {
190 IDR->
SetComment(
Form(
"particle incompletely detected, DETECTED=%s", sim_part->GetParameters()->GetStringValue(
"DETECTED")));
203 int num_ident_0, num_ident;
204 int num_unident_0, num_unident;
211 if (num_unident > num_unident_0) {
214 if (num_ident > num_ident_0)
Calibrate();
217 while (num_ident > num_ident_0);
235 energy_loss[Nd->GetName()] = Nd->GetDetector()->GetEnergyLoss();
269 PART->
SetECode(
GetGroup()->GetParentStructure<KVMultiDetArray>()->GetNormalCalibrationCode());
274 auto det = node->GetDetector();
285 dE = det->GetDeltaEFromERes(PART->
GetZ(), PART->
GetA(), Einc);
288 PART->
SetECode(
GetGroup()->GetParentStructure<KVMultiDetArray>()->GetNoCalibrationCode());
292 det->SetEResAfterDetector(Einc);
293 edet = det->GetCorrectedEnergy(PART, dE);
297 PART->
SetECode(
GetGroup()->GetParentStructure<KVMultiDetArray>()->GetCalculatedCalibrationCode());
302 PART->
SetECode(
GetGroup()->GetParentStructure<KVMultiDetArray>()->GetNoCalibrationCode());
307 else if (det->GetNHits() > 1) {
312 det->SetEResAfterDetector(Einc);
313 edet = det->GetCorrectedEnergy(PART, dE);
316 PART->
SetECode(
GetGroup()->GetParentStructure<KVMultiDetArray>()->GetCalculatedCalibrationCode());
319 dE = det->GetEnergyLoss();
320 det->SetEResAfterDetector(Einc);
321 edet = det->GetCorrectedEnergy(PART, -1., (Einc > 0));
char * Form(const char *fmt,...)
Class for iterating over nuclei in events accessed through base pointer/reference.
virtual const Char_t * GetType() const
@ partial_isotopic_identification
@ A_never_measured_but_between_Amin_and_Amax
@ A_less_than_measured_Amin
@ full_isotopic_identification
@ A_greater_than_measured_Amax
IDStatus CanIdentify(const TString &tel_name, int Z, int &A, double E) const
Reconstruct particles in group of detectors after filtering simulated events.
KVReconstructedNucleus * current_nuc_recon
correspondence between reconstructed and simulated particles
void IdentifyParticle(KVReconstructedNucleus &PART) override
void PerformSecondaryAnalysis()
After first round of identification in group, try to identify remaining particles.
std::unique_ptr< KVEvent > fSimEvent
experimental data on identification thresholds & capabilities
std::unordered_map< std::string, double > energy_loss
temporary, store argument to ReconstructParticle
KVReconNucTrajectory * get_recon_traj_for_particle(const KVGeoDNTrajectory *, const KVGeoDetectorNode *node) override
number of particles hitting detector aas yet unidentified
std::unordered_map< KVReconstructedNucleus *, TList > part_correspond
count simulated particles in stopping detectors
void ReconstructParticle(KVReconstructedNucleus *part, const KVGeoDNTrajectory *traj, const KVGeoDetectorNode *node) override
std::unordered_map< std::string, int > number_uncalibrated
energy losses in detectors
const KVDataQualityAudit * fDataQAudit
void identify_particle(KVIDTelescope *idt, KVIdentificationResult *IDR, KVReconstructedNucleus &nuc) override
std::unordered_map< std::string, int > number_unidentified
number of particles for which the energy contribution of detector has not yet been set
void CalibrateParticle(KVReconstructedNucleus *PART) override
Path taken by particles through multidetector geometry.
KVGeoDetectorNode * GetNextNode() const
KVString GetPathString() const
void IterateFrom(const KVGeoDetectorNode *node0=nullptr) const
Information on relative positions of detectors & particle trajectories.
const Char_t * GetName() const override
Name of node is same as name of associated detector.
KVGeoStrucElement * GetParentStructure(const Char_t *type, const Char_t *name="") const
virtual void ReconstructParticle(KVReconstructedNucleus *part, const KVGeoDNTrajectory *traj, const KVGeoDetectorNode *node)
KVGroup * GetGroup() const
void Calibrate()
Calculate and set energies of all Z-identified but uncalibrated charged particles in event.
Double_t GetTargetEnergyLossCorrection(KVReconstructedNucleus *ion)
Int_t GetNIdentifiedInGroup()
virtual void IdentifyParticle(KVReconstructedNucleus &)
virtual void Reconstruct()
Int_t GetNUnidentifiedInGroup()
const TCollection * GetTrajectories() const
const KVGeoDNTrajectory * GetTrajectoryForReconstruction(const KVGeoDNTrajectory *t, const KVGeoDetectorNode *n) const
Base class for all detectors or associations of detectors in array which can identify charged particl...
virtual Bool_t CheckTheoreticalIdentificationThreshold(KVNucleus *, Double_t=0.0)
virtual Bool_t CanIdentify(Int_t Z, Int_t)
virtual UShort_t GetIDCode()
virtual void SetIdentificationStatus(KVIdentificationResult *IDR, const KVNucleus *)
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 Aident
= kTRUE if A of particle established
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
void SetIDType(const Char_t *t)
Bool_t Zident
=kTRUE if Z of particle established
Base class for describing the geometry of a detector array.
Handles lists of named parameters with different types, a list of KVNamedParameter objects.
void Merge(const KVNameValueList &)
Description of properties and kinematics of atomic nuclei.
void Copy(TObject &) const override
Copy this KVNucleus into the KVNucleus object referenced by "obj".
Int_t GetZ() const
Return the number of proton / atomic number.
KVNameValueList * GetParameters() const
Double_t GetEnergy() const
void SetParameter(const Char_t *name, ValType value) const
void SetEnergy(Double_t e)
Path through detector array used to reconstruct detected particle.
Nuclei reconstructed from data measured by a detector array .
virtual Int_t GetECode() const
const KVReconNucTrajectory * GetReconstructionTrajectory() const
Bool_t IsIdentified() const
KVDetector * GetStoppingDetector() const
void SetDetector(int i, KVDetector *);
virtual void SetTargetEnergyLoss(Double_t e)
virtual void GetAnglesFromReconstructionTrajectory(Option_t *opt="random")
void Print(Option_t *option="") const override
virtual void SetECode(UChar_t s)
Extension of ROOT TString class which allows backwards compatibility with ROOT v3....
void Begin(TString delim) const
KVString Next(Bool_t strip_whitespace=kFALSE) const
TObject * FindObject(const char *name) const override
const char * GetName() const override
virtual void Warning(const char *method, const char *msgfmt,...) const
virtual void Fatal(const char *method, const char *msgfmt,...) const
virtual void Info(const char *method, const char *msgfmt,...) const
const char * Data() const