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)
110 fCodes.
Copy(robj.fCodes);
111 robj.fCoherent = fCoherent;
112 robj.fPileup = fPileup;
113 robj.fUseFullChIoEnergyForCalib = fUseFullChIoEnergyForCalib;
116 robj.fEChIo = fEChIo;
117 robj.fESi75 = fESi75;
118 robj.fESiLi = fESiLi;
119 robj.fCorrectCalib = fCorrectCalib;
120 robj.fCoherentSi75SiLiCsI = robj.fCoherentSi75SiLiCsI;
121 robj.fPileupChIo = fPileupChIo;
122 robj.fPileupSiLi = fPileupSiLi;
123 robj.fPileupSi75 = fPileupSi75;
124 robj.fIncludeEtalonsInCalibration = fIncludeEtalonsInCalibration;
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;
148 if (fUseFullChIoEnergyForCalib) cout <<
" ChIo-Si identification 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;
155 if (fIncludeEtalonsInCalibration) cout <<
" WITH Etalon telescopes included in particle trajectory" << 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;
166 if (fUseFullChIoEnergyForCalib) cout <<
" ChIo energy assumed due solely to this particle" << 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;
184 cout <<
" EChIo = " <<
TMath::Abs(fEChIo) <<
" MeV";
185 if (fEChIo < 0) cout <<
" (calculated)";
188 cout <<
" ESi = " <<
TMath::Abs(fESi) <<
" MeV";
189 if (fESi < 0) cout <<
" (calculated)";
191 cout <<
" ECsI = " <<
TMath::Abs(fECsI) <<
" MeV";
192 if (fECsI < 0) cout <<
" (calculated)";
196 cout <<
" EChIo = " <<
TMath::Abs(fEChIo) <<
" MeV";
197 if (fEChIo < 0) cout <<
" (calculated)";
199 if (fIncludeEtalonsInCalibration) {
200 cout <<
" ESi75 = " <<
TMath::Abs(fESi75) <<
" MeV";
201 if (fESi75 < 0) cout <<
" (calculated)";
203 cout <<
" ESiLi = " <<
TMath::Abs(fESiLi) <<
" MeV";
204 if (fESiLi < 0) cout <<
" (calculated)";
207 cout <<
" ECsI = " <<
TMath::Abs(fECsI) <<
" MeV";
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()) {
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");
821 fIncludeEtalonsInCalibration =
kFALSE;
825 if (IDcsi && !IDcsi->
IDOK) {
826 if (IDcicsi && IDcicsi->
IDOK) {
833 if (IDcsi && IDcsi->
IDOK) {
845 if (IDcicsi && IDcicsi->
IDOK) {
847 if (IDcicsi->
Z > (Zref + 1) && fUseFullChIoEnergyForCalib
850 IDcicsi->
SetComment(
"Possible pile-up in ChIo");
871 IDcsi = IDsilicsi = IDsi75sili = IDcisi75 = IDcicsi = 0;
880 fIncludeEtalonsInCalibration =
kTRUE;
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)
910 fUseFullChIoEnergyForCalib =
kFALSE;
916 if (IDsi75sili->
Z > theID.
Z) {
921 IDcisi75->
SetComment(
"CsI identification with another particle stopped in Si75");
922 fUseFullChIoEnergyForCalib =
kFALSE;
926 IDsi75sili->
SetComment(
"CsI identification with another particle stopped in SiLi");
927 fUseFullChIoEnergyForCalib =
kFALSE;
932 else if (haveChIoSi75) {
934 if (IDcisi75->
Z > theID.
Z) {
936 IDcisi75->
SetComment(
"CsI identification with another particle stopped in Si75");
937 fUseFullChIoEnergyForCalib =
kFALSE;
942 else if (haveSiLiCsI) {
946 if (IDcisi75->
Z > theID.
Z) {
948 IDcisi75->
SetComment(
"CsI identification with another particle stopped in Si75");
949 fUseFullChIoEnergyForCalib =
kFALSE;
954 else if (haveChIoCsI) {
959 fIncludeEtalonsInCalibration =
kFALSE;
968 if (IDcisi75->
Z > theID.
Z) fPileupChIo =
kTRUE;
972 else if (haveChIoSi75) {
1028 Obsolete(
"Identify",
"1.13",
"1.15");
1195 void KVINDRAReconNuc::DoGammaCalibration()
1198 SetNoCalibrationStatus();
1208 void KVINDRAReconNuc::DoNeutronCalibration()
1220 SetNoCalibrationStatus();
1232 void KVINDRAReconNuc::DoBeryllium8Calibration()
1250 Bool_t KVINDRAReconNuc::CalculateSiliconDEFromResidualEnergy()
1259 SetBadCalibrationStatus();
1341 fECsI = fESi = fEChIo = 0;
1344 DoGammaCalibration();
1348 DoNeutronCalibration();
1357 stopped_in_silicon =
kFALSE;
1361 DoBeryllium8Calibration();
1367 SetNoCalibrationStatus();
1372 SetBadCalibrationStatus();
1386 if (stopped_in_silicon) {
1387 si_transmission =
kFALSE;
1395 if (!stopped_in_silicon && (
TMath::Abs(fECsI) > 0.0)) {
1396 if (!CalculateSiliconDEFromResidualEnergy())
return;
1400 SetBadCalibrationStatus();
1406 if (!stopped_in_silicon) {
1407 if (!CalculateSiliconDEFromResidualEnergy())
return;
1411 SetNoCalibrationStatus();
1434 CalculateChIoDEFromResidualEnergy(ERES);
1440 CalculateChIoDEFromResidualEnergy(ERES);
1444 SetNoCalibrationStatus();
1458 void KVINDRAReconNuc::CalculateSiLiDEFromResidualEnergy(
Double_t ERES)
1475 void KVINDRAReconNuc::CalculateSi75DEFromResidualEnergy(
Double_t ERES)
1491 void KVINDRAReconNuc::CalculateChIoDEFromResidualEnergy(
Double_t ERES)
1524 fECsI = fEChIo = fESi75 = fESiLi = 0;
1526 DoGammaCalibration();
1534 fUseFullChIoEnergyForCalib =
kTRUE;
1539 stopped_in_chio =
kFALSE;
1542 DoBeryllium8Calibration();
1548 SetBadCalibrationStatus();
1552 if (fIncludeEtalonsInCalibration) {
1558 si_transmission =
kFALSE;
1566 CalculateSiLiDEFromResidualEnergy(ERES);
1569 SetBadCalibrationStatus();
1575 CalculateSiLiDEFromResidualEnergy(ERES);
1583 si_transmission =
kFALSE;
1591 CalculateSi75DEFromResidualEnergy(ERES);
1594 SetBadCalibrationStatus();
1600 CalculateSi75DEFromResidualEnergy(ERES);
1614 if (stopped_in_chio) {
1615 ci_transmission =
kFALSE;
1622 if (!stopped_in_chio && ERES > 0) {
1623 CalculateChIoDEFromResidualEnergy(ERES);
1628 if (!stopped_in_chio && ERES > 0) {
1629 CalculateChIoDEFromResidualEnergy(ERES);
1648 void KVINDRAReconNuc::CheckCsIEnergy()
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
ValType GetDataSetEnv(const Char_t *type, const ValType &defval={}) const
Base class for detector geometry description, interface to energy-loss calculations.
virtual Double_t GetEnergy() const
Double_t GetDetectorSignalValue(const KVString &type, const KVNameValueList ¶ms="") const
virtual void SetEResAfterDetector(Double_t e)
Double_t GetMaxDeltaE(Int_t Z, Int_t A) override
Double_t GetDeltaEFromERes(Int_t Z, Int_t A, Double_t Eres) override
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...
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
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
const Char_t * GetIDSubCodeString(const Char_t *id_tel_type="") const
virtual Bool_t CoherencySiCsI(KVIdentificationResult &theID)
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 StoppedInSi75()
Returns kTRUE if particle stopped in Si75 detector.
virtual void CalibrateRings1To9()
KVINDRAReconNuc()
default ctor
Int_t GetIDSubCode(const Char_t *id_tel_type="") const
virtual void CalibrateRings10To17()
virtual Bool_t CoherencyChIoSiCsI(KVIdentificationResult)
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
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)