9 #include <framework/datastore/StoreArray.h>
11 #include <framework/logging/Logger.h>
12 #include "trg/ecl/TrgEclFAMFit.h"
14 #include "trg/ecl/dataobjects/TRGECLHit.h"
15 #include "trg/ecl/dataobjects/TRGECLDigi0.h"
16 #include "trg/ecl/dataobjects/TRGECLFAMAna.h"
28 TrgEclFAMFit::TrgEclFAMFit(): _BeamBkgTag(0), _AnaTag(0), EventId(0)
95 double* TCFitSample =
new double [12];
96 double* preped =
new double [4];
98 int nbin_pedestal = 4;
99 int fam_sampling_interval = 125;
110 double IntervaldT = 125 * 0.001 / Nsmalldt;
112 int FitSleepCounter = 100;
113 int FitSleepThreshold = 2;
119 for (
int iTCIdm = 0; iTCIdm < 576; iTCIdm++) {
123 for (
int iShift = 20; iShift < (NSampling - 12); iShift++) {
126 if (FitSleepCounter <= FitSleepThreshold) {
continue;}
127 for (
int iFitSample = 0; iFitSample < 12; iFitSample++) {
128 int iReplace = iFitSample + iShift;
129 TCFitSample[iFitSample] = digiEnergy[iTCIdm][iReplace] * 1000.0;
131 if (pedFlag == 1 && iFitSample < 4) {
132 TCFitSample[iFitSample] = preped[iFitSample];
141 dTBin = (int)(ShiftdTBin + Nsmalldt);
142 if (dTBin < 1) {dTBin = 1;}
143 if (dTBin > 20) {dTBin = 20;}
148 for (
int iFitSample = 0; iFitSample < 12; iFitSample++) {
149 CoeffAAA +=
CoeffNoise31[dTBin - 1][iFitSample] * TCFitSample[iFitSample];
150 CoeffBBB +=
CoeffNoise32[dTBin - 1][iFitSample] * TCFitSample[iFitSample];
151 CoeffPPP +=
CoeffNoise33[dTBin - 1][iFitSample] * TCFitSample[iFitSample];
153 double deltaT = CoeffBBB / CoeffAAA;
155 ShiftdTBin = int(deltaT / IntervaldT + dTBin);
162 double condition_t = -(deltaT + dTBin * IntervaldT - fam_sampling_interval * 0.001);
164 if (fabs(condition_t) < 0.8 * (fam_sampling_interval * 0.001) && FitE >
Threshold[iTCIdm]) {
165 FitT = condition_t + (SmallOffset + iShift + nbin_pedestal - 5) * (fam_sampling_interval * 0.001);
169 double rand_sampling_correction = digiTiming[iTCIdm][iShift] + (nbin_pedestal - iShift + 32) * fam_sampling_interval;
185 delete [] TCFitSample;
202 int ta_id[20] = {1000};
203 double ttt_a[20] = {0};
204 double ttt_b[20] = {0};
205 for (
int iTCIdm = 0; iTCIdm < 576; iTCIdm++) {
209 int maxId[500] = {0};
210 for (
int iii = 0 ; iii < 500 ; iii++) {
220 for (
int iSampling = 1; iSampling < NSampling; iSampling++) {
225 if (TCDigiE[iTCIdm][iSampling] >= max) {
227 max = TCDigiE[iTCIdm][iSampling];
228 maxId[noutput] = iSampling;
233 if (count_down >= flag_down) {
234 if (count_up >= flag_up) {
240 double NoiseLevel = 0;
241 double NoiseCount = 0;
242 for (
int iNoise = 0; iNoise < 5; iNoise++) {
243 int iNoiseReplace = (maxId[noutput] - 10) + iNoise;
244 if (iNoiseReplace >= 0) {
245 NoiseLevel += TCDigiE[iTCIdm][iNoiseReplace];
249 if (NoiseCount != 0) { NoiseLevel /= NoiseCount; }
251 TCFitEnergy[iTCIdm].push_back(TCDigiE[iTCIdm][maxId[noutput]] - NoiseLevel);
252 if (!(maxId[noutput] - 1)) {
253 for (
int jSampling = 1; jSampling < maxId[noutput] + 3; jSampling++) {
254 TCDigiE[iTCIdm][jSampling] -= NoiseLevel;
257 for (
int jSampling = maxId[noutput] - 1; jSampling < maxId[noutput] + 3; jSampling++) {
258 TCDigiE[iTCIdm][jSampling] -= NoiseLevel;
262 for (
int iSearch = 0; iSearch < 5; iSearch++) {
264 if (TCDigiE[iTCIdm][maxId[noutput] - iSearch] > 0.6 *
TCFitEnergy[iTCIdm][noutput] &&
265 TCDigiE[iTCIdm][maxId[noutput] - iSearch - 1] < 0.6 *
TCFitEnergy[iTCIdm][noutput]) {
266 ta_id[noutput] = maxId[noutput] - iSearch - 1;
271 if (ta_id[noutput] == 1000) {
272 printf(
"TrgEclFAMFit::digi02> Cannot find TC Timing (TCId=%5i, E=%8.5f)!!!\n", iTCIdm - 1,
TCFitEnergy[iTCIdm][0]);
273 B2ERROR(
"TrgEclFAMFit::digi02> Cannot find TC Timing");
275 ttt_a[noutput] = TCDigiT[iTCIdm][ta_id[noutput]];
276 ttt_b[noutput] = TCDigiT[iTCIdm][ta_id[noutput] + 1];
278 (0.6 *
TCFitEnergy[iTCIdm][noutput] - TCDigiE[iTCIdm][ta_id[noutput]]) * (ttt_b[noutput] -
280 / (TCDigiE[iTCIdm][ta_id[noutput] + 1] - TCDigiE[iTCIdm][ta_id[noutput]])) - (278.7 + 2) + (
_DataBase->
GetTCFLatency(iTCIdm + 1)));
320 float max_shape_time = 563.48;
322 for (
int iTCIdm = 0; iTCIdm < 576; iTCIdm++) {
324 int maxId[500] = {0};
330 for (
int iSampling = 1; iSampling < NSampling; iSampling++) {
332 if (TCDigiEnergy[iTCIdm][iSampling] >= max) {
334 max = TCDigiEnergy[iTCIdm][iSampling];
335 maxId[noutput] = iSampling;
340 if (count_down >= flag_down) {
341 if (count_up >= flag_up) {
347 float NoiseLevel = 0;
348 float NoiseCount = 0;
349 for (
int iNoise = 0; iNoise < 42; iNoise++) {
350 int iNoiseReplace = (maxId[noutput] - 88) + iNoise;
351 if (iNoiseReplace >= 0) {
352 NoiseLevel += TCDigiEnergy[iTCIdm][iNoiseReplace];
356 if (NoiseCount != 0) { NoiseLevel /= NoiseCount; }
357 TCFitEnergy[iTCIdm].push_back(TCDigiEnergy[iTCIdm][maxId[noutput]] - NoiseLevel);
380 std::vector<int> TCId;
381 std::vector<double> RawTCTiming;
382 std::vector<double> RawTCEnergy;
383 std::vector<double> RawBeamBkgTag;
384 RawBeamBkgTag.clear();
396 for (
int ii = 0; ii < trgeclDigiArray.
getEntries(); ii++) {
399 if (
EventId != eventid) {
continue;}
400 TCId.push_back(aTRGECLDigi->
getTCId());
401 RawTCTiming.push_back(aTRGECLDigi -> getRawTiming());
402 RawTCEnergy.push_back(aTRGECLDigi -> getRawEnergy());
403 RawBeamBkgTag.push_back(aTRGECLDigi -> getBeamBkgTag());
406 for (
int iTCId = 0; iTCId < 576 ; iTCId ++) {
408 for (
int iHit = 0; iHit < hitsize; iHit++) {
409 const int rawsize = TCId.size();
410 for (
int iDigi = 0; iDigi < rawsize; iDigi++) {
411 if (TCId[iDigi] != (iTCId + 1)) {
continue;}
412 if (abs(
TCFitEnergy[iTCId][iHit] - RawTCEnergy[iDigi]) < 12) {
413 if (abs(
TCFitTiming[iTCId][iHit] - RawTCTiming[iDigi]) < 30) {
414 BeamBkgTag[iTCId].push_back(RawBeamBkgTag[iDigi]);
435 for (
int iTCIdm = 0; iTCIdm < 576; iTCIdm++) {
437 for (
int iHit = 0; iHit < hitsize; iHit++) {
441 TrgEclHitArray[m_hitNum]->setEventId(m_nEvent);
442 TrgEclHitArray[m_hitNum]->setTCId(iTCIdm + 1);
443 TrgEclHitArray[m_hitNum]->setEnergyDep(
TCFitEnergy[iTCIdm][iHit]);
444 TrgEclHitArray[m_hitNum]->setTimeAve(
TCFitTiming[iTCIdm][iHit]);
446 TrgEclHitArray[m_hitNum]->setBeamBkgTag(
BeamBkgTag[iTCIdm][iHit]);
453 for (
int iTCIdm = 0; iTCIdm < 576; iTCIdm++) {
456 for (
int iHit = 0; iHit < hitsize; iHit++) {
460 TrgEclAnaArray[m_hitNum]->setEventId(m_nEvent);
461 TrgEclAnaArray[m_hitNum]->setTCId(iTCIdm + 1);
464 TrgEclAnaArray[m_hitNum]->setRawEnergy(
TCRawEnergy[iTCIdm][iHit]);
465 TrgEclAnaArray[m_hitNum]->setRawTiming(
TCRawTiming[iTCIdm][iHit]);
469 int ene_i0 = (int)(
TCFitEnergy[iTCIdm][iHit] * 100000.0 / p_ene2adc);
470 double ene_d = (double) ene_i0 * p_ene2adc / 100000;
471 TrgEclAnaArray[m_hitNum]->setFitEnergy(ene_d);
473 TrgEclAnaArray[m_hitNum]->setFitTiming(
TCFitTiming[iTCIdm][iHit]);
474 TrgEclAnaArray[m_hitNum]->setBeamBkgTag(
BeamBkgTag[iTCIdm][iHit]);
Accessor to arrays stored in the data store.
T * appendNew()
Construct a new T object at the end of the array.
int getEntries() const
Get the number of objects in the array.
Raw TC result nefor digitizing.
int getEventId() const
Get event id.
int getTCId() const
Get TC id.
double GetTCFLatency(int)
TC flight time latency
int _BeamBkgTag
Add beambkg.
std::vector< std::vector< double > > CoeffSigPDF1
Coeffisients of signal PDF1.
void save(int)
save fitting result into tables
std::vector< std::vector< int > > BeamBkgTag
fit timing
int _AnaTag
Fill Analysis table.
void setup(int)
setup fam module
std::vector< std::vector< double > > CoeffNoise32
Coeffisient of noise 2.
std::vector< std::vector< double > > TCFitEnergy
fit energy
std::vector< std::vector< double > > CoeffSigPDF0
Coeffisients of signal PDF0
std::vector< std::vector< double > > TCFitTiming
fit timing
TrgEclDataBase * _DataBase
Object of DataBase.
std::vector< std::vector< double > > TCRawTiming
Raw timing.
std::vector< std::vector< double > > CoeffNoise31
Coeffisients of noise 1.
void FAMFit03(std::vector< std::vector< double >>, std::vector< std::vector< double >>)
function for backup2
void SetBeamBkgTag()
Set Beam Background Tag.
virtual ~TrgEclFAMFit()
Destructor.
std::vector< std::vector< double > > CoeffNoise33
Coeffisient of noise 3
std::vector< double > TCLatency
TC Latency.
void FAMFit01(std::vector< std::vector< double >>, std::vector< std::vector< double >>)
function for fitting
std::vector< std::vector< double > > TCRawEnergy
Raw energy.
void FAMFit02(std::vector< std::vector< double >>, std::vector< std::vector< double >>)
function for backup 1
int EventId
Fill Analysis table.
std::vector< int > Threshold
Threshold (MeV)
TrgEclMapping * _TCMap
Object of TC Mapping.
int getTCThetaIdFromTCId(int)
get [TC Theta ID] from [TC ID]
int getTCPhiIdFromTCId(int)
get [TC Phi ID] from [TC ID]
Abstract base class for different kinds of events.