From 8420360842be961638fed21d436f0c75db53e8fe Mon Sep 17 00:00:00 2001
From: Eric Pooser <pooser@jlab.org>
Date: Sun, 25 Jun 2017 18:34:46 -0400
Subject: [PATCH] Pooser workshop (#153)

* Add summer 2017 software analysis workshop example

* Add summer 2017 software analysis workshop example for real this time
---
 .gitignore                              |   1 +
 DEF-files/SHMS/GEN/workshop_example.def |  31 +++++++
 SCRIPTS/SHMS/replay_workshop_example.C  | 108 ++++++++++++++++++++++++
 3 files changed, 140 insertions(+)
 create mode 100644 DEF-files/SHMS/GEN/workshop_example.def
 create mode 100644 SCRIPTS/SHMS/replay_workshop_example.C

diff --git a/.gitignore b/.gitignore
index 43334f1f..c3278c6f 100644
--- a/.gitignore
+++ b/.gitignore
@@ -22,5 +22,6 @@ CALIBRATION/shms_cal_calib/calibrated.deb
 CALIBRATION/hms_cal_calib/calibrated.deb
 CALIBRATION/hms_cal_calib/hcal_calib_cpp_ACLiC_dict_rdict.pcm
 CALIBRATION/shms_cal_calib/pcal_calib_cpp_ACLiC_dict_rdict.pcm
+onlineGUI/onlineGUI_v1.2.1/onlineDict_rdict.pcm
 
 
diff --git a/DEF-files/SHMS/GEN/workshop_example.def b/DEF-files/SHMS/GEN/workshop_example.def
new file mode 100644
index 00000000..9d55066b
--- /dev/null
+++ b/DEF-files/SHMS/GEN/workshop_example.def
@@ -0,0 +1,31 @@
+# Block variable definitions
+block T.shms.*
+block P.dc.*
+block P.hod.*
+block P.hgcer.*
+block P.gtr.*
+
+# Hodoscope 1x+ ADC 1D histograms
+TH1F phodo_1x_pos_rawpa 'SHMS 1X+ Raw Pulse Amplitude; Raw Pulse Amplitude; Number of Entries / 10 ADC Channels' P.hod.1x.posAdcPulseAmpRaw 410 0 4100
+TH1F phodo_1x_pos_pa 'SHMS 1X+ Pulse Amplitude; Pulse Amplitude; Number of Entries / 10 ADC Channels' P.hod.1x.posAdcPulseAmp 410 0 4100
+TH1F phodo_1x_pos_pt 'SHMS 1X+ Raw Pulse Time; Raw Pulse Time; Number of Entried / 100 ADC Channels' P.hod.1x.posAdcPulseTimeRaw 640 0 6400
+
+# Hodoscope 1x+ ADC cut 1D histogram
+TH1F phodo_1x_pos_pa_ntrack_cut 'SHMS 1X+ Pulse Amplitude NTrack = 1 Cut; Pulse Amplitude; Number of Entries / 10 ADC Channels' P.hod.1x.posAdcPulseAmp 410 0 4100 P.dc.ntrack==1
+
+# Hodoscope 1x+ ADC 2D histograms
+TH2F phodo_1x_pos_rawpa_vs_pmt 'SHMS 1X+ Raw Pulse Amplitude vs PMT; PMT Number; Raw Pulse Amplitude / 10 ADC Channels' P.hod.1x.posAdcCounter P.hod.1x.posAdcPulseAmpRaw 13 0.5 13.5 410 0 4100
+TH2F phodo_1x_pos_pa_vs_pmt 'SHMS 1X+ Pulse Amplitude vs PMT; PMT Number; Pulse Amplitude / 10 ADC Channels' P.hod.1x.posAdcCounter P.hod.1x.posAdcPulseAmp 13 0.5 13.5 410 0 4100
+TH2F phodo_1x_pos_pt_vs_pmt 'SHMS 1X+ Raw Pulse Time vs PMT; PMT Number; Raw Pulse Time / 100 ADC Channels' P.hod.1x.posAdcCounter P.hod.1x.posAdcPulseTimeRaw 13 0.5 13.5 640 0 6400
+
+# DC TDC 2D histograms
+TH2F pdc_1x1_raw_tdc 'SHMS 1X1 Raw TDC vs. Wire Number; Wire Number; Raw TDC Value/ 10 TDC Units' P.dc.1x1.wirenum P.dc.1u1.rawtdc 79 0.5 79.5 5000 -25000 25000
+
+# Heavy gas 2D histograms
+# Vector of histograms
+TH2F phgc_good_pt_vs_pa_pmt_ 'SHMS HGCER Good Pulse Time vs. Good Pulse Amplitude; Good Pulse Amplitude / 10 ADC Channels; Good Pulse Time / 100 ADC Channels' P.hgcer.goodAdcPulseAmp P.hgcer.goodAdcPulseTime 410 0 4100 250 0 2500
+# Scalar histogram
+sTH2F phgc_good_pt_vs_pa_all 'SHMS HGCER Good Pulse Time vs. Good Pulse Amplitude; Good Pulse Amplitude / 10 ADC Channels; Good Pulse Time / 100 ADC Channels' P.hgcer.goodAdcPulseAmp P.hgcer.goodAdcPulseTime 410 0 4100 250 0 2500
+# Eye histogram
+TH1F phgc_good_pi_pmt_3  'SHMS HGCER Good Pulse Integral; Good Pulse Integral; Number of Entries / 100 ADC Channels' P.hgcer.goodAdcPulseInt[2] 300 0 30000
+TH2F phgc_good_pi_vs_pmt 'SHMS HGCER Good Pulse Integral vs. PMT; PMT Number; Good Pulse Integral / 100 ADC Channels' [I+1] P.hgcer.goodAdcPulseInt 4 0.5 4.5 300 0 30000 P.hgcer.goodAdcPulseInt>0.0
\ No newline at end of file
diff --git a/SCRIPTS/SHMS/replay_workshop_example.C b/SCRIPTS/SHMS/replay_workshop_example.C
new file mode 100644
index 00000000..0053bae9
--- /dev/null
+++ b/SCRIPTS/SHMS/replay_workshop_example.C
@@ -0,0 +1,108 @@
+void replay_workshop_example(Int_t RunNumber=0, Int_t MaxEvent=0) {
+
+  // Get RunNumber and MaxEvent if not provided.
+  if(RunNumber == 0) {
+    cout << "Enter a Run Number (-1 to exit): ";
+    cin >> RunNumber;
+    if( RunNumber<=0 ) return;
+  }
+  if(MaxEvent == 0) {
+    cout << "\nNumber of Events to analyze: ";
+    cin >> MaxEvent;
+    if(MaxEvent == 0) {
+      cerr << "...Invalid entry\n";
+      exit;
+    }
+  }
+  // Create file name patterns.
+  const char* RunFileNamePattern = "raw/shms_all_%05d.dat";
+  const char* ROOTFileNamePattern = "ROOTfiles/shms_replay_%d_%d.root";
+  // Add variables to global list.
+  gHcParms->Define("gen_run_number", "Run Number", RunNumber);
+  gHcParms->AddString("g_ctp_database_filename", "DBASE/standard.database");
+  // Load varibles from files to global list.
+  gHcParms->Load(gHcParms->GetString("g_ctp_database_filename"), RunNumber);
+  // g_ctp_parm_filename and g_decode_map_filename should now be defined.
+  gHcParms->Load(gHcParms->GetString("g_ctp_kinematics_filename"), RunNumber);
+  gHcParms->Load(gHcParms->GetString("g_ctp_parm_filename"));
+  // Load params for SHMS trigger configuration
+  gHcParms->Load("PARAM/TRIG/tshms.param");
+
+  // Load the Hall C style detector map
+  gHcDetectorMap = new THcDetectorMap();
+  gHcDetectorMap->Load("MAPS/SHMS/DETEC/shms_stack.map");
+
+  // Add trigger apparatus
+  THaApparatus* TRG = new THcTrigApp("T", "TRG");
+  gHaApps->Add(TRG);
+  // Add trigger detector to trigger apparatus
+  THcTrigDet* shms = new THcTrigDet("shms", "SHMS Trigger Information");
+  TRG->AddDetector(shms);
+  // Set up the equipment to be analyzed.
+  THaApparatus* SHMS = new THcHallCSpectrometer("P", "SHMS");
+  gHaApps->Add(SHMS);
+  // Add drift chambers to SHMS apparatus
+  THcDC* dc = new THcDC("dc", "Drift Chambers");
+  SHMS->AddDetector(dc);
+  // Add hodoscope to SHMS apparatus
+  THcHodoscope* hod = new THcHodoscope("hod", "Hodoscope");
+  SHMS->AddDetector(hod);
+  // Add Heavy Gas Cherenkov to SHMS apparatus
+  THcCherenkov* hgcer = new THcCherenkov("hgcer", "Heavy Gas Cherenkov");
+  SHMS->AddDetector(hgcer);
+  // Include golden track information
+  THaGoldenTrack* gtr = new THaGoldenTrack("P.gtr", "SHMS Golden Track", "P");
+  gHaPhysics->Add(gtr);
+
+  // Add handler for prestart event 125.
+  THcConfigEvtHandler* ev125 = new THcConfigEvtHandler("HC", "Config Event type 125");
+  gHaEvtHandlers->Add(ev125);
+
+  // Set up the analyzer - we use the standard one,
+  // but this could be an experiment-specific one as well.
+  // The Analyzer controls the reading of the data, executes
+  // tests/cuts, loops over Acpparatus's and PhysicsModules,
+  // and executes the output routines.
+  THcAnalyzer* analyzer = new THcAnalyzer;
+
+  // A simple event class to be output to the resulting tree.
+  // Creating your own descendant of THaEvent is one way of
+  // defining and controlling the output.
+  THaEvent* event = new THaEvent;
+
+  // Define the run(s) that we want to analyze.
+  // We just set up one, but this could be many.
+  char RunFileName[100];
+  sprintf(RunFileName, RunFileNamePattern, RunNumber);
+  THaRun* run = new THaRun(RunFileName);
+
+  // Eventually need to learn to skip over, or properly analyze
+  // the pedestal events
+  run->SetEventRange(1, MaxEvent);    // Physics Event number, does not
+                                      // include scaler or control events.
+  run->SetNscan(1);
+  run->SetDataRequired(0x7);
+  run->Print();
+
+  // Define the analysis parameters
+  TString ROOTFileName = Form(ROOTFileNamePattern, RunNumber, MaxEvent);
+  analyzer->SetCountMode(2);    // 0 = counter is # of physics triggers
+                                // 1 = counter is # of all decode reads
+                                // 2 = counter is event number
+  analyzer->SetEvent(event);
+  analyzer->SetCrateMapFileName("MAPS/db_cratemap.dat");
+  analyzer->SetOutFile(ROOTFileName.Data());
+  analyzer->SetOdefFile("DEF-files/SHMS/GEN/workshop_example.def");
+  analyzer->SetCutFile("DEF-files/SHMS/GEN/pstackana_cuts.def");    // optional
+
+  // File to record cuts accounting information
+  //analyzer->SetSummaryFile("summary_example.log");    // optional
+
+  // Start the actual analysis.
+  analyzer->Process(run);
+  // Create report file from template.
+  //analyzer->PrintReport(    // optional
+  //  "TEMPLATES/dcana.template",
+  //  Form("REPORT_OUTPUT/replay_shms_%05d.report", RunNumber)
+  //); 
+}
-- 
GitLab