Main Page | Namespace List | Class Hierarchy | Alphabetical List | Class List | File List | Class Members | File Members

LCDG4CalHit.cc

Go to the documentation of this file.
00001 #include "LCDG4CalHit.hh"
00002 #include "G4VVisManager.hh"
00003 #include "G4Circle.hh"
00004 #include "G4Colour.hh"
00005 #include "G4VisAttributes.hh"
00006 #include "LCDtowerID.h"
00007 
00008 G4Allocator<LCDG4CalHit> LCDG4CalHitAllocator;
00009 
00010 /*
00011  * Default constructor
00012  */
00013 LCDG4CalHit::LCDG4CalHit()
00014   : G4VHit(), m_layer(-1), m_sysNo(-1), m_barend(-1), m_phi(-1), m_theta(-1)
00015 {
00016   m_nmc=0;
00017   m_edep=0;
00018   m_edepabs=0;
00019 
00020   m_trkid=new std::vector<G4int>;
00021   m_trkid->clear();
00022   m_emc =new std::vector<G4double>;
00023   m_emc->clear();
00024   m_tmc =new std::vector<G4double>;
00025   m_tmc->clear();
00026 }
00027 
00028 /*
00029  * Destructor
00030  */
00031 LCDG4CalHit::~LCDG4CalHit(){
00032   if (m_trkid) {
00033     m_trkid->clear();
00034     delete m_trkid;
00035     m_trkid=0;
00036   }
00037   if (m_emc) {
00038     m_emc->clear();
00039     delete m_emc;
00040   }
00041   if (m_tmc) {
00042     m_tmc->clear();
00043     delete m_tmc;
00044   }
00045 }
00046 
00047 /*
00048  * Copy constructor
00049  */
00050 LCDG4CalHit::LCDG4CalHit(const LCDG4CalHit &right) : G4VHit() {
00051   m_layer  = right.m_layer;
00052   m_sysNo  = right.m_sysNo;
00053   m_barend = right.m_barend;
00054   m_edep   = right.m_edep;
00055   m_edepabs= right.m_edepabs;
00056   m_theta  = right.m_theta;
00057   m_phi    = right.m_phi;
00058   m_pos    = right.m_pos;
00059 
00060   m_trkid=new std::vector<G4int>;
00061   m_emc =new std::vector<G4double>;
00062   m_trkid->clear();
00063   m_emc->clear();
00064   int imc=0;
00065   m_nmc=right.m_nmc;
00066   for(imc=0 ; imc < right.m_nmc ; imc++) {
00067     m_trkid->push_back((*right.m_trkid)[imc]);
00068     m_emc->push_back((*right.m_emc)[imc]);
00069   }
00070 }
00071 
00072 /*
00073  * Assignment operator
00074  */
00075 const LCDG4CalHit& LCDG4CalHit::operator=(const LCDG4CalHit &right) {
00076   m_layer  = right.m_layer;
00077   m_sysNo  = right.m_sysNo;
00078   m_barend = right.m_barend;
00079   m_edep   = right.m_edep;
00080   m_edepabs= right.m_edepabs;
00081   m_theta  = right.m_theta;
00082   m_phi    = right.m_phi;
00083   m_pos    = right.m_pos;
00084 
00085   int imc=0;
00086   m_trkid->clear();
00087   m_emc->clear();
00088   m_nmc=right.m_nmc;
00089   for(imc=0 ; imc < right.m_nmc ; imc++) {
00090     m_trkid->push_back((*right.m_trkid)[imc]);
00091     m_emc->push_back((*right.m_emc)[imc]);
00092   }
00093   return *this;
00094 }
00095 
00096 /*
00097  * Add a contributing MC particle to the raw G4 hit
00098  * takes trackID and energy as arguments
00099  */
00100 G4int LCDG4CalHit::AddMcPart(G4int mcidx, G4double emc, G4double tmc) {
00101   int flg_same=0;
00102   int imc=0;
00103   for (imc=0 ; imc < m_nmc ; imc++) {
00104     if ((*m_trkid)[imc] == mcidx) {
00105       flg_same=imc+1;
00106       break;
00107     }
00108   }
00109 
00110   m_edep+=emc;
00111   if (flg_same) {
00112     (*m_emc)[flg_same-1] += emc;
00113   } else {
00114     m_nmc++;
00115     m_trkid->push_back(mcidx);
00116     m_emc->push_back(emc);
00117     m_tmc->push_back(tmc);
00118   }
00119 
00120   return m_nmc;
00121 }
00122 
00123 /*
00124  * Equality operator
00125  */
00126 bool LCDG4CalHit::operator==(const LCDG4CalHit &right) const {
00127   if(m_layer!=right.m_layer) return false;
00128   if(m_sysNo!=right.m_sysNo) return false;
00129   if(m_barend!=m_barend) return false;
00130   if(m_phi!=m_phi) return false;
00131   if(m_theta!=m_theta) return false;
00132 //    if(m_edep!=m_edep) return false;
00133 //    if(m_edepabs!=m_edepabs) return false;
00134 
00135 //    G4int    m_nmc;
00136 //    std::vector<G4int>    *m_trkid;
00137 //    std::vector<G4double> *m_emc;
00138   return true;
00139 }
00140 
00141 unsigned int LCDG4CalHit::GetCellID() const {
00142   LCDtowerID towerID(0);
00143   towerID.SetTheta(m_theta);
00144   towerID.SetPhi(m_phi);
00145   towerID.SetLayer(m_layer);
00146   towerID.SetSystem(m_sysNo);
00147   unsigned int sioTag = towerID.GetTag();
00148   // convert to LCIO format
00149   return sioTagToLcioTag( sioTag );
00150 }
00151 
00152 unsigned int LCDG4CalHit::sioTagToLcioTag(unsigned int sioTag) const {
00153   // Left-most four bits: ABCD (sio) -> DABC (lcio)
00154   unsigned lcioTag = sioTag & 0x0fffffff;
00155   lcioTag |= (sioTag & 0xe0000000) >> 1;
00156   lcioTag |= (sioTag & 0x10000000) << 3;
00157   return lcioTag;
00158 }
00159 
00160 /*
00161  * Draw method
00162  */
00163 void LCDG4CalHit::Draw() {
00164   G4VVisManager* pVVisManager = G4VVisManager::GetConcreteInstance();
00165   if(pVVisManager) {
00166     G4Circle circle(m_pos);
00167     circle.SetScreenSize(1.0);
00168     //circle.SetScreenSize(0.04);
00169     circle.SetFillStyle(G4Circle::filled);
00170     G4Colour colour(1.0,0.0,1.0); // Magenta
00171     G4VisAttributes attribs(colour);
00172     circle.SetVisAttributes(attribs);
00173     pVVisManager->Draw(circle);
00174   }
00175 }
00176 
00177 /*
00178  * Print the hit information
00179  */
00180 void LCDG4CalHit::Print() {
00181   G4cout << "Layer:" << m_layer << G4endl;
00182   G4cout << "Sysno:" << m_sysNo << G4endl;
00183   G4cout << "Bar/End:" << m_barend << G4endl;
00184   G4cout << "Phi:" << m_phi << G4endl;
00185   G4cout << "Theta:" << m_theta << G4endl;
00186   G4cout << "Edep:" << m_edep << G4endl;
00187 }

Generated on Thu Oct 7 18:44:46 2004 for LCDG4 by doxygen 1.3.4