anchor.diff:        call zmq_delete_task(zmq_to_qp_run_socket,zmq_socket_pull,task_id(i),more)
       end do
       done += ntask
  -    call CPU_TIME(time)
  -!    print *, "DONE" , done, time - time0
  -  end do
  +
  +    time = omp_get_wtime()
  +  
  +    if(time - timeLast > 30.0 .or. more /= 1) then
  +      timeLast = time
  +      do i=1, first_det_of_teeth(1)-1
  +        if(not(actually_computed(i))) then
  +          print *, "PT2 : deterministic part not finished"
  +          cycle pullLoop
  +        end if
  +      end do
  +      
  +      
  +      double precision :: E0, avg, eqt, prop
  +      call do_carlo(tbc, Ncomb+1-firstTBDcomb, comb(firstTBDcomb), pt2_detail, actually_computed, sumabove, sum2above, Nabove)
  +      firstTBDcomb = Nabove(1) - orgTBDcomb + 1
  +      if(Nabove(1) < 2.0) cycle
  +      call get_first_tooth(actually_computed, tooth)
  +    
  +      E0 = sum(pt2_detail(1,:first_det_of_teeth(tooth)-1))
  +      prop = ((1d0 - dfloat(comb_teeth - tooth + 1) * comb_step) - cweight(first_det_of_teeth(tooth)-1))
  +      prop = prop / weight(first_det_of_teeth(tooth))
  +      E0 += pt2_detail(1,first_det_of_teeth(tooth)) * prop
  +      avg = E0 + (sumabove(tooth) / Nabove(tooth))
  +      eqt = sqrt(1d0 / (Nabove(tooth)-1) * abs(sum2above(tooth) / Nabove(tooth) - (sumabove(tooth)/Nabove(tooth))**2))
  +      time = omp_get_wtime()
  +      print "(A, 5(E15.7))", "PT2stoch ", time - time0, avg, eqt, Nabove(tooth)
  +    end if
  +  end do pullLoop
   
   
     call end_zmq_to_qp_run_socket(zmq_to_qp_run_socket)
  
positive.code:   double precision :: time0, time
  
    allocate(pt2_detail(N_states, N_det_generators), comb(100000), computed(N_det_generators), tbc(0:N_det_generators))
    provide nproc
  
    !call random_seed()
  
negative.code:   time0 = omp_get_wtime()
    print *, "grep - time - avg - err - n_combs"
    do while(.true.)
      
      call new_parallel_job(zmq_to_qp_run_socket,"pt2")
      call zmq_put_psi(zmq_to_qp_run_socket,1,ci_electronic_energy,size(ci_electronic_energy))
      call zmq_set_running(zmq_to_qp_run_socket)
      call create_selection_buffer(1, 1*2, b)
      
  
      call get_carlo_workbatch(1d-2, computed, comb, Ncomb, tbc)
      generator_per_task = 1
      do i=1,tbc(0)
        i_generator_end = min(i+generator_per_task-1, tbc(0))
        if(tbc(i) > 10) then
          integer :: zero
          zero = 0
          write(task,*) (i_generator_end-i+1), zero, tbc(i:i_generator_end)
          call add_task_to_taskserver(zmq_to_qp_run_socket,task)
        else
          do j=1,8
            write(task,*) (i_generator_end-i+1), j, tbc(i:i_generator_end)
            call add_task_to_taskserver(zmq_to_qp_run_socket,task)
          end do
        end if
      end do
  
      print *, "tasked" 
      !$OMP PARALLEL DEFAULT(shared)  SHARED(b, pt2)  PRIVATE(i) NUM_THREADS(nproc+1)
        i = omp_get_thread_num()
        if (i==0) then
          call pt2_collector(b, tbc, comb, Ncomb, computed, pt2_detail, sumabove, sum2above, Nabove)
        else
          call pt2_slave_inproc(i)
        endif
      !$OMP END PARALLEL
      call end_parallel_job(zmq_to_qp_run_socket, 'pt2')
      tbc(0) = 0
    end do
  
    pt2 = 0d0
  end subroutine
  
  
  subroutine do_carlo(tbc, Ncomb, comb, pt2_detail, computed, sumabove, sum2above, Nabove)
    integer, intent(in) :: tbc(0:N_det_generators), Ncomb
    logical, intent(in) :: computed(N_det_generators)
    double precision, intent(in) :: comb(Ncomb), pt2_detail(N_states, N_det_generators)
    double precision, intent(inout) :: sumabove(comb_teeth), sum2above(comb_teeth), Nabove(comb_teeth)
    integer :: i, dets(comb_teeth)
    double precision :: myVal, myVal2
  
    mainLoop : do i=1,Ncomb
      call get_comb(comb(i), dets)
      do j=1,comb_teeth
        if(not(computed(dets(j)))) then
          exit mainLoop
        end if
      end do
      
      myVal = 0d0
      myVal2 = 0d0
      do j=comb_teeth,1,-1
  