4 #include "KVINDRAEtalonGroupReconstructor.h"
6 #include <unordered_map>
51 if (!node->GetDetector()->IsAnalysed() &&
52 node->GetDetector()->Fired(GetPartSeedCond()) &&
53 node->GetDetector()->IsType(
"CSI") &&
54 node->GetNTrajForwards() > 1) {
58 TIter next_idt(idt_list);
60 bool with_etalon = (traj->GetN() == 4);
62 std::unordered_map<std::string, KVIdentificationResult> IDR;
82 GetEventFragment()->GetParameters()->IncrementValue(
"INDRA_GAMMA_MULT", 1);
83 GetEventFragment()->GetParameters()->IncrementValue(
"INDRA_GAMMA_DETS", node->GetName());
84 node->GetDetector()->SetAnalysed();
90 if (IDR[
"SILI_CSI"].IDattempted && IDR[
"SILI_CSI"].IDOK) {
92 return GetEventFragment()->AddParticle();
97 return GetEventFragment()->AddParticle();
120 if (!GetSi75(&PART) && !GetSiLi(&PART))
123 PART.
SetParameter(
"UseFullChIoEnergyForCalib", !(theChio && theChio->GetNHits() > 1));
124 bool ok = CoherencyEtalons(PART);
140 if (!GetSi75(PART) && !GetSiLi(PART))
147 if (PART->
GetIDCode() == KVINDRA::IDCodes::ID_CI_SI_COHERENCY
148 || PART->
GetIDCode() == KVINDRA::IDCodes::ID_CI_COHERENCY
149 || PART->
GetIDCode() == KVINDRA::IDCodes::ID_CI_MULTIHIT)
153 auto csi = GetCsI(PART);
156 if (csi->IsCalibrated()) {
159 fECsI = DoBeryllium8Calibration(PART);
162 fECsI = csi->GetCorrectedEnergy(PART, -1.,
kFALSE);
165 SetNoCalibrationStatus(PART);
168 if (fECsI <= 0 && (PART->
GetECode() != KVINDRA::ECodes::SOME_ENERGY_LOSSES_CALCULATED)) {
169 SetBadCalibrationStatus(PART);
174 auto sili = GetSiLi(PART);
180 if (stopped_in_sili) {
184 sili->SetEResAfterDetector(ERES);
186 fESiLi = sili->GetCorrectedEnergy(PART, -1., si_transmission);
188 if (!stopped_in_sili && ERES > 0.0) {
189 if (!CalculateSiLiDEFromResidualEnergy(ERES, sili, PART))
return;
192 SetBadCalibrationStatus(PART);
198 if (!CalculateSiLiDEFromResidualEnergy(ERES, sili, PART))
return;
201 auto si75 = GetSi75(PART);
207 && si75->IsCalibrated()) {
209 if (stopped_in_si75) {
213 si75->SetEResAfterDetector(ERES);
215 fESi75 = si75->GetCorrectedEnergy(PART, -1., si_transmission);
217 if (!stopped_in_si75 && ERES > 0.0) {
218 if (!CalculateSi75DEFromResidualEnergy(ERES, si75, PART))
return;
221 SetBadCalibrationStatus(PART);
227 if (!CalculateSi75DEFromResidualEnergy(ERES, si75, PART))
return;
240 && theChio->IsCalibrated()) {
243 if (stopped_in_chio) {
247 theChio->SetEResAfterDetector(ERES);
249 fEChIo = theChio->GetCorrectedEnergy(PART, -1., ci_transmission);
251 if (!stopped_in_chio && ERES > 0) {
252 if (!CalculateChIoDEFromResidualEnergy(PART, ERES))
return;
257 if (!stopped_in_chio && ERES > 0) {
258 if (!CalculateChIoDEFromResidualEnergy(PART, ERES))
return;
276 IDcsi = IDsilicsi = IDsi75sili = IDcisi75 = IDcicsi =
nullptr;
289 Bool_t haveSiLiCsI = IDsilicsi && IDsilicsi->
IDOK;
290 Bool_t haveSi75SiLi = IDsi75sili && IDsi75sili->
IDOK;
291 Bool_t haveChIoSi75 = IDcisi75 && IDcisi75->
IDOK;
293 KVIDTelescope* idt_csi, *idt_silicsi, *idt_si75sili, *idt_cisi75, *idt_cicsi;
294 idt_csi = idt_silicsi = idt_si75sili = idt_cisi75 = idt_cicsi =
nullptr;
311 identifying_telescope = idt_csi;
315 if (IDsi75sili->
Z > partID.Z) {
320 IDcisi75->
SetComment(
"CsI identification with another particle stopped in Si75");
325 IDsi75sili->
SetComment(
"CsI identification with another particle stopped in SiLi");
331 else if (haveChIoSi75) {
333 if (IDcisi75->
Z > partID.Z) {
335 IDcisi75->
SetComment(
"CsI identification with another particle stopped in Si75");
341 else if (haveSiLiCsI) {
343 identifying_telescope = idt_silicsi;
346 if (IDcisi75->
Z > partID.Z) {
348 IDcisi75->
SetComment(
"CsI identification with another particle stopped in Si75");
357 partID = *IDsi75sili;
358 identifying_telescope = idt_si75sili;
365 else if (haveChIoSi75) {
367 identifying_telescope = idt_cisi75;
374 identifying_telescope = idt_cisi75;
392 Double_t e0 = sili->GetDeltaEFromERes(
n->GetZ(),
n->GetA(), ERES);
393 sili->SetEResAfterDetector(ERES);
394 fESiLi = sili->GetCorrectedEnergy(
n, e0);
397 SetBadCalibrationStatus(
n);
401 SetCalibrationStatus(*
n, KVINDRA::ECodes::SOME_ENERGY_LOSSES_CALCULATED);
415 Double_t e0 = si75->GetDeltaEFromERes(
n->GetZ(),
n->GetA(), ERES);
416 si75->SetEResAfterDetector(ERES);
417 fESi75 = si75->GetCorrectedEnergy(
n, e0);
420 SetBadCalibrationStatus(
n);
424 SetCalibrationStatus(*
n, KVINDRA::ECodes::SOME_ENERGY_LOSSES_CALCULATED);
virtual const Char_t * GetType() const
Path taken by particles through multidetector geometry.
const KVSeqCollection * GetIDTelescopes() const
Information on relative positions of detectors & particle trajectories.
Base class for all detectors or associations of detectors in array which can identify charged particl...
virtual Bool_t IsReadyForID()
virtual Bool_t Identify(KVIdentificationResult *, Double_t x=-1., Double_t y=-1.)
bool DoCoherencyAnalysis(KVReconstructedNucleus &PART) override
Coherency analysis for backward rings 10-17 of INDRA.
void DoCalibration(KVReconstructedNucleus *PART) override
Reconstruct particles in INDRA groups with etalon telescopes.
bool DoCoherencyAnalysis(KVReconstructedNucleus &PART) override
Bool_t CoherencyEtalons(KVReconstructedNucleus &PART)
Called by Identify() for particles stopping in etalon modules of Rings 10-17.
Bool_t CalculateSi75DEFromResidualEnergy(Double_t ERES, KVDetector *si75, KVReconstructedNucleus *n)
Bool_t CalculateSiLiDEFromResidualEnergy(Double_t ERES, KVDetector *sili, KVReconstructedNucleus *n)
void DoCalibration(KVReconstructedNucleus *PART) override
Calibration of particle stopping in etalon modules.
KVReconstructedNucleus * ReconstructTrajectory(const KVGeoDNTrajectory *traj, const KVGeoDetectorNode *node) override
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)
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 GetBoolValue(const Char_t *name) const
Bool_t IsIsotope(Int_t Z, Int_t A) const
KVNameValueList * GetParameters() const
void SetParameter(const Char_t *name, ValType value) const
void SetEnergy(Double_t e)
Nuclei reconstructed from data measured by a detector array .
virtual Int_t GetECode() const
KVIdentificationResult * GetIdentificationResult(Int_t i)
const KVReconNucTrajectory * GetReconstructionTrajectory() const
virtual Int_t GetIDCode() const
KVDetector * GetStoppingDetector() const
void SetDetector(int i, KVDetector *);
KaliVeda extensions to ROOT collection classes.
virtual TObject * FindObjectByType(const Char_t *) const