23#include "KVINDRAReconNuc.h"
28#include "KVTelescope.h"
29#include "KVIDTelescope.h"
32#include "KVEBYEDAT_ACQParam.h"
37#include "KVIDChIoSi.h"
40#include <KVIDGChIoSi.h>
89#if ROOT_VERSION_CODE >= ROOT_VERSION(3,4,0)
109#if ROOT_VERSION_CODE >= ROOT_VERSION(3,4,0)
147 cout <<
"KVINDRAReconNuc: fRing=" <<
GetRingNumber() <<
" fModule=" <<
151 cout <<
" -- RESULTS OF COHERENCY TESTS (RINGS 1-9) -- " << endl;
152 if (
fCoherent) cout <<
" CsI-R/L & Si-CsI identifications COHERENT" << endl;
153 else cout <<
" CsI-R/L & Si-CsI identifications NOT COHERENT" << endl;
154 if (
fPileup) cout <<
" Si energy loss indicates PILEUP" << endl;
155 else cout <<
" Si energy loss indicates single particle" << endl;
158 else cout <<
" ChIo-Si identification indicates MULTIPLE CHIO CONTRIBUTIONS" << endl;
163 cout <<
" -- RESULTS OF COHERENCY TESTS (RINGS 10-17) -- " << endl;
165 else cout <<
" WITHOUT etalon telescopes included in particle trajectory" << endl;
167 cout <<
" Analysis indicates PILEUP in ChIo" << endl;
170 cout <<
" Analysis indicates PILEUP in Si75" << endl;
173 cout <<
" Analysis indicates PILEUP in SiLi" << endl;
176 else cout <<
" ChIo energy contribution calculated assuming MULTIPLE CHIO CONTRIBUTIONS" << endl;
178 cout <<
" =======> ";
182 else cout <<
" Zreal=" <<
GetRealZ();
183 cout << endl <<
" Identification code = " << ((
KVINDRAReconNuc*)
this)->
187 cout <<
"(unidentified)" << endl;
194 if (
fEChIo < 0) cout <<
" (calculated)";
198 if (
fESi < 0) cout <<
" (calculated)";
201 if (
fECsI < 0) cout <<
" (calculated)";
206 if (
fEChIo < 0) cout <<
" (calculated)";
210 if (
fESi75 < 0) cout <<
" (calculated)";
213 if (
fESiLi < 0) cout <<
" (calculated)";
217 if (
fECsI < 0) cout <<
" (calculated)";
225 cout <<
"(uncalibrated)" << endl;
228 cout <<
"Analysis : ";
232 "Particle alone in group, or identification independently of other"
234 cout <<
"particles in group is directly possible." << endl;
239 "Particle reconstructed after identification of others in group"
242 "and subtraction of their calculated energy losses in ChIo."
248 "Particle identification estimated after arbitrary sharing of"
251 "energy lost in ChIo between several reconstructed particles."
257 "Particle stopped in first stage of telescope. Estimation of minimum Z."
267 "-------------------------------------------------------------------------------"
525 if (strcmp(id_tel_type,
""))
526 return Form(
"No identification attempted in %s", id_tel_type);
529 Form(
"Particle unidentified. Identifying telescope not set.");
614 if (IDsicsi->
IDOK && !IDcsi->
IDOK) {
630 if ((IDcsi->
Z == 1 || IDcsi->
Z == 2) &&
GetSi()) {
643 if (dE_exp > ped + 5.) {
647 if (idt->
GetIDMapY() < (ped + factor * (dE_exp - ped))) {
705 if (IDcsi->
Z == 4 && IDcsi->
A == 8) {
709 if (IDsicsi->
Z < 2 || (IDsicsi->
Z == 2 && IDsicsi->
A < 7)) {
711 IDsicsi->
SetComment(
"CsI-R/L & Si-CsI identifications not coherent");
714 else if (IDsicsi->
Z == 2 && IDsicsi->
A > 6 && IDsicsi->
A < 10) {
719 else if ((IDsicsi->
Z == 2 && IDsicsi->
A > 9) || (IDsicsi->
Z == 3 && IDsicsi->
A < 6)) {
721 IDsicsi->
SetComment(
"CsI-R/L & Si-CsI identifications not coherent");
724 else if (IDsicsi->
Z == 3 && IDsicsi->
A > 5 && IDsicsi->
A < 9) {
728 else if ((IDsicsi->
Z == 3 && IDsicsi->
A > 8) || IDsicsi->
Z > 3) {
730 IDsicsi->
SetComment(
"Second particle stopping in Si, identification ChIo-Si required");
735 if ((IDsicsi->
Z == Zref) && (IDsicsi->
A == (Aref + 1))
741 if ((IDsicsi->
Z == Zref) && (IDsicsi->
A == (Aref - 1))
747 if (IDsicsi->
Z == Zref &&
TMath::Abs(IDsicsi->
A - Aref) < 2) {
750 else if (IDsicsi->
Z < Zref || (IDsicsi->
Z == Zref && IDsicsi->
A < (Aref - 1))) {
752 IDsicsi->
SetComment(
"CsI-R/L & Si-CsI identifications not coherent");
755 else if (IDsicsi->
Z > Zref || (IDsicsi->
Z == Zref && IDsicsi->
A > (Aref + 1))) {
757 IDsicsi->
SetComment(
"Second particle stopping in Si, identification ChIo-Si required");
762 if (IDcsi->
Z == 4 && IDcsi->
A == 8) {
766 if (IDsicsi->
Z < 3) {
768 IDsicsi->
SetComment(
"CsI-R/L & Si-CsI identifications not coherent");
771 else if (IDsicsi->
Z == 3) {
776 IDsicsi->
SetComment(
"Second particle stopping in Si, identification ChIo-Si required");
781 if (IDsicsi->
Z == Zref) {
784 else if (IDsicsi->
Z < Zref) {
786 IDsicsi->
SetComment(
"CsI-R/L & Si-CsI identifications not coherent");
792 IDsicsi->
SetComment(
"Second particle stopping in Si, identification ChIo-Si required");
834 if (IDcsi && !IDcsi->
IDOK) {
835 if (IDcicsi && IDcicsi->
IDOK) {
842 if (IDcsi && IDcsi->
IDOK) {
854 if (IDcicsi && IDcicsi->
IDOK) {
859 IDcicsi->
SetComment(
"Possible pile-up in ChIo");
880 IDcsi = IDsilicsi = IDsi75sili = IDcisi75 = IDcicsi = 0;
892 Bool_t haveSiLiCsI = IDsilicsi && IDsilicsi->
IDOK;
893 Bool_t haveChIoCsI = IDcicsi && IDcicsi->
IDOK;
894 Bool_t haveSi75SiLi = IDsi75sili && IDsi75sili->
IDOK;
895 Bool_t haveChIoSi75 = IDcisi75 && IDcisi75->
IDOK;
901 if (haveCsI && !haveSiLiCsI && !haveSi75SiLi)
925 if (IDsi75sili->
Z > theID.
Z) {
930 IDcisi75->
SetComment(
"CsI identification with another particle stopped in Si75");
935 IDsi75sili->
SetComment(
"CsI identification with another particle stopped in SiLi");
941 else if (haveChIoSi75) {
943 if (IDcisi75->
Z > theID.
Z) {
945 IDcisi75->
SetComment(
"CsI identification with another particle stopped in Si75");
951 else if (haveSiLiCsI) {
955 if (IDcisi75->
Z > theID.
Z) {
957 IDcisi75->
SetComment(
"CsI identification with another particle stopped in Si75");
963 else if (haveChIoCsI) {
981 else if (haveChIoSi75) {
1037 Obsolete(
"Identify",
"1.13",
"1.15");
1366 stopped_in_silicon =
kFALSE;
1395 if (stopped_in_silicon) {
1396 si_transmission =
kFALSE;
1415 if (!stopped_in_silicon) {
1548 stopped_in_chio =
kFALSE;
1567 si_transmission =
kFALSE;
1592 si_transmission =
kFALSE;
1623 if (stopped_in_chio) {
1624 ci_transmission =
kFALSE;
1631 if (!stopped_in_chio && ERES > 0) {
1637 if (!stopped_in_chio && ERES > 0) {
char * Form(const char *fmt,...)
virtual const Char_t * GetType() const
Ionisation chamber detectors of the INDRA multidetector array.
CsI(Tl) scintillation detectors of the INDRA multidetector array.
Double_t GetCorrectedEnergy(KVNucleus *, Double_t lum=-1., Bool_t transmission=kTRUE)
void SetACQParams();
const Char_t * GetDataSetEnv(const Char_t *type, const Char_t *defval="") const
Base class for detector geometry description.
virtual Double_t GetMaxDeltaE(Int_t Z, Int_t A)
virtual Double_t GetEnergy() const
Double_t GetDetectorSignalValue(const KVString &type, const KVNameValueList ¶ms="") const
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)
Base class for all detectors or associations of detectors in array which can identify charged particl...
virtual Double_t GetIDMapY(Option_t *opt="")
virtual Double_t GetPedestalY(Option_t *opt="")
virtual Double_t GetMeanDEFromID(Int_t &status, Int_t Z, Int_t A=-1, Double_t Eres=-1.0)
const Char_t * GetEStatus()
Give an explanation for the calibration code.
void Clear(Option_t *opt="")
resets all id subcodes.
const Char_t * GetIDStatus()
Give an explanation for the ID code.
Nuclei reconstructed from data measured in the INDRA array.
Bool_t StoppedInSi()
Returns kTRUE if particle stopped in Si detector.
Bool_t StoppedInChIo()
Returns kTRUE if particle stopped in ChIo detector.
void CalculateSi75DEFromResidualEnergy(Double_t ERES)
virtual Bool_t CoherencyEtalons(KVIdentificationResult &theID)
Called by Identify() for particles stopping in etalon modules of Rings 10-17.
Bool_t fCorrectCalib
set to kTRUE in Streamer if calibration needs correction
Bool_t fCoherentSi75SiLiCsI
coherency of Si75-SiLi and SiLi-CsI/CsI identifications
const Char_t * GetIDSubCodeString(const Char_t *id_tel_type="") const
Float_t fESi
si contribution to energy
Bool_t fPileupChIo
apparent pileup in ChIo, revealed by inconsistency between CsI & ChIo-CsI identifications
KVINDRACodes fCodes
VEDA6-style calibration and identification codes.
virtual Bool_t CoherencySiCsI(KVIdentificationResult &theID)
Bool_t fPileupSi75
apparent pileup in Si75, revealed by inconsistency between CsI/SiLi-CsI & ChIo-Si75 identifications
UInt_t GetRingNumber(void) const
void DoNeutronCalibration()
virtual void Clear(Option_t *t="")
reset nucleus' properties
virtual void Copy(TObject &) const
void DoGammaCalibration()
no calibration is performed for gammas
void SetBadCalibrationStatus()
void CalculateSiLiDEFromResidualEnergy(Double_t ERES)
Float_t fECsI
csi contribution to energy
Bool_t StoppedInCsI()
Returns kTRUE if particle stopped in CsI detector.
virtual Bool_t CoherencyChIoCsI(KVIdentificationResult &theID)
void init()
default initialisations
Bool_t fPileupSiLi
apparent pileup in SiLi, revealed by inconsistency between CsI & Si75-SiLi identifications
Bool_t StoppedInSi75()
Returns kTRUE if particle stopped in Si75 detector.
void Print(Option_t *option="") const
virtual void CalibrateRings1To9()
KVINDRAReconNuc()
default ctor
Bool_t CalculateSiliconDEFromResidualEnergy()
Bool_t fUseFullChIoEnergyForCalib
decided by coherency analysis
Int_t GetIDSubCode(const Char_t *id_tel_type="") const
Float_t fESiLi
sili contribution to energy
virtual void CalibrateRings10To17()
UInt_t GetModuleNumber(void) const
void DoBeryllium8Calibration()
void SetNoCalibrationStatus()
Bool_t fPileup
apparent pileup in Si, revealed by inconsistency between CsI & Si-CsI identifications
Float_t fEChIo
chio contribution to energy
virtual Bool_t CoherencyChIoSiCsI(KVIdentificationResult)
virtual ~KVINDRAReconNuc()
dtor
KVINDRACodes & GetCodes() const
void CalculateChIoDEFromResidualEnergy(Double_t ERES)
calculate fEChIo from residual energy
Bool_t fIncludeEtalonsInCalibration
for etalon modules:particle passed through Si75/SiLi
Bool_t fCoherent
coherency of CsI & Si-CsI identifications
void SetECode(UChar_t code_mask)
Float_t fESi75
si75 contribution to energy
Bool_t StoppedInSiLi()
Returns kTRUE if particle stopped in Si detector.
Full result of one attempted particle identification.
Bool_t IDattempted
=kTRUE if identification was attempted
const Char_t * GetComment() const
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 deltaEpedestal
special code for handling particles which give no signal in deltaE
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
virtual Double_t GetTargetEnergyLossCorrection(KVReconstructedNucleus *)
Description of properties and kinematics of atomic nuclei.
void SetMassFormula(UChar_t mt)
Int_t GetZ() const
Return the number of proton / atomic number.
Double_t GetTheta() const
Double_t GetEnergy() const
void SetEnergy(Double_t e)
Nuclei reconstructed from data measured by a detector array .
virtual Double_t GetTargetEnergyLoss() const
KVIdentificationResult * GetIdentificationResult(Int_t i)
virtual void Print(Option_t *option="") const
virtual void Copy(TObject &) const
KVDetector * GetStoppingDetector() const
void SetDetector(int i, KVDetector *);
Bool_t IsCalibrated() const
Bool_t IsIdentified() const
virtual void SetTargetEnergyLoss(Double_t e)
virtual void GetAnglesFromReconstructionTrajectory(Option_t *opt="random")
KVDetector * GetDetector(const TString &label) const
const KVSeqCollection * GetIDTelescopes() const
KVIDTelescope * GetIdentifyingTelescope() const
virtual void Clear(Option_t *option="")
virtual Bool_t IsAMeasured() const
virtual TObject * FindObjectByType(const Char_t *) const
80um silicon detector for INDRA etalon telescopes
2mm + 40um dead zone Si(Li) detector for INDRA etalon telescopes
Silicon detectors of the INDRA array.
virtual void Copy(TObject &object) const
void Obsolete(const char *method, const char *asOfVers, const char *removedFromVers) const
Type GetType(const std::string &Name)