diff --git a/.gitignore b/.gitignore index e2c1aa5be9e1261caedb7eda626be03aa08131f6..42661621bae74ef9ed49c5d579dcf090310c8e6b 100644 --- a/.gitignore +++ b/.gitignore @@ -10,7 +10,7 @@ hcana *.[oad] *~ *.so -\#.*\# +\#*\# # Examples directory examples/*.root diff --git a/.gitmodules b/.gitmodules index ddb12369a39ec2ec17d8682ebc026af723ec95a7..e6a3a04529afd649dcca34240a4560b7cd42b921 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,3 +1,3 @@ [submodule "podd"] path = podd - url = git@github.com:sawjlab/podd.git + url = git://github.com/sawjlab/podd.git diff --git a/Makefile b/Makefile index 8965ef476807633dea2e5d9160fb5635dd01aef5..541d5812243a4a31d5b29f242621c40095cfc298 100644 --- a/Makefile +++ b/Makefile @@ -9,12 +9,16 @@ SRC = src/THcInterface.cxx src/THcParmList.cxx src/THcAnalyzer.cxx \ - src/THcHodoscopeHit.cxx src/THcRawHit.cxx \ + src/THcHallCSpectrometer.cxx \ + src/THcDetectorMap.cxx \ + src/THcRawHit.cxx src/THcHitList.cxx \ + src/THcSignalHit.cxx \ + src/THcHodoscope.cxx src/THcScintillatorPlane.cxx \ + src/THcHodoscopeHit.cxx \ + src/THcDriftChamber.cxx src/THcDriftChamberPlane.cxx \ src/THcDCHit.cxx \ - src/THcHitList.cxx src/THcDetectorMap.cxx src/THcHodoscope.cxx \ - src/THcHallCSpectrometer.cxx src/THcDriftChamber.cxx \ - src/THcScintillatorPlane.cxx src/THcSignalHit.cxx \ - src/THcShower.cxx src/THcShowerHit.cxx src/THcShowerPlane.cxx + src/THcShower.cxx src/THcShowerPlane.cxx \ + src/THcShowerHit.cxx # Name of your package. # The shared library that will be built will get the name lib$(PACKAGE).so diff --git a/examples/hodtest.C b/examples/hodtest.C index d091f53ebc9299edb62de508f30f5972ca2530c8..2ee29bb95d0e3ea16d69e39d057b9dd251da52fc 100644 --- a/examples/hodtest.C +++ b/examples/hodtest.C @@ -20,12 +20,12 @@ gHcDetectorMap->Load("jan03.map"); // Add hodoscope HMS->AddDetector( new THcHodoscope("hod", "Hodoscope" )); HMS->AddDetector( new THcShower("Cal", "Shower" )); - // HMS->AddDetector( new THcDriftChamber("dc", "Drift Chambers" )); + HMS->AddDetector( new THcDriftChamber("dc", "Drift Chambers" )); // 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 Apparatus's and PhysicsModules, + // tests/cuts, loops over Acpparatus's and PhysicsModules, // and executes the output routines. THcAnalyzer* analyzer = new THcAnalyzer; diff --git a/examples/output.def b/examples/output.def index 86d1e07957e4dc71f2fec8b47ac4d460036735a3..cf1c55cef0be09ea2ce8b2fa1d2b77bd58cdb9aa 100644 --- a/examples/output.def +++ b/examples/output.def @@ -1,6 +1,8 @@ # See $ANALYZER/examples/output_example.def for examples # +block H.dc.* block H.hod.* +block H.Cal.* # TDC hits per paddle @@ -23,7 +25,6 @@ TH1F hnegadc3 'HMS s2x- ADC hits' H.hod.2x.negadchits 16 0.5 16.5 TH1F hposadc4 'HMS s2y+ ADC hits' H.hod.2y.posadchits 10 0.5 10.5 TH1F hnegadc4 'HMS s2y- ADC hits' H.hod.2y.negadchits 10 0.5 10.5 -block H.Cal.* # ADC hits per Calorimeter layer TH1F chposadc1 'HMS Cal 1z+ ADC hits' H.Cal.1z.posadchits 13 0.5 13.5 TH1F chnegadc1 'HMS Cal 1z- ADC hits' H.Cal.1z.negadchits 13 0.5 13.5 @@ -31,3 +32,4 @@ TH1F chposadc2 'HMS Cal 2z+ ADC hits' H.Cal.2z.posadchits 13 0.5 13.5 TH1F chnegadc2 'HMS Cal 2z- ADC hits' H.Cal.2z.negadchits 13 0.5 13.5 TH1F chposadc3 'HMS Cal 3z+ ADC hits' H.Cal.3z.posadchits 13 0.5 13.5 TH1F chposadc4 'HMS Cal 4z+ ADC hits' H.Cal.4z.posadchits 13 0.5 13.5 + diff --git a/src/HallC_LinkDef.h b/src/HallC_LinkDef.h index d5bbfdd9d41fc8ec7238a2d0d31be55951d5e7f5..01a64a358eb03c3a468a2299591d5b9e3ef78b1e 100644 --- a/src/HallC_LinkDef.h +++ b/src/HallC_LinkDef.h @@ -10,18 +10,19 @@ #pragma link C++ class THcInterface+; #pragma link C++ class THcParmList+; #pragma link C++ class THcAnalyzer+; +#pragma link C++ class THcHallCSpectrometer+; +#pragma link C++ class THcDetectorMap+; #pragma link C++ class THcRawHit+; -#pragma link C++ class THcHodoscopeHit+; -#pragma link C++ class THcDCHit+; #pragma link C++ class THcHitList+; +#pragma link C++ class THcSignalHit+; #pragma link C++ class THcHodoscope+; -#pragma link C++ class THcDriftChamber+; -#pragma link C++ class THcDetectorMap+; -#pragma link C++ class THcHallCSpectrometer+; #pragma link C++ class THcScintillatorPlane+; +#pragma link C++ class THcHodoscopeHit+; +#pragma link C++ class THcDriftChamber+; +#pragma link C++ class THcDriftChamberPlane+; +#pragma link C++ class THcDCHit+; +#pragma link C++ class THcShower+; #pragma link C++ class THcShowerPlane+; -#pragma link C++ class THcSignalHit+; #pragma link C++ class THcShowerHit+; -#pragma link C++ class THcShower+; #endif diff --git a/src/THcDriftChamber.cxx b/src/THcDriftChamber.cxx index 2e8881df5333d56685e8084833ba368f400d9c54..b69d21243bef7781e2662dd7261958dca01b7d1c 100644 --- a/src/THcDriftChamber.cxx +++ b/src/THcDriftChamber.cxx @@ -31,18 +31,69 @@ using namespace std; //_____________________________________________________________________________ -THcDriftChamber::THcDriftChamber( const char* name, const char* description, +THcDriftChamber::THcDriftChamber( + const char* name, const char* description, THaApparatus* apparatus ) : - THaNonTrackingDetector(name,description,apparatus) + THaTrackingDetector(name,description,apparatus) { // Constructor - fTrackProj = new TClonesArray( "THaTrackProj", 5 ); + // fTrackProj = new TClonesArray( "THaTrackProj", 5 ); + +} + +//_____________________________________________________________________________ +void THcDriftChamber::Setup(const char* name, const char* description) +{ + + char prefix[2]; + char parname[100]; + + THaApparatus *app = GetApparatus(); + if(app) { + cout << app->GetName() << endl; + } else { + cout << "No apparatus found" << endl; + } + + prefix[0]=tolower(app->GetName()[0]); + prefix[1]='\0'; + + strcpy(parname,prefix); + strcat(parname,name); // Append "dc" + Int_t plen=strlen(parname); + cout << "parname=" << parname << endl; + + // Get number of planes and number wires for each plane + strcat(parname,"_num_planes"); + fNPlanes = *(Int_t *)gHcParms->Find(parname)->GetValuePointer(); + + parname[plen] = '\0'; + strcat(parname,"_num_chambers"); + fNChambers = *(Int_t *)gHcParms->Find(parname)->GetValuePointer(); + + fPlaneNames = new char* [fNPlanes]; + + char *desc = new char[strlen(description)+100]; + fPlanes = new THcDriftChamberPlane* [fNPlanes]; + + for(Int_t i=0;i<fNPlanes;i++) { + fPlaneNames[i] = new char[5]; + sprintf(fPlaneNames[i],"%d",i+1); + strcpy(desc, description); + strcat(desc, " Plane "); + strcat(desc, fPlaneNames[i]); + + fPlanes[i] = new THcDriftChamberPlane(fPlaneNames[i], desc, i+1, this); + cout << "Created Drift Chamber Plane " << fPlaneNames[i] << ", " << desc << endl; + + } + } //_____________________________________________________________________________ THcDriftChamber::THcDriftChamber( ) : - THaNonTrackingDetector() + THaTrackingDetector() { // Constructor } @@ -52,8 +103,22 @@ THaAnalysisObject::EStatus THcDriftChamber::Init( const TDatime& date ) { static const char* const here = "Init()"; - if( THaNonTrackingDetector::Init( date ) ) - return fStatus; + Setup(GetName(), GetTitle()); // Create the subdetectors here + + // 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); + + EStatus status; + // This triggers call of ReadDatabase and DefineVariables + if( (status = THaTrackingDetector::Init( date )) ) + return fStatus=status; + + for(Int_t ip=0;ip<fNPlanes;ip++) { + if((status = fPlanes[ip]->Init( date ))) { + return fStatus=status; + } + } // Replace with what we need for Hall C // const DataDest tmp[NDEST] = { @@ -62,16 +127,18 @@ THaAnalysisObject::EStatus THcDriftChamber::Init( const TDatime& date ) // }; // 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 ) { + char EngineDID[4]; + + EngineDID[0] = toupper(GetApparatus()->GetName()[0]); + EngineDID[1] = 'D'; + EngineDID[2] = 'C'; + EngineDID[3] = '\0'; + + if( gHcDetectorMap->FillMap(fDetMap, EngineDID) < 0 ) { Error( Here(here), "Error filling detectormap for %s.", - "HSCIN"); + EngineDID); return kInitError; } @@ -87,39 +154,36 @@ Int_t THcDriftChamber::ReadDatabase( const TDatime& date ) // 'date' contains the date/time of the run being analyzed. // static const char* const here = "ReadDatabase()"; + char prefix[2]; + char parname[100]; // 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(); + prefix[0]=tolower(GetApparatus()->GetName()[0]); + + prefix[1]='\0'; + strcpy(parname,prefix); + strcat(parname,"dc"); + Int_t plen=strlen(parname); + + // Get number of planes and number wires for each plane + strcat(parname,"_num_planes"); + fNPlanes = *(Int_t *)gHcParms->Find(parname)->GetValuePointer(); + + parname[plen]='\0'; + strcat(parname,"_nrwire"); + fNWires = new Int_t [fNPlanes]; - Int_t* p= (Int_t *)gHcParms->Find("hdc_nrwire")->GetValuePointer(); + Int_t* p= (Int_t *)gHcParms->Find(parname)->GetValuePointer(); for(Int_t i=0;i<fNPlanes;i++) { fNWires[i] = p[i]; } @@ -241,17 +305,25 @@ Int_t THcDriftChamber::Decode( const THaEvData& evdata ) // Get the Hall C style hitlist (fRawHitList) for this event Int_t nhits = THcHitList::DecodeToHitList(evdata); + // Let each plane get its hits + Int_t nexthit = 0; + for(Int_t ip=0;ip<fNPlanes;ip++) { + nexthit = fPlanes[ip]->ProcessHits(fRawHitList, nexthit); + } + +#if 0 // 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; + // cout << ihit << " : " << hit->fPlane << ":" << hit->fCounter << " : " + // << endl; for(Int_t imhit = 0; imhit < hit->fNHits; imhit++) { - cout << " " << imhit << " " << hit->fTDC[imhit] - << endl; + // cout << " " << imhit << " " << hit->fTDC[imhit] + // << endl; } } - cout << endl; + // cout << endl; +#endif return nhits; } @@ -263,7 +335,7 @@ Int_t THcDriftChamber::ApplyCorrections( void ) } //_____________________________________________________________________________ -Int_t THcDriftChamber::CoarseProcess( TClonesArray& /* tracks */ ) +Int_t THcDriftChamber::CoarseTrack( TClonesArray& /* tracks */ ) { // Calculation of coordinates of particle track cross point with scint // plane in the detector coordinate system. For this, parameters of track @@ -279,7 +351,7 @@ Int_t THcDriftChamber::CoarseProcess( TClonesArray& /* tracks */ ) } //_____________________________________________________________________________ -Int_t THcDriftChamber::FineProcess( TClonesArray& tracks ) +Int_t THcDriftChamber::FineTrack( TClonesArray& tracks ) { // Reconstruct coordinates of particle track cross point with scintillator // plane, and copy the data into the following local data structure: diff --git a/src/THcDriftChamber.h b/src/THcDriftChamber.h index b9f7be4e68c9e8ddd9899a9af31cc7ac90237e73..f96363d60e1d3452c4b9ee0f34b6589b24c87fae 100644 --- a/src/THcDriftChamber.h +++ b/src/THcDriftChamber.h @@ -7,14 +7,15 @@ // // /////////////////////////////////////////////////////////////////////////////// -#include "TClonesArray.h" -#include "THaNonTrackingDetector.h" +#include "THaTrackingDetector.h" #include "THcHitList.h" #include "THcDCHit.h" +#include "THcDriftChamberPlane.h" -class THaScCalib; +//class THaScCalib; +class TClonesArray; -class THcDriftChamber : public THaNonTrackingDetector, public THcHitList { +class THcDriftChamber : public THaTrackingDetector, public THcHitList { public: THcDriftChamber( const char* name, const char* description = "", @@ -23,8 +24,8 @@ public: 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 CoarseTrack( TClonesArray& tracks ); + virtual Int_t FineTrack( TClonesArray& tracks ); virtual Int_t ApplyCorrections( void ); @@ -33,7 +34,7 @@ public: Int_t GetNTracks() const { return fTrackProj->GetLast()+1; } const TClonesArray* GetTrackHits() const { return fTrackProj; } - friend class THaScCalib; + // friend class THaScCalib; THcDriftChamber(); // for ROOT I/O protected: @@ -45,8 +46,12 @@ protected: // Potential Hall C parameters. Mostly here for demonstration Int_t fNPlanes; + char** fPlaneNames; + Int_t fNChambers; Int_t* fNWires; // Number of wires per plane + THcDriftChamberPlane** fPlanes; // List of plane objects + TClonesArray* fTrackProj; // projection of track onto scintillator plane // and estimated match to TOF paddle // Useful derived quantities @@ -71,7 +76,9 @@ protected: virtual Int_t ReadDatabase( const TDatime& date ); virtual Int_t DefineVariables( EMode mode = kDefine ); - ClassDef(THcDriftChamber,0) // Generic hodoscope class + void Setup(const char* name, const char* description); + + ClassDef(THcDriftChamber,0) // Drift Chamber class }; //////////////////////////////////////////////////////////////////////////////// diff --git a/src/THcDriftChamberPlane.cxx b/src/THcDriftChamberPlane.cxx new file mode 100644 index 0000000000000000000000000000000000000000..1040342149b78125e1d86512623579ff25ca21c8 --- /dev/null +++ b/src/THcDriftChamberPlane.cxx @@ -0,0 +1,171 @@ +//*-- Author : + +////////////////////////////////////////////////////////////////////////// +// +// THcDriftChamberPlane +// +////////////////////////////////////////////////////////////////////////// + +#include "THcDriftChamberPlane.h" +#include "TClonesArray.h" +#include "THcSignalHit.h" +#include "THcGlobals.h" +#include "THcParmList.h" +#include "THcHitList.h" +#include "THcDriftChamber.h" + +#include <cstring> +#include <cstdio> +#include <cstdlib> +#include <iostream> + +using namespace std; + +ClassImp(THcDriftChamberPlane) + +//______________________________________________________________________________ +THcDriftChamberPlane::THcDriftChamberPlane( const char* name, + const char* description, + const Int_t planenum, + THaDetectorBase* parent ) + : THaSubDetector(name,description,parent) +{ + // Normal constructor with name and description + fTDCHits = new TClonesArray("THcSignalHit",100); + fPlaneNum = planenum; +} + +//______________________________________________________________________________ +THcDriftChamberPlane::~THcDriftChamberPlane() +{ + // Destructor + delete fTDCHits; + +} +THaAnalysisObject::EStatus THcDriftChamberPlane::Init( const TDatime& date ) +{ + // Extra initialization for scintillator plane: set up DataDest map + + cout << "THcDriftChamberPlane::Init called " << GetName() << endl; + + if( IsZombie()) + return fStatus = kInitError; + + // How to get information for parent + // if( GetParent() ) + // fOrigin = GetParent()->GetOrigin(); + + EStatus status; + if( (status=THaSubDetector::Init( date )) ) + return fStatus = status; + + return fStatus = kOK; + +} + +//_____________________________________________________________________________ +Int_t THcDriftChamberPlane::ReadDatabase( const TDatime& date ) +{ + + // See what file it looks for + + static const char* const here = "ReadDatabase()"; + char prefix[2]; + char parname[100]; + + prefix[0]=tolower(GetParent()->GetPrefix()[0]); + prefix[1]='\0'; + + // Retrieve parameters we need + + return kOK; +} +//_____________________________________________________________________________ +Int_t THcDriftChamberPlane::DefineVariables( EMode mode ) +{ + // Initialize global variables and lookup table for decoder + + // cout << "THcDriftChamberPlane::DefineVariables called " << GetName() << endl; + + if( mode == kDefine && fIsSetup ) return kOK; + fIsSetup = ( mode == kDefine ); + + // Register variables in global list + RVarDef vars[] = { + {"tdchits", "List of TDC hits", + "fTDCHits.THcSignalHit.GetPaddleNumber()"}, + { 0 } + }; + + return DefineVarsFromList( vars, mode ); +} + +//_____________________________________________________________________________ +void THcDriftChamberPlane::Clear( Option_t* ) +{ + //cout << " Calling THcDriftChamberPlane::Clear " << GetName() << endl; + // Clears the hit lists + fTDCHits->Clear(); +} + +//_____________________________________________________________________________ +Int_t THcDriftChamberPlane::Decode( const THaEvData& evdata ) +{ + // Doesn't actually get called. Use Fill method instead + cout << " Calling THcDriftChamberPlane::Decode " << GetName() << endl; + + return 0; +} +//_____________________________________________________________________________ +Int_t THcDriftChamberPlane::CoarseProcess( TClonesArray& tracks ) +{ + + // HitCount(); + + return 0; +} + +//_____________________________________________________________________________ +Int_t THcDriftChamberPlane::FineProcess( TClonesArray& tracks ) +{ + return 0; +} +Int_t THcDriftChamberPlane::ProcessHits(TClonesArray* rawhits, Int_t nexthit) +{ + // Extract the data for this plane from hit list + // Assumes that the hit list is sorted by plane, so we stop when the + // plane doesn't agree and return the index for the next hit. + + Int_t nTDCHits=0; + fTDCHits->Clear(); + + Int_t nrawhits = rawhits->GetLast()+1; + // cout << "THcDriftChamberPlane::ProcessHits " << fPlaneNum << " " << nexthit << "/" << nrawhits << endl; + + Int_t ihit = nexthit; + while(ihit < nrawhits) { + THcDCHit* hit = (THcDCHit *) rawhits->At(ihit); + if(hit->fPlane > fPlaneNum) { + break; + } + // Just put in the first hit for now + if(hit->fNHits > 0) { // Should always be the case +#if ROOT_VERSION_CODE >= ROOT_VERSION(5,32,0) + THcSignalHit *sighit = (THcSignalHit*) fTDCHits->ConstructedAt(nTDCHits++); +#else + TObject* obj = (*fTDCHits)[nTDCHits++]; + R__ASSERT( obj ); + if(!obj->TestBit (TObject::kNotDeleted)) + fTDCHitsClass->New(obj); + THcSignalHit *sighit = (THcSignalHit*)obj; +#endif + sighit->Set(hit->fCounter, hit->fTDC[0]); + } + ihit++; + } + return(ihit); +} + + + + diff --git a/src/THcDriftChamberPlane.h b/src/THcDriftChamberPlane.h new file mode 100644 index 0000000000000000000000000000000000000000..29f4bb799abbc484d2f4f88d2caf9bef43dd5d00 --- /dev/null +++ b/src/THcDriftChamberPlane.h @@ -0,0 +1,56 @@ +#ifndef ROOT_THcDriftChamberPlane +#define ROOT_THcDriftChamberPlane + +////////////////////////////////////////////////////////////////////////////// +// +// THcDriftChamberPlane +// +// A Hall C scintillator plane +// +// May want to later inherit from a THcPlane class if there are similarities +// in what a plane is shared with other detector types (shower, etc.) +// +////////////////////////////////////////////////////////////////////////////// + +#include "THaSubDetector.h" +#include "TClonesArray.h" + +class THaEvData; +class THaSignalHit; + +class THcDriftChamberPlane : public THaSubDetector { + + public: + THcDriftChamberPlane( const char* name, const char* description, + Int_t planenum, THaDetectorBase* parent = NULL); + virtual ~THcDriftChamberPlane(); + + virtual void Clear( Option_t* opt="" ); + 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 ); + Bool_t IsTracking() { return kFALSE; } + virtual Bool_t IsPid() { return kFALSE; } + + virtual Int_t ProcessHits(TClonesArray* rawhits, Int_t nexthit); + + Double_t fSpacing; + + TClonesArray* fParentHitList; + + protected: + + TClonesArray* fTDCHits; + + Int_t fPlaneNum; + + virtual Int_t ReadDatabase( const TDatime& date ); + virtual Int_t DefineVariables( EMode mode = kDefine ); + + ClassDef(THcDriftChamberPlane,0) +}; +#endif + + diff --git a/src/THcHodoscope.cxx b/src/THcHodoscope.cxx index 251f3381ad1cac5d2b41749df5b00a3dfc0ead02..4ff2611303ab82bdb805ab4128070aa9c5140797 100644 --- a/src/THcHodoscope.cxx +++ b/src/THcHodoscope.cxx @@ -40,8 +40,6 @@ THcHodoscope::THcHodoscope( const char* name, const char* description, //fTrackProj = new TClonesArray( "THaTrackProj", 5 ); // Construct the planes - Setup(name, description); - } //_____________________________________________________________________________ @@ -59,25 +57,23 @@ void THcHodoscope::Setup(const char* name, const char* description) static const char* const message = "Must construct %s detector with valid name! Object construction failed."; + cout << "In THcHodoscope::Init()" << endl; // Base class constructor failed? if( IsZombie()) return; - fNPlanes = 4; // Eventually get # planes and plane names from a DB + fNPlanes = 4; // Should get this from parameters + fPlaneNames = new char* [fNPlanes]; for(Int_t i=0;i<fNPlanes;i++) {fPlaneNames[i] = new char[3];} - strcpy(fPlaneNames[0],"1x"); + // Should get the plane names from parameters. + strcpy(fPlaneNames[0],"1x"); strcpy(fPlaneNames[1],"1y"); strcpy(fPlaneNames[2],"2x"); strcpy(fPlaneNames[3],"2y"); - size_t nlen = strlen(name); - size_t slen = 0; - for(Int_t i=0;i < fNPlanes;i++) - {slen = TMath::Max(slen,strlen(fPlaneNames[i]));} - size_t len = nlen+slen+1; - + cout << "fNPlanes = " << fNPlanes << endl; // Probably shouldn't assume that description is defined - char* desc = new char[strlen(description)+50+slen]; + char* desc = new char[strlen(description)+50]; fPlanes = new THcScintillatorPlane* [fNPlanes]; for(Int_t i=0;i < fNPlanes;i++) { strcpy(desc, description); @@ -108,8 +104,8 @@ void THcHodoscope::SetApparatus( THaApparatus* app ) THaAnalysisObject::EStatus THcHodoscope::Init( const TDatime& date ) { static const char* const here = "Init()"; - - cout << "THcHodoscope::Init " << GetName() << endl; + cout << "In THcHodoscope::Init()" << endl; + Setup(GetName(), GetTitle()); // Should probably put this in ReadDatabase as we will know the // maximum number of hits after setting up the detector map @@ -156,96 +152,56 @@ Int_t THcHodoscope::ReadDatabase( const TDatime& date ) // 'date' contains the date/time of the run being analyzed. // static const char* const here = "ReadDatabase()"; + char prefix[2]; + char parname[100]; // 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) - cout << "THcHodoscope::ReadDatabase called " << GetName() << endl; - - fNPlanes = 4; // Hardwire for now - - fNPaddle = new Int_t [fNPlanes]; + prefix[0]=tolower(GetApparatus()->GetName()[0]); - fNPaddle[0] = *(Int_t *)gHcParms->Find("hscin_1x_nr")->GetValuePointer(); - fNPaddle[1] = *(Int_t *)gHcParms->Find("hscin_1y_nr")->GetValuePointer(); - fNPaddle[2] = *(Int_t *)gHcParms->Find("hscin_2x_nr")->GetValuePointer(); - fNPaddle[3] = *(Int_t *)gHcParms->Find("hscin_2y_nr")->GetValuePointer(); + prefix[1]='\0'; - fSpacing = new Double_t [fNPlanes]; - fSpacing[0] = gHcParms->Find("hscin_1x_spacing")->GetValue(0); - fSpacing[1] = gHcParms->Find("hscin_1y_spacing")->GetValue(0); - fSpacing[2] = gHcParms->Find("hscin_2x_spacing")->GetValue(0); - fSpacing[3] = gHcParms->Find("hscin_2y_spacing")->GetValue(0); + strcpy(parname,prefix); + strcat(parname,"scin_"); + Int_t plen=strlen(parname); - fCenter = new Double_t* [fNPlanes]; - Double_t* p; - Int_t iplane; - - iplane = 0; - p = (Double_t *)gHcParms->Find("hscin_1x_center")->GetValuePointer(); - fCenter[iplane] = new Double_t [fNPaddle[iplane]]; - // Print out some parameters just to demonstrate that it works - cout << iplane; - for(Int_t i=0;i<fNPaddle[iplane];i++) { - fCenter[iplane][i] = p[i]; - cout << " " << fCenter[iplane][i]; - } - cout << endl; + fNPaddle = new Int_t [fNPlanes]; - iplane = 1; - p = (Double_t *)gHcParms->Find("hscin_1y_center")->GetValuePointer(); - fCenter[iplane] = new Double_t [fNPaddle[iplane]]; - cout << iplane; - for(Int_t i=0;i<fNPaddle[iplane];i++) { - fCenter[iplane][i] = p[i]; - cout << " " << fCenter[iplane][i]; + for(Int_t i=0;i<fNPlanes;i++) { + parname[plen] = '\0'; + strcat(parname,fPlaneNames[i]); + strcat(parname,"_nr"); + fNPaddle[i] = *(Int_t *)gHcParms->Find(parname)->GetValuePointer(); + cout << parname << " " << fNPaddle[i] << endl; } - cout << endl; - iplane = 2; - p = (Double_t *)gHcParms->Find("hscin_2x_center")->GetValuePointer(); - fCenter[iplane] = new Double_t [fNPaddle[iplane]]; - cout << iplane; - for(Int_t i=0;i<fNPaddle[iplane];i++) { - fCenter[iplane][i] = p[i]; - cout << " " << fCenter[iplane][i]; + fSpacing = new Double_t [fNPlanes]; + for(Int_t i=0;i<fNPlanes;i++) { + parname[plen] = '\0'; + strcat(parname,fPlaneNames[i]); + strcat(parname,"_spacing"); + fSpacing[i] = *(Int_t *)gHcParms->Find(parname)->GetValuePointer(); } - cout << endl; - iplane = 3; - p = (Double_t *)gHcParms->Find("hscin_2y_center")->GetValuePointer(); - fCenter[iplane] = new Double_t [fNPaddle[iplane]]; - cout << iplane; - for(Int_t i=0;i<fNPaddle[iplane];i++) { - fCenter[iplane][i] = p[i]; - cout << " " << fCenter[iplane][i]; + fCenter = new Double_t* [fNPlanes]; + for(Int_t i=0;i<fNPlanes;i++) { + parname[plen] = '\0'; + strcat(parname,fPlaneNames[i]); + strcat(parname,"_center"); + Double_t* p = (Double_t *)gHcParms->Find(parname)->GetValuePointer(); + fCenter[i] = new Double_t [fNPaddle[i]]; + cout << parname; + for(Int_t ipad=0;ipad<fNPaddle[i];ipad++) { + fCenter[i][ipad] = p[ipad]; + cout << " " << fCenter[i][ipad]; + } + cout << endl; } - cout << endl; fIsInit = true; diff --git a/src/THcScintillatorPlane.cxx b/src/THcScintillatorPlane.cxx index 78d81e06f32b78b7586acb8bb8b7e1ffa18b61f6..4fe536edd4d04b2d72fad6d02fc1441fb9bd8074 100644 --- a/src/THcScintillatorPlane.cxx +++ b/src/THcScintillatorPlane.cxx @@ -36,10 +36,12 @@ THcScintillatorPlane::THcScintillatorPlane( const char* name, fNegTDCHits = new TClonesArray("THcSignalHit",16); fPosADCHits = new TClonesArray("THcSignalHit",16); fNegADCHits = new TClonesArray("THcSignalHit",16); +#if ROOT_VERSION_CODE < ROOT_VERSION(5,32,0) fPosTDCHitsClass = fPosTDCHits->GetClass(); fNegTDCHitsClass = fNegTDCHits->GetClass(); fPosADCHitsClass = fPosADCHits->GetClass(); fNegADCHitsClass = fNegADCHits->GetClass(); +#endif fPlaneNum = planenum; } @@ -211,62 +213,58 @@ Int_t THcScintillatorPlane::ProcessHits(TClonesArray* rawhits, Int_t nexthit) } -if(hit->fTDC_pos > 0) { + if(hit->fTDC_pos > 0) { #if ROOT_VERSION_CODE >= ROOT_VERSION(5,32,0) - THcSignalHit *sighit = (THcSignalHit*) fPosTDCHits->ConstructedAt(nPosTDCHits++); - sighit->Set(hit->fCounter, hit->fTDC_pos); + THcSignalHit *sighit = (THcSignalHit*) fPosTDCHits->ConstructedAt(nPosTDCHits++); #else -TObject* obj = (*fPosTDCHits)[nPosTDCHits++]; -R__ASSERT( obj ); -if(!obj->TestBit (TObject::kNotDeleted)) -fPosTDCHitsClass->New(obj); -THcSignalHit *sighit = (THcSignalHit*)obj; + TObject* obj = (*fPosTDCHits)[nPosTDCHits++]; + R__ASSERT( obj ); + if(!obj->TestBit (TObject::kNotDeleted)) + fPosTDCHitsClass->New(obj); + THcSignalHit *sighit = (THcSignalHit*)obj; #endif - sighit->Set(hit->fCounter, hit->fTDC_pos); -} - + sighit->Set(hit->fCounter, hit->fTDC_pos); + } -if(hit->fTDC_neg > 0) { + if(hit->fTDC_neg > 0) { #if ROOT_VERSION_CODE >= ROOT_VERSION(5,32,0) - THcSignalHit *sighit = (THcSignalHit*) fNegTDCHits->ConstructedAt(nNegTDCHits++); - sighit->Set(hit->fCounter, hit->fTDC_neg); + THcSignalHit *sighit = (THcSignalHit*) fNegTDCHits->ConstructedAt(nNegTDCHits++); #else - TObject* obj = (*fNegTDCHits)[nNegTDCHits++]; - R__ASSERT( obj ); -if(!obj->TestBit (TObject::kNotDeleted)) + + TObject* obj = (*fPosTDCHits)[nNegTDCHits++]; + R__ASSERT( obj ); + if(!obj->TestBit (TObject::kNotDeleted)) fNegTDCHitsClass->New(obj); - THcSignalHit *sighit = (THcSignalHit*)obj; + THcSignalHit *sighit = (THcSignalHit*)obj; #endif - sighit->Set(hit->fCounter, hit->fTDC_neg); -} + sighit->Set(hit->fCounter, hit->fTDC_neg); + } -if(hit->fADC_pos > 0) { + if(hit->fADC_pos > 0) { #if ROOT_VERSION_CODE >= ROOT_VERSION(5,32,0) - THcSignalHit *sighit = (THcSignalHit*) fPosADCHits->ConstructedAt(nPosADCHits++); - sighit->Set(hit->fCounter, hit->fADC_pos); + THcSignalHit *sighit = (THcSignalHit*) fPosADCHits->ConstructedAt(nPosADCHits++); #else - TObject* obj = (*fPosADCHits)[nPosADCHits++]; - R__ASSERT( obj ); -if(!obj->TestBit (TObject::kNotDeleted)) + TObject* obj = (*fPosTDCHits)[nPosADCHits++]; + R__ASSERT( obj ); + if(!obj->TestBit (TObject::kNotDeleted)) fPosADCHitsClass->New(obj); - THcSignalHit *sighit = (THcSignalHit*)obj; + THcSignalHit *sighit = (THcSignalHit*)obj; #endif - sighit->Set(hit->fCounter, hit->fADC_pos); -} + sighit->Set(hit->fCounter, hit->fADC_pos); + } -if(hit->fADC_neg > 0) { + if(hit->fADC_neg > 0) { #if ROOT_VERSION_CODE >= ROOT_VERSION(5,32,0) - THcSignalHit *sighit = (THcSignalHit*) fNegADCHits->ConstructedAt(nNegADCHits++); - sighit->Set(hit->fCounter, hit->fADC_neg); + THcSignalHit *sighit = (THcSignalHit*) fNegADCHits->ConstructedAt(nNegADCHits++); #else - TObject* obj = (*fNegADCHits)[nNegADCHits++]; - R__ASSERT( obj ); -if(!obj->TestBit (TObject::kNotDeleted)) + TObject* obj = (*fPosTDCHits)[nNegADCHits++]; + R__ASSERT( obj ); + if(!obj->TestBit (TObject::kNotDeleted)) fNegADCHitsClass->New(obj); - THcSignalHit *sighit = (THcSignalHit*)obj; + THcSignalHit *sighit = (THcSignalHit*)obj; #endif - sighit->Set(hit->fCounter, hit->fADC_neg); -} + sighit->Set(hit->fCounter, hit->fADC_neg); + } ihit++; }