9#include <trg/ecl/modules/trgeclDQM/TRGECLDQMModule.h>
10#include <trg/ecl/TrgEclMapping.h>
11#include <trg/ecl/TrgEclCluster.h>
12#include <trg/ecl/TrgEclDataBase.h>
14#include <framework/datastore/StoreArray.h>
16#include <TDirectory.h>
52 TDirectory* oldDir = gDirectory;
53 TDirectory* dirDQM = gDirectory->mkdir(
"TRG",
"",
true);
56 h_TCId =
new TH1D(
"h_TCId",
"[TRGECL] Hit TC ID", 578, 0, 578);
57 h_TCthetaId =
new TH1D(
"h_TCthetaId",
"[TRGECL] Hit TC #theta ID", 19, 0, 19);
58 h_TCphiId_FWD =
new TH1D(
"h_TCphiId_FWD",
"[TRGECL] Hit TC #phi ID in FWD", 34, 0, 34);
59 h_TCphiId_BR =
new TH1D(
"h_TCphiId_BR",
"[TRGECL] Hit TC #phi ID in BR", 38, 0, 38);
60 h_TCphiId_BWD =
new TH1D(
"h_TCphiId_BWD",
"[TRGECL] Hit TC #phi ID in BWD", 34, 0, 34);
61 h_TotalEnergy =
new TH1D(
"h_TotalEnergy",
"[TRGECL] Total TC Energy (ADC)", 100, 0, 3000);
62 h_TCEnergy =
new TH1D(
"h_TCEnergy",
"[TRGECL] TC Energy (ADC)", 100, 0, 1500);
63 h_Narrow_TotalEnergy =
new TH1D(
"h_Narrow_TotalEnergy",
"[TRGECL] Total TC Energy (ADC)", 100, 0, 500);
64 h_Narrow_TCEnergy =
new TH1D(
"h_Narrow_TCEnergy",
"[TRGECL] TC Energy (ADC)", 100, 0, 100);
65 h_n_TChit_event =
new TH1D(
"h_n_TChit_event",
"[TRGECL] N(TC) ", 50, 0, 50);
66 h_n_TChit_clean =
new TH1D(
"h_n_TChit_clean",
"[TRGECL] N(TC) (Injection BG Clean)", 300, 0, 300);
67 h_n_TChit_injHER =
new TH1D(
"h_n_TChit_injHER",
"[TRGECL] N(TC) (HER Injection BG)", 300, 0, 300);
68 h_n_TChit_injLER =
new TH1D(
"h_n_TChit_injLER",
"[TRGECL] N(TC) (LER Injection BG)", 300, 0, 300);
69 h_nTChit_injtime =
new TH2D(
"h_nTChit_injtime",
"[TRGECL] N(TC) vs. Time since injection", 201, 0, 200, 100, 0, 50);
71 h_n_TChit_clean_2clk =
new TH1D(
"h_n_TChit_clean_2clk",
"[TRGECL] N(TC_2clk) (Injection BG Clean)", 300, 0, 300);
72 h_n_TChit_injHER_2clk =
new TH1D(
"h_n_TChit_injHER_2clk",
"[TRGECL] N(TC_2clk) (HER Injection BG)", 300, 0, 300);
73 h_n_TChit_injLER_2clk =
new TH1D(
"h_n_TChit_injLER_2clk",
"[TRGECL] N(TC_2clk) (LER Injection BG)", 300, 0, 300);
74 h_nTChit_injtime_2clk =
new TH2D(
"h_nTChit_injtime_2clk",
"[TRGECL] N(TC_2clk) vs. Time since injection", 201, 0, 200, 100, 0, 50);
75 h_Cluster =
new TH1D(
"h_Cluster",
"[TRGECL] N(Cluster) ", 20, 0, 20);
76 h_TCTiming =
new TH1D(
"h_TCTiming",
"[TRGECL] TC Timing (ns)", 100, 3010, 3210);
77 h_TRGTiming =
new TH1D(
"h_TRGTiming",
"[TRGECL] TRG Timing (ns)", 100, 3010, 3210);
78 h_Cal_TCTiming =
new TH1D(
"h_Cal_TCTiming",
"[TRGECL] Cal TC Timing (ns)", 100, -400, 400);
79 h_Cal_TRGTiming =
new TH1D(
"h_Cal_TRGTiming",
"[TRGECL] TRG Timing (ns)", 100, -400, 400);
80 h_ECL_TriggerBit =
new TH1D(
"h_ECL_TriggerBit",
"[TRGECL] ECL Trigger Bit", 29, 0, 29);
81 h_Cluster_Energy_Sum =
new TH1D(
"h_Cluster_Energy_Sum",
"[TRGECL] Energy Sum of 2 Clusters (ADC)", 300, 0, 3000);
87 const char* label[44] = {
"Hit",
"Timing Source(FWD)",
"Timing Source(BR)",
"Timing Source(BWD)",
"physics Trigger",
"2D Bhabha Veto",
"3D Bhabha veto",
"3D Bhabha Selection",
"E Low",
"E High",
"E LOM",
"Cluster Overflow",
"Low multi bit 0",
"Low multi bit 1",
"Low multi bit 2",
"Low multi bit 3",
"Low multi bit 4",
"Low multi bit 5",
"Low multi bit 6",
"Low multi bit 7",
"Low multi bit 8",
"Low multi bit 9",
"Low multi bit 10",
"Low multi bit 11",
"Low multi bit 12",
"Low multi bit 13",
"mumu bit",
"prescale bit",
"ECL burst bit",
"2D Bhabha bit 1",
"2D Bhabha bit 2",
"2D Bhabha bit 3",
"2D Bhabha bit 4",
"2D Bhabha bit 5",
"2D Bhabha bit 6",
"2D Bhabha bit 7",
"2D Bhabha bit 8",
"2D Bhabha bit 9",
"2D Bhabha bit 10",
"2D Bhabha bit 11",
"2D Bhabha bit 12",
"2D Bhabha bit 13",
"2D Bhabha bit 14"};
90 for (
int j = 0; j < 29; j++) {
137 double HitRevoFam = 0;
138 double HitRevoTrg = 0;
139 double HitFineTiming = 0;
140 double HitRevoEvtTiming = 0;
141 double HitCalTiming = 0;
147 HitFineTiming = aTRGECLUnpackerEvtStore -> getEvtTime();
148 HitRevoTrg = aTRGECLUnpackerEvtStore -> getL1Revo();
149 HitRevoEvtTiming = aTRGECLUnpackerEvtStore -> getEvtRevo();
150 CheckSum = aTRGECLUnpackerEvtStore -> getEvtExist() ;
158 if (CheckSum == 0) {
return;}
164 int TCID = (aTRGECLUnpackerStore->
getTCId());
165 int hit_win = aTRGECLUnpackerStore -> getHitWin();
166 HitEnergy = aTRGECLUnpackerStore -> getTCEnergy();
167 HitTiming = aTRGECLUnpackerStore ->
getTCTime();
169 if (TCID < 1 || TCID > 576 || HitEnergy == 0) {
continue;}
170 if (!(hit_win == 3 || hit_win == 4)) {
continue;}
172 HitRevoFam = aTRGECLUnpackerStore-> getRevoFAM() ;
174 TCId.push_back(TCID);
183 if (
TCId.size() == 0) {
return;}
210 std::vector<int> trgbit ;
211 trgbit.resize(44, 0);
218 b1type = aTRGECLUnpackerSumStore -> getBhabhaType();
219 b2v = aTRGECLUnpackerSumStore -> get3DBhabhaV();
220 b2s = aTRGECLUnpackerSumStore -> get3DBhabhaS() ;
221 etot = aTRGECLUnpackerSumStore -> getEtotType();
222 clover = aTRGECLUnpackerSumStore -> getICNOver();
223 vlm = aTRGECLUnpackerSumStore -> getLowMulti();
224 mu = aTRGECLUnpackerSumStore -> getMumu();
225 pre = aTRGECLUnpackerSumStore -> getPrescale();
226 eclburst = aTRGECLUnpackerSumStore -> getECLBST();
230 trgbit[1] = tsource & 0x1;
231 trgbit[2] = (tsource >> 1) & 0x1;
232 trgbit[3] = (tsource >> 2) & 0x1;
237 trgbit[8] = etot & 0x1;
238 trgbit[9] = (etot >> 1) & 0x1;
239 trgbit[10] = (etot >> 2) & 0x1;
242 for (
int j = 0; j < 14; j++) {
243 trgbit[12 + j] = (vlm >> j) & 0x1;
248 trgbit[28] = eclburst;
250 trgbit[29] = b1type & 0x1;
251 trgbit[30] = (b1type >> 1) & 0x1;
252 trgbit[31] = (b1type >> 2) & 0x1;
253 trgbit[32] = (b1type >> 3) & 0x1;
254 trgbit[33] = (b1type >> 4) & 0x1;
255 trgbit[34] = (b1type >> 5) & 0x1;
256 trgbit[35] = (b1type >> 6) & 0x1;
257 trgbit[36] = (b1type >> 7) & 0x1;
258 trgbit[37] = (b1type >> 8) & 0x1;
259 trgbit[38] = (b1type >> 9) & 0x1;
260 trgbit[39] = (b1type >> 10) & 0x1;
261 trgbit[40] = (b1type >> 11) & 0x1;
262 trgbit[41] = (b1type >> 12) & 0x1;
263 trgbit[42] = (b1type >> 13) & 0x1;
264 trgbit[43] = (b1type >> 14) & 0x1;
269 for (
int j = 0; j < 29; j++) {
284 std::vector<double> ClusterTiming;
285 std::vector<double> ClusterEnergy;
286 std::vector<int> MaxTCId;
287 ClusterTiming.clear();
288 ClusterEnergy.clear();
295 double clustertiming = aTRGECLCluster -> getTimeAve();
296 ClusterTiming.push_back(clustertiming);
297 ClusterEnergy.push_back(clusterenergy);
298 MaxTCId.push_back(maxTCId);
302 std::vector<double> maxClusterEnergy;
303 std::vector<double> maxClusterTiming;
304 std::vector<int> maxCenterTCId;
305 maxClusterTiming.clear();
306 maxClusterEnergy.clear();
307 maxCenterTCId.clear();
309 maxClusterEnergy.resize(2, 0.0);
310 maxClusterTiming.resize(2, 0.0);
311 maxCenterTCId.resize(2, 0.0);
312 const int cl_size = ClusterEnergy.size();
313 for (
int icl = 0; icl < cl_size; icl++) {
314 if (maxClusterEnergy[0] < ClusterEnergy[icl]) {
315 maxClusterEnergy[0] = ClusterEnergy[icl];
316 maxClusterTiming[0] = ClusterTiming[icl];
317 maxCenterTCId[0] = MaxTCId[icl];
318 }
else if (maxClusterEnergy[1] < ClusterEnergy[icl]) {
319 maxClusterEnergy[1] = ClusterEnergy[icl];
320 maxClusterTiming[1] = ClusterTiming[icl];
321 maxCenterTCId[1] = MaxTCId[icl];
328 std::vector<double> _3DBhabhaThreshold;
329 _3DBhabhaThreshold = {30, 45};
332 bool BtoBFlag =
false;
333 bool BhabhaFlag =
false;
336 int energy1 = 15 & lut1;
337 int energy2 = 15 & lut2;
340 int phi1 = 511 & lut1;
341 int phi2 = 511 & lut2;
346 int dphi = abs(phi1 - phi2);
347 if (dphi > 180) {dphi = 360 - dphi;}
348 int thetaSum = theta1 + theta2;
349 if (dphi > 160 && thetaSum > 165 && thetaSum < 190) {BtoBFlag =
true;}
351 if ((maxClusterEnergy[0] * 0.1) > _3DBhabhaThreshold[0] * energy1
352 && (maxClusterEnergy[1] * 0.1) > _3DBhabhaThreshold[0] * (energy2)
353 && ((maxClusterEnergy[0] * 0.1) > _3DBhabhaThreshold[1] * energy1
354 || (maxClusterEnergy[1] * 0.1) > _3DBhabhaThreshold[1] * (energy2))) {
355 if (BtoBFlag) {BhabhaFlag =
true;}
364 const int NofTCHit =
TCId.size();
366 int NofTCHitPerClk[8] = {0};
367 double totalEnergy = 0;
370 double caltrgtiming = 0;
374 diff =
m_trgTime->getTimeSinceLastInjectionInMicroSeconds() / 1000.;
377 for (
int ihit = 0; ihit < NofTCHit ; ihit ++) {
381 if (a->getTCThetaIdFromTCId(
TCId[ihit]) < 4) {
383 }
else if (a->getTCThetaIdFromTCId(
TCId[ihit]) > 3 && a->getTCThetaIdFromTCId(
TCId[ihit]) < 16) {
400 double timing = 8 * HitRevoTrg - (128 *
RevoFAM[ihit] +
TCTiming[ihit]);
401 if (timing < 0) {timing = timing + 10240;}
406 const double revotime_in_us = 5.120 /
m_hwclkdb->getAcceleratorRF();
408 double running_in_us, diff_in_us;
410 diff_in_us = diff * 1000.;
411 quotient = diff_in_us / revotime_in_us;
412 running_in_us = diff_in_us - quotient * revotime_in_us;
414 bool cond_clean, cond_injHER, cond_injLER;
416 cond_clean = (6 < running_in_us && running_in_us < 8) && (50 < diff && diff < 70);
418 cond_injHER = isHER && ((diff < 0.5) || ((diff < 20) && (2 < running_in_us && running_in_us < 3)));
419 cond_injLER = !isHER && ((diff < 0.5) || ((diff < 20) && (1 < running_in_us && running_in_us < 2)));
426 }
else if (cond_injHER) {
428 }
else if (cond_injLER) {
432 const int grouping_num = 2;
433 for (
int iclk = 0; iclk < 8 - (grouping_num - 1); iclk++) {
435 for (
int igrp = 0; igrp < grouping_num; igrp++)
436 group_tcnum += NofTCHitPerClk[iclk + igrp];
443 }
else if (cond_injHER) {
445 }
else if (cond_injLER) {
450 double trgtiming = 8 * HitRevoTrg - (128 * HitRevoEvtTiming + HitFineTiming);
452 if (trgtiming < 0) {trgtiming = trgtiming + 10240;}
HistoModule.h is supposed to be used instead of Module.h for the modules with histogram definitions t...
void setDescription(const std::string &description)
Sets the description of the module.
void setPropertyFlags(unsigned int propertyFlags)
Sets the flags for the module properties.
@ c_ParallelProcessingCertified
This module can be run in parallel processing mode safely (All I/O must be done through the data stor...
double getEnergyDep() const
The method to get deposited energy.
int getMaxTCId() const
The method to get the Maximum(center) TC id.
TH1 * h_n_TChit_clean
N of TC Hit / event vs. time since injection.
std::vector< double > TCEnergy
Hit TC Energy.
TH1 * h_n_TChit_clean_2clk
N of TC Hit / event vs. time since injection per two ETM clocks.
TH1 * h_TCId
TCId histogram.
TH1 * h_TCphiId_BWD
TCphiId histogram.
TH1 * h_Narrow_TotalEnergy
Total Energy on narrow range.
TH1 * h_TotalEnergy
Total Energy.
TH1 * h_n_TChit_event_2clk
N of TC Hit / event per two ETM clocks.
TH1 * h_Cluster
N of Cluster / event.
virtual void initialize() override
initialize
StoreArray< TRGECLUnpackerStore > trgeclHitArray
Trg ECL Unpakcer TC output.
virtual void event() override
Event.
TH1 * h_Cal_TRGTiming
Event Timing / event.
TRGECLDQMModule()
Costructor.
TH1 * h_n_TChit_injHER
N of TC Hit / events in the injection BG clean region vs. time since injection.
TH1 * h_Narrow_TCEnergy
TC Energy histogram on narrow range.
virtual void endRun() override
End Run.
DBObjPtr< HardwareClockSettings > m_hwclkdb
DB pointerto access the hardware clock information.
TH1 * h_Cluster_Energy_Sum
Energy sum of 2 Top energetic clusters when 3D bhabnha bit on.
virtual void terminate() override
terminate
virtual ~TRGECLDQMModule()
Destrunctor.
std::vector< int > TCHitWin
Hit TCHitWin.
TH1 * h_TCphiId_FWD
TCphiId histogram.
TH1 * h_TRGTiming
Event Timing / event.
TH2 * h_nTChit_injtime
N of TC Hit / events in the LER injection BG region vs. time since injection.
TH1 * h_ECL_TriggerBit
ECL Trigger Bit.
std::vector< double > TCTiming
Hit TC Timing.
TH1 * h_n_TChit_injLER_2clk
N of TC Hit / events in the HER injection BG region vs. time since injection per two ETM clocks.
TH1 * h_n_TChit_injHER_2clk
N of TC Hit / events in the injection BG clean region vs. time since injection per two ETM clocks.
StoreArray< TRGECLUnpackerEvtStore > trgeclEvtArray
Trg ECL Unpakcer Event output.
TH1 * h_TCthetaId
TCthetaId histogram.
virtual void beginRun() override
begin Run
StoreArray< TRGECLUnpackerSumStore > trgeclSumArray
Trg Ecl Unpacker Summary output.
TH1 * h_TCphiId_BR
TCphiId histogram.
TH2 * h_nTChit_injtime_2clk
N of TC Hit / events in the LER injection BG region vs. time since injection per two ETM clocks.
TH1 * h_Cal_TCTiming
TC Timing / event.
TH1 * h_TCEnergy
TC Energy.
std::vector< double > FineTiming
Event Timing.
std::vector< double > RevoTrg
GDL Revolution Clk.
TH1 * h_TCTiming
TC Timing / event.
TH1 * h_n_TChit_event
N of TC Hit / event.
std::vector< double > RevoFAM
FAM Revolution Clk.
TH1 * h_n_TChit_injLER
N of TC Hit / events in the HER injection BG region vs. time since injection.
StoreArray< TRGECLCluster > trgeclCluster
Trg ECL Cluster output.
StoreObjPtr< EventLevelTriggerTimeInfo > m_trgTime
Array to access the FTSW information.
std::vector< int > TCId
Hit TCId.
virtual void defineHisto() override
Define Histogram.
int getTCCALTime() const
The method to get cal timing.
int getTCId() const
The method to get cell id.
int getTCTime() const
The method to get hit average time.
int get2DBhabha() const
The mothod to get 2D Bhabha bit.
int getPhysics() const
The mothod to get Physics bit.
int getTimeType() const
The mothod to get Timing Type.
A Class of ECL Trigger clustering
void setICN(const std::vector< int > &)
set ICN for each part(Fw,Br,Bw)
int getNofCluster()
0 : center , 1; upper , 2: right , 3: lower , 4: lower right
int Get3DBhabhaLUT(int)
TC CM Phi
#define REG_MODULE(moduleName)
Register the given module (without 'Module' suffix) with the framework.
Abstract base class for different kinds of events.