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) {
 
   57       TIter next_idt(idt_list);
 
   59       bool with_etalon = (traj->GetN() == 4);
 
   61       std::unordered_map<std::string, KVIdentificationResult> IDR;
 
   81                GetEventFragment()->GetParameters()->IncrementValue(
"INDRA_GAMMA_MULT", 1);
 
   82                GetEventFragment()->GetParameters()->IncrementValue(
"INDRA_GAMMA_DETS", node->GetName());
 
   83                node->GetDetector()->SetAnalysed();
 
   89                   if (IDR[
"SILI_CSI"].IDattempted && IDR[
"SILI_CSI"].IDOK) {
 
   91                      return GetEventFragment()->AddParticle();
 
   96                   return GetEventFragment()->AddParticle();
 
  119    if (!GetSi75(&PART) && !GetSiLi(&PART)) 
 
  122    PART.
SetParameter(
"UseFullChIoEnergyForCalib", !(theChio && theChio->GetNHits() > 1));
 
  123    bool ok = CoherencyEtalons(PART);
 
  139    if (!GetSi75(PART) && !GetSiLi(PART)) 
 
  146    if (PART->
GetIDCode() == KVINDRA::IDCodes::ID_CI_SI_COHERENCY
 
  147          || PART->
GetIDCode() == KVINDRA::IDCodes::ID_CI_COHERENCY
 
  148          || PART->
GetIDCode() == KVINDRA::IDCodes::ID_CI_MULTIHIT)
 
  152    auto csi = GetCsI(PART);
 
  155       if (csi->IsCalibrated()) {
 
  158             fECsI = DoBeryllium8Calibration(PART);
 
  161             fECsI = csi->GetCorrectedEnergy(PART, -1., 
kFALSE);
 
  164          SetNoCalibrationStatus(PART);
 
  167       if (fECsI <= 0 && (PART->
GetECode() != KVINDRA::ECodes::SOME_ENERGY_LOSSES_CALCULATED)) { 
 
  168          SetBadCalibrationStatus(PART);
 
  173       auto sili = GetSiLi(PART);
 
  179             if (stopped_in_sili) {
 
  183                sili->SetEResAfterDetector(ERES);
 
  185             fESiLi = sili->GetCorrectedEnergy(PART, -1., si_transmission);
 
  187                if (!stopped_in_sili && ERES > 0.0) {
 
  188                   if (!CalculateSiLiDEFromResidualEnergy(ERES, sili, PART)) 
return;
 
  191                   SetBadCalibrationStatus(PART);
 
  197             if (!CalculateSiLiDEFromResidualEnergy(ERES, sili, PART)) 
return;
 
  200       auto si75 = GetSi75(PART);
 
  206                && si75->IsCalibrated()) {
 
  208             if (stopped_in_si75) {
 
  212                si75->SetEResAfterDetector(ERES);
 
  214             fESi75 = si75->GetCorrectedEnergy(PART, -1., si_transmission);
 
  216                if (!stopped_in_si75 && ERES > 0.0) {
 
  217                   if (!CalculateSi75DEFromResidualEnergy(ERES, si75, PART)) 
return;
 
  220                   SetBadCalibrationStatus(PART);
 
  226             if (!CalculateSi75DEFromResidualEnergy(ERES, si75, PART)) 
return;
 
  239             && theChio->IsCalibrated()) {
 
  242          if (stopped_in_chio) {
 
  246             theChio->SetEResAfterDetector(ERES);
 
  248          fEChIo = theChio->GetCorrectedEnergy(PART, -1., ci_transmission);
 
  250             if (!stopped_in_chio && ERES > 0) {
 
  251                if (!CalculateChIoDEFromResidualEnergy(PART, ERES)) 
return;
 
  256          if (!stopped_in_chio && ERES > 0) {
 
  257             if (!CalculateChIoDEFromResidualEnergy(PART, ERES)) 
return;
 
  275    IDcsi = IDsilicsi = IDsi75sili = IDcisi75 = IDcicsi = 
nullptr;
 
  288    Bool_t haveSiLiCsI = IDsilicsi && IDsilicsi->
IDOK;
 
  289    Bool_t haveSi75SiLi = IDsi75sili && IDsi75sili->
IDOK;
 
  290    Bool_t haveChIoSi75 = IDcisi75 && IDcisi75->
IDOK;
 
  292    KVIDTelescope* idt_csi, *idt_silicsi, *idt_si75sili, *idt_cisi75, *idt_cicsi;
 
  293    idt_csi = idt_silicsi = idt_si75sili = idt_cisi75 = idt_cicsi = 
nullptr;
 
  310          identifying_telescope = idt_csi;
 
  314             if (IDsi75sili->
Z > partID.Z) {
 
  319                      IDcisi75->
SetComment(
"CsI identification with another particle stopped in Si75");
 
  324                      IDsi75sili->
SetComment(
"CsI identification with another particle stopped in SiLi");
 
  330          else if (haveChIoSi75) {
 
  332             if (IDcisi75->
Z > partID.Z) {
 
  334                IDcisi75->
SetComment(
"CsI identification with another particle stopped in Si75");
 
  340       else if (haveSiLiCsI) {
 
  342          identifying_telescope = idt_silicsi;
 
  345             if (IDcisi75->
Z > partID.Z) {
 
  347                IDcisi75->
SetComment(
"CsI identification with another particle stopped in Si75");
 
  356          partID = *IDsi75sili;
 
  357          identifying_telescope = idt_si75sili;
 
  364       else if (haveChIoSi75) {
 
  366          identifying_telescope = idt_cisi75;
 
  373          identifying_telescope = idt_cisi75;
 
  396       SetBadCalibrationStatus(
n);
 
  400    SetCalibrationStatus(*
n, KVINDRA::ECodes::SOME_ENERGY_LOSSES_CALCULATED);
 
  419       SetBadCalibrationStatus(
n);
 
  423    SetCalibrationStatus(*
n, KVINDRA::ECodes::SOME_ENERGY_LOSSES_CALCULATED);
 
virtual const Char_t * GetType() const
 
virtual Bool_t IsType(const Char_t *typ) const
 
Base class for detector geometry description.
 
virtual void SetEResAfterDetector(Double_t e)
 
virtual Double_t GetDeltaEFromERes(Int_t Z, Int_t A, Double_t Eres)
 
virtual Double_t GetCorrectedEnergy(KVNucleus *, Double_t e=-1., Bool_t transmission=kTRUE)
 
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.)
 
void DoCalibration(KVReconstructedNucleus *PART)
 
bool DoCoherencyAnalysis(KVReconstructedNucleus &PART)
Coherency analysis for backward rings 10-17 of INDRA.
 
Reconstruct particles in INDRA groups with etalon telescopes.
 
Bool_t CoherencyEtalons(KVReconstructedNucleus &PART)
Called by Identify() for particles stopping in etalon modules of Rings 10-17.
 
void DoCalibration(KVReconstructedNucleus *PART)
Calibration of particle stopping in etalon modules.
 
Bool_t CalculateSi75DEFromResidualEnergy(Double_t ERES, KVDetector *si75, KVReconstructedNucleus *n)
 
Bool_t CalculateSiLiDEFromResidualEnergy(Double_t ERES, KVDetector *sili, KVReconstructedNucleus *n)
 
bool DoCoherencyAnalysis(KVReconstructedNucleus &PART)
 
KVReconstructedNucleus * ReconstructTrajectory(const KVGeoDNTrajectory *traj, const KVGeoDetectorNode *node)
 
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