int main(int argc, char* argv[]) { if (argc < 3 || argc > 5) { std::cerr<<"Usage: calcq correctfile myanswers [nmax] [cheat]\n"; std::cerr<<"If nmax is specified, only do the first nmax lines\n"; std::cerr<<"If cheat is specified, use the cheat file to get galaxy types\n"; exit(1); } std::ifstream correct(argv[1]); std::ifstream myanswers(argv[2]); int nmax = (argc >= 4) ? strtol(argv[3],0,0) : -1; if (nmax == 0) nmax = -1; bool haveCheat = argc >= 5; std::ifstream cheat; std::vector<int> fileType; std::vector<std::string> typeName; std::map<std::string,int> typeMap; std::vector<int> fileGroup; std::vector<int> groupType; std::vector<int> groupBatch; std::map<std::pair<int,int>,int> groupMap; std::vector<std::complex<double> > fileEm; std::vector<std::complex<double> > fileEc; std::vector<std::string> fileId; std::map<std::string,int> idMap; int nType = 0; int nGroup = 0; int nFile = 0; if (haveCheat) { cheat.open(argv[4]); std::string id, doc; double e1_c,e2_c; while (cheat >> id >> e1_c >> e2_c >> doc) { //std::cout<<id<<" "<<doc<<std::endl; size_t k0 = id.find("set"); k0 += 3; id = std::string(id,k0,id.size()-k0); size_t k1 = doc.find('_'); ++k1; size_t k2 = doc.find('_',k1); std::string name(doc,k1,k2-k1); if (typeMap.find(name) == typeMap.end()) { typeMap[name] = nType++; typeName.push_back(name); } int type = typeMap[name]; fileType.push_back(type); k1 = doc.find("shear"); k1 += 6; k2 = doc.find('_',k1); int batch = strtol(doc.c_str()+k1,0,0); //std::cout<<fileType.size()<<" is type "<<type<<" = "<<typeName[type]<<std::endl; //std::cout<<fileType.size()<<" is batch "<<batch<<std::endl; int k=nFile++; idMap[id] = k; fileId.push_back(id); // For some reason e1 seems to be flpped in these files. fileEc.push_back(std::complex<double>(-e1_c,e2_c)); std::pair<int,int> groupIds(type,batch); if (groupMap.find(groupIds) == groupMap.end()) { groupMap[groupIds] = nGroup++; groupType.push_back(type); groupBatch.push_back(batch); } int group = groupMap[groupIds]; fileGroup.push_back(group); } assert(nType == int(typeMap.size())); assert(nType == int(typeName.size())); assert(nGroup == int(groupMap.size())); assert(nGroup == int(groupType.size())); assert(nGroup == int(groupBatch.size())); assert(nFile == int(idMap.size())); assert(nFile == int(fileId.size())); assert(nFile == int(fileType.size())); assert(nFile == int(fileGroup.size())); assert(nFile == int(fileEc.size())); std::cout<<"Cheat codes:\n"; for(int i=0;i<nType;++i) { std::cout<<i<<" = "<<typeName[i]<<std::endl; } } std::string junk; getline(correct,junk); std::vector<std::complex<double> > groupDiff(nGroup); std::vector<int> nFileInGroup(nGroup); double e1_c, e2_c, e1_m, e2_m; std::string id1,id2; while(myanswers >> id2 >> e1_m >> e2_m >> junk >> junk) { correct >> id1 >> e1_c >> e2_c; std::cout<<id1<<": "<<e1_c<<" "<<e2_c<<" --- "<<e1_m<<" "<<e2_m; assert(id1 == id2); fileEm.push_back(std::complex<double>(e1_m,e2_m)); int i; if (haveCheat) { i = idMap[id1]; assert(id1 == fileId[i]); assert(norm(std::complex<double>(e1_c,e2_c)-fileEc[i]) < 1.e-5); } else { i = nFile++; fileId.push_back(id1); fileEc.push_back(std::complex<double>(e1_c,e2_c)); } if (i == nmax) break; std::complex<double> diff = fileEc[i] - fileEm[i]; //std::cout<<" "<<diff; double normdiff = norm(diff); //std::cout<<" "<<normdiff; std::cout<<" "<<2.e-4/normdiff; if (haveCheat) { groupDiff[fileGroup[i]] += diff; ++nFileInGroup[fileGroup[i]]; std::cout<<" "<<fileType[i]<<" "<<fileGroup[i]; } else { groupDiff.push_back(diff); nFileInGroup.push_back(1); ++nGroup; } std::cout<<std::endl; } if (haveCheat) { for(int j=0;j<nGroup;++j) { if (nFileInGroup[j] > 0) groupDiff[j] /= nFileInGroup[j]; std::cout<<"Group "<<j<<" has groupDiff = "<<groupDiff[j]; std::cout<<" for "<<nFileInGroup[j]<<" files\n"; } } nFile = fileEm.size(); // in case nmax < nFile assert(fileEm.size() <= fileEc.size()); assert(fileEm.size() <= fileId.size()); assert(fileEm.size() <= fileGroup.size()); if (haveCheat) { std::cout<<"By type:\n"; for(int i=0;i<nType;++i) { //std::cout<<"Type "<<i<<std::endl; double sumnormdiff = 0.; std::complex<double> sumy=0., sumx=0., sumxsq=0., sumxy=0.; int ng=0, nf=0; for(int j=0;j<nGroup;++j) if (groupType[j] == i) { //std::cout<<" Using group "<<j<<" with normdiff = "<<norm(groupDiff[j])<<std::endl; sumnormdiff += norm(groupDiff[j]); ++ng; } for(int k=0;k<nFile;++k) if (fileType[k] == i) { sumy += fileEm[k]; sumx += fileEc[k]; sumxsq += fileEc[k]*fileEc[k]; sumxy += fileEm[k]*fileEc[k]; ++nf; } double q = 2.e-4 * ng / sumnormdiff; std::cout<<i<<" "<<typeName[i]<<" ( groups "; //std::cout<<" q = 2.e-4 * "<<ng<<" / "<<sumnormdiff<<std::endl; for(int j=0;j<nGroup;++j) if (groupType[j] == i) { std::cout<<j<<" "; } std::cout<<")\n"; double nfD = nf; std::complex<double> m = (sumxy*nfD - sumx*sumy) / (sumxsq*nfD - sumx*sumx)-1.; std::complex<double> c = sumy/nfD - m*sumx/nfD; std::cout<<" q = "<<q<<std::endl; std::cout<<" m = "<<m<<std::endl; std::cout<<" c = "<<c<<std::endl; } } // y = mx + c // chisq = Sum (yi - m xi - c)^2 // d/dm = 2 Sum (yi - m xi - c) (-xi) = 0 // d/dc = 2 Sum (yi - m xi - c) = 0 // Sum xi yi = m Sum xi^2 + c Sum xi // Sum yi = m Sum xi + c N // c = Sum yi / N - m Sum xi / N // Sum xi yi / N = m Sum xi^2 / N + Sum xi Sum yi / N^2 - m (Sum xi)^2/N^2 // m = (N Sum xi yi - Sum xi Sum yi) / (N Sum xi^2 - (Sum xi)^2) double sumnormdiff=0.; std::complex<double> sumy=0., sumx=0., sumxsq=0., sumxy=0.; for(int j=0;j<nGroup;++j) { sumnormdiff += norm(groupDiff[j]); } for(int k=0;k<nFile;++k) { sumy += fileEm[k]; sumx += fileEc[k]; sumxsq += fileEc[k]*fileEc[k]; sumxy += fileEm[k]*fileEc[k]; } double q = 2.e-4 * nGroup / sumnormdiff; std::cout<<"Overall Q = "<<q<<std::endl; double nFileD = nFile; std::complex<double> m = (sumxy*nFileD - sumx*sumy) / (sumxsq*nFileD - sumx*sumx)-1.; std::complex<double> c = sumy/nFileD - m*sumx/nFileD; std::cout<<"m = "<<m<<", c = "<<c<<std::endl; }
void avtMeshMetaData::SetAMRInfo(const std::string &levelName, const std::string &patchName, int origin, const std::vector<int> &patchesPerLevel) { int i; int nlevels = patchesPerLevel.size(); // Basic setup stuff int numBlocks = 0; for (i = 0 ; i < nlevels ; i++) numBlocks += patchesPerLevel[i]; this->numBlocks = numBlocks; this->blockTitle = patchName + "s"; this->blockPieceName = patchName; this->numGroups = nlevels; this->groupTitle = levelName + "s"; this->groupPieceName = levelName; this->blockOrigin = origin; this->groupOrigin = origin; vector<int> groupIds(nlevels+1); groupIds[0] = 0; for (i = 1 ; i < nlevels+1 ; i++) { groupIds[i] = groupIds[i-1] + patchesPerLevel[i-1]; } this->groupIdsBasedOnRange = groupIds; vector<int> numbelow(nlevels); numbelow[0] = 0; for (i = 1 ; i < nlevels ; i++) numbelow[i] = numbelow[i-1]+patchesPerLevel[i-1]; char str[128]; sprintf(str, "@%s%%d,%s%%d@", levelName.c_str(), patchName.c_str()); std::string base_string = str; for (i = 1 ; i < nlevels ; i++) { sprintf(str, "(n/%d)", numbelow[i]); base_string += str; if (i != (nlevels-1)) base_string += "?("; } for (i = nlevels-1 ; i >= 0 ; i--) { if (i == (nlevels-1)) sprintf(str, "?%d", i+origin); else if (i > 0) sprintf(str, ":%d:)", i+origin); else sprintf(str, ":%d:@", i+origin); base_string += str; } for (i = 1 ; i < nlevels ; i++) { sprintf(str, "(n/%d)", numbelow[i]); base_string += str; if (i != (nlevels-1)) base_string += "?("; else base_string += "?"; } for (i = nlevels-1 ; i >= 0 ; i--) { if (i == (nlevels-1)) sprintf(str, "n+%d-%d", origin, numbelow[i]); else if (i > 0) sprintf(str, ":n+%d-%d:)", origin, numbelow[i]); else sprintf(str, ":n+%d:", origin); base_string += str; } NameschemeAttributes atts; atts.SetNamescheme(base_string); this->blockNameScheme = atts; }