Hall-D Software  alpha
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
JEventProcessor_TS_scaler.cc
Go to the documentation of this file.
1 // $Id$
2 //
3 // File: JEventProcessor_TS_scaler.cc
4 // Created: Thu May 26 12:16:56 EDT 2016
5 // Creator: jrsteven (on Linux ifarm1401 2.6.32-431.el6.x86_64 x86_64)
6 //
7 
9 using namespace jana;
10 
11 #include <DANA/DStatusBits.h>
12 #include "TRIGGER/DL1Trigger.h"
13 #include "DAQ/DL1Info.h"
14 #include "DAQ/DEPICSvalue.h"
15 
16 // Routine used to create our JEventProcessor
17 #include <JANA/JApplication.h>
18 #include <JANA/JFactory.h>
19 
20 #include <TDirectory.h>
21 
22 using namespace std;
23 using namespace jana;
24 
25 extern "C"{
26 void InitPlugin(JApplication *app){
27  InitJANAPlugin(app);
28  app->AddProcessor(new JEventProcessor_TS_scaler());
29 }
30 } // "C"
31 
32 //define static local variable //declared in header file
34 
35 //------------------
36 // JEventProcessor_TS_scaler (Constructor)
37 //------------------
39 {
40 
41 }
42 
43 //------------------
44 // ~JEventProcessor_TS_scaler (Destructor)
45 //------------------
47 {
48 
49 }
50 
51 //------------------
52 // init
53 //------------------
55 {
56  // This is called once at program startup.
57 
58  // monitor some trigger bits separately
59  dTrigBits.push_back(1); // FCAL-BCAL
60  dTrigBits.push_back(2); // FCAL
61  dTrigBits.push_back(4); // BCAL
62  dTrigBits.push_back(8); // PS
63  dTrigBits.push_back(16); // *Unused*
64  dTrigBits.push_back(32); // FCAL-BCAL Alternate
65  dTrigBits.push_back(64); // FCAL-ST minimum bias
66 
67  dFPTrigBits.push_back(4); // FCAL LED
68  dFPTrigBits.push_back(256); // BCAL US LED
69  dFPTrigBits.push_back(512); // BCAL DS LED
70  dFPTrigBits.push_back(2048); // Random trigger
71 
72  // define histograms in separate folder
73  gDirectory->cd("/");
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.);
82 
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);
88 
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.);
92 
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);
95  }
96 
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.);
100 
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);
103  }
104 
105  mainDir->cd();
106 
107  //TTREE INTERFACE
108  //MUST DELETE WHEN FINISHED: OR ELSE DATA WON'T BE SAVED!!!
109  dTreeInterface = DTreeInterface::Create_DTreeInterface("TS_scaler_Tree", "tree_TS_scaler.root");
110 
111  //TTREE BRANCHES
112  DTreeBranchRegister locTreeBranchRegister;
113 
114  locTreeBranchRegister.Register_Single<bool>("IsFirstInterval");
115  locTreeBranchRegister.Register_Single<bool>("IsLastInterval");
116  locTreeBranchRegister.Register_Single<ULong64_t>("TotalEventNumber");
117  locTreeBranchRegister.Register_Single<uint32_t>("SyncEventNumber");
118  locTreeBranchRegister.Register_Single<uint32_t>("SyncEventLiveTime");
119  locTreeBranchRegister.Register_Single<uint32_t>("SyncEventBusyTime");
120  locTreeBranchRegister.Register_Single<uint32_t>("SyncEventInstLiveTime");
121  locTreeBranchRegister.Register_Single<uint32_t>("SyncEventUnixTime");
122  locTreeBranchRegister.Register_Single<uint32_t>("NumScalers");
123  locTreeBranchRegister.Register_Single<uint32_t>("NumFPScalers");
124  locTreeBranchRegister.Register_FundamentalArray<uint32_t>("ScalerTriggerBit", "NumScalers", kScalers);
125  locTreeBranchRegister.Register_FundamentalArray<uint32_t>("FPScalerTriggerBit", "NumFPScalers", kFPScalers);
126  locTreeBranchRegister.Register_FundamentalArray<uint32_t>("ScalerRateTriggerBit", "NumScalers", kScalers);
127  locTreeBranchRegister.Register_FundamentalArray<uint32_t>("FPScalerRateTriggerBit", "NumFPScalers", kFPScalers);
128  locTreeBranchRegister.Register_FundamentalArray<uint32_t>("RecordedTriggerBit", "NumScalers", kScalers);
129  locTreeBranchRegister.Register_FundamentalArray<uint32_t>("FPRecordedTriggerBit", "NumFPScalers", kFPScalers);
130 
131  //REGISTER BRANCHES
132  dTreeInterface->Create_Branches(locTreeBranchRegister);
133 
134  // change back to main hd_root file for other plugins
135  mainDir->cd();
136 
137  // initialize some variables
138  dIsFirstInterval = true;
139  dIsLastInterval = false;
140  dCurrent = 0;
141  dEventNumber = 0;
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++) {
149  dTrigCount[j] = 0;
150  dScalerTriggerBitPrevious[j] = 0;
151  dRecordedTriggerBitPrevious[j] = 0;
152  }
153  for (int j=0; j<kFPScalers; j++) {
154  dFPTrigCount[j] = 0;
155  dFPScalerTriggerBitPrevious[j] = 0;
156  dFPRecordedTriggerBitPrevious[j] = 0;
157  }
158 
159  return NOERROR;
160 }
161 
162 //------------------
163 // brun
164 //------------------
165 jerror_t JEventProcessor_TS_scaler::brun(JEventLoop *locEventLoop, int32_t locRunNumber)
166 {
167  // This is called whenever the run number changes
168  return NOERROR;
169 }
170 
171 //------------------
172 // evnt
173 //------------------
174 jerror_t JEventProcessor_TS_scaler::evnt(JEventLoop *locEventLoop, uint64_t locEventNumber)
175 {
176  // get beam current from EPICS events
177  vector<const DEPICSvalue*> epicsvalues;
178  locEventLoop->Get(epicsvalues);
179  bool isEPICS = locEventLoop->GetJEvent().GetStatusBit(kSTATUS_EPICS_EVENT);
180  if(isEPICS) {
181  for(vector<const DEPICSvalue*>::const_iterator val_itr = epicsvalues.begin(); val_itr != epicsvalues.end(); val_itr++) {
182  const DEPICSvalue* epics_val = *val_itr;
183  float fconv = atof(epics_val->sval.c_str());
184  if(epics_val->name == "IBCAD00CRCUR6")
185  dCurrent = fconv;
186  }
187  }
188 
189  // check if it's a physics event
190  bool isPhysics = locEventLoop->GetJEvent().GetStatusBit(kSTATUS_PHYSICS_EVENT);
191  if(!isPhysics)
192  return NOERROR;
193 
194  // check if event has L1 trigger information
195  const DL1Trigger *locL1Trigger = NULL;
196  locEventLoop->GetSingle(locL1Trigger);
197  if(!locL1Trigger)
198  return NOERROR;
199 
200  // get trigger masks and count triggers
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;
205  }
206  uint32_t fp_trig_mask = locL1Trigger->fp_trig_mask;
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;
210  }
211 
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);
216 
217  // check if scalers are filled to identify SYNC events
218  //if(locL1Trigger->gtp_sc.size() <= 0)
219  // return NOERROR;
220 
221  vector<const DL1Info*> locL1Infos;
222  locEventLoop->Get(locL1Infos);
223  if(locL1Infos.empty())
224  return NOERROR;
225  const DL1Info *locL1Info = locL1Infos[0];
226 
227  dEventNumber = locEventNumber;
228 
229  uint32_t nsync_event; /* sync event number */
230  uint32_t livetime; /* accumulated livetime */
231  uint32_t busytime; /* accumulated busy time */
232  uint32_t live_inst; /* instantaneous livetime */
233  uint32_t timestamp; /* unix time */
234 
235  uint32_t gtp_rec[kScalers]; /* number of recorded triggers from */
236  uint32_t gtp_sc[kScalers]; /* number of input triggers from GTP for 32 lanes (32 trigger bits) */
237  uint32_t gtp_rate[kScalers]; /* instant. rate of GTP triggers */
238  uint32_t fp_rec[kFPScalers]; /* number of recorded FP triggers from */
239  uint32_t fp_sc[kFPScalers]; /* number of TS front pannel triggers for 16 fron pannel lines (16 trigger bits) */
240  uint32_t fp_rate[kFPScalers]; /* instant. rate of FP triggers */
241 
242  nsync_event = locL1Info->nsync;
243  livetime = locL1Info->live_time;
244  busytime = locL1Info->busy_time;
245  live_inst = locL1Info->live_inst;
246  timestamp = locL1Info->unix_time;
247  //printf ("Event=%d int_count=%d livetime=%d busytime=%d time=%d live_inst=%d\n",(int)locEventNumber,int_count,livetime,busytime,(int)timestamp,live_inst);
248 
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);
257 
258  //STAGE DATA FOR TREE FILL
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);
269 
270  dSyncEventNumber = locEventNumber;
271  dSyncEventLiveTime = livetime;
272  dSyncEventBusyTime = busytime;
273  dSyncEventInstLiveTime = live_inst;
274  dSyncEventUnixTime = timestamp;
275 
276  // set info for each trigger bit and fill histograms
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];
282 
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);
286 
287  dScalerTriggerBitPrevious[j] = locL1Info->gtp_sc[j];
288  dRecordedTriggerBitPrevious[j] = dTrigCount[j];
289 
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]);
296  }
297  }
298  }
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];
303 
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);
307 
308  dFPScalerTriggerBitPrevious[j] = locL1Info->fp_sc[j];
309  dFPRecordedTriggerBitPrevious[j] = dFPTrigCount[j];
310 
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]);
317  }
318  }
319  }
320  japp->RootFillUnLock(this);
321 
322  //FILL TTREE
323  dTreeInterface->Fill(dTreeFillData);
324 
325  // once you're here it's never the first interval
326  dIsFirstInterval = false;
327 
328  return NOERROR;
329 }
330 
331 //------------------
332 // erun
333 //------------------
335 {
336  // This is called whenever the run number changes, before it is
337  // changed to give you a chance to clean up before processing
338  // events from the next run number.
339  return NOERROR;
340 }
341 
342 //------------------
343 // fini
344 //------------------
346 {
347  // Called before program exit after event processing is finished.
348 
349  //STAGE DATA FOR TREE FILL
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);
360 
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);
365  }
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);
370  }
371 
372  //FILL TTREE
373  dTreeInterface->Fill(dTreeFillData);
374  delete dTreeInterface; //saves trees to file, closes file
375 
376  return NOERROR;
377 }
378 
uint32_t live_inst
Definition: DL1Info.h:24
jerror_t erun(void)
Called everytime run number changes, provided brun has been called.
uint32_t trig_mask
Definition: DL1Trigger.h:18
uint32_t fp_trig_mask
Definition: DL1Trigger.h:19
string sval
Definition: DEPICSvalue.h:65
vector< uint32_t > fp_sc
Definition: DL1Info.h:28
void Register_Single(string locBranchName)
jerror_t brun(jana::JEventLoop *locEventLoop, int32_t locRunNumber)
Called everytime a new run number is detected.
TDirectory * mainDir
Definition: p2k_hists.C:2
JApplication * japp
jerror_t init(void)
Called once at program start.
static DTreeInterface * Create_DTreeInterface(string locTreeName, string locFileName)
InitPlugin_t InitPlugin
uint32_t nsync
Definition: DL1Info.h:20
void Register_FundamentalArray(string locBranchName, string locArraySizeName, size_t locInitialArraySize=10)
static thread_local DTreeFillData dTreeFillData
string name
Definition: DEPICSvalue.h:64
uint32_t unix_time
Definition: DL1Info.h:25
uint32_t busy_time
Definition: DL1Info.h:23
vector< uint32_t > gtp_sc
Definition: DL1Info.h:27
jerror_t fini(void)
Called after last event of last event source has been processed.
uint32_t live_time
Definition: DL1Info.h:22
vector< uint32_t > fp_rate
Definition: DL1Info.h:30
vector< uint32_t > gtp_rate
Definition: DL1Info.h:29
A DEPICSvalue object holds information for a single EPICS value read from the data stream...
Definition: DEPICSvalue.h:37
jerror_t evnt(jana::JEventLoop *locEventLoop, uint64_t locEventNumber)
Called every event.