//----------------------------------------------------------- // File and Version Information: // $Id$ // // Description: // Implementation of resCalc // Uses MC Points and calculates // residua in XYZ. // // Environment: // Software developed for the PANDA Detector at FAIR. // // Author List: // Johannes Rauch // Physik Department E18, TUM // //----------------------------------------------------------- #include "TpcMCResCalcSPHit.h" #include "TClonesArray.h" #include "TClass.h" #include "TpcPoint.h" #include "TpcCluster.h" #include "TpcSPHit.h" #include "TpcResidual.h" #include "TpcRefResidualCollection.h" #include "McId.h" #include "McIdCollection.h" #include "TpcMCResCalcCluster.h" #include #include #include bool sortHitPairs(std::pair p1,std::pair p2){ return (p1.second->mcId().DominantID() < p2.second->mcId().DominantID()); } ClassImp(TpcMCResCalcSPHit) TpcMCResCalcSPHit::TpcMCResCalcSPHit() : //fNExpectedBranches(3), fskipSecondaries(false) { } TpcMCResCalcSPHit::~TpcMCResCalcSPHit() { ; } bool TpcMCResCalcSPHit::init() { if(fBranchMap.size() != 3) { std::cout<<"TpcMCResCalcSPHit::init(): "<::const_iterator it; for(it=fBranchMap.begin(); it!=fBranchMap.end(); it++) { std::string type((it->second)->GetClass()->GetName()); if(type.find(tpcPointRefType)second; fTpcPointBranch = it->first; foundTpcPoint=true; std::cout<<"TpcMCResCalcSPHit::init(): "<second; foundTpcCluster=true; std::cout<<"TpcMCResCalcSPHit::init(): "<second; foundSPHit=true; std::cout<<"TpcMCResCalcSPHit::init(): "< points; unsigned int nPoints = fTpcPointArray->GetEntriesFast(); for(unsigned int i=0; i > recoPoints; unsigned int nClusters = fTpcClusterArray->GetEntriesFast(); unsigned int nHits = fSPHitArray->GetEntriesFast(); for(unsigned int i=0; i hitCl; hitCl.first = (TpcSPHit*)(fSPHitArray->At(i)); hitCl.second = (TpcCluster*)fTpcClusterArray->At(hitCl.first->getClusterID()); recoPoints.push_back(hitCl); //clusters.push_back((TpcCluster*)((*fTpcClusterArray)[i])); } std::sort(recoPoints.begin(), recoPoints.end(), sortHitPairs); std::vector clusters; // loop over clusters McId currentTrackID, currentClusterID; TVector3 clPos, ptPos, ptDir, POCA, res3D; unsigned int itr(0); // track index for (unsigned int iHit=0; iHit hitPair= recoPoints[iHit]; currentClusterID = hitPair.second->mcId().DominantID(); if (iHit==0 || currentClusterID != currentTrackID){ currentTrackID = currentClusterID; fResults.push_back(new TpcRefResidualCollection(fTpcPointBranch.Data(), currentTrackID.mctrackID())); } if (fskipSecondaries && currentClusterID.mcsecID() != 0){ continue; } TVectorD hitCoord(3); hitCoord = ((GFAbsRecoHit*) hitPair.first)->getRawHitCoord(); clPos.SetXYZ(hitCoord[0],hitCoord[1],hitCoord[2]); double mindist(1.e99); int minId(-1); // look for the MC Point with minimum distance to the cluster for (unsigned int iPt=0; iPtGetEventID(), pt->GetTrackID(), pt->GetSecID()); if (idPt != currentTrackID) continue; pt->Position(ptPos); double dist = (clPos - ptPos).Mag(); if (dist < mindist){ mindist = dist; minId = iPt; } } // calc Residuum if (minId==-1) continue; points[minId]->Position(ptPos); points[minId]->Momentum(ptDir); ptDir.SetMag(1.); // local straight line approx. of the track, calc POCA on line POCA = ptPos + ptDir * (ptDir * (clPos - ptPos)); res3D = clPos - POCA; TpcResidual* resi = new TpcResidual(); resi->setResXYZ(res3D); resi->setRefPos(POCA); resi->setHitPos(clPos); resi->setHitIndex(hitPair.second->index()); fResults.back()->addResidual(resi); } // end loop over clusters return 0; }