proc printNumConFile() {local i, j localobj f
	pc.barrier()									// Wait for all ranks to get to this point
	sprint(cmd,"./results/%s/numcons.dat", RunName)
	f = new File(cmd)
	if (pc.id == 0) { 								// Write header to file 1 time only
		f.wopen()
		f.printf("host\tpretype\tposttype\tnumCons\n")
		f.close()
	}
	for rank = 0, pc.nhost-1 {				// For each processor, allow processor to append to file the positions of its cells
		if (rank == pc.id) {				// Ensure that each processor runs once
			f.aopen() 						// Open for appending to file
			for i = 0, numCellTypes-1 {
				for j = 0, numCellTypes-1 {
					f.printf("%g\t%d\t%d\t%d\n", pc.id, i, j, cellType[i].numCons.x[j])	// Print host id, precell type, postcell type, num connections
				}
			}
			f.close()
		}		
		pc.barrier()
	}
}

proc tracenet() {local i, rank, srcid localobj tgt, f	// Write out the connections list, including synapse type
	pc.barrier()									// Wait for all ranks to get to this point
	sprint(cmd,"./results/%s/connections.dat", RunName)
	f = new File(cmd)
	if (pc.id == 0) { 								// Write header to file 1 time only
		f.wopen()
		f.printf("source\ttarget\tsynapse\n")
		f.close()
	}
	for rank = 0, pc.nhost-1 {				// For each processor, allow processor to append to file its connection info
		if (rank == pc.id) {				// Ensure that each processor runs once
			f.aopen() 						// Open for appending to file
			for i=0, nclist.count -1 {		// For each connection in the list
				srcid = nclist.o(i).srcgid()	// Get the gid of the source cell
				tgt = nclist.o(i).syn			// Get a reference to the target cell
				f.printf("%d\t%d\t%d\n", srcid, tgt.cid, tgt.sid)	// Print source gid, target gid, synapse id
			}
			f.close()
		}		
		pc.barrier()
	}
}

proc tracenetfast() {local i, g, rank, srcid localobj tgt, f	// Write out the connections list, including synapse type
	pc.barrier()									// Wait for all ranks to get to this point

	sprint(cmd,"./results/%s/suballconns_%g.dat", RunName, pc.id)
	f = new File(cmd)
	f.wopen()
	for i=0, nclist.count -1 {		// For each connection in the list
		srcid = nclist.o(i).srcgid()	// Get the gid of the source cell
		tgt = nclist.o(i).syn			// Get a reference to the target cell
		f.printf("%d\t%d\t%d\n", srcid, tgt.cid, tgt.sid)	// Print source gid, target gid, synapse id
	}
	f.close()
	pc.barrier()
	
	g=1
	if (CatFlag==1) {
		while (pc.nhost>g) {
			g=g*2
			if ((pc.id/g - int(pc.id/g))==0.5) {
				sprint(dircmd,"cat ./results/%s/suballconns_%g.dat >> ./results/%s/suballconns_%g.dat", RunName, pc.id, RunName, int(pc.id-g/2))
				{system(dircmd, direx)}			
				sprint(dircmd,"rm ./results/%s/suballconns_%g.dat", RunName, pc.id)
				{system(dircmd, direx)}			
			}
			pc.barrier()
		}
	}
	if (pc.id==0) {
		sprint(cmd,"./results/%s/connections.dat", RunName)
		f = new File(cmd)
		if (pc.id == 0) { 								// Write header to file 1 time only
			f.wopen()
			f.printf("source\ttarget\tsynapse\n")
			f.close()
			if (CatFlag==1) {		
				sprint(dircmd,"cat ./results/%s/suballconns_0.dat >> ./results/%s/connections.dat", RunName, RunName)
				{system(dircmd, direx)}		
				sprint(dircmd,"rm ./results/%s/suballconns_%g.dat", RunName, pc.id)
				{system(dircmd, direx)}	
			}	
		}
	}	
}

objref traceidxlist
traceidxlist = new Vector()
proc tracecells() {local i, tr, rank, srcid localobj tgt, f	// Write out the connections list, including synapse type
	pc.barrier()									// Wait for all ranks to get to this point
	sprint(cmd,"./results/%s/cell_syns.dat", RunName)
	f = new File(cmd)
	if (pc.id == 0) { 								// Write header to file 1 time only
		f.wopen()
		f.printf("source\ttarget\tsynapse\n")
		f.close()
	}
	for rank = 0, pc.nhost-1 {				// For each processor, allow processor to append to file its connection info
		if (rank == pc.id) {				// Ensure that each processor runs once
			f.aopen() 						// Open for appending to file
			for i=0, nclist.count -1 {		// For each connection in the list
				tgt = nclist.o(i).syn			// Get a reference to the target cell
				srcid = nclist.o(i).srcgid()	// Get the gid of the source cell
				myflag=0
				for tr = 0, numtrace-1 {
					if (traceidxlist.x[tr]==tgt.cid || traceidxlist.x[tr]==srcid) {	// If this is a cell of interest
						myflag=1					
					}
				}
				if (myflag==1) {
					f.printf("%d\t%d\t%d\n", srcid, tgt.cid, tgt.sid)	// Print source gid, target gid, synapse id
				}
			}
			f.close()
		}		
		pc.barrier()
	}
}

proc tracecellsfast() {local i, tr, rank, srcid localobj tgt, f	// Write out the connections list, including synapse type
	pc.barrier()									// Wait for all ranks to get to this point
	sprint(cmd,"./results/%s/subconns_%g.dat", RunName, pc.id)
	f = new File(cmd)
	f.wopen()
	for i=0, nclist.count -1 {		// For each connection in the list
		srcid = nclist.o(i).srcgid()	// Get the gid of the source cell
		tgt = nclist.o(i).syn			// Get a reference to the target cell
		myflag=0
		for tr = 0, numtrace-1 {
			if (traceidxlist.x[tr]==tgt.cid || traceidxlist.x[tr]==srcid) {	// If this is a cell of interest
				myflag=1					
			}
		}
		if (myflag==1) {
			f.printf("%d\t%d\t%d\n", srcid, tgt.cid, tgt.sid)	// Print source gid, target gid, synapse id
		}
	}
	f.close()
	pc.barrier()
	
	g=1
	if (CatFlag==1) {
		while (pc.nhost>g) {
			g=g*2
			if ((pc.id/g - int(pc.id/g))==0.5) {
				sprint(dircmd,"cat ./results/%s/subconns_%g.dat >> ./results/%s/subconns_%g.dat", RunName, pc.id, RunName, int(pc.id-g/2))
				{system(dircmd, direx)}			
				sprint(dircmd,"rm ./results/%s/subconns_%g.dat", RunName, pc.id)
				{system(dircmd, direx)}		
			}
			pc.barrier()
		}	
	}
	if (pc.id==0) {
		sprint(cmd,"./results/%s/cell_syns.dat", RunName)
		f = new File(cmd)
		if (pc.id == 0) { 								// Write header to file 1 time only
			f.wopen()
			f.printf("source\ttarget\tsynapse\n")
			f.close()
			if (CatFlag==1) {		
				sprint(dircmd,"cat ./results/%s/subconns_0.dat >> ./results/%s/cell_syns.dat", RunName, RunName)
				{system(dircmd, direx)}		
				sprint(dircmd,"rm ./results/%s/subconns_%g.dat", RunName, pc.id)
				{system(dircmd, direx)}	
			}	
		}
	}
}