public void reduce(Text key, Iterator<Text> iter,
				OutputCollector<Text, Text> output, Reporter reporter)
		throws IOException
		{
			mOutput = output;

			if (key.toString().compareTo("SHORT") == 0)
			{
				//    my ($tag, $cutoff, $cnt, $sum, $degree, $cov) = split /\t/, $_;

				while (iter.hasNext())
				{
					String valstr = iter.next().toString();
					String [] values = valstr.split("\t");

					//System.err.println(key.toString() + " " + valstr + "\n");

					int cutoff = Integer.parseInt(values[0]);
					long cnt    = Long.parseLong(values[1]);
					long sum    = Long.parseLong(values[2]);
					long deg    = Long.parseLong(values[3]);
					double cov  = Double.parseDouble(values[4]);

					int ci = -1;
					for (int i = 0; i < cutoffs.length; i++)
					{
						if (cutoffs[i] == cutoff)
						{
							ci = i;
							break;
						}
					}

					if (ci == -1) { throw new IOException("Couldn't find cutoff index for " + cutoff); }

					cnts[ci] += cnt;
					sums[ci] += sum;
					degs[ci] += deg;
					covs[ci] += cov;
				}
			}
			else
			{
//				my ($len, $fdegree, $rdegree, $cov) = split /\t/, $_;

				int len = Integer.parseInt(key.toString());

				while (iter.hasNext())
				{
					String valstr = iter.next().toString();
					String [] values = valstr.split("\t");

					//System.err.println(key.toString() + " " + valstr + "\n");

					int fdegree = Integer.parseInt(values[0]);
					int rdegree = Integer.parseInt(values[1]);
					float cov   = Float.parseFloat(values[2]);

					if (len >= n50contigthreshold)
					{
						n50sizes.add(len);
					}

					for (int i = 0; i < cutoffs.length; i++)
					{
						if (len >= cutoffs[i])
						{
							cnts[i]++;
							sums[i] += len;
							degs[i] += (fdegree + rdegree) * len;
							covs[i] += cov * len;
						}
					}
				}
			}
		}