19 #include "KVDataSet.h"
20 #include "KVINDRAReconNuc.h"
21 #include "KVIDTelescope.h"
23 #include "KVMultiDetArray.h"
24 #include "KVSilicon.h"
29 #include <KVIDGChIoSi.h>
31 #include <KVIDGChIoSi.h>
50 fUseFullChIoEnergyForCalib =
kTRUE;
51 fECsI = fESi = fEChIo = fESi75 = fESiLi = 0.;
56 fIncludeEtalonsInCalibration =
kFALSE;
80 #if ROOT_VERSION_CODE >= ROOT_VERSION(3,4,0)
92 KVINDRAReconNuc::~KVINDRAReconNuc()
100 #if ROOT_VERSION_CODE >= ROOT_VERSION(3,4,0)
138 cout <<
"KVINDRAReconNuc: fRing=" <<
GetRingNumber() <<
" fModule=" <<
142 cout <<
" -- RESULTS OF COHERENCY TESTS (RINGS 1-9) -- " << endl;
143 if (
fCoherent) cout <<
" CsI-R/L & Si-CsI identifications COHERENT" << endl;
144 else cout <<
" CsI-R/L & Si-CsI identifications NOT COHERENT" << endl;
145 if (
fPileup) cout <<
" Si energy loss indicates PILEUP" << endl;
146 else cout <<
" Si energy loss indicates single particle" << endl;
149 else cout <<
" ChIo-Si identification indicates MULTIPLE CHIO CONTRIBUTIONS" << endl;
154 cout <<
" -- RESULTS OF COHERENCY TESTS (RINGS 10-17) -- " << endl;
156 else cout <<
" WITHOUT etalon telescopes included in particle trajectory" << endl;
158 cout <<
" Analysis indicates PILEUP in ChIo" << endl;
161 cout <<
" Analysis indicates PILEUP in Si75" << endl;
164 cout <<
" Analysis indicates PILEUP in SiLi" << endl;
167 else cout <<
" ChIo energy contribution calculated assuming MULTIPLE CHIO CONTRIBUTIONS" << endl;
169 cout <<
" =======> ";
173 else cout <<
" Zreal=" <<
GetRealZ();
174 cout << endl <<
" Identification code = " << ((
KVINDRAReconNuc*)
this)->
178 cout <<
"(unidentified)" << endl;
185 if (
fEChIo < 0) cout <<
" (calculated)";
189 if (
fESi < 0) cout <<
" (calculated)";
192 if (
fECsI < 0) cout <<
" (calculated)";
197 if (
fEChIo < 0) cout <<
" (calculated)";
201 if (
fESi75 < 0) cout <<
" (calculated)";
204 if (
fESiLi < 0) cout <<
" (calculated)";
208 if (
fECsI < 0) cout <<
" (calculated)";
216 cout <<
"(uncalibrated)" << endl;
219 cout <<
"Analysis : ";
223 "Particle alone in group, or identification independently of other"
225 cout <<
"particles in group is directly possible." << endl;
230 "Particle reconstructed after identification of others in group"
233 "and subtraction of their calculated energy losses in ChIo."
239 "Particle identification estimated after arbitrary sharing of"
242 "energy lost in ChIo between several reconstructed particles."
248 "Particle stopped in first stage of telescope. Estimation of minimum Z."
258 "-------------------------------------------------------------------------------"
516 if (strcmp(id_tel_type,
""))
517 return Form(
"No identification attempted in %s", id_tel_type);
520 Form(
"Particle unidentified. Identifying telescope not set.");
605 if (IDsicsi->
IDOK && !IDcsi->
IDOK) {
621 if ((IDcsi->
Z == 1 || IDcsi->
Z == 2) &&
GetSi()) {
634 if (dE_exp > ped + 5.) {
638 if (idt->
GetIDMapY() < (ped + factor * (dE_exp - ped))) {
696 if (IDcsi->
Z == 4 && IDcsi->
A == 8) {
700 if (IDsicsi->
Z < 2 || (IDsicsi->
Z == 2 && IDsicsi->
A < 7)) {
702 IDsicsi->
SetComment(
"CsI-R/L & Si-CsI identifications not coherent");
705 else if (IDsicsi->
Z == 2 && IDsicsi->
A > 6 && IDsicsi->
A < 10) {
710 else if ((IDsicsi->
Z == 2 && IDsicsi->
A > 9) || (IDsicsi->
Z == 3 && IDsicsi->
A < 6)) {
712 IDsicsi->
SetComment(
"CsI-R/L & Si-CsI identifications not coherent");
715 else if (IDsicsi->
Z == 3 && IDsicsi->
A > 5 && IDsicsi->
A < 9) {
719 else if ((IDsicsi->
Z == 3 && IDsicsi->
A > 8) || IDsicsi->
Z > 3) {
721 IDsicsi->
SetComment(
"Second particle stopping in Si, identification ChIo-Si required");
726 if ((IDsicsi->
Z == Zref) && (IDsicsi->
A == (Aref + 1))
732 if ((IDsicsi->
Z == Zref) && (IDsicsi->
A == (Aref - 1))
738 if (IDsicsi->
Z == Zref &&
TMath::Abs(IDsicsi->
A - Aref) < 2) {
741 else if (IDsicsi->
Z < Zref || (IDsicsi->
Z == Zref && IDsicsi->
A < (Aref - 1))) {
743 IDsicsi->
SetComment(
"CsI-R/L & Si-CsI identifications not coherent");
746 else if (IDsicsi->
Z > Zref || (IDsicsi->
Z == Zref && IDsicsi->
A > (Aref + 1))) {
748 IDsicsi->
SetComment(
"Second particle stopping in Si, identification ChIo-Si required");
753 if (IDcsi->
Z == 4 && IDcsi->
A == 8) {
757 if (IDsicsi->
Z < 3) {
759 IDsicsi->
SetComment(
"CsI-R/L & Si-CsI identifications not coherent");
762 else if (IDsicsi->
Z == 3) {
767 IDsicsi->
SetComment(
"Second particle stopping in Si, identification ChIo-Si required");
772 if (IDsicsi->
Z == Zref) {
775 else if (IDsicsi->
Z < Zref) {
777 IDsicsi->
SetComment(
"CsI-R/L & Si-CsI identifications not coherent");
783 IDsicsi->
SetComment(
"Second particle stopping in Si, identification ChIo-Si required");
825 if (IDcsi && !IDcsi->
IDOK) {
826 if (IDcicsi && IDcicsi->
IDOK) {
833 if (IDcsi && IDcsi->
IDOK) {
845 if (IDcicsi && IDcicsi->
IDOK) {
850 IDcicsi->
SetComment(
"Possible pile-up in ChIo");
871 IDcsi = IDsilicsi = IDsi75sili = IDcisi75 = IDcicsi = 0;
883 Bool_t haveSiLiCsI = IDsilicsi && IDsilicsi->
IDOK;
884 Bool_t haveChIoCsI = IDcicsi && IDcicsi->
IDOK;
885 Bool_t haveSi75SiLi = IDsi75sili && IDsi75sili->
IDOK;
886 Bool_t haveChIoSi75 = IDcisi75 && IDcisi75->
IDOK;
892 if (haveCsI && !haveSiLiCsI && !haveSi75SiLi)
916 if (IDsi75sili->
Z > theID.
Z) {
921 IDcisi75->
SetComment(
"CsI identification with another particle stopped in Si75");
926 IDsi75sili->
SetComment(
"CsI identification with another particle stopped in SiLi");
932 else if (haveChIoSi75) {
934 if (IDcisi75->
Z > theID.
Z) {
936 IDcisi75->
SetComment(
"CsI identification with another particle stopped in Si75");
942 else if (haveSiLiCsI) {
946 if (IDcisi75->
Z > theID.
Z) {
948 IDcisi75->
SetComment(
"CsI identification with another particle stopped in Si75");
954 else if (haveChIoCsI) {
972 else if (haveChIoSi75) {
1028 Obsolete(
"Identify",
"1.13",
"1.15");
1238 Double_t half_light =
GetCsI()->GetDetectorSignalValue(
"TotLight") * 0.5;
1256 fESi =
GetSi()->GetCorrectedEnergy(
this, e0);
1357 stopped_in_silicon =
kFALSE;
1386 if (stopped_in_silicon) {
1387 si_transmission =
kFALSE;
1392 fESi =
GetSi()->GetCorrectedEnergy(
this, -1., si_transmission);
1406 if (!stopped_in_silicon) {
1424 GetChIo()->SetEResAfterDetector(ERES);
1463 GetSiLi()->SetEResAfterDetector(ERES);
1480 GetSi75()->SetEResAfterDetector(ERES);
1495 GetChIo()->SetEResAfterDetector(ERES);
1539 stopped_in_chio =
kFALSE;
1558 si_transmission =
kFALSE;
1561 GetSiLi()->SetEResAfterDetector(ERES);
1563 fESiLi =
GetSiLi()->GetCorrectedEnergy(
this, -1., si_transmission);
1583 si_transmission =
kFALSE;
1586 GetSi75()->SetEResAfterDetector(ERES);
1588 fESi75 =
GetSi75()->GetCorrectedEnergy(
this, -1., si_transmission);
1614 if (stopped_in_chio) {
1615 ci_transmission =
kFALSE;
1618 GetChIo()->SetEResAfterDetector(ERES);
1620 fEChIo =
GetChIo()->GetCorrectedEnergy(
this, -1., ci_transmission);
1622 if (!stopped_in_chio && ERES > 0) {
1628 if (!stopped_in_chio && ERES > 0) {
1656 KVDetector* csi =
GetCsI();
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) override
KVString GetDataSetEnv(const Char_t *type, const Char_t *defval="") const
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="") override
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.
int GetModuleNumber() const
Bool_t StoppedInChIo()
Returns kTRUE if particle stopped in ChIo detector.
int GetRingNumber() const
void CalculateSi75DEFromResidualEnergy(Double_t ERES)
virtual Bool_t CoherencyEtalons(KVIdentificationResult &theID)
Called by Identify() for particles stopping in etalon modules of Rings 10-17.
void SetECode(UChar_t code_mask) override
void Copy(TObject &) const override
void Clear(Option_t *t="") override
reset nucleus' properties
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
void DoNeutronCalibration()
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
KVINDRACodes & GetCodes() const
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.
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()
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)
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
Float_t fESi75
si75 contribution to energy
Bool_t StoppedInSiLi()
Returns kTRUE if particle stopped in Si detector.
void Print(Option_t *option="") const 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)
Bool_t Aident
= kTRUE if A of particle established
Int_t deltaEpedestal
special code for handling particles which give no signal in deltaE
const Char_t * GetComment() const
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.
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 .
KVDetector * GetDetector(const TString &label) const
virtual Double_t GetTargetEnergyLoss() const
Bool_t IsCalibrated() const
KVIdentificationResult * GetIdentificationResult(Int_t i)
void Copy(TObject &) const override
Bool_t IsIdentified() const
void Clear(Option_t *option="") override
const KVSeqCollection * GetIDTelescopes() 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
KVIDTelescope * GetIdentifyingTelescope() const
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)