//-------------------------------------------------------------------------- // File and Version Information: // $Id: AstSTLFracMap.cc,v 1.1.1.1 2005/03/29 16:49:05 steinke Exp $ // // Description: // Class AstFracMap. Defines a fractional map between objects // // Environment: // Software developed for the BaBar Detector at the SLAC B-Factory. // // Author List: // David Brown // // Copyright Information: // Copyright (C) 2000 Lawrence Berkeley Laboratory // // Bertram Kopf (RUB) migrated to PandaRoot //------------------------------------------------------------------------ #include "AstSTLFracMap.h" #include #include template AstSTLFracMap::AstSTLFracMap(unsigned na) { _vector.reserve(na); } template AstSTLFracMap::~AstSTLFracMap() {;} template void AstSTLFracMap::insert(const A* a,const B* b,double weight) { // create an AstFracAss from these AstFracAss ab(a,b,weight); // see if these elements already exist logically in the lists typename std::vector >::iterator iter = std::find(_vector.begin(), _vector.end(), ab); if (iter != _vector.end()) { (*iter) += ab; } else { _vector.push_back(ab); std::sort(_vector.begin(), _vector.end()); } } template double AstSTLFracMap::weight(const A* a,const B* b) const { AstFracAss ab(a,b,0.0); // see if these elements already exist logically in the lists typename std::vector >::const_iterator iter = std::find(_vector.begin(), _vector.end(), ab); if (iter != _vector.end()) { return iter->weight(); } else { return 0.0; } } template void AstSTLFracMap::elements(const A* a, std::vector >& vector ) const { // always clear the input vector vector.clear(); // use the A vector; start by finding a match to any B AstFracAss ab(a,0,0.0); typename std::vector >::const_iterator iter = std::find(_vector.begin(), _vector.end(), ab); while (iter != _vector.end()) { vector.push_back(*iter); iter++; iter = std::find(iter, _vector.end(), ab); } std::sort(vector.begin(), vector.end()); } template void AstSTLFracMap::entries( std::vector& vector) const { vector.clear(); const A* old(0); typename std::vector >::const_iterator iter; for (iter = _vector.begin(); iter != _vector.end(); iter++) { if (iter->firstArgument() != old){ old = iter->firstArgument(); vector.push_back(old); } } } template void AstSTLFracMap::normalize(double normvalue,const A* a) { // if specified, rescale only the one entry if(a!=0) rescaleEntry(normvalue,a); else{ // otherwise, loop over them all std::vector avec; entries(avec); typename std::vector::iterator iter; for (iter = avec.begin(); iter != avec.end(); iter++) { rescaleEntry(normvalue,*iter); } } } template void AstSTLFracMap::rescaleEntry(double normvalue,const A* a) { AstFracAss ab(a,0,0.0); typename std::vector >::iterator iterStart = std::find(_vector.begin(), _vector.end(), ab); typename std::vector >::iterator iterStop = iterStart; double sum = 0.0; while (iterStop != _vector.end() && *iterStop == ab) { sum += iterStop->weight(); iterStop++; } if(sum>0.0) { double factor=normvalue/sum; typename std::vector >::iterator iter; for (iter = iterStart; iter != iterStop; iter++) { iter->rescale(factor); } } }