// kstripper - read a hddm_s stream from a event generator // and strip out everything except the first k- particle, // store them one per event in output like a particle gun. // // author: richard.t.jones at uconn.edu // version: may 1, 2020 #include #include #include #include void usage() { std::cout << "Usage: kstripper .hddm ..." << std::endl; std::cout << "Output is written to _stripped.hddm" << std::endl; exit(1); } int main(int argc, char* argv[]) { for (int iarg=1; iarg < argc; ++iarg) { std::string infile(argv[iarg]); int linfile = infile.size(); if (linfile < 5 || infile.substr(linfile-5) != ".hddm") usage(); std::string outfile(infile.substr(0,linfile-5) + "_stripped.hddm"); std::ifstream ifs(infile); hddm_s::istream fin(ifs); std::cout << "reading from file " << infile << std::endl; std::ofstream ofs(outfile); hddm_s::ostream fout(ofs); hddm_s::HDDM rec; while (fin >> rec) { hddm_s::ReactionList reas = rec.getReactions(); if (reas.size() > 0) { reas(0).deleteBeams(); reas(0).deleteTargets(); reas(0).deleteRandoms(); hddm_s::VertexList vxs = reas(0).getVertices(); hddm_s::ProductList prods = vxs(0).getProducts(); int kminus = -1; for (int i=0; i < prods.size(); ++i) { if (prods(i).getType() == 11) { kminus = i; break; } } if (kminus+1 < prods.size()) vxs(0).deleteProducts(-1, kminus+1); if (kminus > 0) vxs(0).deleteProducts(kminus, 0); if (kminus >= 0) fout << rec; } } } return 0; }