/* Copyright 2011, Technische Universitaet Muenchen, Authors: Karl Bicker, Christian Hoeppner This file is part of GENFIT. GENFIT is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. GENFIT is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with GENFIT. If not, see . */ #include GFDaf::GFDaf() : GFKalman::GFKalman() { setBetas(81.,8.,4.,1.,1.,1.); setProbCut(0.01); GFKalman::setNumIterations(1); }; void GFDaf::processTrack(GFTrack* trk) { std::vector eff_hits = initHitsWeights(trk); GFTrack* mini_trk = new GFTrack(); for(unsigned int j=0; jaddHit(eff_hits.at(j)); mini_trk->setSmoothing(); for(unsigned int i=0; igetNumReps(); i++) { if(trk->getTrackRep(i)->getStatusFlag()!=0) continue; mini_trk->addTrackRep(trk->getTrackRep(i)); for(unsigned int iBeta=0; iBetagetNumHits(); j++) { GFDafHit* hit = static_cast(mini_trk->getHit(j)); hit->setWeights(fWeights.at(i).at(j)); hit->setBlowUp(fBeta.at(iBeta)); } GFKalman::processTrack(mini_trk); if(mini_trk->getTrackRep(0)->getStatusFlag() != 0) break; if(iBeta != fBeta.size()-1 ) try{ fWeights.at(i) = calcWeights(mini_trk, fBeta.at(iBeta)); } catch(GFException& e) { std::cerr<getTrackRep(0)->setStatusFlag(1); break; } } if(trk->getSmoothing()) copySmoothing(mini_trk, trk, i); mini_trk->releaseTrackReps(); } delete mini_trk; }; std::vector > GFDaf::calcWeights(GFTrack* trk, double beta) { std::vector > ret_val; for(unsigned int i=0; igetNumHits(); i++) { GFDafHit* eff_hit = static_cast(trk->getHit(i)); std::vector phi; double phi_sum = 0; double phi_cut = 0; std::vector weights; TMatrixT x_smoo(GFTools::getSmoothedPos(trk, 0, i)); if(x_smoo.GetNrows() == 0) { weights.assign(eff_hit->getNumHits(),0.5); std::cout<<"Assumed weight 0.5!!"<getNumHits(); j++) { GFAbsRecoHit* real_hit = eff_hit->getHit(j); GFDetPlane pl; try{ pl = real_hit->getDetPlane(trk->getTrackRep(0)); } catch(GFException& e) { std::cerr< m(real_hit->getHitCoord(pl)); TMatrixT V( beta * real_hit->getHitCov(pl)); TMatrixT resid(m - x_smoo); TMatrixT resid_T(resid); resid_T.T(); double detV = V.Determinant(); TMatrixT Vinv; GFTools::invertMatrix(V,Vinv); phi.push_back((1./(pow(2.*TMath::Pi(),V.GetNrows()/2.)*sqrt(detV)))*exp(-0.5*(resid_T * Vinv * resid)[0][0])); phi_sum += phi.at(j); double cutVal = fchi2Cuts[V.GetNrows()]; assert(cutVal>1.E-6); phi_cut += 1./(2.*TMath::Pi()*sqrt(detV))*exp(-0.5*cutVal/beta); } for(unsigned int j=0; jgetNumHits(); j++) { //std::cout<<"Calculated weight (beta = "<0);fBeta.push_back(b1); assert(b2>0 && b2<=b1);fBeta.push_back(b2); if(b3>=0.) { assert(b3<=b2);fBeta.push_back(b3); if(b4>=0.) { assert(b4<=b3);fBeta.push_back(b4); if(b5>=0.) { assert(b5<=b4);fBeta.push_back(b5); if(b6>=0.) { assert(b6<=b5);fBeta.push_back(b6); if(b7>=0.) { assert(b7<=b6);fBeta.push_back(b7); if(b8>=0.) { assert(b8<=b7);fBeta.push_back(b8); if(b9>=0.) { assert(b9<=b8);fBeta.push_back(b9); if(b10>=0.) { assert(b10<=b9);fBeta.push_back(b10); } } } } } } } } } std::vector GFDaf::initHitsWeights(GFTrack* trk) { std::vector< std::vector* > planes; trk->getHitsByPlane(planes); int nPlanes = planes.size(); std::vector eff_hits; for(int i=0; i hits; for(unsigned int j=0; jsize(); j++) { hits.push_back(trk->getHit(planes.at(i)->at(j)) ); } GFDafHit* eff_hit = new GFDafHit(hits); eff_hits.push_back(eff_hit); } for(unsigned int i=0; igetNumReps(); i++) { std::vector > rep_weights; for(unsigned int j=0; j single_weights; single_weights.assign(eff_hits.at(j)->getNumHits(),1.); rep_weights.push_back(single_weights); } fWeights.push_back(rep_weights); } return eff_hits; } void GFDaf::copySmoothing(GFTrack* source, GFTrack* target, int target_irep) { for(unsigned int i=0; igetNumReps(); i++) { std::vector mat_keys = target->getBK(i)->getMatrixKeys(); bool already_there = false; for(unsigned int j=0; jgetBK(i)->setNhits(target->getNumHits()); target->getBK(i)->bookMatrices("fUpSt"); target->getBK(i)->bookMatrices("fUpCov"); target->getBK(i)->bookMatrices("bUpSt"); target->getBK(i)->bookMatrices("bUpCov"); target->getBK(i)->bookGFDetPlanes("fPl"); target->getBK(i)->bookGFDetPlanes("bPl"); if(target->getTrackRep(i)->hasAuxInfo()) { target->getBK(i)->bookMatrices("fAuxInfo"); target->getBK(i)->bookMatrices("bAuxInfo"); } } int hit_count = 0; for(unsigned int pl_i=0; pl_igetNumHits(); pl_i++) { GFDafHit* eff_hit = static_cast(source->getHit(pl_i)); for(unsigned int hit_i=0; hit_igetNumHits(); hit_i++) { TMatrixT fUpSt, fUpCov, bUpSt, bUpCov, fAuxInfo, bAuxInfo; GFDetPlane fPl, bPl; source->getBK(0)->getMatrix("fUpSt",hit_i,fUpSt); source->getBK(0)->getMatrix("fUpCov",hit_i,fUpCov); source->getBK(0)->getDetPlane("fPl",hit_i,fPl); source->getBK(0)->getMatrix("bUpSt",hit_i,bUpSt); source->getBK(0)->getMatrix("bUpCov",hit_i,bUpCov); source->getBK(0)->getDetPlane("bPl",hit_i,bPl); if(source->getTrackRep(0)->hasAuxInfo()) { source->getBK(0)->getMatrix("fAuxInfo",hit_i,fAuxInfo); source->getBK(0)->getMatrix("bAuxInfo",hit_i,bAuxInfo); target->getBK(target_irep)->setMatrix("fAuxInfo",hit_count,fAuxInfo); target->getBK(target_irep)->setMatrix("bAuxInfo",hit_count,bAuxInfo); } target->getBK(target_irep)->setMatrix("fUpSt",hit_count,fUpSt); target->getBK(target_irep)->setMatrix("fUpCov",hit_count,fUpCov); target->getBK(target_irep)->setDetPlane("fPl",hit_count,fPl); target->getBK(target_irep)->setMatrix("bUpSt",hit_count,bUpSt); target->getBK(target_irep)->setMatrix("bUpCov",hit_count,bUpCov); target->getBK(target_irep)->setDetPlane("bPl",hit_count,bPl); hit_count++; } } }