/* Write ------------------------------------------------------------------- */ void CTF::write(std::ostream &out) { MetaDataTable MD; MD.addObject(); MD.setValue(EMDL_CTF_VOLTAGE, kV); MD.setValue(EMDL_CTF_DEFOCUSU, DeltafU); MD.setValue(EMDL_CTF_DEFOCUSV, DeltafV); MD.setValue(EMDL_CTF_DEFOCUS_ANGLE, azimuthal_angle); MD.setValue(EMDL_CTF_CS, Cs); MD.setValue(EMDL_CTF_BFACTOR, Bfac); MD.setValue(EMDL_CTF_SCALEFACTOR, scale); MD.setValue(EMDL_CTF_Q0, Q0); MD.setValue(EMDL_CTF_PHASESHIFT, PhaseShift); MD.write(out); }
void compareMetaDataTable(MetaDataTable &MD1, MetaDataTable &MD2, MetaDataTable &MDboth, MetaDataTable &MDonly1, MetaDataTable &MDonly2, EMDLabel label1, DOUBLE eps, EMDLabel label2, EMDLabel label3) { if (!MD1.containsLabel(label1)) REPORT_ERROR("compareMetaDataTableEqualLabel::ERROR MD1 does not contain the specified label1."); if (!MD2.containsLabel(label1)) REPORT_ERROR("compareMetaDataTableEqualLabel::ERROR MD2 does not contain the specified label1."); if (label2 != EMDL_UNDEFINED) { if (!EMDL::isDouble(label1) || !EMDL::isDouble(label2)) REPORT_ERROR("compareMetaDataTableEqualLabel::ERROR 2D or 3D distances are only allowed for DOUBLEs."); if (!MD1.containsLabel(label2)) REPORT_ERROR("compareMetaDataTableEqualLabel::ERROR MD1 does not contain the specified label2."); if (!MD2.containsLabel(label2)) REPORT_ERROR("compareMetaDataTableEqualLabel::ERROR MD2 does not contain the specified label2."); } if (label3 != EMDL_UNDEFINED) { if (!EMDL::isDouble(label3)) REPORT_ERROR("compareMetaDataTableEqualLabel::ERROR 3D distances are only allowed for DOUBLEs."); if (!MD1.containsLabel(label3)) REPORT_ERROR("compareMetaDataTableEqualLabel::ERROR MD1 does not contain the specified label3."); if (!MD2.containsLabel(label3)) REPORT_ERROR("compareMetaDataTableEqualLabel::ERROR MD2 does not contain the specified label3."); } MDboth.clear(); MDonly1.clear(); MDonly2.clear(); std::string mystr1, mystr2; int myint1, myint2; DOUBLE myd1, myd2, mydy1 = 0., mydy2 = 0., mydz1 = 0., mydz2 = 0.; // loop over MD1 std::vector<long int> to_remove_from_only2; for (long int current_object1 = MD1.firstObject(); current_object1 != MetaDataTable::NO_MORE_OBJECTS && current_object1 != MetaDataTable::NO_OBJECTS_STORED; current_object1 = MD1.nextObject()) { if (EMDL::isString(label1)) MD1.getValue(label1, mystr1); else if (EMDL::isInt(label1)) MD1.getValue(label1, myint1); else if (EMDL::isDouble(label1)) { MD1.getValue(label1, myd1); if (label2 != EMDL_UNDEFINED) MD1.getValue(label2, mydy1); if (label3 != EMDL_UNDEFINED) MD1.getValue(label3, mydz1); } else REPORT_ERROR("compareMetaDataTableEqualLabel ERROR: only implemented for strings, integers or DOUBLEs"); // loop over MD2 bool have_in_2 = false; for (long int current_object2 = MD2.firstObject(); current_object2 != MetaDataTable::NO_MORE_OBJECTS && current_object2 != MetaDataTable::NO_OBJECTS_STORED; current_object2 = MD2.nextObject()) { if (EMDL::isString(label1)) { MD2.getValue(label1, mystr2); if (strcmp(mystr1.c_str(), mystr2.c_str()) == 0) { have_in_2 = true; to_remove_from_only2.push_back(current_object2); MDboth.addObject(MD1.getObject()); break; } } else if (EMDL::isInt(label1)) { MD2.getValue(label1, myint2); if ( ABS(myint2 - myint1) <= ROUND(eps) ) { have_in_2 = true; to_remove_from_only2.push_back(current_object2); MDboth.addObject(MD1.getObject()); break; } } else if (EMDL::isDouble(label1)) { MD2.getValue(label1, myd2); if (label2 != EMDL_UNDEFINED) MD2.getValue(label2, mydy2); if (label3 != EMDL_UNDEFINED) MD2.getValue(label3, mydz2); DOUBLE dist = sqrt( (myd1 - myd2) * (myd1 - myd2) + (mydy1 - mydy2) * (mydy1 - mydy2) + (mydz1 - mydz2) * (mydz1 - mydz2) ); if ( ABS(dist) <= eps ) { have_in_2 = true; to_remove_from_only2.push_back(current_object2); //std::cerr << " current_object1= " << current_object1 << std::endl; //std::cerr << " myd1= " << myd1 << " myd2= " << myd2 << " mydy1= " << mydy1 << " mydy2= " << mydy2 << " dist= "<<dist<<std::endl; //std::cerr << " to be removed current_object2= " << current_object2 << std::endl; MDboth.addObject(MD1.getObject()); break; } } } if (!have_in_2) { MDonly1.addObject(MD1.getObject()); } } for (long int current_object2 = MD2.firstObject(); current_object2 != MetaDataTable::NO_MORE_OBJECTS && current_object2 != MetaDataTable::NO_OBJECTS_STORED; current_object2 = MD2.nextObject()) { bool to_be_removed = false; for (long int i = 0; i < to_remove_from_only2.size(); i++) { if (to_remove_from_only2[i] == current_object2) { to_be_removed = true; break; } } if (!to_be_removed) { //std::cerr << " doNOT remove current_object2= " << current_object2 << std::endl; MDonly2.addObject(MD2.getObject(current_object2)); } } }
/* Read from 1 MetaDataTable ----------------------------------------------- */ void CTF::read(MetaDataTable &MD) { MetaDataTable MDempty; MDempty.addObject(); // add one empty object read(MD, MDempty); }