8 #include <JANA/JApplication.h>
19 #include "RCDB/Connection.h"
20 #include "RCDB/ConfigParser.h"
34 hfcal_gains =
new TH1F(
"fcal_gains",
"fcal_gains", 80, -1., 3.);
35 hfcal_gains2 =
new TH2F(
"fcal_gains2",
"fcal_gains2", 71, -142., 142., 71, -142., 142.);
36 hfcal_ped =
new TH1F(
"fcal_ped",
"fcal_ped", 800, 0., 200.);
44 FCAL_ADC_PER_MEV = 3.73;
51 BCAL_ADC_PER_MEV = 34.48276;
73 simu_baseline_fcal = 1;
74 simu_baseline_bcal = 1;
79 gPARMS->SetDefaultParameter(
"TRIG:BYPASS", BYPASS,
80 "Bypass trigger by hard coding physics bit");
81 gPARMS->SetDefaultParameter(
"TRIG:FCAL_ADC_PER_MEV", FCAL_ADC_PER_MEV,
82 "FCAL energy calibration for the Trigger");
83 gPARMS->SetDefaultParameter(
"TRIG:FCAL_CELL_THR", FCAL_CELL_THR,
84 "FCAL energy threshold per cell");
85 gPARMS->SetDefaultParameter(
"TRIG:FCAL_EN_SC", FCAL_EN_SC,
86 "FCAL energy threshold");
87 gPARMS->SetDefaultParameter(
"TRIG:FCAL_NSA", FCAL_NSA,
89 gPARMS->SetDefaultParameter(
"TRIG:FCAL_NSB", FCAL_NSB,
91 gPARMS->SetDefaultParameter(
"TRIG:FCAL_WINDOW", FCAL_WINDOW,
92 "FCAL GTP integration window");
94 gPARMS->SetDefaultParameter(
"TRIG:BCAL_ADC_PER_MEV", BCAL_ADC_PER_MEV,
95 "BCAL energy calibration for the Trigger");
96 gPARMS->SetDefaultParameter(
"TRIG:BCAL_CELL_THR", BCAL_CELL_THR,
97 "BCAL energy threshold per cell");
98 gPARMS->SetDefaultParameter(
"TRIG:BCAL_EN_SC", BCAL_EN_SC,
99 "BCAL energy threshold");
100 gPARMS->SetDefaultParameter(
"TRIG:BCAL_NSA", BCAL_NSA,
102 gPARMS->SetDefaultParameter(
"TRIG:BCAL_NSB", BCAL_NSB,
104 gPARMS->SetDefaultParameter(
"TRIG:BCAL_WINDOW", BCAL_WINDOW,
105 "BCAL GTP integration window");
107 gPARMS->SetDefaultParameter(
"TRIG:ST_ADC_PER_MEV", ST_ADC_PER_MEV,
108 "ST energy calibration for the Trigger");
109 gPARMS->SetDefaultParameter(
"TRIG:ST_CELL_THR", ST_CELL_THR,
110 "ST energy threshold per cell");
111 gPARMS->SetDefaultParameter(
"TRIG:ST_NSA", ST_NSA,
113 gPARMS->SetDefaultParameter(
"TRIG:ST_NSB", ST_NSB,
115 gPARMS->SetDefaultParameter(
"TRIG:ST_WINDOW", ST_WINDOW,
116 "ST window for merging hits (GTP)");
117 gPARMS->SetDefaultParameter(
"TRIG:ST_NHIT", ST_NHIT,
118 "Number of hits in ST");
120 gPARMS->SetDefaultParameter(
"TRIG:FCAL_BCAL_EN", FCAL_BCAL_EN,
121 "Energy threshold for the FCAL & BCAL trigger");
123 gPARMS->SetDefaultParameter(
"TRIG:BCAL_OFFSET", BCAL_OFFSET,
124 "Timing offset between BCAL and FCAL energies at GTP (sampels)");
128 gPARMS->SetDefaultParameter(
"TRIG:SIMU_BASELINE", SIMU_BASELINE,
129 "Enable simulation of pedestal variations");
131 gPARMS->SetDefaultParameter(
"TRIG:SIMU_GAIN", SIMU_GAIN,
132 "Enable simulation of gain variations");
135 BCAL_ADC_PER_MEV_CORRECT = 22.7273;
137 pedestal_sigma = 1.2;
142 time_max = (sample - 1)*max_adc_bins;
149 fcal_gains = fcal_gains_temp;
150 fcal_pedestals = fcal_pedestals_temp;
166 fcal_trig_mask.clear();
167 bcal_trig_mask.clear();
169 triggers_enabled.clear();
173 static pthread_mutex_t print_mutex = PTHREAD_MUTEX_INITIALIZER;
174 static set<int> runs_announced;
175 pthread_mutex_lock(&print_mutex);
176 bool print_messages =
false;
178 if(runs_announced.find(runnumber) == runs_announced.end()){
179 print_messages =
true;
180 runs_announced.insert(runnumber);
183 pthread_mutex_unlock(&print_mutex);
187 string JANA_CALIB_CONTEXT =
"";
189 if(getenv(
"JANA_CALIB_CONTEXT") != NULL ){
190 JANA_CALIB_CONTEXT = getenv(
"JANA_CALIB_CONTEXT");
191 if(JANA_CALIB_CONTEXT.find(
"mc_generic") != string::npos){
194 simu_baseline_fcal = 0;
195 simu_baseline_bcal = 0;
205 status = Read_RCDB(runnumber);
210 if( (use_rcdb == 0) || (status > 0) || (triggers_enabled.size() == 0)){
216 trig_tmp.
gtp.
fcal = FCAL_EN_SC;
217 trig_tmp.
gtp.
bcal = BCAL_EN_SC;
220 triggers_enabled.push_back(trig_tmp);
222 cout <<
" Do not use RCDB for the trigger simulation. Default (spring 2017) trigger settings are used " << endl;
227 vector<const DFCALGeometry*> fcalGeomVect;
228 eventLoop->Get( fcalGeomVect );
229 if (fcalGeomVect.size() < 1)
230 return OBJECT_NOT_AVAILABLE;
233 if(print_messages) jout <<
"In DL1MCTrigger_factory, loading constants..." << endl;
235 vector< double > fcal_gains_ch;
236 vector< double > fcal_pedestals_ch;
238 if (eventLoop->GetCalib(
"/FCAL/gains", fcal_gains_ch)){
239 jout <<
"DL1MCTrigger_factory: Error loading /FCAL/gains !" << endl;
243 fcal_gains[ii][jj] = 1.;
247 LoadFCALConst(fcal_gains, fcal_gains_ch, fcalGeom);
250 for(
int ch = 0; ch < (int)fcal_gains_ch.size(); ch++){
251 int row = fcalGeom.
row(ch);
252 int col = fcalGeom.
column(ch);
254 hfcal_gains->Fill(fcal_gains[row][col]);
256 hfcal_gains2->Fill(
float(aaa.X()),
float(aaa.Y()), fcal_gains[row][col]);
265 if (eventLoop->GetCalib(
"/FCAL/pedestals", fcal_pedestals_ch)){
266 jout <<
"DL1MCTrigger_factory: Error loading /FCAL/pedestals !" << endl;
270 fcal_pedestals[ii][jj] = 100.;
274 LoadFCALConst(fcal_pedestals, fcal_pedestals_ch, fcalGeom);
277 for(
int ch = 0; ch < (int)fcal_gains_ch.size(); ch++){
278 int row = fcalGeom.
row(ch);
279 int col = fcalGeom.
column(ch);
281 hfcal_ped->Fill(fcal_pedestals[row][col]);
289 simu_baseline_fcal = 0;
290 simu_baseline_bcal = 0;
299 for(
int ii = 0; ii < 100; ii++){
300 cout <<
" Channel = " << ii <<
" Value = " <<
301 fcal_gains_ch[ii] << endl;
317 _data.push_back(trigger);
325 fcal_signal_hits.clear();
326 bcal_signal_hits.clear();
328 fcal_merged_hits.clear();
329 bcal_merged_hits.clear();
331 memset(fcal_ssp,0,
sizeof(fcal_ssp));
332 memset(fcal_gtp,0,
sizeof(fcal_gtp));
334 memset(bcal_ssp,0,
sizeof(bcal_ssp));
335 memset(bcal_gtp,0,
sizeof(bcal_gtp));
338 vector<const DFCALHit*> fcal_hits;
339 vector<const DBCALHit*> bcal_hits;
341 loop->Get(fcal_hits);
342 loop->Get(bcal_hits);
355 GetSeeds(loop, eventnumber, seed1, seed2, seed3);
357 gDRandom.
SetSeeds(seed1, seed2, seed3);
370 double fcal_hit_en = 0;
372 for (
unsigned int ii = 0; ii < fcal_hits.size(); ii++){
373 int row = fcal_hits[ii]->row;
374 int col = fcal_hits[ii]->column;
377 double time = fcal_hits[ii]->t + time_shift;
378 if((time < time_min) || (time > time_max)){
384 for(
unsigned int jj = 0; jj < fcal_trig_mask.size(); jj++){
385 if( (row == fcal_trig_mask[jj].row) && (col == fcal_trig_mask[jj].col)){
392 fcal_hit_en += fcal_hits[ii]->E;
399 fcal_tmp.
energy = fcal_hits[ii]->E;
400 fcal_tmp.
time = time;
404 double fcal_adc_en = fcal_tmp.
energy*FCAL_ADC_PER_MEV*1000;
409 double gain = fcal_gains[row][col];
414 status = SignalPulse(fcal_adc_en, fcal_tmp.
time, fcal_tmp.
adc_en, 1);
417 fcal_signal_hits.push_back(fcal_tmp);
424 for(
unsigned int ii = 0; ii < fcal_signal_hits.size(); ii++){
426 if(fcal_signal_hits[ii].merged == 1)
continue;
429 fcal_tmp.
row = fcal_signal_hits[ii].row;
430 fcal_tmp.
column = fcal_signal_hits[ii].column;
433 for(
int kk = 0; kk < sample; kk++)
434 fcal_tmp.
adc_en[kk] = fcal_signal_hits[ii].adc_en[kk];
436 for(
unsigned int jj = ii + 1; jj < fcal_signal_hits.size(); jj++){
437 if((fcal_signal_hits[ii].row == fcal_signal_hits[jj].row) &&
438 (fcal_signal_hits[ii].column == fcal_signal_hits[jj].column)){
440 fcal_signal_hits[jj].merged = 1;
442 for(
int kk = 0; kk < sample; kk++)
443 fcal_tmp.
adc_en[kk] += fcal_signal_hits[jj].adc_en[kk];
447 fcal_merged_hits.push_back(fcal_tmp);
451 if(simu_baseline_fcal){
452 for(
unsigned int ii = 0; ii < fcal_merged_hits.size(); ii++){
453 int row = fcal_merged_hits[ii].row;
454 int column = fcal_merged_hits[ii].column;
456 AddBaseline(fcal_merged_hits[ii].adc_en, pedestal, gDRandom);
462 for(
unsigned int ii = 0; ii < fcal_merged_hits.size(); ii++){
463 Digitize(fcal_merged_hits[ii].adc_en,fcal_merged_hits[ii].adc_amp);
469 int fcal_hit_adc_en = 0;
471 for(
unsigned int ii = 0; ii < fcal_merged_hits.size(); ii++)
472 for(
int jj = 0; jj < sample; jj++)
473 fcal_hit_adc_en += fcal_merged_hits[ii].adc_amp[jj];
476 status += FADC_SSP(fcal_merged_hits, 1);
483 double bcal_hit_en = 0;
485 for (
unsigned int ii = 0; ii < bcal_hits.size(); ii++){
488 double time = bcal_hits[ii]->t + time_shift;
489 if((time < time_min) || (time > time_max)){
493 int module = bcal_hits[ii]->module;
494 int layer = bcal_hits[ii]->layer;
495 int sector = bcal_hits[ii]->sector;
496 int end = bcal_hits[ii]->end;
501 for(
unsigned int jj = 0; jj < bcal_trig_mask.size(); jj++){
502 if( (module == bcal_trig_mask[jj].module) && (layer == bcal_trig_mask[jj].layer) &&
503 (sector == bcal_trig_mask[jj].sector) && (end == bcal_trig_mask[jj].end) ){
511 bcal_hit_en += bcal_hits[ii]->E;
519 bcal_tmp.
energy = bcal_hits[ii]->E;
520 bcal_tmp.
time = time;
524 double bcal_adc_en = bcal_tmp.
energy*BCAL_ADC_PER_MEV*1000;
526 status = SignalPulse(bcal_adc_en, bcal_tmp.
time, bcal_tmp.
adc_en, 2);
529 bcal_signal_hits.push_back(bcal_tmp);
535 for(
unsigned int ii = 0; ii < bcal_signal_hits.size(); ii++){
537 if(bcal_signal_hits[ii].merged == 1)
continue;
540 bcal_tmp.
module = bcal_signal_hits[ii].module;
541 bcal_tmp.
layer = bcal_signal_hits[ii].layer;
542 bcal_tmp.
sector = bcal_signal_hits[ii].sector;
543 bcal_tmp.
end = bcal_signal_hits[ii].end;
548 for(
int kk = 0; kk < sample; kk++)
549 bcal_tmp.
adc_en[kk] = bcal_signal_hits[ii].adc_en[kk];
551 for(
unsigned int jj = ii + 1; jj < bcal_signal_hits.size(); jj++){
552 if((bcal_signal_hits[ii].module == bcal_signal_hits[jj].module) &&
553 (bcal_signal_hits[ii].layer == bcal_signal_hits[jj].layer) &&
554 (bcal_signal_hits[ii].sector == bcal_signal_hits[jj].sector) &&
555 (bcal_signal_hits[ii].end == bcal_signal_hits[jj].end)){
557 bcal_signal_hits[jj].merged = 1;
559 for(
int kk = 0; kk < sample; kk++)
560 bcal_tmp.
adc_en[kk] += bcal_signal_hits[jj].adc_en[kk];
564 bcal_merged_hits.push_back(bcal_tmp);
569 if(simu_baseline_bcal){
570 for(
unsigned int ii = 0; ii < bcal_merged_hits.size(); ii++){
573 AddBaseline(bcal_merged_hits[ii].adc_en, pedestal, gDRandom);
579 for(
unsigned int ii = 0; ii < bcal_merged_hits.size(); ii++)
580 Digitize(bcal_merged_hits[ii].adc_en,bcal_merged_hits[ii].adc_amp);
583 int bcal_hit_adc_en = 0;
584 for(
unsigned int ii = 0; ii < bcal_merged_hits.size(); ii++)
585 for(
int jj = 0; jj < sample; jj++)
586 bcal_hit_adc_en += bcal_merged_hits[ii].adc_amp[jj];
589 status = FADC_SSP(bcal_merged_hits, 2);
595 l1_found = FindTriggers(trigger);
599 int fcal_gtp_max = 0;
600 int bcal_gtp_max = 0;
602 for(
unsigned int ii = 0; ii < sample; ii++){
603 if(fcal_gtp[ii] > fcal_gtp_max) fcal_gtp_max = fcal_gtp[ii];
604 if(bcal_gtp[ii] > bcal_gtp_max) bcal_gtp_max = bcal_gtp[ii];
607 trigger->
fcal_en = fcal_hit_en;
608 trigger->
fcal_adc = fcal_hit_adc_en;
609 trigger->
fcal_adc_en = fcal_hit_adc_en/FCAL_ADC_PER_MEV/1000.;
611 trigger->
fcal_gtp_en = fcal_gtp_max/FCAL_ADC_PER_MEV/1000.;
613 trigger->
bcal_en = bcal_hit_en;
614 trigger->
bcal_adc = bcal_hit_adc_en;
615 trigger->
bcal_adc_en = bcal_hit_adc_en/BCAL_ADC_PER_MEV_CORRECT/2./1000.;
617 trigger->
bcal_gtp_en = bcal_gtp_max/BCAL_ADC_PER_MEV_CORRECT/2./1000.;
619 _data.push_back(trigger);
652 vector<const DTranslationTable*> ttab;
653 eventLoop->Get(ttab);
655 vector<string> SectionNames = {
"TRIGGER",
"GLOBAL",
"FCAL",
"BCAL",
"TOF",
"ST",
"TAGH",
656 "TAGM",
"PS",
"PSC",
"TPOL",
"CDC",
"FDC"};
658 string RCDB_CONNECTION;
660 if( getenv(
"RCDB_CONNECTION")!= NULL )
661 RCDB_CONNECTION = getenv(
"RCDB_CONNECTION");
663 RCDB_CONNECTION =
"mysql://rcdb@hallddb.jlab.org/rcdb";
666 rcdb::Connection connection(RCDB_CONNECTION);
668 auto rtvsCnd = connection.GetCondition(runnumber,
"rtvs");
671 cout<<
"'rtvs' condition is not set for run " << runnumber << endl;
676 auto json = rtvsCnd->ToJsonDocument();
677 string fileName(json[
"%(config)"].GetString());
679 auto file = connection.GetFile(runnumber, fileName);
682 cout<<
"File with name: "<< fileName
683 <<
" doesn't exist (not associated) with run: "<< runnumber << endl;
687 string fileContent = file->GetContent();
688 auto result = rcdb::ConfigParser::Parse(fileContent, SectionNames);
693 auto trig_thr = result.Sections[
"FCAL"].NameValues[
"FADC250_TRIG_THR"];
694 auto trig_nsb = result.Sections[
"FCAL"].NameValues[
"FADC250_TRIG_NSB"];
695 auto trig_nsa = result.Sections[
"FCAL"].NameValues[
"FADC250_TRIG_NSA"];
697 if(trig_thr.size() > 0){
698 FCAL_CELL_THR = stoi(trig_thr);
699 if(FCAL_CELL_THR < 0) FCAL_CELL_THR = 0;
702 if(trig_nsb.size() > 0)
703 FCAL_NSB = stoi(trig_nsb);
705 if(trig_thr.size() > 0)
706 FCAL_NSA = stoi(trig_nsa);
708 trig_thr = result.Sections[
"BCAL"].NameValues[
"FADC250_TRIG_THR"];
709 trig_nsb = result.Sections[
"BCAL"].NameValues[
"FADC250_TRIG_NSB"];
710 trig_nsa = result.Sections[
"BCAL"].NameValues[
"FADC250_TRIG_NSA"];
712 if(trig_thr.size() > 0){
713 BCAL_CELL_THR = stoi(trig_thr);
714 if(BCAL_CELL_THR < 0) BCAL_CELL_THR = 0;
717 if(trig_nsb.size() > 0)
718 BCAL_NSB = stoi(trig_nsb);
720 if(trig_thr.size() > 0)
721 BCAL_NSA = stoi(trig_nsa);
725 vector<vector<string>> triggerTypes;
727 for(
auto row : result.Sections[
"TRIGGER"].Rows) {
729 if(row[0] ==
"TRIG_TYPE") {
732 triggerTypes.push_back(row);
734 cout <<
" Cannot parse TRIG_TYPE. Insufficient number of parameters " << row.size() << endl;
740 if(row[0] ==
"TRIG_EQ") {
742 if(stoi(row[4]) == 1){
744 FCAL_WINDOW = stoi(row[3]);
745 if(row[1] ==
"BCAL_E")
746 BCAL_WINDOW = stoi(row[3]);
755 for(
int ii = 0; ii < 32; ii++){
761 memset(&trigger_tmp,0,
sizeof(trigger_tmp));
763 trigger_tmp.
bit = ii;
765 for(
unsigned int jj = 0; jj < triggerTypes.size(); jj++){
767 if(triggerTypes[jj].
size() < 9)
continue;
769 int bit = stoi(triggerTypes[jj][8]);
774 if(triggerTypes[jj][1] ==
"BFCAL"){
779 if(triggerTypes[jj][4].
size() > 0) fcal = stoi(triggerTypes[jj][4]);
780 if(triggerTypes[jj][5].
size() > 0) bcal = stoi(triggerTypes[jj][5]);
783 if( (fcal > 0) && (bcal > 0)){
784 trigger_tmp.
type = 0x3;
787 if(triggerTypes[jj][6].
size() > 0) trigger_tmp.
gtp.
en_thr = stoi(triggerTypes[jj][6]);
789 if(triggerTypes[jj].
size() > 9){
790 if((triggerTypes[jj].
size() >= 10) && (triggerTypes[jj][9].
size() > 0)) trigger_tmp.
gtp.
fcal_min = stoi(triggerTypes[jj][9]);
791 if((triggerTypes[jj].
size() >= 11) && (triggerTypes[jj][10].
size() > 0)) trigger_tmp.
gtp.
fcal_max = stoi(triggerTypes[jj][10]);
792 if((triggerTypes[jj].
size() >= 12) && (triggerTypes[jj][11].
size() > 0)) trigger_tmp.
gtp.
bcal_min = stoi(triggerTypes[jj][11]);
793 if((triggerTypes[jj].
size() >= 13) && (triggerTypes[jj][12].
size() > 0)) trigger_tmp.
gtp.
bcal_max = stoi(triggerTypes[jj][12]);
797 }
else if ((fcal > 0) && (bcal == 0)){
798 trigger_tmp.
type = 0x1;
800 if(triggerTypes[jj][6].
size() > 0) trigger_tmp.
gtp.
en_thr = stoi(triggerTypes[jj][6]);
801 if(triggerTypes[jj].
size() > 9){
802 if(triggerTypes[jj][9].
size() > 0) trigger_tmp.
gtp.
fcal_min = stoi(triggerTypes[jj][9]);
803 if(triggerTypes[jj][10].
size() > 0) trigger_tmp.
gtp.
fcal_max = stoi(triggerTypes[jj][10]);
806 }
else if ((bcal > 0) && (fcal == 0)){
807 trigger_tmp.
type = 0x2;
809 if(triggerTypes[jj][6].
size() > 0) trigger_tmp.
gtp.
en_thr = stoi(triggerTypes[jj][6]);
810 if((triggerTypes[jj].
size() >= 12) && (triggerTypes[jj][11].
size() > 0)) trigger_tmp.
gtp.
bcal_min = stoi(triggerTypes[jj][11]);
811 if((triggerTypes[jj].
size() >= 13) && (triggerTypes[jj][12].
size() > 0)) trigger_tmp.
gtp.
bcal_max = stoi(triggerTypes[jj][12]);
816 cout <<
" Incorrect parameters for BFCAL trigger " << endl;
819 }
else if(triggerTypes[jj][1] ==
"ST"){
820 trigger_tmp.
type = 0x4;
821 if(triggerTypes[jj][7].
size() > 0) trigger_tmp.
gtp.
st_nhit = stoi(triggerTypes[jj][7]);
822 if((triggerTypes[jj].
size() >= 14) && (triggerTypes[jj][13].
size() > 0)) trigger_tmp.
gtp.
st_pattern = stoi(triggerTypes[jj][13]);
825 }
else if(triggerTypes[jj][1] ==
"PS"){
826 trigger_tmp.
type = 0x8;
827 if(triggerTypes[jj][7].
size() > 0) trigger_tmp.
gtp.
ps_nhit = stoi(triggerTypes[jj][7]);
828 if((triggerTypes[jj].
size() >= 14) && (triggerTypes[jj][13].
size() > 0)) trigger_tmp.
gtp.
ps_pattern = stoi(triggerTypes[jj][13]);
830 }
else if(triggerTypes[jj][1] ==
"TAGH"){
831 trigger_tmp.
type = 0x10;
832 if(triggerTypes[jj][7].
size() > 0) trigger_tmp.
gtp.
tof_nhit = stoi(triggerTypes[jj][7]);
833 if((triggerTypes[jj].
size() >= 14) && (triggerTypes[jj][13].
size() > 0)){
838 }
else if(triggerTypes[jj][1] ==
"TOF"){
839 trigger_tmp.
type = 0x20;
840 if(triggerTypes[jj][7].
size() > 0) trigger_tmp.
gtp.
ps_nhit = stoi(triggerTypes[jj][7]);
841 if((triggerTypes[jj].
size() >= 14) && (triggerTypes[jj][13].
size() > 0)) trigger_tmp.
gtp.
tof_pattern = stoi(triggerTypes[jj][13]);
844 cout <<
" Incorrect Trigger type " << triggerTypes[jj][1] << endl;
848 triggers_enabled.push_back(trigger_tmp);
860 string comDir = result.Sections[
"FCAL"].NameValues[
"FADC250_COM_DIR"];
861 string comVer = result.Sections[
"FCAL"].NameValues[
"FADC250_COM_VER"];
862 string userDir = result.Sections[
"FCAL"].NameValues[
"FADC250_USER_DIR"];
863 string userVer = result.Sections[
"FCAL"].NameValues[
"FADC250_USER_VER"];
866 for(
int crate = 1; crate <= 12; crate++){
870 string comFileName = comDir +
"/rocfcal" +s +
"_fadc250_" + comVer +
".cnf";
871 string userFileName = userDir +
"/rocfcal" +s +
"_" + userVer +
".cnf";
873 auto userFile = connection.GetFile(runnumber, userFileName);
882 auto userParseResult = rcdb::ConfigParser::ParseWithSlots(userFile->GetContent(),
"FADC250_SLOTS");
885 for(
unsigned int slot = 3; slot <= 21; slot++){
887 auto userValues = userParseResult.SectionsBySlotNumber[slot].NameVectors[
"FADC250_TRG_MASK"];
889 if(userValues.size() > 0){
890 for (
unsigned int ch = 0; ch < userValues.size(); ++ch) {
892 if(userValues[ch].
size() == 0)
continue;
894 if(stoi(userValues[ch]) > 0){
896 uint32_t roc_id = 10 + crate;
903 channel_info = ttab[0]->GetDetectorIndex(daq_index);
907 cout <<
"Exception: FCAL channel is not in the translation table " <<
" Crate = " << 10 + crate <<
" Slot = " << slot <<
908 " Channel = " << ch << endl;
921 fcal_trig_mask.push_back(tmp);
936 comDir = result.Sections[
"BCAL"].NameValues[
"FADC250_COM_DIR"];
937 comVer = result.Sections[
"BCAL"].NameValues[
"FADC250_COM_VER"];
938 userDir = result.Sections[
"BCAL"].NameValues[
"FADC250_USER_DIR"];
939 userVer = result.Sections[
"BCAL"].NameValues[
"FADC250_USER_VER"];
942 for(
int crate = 1; crate <= 12; crate++){
944 if( (crate == 3) || (crate == 6) || (crate == 9) || (crate == 12))
continue;
948 string comFileName = comDir +
"/rocbcal" +s +
"_fadc250_" + comVer +
".cnf";
949 string userFileName = userDir +
"/rocbcal" +s +
"_" + userVer +
".cnf";
951 auto userFile = connection.GetFile(runnumber, userFileName);
960 auto userParseResult = rcdb::ConfigParser::ParseWithSlots(userFile->GetContent(),
"FADC250_SLOTS");
962 for(
unsigned int slot = 3; slot <= 21; slot++){
964 auto userValues = userParseResult.SectionsBySlotNumber[slot].NameVectors[
"FADC250_TRG_MASK"];
966 if(userValues.size() > 0){
968 for (
unsigned int ch = 0; ch < userValues.size(); ++ch) {
970 if(userValues[ch].
size() == 0)
continue;
972 if(stoi(userValues[ch]) > 0){
974 uint32_t roc_id = 30 + crate;
981 channel_info = ttab[0]->GetDetectorIndex(daq_index);
985 cout <<
"Exception: BCAL channel is not in the translation table " <<
" Crate = " << 30 + crate <<
" Slot = " << slot <<
986 " Channel = " << ch << endl;
1002 bcal_trig_mask.push_back(tmp);
1030 float exp_par = 0.358;
1032 int pulse_length = 20;
1034 if(type == 2) exp_par = 0.18;
1036 int sample_first = (int)floor(time/time_stamp);
1039 int ind_min = sample_first + 1;
1040 int ind_max = ind_min + pulse_length + 1;
1042 if( (ind_min > sample) || (ind_min < 0)){
1047 if(ind_max > sample){
1049 ind_max = sample - 1;
1052 for(
int i = ind_min; i < ind_max; i++ ){
1053 double adc_t = time_stamp*i - time;
1054 double amp = exp_par*exp_par*exp(-adc_t*exp_par)*
adc_t;
1061 amp_array[i] += amp*time_stamp*en;
1073 int INT_WINDOW = 20;
1077 INT_WINDOW = FCAL_WINDOW;
1080 INT_WINDOW = BCAL_WINDOW;
1089 for(
unsigned int samp = 0; samp < sample; samp++){
1092 index_min = samp - INT_WINDOW;
1094 if(index_min < 0) index_min = 0;
1098 for(
int ii = index_min; ii <= index_max; ii++){
1100 energy_sum += fcal_ssp[ii];
1102 energy_sum += bcal_ssp[ii];
1106 fcal_gtp[samp] = energy_sum;
1108 bcal_gtp[samp] = energy_sum;
1127 EN_THR = FCAL_CELL_THR;
1132 EN_THR = BCAL_CELL_THR;
1140 for(
unsigned int hit = 0; hit < merged_hits.size(); hit++){
1142 int index_min = -10;
1143 int index_max = -10;
1145 for(
int ii = 0; ii < sample; ii++){
1147 int pulse_found = 0;
1149 if(merged_hits[hit].adc_amp[ii] >= EN_THR){
1155 index_min = ii - NSB;
1157 if(index_max > index_min) index_min = index_max + 1;
1159 index_max = ii + NSA - 1;
1161 if(index_min < 0) index_min = 0;
1163 if(index_max >= sample){
1164 index_max = sample - 1;
1173 int index_tmp = index_max + 1;
1175 if(index_tmp < sample){
1176 if(merged_hits[hit].adc_amp[index_tmp] >= EN_THR){
1178 }
else extend_nsa = 0;
1179 }
else extend_nsa = 0;
1182 if(index_max >= sample)
1183 index_max = sample - 1;
1185 for(
int kk = index_min; kk <= index_max; kk++){
1187 if((merged_hits[hit].adc_amp[kk] - 100) > 0)
1188 fcal_ssp[kk] += (merged_hits[hit].adc_amp[kk] - TRIG_BASELINE);
1190 else if(detector == 2){
1191 if((merged_hits[hit].adc_amp[kk] - 100) > 0)
1192 bcal_ssp[kk] += (merged_hits[hit].adc_amp[kk] - TRIG_BASELINE);
1196 if(pulse_found == 1){
1212 unsigned int pattern = 0;
1214 cout << endl << endl;
1215 cout <<
" ------------ Trigger Settings --------------- " << endl;
1216 cout << endl << endl;
1218 cout <<
"----------- FCAL ----------- " << endl << endl;
1220 cout <<
"FCAL_CELL_THR = " << setw(10) << FCAL_CELL_THR << endl;
1221 cout <<
"FCAL_NSA = " << setw(10) << FCAL_NSA << endl;
1222 cout <<
"FCAL_NSB = " << setw(10) << FCAL_NSB << endl;
1223 cout <<
"FCAL_WINDOW = " << setw(10) << FCAL_WINDOW << endl;
1227 cout <<
"----------- BCAL ----------- " << endl << endl;
1229 cout <<
"BCAL_CELL_THR = " << setw(10) << BCAL_CELL_THR << endl;
1230 cout <<
"BCAL_NSA = " << setw(10) << BCAL_NSA << endl;
1231 cout <<
"BCAL_NSB = " << setw(10) << BCAL_NSB << endl;
1232 cout <<
"BCAL_WINDOW = " << setw(10) << BCAL_WINDOW << endl;
1234 cout << endl << endl;
1237 if(triggers_enabled.size() > 0){
1238 cout <<
"TYPE " <<
"FCAL_E " <<
"BCAL_E " <<
1239 "EN_THR " <<
"NHIT " <<
"LANE " <<
"FCAL_EMIN " <<
"FCAL_EMAX " <<
1240 "BCAL_EMIN " <<
"BCAL_EMAX " <<
"PATTERN " << endl;
1244 for(
unsigned int ii = 0; ii < triggers_enabled.size(); ii++){
1246 switch(triggers_enabled[ii].type){
1247 case 1: detector =
"BFCAL ";
1249 case 2: detector =
"BFCAL ";
1251 case 3: detector =
"BFCAL ";
1253 case 4: detector =
"ST ";
1254 nhit = triggers_enabled[ii].gtp.st_nhit;
1255 pattern = triggers_enabled[ii].gtp.st_pattern;
1257 case 8: detector =
"PS ";
1258 nhit = triggers_enabled[ii].gtp.ps_nhit;
1259 pattern = triggers_enabled[ii].gtp.ps_pattern;
1261 case 16: detector =
"TAGH ";
1262 nhit = triggers_enabled[ii].gtp.tagh_nhit;
1263 pattern = triggers_enabled[ii].gtp.tagh_pattern;
1265 case 32: detector =
"TOF ";
1266 nhit = triggers_enabled[ii].gtp.tof_nhit;
1267 pattern = triggers_enabled[ii].gtp.tof_pattern;
1269 default: detector =
"NONE ";
1270 cout <<
" Unknown detector ===== " << triggers_enabled[ii].type << endl;
1274 cout << detector << setw(6) <<
1275 triggers_enabled[ii].gtp.fcal << setw(9) <<
1276 triggers_enabled[ii].gtp.bcal << setw(11) <<
1277 triggers_enabled[ii].gtp.en_thr << setw(6) <<
1279 triggers_enabled[ii].bit << setw(12) <<
1280 triggers_enabled[ii].gtp.fcal_min << setw(14) <<
1281 triggers_enabled[ii].gtp.fcal_max << setw(10) <<
1282 triggers_enabled[ii].gtp.bcal_min << setw(14) <<
1283 triggers_enabled[ii].gtp.bcal_max << setw(8) <<
1284 hex << uppercase <<
"0x" << pattern << nouppercase << dec << endl;
1288 cout << endl << endl;
1299 for(
unsigned int ii = 0; ii < triggers_enabled.size(); ii++){
1301 if(triggers_enabled[ii].bit == 0){
1304 int bcal_energy = 0;
1306 for(
unsigned int samp = 0; samp < sample; samp++){
1308 int bcal_samp = samp - BCAL_OFFSET;
1312 }
else if(bcal_samp >= sample){
1315 bcal_energy = bcal_gtp[bcal_samp];
1319 gtp_energy = triggers_enabled[ii].gtp.fcal*fcal_gtp[samp] +
1320 triggers_enabled[ii].gtp.bcal*bcal_energy;
1322 if(gtp_energy >= triggers_enabled[ii].gtp.en_thr){
1324 if(triggers_enabled[ii].gtp.fcal_min > 0) {
1325 if(fcal_gtp[samp] > triggers_enabled[ii].gtp.fcal_min){
1344 if(triggers_enabled[ii].bit == 2){
1347 int bcal_energy = 0;
1349 for(
unsigned int samp = 0; samp < sample; samp++){
1351 int bcal_samp = samp - BCAL_OFFSET;
1355 }
else if(bcal_samp >= sample){
1358 bcal_energy = bcal_gtp[bcal_samp];
1361 gtp_energy = triggers_enabled[ii].gtp.bcal*bcal_energy;
1363 if(gtp_energy >= triggers_enabled[ii].gtp.en_thr){
1389 sprintf(str,
"FCAL geometry is wrong size! channels=%d (should be %d)",
1391 throw JException(str);
1395 for (
int ch = 0; ch < static_cast<int>(fcal_const_ch.size()); ch++) {
1401 int row = fcalGeom.
row(ch);
1402 int col = fcalGeom.
column(ch);
1407 sprintf(str,
"DL1MCTrigger: Loading FCAL constant for inactive channel! "
1408 "row=%d, col=%d", row, col);
1409 throw JException(str);
1412 table[row][col] = fcal_const_ch[ch];
1419 for(
int samp = 0; samp < sample; samp++ ){
1421 adc_count[samp] += (int)(adc_amp[samp] + TRIG_BASELINE + 0.5);
1423 if(adc_count[samp] > max_adc_bins)
1424 adc_count[samp] = max_adc_bins;
1432 double pedestal_correct = pedestal - TRIG_BASELINE;
1434 for(
int samp = 0; samp < sample; samp++ ){
1435 double tmp = gDRandom.Gaus(pedestal_correct, pedestal_sigma);
1436 adc_amp[samp] += tmp;
1442 cout <<
" Corrected pedestals = " << pedestal_correct <<
" " << adc_amp[sample - 2]
1443 <<
" " << pedestal_sigma << endl;
1454 JEvent&
event = loop->GetJEvent();
1456 JEventSource *source =
event.GetJEventSource();
1462 cerr <<
"DL1MCTrigger_factory: This program MUST be used with an HDDM file as input!" << endl;
1463 cerr <<
" Default seeds will be used for the random generator " << endl;
1464 seed1 = 259921049 + eventnumber;
1465 seed2 = 442249570 + eventnumber;
1466 seed3 = 709975946 + eventnumber;
1469 hddm_s::HDDM *record = (hddm_s::HDDM*)event.GetRef();
1471 seed1 = 259921049 + eventnumber;
1472 seed2 = 442249570 + eventnumber;
1473 seed3 = 709975946 + eventnumber;
1477 hddm_s::ReactionList::iterator reiter = record->getReactions().begin();
1479 hddm_s::Random my_rand = reiter->getRandom();
1482 seed1 = my_rand.getSeed1();
1483 seed2 = my_rand.getSeed2();
1484 seed3 = my_rand.getSeed3();
1488 if ((seed1 == 0) || (seed2 == 0) || (seed3 == 0)){
1489 uint64_t eventNo = record->getPhysicsEvent().getEventNo();
1490 seed1 = 259921049 + eventNo;
1491 seed2 = 442249570 + eventNo;
1492 seed3 = 709975946 + eventNo;
jerror_t init(void)
Called once at program start.
sprintf(text,"Post KinFit Cut")
int SignalPulse(double en, double time, double amp_array[sample], int type)
unsigned int tagh_pattern
DVector2 positionOnFace(int row, int column) const
void LoadFCALConst(fcal_constants_t &table, const vector< double > &fcal_const_ch, const DFCALGeometry &fcalGeom)
void SetSeeds(UInt_t &seed, UInt_t &seed1, UInt_t &seed2)
void AddBaseline(double adc_amp[sample], double pedestal, DRandom2 &gDRandom)
int column(int channel) const
int FADC_SSP(vector< T > merged_hits, int detector)
void Digitize(double adc_amp[sample], int adc_count[sample])
void GetSeeds(JEventLoop *loop, uint64_t eventnumber, UInt_t &seed1, UInt_t &seed2, UInt_t &seed3)
jerror_t fini(void)
Called after last event of last event source has been processed.
int FindTriggers(DL1MCTrigger *trigger)
static TH1I * pedestal[nChan]
jerror_t brun(jana::JEventLoop *eventLoop, int32_t runnumber)
Called everytime a new run number is detected.
int row(int channel) const
jerror_t erun(void)
Called everytime run number changes, provided brun has been called.
vector< vector< double > > fcal_constants_t
bool isBlockActive(int row, int column) const
int Read_RCDB(int32_t runnumber)
jerror_t evnt(jana::JEventLoop *eventLoop, uint64_t eventnumber)
Called every event.
int numActiveBlocks() const