// // Programmer: Craig Stuart Sapp // Creation Date: Sun Jan 13 08:14:22 PST 2008 // Last Modified: Sun Jan 13 13:40:14 PST 2008 // Filename: ...sig/examples/all/zscores.cpp // Web Address: http://sig.sapp.org/examples/museinfo/humdrum/zscores.cpp // Syntax: C++; museinfo // // Description: Calculate normalized scores (z-scores) for specified spine. // #include #include #include #include #include "humdrum.h" class Datum { public: double data; int line; int spine; int token; }; // function declarations: void checkOptions (Options& opts, int argc, char** argv); void example (void); void usage (const string& command); int findBestField (HumdrumFile& infile); void printRawNumbers (vector data, int style); void extractNumbers (HumdrumFile& infile, int field, vector& data); double getMean (vector& data); double getStandardDeviation (double mean, vector& data); double getSampleSD (double mean, vector& data); void adjustData (vector& data, double mean, double sd, int reverse); void printDataSingle (vector& data, int field, HumdrumFile& infile, double mean, double sd); void printDataReplace (vector& data, int field, HumdrumFile& infile, double mean, double sd); void printDataPrepend (vector& data, int field, HumdrumFile& infile, double mean, double sd); void printDataAppend (vector& data, int field, HumdrumFile& infile, double mean, double sd); // User interface variables: Options options; int field = 0; // used with -f option int inputQ = 0; // used with -i option int fullQ = 0; // used with --full option int statQ = 0; // used with -s option int rawQ = 0; // used with -r option int appendQ = 0; // used with -a option int prependQ = 0; // used with -p option int replaceQ = 0; // used with --replace option int suppressQ = 0; // used with -S option int reverseQ = 0; // used with --reverse option int meanQ = 0; // used with -m option int sampleQ = 0; // used with --sample int sdQ = 0; // used with -d option double myMean = 0; // used with -m option double mySd = 0; // used with -d option ////////////////////////////////////////////////////////////////////////// int main(int argc, char** argv) { // process the command-line options checkOptions(options, argc, argv); HumdrumFile infile; if (options.getArgCount() < 1) { infile.read(cin); } else { infile.read(options.getArg(1)); } if (field <= 0) { // field counter starts at 1 field = findBestField(infile); } if (field > infile.getMaxTracks()) { field = infile.getMaxTracks(); } vector data; extractNumbers(infile, field, data); if (inputQ) { printRawNumbers(data, fullQ); } double mean; double sd; if (meanQ) { mean = myMean; } else { mean = getMean(data); } if (sdQ) { sd = mySd; } else { if (sampleQ) { sd = getSampleSD(mean, data); } else { sd = getStandardDeviation(mean, data); } } if (statQ) { cout << "Mean:\t" << mean << "\n"; cout << "SD:\t" << sd << "\n"; } if (inputQ) { exit(0); } if (statQ && !rawQ) { exit(0); } adjustData(data, mean, sd, reverseQ); if (rawQ) { printRawNumbers(data, fullQ); exit(0); } else if (replaceQ) { printDataReplace(data, field, infile, mean, sd); } else if (prependQ) { printDataPrepend(data, field, infile, mean, sd); } else if (appendQ) { printDataAppend(data, field, infile, mean, sd); } else { printDataSingle(data, field, infile, mean, sd); } return 0; } ////////////////////////////////////////////////////////////////////////// ////////////////////////////// // // printDataReplace -- // void printDataReplace(vector& data, int field, HumdrumFile& infile, double mean, double sd) { int z = 0; int scount; int i, j, k; int exinterp; for (i=0; i 0) { cout << '\t'; } cout << infile[i][j]; if (infile[i].getPrimaryTrack(j) == field) { if (!suppressQ && (strncmp(infile[i][j], "**", 2) == 0)) { exinterp = 1; } } } if (exinterp && !suppressQ) { cout << '\n'; for (j=0; j 0) { cout << '\t'; } if (infile[i].getPrimaryTrack(j) == field) { cout << "!shift=" << mean; } else { cout << '!'; } } cout << '\n'; for (j=0; j 0) { cout << '\t'; } if (infile[i].getPrimaryTrack(j) == field) { cout << "!scale=" << sd; } else { cout << '!'; } } } break; case E_humrec_data: for (j=0; j 0) { cout << '\t'; } if (infile[i].getPrimaryTrack(j) == field) { if (strcmp(infile[i][j], ".") == 0) { cout << "."; } else { scount = infile[i].getTokenCount(j); for (k=0; k& data, int field, HumdrumFile& infile, double mean, double sd) { int z = 0; int scount; int i, j, k; int exinterp = 0; int collapse = 0; int counter = 0; int counter2 = 0; for (i=0; i 0) { cout << '\t'; } cout << infile[i][j]; } } cout << "\n"; //////////////////////////////////////////// cout << infile[i] << "\t"; counter = 0; for (j=0; j 0) { cout << "\t"; } cout << "*"; } } else { cout << infile[i]; cout << "\t"; counter = 0; for (j=0; j 0) { cout << '\t'; } cout << infile[i][j]; if (!suppressQ && (strncmp(infile[i][j], "**", 2) == 0)) { exinterp = 1; } } } if (exinterp && !suppressQ) { counter = 0; cout << "\n"; for (j=0; j 0) { cout << '\t'; } cout << "!shift=" << mean; } } cout << '\n'; counter = 0; for (j=0; j 0) { cout << '\t'; } cout << "!scale=" << sd; } } } else { // cout << "\t" << infile[i]; } } break; case E_humrec_data_kern_measure: counter = 0; cout << infile[i] << "\t"; for (j=0; j 0) { cout << '\t'; } counter++; cout << infile[i][j]; } } break; case E_humrec_data: cout << infile[i] << "\t"; counter = 0; for (j=0; j 0) { cout << '\t'; } counter++; if (strcmp(infile[i][j], ".") == 0) { cout << "."; } else { scount = infile[i].getTokenCount(j); for (k=0; k& data, int field, HumdrumFile& infile, double mean, double sd) { int z = 0; int scount; int i, j, k; int exinterp = 0; int collapse = 0; int counter = 0; int counter2 = 0; for (i=0; i 0) { cout << '\t'; } cout << infile[i][j]; } } for (j=0; j 0) { cout << "\t"; } cout << "*"; } } else { counter = 0; for (j=0; j 0) { cout << '\t'; } cout << infile[i][j]; if (!suppressQ && (strncmp(infile[i][j], "**", 2) == 0)) { exinterp = 1; } } } if (exinterp && !suppressQ) { cout << '\t'; cout << infile[i]; cout << '\n'; counter = 0; for (j=0; j 0) { cout << '\t'; } cout << "!shift=" << mean; } } for (j=0; j 0) { cout << '\t'; } cout << "!scale=" << sd; } } for (j=0; j 0) { cout << '\t'; } counter++; cout << infile[i][j]; } } break; case E_humrec_data: counter = 0; for (j=0; j 0) { cout << '\t'; } counter++; if (strcmp(infile[i][j], ".") == 0) { cout << "."; } else { scount = infile[i].getTokenCount(j); for (k=0; k& data, int field, HumdrumFile& infile, double mean, double sd) { int z = 0; int scount; int i, j, k; // int interp; int counter = 0; for (i=0; i 0) { cout << '\t'; } counter++; cout << infile[i][j]; if (!suppressQ && (strncmp(infile[i][j], "**", 2) == 0)) { cout << "\n!shift=" << mean << '\n'; cout << "!scale=" << sd; } } } break; case E_humrec_data_comment: case E_humrec_data_kern_measure: counter = 0; for (j=0; j 0) { cout << '\t'; } counter++; cout << infile[i][j]; } } break; case E_humrec_data: counter = 0; for (j=0; j 0) { cout << '\t'; } counter++; if (strcmp(infile[i][j], ".") == 0) { cout << "."; } else { scount = infile[i].getTokenCount(j); for (k=0; k& data, double mean, double sd, int reverse) { int i; int size = (int)data.size(); if (reverse) { for (i=0; i& data) { int size = (int)data.size(); if (size <= 0) { return 0.0; } int i; double sum = 0.0; for (i=0; i& data) { int size = (int)data.size(); double sum = 0.0; double value; int i; for (i=0; i& data) { int size = (int)data.size(); double sum = 0.0; double value; int i; for (i=0; i data, int style) { int i; for (i=0; i<(int)data.size(); i++) { cout << data[i].data; if (style) { cout << '\t' << data[i].line; cout << '\t' << data[i].spine; cout << '\t' << data[i].token; } cout << '\n'; } } ////////////////////////////// // // extractNumbers -- // void extractNumbers(HumdrumFile& infile, int field, vector& data) { data.reserve(infile.getNumLines()*2); data.resize(0); Datum datum; double value; int i, j, k; int scount; char buffer[10000] = {0}; for (i=0; i