# **************************************************************************
# *
# * Authors: Yunior C. Fonseca Reyna (cfonseca@cnb.csic.es)
# *
# *
# * Unidad de Bioinformatica of Centro Nacional de Biotecnologia , CSIC
# *
# * This program is free software; you can redistribute it and/or modify
# * it under the terms of the GNU General Public License as published by
# * the Free Software Foundation; either version 2 of the License, or
# * (at your option) any later version.
# *
# * This program is distributed in the hope that it will be useful,
# * but WITHOUT ANY WARRANTY; without even the implied warranty of
# * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# * GNU General Public License for more details.
# *
# * You should have received a copy of the GNU General Public License
# * along with this program; if not, write to the Free Software
# * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
# * 02111-1307 USA
# *
# * All comments concerning this program package may be sent to the
# * e-mail address 'scipion@cnb.csic.es'
# *
# **************************************************************************
import os
import re
import time
from pyworkflow.protocol.params import StringParam
from pwem.protocols import EMProtocol
[docs]class ProtManualCheckpoint(EMProtocol):
"""
This protocol is kept running for a time determined by a parameter or until
the user determines it is convenient. This protocol is useful if we want a
given protocol to be launched at the time the user sees appropriate.
"""
_label = 'manual check point'
def _defineParams(self, form):
form.addSection(label='Criteria')
form.addParam('timeout', StringParam, default="1h",
label='Time to wait:',
help='Time in seconds that the protocol will remain '
'running. A correct format is an integer number in '
'seconds or the following syntax: {days}d {hours}h '
'{minutes}m {seconds}s separated by spaces '
'e.g: 1d 2h 20m 15s, 10m 3s, 1h, 20s or 25.')
def _insertAllSteps(self):
self._insertFunctionStep(self.waitingStep)
[docs] def waitingStep(self):
lastTimeCheck = 0
timeout = self.getTimeOutInSeconds(self.timeout.get())
finished = False
while not finished:
if lastTimeCheck % 300 == 0:
self.info("Remaining time: %s seconds. Next check in 5 minutes" % str(timeout - lastTimeCheck))
time.sleep(10)
lastTimeCheck += 10
finished = (lastTimeCheck > timeout or
self.waitingHasFinished())
[docs] def getTimeOutInSeconds(self, timeOut):
timeOutFormatRegexList = {r'\d+s': 1, r'\d+m': 60, r'\d+h': 3600,
r'\d+d': 72000}
try:
return int(timeOut)
except Exception:
seconds = 0
for regex, secondsUnit in timeOutFormatRegexList.items():
matchingTimes = re.findall(regex, timeOut)
for matchTime in matchingTimes:
seconds += int(matchTime[:-1]) * secondsUnit
return seconds
def _validate(self):
message = []
timeInSec = self.getTimeOutInSeconds(self.timeout.get())
if timeInSec == 0:
message.append('Time format is wrong. A correct format is an '
'integer number in seconds or the following syntax: '
'{days}d {hours}h {minutes}m {seconds}s separated by'
' spaces e.g: 1d 2h 20m 15s, 10m 3s, 1h, 20s or 25.')
return message
def _getStopWaitingFilename(self):
return self._getExtraPath("APPROVE_CHECKPOINT.TXT")
[docs] def getActions(self):
if self.isRunning():
return [('APPROVE CHECKPOINT', self.stopWait)]
else:
return []
[docs] def stopWait(self):
f = open(self._getStopWaitingFilename(), 'w')
f.close()
[docs] def waitingHasFinished(self):
return os.path.exists(self._getStopWaitingFilename())