From b66f9622a5f30081ffb71afc05d261ad97ad5409 Mon Sep 17 00:00:00 2001 From: "Stephen A. Wood" <saw@jlab.org> Date: Tue, 1 May 2012 11:40:06 -0400 Subject: [PATCH] Add a skeleton drift chamber that prints out drift chamber package hits. --- Makefile | 3 +- src/HallC_LinkDef.h | 2 + src/THcDriftChamber.cxx | 297 ++++++++++++++++++++++++++++++++++++++++ src/THcDriftChamber.h | 79 +++++++++++ 4 files changed, 380 insertions(+), 1 deletion(-) create mode 100644 src/THcDriftChamber.cxx create mode 100644 src/THcDriftChamber.h diff --git a/Makefile b/Makefile index 6fc33b4..ebcb3cd 100644 --- a/Makefile +++ b/Makefile @@ -10,8 +10,9 @@ SRC = src/THcInterface.cxx src/THcParmList.cxx src/THcAnalyzer.cxx \ src/THcHodoscopeHit.cxx src/THcRawHit.cxx \ + src/THcDCHit.cxx \ src/THcHitList.cxx src/THcDetectorMap.cxx src/THcHodoscope.cxx \ - src/THcHallCSpectrometer.cxx + src/THcHallCSpectrometer.cxx src/THcDriftChamber.cxx # Name of your package. # The shared library that will be built will get the name lib$(PACKAGE).so diff --git a/src/HallC_LinkDef.h b/src/HallC_LinkDef.h index c743ba4..5ac786e 100644 --- a/src/HallC_LinkDef.h +++ b/src/HallC_LinkDef.h @@ -12,8 +12,10 @@ #pragma link C++ class THcAnalyzer+; #pragma link C++ class THcRawHit+; #pragma link C++ class THcHodoscopeHit+; +#pragma link C++ class THcDCHit+; #pragma link C++ class THcHitList+; #pragma link C++ class THcHodoscope+; +#pragma link C++ class THcDriftChamber+; #pragma link C++ class THcDetectorMap+; #pragma link C++ class THcHallCSpectrometer+; diff --git a/src/THcDriftChamber.cxx b/src/THcDriftChamber.cxx new file mode 100644 index 0000000..2e8881d --- /dev/null +++ b/src/THcDriftChamber.cxx @@ -0,0 +1,297 @@ +/////////////////////////////////////////////////////////////////////////////// +// // +// THcDriftChamber // +// // +// Class for a generic hodoscope consisting of multiple // +// planes with multiple paddles with phototubes on both ends. // +// This differs from Hall A scintillator class in that it is the whole // +// hodoscope array, not just one plane. // +// // +/////////////////////////////////////////////////////////////////////////////// + +#include "THcDriftChamber.h" +#include "THaEvData.h" +#include "THaDetMap.h" +#include "THcDetectorMap.h" +#include "THcGlobals.h" +#include "THcParmList.h" +#include "VarDef.h" +#include "VarType.h" +#include "THaTrack.h" +#include "TClonesArray.h" +#include "TMath.h" + +#include "THaTrackProj.h" + +#include <cstring> +#include <cstdio> +#include <cstdlib> +#include <iostream> + +using namespace std; + +//_____________________________________________________________________________ +THcDriftChamber::THcDriftChamber( const char* name, const char* description, + THaApparatus* apparatus ) : + THaNonTrackingDetector(name,description,apparatus) +{ + // Constructor + + fTrackProj = new TClonesArray( "THaTrackProj", 5 ); +} + +//_____________________________________________________________________________ +THcDriftChamber::THcDriftChamber( ) : + THaNonTrackingDetector() +{ + // Constructor +} + +//_____________________________________________________________________________ +THaAnalysisObject::EStatus THcDriftChamber::Init( const TDatime& date ) +{ + static const char* const here = "Init()"; + + if( THaNonTrackingDetector::Init( date ) ) + return fStatus; + + // Replace with what we need for Hall C + // const DataDest tmp[NDEST] = { + // { &fRTNhit, &fRANhit, fRT, fRT_c, fRA, fRA_p, fRA_c, fROff, fRPed, fRGain }, + // { &fLTNhit, &fLANhit, fLT, fLT_c, fLA, fLA_p, fLA_c, fLOff, fLPed, fLGain } + // }; + // memcpy( fDataDest, tmp, NDEST*sizeof(DataDest) ); + + // Should probably put this in ReadDatabase as we will know the + // maximum number of hits after setting up the detector map + + THcHitList::InitHitList(fDetMap, "THcDCHit", 1000); + + // Will need to determine which apparatus it belongs to and use the + // appropriate detector ID in the FillMap call + if( gHcDetectorMap->FillMap(fDetMap, "HDC") < 0 ) { + Error( Here(here), "Error filling detectormap for %s.", + "HSCIN"); + return kInitError; + } + + return fStatus = kOK; +} + +//_____________________________________________________________________________ +Int_t THcDriftChamber::ReadDatabase( const TDatime& date ) +{ + // Read this detector's parameters from the database file 'fi'. + // This function is called by THaDetectorBase::Init() once at the + // beginning of the analysis. + // 'date' contains the date/time of the run being analyzed. + + // static const char* const here = "ReadDatabase()"; + + // Read data from database + // Pull values from the THcParmList instead of reading a database + // file like Hall A does. + + // DBRequest list[] = { + // { "TDC_offsetsL", fLOff, kDouble, fNelem }, + // { "TDC_offsetsR", fROff, kDouble, fNelem }, + // { "ADC_pedsL", fLPed, kDouble, fNelem }, + // { "ADC_pedsR", fRPed, kDouble, fNelem }, + // { "ADC_coefL", fLGain, kDouble, fNelem }, + // { "ADC_coefR", fRGain, kDouble, fNelem }, + // { "TDC_res", &fTdc2T }, + // { "TransSpd", &fCn }, + // { "AdcMIP", &fAdcMIP }, + // { "NTWalk", &fNTWalkPar, kInt }, + // { "Timewalk", fTWalkPar, kDouble, 2*fNelem }, + // { "ReTimeOff", fTrigOff, kDouble, fNelem }, + // { "AvgRes", &fResolution }, + // { "Atten", &fAttenuation }, + // { 0 } + // }; + + // We will probably want to add some kind of method to gHcParms to allow + // bulk retrieval of parameters of interest. + + // Will need to determine which spectrometer in order to construct + // the parameter names (e.g. hscin_1x_nr vs. sscin_1x_nr) + + fNPlanes = *(Int_t *)gHcParms->Find("hdc_num_planes")->GetValuePointer(); + + fNWires = new Int_t [fNPlanes]; + Int_t* p= (Int_t *)gHcParms->Find("hdc_nrwire")->GetValuePointer(); + for(Int_t i=0;i<fNPlanes;i++) { + fNWires[i] = p[i]; + } + + fIsInit = true; + + return kOK; +} + +//_____________________________________________________________________________ +Int_t THcDriftChamber::DefineVariables( EMode mode ) +{ + // Initialize global variables and lookup table for decoder + + if( mode == kDefine && fIsSetup ) return kOK; + fIsSetup = ( mode == kDefine ); + + // Register variables in global list + + // RVarDef vars[] = { + // { "nlthit", "Number of Left paddles TDC times", "fLTNhit" }, + // { "nrthit", "Number of Right paddles TDC times", "fRTNhit" }, + // { "nlahit", "Number of Left paddles ADCs amps", "fLANhit" }, + // { "nrahit", "Number of Right paddles ADCs amps", "fRANhit" }, + // { "lt", "TDC values left side", "fLT" }, + // { "lt_c", "Corrected times left side", "fLT_c" }, + // { "rt", "TDC values right side", "fRT" }, + // { "rt_c", "Corrected times right side", "fRT_c" }, + // { "la", "ADC values left side", "fLA" }, + // { "la_p", "Corrected ADC values left side", "fLA_p" }, + // { "la_c", "Corrected ADC values left side", "fLA_c" }, + // { "ra", "ADC values right side", "fRA" }, + // { "ra_p", "Corrected ADC values right side", "fRA_p" }, + // { "ra_c", "Corrected ADC values right side", "fRA_c" }, + // { "nthit", "Number of paddles with l&r TDCs", "fNhit" }, + // { "t_pads", "Paddles with l&r coincidence TDCs", "fHitPad" }, + // { "y_t", "y-position from timing (m)", "fYt" }, + // { "y_adc", "y-position from amplitudes (m)", "fYa" }, + // { "time", "Time of hit at plane (s)", "fTime" }, + // { "dtime", "Est. uncertainty of time (s)", "fdTime" }, + // { "dedx", "dEdX-like deposited in paddle", "fAmpl" }, + // { "troff", "Trigger offset for paddles", "fTrigOff"}, + // { "trn", "Number of tracks for hits", "GetNTracks()" }, + // { "trx", "x-position of track in det plane", "fTrackProj.THaTrackProj.fX" }, + // { "try", "y-position of track in det plane", "fTrackProj.THaTrackProj.fY" }, + // { "trpath", "TRCS pathlen of track to det plane","fTrackProj.THaTrackProj.fPathl" }, + // { "trdx", "track deviation in x-position (m)", "fTrackProj.THaTrackProj.fdX" }, + // { "trpad", "paddle-hit associated with track", "fTrackProj.THaTrackProj.fChannel" }, + // { 0 } + // }; + // return DefineVarsFromList( vars, mode ); + return kOK; +} + +//_____________________________________________________________________________ +THcDriftChamber::~THcDriftChamber() +{ + // Destructor. Remove variables from global list. + + if( fIsSetup ) + RemoveVariables(); + if( fIsInit ) + DeleteArrays(); + if (fTrackProj) { + fTrackProj->Clear(); + delete fTrackProj; fTrackProj = 0; + } +} + +//_____________________________________________________________________________ +void THcDriftChamber::DeleteArrays() +{ + // Delete member arrays. Used by destructor. + + delete [] fNWires; fNWires = NULL; + // delete [] fSpacing; fSpacing = NULL; + // delete [] fCenter; fCenter = NULL; // This 2D. What is correct way to delete? + + // delete [] fRA_c; fRA_c = NULL; + // delete [] fRA_p; fRA_p = NULL; + // delete [] fRA; fRA = NULL; + // delete [] fLA_c; fLA_c = NULL; + // delete [] fLA_p; fLA_p = NULL; + // delete [] fLA; fLA = NULL; + // delete [] fRT_c; fRT_c = NULL; + // delete [] fRT; fRT = NULL; + // delete [] fLT_c; fLT_c = NULL; + // delete [] fLT; fLT = NULL; + + // delete [] fRGain; fRGain = NULL; + // delete [] fLGain; fLGain = NULL; + // delete [] fRPed; fRPed = NULL; + // delete [] fLPed; fLPed = NULL; + // delete [] fROff; fROff = NULL; + // delete [] fLOff; fLOff = NULL; + // delete [] fTWalkPar; fTWalkPar = NULL; + // delete [] fTrigOff; fTrigOff = NULL; + + // delete [] fHitPad; fHitPad = NULL; + // delete [] fTime; fTime = NULL; + // delete [] fdTime; fdTime = NULL; + // delete [] fYt; fYt = NULL; + // delete [] fYa; fYa = NULL; +} + +//_____________________________________________________________________________ +inline +void THcDriftChamber::ClearEvent() +{ + // Reset per-event data. + + fTrackProj->Clear(); +} + +//_____________________________________________________________________________ +Int_t THcDriftChamber::Decode( const THaEvData& evdata ) +{ + + // Get the Hall C style hitlist (fRawHitList) for this event + Int_t nhits = THcHitList::DecodeToHitList(evdata); + + // fRawHitList is TClones array of THcDCHit objects + for(Int_t ihit = 0; ihit < fNRawHits ; ihit++) { + THcDCHit* hit = (THcDCHit *) fRawHitList->At(ihit); + cout << ihit << " : " << hit->fPlane << ":" << hit->fCounter << " : " + << endl; + for(Int_t imhit = 0; imhit < hit->fNHits; imhit++) { + cout << " " << imhit << " " << hit->fTDC[imhit] + << endl; + } + } + cout << endl; + + return nhits; +} + +//_____________________________________________________________________________ +Int_t THcDriftChamber::ApplyCorrections( void ) +{ + return(0); +} + +//_____________________________________________________________________________ +Int_t THcDriftChamber::CoarseProcess( TClonesArray& /* tracks */ ) +{ + // Calculation of coordinates of particle track cross point with scint + // plane in the detector coordinate system. For this, parameters of track + // reconstructed in THaVDC::CoarseTrack() are used. + // + // Apply corrections and reconstruct the complete hits. + // + // static const Double_t sqrt2 = TMath::Sqrt(2.); + + ApplyCorrections(); + + return 0; +} + +//_____________________________________________________________________________ +Int_t THcDriftChamber::FineProcess( TClonesArray& tracks ) +{ + // Reconstruct coordinates of particle track cross point with scintillator + // plane, and copy the data into the following local data structure: + // + // Units of measurements are meters. + + // Calculation of coordinates of particle track cross point with scint + // plane in the detector coordinate system. For this, parameters of track + // reconstructed in THaVDC::FineTrack() are used. + + return 0; +} + +ClassImp(THcDriftChamber) +//////////////////////////////////////////////////////////////////////////////// diff --git a/src/THcDriftChamber.h b/src/THcDriftChamber.h new file mode 100644 index 0000000..b9f7be4 --- /dev/null +++ b/src/THcDriftChamber.h @@ -0,0 +1,79 @@ +#ifndef ROOT_THcDriftChamber +#define ROOT_THcDriftChamber + +/////////////////////////////////////////////////////////////////////////////// +// // +// THcDriftChamber // +// // +/////////////////////////////////////////////////////////////////////////////// + +#include "TClonesArray.h" +#include "THaNonTrackingDetector.h" +#include "THcHitList.h" +#include "THcDCHit.h" + +class THaScCalib; + +class THcDriftChamber : public THaNonTrackingDetector, public THcHitList { + +public: + THcDriftChamber( const char* name, const char* description = "", + THaApparatus* a = NULL ); + virtual ~THcDriftChamber(); + + virtual Int_t Decode( const THaEvData& ); + virtual EStatus Init( const TDatime& run_time ); + virtual Int_t CoarseProcess( TClonesArray& tracks ); + virtual Int_t FineProcess( TClonesArray& tracks ); + + virtual Int_t ApplyCorrections( void ); + + // Int_t GetNHits() const { return fNhit; } + + Int_t GetNTracks() const { return fTrackProj->GetLast()+1; } + const TClonesArray* GetTrackHits() const { return fTrackProj; } + + friend class THaScCalib; + + THcDriftChamber(); // for ROOT I/O +protected: + + // Calibration + + // Per-event data + + + // Potential Hall C parameters. Mostly here for demonstration + Int_t fNPlanes; + Int_t* fNWires; // Number of wires per plane + + TClonesArray* fTrackProj; // projection of track onto scintillator plane + // and estimated match to TOF paddle + // Useful derived quantities + // double tan_angle, sin_angle, cos_angle; + + // static const char NDEST = 2; + // struct DataDest { + // Int_t* nthit; + // Int_t* nahit; + // Double_t* tdc; + // Double_t* tdc_c; + // Double_t* adc; + // Double_t* adc_p; + // Double_t* adc_c; + // Double_t* offset; + // Double_t* ped; + // Double_t* gain; + // } fDataDest[NDEST]; // Lookup table for decoder + + void ClearEvent(); + void DeleteArrays(); + virtual Int_t ReadDatabase( const TDatime& date ); + virtual Int_t DefineVariables( EMode mode = kDefine ); + + ClassDef(THcDriftChamber,0) // Generic hodoscope class +}; + +//////////////////////////////////////////////////////////////////////////////// + +#endif -- GitLab