@Override
	protected void run() throws Exception {
		initialize();

		LinkedList<DomainFile> programList = buildDomainFileList();
		File lowFile = askFile("Select file to report true matches", "OK");
		File highFile = askFile("Select file to report false positives", "OK");
		scoreThreshold = (float) askDouble("Choose score threshold", "OK");

		lowTruePositive = new FileWriter(lowFile);
		highFalsePositive = new FileWriter(highFile);

		FidQueryService queryService = null;
		Language lastLanguage = null;
		int maxPrograms = programList.size();
		int counter = 0;
		try {
			for (DomainFile domainFile : programList) {
				Program program = null;
				try {
					program = (Program) domainFile.getDomainObject(this, false, false, monitor);
					if (queryService == null || !lastLanguage.equals(program.getLanguage())) {
						if (queryService != null) {
							queryService.close();
						}
						lastLanguage = program.getLanguage();
						queryService = service.openFidQueryService(lastLanguage, false);
					}
					processProgram(program, queryService);
					counter += 1;
					monitor.setMessage("Processing programs ...");
					monitor.initialize(maxPrograms);
					monitor.setProgress(counter);
				}
				finally {
					if (program != null) {
						program.release(this);
					}
				}
			}
		}
		catch (CancelledException ex) {
			// A cancel in middle of processing still allows results to get printed
		}

		queryService.close();
		lowTruePositive.close();
		highFalsePositive.close();

		println(StatRecord.getColumns());
		StringBuilder buffer = new StringBuilder();
		statRecord.print(buffer);
		println(buffer.toString());
	}
Runs through recursively through a set of folders provided by the user.
Programs are assumed to be "marked", meaning that functions all have their correct labels.
Each function in each program is searched within the active FID databases and various statistics
are calculated.
   1) Match found/not found
   2) Are any matches found correct (as compared to existing symbol)
   3) Are there multiple potential matches (whether correct or not)

If program symbols are mangled, this script assumes the primary symbol is not demangled.
Ghidra/Features/FunctionID/ghidra_scripts/FidStatistics.java