From d8534e4c331620f4d767b6ddac0a3b9024617167 Mon Sep 17 00:00:00 2001 From: "Stephen A. Wood" <saw@jlab.org> Date: Wed, 3 Dec 2014 14:54:02 -0500 Subject: [PATCH] Move THcShowerCluster.h and THcShowerHit.h into THcShower.h This is because the classes in these header files are only used by THcShower. --- src/THcShower.cxx | 2 +- src/THcShower.h | 337 ++++++++++++++++++++++++++++++++++++++++- src/THcShowerCluster.h | 244 ----------------------------- src/THcShowerHit.h | 100 ------------ 4 files changed, 337 insertions(+), 346 deletions(-) delete mode 100644 src/THcShowerCluster.h delete mode 100644 src/THcShowerHit.h diff --git a/src/THcShower.cxx b/src/THcShower.cxx index 1fe031c..4a7b2a4 100644 --- a/src/THcShower.cxx +++ b/src/THcShower.cxx @@ -10,7 +10,7 @@ /////////////////////////////////////////////////////////////////////////////// #include "THcShower.h" -#include "THcShowerCluster.h" +//#include "THcShowerCluster.h" #include "THaEvData.h" #include "THaDetMap.h" #include "THcDetectorMap.h" diff --git a/src/THcShower.h b/src/THcShower.h index e6a8391..4581287 100644 --- a/src/THcShower.h +++ b/src/THcShower.h @@ -11,9 +11,344 @@ #include "THaNonTrackingDetector.h" #include "THcHitList.h" #include "THcShowerPlane.h" -#include "THcShowerCluster.h" #include "TMath.h" + +// HMS calorimeter hits, version 2 + +#include <vector> +#include <iterator> +#include <iostream> +#include <memory> + +using namespace std; + +class THcShowerHit { //HMS calorimeter hit class + +private: + Int_t fCol, fRow; //hit colomn and row + Double_t fX, fZ; //hit X (vert.) and Z (along spect.axis) coordinates + Double_t fE; //hit mean energy deposition + Double_t fEpos; //hit energy deposition from positive PMT + Double_t fEneg; //hit energy deposition from negative PMT + +public: + + THcShowerHit() { //default constructor + fCol=fRow=0; + fX=fZ=0.; + fE=0.; + fEpos=0.; + fEneg=0.; + } + + THcShowerHit(Int_t hRow, Int_t hCol, Double_t hX, Double_t hZ, + Double_t hE, Double_t hEpos, Double_t hEneg) { + fRow=hRow; + fCol=hCol; + fX=hX; + fZ=hZ; + fE=hE; + fEpos=hEpos; + fEneg=hEneg; + } + + ~THcShowerHit() { + // cout << " hit destructed" << endl; + } + + Int_t hitColumn() { + return fCol; + } + + Int_t hitRow() { + return fRow; + } + + Double_t hitX() { + return fX; + } + + Double_t hitZ() { + return fZ; + } + + Double_t hitE() { + return fE; + } + + Double_t hitEpos() { + return fEpos; + } + + Double_t hitEneg() { + return fEneg; + } + + // Decide if a hit is neighbouring the current hit. + // Two hits are neighbours if share a side or a corner. + // + bool isNeighbour(THcShowerHit* hit1) { //Is hit1 neighbouring this hit? + Int_t dRow = fRow-(*hit1).fRow; + Int_t dCol = fCol-(*hit1).fCol; + return TMath::Abs(dRow)<2 && TMath::Abs(dCol)<2; + } + + //Print out hit information + // + void show() { + cout << "row=" << fRow << " column=" << fCol + << " x=" << fX << " z=" << fZ + << " E=" << fE << " Epos=" << fEpos << " Eneg=" << fEneg << endl; + } + +}; + + +// Container (collection) of hits and its iterator. +// +typedef vector<THcShowerHit*> THcShowerHitList; +typedef THcShowerHitList::iterator THcShowerHitIt; + + + +//HMS calorimeter hit cluster +// +class THcShowerCluster : THcShowerHitList { + + public: + + THcShowerCluster() { + // cout << "Dummy THcShowerCluster object created" << endl; + } + + ~THcShowerCluster() { + for (THcShowerHitIt i = THcShowerHitList::begin(); + i != THcShowerHitList::end(); ++i) { + delete *i; + *i = 0; + } + } + + // Add a hit to the cluster hit list + // + void grow(THcShowerHit* hit) { + THcShowerHitList::push_back(hit); + } + + //Pointer to the hit #i in the cluster hit list + // + THcShowerHit* ClusteredHit(UInt_t i) { + return * (THcShowerHitList::begin()+i); + } + + //Print out a hit in the cluster + // + void showHit(UInt_t num) { + (*(THcShowerHitList::begin()+num))->show(); + } + + // X coordinate of center of gravity of cluster, + // calculated as hit energy weighted average. + // Put X out of the calorimeter (-75 cm), if there is no energy deposition + // in the cluster. + // + Double_t clX() { + Double_t x_sum=0.; + Double_t Etot=0.; + for (THcShowerHitIt it=THcShowerHitList::begin(); + it!=THcShowerHitList::end(); ++it) { + x_sum += (*it)->hitX() * (*it)->hitE(); + Etot += (*it)->hitE(); + } + // cout << "x_sum=" << x_sum << " Etot=" << Etot << endl; + return (Etot != 0. ? x_sum/Etot : -75.); + } + + // Z coordinate of center of gravity of cluster, + // calculated as a hit energy weighted average. + // Put Z out of the calorimeter (0 cm), if there is no energy deposition + // in the cluster. + // + Double_t clZ() { + Double_t z_sum=0.; + Double_t Etot=0.; + for (THcShowerHitIt it=THcShowerHitList::begin(); + it!=THcShowerHitList::end(); ++it) { + z_sum += (*it)->hitZ() * (*it)->hitE(); + Etot += (*it)->hitE(); + } + // cout << "z_sum=" << z_sum << " Etot=" << Etot << endl; + return (Etot != 0. ? z_sum/Etot : 0.); + } + + //Energy depostion in a cluster + // + Double_t clE() { + // cout << "In ECl:" << endl; + Double_t Etot=0.; + for (THcShowerHitIt it=THcShowerHitList::begin(); + it!=THcShowerHitList::end(); ++it) { + Etot += (*it)->hitE(); + } + return Etot; + } + + //Energy deposition in the Preshower (1st plane) for a cluster + // + Double_t clEpr() { + Double_t Epr=0.; + for (THcShowerHitIt it=THcShowerHitList::begin(); + it!=THcShowerHitList::end(); ++it) { + if ((*it)->hitColumn() == 0) { + Epr += (*it)->hitE(); + } + } + return Epr; + } + + //Cluster energy deposition in plane iplane=0,..,3: + // side=0 -- from positive PMTs only; + // side=1 -- from negative PMTs only; + // side=2 -- from postive and negative PMTs. + // + + Double_t clEplane(Int_t iplane, Int_t side) { + + if (side!=0&&side!=1&&side!=2) { + cout << "*** Wrong Side in clEplane:" << side << " ***" << endl; + return -1; + } + + Double_t Eplane=0.; + for (THcShowerHitIt it=THcShowerHitList::begin(); + it!=THcShowerHitList::end(); ++it) { + + if ((*it)->hitColumn() == iplane) + + switch (side) { + case 0 : Eplane += (*it)->hitEpos(); + break; + case 1 : Eplane += (*it)->hitEneg(); + break; + case 2 : Eplane += (*it)->hitE(); + break; + default : ; + } + + } + + return Eplane; + } + + + //Cluster size (number of hits in the cluster). + // + UInt_t clSize() { + return THcShowerHitList::size(); + } + +}; + +//----------------------------------------------------------------------------- + +//Alias for container of clusters and for its iterator +// +typedef vector<THcShowerCluster*> THcShClusterList; +typedef THcShClusterList::iterator THcShClusterIt; + +//List of clusters +// +class THcShowerClusterList : private THcShClusterList { + + public: + + THcShowerClusterList() { + // cout << "Dummy THcShowerClusterList object created" << endl; + } + + ~THcShowerClusterList() { + purge(); + } + + // Purge cluster list + // + void purge() { + for (THcShClusterIt i = THcShClusterList::begin(); + i != THcShClusterList::end(); ++i) { + delete *i; + *i = 0; + } + THcShClusterList::clear(); + } + + //Put a cluster in the cluster list + // + void grow(THcShowerCluster* cluster) { + THcShClusterList::push_back(cluster); + } + + //Pointer to the cluster #i in the cluster list + // + THcShowerCluster* ListedCluster(UInt_t i) { + return *(THcShClusterList::begin()+i); + } + + //Cluster list size. + // + UInt_t NbClusters() { + return THcShClusterList::size(); + } + + //____________________________________________________________________________ + + void ClusterHits(THcShowerHitList HitList) { + + // Collect hits from the HitList into the clusters. The resultant clusters + // of hits are saved in the ClusterList. + + while (HitList.size() != 0) { + + THcShowerCluster* cluster = new THcShowerCluster; + + (*cluster).grow(*(HitList.end()-1)); //Move the last hit from the hit list + HitList.erase(HitList.end()-1); //into the 1st cluster + bool clustered = true; + + while (clustered) { //Proceed while a hit is clustered + + clustered = false; + + for (THcShowerHitIt i=HitList.begin(); i!=HitList.end(); ++i) { + + for (UInt_t k=0; k!=(*cluster).clSize(); k++) { + + if ((**i).isNeighbour((*cluster).ClusteredHit(k))) { + + (*cluster).grow(*i); //If the hit #i is neighbouring a hit + HitList.erase(i); //in the cluster, then move it + //into the cluster. + clustered = true; + } + + if (clustered) break; + } //k + + if (clustered) break; + } //i + + } //while clustered + + grow(cluster); //Put the cluster in the cluster list + + } //While hit_list not exhausted + + } + +}; + + + class THcShower : public THaNonTrackingDetector, public THcHitList { public: diff --git a/src/THcShowerCluster.h b/src/THcShowerCluster.h deleted file mode 100644 index cc716b5..0000000 --- a/src/THcShowerCluster.h +++ /dev/null @@ -1,244 +0,0 @@ -#ifndef ROOT_THcShowerCluster -#define ROOT_THcShowerCluster - -//HMS calorimeter hit cluster, version 3. - -//#include "THcShower.h" -#include "THcShowerHit.h" - -//HMS calorimeter hit cluster -// -class THcShowerCluster : THcShowerHitList { - - public: - - THcShowerCluster() { - // cout << "Dummy THcShowerCluster object created" << endl; - } - - ~THcShowerCluster() { - for (THcShowerHitIt i = THcShowerHitList::begin(); - i != THcShowerHitList::end(); ++i) { - delete *i; - *i = 0; - } - } - - // Add a hit to the cluster hit list - // - void grow(THcShowerHit* hit) { - THcShowerHitList::push_back(hit); - } - - //Pointer to the hit #i in the cluster hit list - // - THcShowerHit* ClusteredHit(UInt_t i) { - return * (THcShowerHitList::begin()+i); - } - - //Print out a hit in the cluster - // - void showHit(UInt_t num) { - (*(THcShowerHitList::begin()+num))->show(); - } - - // X coordinate of center of gravity of cluster, - // calculated as hit energy weighted average. - // Put X out of the calorimeter (-75 cm), if there is no energy deposition - // in the cluster. - // - Double_t clX() { - Double_t x_sum=0.; - Double_t Etot=0.; - for (THcShowerHitIt it=THcShowerHitList::begin(); - it!=THcShowerHitList::end(); ++it) { - x_sum += (*it)->hitX() * (*it)->hitE(); - Etot += (*it)->hitE(); - } - // cout << "x_sum=" << x_sum << " Etot=" << Etot << endl; - return (Etot != 0. ? x_sum/Etot : -75.); - } - - // Z coordinate of center of gravity of cluster, - // calculated as a hit energy weighted average. - // Put Z out of the calorimeter (0 cm), if there is no energy deposition - // in the cluster. - // - Double_t clZ() { - Double_t z_sum=0.; - Double_t Etot=0.; - for (THcShowerHitIt it=THcShowerHitList::begin(); - it!=THcShowerHitList::end(); ++it) { - z_sum += (*it)->hitZ() * (*it)->hitE(); - Etot += (*it)->hitE(); - } - // cout << "z_sum=" << z_sum << " Etot=" << Etot << endl; - return (Etot != 0. ? z_sum/Etot : 0.); - } - - //Energy depostion in a cluster - // - Double_t clE() { - // cout << "In ECl:" << endl; - Double_t Etot=0.; - for (THcShowerHitIt it=THcShowerHitList::begin(); - it!=THcShowerHitList::end(); ++it) { - Etot += (*it)->hitE(); - } - return Etot; - } - - //Energy deposition in the Preshower (1st plane) for a cluster - // - Double_t clEpr() { - Double_t Epr=0.; - for (THcShowerHitIt it=THcShowerHitList::begin(); - it!=THcShowerHitList::end(); ++it) { - if ((*it)->hitColumn() == 0) { - Epr += (*it)->hitE(); - } - } - return Epr; - } - - //Cluster energy deposition in plane iplane=0,..,3: - // side=0 -- from positive PMTs only; - // side=1 -- from negative PMTs only; - // side=2 -- from postive and negative PMTs. - // - - Double_t clEplane(Int_t iplane, Int_t side) { - - if (side!=0&&side!=1&&side!=2) { - cout << "*** Wrong Side in clEplane:" << side << " ***" << endl; - return -1; - } - - Double_t Eplane=0.; - for (THcShowerHitIt it=THcShowerHitList::begin(); - it!=THcShowerHitList::end(); ++it) { - - if ((*it)->hitColumn() == iplane) - - switch (side) { - case 0 : Eplane += (*it)->hitEpos(); - break; - case 1 : Eplane += (*it)->hitEneg(); - break; - case 2 : Eplane += (*it)->hitE(); - break; - default : ; - } - - } - - return Eplane; - } - - - //Cluster size (number of hits in the cluster). - // - UInt_t clSize() { - return THcShowerHitList::size(); - } - -}; - -//----------------------------------------------------------------------------- - -//Alias for container of clusters and for its iterator -// -typedef vector<THcShowerCluster*> THcShClusterList; -typedef THcShClusterList::iterator THcShClusterIt; - -//List of clusters -// -class THcShowerClusterList : private THcShClusterList { - - public: - - THcShowerClusterList() { - // cout << "Dummy THcShowerClusterList object created" << endl; - } - - ~THcShowerClusterList() { - purge(); - } - - // Purge cluster list - // - void purge() { - for (THcShClusterIt i = THcShClusterList::begin(); - i != THcShClusterList::end(); ++i) { - delete *i; - *i = 0; - } - THcShClusterList::clear(); - } - - //Put a cluster in the cluster list - // - void grow(THcShowerCluster* cluster) { - THcShClusterList::push_back(cluster); - } - - //Pointer to the cluster #i in the cluster list - // - THcShowerCluster* ListedCluster(UInt_t i) { - return *(THcShClusterList::begin()+i); - } - - //Cluster list size. - // - UInt_t NbClusters() { - return THcShClusterList::size(); - } - - //____________________________________________________________________________ - - void ClusterHits(THcShowerHitList HitList) { - - // Collect hits from the HitList into the clusters. The resultant clusters - // of hits are saved in the ClusterList. - - while (HitList.size() != 0) { - - THcShowerCluster* cluster = new THcShowerCluster; - - (*cluster).grow(*(HitList.end()-1)); //Move the last hit from the hit list - HitList.erase(HitList.end()-1); //into the 1st cluster - bool clustered = true; - - while (clustered) { //Proceed while a hit is clustered - - clustered = false; - - for (THcShowerHitIt i=HitList.begin(); i!=HitList.end(); ++i) { - - for (UInt_t k=0; k!=(*cluster).clSize(); k++) { - - if ((**i).isNeighbour((*cluster).ClusteredHit(k))) { - - (*cluster).grow(*i); //If the hit #i is neighbouring a hit - HitList.erase(i); //in the cluster, then move it - //into the cluster. - clustered = true; - } - - if (clustered) break; - } //k - - if (clustered) break; - } //i - - } //while clustered - - grow(cluster); //Put the cluster in the cluster list - - } //While hit_list not exhausted - - } - -}; - -#endif diff --git a/src/THcShowerHit.h b/src/THcShowerHit.h deleted file mode 100644 index 7b97c51..0000000 --- a/src/THcShowerHit.h +++ /dev/null @@ -1,100 +0,0 @@ -#ifndef ROOT_THcShowerHit -#define ROOT_THcShowerHit - -// HMS calorimeter hits, version 2 - -#include <vector> -#include <iterator> -#include <iostream> -#include <memory> - -using namespace std; - -class THcShowerHit { //HMS calorimeter hit class - -private: - Int_t fCol, fRow; //hit colomn and row - Double_t fX, fZ; //hit X (vert.) and Z (along spect.axis) coordinates - Double_t fE; //hit mean energy deposition - Double_t fEpos; //hit energy deposition from positive PMT - Double_t fEneg; //hit energy deposition from negative PMT - -public: - - THcShowerHit() { //default constructor - fCol=fRow=0; - fX=fZ=0.; - fE=0.; - fEpos=0.; - fEneg=0.; - } - - THcShowerHit(Int_t hRow, Int_t hCol, Double_t hX, Double_t hZ, - Double_t hE, Double_t hEpos, Double_t hEneg) { - fRow=hRow; - fCol=hCol; - fX=hX; - fZ=hZ; - fE=hE; - fEpos=hEpos; - fEneg=hEneg; - } - - ~THcShowerHit() { - // cout << " hit destructed" << endl; - } - - Int_t hitColumn() { - return fCol; - } - - Int_t hitRow() { - return fRow; - } - - Double_t hitX() { - return fX; - } - - Double_t hitZ() { - return fZ; - } - - Double_t hitE() { - return fE; - } - - Double_t hitEpos() { - return fEpos; - } - - Double_t hitEneg() { - return fEneg; - } - - // Decide if a hit is neighbouring the current hit. - // Two hits are neighbours if share a side or a corner. - // - bool isNeighbour(THcShowerHit* hit1) { //Is hit1 neighbouring this hit? - Int_t dRow = fRow-(*hit1).fRow; - Int_t dCol = fCol-(*hit1).fCol; - return TMath::Abs(dRow)<2 && TMath::Abs(dCol)<2; - } - - //Print out hit information - // - void show() { - cout << "row=" << fRow << " column=" << fCol - << " x=" << fX << " z=" << fZ - << " E=" << fE << " Epos=" << fEpos << " Eneg=" << fEneg << endl; - } - -}; - - -// Container (collection) of hits and its iterator. -// -typedef vector<THcShowerHit*> THcShowerHitList; -typedef THcShowerHitList::iterator THcShowerHitIt; - -#endif -- GitLab