Skip to content
Snippets Groups Projects
Commit 2393326d authored by Stephen A. Wood's avatar Stephen A. Wood Committed by Stephen A. Wood
Browse files

Initial draft of class to read Config (125) events

  Provides methods get NSA, NSB, and NPED for each crate
parent b4af0591
No related branches found
No related tags found
No related merge requests found
...@@ -30,7 +30,7 @@ SRC = src/THcInterface.cxx src/THcParmList.cxx src/THcAnalyzer.cxx \ ...@@ -30,7 +30,7 @@ SRC = src/THcInterface.cxx src/THcParmList.cxx src/THcAnalyzer.cxx \
src/THcRaster.cxx\ src/THcRaster.cxx\
src/THcRasteredBeam.cxx\ src/THcRasteredBeam.cxx\
src/THcRasterRawHit.cxx \ src/THcRasterRawHit.cxx \
src/THcScalerEvtHandler.cxx \ src/THcScalerEvtHandler.cxx src/THcConfigEvtHandler.cxx \
src/THcHodoEff.cxx \ src/THcHodoEff.cxx \
src/THcTrigApp.cxx src/THcTrigDet.cxx src/THcTrigRawHit.cxx \ src/THcTrigApp.cxx src/THcTrigDet.cxx src/THcTrigRawHit.cxx \
src/THcRawAdcHit.cxx src/THcRawTdcHit.cxx \ src/THcRawAdcHit.cxx src/THcRawTdcHit.cxx \
......
...@@ -21,7 +21,7 @@ src/THcShowerArray.h src/THcShowerHit.h ...@@ -21,7 +21,7 @@ src/THcShowerArray.h src/THcShowerHit.h
src/THcRawShowerHit.h src/THcAerogel.h src/THcAerogelHit.h src/THcCherenkov.h src/THcCherenkovHit.h src/THcRawShowerHit.h src/THcAerogel.h src/THcAerogelHit.h src/THcCherenkov.h src/THcCherenkovHit.h
src/THcGlobals.h src/THcDCTrack.h src/THcFormula.h src/THcGlobals.h src/THcDCTrack.h src/THcFormula.h
src/THcRaster.h src/THcRasteredBeam.h src/THcRasterRawHit.h src/THcScalerEvtHandler.h src/THcRaster.h src/THcRasteredBeam.h src/THcRasterRawHit.h src/THcScalerEvtHandler.h
src/THcHodoEff.h src/THcConfigEvtHandler.h src/THcHodoEff.h
src/THcTrigApp.h src/THcTrigDet.h src/THcTrigRawHit.h src/THcTrigApp.h src/THcTrigDet.h src/THcTrigRawHit.h
src/THcRawAdcHit.h src/THcRawTdcHit.h src/THcRawAdcHit.h src/THcRawTdcHit.h
src/THcDummySpectrometer.h src/THcDummySpectrometer.h
......
...@@ -56,6 +56,7 @@ ...@@ -56,6 +56,7 @@
#pragma link C++ class THcRasteredBeam+; #pragma link C++ class THcRasteredBeam+;
#pragma link C++ class THcRasterRawHit+; #pragma link C++ class THcRasterRawHit+;
#pragma link C++ class THcScalerEvtHandler+; #pragma link C++ class THcScalerEvtHandler+;
#pragma link C++ class THcConfigEvtHandler+;
#pragma link C++ class THcHodoEff+; #pragma link C++ class THcHodoEff+;
#pragma link C++ class THcTrigApp+; #pragma link C++ class THcTrigApp+;
#pragma link C++ class THcTrigDet+; #pragma link C++ class THcTrigDet+;
......
...@@ -26,7 +26,7 @@ THcAerogel.cxx THcAerogelHit.cxx ...@@ -26,7 +26,7 @@ THcAerogel.cxx THcAerogelHit.cxx
THcCherenkov.cxx THcCherenkovHit.cxx THcCherenkov.cxx THcCherenkovHit.cxx
THcFormula.cxx THcFormula.cxx
THcRaster.cxx THcRasteredBeam.cxx THcRasterRawHit.cxx THcRaster.cxx THcRasteredBeam.cxx THcRasterRawHit.cxx
THcScalerEvtHandler.cxx THcScalerEvtHandler.cxx THcConfigEvtHandler.cxx
THcTrigApp.cxx THcTrigDet.cxx THcTrigRawHit.cxx THcTrigApp.cxx THcTrigDet.cxx THcTrigRawHit.cxx
THcRawAdcHit.cxx THcRawTdcHit.cxx THcRawAdcHit.cxx THcRawTdcHit.cxx
THcDummySpectrometer.cxx THcDummySpectrometer.cxx
......
/** \class THcConfigEvtHandler
\ingroup base
Event handler for Hall C prestart config event. Type 125
Example of an Event Type Handler for event type 125,
the hall C prestart event.
It was tested on some hms data. However, note that I don't know what
these data mean yet and I presume the data structure is under development;
someone will need to modify this class (and the comments).
To use as a plugin with your own modifications, you can do this in
your analysis script
gHaEvtHandlers->Add (new THcConfigEvtHandler("hallcpre","for evtype 125"));
Global variables are defined in Init. You can see them in Podd, as
analyzer [2] gHaVars->Print()
OBJ: THaVar HCvar1 Hall C event type 125 variable 1
OBJ: THaVar HCvar2 Hall C event type 125 variable 2
OBJ: THaVar HCvar3 Hall C event type 125 variable 3
OBJ: THaVar HCvar4 Hall C event type 125 variable 4
The data can be added to the ROOT Tree "T" using the output
definition file. Then you can see them, for example as follows
T->Scan("HCvar1:HCvar2:HCvar3:HCvar4")
\author Robert Michaels (rom@jlab.org), updated by Stephen Wood (saw@jlab.org)
*/
#include "THcConfigEvtHandler.h"
#include "THaEvData.h"
#include "THaVarList.h"
#include <cstring>
#include <cstdio>
#include <cstdlib>
#include <iostream>
using namespace std;
THcConfigEvtHandler::THcConfigEvtHandler(const char *name, const char* description)
: THaEvtTypeHandler(name,description)
{
}
THcConfigEvtHandler::~THcConfigEvtHandler()
{
}
//Float_t THcConfigEvtHandler::GetData(const std::string& tag)
//{
// // A public method which other classes may use
// if (theDataMap.find(tag) == theDataMap.end())
// return 0;
// return theDataMap[tag];
//}
Int_t THcConfigEvtHandler::Analyze(THaEvData *evdata)
{
Bool_t ldebug = true; // FIXME: use fDebug
if ( !IsMyEvent(evdata->GetEvType()) ) return -1;
if (ldebug) cout << "------------------\n Event type 125"<<endl;
Int_t evlen = evdata->GetEvLength();
Int_t ip = 0;
ip++;
UInt_t thisword = evdata->GetRawData(ip);
Int_t roc = thisword & 0xff;
cout << "THcConfigEvtHandler: " << roc << endl;
// Should check if this roc has already been seen
CrateInfo_t *cinfo = new CrateInfo_t;
cinfo->FADC250.nmodules=0;
cinfo->FADC250.present=0;
cinfo->CAEN1190.present=0;
CrateInfoMap.insert(std::make_pair(roc, cinfo));
ip++;
// Three possible blocks of config data
// 0xdafadc01 - FADC information for the crate
// 0xdafadcff - Set of threshold by slot/channel
// 0xdedc1190 - 1190 TDC information for the crate
thisword = evdata->GetRawData(ip);
while(ip<evlen) {
if (thisword == 0xdafadcff) {
ip++;
thisword = evdata->GetRawData(ip);
cout << "ADC thresholds for slots ";
while((thisword & 0xfffff000)==0xfadcf000) {
Int_t slot = thisword&0x1f;
// Should check if this slot has already been SDC_WIRE_CENTER
cinfo->FADC250.nmodules++;
cout << " " << slot;
Int_t *thresholds = new Int_t [16];
cinfo->FADC250.thresholds.insert(std::make_pair(slot, thresholds));
for(Int_t i=0;i<16;i++) {
thresholds[i] = evdata->GetRawData(ip+i);
}
ip +=18;
if(ip>=evlen) {
if(ip>evlen) {
cout << endl << "Info event truncated" << endl;
}
break;
}
thisword = evdata->GetRawData(ip);
}
cout << endl;
} else if((thisword&0xffffff00) == 0xdafadc00) { // FADC250 information
cout << "ADC information: Block level " << (thisword&0xff) << endl;
cinfo->FADC250.present = 1;
cinfo->FADC250.blocklevel = thisword&0xff;
cinfo->FADC250.daq_level = evdata->GetRawData(ip+2);
cinfo->FADC250.threshold = evdata->GetRawData(ip+3);
cinfo->FADC250.mode = evdata->GetRawData(ip+4);
cinfo->FADC250.window_lat = evdata->GetRawData(ip+5);
cinfo->FADC250.window_width = evdata->GetRawData(ip+6);
cinfo->FADC250.nsb = evdata->GetRawData(ip+7);
cinfo->FADC250.nsa = evdata->GetRawData(ip+8);
cinfo->FADC250.np = evdata->GetRawData(ip+9);
cinfo->FADC250.nped = evdata->GetRawData(ip+10);
cinfo->FADC250.maxped = evdata->GetRawData(ip+11);
cinfo->FADC250.nsat = evdata->GetRawData(ip+12);
ip += 13;
thisword = evdata->GetRawData(ip);
} else if (thisword == 0xdedc1190) { // CAEN 1190 information
cout << "TDC information" << endl;
cinfo->CAEN1190.present = 1;
cinfo->CAEN1190.resolution = evdata->GetRawData(ip+2);
cinfo->CAEN1190.timewindow_offset = evdata->GetRawData(ip+3);
cinfo->CAEN1190.timewindow_width = evdata->GetRawData(ip+4);
ip += 6;
thisword = evdata->GetRawData(ip);
} else {
cout << "Expected header missing" << endl;
cout << ip << " " << hex << thisword << dec << endl;
ip = evlen;
}
}
return 1;
}
void THcConfigEvtHandler::PrintConfig()
{
/**
Stub of method to pretty print the config data
*/
cout << "Configuration Data" << endl;
std::map<Int_t, CrateInfo_t *>::iterator it = CrateInfoMap.begin();
while(it != CrateInfoMap.end()) {
Int_t roc = it->first;
CrateInfo_t *cinfo = it->second;
cout<<roc<<" "<<cinfo->FADC250.present<< " " << cinfo->CAEN1190.present << endl;
it++;
}
}
Int_t THcConfigEvtHandler::GetNSA(Int_t crate) {
if(CrateInfoMap.find(crate)!=CrateInfoMap.end()) {
CrateInfo_t *cinfo = CrateInfoMap[crate];
if(cinfo->FADC250.present > 0) return(cinfo->FADC250.nsa);
}
return(-1);
}
Int_t THcConfigEvtHandler::GetNSB(Int_t crate) {
if(CrateInfoMap.find(crate)!=CrateInfoMap.end()) {
CrateInfo_t *cinfo = CrateInfoMap[crate];
if(cinfo->FADC250.present > 0) return(cinfo->FADC250.nsb);
}
return(-1);
}
Int_t THcConfigEvtHandler::GetNPED(Int_t crate) {
if(CrateInfoMap.find(crate)!=CrateInfoMap.end()) {
CrateInfo_t *cinfo = CrateInfoMap[crate];
if(cinfo->FADC250.present > 0) return(cinfo->FADC250.nped);
}
return(-1);
}
void THcConfigEvtHandler::AddEventType(Int_t evtype)
{
eventtypes.push_back(evtype);
}
THaAnalysisObject::EStatus THcConfigEvtHandler::Init(const TDatime& date)
{
cout << "Howdy ! We are initializing THcConfigEvtHandler !! name = "<<fName<<endl;
if(eventtypes.size()==0) {
eventtypes.push_back(125); // what events to look for
}
// dvars is a member of this class.
// The index of the dvars array track the array of global variables created.
// This is just a fake example with 4 variables.
// Please change these comments when you modify this class.
NVars = 4;
dvars = new Double_t[NVars];
memset(dvars, 0, NVars*sizeof(Double_t));
if (gHaVars) {
cout << "EvtHandler:: Have gHaVars. Good thing. "<<gHaVars<<endl;
} else {
cout << "EvtHandler:: No gHaVars ?! Well, that is a problem !!"<<endl;
return kInitError;
}
const Int_t* count = 0;
char cname[80];
char cdescription[80];
for (UInt_t i = 0; i < NVars; i++) {
sprintf(cname,"HCvar%d",i+1);
sprintf(cdescription,"Hall C event type 125 variable %d",i+1);
gHaVars->DefineByType(cname, cdescription, &dvars[i], kDouble, count);
}
fStatus = kOK;
return kOK;
}
ClassImp(THcConfigEvtHandler)
#ifndef THcConfigEvtHandler_
#define THcConfigEvtHandler_
/////////////////////////////////////////////////////////////////////
//
// THcConfigEvtHandler
// For more details see the implementation file.
// This handles hall C's event type 125.
// author Robert Michaels (rom@jlab.org)
//
/////////////////////////////////////////////////////////////////////
#include "THaEvtTypeHandler.h"
#include <string>
#include <vector>
#include <map>
class THcConfigEvtHandler : public THaEvtTypeHandler {
public:
THcConfigEvtHandler(const char* name, const char* description);
virtual ~THcConfigEvtHandler();
virtual Int_t Analyze(THaEvData *evdata);
virtual void AddEventType(Int_t evtype);
virtual void PrintConfig();
virtual Int_t GetNSA(Int_t crate);
virtual Int_t GetNSB(Int_t crate);
virtual Int_t GetNPED(Int_t crate);
virtual EStatus Init( const TDatime& run_time);
// Float_t GetData(const std::string& tag);
private:
// std::map<std::string, Float_t> theDataMap;
std::vector<std::string> dataKeys;
UInt_t NVars;
Double_t *dvars;
typedef struct {
struct FADC250 {
Int_t present;
Int_t daq_level;
Int_t threshold;
Int_t mode;
Int_t window_lat;
Int_t window_width;
Int_t nsb;
Int_t nsa;
Int_t np;
Int_t nped;
Int_t maxped;
Int_t nsat;
Int_t nmodules;
Int_t blocklevel;
std::map<Int_t, Int_t *> thresholds;
} FADC250;
struct CAEN1190 {
Int_t present;
Int_t resolution;
Int_t timewindow_offset;
Int_t timewindow_width;
} CAEN1190;
//CrateInfo : FADC250.nmodules(0),CAEN1190.present(0) {}
} CrateInfo_t;
std::map<Int_t, CrateInfo_t *> CrateInfoMap;
THcConfigEvtHandler(const THcConfigEvtHandler& fh);
THcConfigEvtHandler& operator=(const THcConfigEvtHandler& fh);
ClassDef(THcConfigEvtHandler,0) // Hall C event type 125
};
#endif
...@@ -50,6 +50,8 @@ To enable debugging you may try this in the setup script ...@@ -50,6 +50,8 @@ To enable debugging you may try this in the setup script
#include <cstdlib> #include <cstdlib>
#include <iostream> #include <iostream>
#include <sstream> #include <sstream>
#include <map>
#include <iterator>
#include "THaVarList.h" #include "THaVarList.h"
#include "VarDef.h" #include "VarDef.h"
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment