private CommucObj doDistrDACSSlave(CommucObj cObj) {
				
		long startTime = System.currentTimeMillis();
						
		//boolean ligPresent = cObj.ligPresent;

		//Setup the molecule system
		Molecule m = new Molecule();
		m = setupMolSystem(m,cObj.params,cObj.strandPresent,cObj.strandLimits);
		
		RotamerSearch rs = (RotamerSearch)readObject(cObj.rotFileIn); //load the saved rs from master

                Perturbation.idealizeSC = cObj.idealizeSC;

		String fn = "";
		for (int i=0; i<cObj.partIndex.length; i++)
			fn += ("_"+cObj.partIndex[i]);
		String outputConfInfo = ("./conf_info/"+cObj.outputConfInfo+fn);
		PrintStream logPS = setupOutputFile("./conf_info/"+cObj.outputPruneInfo+fn);
		
		if(logPS == null){
			System.out.println("ERROR: Please make folder conf_info!!!");
			return null;
		}
		
		double otherBestE = cObj.pruningE; //the best energy from other partitions
		
		Thread t = new Thread(new DACSthread(rs,cObj,logPS,outputConfInfo)); //create a new thread for performing the DACS search
		t.start();
		long waitTime = 300000; //five minutes
		while (t.isAlive()){ //DACS search thread is still running
			
			try{ t.join(waitTime);} catch (Exception e){} //wait for waitTime before the next interruption of the DACS search		
			
			double rsBestE = rs.getBestE(); //the best energy from the current partition
			
			//System.out.println("partition "+cObj.partIndex+": curBestE "+bestE+" rsBestE "+rsBestE);
			
			if (rsBestE<otherBestE){ //new best energy for the current partition; update
				
				CommucObj c[] = new CommucObj[1];
				c[0] = new CommucObj();
				c[0].pruningE = rsBestE;
				
				//System.out.println("partition "+cObj.partIndex+": sending update to main node..");
				
				try { MPItoThread.Send(c, 0, 1, ThreadMessage.OBJECT, 0, updateTag);} catch (Exception e){}; //send back updated best energy
				
				otherBestE = rsBestE;
			}
			
			//check if there are updates for the best energy from the other partitions
			try {				
				//System.out.println("partition "+cObj.partIndex+": checking for update from main node..");
				
				double c[] = new double[1];
				while (MPItoThread.Iprobe(0, updateTag)!=null) { //new update message received
					
					//System.out.println("partition "+cObj.partIndex+": update from main node received..");
					
					MPItoThread.Recv(c, 0, 1, ThreadMessage.FLOAT, 0, updateTag);
					
					//System.out.println("partition "+cObj.partIndex+": updateE "+c[0]+" curBestE: "+bestE);
					
					rs.updateBestE(c[0]);
					otherBestE = Math.min(otherBestE,c[0]);				
				}
			}
			catch (Exception e){};
		}		
		
		logPS.flush();
		logPS.close();		
		
		rs = null;
		cObj.prunedRot = null;//smaller object, for sending back		
		
		long stopTime = System.currentTimeMillis();
		cObj.elapsedTime = Math.round((stopTime - startTime) / 1000.0f);
		
		//System.out.println("Partition "+cObj.partIndex+" done, time: "+cObj.elapsedTime/60.0f+" minutes; sending results to main node..");
		
		return cObj;
	}