17 #include <JANA/JApplication.h>
18 #include <JANA/JFactory.h>
20 #include <TDirectory.h>
59 dTrigBits.push_back(1);
60 dTrigBits.push_back(2);
61 dTrigBits.push_back(4);
62 dTrigBits.push_back(8);
63 dTrigBits.push_back(16);
64 dTrigBits.push_back(32);
65 dTrigBits.push_back(64);
67 dFPTrigBits.push_back(4);
68 dFPTrigBits.push_back(256);
69 dFPTrigBits.push_back(512);
70 dFPTrigBits.push_back(2048);
74 TDirectory *
mainDir = gDirectory;
75 new TDirectoryFile(
"TS_scaler",
"TS_scaler");
76 gDirectory->cd(
"TS_scaler");
77 dHistTS_trgbits =
new TH1I(
"HistTS_trgbits",
"Trigger Bits",150,0,150);
78 dHistTS_trgbits->SetXTitle(
"trig_mask || (128+fp_trig_mask/256)");
79 dHistTS_trgbits->SetYTitle(
"counts");
80 dHistTS_livetime_tot =
new TH1I(
"HistTS_livetime",
"Total Livetime", 100, 0., 1.);
81 dHistTS_liveinst_tot =
new TH1I(
"HistTS_liveinst_tot",
"Total Livetime Instantaneous", 100, 0., 1.);
83 double locMaxEvents = 300e6;
84 double locNeventsBins = 300;
85 dHistTS_SyncEvents =
new TH1I(
"HistTS_SyncEvents",
"Sync events counter in interval; Event Number", locNeventsBins, 0, locMaxEvents);
86 dHistTS_livetimeEvents =
new TH1I(
"HistTS_livetimeEvents",
"Livetime in interval; Event Number", locNeventsBins, 0, locMaxEvents);
87 dHistTS_Current =
new TH1I(
"HistTS_Current",
"Beam current vs Event Number; Event Number", locNeventsBins, 0, locMaxEvents);
89 for(
size_t loc_i = 0; loc_i < dTrigBits.size(); loc_i++) {
90 dHistTS_trigrate[dTrigBits[loc_i]] =
new TH1I(Form(
"HistTS%d_trigrate", dTrigBits[loc_i]), Form(
"Trigger %d rate; rate (kHz)", dTrigBits[loc_i]), 100, 0., 50.);
91 dHistTS_livetime[dTrigBits[loc_i]] =
new TH1I(Form(
"HistTS%d_livetime", dTrigBits[loc_i]), Form(
"Trigger %d livetime; livetime", dTrigBits[loc_i]), 100, 0., 1.);
93 dHistTS_Recorded[dTrigBits[loc_i]] =
new TH1I(Form(
"HistTS%d_Recorded", dTrigBits[loc_i]), Form(
"Trigger %d: Recorded events in interval; Event Number", dTrigBits[loc_i]), locNeventsBins, 0, locMaxEvents);
94 dHistTS_Scaler[dTrigBits[loc_i]] =
new TH1I(Form(
"HistTS%d_Scaler", dTrigBits[loc_i]), Form(
"Trigger %d: Scaler events in interval; Event Number", dTrigBits[loc_i]), locNeventsBins, 0, locMaxEvents);
97 for(
size_t loc_i = 0; loc_i < dFPTrigBits.size(); loc_i++) {
98 dHistTS_FPtrigrate[dFPTrigBits[loc_i]] =
new TH1I(Form(
"HistTS%d_FPtrigrate", dFPTrigBits[loc_i]), Form(
"Trigger %d rate; rate (Hz)", dFPTrigBits[loc_i]), 100, 0., 50.);
99 dHistTS_FPlivetime[dFPTrigBits[loc_i]] =
new TH1I(Form(
"HistTS%d_FPlivetime", dFPTrigBits[loc_i]), Form(
"Trigger %d livetime; livetime", dFPTrigBits[loc_i]), 100, 0., 1.);
101 dHistTS_FPRecorded[dFPTrigBits[loc_i]] =
new TH1I(Form(
"HistTS%d_FPRecorded", dFPTrigBits[loc_i]), Form(
"Trigger %d: Recorded events in interval; Event Number", dFPTrigBits[loc_i]), locNeventsBins, 0, locMaxEvents);
102 dHistTS_FPScaler[dFPTrigBits[loc_i]] =
new TH1I(Form(
"HistTS%d_FPScaler", dFPTrigBits[loc_i]), Form(
"Trigger %d: Scaler events in interval; Event Number", dFPTrigBits[loc_i]), locNeventsBins, 0, locMaxEvents);
120 locTreeBranchRegister.
Register_Single<uint32_t>(
"SyncEventInstLiveTime");
132 dTreeInterface->Create_Branches(locTreeBranchRegister);
138 dIsFirstInterval =
true;
139 dIsLastInterval =
false;
142 dTotalEventNumber = 0;
143 dSyncEventNumber = 0;
144 dSyncEventUnixTime = 0;
145 dSyncEventLiveTime = 0;
146 dSyncEventBusyTime = 0;
147 dSyncEventInstLiveTime = 0;
148 for (
int j=0; j<kScalers; j++) {
150 dScalerTriggerBitPrevious[j] = 0;
151 dRecordedTriggerBitPrevious[j] = 0;
153 for (
int j=0; j<kFPScalers; j++) {
155 dFPScalerTriggerBitPrevious[j] = 0;
156 dFPRecordedTriggerBitPrevious[j] = 0;
177 vector<const DEPICSvalue*> epicsvalues;
178 locEventLoop->Get(epicsvalues);
181 for(vector<const DEPICSvalue*>::const_iterator val_itr = epicsvalues.begin(); val_itr != epicsvalues.end(); val_itr++) {
183 float fconv = atof(epics_val->
sval.c_str());
184 if(epics_val->
name ==
"IBCAD00CRCUR6")
196 locEventLoop->GetSingle(locL1Trigger);
201 uint32_t trig_mask = locL1Trigger->
trig_mask;
202 for (
int j=0; j<kScalers; j++) {
203 uint32_t temp_mask = trig_mask & 1<<j;
204 if (temp_mask) dTrigCount[j] += 1;
207 for (
int j=0; j<kFPScalers; j++) {
208 uint32_t temp_mask = fp_trig_mask & 1<<j;
209 if (temp_mask) dFPTrigCount[j] += 1;
212 int trig_bits = fp_trig_mask > 0? 128 + fp_trig_mask/256: trig_mask;
213 japp->RootFillLock(
this);
214 dHistTS_trgbits->Fill(trig_bits);
215 japp->RootFillUnLock(
this);
221 vector<const DL1Info*> locL1Infos;
222 locEventLoop->Get(locL1Infos);
223 if(locL1Infos.empty())
225 const DL1Info *locL1Info = locL1Infos[0];
227 dEventNumber = locEventNumber;
229 uint32_t nsync_event;
235 uint32_t gtp_rec[kScalers];
236 uint32_t gtp_sc[kScalers];
237 uint32_t gtp_rate[kScalers];
238 uint32_t fp_rec[kFPScalers];
239 uint32_t fp_sc[kFPScalers];
240 uint32_t fp_rate[kFPScalers];
242 nsync_event = locL1Info->
nsync;
249 double livetime_integrated = (double)livetime/(livetime+busytime);
250 japp->RootFillLock(
this);
251 dHistTS_livetime_tot->Fill(livetime_integrated);
252 dHistTS_liveinst_tot->Fill((
float)live_inst/1000.);
253 dHistTS_livetimeEvents->Fill(locEventNumber, livetime_integrated);
254 dHistTS_SyncEvents->Fill(locEventNumber);
255 dHistTS_Current->Fill(dEventNumber, dCurrent);
256 japp->RootFillUnLock(
this);
259 dTreeFillData.Fill_Single<
bool>(
"IsFirstInterval", dIsFirstInterval);
260 dTreeFillData.Fill_Single<
bool>(
"IsLastInterval", dIsLastInterval);
261 dTreeFillData.Fill_Single<ULong64_t>(
"TotalEventNumber", locEventNumber);
262 dTreeFillData.Fill_Single<uint32_t>(
"SyncEventNumber", nsync_event);
263 dTreeFillData.Fill_Single<uint32_t>(
"SyncEventLiveTime", livetime);
264 dTreeFillData.Fill_Single<uint32_t>(
"SyncEventBusyTime", busytime);
265 dTreeFillData.Fill_Single<uint32_t>(
"SyncEventInstLiveTime", live_inst);
266 dTreeFillData.Fill_Single<uint32_t>(
"SyncEventUnixTime", timestamp);
267 dTreeFillData.Fill_Single<uint32_t>(
"NumScalers", kScalers);
268 dTreeFillData.Fill_Single<uint32_t>(
"NumFPScalers", kFPScalers);
270 dSyncEventNumber = locEventNumber;
271 dSyncEventLiveTime = livetime;
272 dSyncEventBusyTime = busytime;
273 dSyncEventInstLiveTime = live_inst;
274 dSyncEventUnixTime = timestamp;
277 japp->RootFillLock(
this);
278 for (
int j=0; j<kScalers; j++) {
279 gtp_rec[j] = dTrigCount[j] - dRecordedTriggerBitPrevious[j];
280 gtp_sc[j] = locL1Info->
gtp_sc[j] - dScalerTriggerBitPrevious[j];
281 gtp_rate[j] = locL1Info->
gtp_rate[j];
283 dTreeFillData.Fill_Array<uint32_t>(
"RecordedTriggerBit", dTrigCount[j], j);
284 dTreeFillData.Fill_Array<uint32_t>(
"ScalerTriggerBit", locL1Info->
gtp_sc[j], j);
285 dTreeFillData.Fill_Array<uint32_t>(
"ScalerRateTriggerBit", gtp_rate[j], j);
287 dScalerTriggerBitPrevious[j] = locL1Info->
gtp_sc[j];
288 dRecordedTriggerBitPrevious[j] = dTrigCount[j];
290 if(j < (
int)dTrigBits.size()) {
291 dHistTS_trigrate[dTrigBits[j]]->Fill(gtp_rate[j]/1000.);
292 dHistTS_Recorded[dTrigBits[j]]->Fill(locEventNumber, gtp_rec[j]);
293 dHistTS_Scaler[dTrigBits[j]]->Fill(locEventNumber, gtp_sc[j]);
294 if(!dIsFirstInterval && gtp_sc[j]>0){
295 dHistTS_livetime[dTrigBits[j]]->Fill(gtp_rec[j]/(
double)gtp_sc[j]);
299 for (
int j=0; j<kFPScalers; j++) {
300 fp_rec[j] = dFPTrigCount[j] - dFPRecordedTriggerBitPrevious[j];
301 fp_sc[j] = locL1Info->
fp_sc[j] - dFPScalerTriggerBitPrevious[j];
302 fp_rate[j] = locL1Info->
fp_rate[j];
304 dTreeFillData.Fill_Array<uint32_t>(
"FPRecordedTriggerBit", dFPTrigCount[j], j);
305 dTreeFillData.Fill_Array<uint32_t>(
"FPScalerTriggerBit", locL1Info->
fp_sc[j], j);
306 dTreeFillData.Fill_Array<uint32_t>(
"FPScalerRateTriggerBit", fp_rate[j], j);
308 dFPScalerTriggerBitPrevious[j] = locL1Info->
fp_sc[j];
309 dFPRecordedTriggerBitPrevious[j] = dFPTrigCount[j];
311 if(j < (
int)dFPTrigBits.size()) {
312 dHistTS_FPtrigrate[dFPTrigBits[j]]->Fill(fp_rate[j]);
313 dHistTS_FPRecorded[dFPTrigBits[j]]->Fill(locEventNumber, fp_rec[j]);
314 dHistTS_FPScaler[dFPTrigBits[j]]->Fill(locEventNumber, fp_sc[j]);
315 if(!dIsFirstInterval && fp_sc[j]>0){
316 dHistTS_FPlivetime[dFPTrigBits[j]]->Fill(fp_rec[j]/(
double)fp_sc[j]);
320 japp->RootFillUnLock(
this);
323 dTreeInterface->Fill(dTreeFillData);
326 dIsFirstInterval =
false;
350 dTreeFillData.Fill_Single<
bool>(
"IsFirstInterval",
false);
351 dTreeFillData.Fill_Single<
bool>(
"IsLastInterval",
true);
352 dTreeFillData.Fill_Single<ULong64_t>(
"TotalEventNumber", dEventNumber);
353 dTreeFillData.Fill_Single<uint32_t>(
"SyncEventNumber", 0);
354 dTreeFillData.Fill_Single<uint32_t>(
"SyncEventLiveTime", 0);
355 dTreeFillData.Fill_Single<uint32_t>(
"SyncEventBusyTime", 0);
356 dTreeFillData.Fill_Single<uint32_t>(
"SyncEventInstLiveTime", 0);
357 dTreeFillData.Fill_Single<uint32_t>(
"SyncEventUnixTime", 0);
358 dTreeFillData.Fill_Single<uint32_t>(
"NumScalers", kScalers);
359 dTreeFillData.Fill_Single<uint32_t>(
"NumFPScalers", kFPScalers);
361 for (
int j=0; j<kScalers; j++) {
362 dTreeFillData.Fill_Array<uint32_t>(
"RecordedTriggerBit", dTrigCount[j], j);
363 dTreeFillData.Fill_Array<uint32_t>(
"ScalerTriggerBit", 0, j);
364 dTreeFillData.Fill_Array<uint32_t>(
"ScalerRateTriggerBit", 0, j);
366 for (
int j=0; j<kFPScalers; j++) {
367 dTreeFillData.Fill_Array<uint32_t>(
"FPRecordedTriggerBit", dFPTrigCount[j], j);
368 dTreeFillData.Fill_Array<uint32_t>(
"FPScalerTriggerBit", 0, j);
369 dTreeFillData.Fill_Array<uint32_t>(
"FPScalerRateTriggerBit", 0, j);
373 dTreeInterface->Fill(dTreeFillData);
374 delete dTreeInterface;
~JEventProcessor_TS_scaler()
jerror_t erun(void)
Called everytime run number changes, provided brun has been called.
void Register_Single(string locBranchName)
jerror_t brun(jana::JEventLoop *locEventLoop, int32_t locRunNumber)
Called everytime a new run number is detected.
jerror_t init(void)
Called once at program start.
static DTreeInterface * Create_DTreeInterface(string locTreeName, string locFileName)
void Register_FundamentalArray(string locBranchName, string locArraySizeName, size_t locInitialArraySize=10)
static thread_local DTreeFillData dTreeFillData
vector< uint32_t > gtp_sc
jerror_t fini(void)
Called after last event of last event source has been processed.
JEventProcessor_TS_scaler()
vector< uint32_t > fp_rate
vector< uint32_t > gtp_rate
A DEPICSvalue object holds information for a single EPICS value read from the data stream...
jerror_t evnt(jana::JEventLoop *locEventLoop, uint64_t locEventNumber)
Called every event.