30 gPARMS->SetDefaultParameter(
"BEAM_ON_MIN_nA",
BEAM_ON_MIN_nA,
"Minimum current in nA to consider the beam \"on\" by DBeamCurrent");
31 gPARMS->SetDefaultParameter(
"BEAM_TRIP_MIN_T",
BEAM_TRIP_MIN_T,
"Minimum amount of time in seconds that event is away from beam trips to be considered fiducial");
33 ticks_per_sec = 250.011E6;
35 rcdb_250MHz_offset_tics = 0;
64 map<string,string> mstr;
65 loop->GetJCalibration()->GetCalib(
"/ELECTRON_BEAM/current_map_epics", mstr);
66 if(mstr.empty())
return NOERROR;
67 string &electron_beam_current = mstr.begin()->second;
69 map<string,string> mcalib;
70 loop->GetJCalibration()->GetCalib(
"/ELECTRON_BEAM/timestamp_to_unix", mcalib);
71 if(mcalib.size() == 3){
73 rcdb_250MHz_offset_tics = stoull(mcalib[
"rcdb_250MHz_offset_tics"].c_str());
74 rcdb_start_time = stoull(mcalib[
"rcdb_start_time"].c_str());
79 istringstream ss(electron_beam_current);
80 double last_Ibeam = 0.0;
81 for(
string line; getline(ss, line,
'\n'); ){
82 double t = atof(line.c_str());
83 double Ibeam = atof(line.substr(1+line.find(
" ")).c_str());
85 boundaries.push_back(b);
100 double t_max = IntegratedTime();
101 for(
auto &b : boundaries){
114 double t_next =
t_max;
117 for(
double t : recover )
if( t>b.t ) {t_next = t;
break;}
118 for(
double t : trip )
if( t>b.t ) {
break;}
else {t_prev = t;}
121 for(
double t : trip )
if( t>b.t ) {t_next = t;
break;}
122 for(
double t : recover )
if( t>b.t ) {
break;}
else {t_prev = t;}
125 b.t_trip_prev = b.t - t_prev;
126 b.t_trip_next = t_next - b.t;
131 lock_guard<mutex> lck(mtx);
132 static set<int32_t> runs_loaded;
133 if(runs_loaded.find(runnumber) == runs_loaded.end()){
134 jout <<
"Electron beam current trip map for run " << runnumber <<
" loaded with " << boundaries.size() <<
" boundaries (" << trip.size() <<
" trips over " << t_max <<
" sec)" << endl;
135 runs_loaded.insert(runnumber);
146 if(boundaries.empty())
return NOERROR;
151 vector<const DCODAEventInfo*> codainfos;
152 loop->Get(codainfos);
153 if(codainfos.empty())
return NOERROR;
158 double t = (codainfo->
avg_timestamp - (double)rcdb_250MHz_offset_tics)/ticks_per_sec;
161 auto it = boundaries.begin();
162 while(it!=boundaries.end()){
167 if(it != boundaries.begin() ){
170 double t_rel = t - b.
t;
222 double t_recover_pre = 0.;
223 double t_recover_post = 0.;
224 for(
double ttemp : recover){
226 t_recover_pre = ttemp;
228 t_recover_post = ttemp;
232 double t_trip_pre = 0.;
233 for(
double ttemp : trip){
241 double t_fiducial = 0.0;
243 for(
double t1 : recover){
246 if(t_trip_pre > t_recover_pre) {
247 if(
t1 < t_recover_post)
251 if(
t1 < t_recover_pre)
260 for(
double tt : trip)
if(tt>t || tt>t_end){t2 = tt;
break;}
273 if(t3>t_end) t3 = t_end;
278 double delta_t = t3-t;
279 if(delta_t > 0.0) t_fiducial += delta_t;
285 if(t >= t_end)
break;
300 if(boundaries.empty())
return 0.0;
301 return boundaries[boundaries.size()-1].t;
double IntegratedTime(void)
jerror_t fini(void)
Called after last event of last event source has been processed.
jerror_t evnt(jana::JEventLoop *eventLoop, uint64_t eventnumber)
Called every event.
jerror_t brun(jana::JEventLoop *eventLoop, int32_t runnumber)
Called everytime a new run number is detected.
double IntegratedFiducialTime(double t_start=0.0, double t_end=0.0)
jerror_t erun(void)
Called everytime run number changes, provided brun has been called.
jerror_t init(void)
Called once at program start.
Double_t t_max[NCHANNELS]