- Timestamp:
- Mar 20, 2017, 3:03:17 PM (8 years ago)
- Branches:
- FitPartialCharges_GlobalError, PartialCharges_OrthogonalSummation
- Children:
- 3607c3
- Parents:
- 5b3781
- git-author:
- Frederik Heber <heber@…> (06/12/16 19:02:32)
- git-committer:
- Frederik Heber <heber@…> (03/20/17 15:03:17)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
src/Actions/PotentialAction/FitPartialChargesAction.cpp
r5b3781 rbb8b0a 49 49 #include <boost/filesystem.hpp> 50 50 #include <boost/foreach.hpp> 51 #include <boost/mpl/for_each.hpp> 52 51 53 #include <algorithm> 52 54 #include <functional> … … 65 67 #include "Fragmentation/Homology/HomologyContainer.hpp" 66 68 #include "Fragmentation/Homology/HomologyGraph.hpp" 69 #include "Fragmentation/Summation/Containers/PartialChargesFused.hpp" 70 #include "Fragmentation/Summation/Containers/PartialChargesMap.hpp" 67 71 #include "Fragmentation/Summation/SetValues/SamplingGrid.hpp" 72 #include "Fragmentation/Summation/ZeroInstanceInitializer.hpp" 68 73 #include "FunctionApproximation/Extractors.hpp" 69 74 #include "Potentials/PartialNucleiChargeFitter.hpp" … … 400 405 } 401 406 407 struct KeySetSizeComp { 408 bool operator() (const KeySet &a, const KeySet &b) { return a.size()<b.size(); } 409 } keyset_comparator; 410 411 #include <boost/fusion/sequence.hpp> 412 #include <boost/mpl/for_each.hpp> 413 414 #include "Fragmentation/Summation/AllLevelOrthogonalSummator.hpp" 415 #include "Fragmentation/Summation/IndexSet.hpp" 416 #include "Fragmentation/Summation/IndexSetContainer.hpp" 417 #include "Fragmentation/Summation/SubsetMap.hpp" 418 #include "Fragmentation/Summation/Containers/PartialChargesFused.hpp" 419 #include "Fragmentation/Summation/Containers/PartialChargesMap.hpp" 420 #include "Fragmentation/Summation/SetValues/IndexedPartialCharges.hpp" 421 402 422 ActionState::ptr PotentialFitPartialChargesAction::performCall() 403 423 { … … 409 429 return Action::failure; 410 430 } 431 LOG(3, "There are " << selected_atoms.size() << " selected atoms."); 411 432 412 433 /// obtain possible fragments to each selected atom … … 442 463 /// obtain average charge for each atom the fitted charges over all its fragments 443 464 detail::fitted_charges_t fitted_charges; 444 for (std::vector<const atom *>::const_iterator atomiter = selected_atoms.begin(); 445 atomiter != selected_atoms.end(); ++atomiter) { 446 const atomId_t walkerid = (*atomiter)->getId(); 447 const double average_charge = fitAverageChargeToAtom( 448 *atomiter, atomfragments, keyset_graphs, fittedcharges_per_fragment); 449 450 if (average_charge != 0.) { 451 LOG(2, "DEBUG: For atom " << **atomiter << " we have an average charge of " 452 << average_charge); 453 454 fitted_charges.insert( std::make_pair(walkerid, average_charge) ); 455 } 465 // for (std::vector<const atom *>::const_iterator atomiter = selected_atoms.begin(); 466 // atomiter != selected_atoms.end(); ++atomiter) { 467 // const atomId_t walkerid = (*atomiter)->getId(); 468 // const double average_charge = fitAverageChargeToAtom( 469 // *atomiter, atomfragments, keyset_graphs, fittedcharges_per_fragment); 470 // 471 // if (average_charge != 0.) { 472 // LOG(2, "DEBUG: For atom " << **atomiter << " we have an average charge of " 473 // << average_charge); 474 // 475 // fitted_charges.insert( std::make_pair(walkerid, average_charge) ); 476 // } 477 // } 478 { 479 // TODO:: convert the data into boost::fusion::map format 480 std::map<JobId_t, PartialChargesMap_t> PartialCharges_fused; 481 std::vector<IndexSet> indexsets; 482 { 483 JobId_t counter = 0; 484 for (std::set<KeySet>::const_iterator iter = fragments.begin(); 485 iter != fragments.end(); ++iter) { 486 const KeySet ¤tset = *iter; 487 // place as IndexSet into container 488 { 489 IndexSet tempset; 490 tempset.insert(currentset.begin(), currentset.end()); 491 indexsets.push_back(tempset); 492 } 493 const detail::KeysetsToGraph_t::const_iterator graphiter = keyset_graphs.find(currentset); 494 if (graphiter == keyset_graphs.end()) { 495 ELOG(1, "Could not find graph to keyset " << currentset); 496 return Action::failure; 497 } 498 const HomologyGraph ¤tgraph = graphiter->second; 499 const detail::GraphFittedChargeMap_t::const_iterator fragmentiter = 500 fittedcharges_per_fragment.find(currentgraph); 501 if (fragmentiter == fittedcharges_per_fragment.end()) { 502 ELOG(1, "Could not find fragment to graph " << currentgraph); 503 return Action::failure; 504 } 505 const PartialNucleiChargeFitter::charges_t &charges = fragmentiter->second; 506 PartialChargesMap_t chargemap; 507 const AtomFragmentsMap::indices_t &full_currentset = atomfragments.getFullKeyset(currentset); 508 IndexedPartialCharges::indices_t indices(full_currentset.begin(), full_currentset.end()); 509 IndexedPartialCharges::values_t values(charges.begin(), charges.end()); 510 LOG(3, "Inserting " << indices << " with charges " << charges << " into chargemap instance."); 511 boost::fusion::at_key<PartialChargesFused::partial_charges_t>(chargemap) = 512 IndexedPartialCharges(indices, values); 513 PartialCharges_fused.insert( std::make_pair(counter++, chargemap) ); 514 } 515 } 516 ASSERT( indexsets.size() == fragments.size(), 517 "PotentialFitPartialChargesAction::performCall() - not all fragments' keysets were created?"); 518 519 // prepare index set hierarchy 520 std::map< JobId_t, size_t > IdentityLookup; 521 size_t MaxLevel = std::max_element(fragments.begin(), fragments.end(), keyset_comparator)->size(); 522 LOG(3, "The maximum level is " << MaxLevel); 523 size_t max_indices = fragments.size(); 524 LOG(3, "There are " << max_indices << " for the selected atoms."); 525 { 526 for (size_t index = 0; index < max_indices; ++index) 527 IdentityLookup.insert( std::make_pair( (JobId_t)index, index ) ); 528 } 529 IndexSetContainer::ptr container(new IndexSetContainer(indexsets)); 530 SubsetMap::ptr subsetmap(new SubsetMap(*container)); 531 532 // and sum up 533 PartialChargesMap_t ZeroInstances; 534 ZeroInstanceInitializer<PartialChargesMap_t> initZeroInstance(ZeroInstances); 535 boost::mpl::for_each<PartialChargesVector_t>(boost::ref(initZeroInstance)); 536 //!> results per level of summed up partial charges 537 std::vector<PartialChargesMap_t> Result_PartialCharges_fused(MaxLevel); 538 //!> results per index set in terms of value and contribution 539 std::map< 540 IndexSet::ptr, 541 std::pair<PartialChargesMap_t, PartialChargesMap_t> > Result_perIndexSet_PartialCharges; 542 AllLevelOrthogonalSummator<PartialChargesMap_t> partialchargeSummer( 543 subsetmap, 544 PartialCharges_fused, 545 container->getContainer(), 546 IdentityLookup, 547 Result_PartialCharges_fused, 548 Result_perIndexSet_PartialCharges, 549 ZeroInstances); 550 boost::mpl::for_each<PartialChargesVector_t>(boost::ref(partialchargeSummer)); 551 552 // TODO: place results into fitted_charges 553 const IndexedPartialCharges::indexedvalues_t indexed_partial_charges = 554 boost::fusion::at_key<PartialChargesFused::partial_charges_t>( 555 Result_PartialCharges_fused.back() 556 ).getValues(); 557 for (IndexedPartialCharges::indexedvalues_t::const_iterator iter = indexed_partial_charges.begin(); 558 iter != indexed_partial_charges.end(); ++iter) 559 fitted_charges.insert( std::make_pair( iter->first, iter->second.charge)); 560 LOG(3, "Summation has brought forth the following charges per atom index: " << fitted_charges); 456 561 } 457 562
Note:
See TracChangeset
for help on using the changeset viewer.