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 }
1.3.4