00001 #include "DataFormats/TrackingRecHit/interface/TrackingRecHitFwd.h"
00002 #include "DataFormats/TrackingRecHit/interface/TrackingRecHit.h"
00003
00004 #include "Calibration/IsolatedParticles/interface/MatchingSimTrack.h"
00005
00006 #include <iostream>
00007
00008 namespace spr{
00009
00010 edm::SimTrackContainer::const_iterator matchedSimTrack(const edm::Event& iEvent, edm::Handle<edm::SimTrackContainer>& SimTk, edm::Handle<edm::SimVertexContainer>& SimVtx, const reco::Track* pTrack, TrackerHitAssociator& associate, bool debug){
00011
00012 edm::SimTrackContainer::const_iterator itr = SimTk->end();;
00013
00014 edm::SimTrackContainer::const_iterator simTrkItr;
00015 edm::SimVertexContainer::const_iterator simVtxItr;
00016
00017
00018
00019 std::vector<unsigned int> trkId, trkOcc;
00020 int i=0;
00021 for (trackingRecHit_iterator iTrkHit = pTrack->recHitsBegin(); iTrkHit != pTrack->recHitsEnd(); ++iTrkHit, ++i) {
00022
00023 std::vector<PSimHit> matchedSimIds = associate.associateHit((**iTrkHit));
00024 for (unsigned int isim=0; isim<matchedSimIds.size(); isim++) {
00025 unsigned tkId = matchedSimIds[isim].trackId();
00026 bool found = false;
00027 for (unsigned int j=0; j<trkId.size(); j++) {
00028 if ( tkId == trkId[j] ) {
00029 trkOcc[j]++;
00030 found = true;
00031 break;
00032 }
00033 }
00034 if (!found) { trkId.push_back(tkId); trkOcc.push_back(1); }
00035 }
00036 }
00037
00038 if (debug) {
00039 std::cout << "Reconstructed Track with " << i << " recHits.";
00040 for (unsigned int isim=0; isim<trkId.size(); isim++){
00041 std::cout << "\n trkId " << trkId[isim] << " Occurance " << trkOcc[isim] << ", ";
00042 }
00043 std::cout << std::endl;
00044 }
00045
00046 int matchedId=0;
00047 unsigned int matchSimTrk=0;
00048 if (trkOcc.size() > 0) {
00049 unsigned int maxTrkOcc=0, idxMax=0;
00050 for(unsigned int j=0; j<trkOcc.size(); j++) {
00051 if(trkOcc[j] > maxTrkOcc ) { maxTrkOcc = trkOcc[j]; idxMax = j; }
00052 }
00053 matchSimTrk = trkId[idxMax];
00054 for (simTrkItr = SimTk->begin(); simTrkItr!= SimTk->end(); simTrkItr++) {
00055 if ( simTrkItr->trackId() == matchSimTrk ) {
00056 matchedId = simTrkItr->type();
00057 if (debug) std::cout << "matched trackId (maximum occurance) " << matchSimTrk << " type " << matchedId << std::endl;
00058 itr = simTrkItr;
00059 break;
00060 }
00061 }
00062 }
00063
00064 if (matchedId==0 && debug) {
00065 std::cout << "Could not find matched SimTrk and track history now " << std::endl;
00066 }
00067
00068 return itr;
00069 }
00070
00071
00072 std::vector<int> matchedSimTrackId(const edm::Event& iEvent, edm::Handle<edm::SimTrackContainer>& SimTk, edm::Handle<edm::SimVertexContainer>& SimVtx, const reco::Track* pTrack, TrackerHitAssociator& associate, bool debug) {
00073
00074
00075 edm::SimTrackContainer::const_iterator trkInfo = spr::matchedSimTrack(iEvent, SimTk, SimVtx, pTrack,associate, debug);
00076 unsigned int matchSimTrk = trkInfo->trackId();
00077 if (debug) std::cout << "matchedSimTrackId finds the SimTrk ID of the current track to be " << matchSimTrk << std::endl;
00078
00079 std::vector<int> matchTkid;
00080 if( trkInfo->type() != 0) {
00081 edm::SimTrackContainer::const_iterator simTrkItr;
00082 for(simTrkItr = SimTk->begin(); simTrkItr!= SimTk->end(); simTrkItr++){
00083 if (validSimTrack(matchSimTrk, simTrkItr, SimTk, SimVtx, false))
00084 matchTkid.push_back((int)simTrkItr->trackId());
00085 }
00086 }
00087 return matchTkid;
00088 }
00089
00090 spr::simTkInfo matchedSimTrackInfo(unsigned int simTkId, edm::Handle<edm::SimTrackContainer>& SimTk, edm::Handle<edm::SimVertexContainer>& SimVtx, bool debug) {
00091 spr::simTkInfo info;
00092 for (edm::SimTrackContainer::const_iterator simTrkItr=SimTk->begin();
00093 simTrkItr!= SimTk->end(); simTrkItr++) {
00094 if (simTkId == simTrkItr->trackId()) {
00095 if (spr::validSimTrack(simTkId, simTrkItr, SimTk, SimVtx, debug)) {
00096 info.found = true;
00097 info.pdgId = simTrkItr->type();
00098 info.charge = simTrkItr->charge();
00099 } else {
00100 edm::SimTrackContainer::const_iterator parentItr = spr::parentSimTrack(simTrkItr, SimTk, SimVtx, debug);
00101 if (debug) {
00102 if (parentItr != SimTk->end() ) std::cout << "original parent of " << simTrkItr->trackId() << " " << parentItr->trackId() << ", " << parentItr->type() << std::endl;
00103 else std::cout << "original parent of " << simTrkItr->trackId() << " not found" << std::endl;
00104 }
00105 if (parentItr != SimTk->end()) {
00106 info.found = true;
00107 info.pdgId = parentItr->type();
00108 info.charge = parentItr->charge();
00109 }
00110 }
00111 break;
00112 }
00113 }
00114 return info;
00115 }
00116
00117
00118 bool validSimTrack(unsigned int simTkId, edm::SimTrackContainer::const_iterator thisTrkItr, edm::Handle<edm::SimTrackContainer>& SimTk, edm::Handle<edm::SimVertexContainer>& SimVtx, bool debug){
00119
00120 if (debug) std::cout << "Inside validSimTrack: trackId " << thisTrkItr->trackId() << " vtxIndex " << thisTrkItr->vertIndex() << " to be matched to " << simTkId << std::endl;
00121
00122
00123 if (thisTrkItr->trackId() == simTkId) return true;
00124
00125
00126 int vertIndex = thisTrkItr->vertIndex();
00127 if (vertIndex == -1 || vertIndex >= (int)SimVtx->size()) return false;
00128
00129 edm::SimVertexContainer::const_iterator simVtxItr= SimVtx->begin();
00130 for (int iv=0; iv<vertIndex; iv++) simVtxItr++;
00131 int parent = simVtxItr->parentIndex();
00132 if (debug) std::cout << "validSimTrack:: parent index " << parent <<" ";
00133 if (parent < 0 && simVtxItr != SimVtx->begin()) {
00134 const math::XYZTLorentzVectorD pos1 = simVtxItr->position();
00135 for (simVtxItr=SimVtx->begin(); simVtxItr!=SimVtx->end(); ++simVtxItr) {
00136 if (simVtxItr->parentIndex() > 0) {
00137 const math::XYZTLorentzVectorD pos2 = pos1 - simVtxItr->position();
00138 double dist = pos2.P();
00139 if (dist < 0.001) {
00140 parent = simVtxItr->parentIndex();
00141 break;
00142 }
00143 }
00144 }
00145 }
00146 if (debug) std::cout << "final index " << parent << std::endl;;
00147 for(edm::SimTrackContainer::const_iterator simTrkItr= SimTk->begin(); simTrkItr!= SimTk->end(); simTrkItr++){
00148 if ((int)simTrkItr->trackId() == parent && simTrkItr != thisTrkItr) return validSimTrack(simTkId, simTrkItr, SimTk, SimVtx, debug) ;
00149 }
00150
00151 return false;
00152
00153 }
00154
00155
00156 edm::SimTrackContainer::const_iterator parentSimTrack(edm::SimTrackContainer::const_iterator thisTrkItr, edm::Handle<edm::SimTrackContainer>& SimTk, edm::Handle<edm::SimVertexContainer>& SimVtx, bool debug){
00157
00158 edm::SimTrackContainer::const_iterator itr = SimTk->end();
00159
00160 int vertIndex = thisTrkItr->vertIndex();
00161 int type = thisTrkItr->type(); int charge = (int)thisTrkItr->charge();
00162 if (debug) std::cout << "SimTrackParent " << thisTrkItr->trackId() << " Vertex " << vertIndex << " Type " << type << " Charge " << charge << std::endl;
00163
00164 if( vertIndex == -1 ) return thisTrkItr;
00165 else if (vertIndex >= (int)SimVtx->size()) return itr;
00166
00167 edm::SimVertexContainer::const_iterator simVtxItr= SimVtx->begin();
00168 for (int iv=0; iv<vertIndex; iv++) simVtxItr++;
00169 int parent = simVtxItr->parentIndex();
00170
00171 if (parent < 0 && simVtxItr != SimVtx->begin()) {
00172 const math::XYZTLorentzVectorD pos1 = simVtxItr->position();
00173 for (simVtxItr=SimVtx->begin(); simVtxItr!=SimVtx->end(); ++simVtxItr) {
00174 if (simVtxItr->parentIndex() > 0) {
00175 const math::XYZTLorentzVectorD pos2 = pos1 - simVtxItr->position();
00176 double dist = pos2.P();
00177 if (dist < 0.001) {
00178 parent = simVtxItr->parentIndex();
00179 break;
00180 }
00181 }
00182 }
00183 }
00184 for (edm::SimTrackContainer::const_iterator simTrkItr= SimTk->begin(); simTrkItr!= SimTk->end(); simTrkItr++){
00185 if ((int)simTrkItr->trackId() == parent && simTrkItr != thisTrkItr) return parentSimTrack(simTrkItr, SimTk, SimVtx, debug);
00186 }
00187
00188 return thisTrkItr;
00189 }
00190
00191
00192 }