00001 // $Header: /cvs/lcd/slic/src/LcioMcpMaps.cc,v 1.5 2007/04/27 01:54:35 jeremy Exp $ 00002 #include "LcioMcpMaps.hh" 00003 00004 // slic 00005 #include "LcioMcpManager.hh" 00006 #include "Module.hh" 00007 #include "Trajectory.hh" 00008 00009 using EVENT::MCParticle; 00010 using IMPL::MCParticleImpl; 00011 00012 namespace slic 00013 { 00014 00015 LcioMcpMaps::LcioMcpMaps(LcioMcpManager* manager) 00016 : Module( "LcioMcpMaps" ) 00017 { 00018 m_manager = manager; 00019 } 00020 00021 LcioMcpMaps::~LcioMcpMaps() 00022 {} 00023 00024 void LcioMcpMaps::addTrackIDToMcpLink(G4int trkID, 00025 MCParticleImpl* mcp) 00026 { 00027 assert( mcp ); 00028 assert(trkID > 0); 00029 00030 m_trackToMcp[ trkID ] = mcp; 00031 } 00032 00033 MCParticleImpl* LcioMcpMaps::findMcpFromTrackID( G4int trkID ) const 00034 { 00035 MCParticleImpl* mcp = 0; 00036 for ( TrackToMcpMap::const_iterator iter = m_trackToMcp.begin(); 00037 iter != m_trackToMcp.end(); 00038 iter++ ) { 00039 if ( iter->first == trkID ) { 00040 mcp = iter->second; 00041 break; 00042 } 00043 } 00044 return mcp; 00045 } 00046 00047 /* Find the trackID for the final MCParticle. */ 00048 G4int LcioMcpMaps::findTrackIDFromFinalMcp( MCParticle* mcp) const 00049 { 00050 G4int trkID = -1; 00051 for ( TrackToMcpMap::const_iterator iter = m_trackToMcp.begin(); 00052 iter != m_trackToMcp.end(); 00053 iter++ ) { 00054 if ( iter->second == mcp ) { 00055 trkID = iter->first; 00056 break; 00057 } 00058 } 00059 return trkID; 00060 } 00061 00062 MCParticle* LcioMcpMaps::findPrimaryInitialMcpFromTrajectory(Trajectory* trj) const 00063 { 00064 MCParticle* mcpPrim = 0; 00065 00066 G4int trjTrkID = trj->GetTrackID(); 00067 00068 /* Get initial collection. */ 00069 EVENT::LCCollection* initMcpColl = m_manager->getInitialMcpCollection(); 00070 00071 // loop over input collection 00072 int numPrePart = initMcpColl->getNumberOfElements(); 00073 for( int k=0; k < numPrePart; k++ ) { 00074 00075 // current MCP 00076 MCParticle* mcpPre = static_cast<MCParticle*> ( initMcpColl->getElementAt( k ) ); 00077 00078 // do we have matching primary for this Mcp? 00079 G4PrimaryParticle* primaryMatch = findPrimaryFromMcp( mcpPre ); 00080 if ( primaryMatch ) { 00081 00082 // found matching primary to this input trajectory 00083 if ( primaryMatch->GetTrackID() == trjTrkID ) { 00084 mcpPrim = mcpPre; 00085 break; 00086 } 00087 00088 } 00089 } 00090 00091 return mcpPrim; 00092 } 00093 00094 MCParticle* LcioMcpMaps::findDaughterMcpFromPrimary(MCParticle* mcpInit, 00095 G4PrimaryParticle* primDau) const 00096 { 00097 // loop over Mcp input particle's daughters 00098 MCParticle* mcpDau = 0; 00099 int numMcpDau = mcpInit->getDaughters().size(); 00100 for ( int i=0; i < numMcpDau; i++ ) { 00101 00102 // does ith Mcp dau match this primary? 00103 if ( findPrimaryFromMcp( mcpInit->getDaughters()[i] ) == primDau ) { 00104 00105 // found it 00106 mcpDau = mcpInit->getDaughters()[i]; 00107 break; 00108 } 00109 } 00110 00111 // return dau 00112 return mcpDau; 00113 } 00114 00115 MCParticleImpl* LcioMcpMaps::findFinalParticleFromInitial( MCParticle* mcpInit) const 00116 { 00117 MCParticleImpl* mcpFinal = 0; 00118 for ( InitMcpToMcpMap::const_iterator iter = m_initMcpToMcp.begin(); 00119 iter != m_initMcpToMcp.end(); 00120 iter++ ) { 00121 if ( iter->first == mcpInit ) { 00122 mcpFinal = iter->second; 00123 break; 00124 } 00125 } 00126 00127 return mcpFinal; 00128 } 00129 00130 G4PrimaryParticle* LcioMcpMaps::findPrimaryFromMcp(MCParticle* mcp) const 00131 { 00132 G4PrimaryParticle *pp = 0; 00133 for ( McpToPrimaryMap::const_iterator iter = m_McpToPrimary.begin(); 00134 iter != m_McpToPrimary.end(); 00135 iter++ ){ 00136 if ( iter->first == mcp ) { 00137 pp = iter->second; 00138 break; 00139 } 00140 } 00141 00142 return pp; 00143 } 00144 00145 void LcioMcpMaps::addMcpToPrimaryLink(MCParticle* mcp, 00146 G4PrimaryParticle* primary) 00147 { 00148 m_McpToPrimary[ mcp ] = primary; 00149 } 00150 00151 void LcioMcpMaps::addInitialMcpToFinalMcpLink(MCParticle* mcpInit, 00152 MCParticleImpl* mcpFinal) 00153 { 00154 m_initMcpToMcp[ mcpInit ] = mcpFinal; 00155 } 00156 00157 void LcioMcpMaps::clear() 00158 { 00159 m_trackToMcp.clear(); 00160 m_McpToPrimary.clear(); 00161 m_initMcpToMcp.clear(); 00162 } 00163 00164 void LcioMcpMaps::printMaps() 00165 { 00166 log() << LOG::debug << "Printing maps..." << LOG::done; 00167 00168 printTrackToMcpMap(); 00169 printMcpToPrimaryMap(); 00170 printInitMcpToMcpMap(); 00171 // TrajectoryManager::instance()->printTrackIDToTrajectoryMap(); 00172 } 00173 00174 void LcioMcpMaps::printTrackToMcpMap() 00175 { 00176 log() << LOG::debug << "Printing track to Mcp map..." << LOG::done; 00177 00178 log() << LOG::debug << "*** TrackToMcpMap ***" << LOG::done; 00179 log() << LOG::debug << "trkID | McpPtr" << LOG::done; 00180 for ( TrackToMcpMap::iterator iter = m_trackToMcp.begin(); 00181 iter != m_trackToMcp.end(); 00182 iter++ ) { 00183 log() << LOG::debug << iter->first << " " << iter->second << LOG::done; 00184 } 00185 log() << LOG::debug << LOG::done; 00186 } 00187 00188 void LcioMcpMaps::printMcpToPrimaryMap() 00189 { 00190 log() << LOG::debug << "Printing Mcp to primary map..." << LOG::done; 00191 00192 log() << LOG::debug << LOG::done; 00193 log() << LOG::debug << "*** McpToPrimaryMap ***" << LOG::done; 00194 log() << LOG::debug << "McpPtr | PrimaryPtr" << LOG::done; 00195 00196 for ( McpToPrimaryMap::iterator iter = m_McpToPrimary.begin(); 00197 iter != m_McpToPrimary.end(); 00198 iter++ ) { 00199 log() << LOG::debug << iter->first << " " << iter->second << LOG::done; 00200 } 00201 log() << LOG::debug << LOG::done; 00202 } 00203 00204 void LcioMcpMaps::printInitMcpToMcpMap() 00205 { 00206 log() << LOG::debug << "Printing InitMcp to Mcp map..." << LOG::done; 00207 00208 log() << LOG::debug << LOG::done; 00209 log() << LOG::debug << "*** McpToMcpMap ***" << LOG::done; 00210 log() << LOG::debug << "McpPtrInit | McpPtrFinal" << LOG::done; 00211 00212 for ( InitMcpToMcpMap::iterator iter = m_initMcpToMcp.begin(); 00213 iter != m_initMcpToMcp.end(); 00214 iter++ ) { 00215 log() << LOG::debug << iter->first << " " << iter->second << LOG::done; 00216 } 00217 log() << LOG::debug << LOG::done; 00218 } 00219 }
1.5.4