Skip to content

Commit

Permalink
Merge pull request #842 from mantidproject/11886_ReplaceSampleReducti…
Browse files Browse the repository at this point in the history
…onForUsers

Replace sample users script by its updated version if present
  • Loading branch information
FedeMPouzols committed Jun 3, 2015
2 parents 6d43ca2 + 7fb7b1d commit 65a45cd
Show file tree
Hide file tree
Showing 2 changed files with 82 additions and 29 deletions.
70 changes: 51 additions & 19 deletions Code/Mantid/scripts/Inelastic/Direct/ISISDirecInelasticConfig.py
Expand Up @@ -3,7 +3,8 @@
import shutil
import re
import copy
from datetime import date,time
from datetime import date
import time

# the list of instruments this configuration is applicable to
INELASTIC_INSTRUMENTS = ['MAPS','LET','MERLIN','MARI','HET']
Expand All @@ -18,7 +19,7 @@ def __init__(self):
self.cycle_IDlist={}
self.start_dates = {}
self._recent_dateID=None

#
def set_user_properties(self,instrument,start_date,cycle,rb_folder):
"""Define the information, user office provides about user. The info has the form:
instrument -- string with full instrument name
Expand All @@ -44,26 +45,28 @@ def set_user_properties(self,instrument,start_date,cycle,rb_folder):
max_date = a_date
else:
self._recent_dateID = recent_date_id
#
def get_start_date(self):
"""Last start date"""
if self._recent_dateID:
return self.start_dates[self._recent_dateID]
else:
raise RuntimeError("User's experiment date is not defined. User undefined")
#
def get_last_instrument(self):
"""return instrument used in last actual experiment"""
if self._recent_dateID:
return self.instrument[self._recent_dateID]
else:
raise RuntimeError("User's experiment date is not defined. User undefined")

#
def get_last_rbdir(self):
"""return rb folder used in last actual instrument"""
if self._recent_dateID:
return self.rb_dir[self._recent_dateID]
else:
raise RuntimeError("User's experiment date is not defined. User undefined")

#
def get_last_cycleID(self):
"""return last cycle the user is participating"""
if self._recent_dateID:
Expand All @@ -74,14 +77,19 @@ def get_last_cycleID(self):
def check_input(self,instrument,start_date,cycle,rb_folder):
"""Verify that input is correct"""
if not instrument in INELASTIC_INSTRUMENTS:
raise RuntimeError("Instrument {0} has to be one of ISIS inelastic instruments".format(instrument))
raise RuntimeError("Instrument {0} has to be one of "\
"ISIS inelastic instruments".format(instrument))
if not (isinstance(start_date,str) and len(start_date) == 8):
raise RuntimeError("Experiment start date {0} should be defined as a sting in the form YYYYMMDD but it is not".format(start_date))
raise RuntimeError("Experiment start date {0} should be defined as"\
" a sting in the form YYYYMMDD but it is not".format(start_date))
if not (isinstance(cycle,str) and len(cycle) == 10 and re.match('^CYCLE',cycle)) :
raise RuntimeError("Cycle {0} should have form CYCLEYYYYN where N-- the cycle's number in a year but it is not".format(cycle))
raise RuntimeError("Cycle {0} should have form CYCLEYYYYN where "\
"N-- the cycle's number in a year but it is not".format(cycle))
if not (os.path.exists(rb_folder) and os.path.isdir(rb_folder)):
raise RuntimeError("Folder {0} have to exist".format(rb_folder))

#
#--------------------------------------------------------------------#
#
class MantidConfigDirectInelastic(object):
"""Class describes Mantid server specific user's configuration,
necessary for Direct Inelastic reduction and analysis to work
Expand Down Expand Up @@ -179,8 +187,11 @@ def __init__(self,mantid='/opt/Mantid/',home='/home/',\
# Its contents is generated by _init_config method from server and user specific
# input parameters together.
self._dynamic_configuration = None
# Unconditionally rewrite Mantid Configuration
self._force_change_config = False

# Unconditionally rewrite copy of sample reduction script
self._force_change_script = False
#
def config_need_replacing(self,config_file_name):
"""Method specifies conditions when existing configuration file should be replaced"""
if self._force_change_config:
Expand All @@ -194,10 +205,29 @@ def config_need_replacing(self,config_file_name):
return True
else:
return False

#
def script_need_replacing(self,source_script_name,target_script_name):
"""Method specifies conditions when existing reduction file should be replaced
by a sample file.
"""
if self._force_change_script:
return True
# non-existing file should always be replaced
if not os.path.isfile(target_script_name):
return True
#Always replace sample file if it has not been touched
start_date = self._user.get_start_date()
# this time is set up to the file, copied from the repository
sample_file_time = time.mktime(start_date.timetuple())
targ_file_time = os.path.getmtime(target_script_name)
if sample_file_time == targ_file_time:
return True
else: # somebody have modified the target file. Leave it alone
return False
#
def copy_reduction_sample(self,InstrName,CycleID,rb_folder):
""" Method copies sample reduction script from user script repository
to user folder.
"""Method copies sample reduction script from user script repository
to user folder.
"""

source_file = self._sample_reduction_file(InstrName)
Expand All @@ -210,13 +240,20 @@ def copy_reduction_sample(self,InstrName,CycleID,rb_folder):

target_file = self._target_reduction_file(InstrName,CycleID)
full_target = os.path.join(rb_folder,target_file)
# already have target file
if os.path.isfile(full_target):
# already have target file or modified by user
if not self.script_need_replacing(full_source,full_target):
return
if os.path.isfile(full_target):
os.remove(full_target)
shutil.copyfile(full_source,full_target)
os.chmod(full_target,0777)

if platform.system() != 'Windows':
os.system('chown '+self._fedid+':'+self._fedid+' '+full_target)
# Set up the file creation and modification dates to the users start date
start_date = self._user.get_start_date()
file_time = time.mktime(start_date.timetuple())
os.utime(full_target,(file_time,file_time))


def get_data_folder_name(self,instr,cycle_ID):
Expand Down Expand Up @@ -381,8 +418,3 @@ def _write_user_config_file(self,config_file_name):
os.system('chown -R {0}:{0} {1}'.format(self._fedid,config_file_name))



def copy_and_overwrite(from_path, to_path):
if os.path.exists(to_path):
shutil.rmtree(to_path)
shutil.copytree(from_path, to_path)
41 changes: 31 additions & 10 deletions Code/Mantid/scripts/test/ISISDirecInelasticConfigTest.py
@@ -1,5 +1,5 @@
import os
#os.environ["PATH"] = r"c:/Mantid/Code/builds/br_master/bin/Release;"+os.environ["PATH"]
os.environ["PATH"] = r"c:/Mantid/Code/builds/br_master/bin/Release;"+os.environ["PATH"]
import unittest
import shutil
import datetime
Expand Down Expand Up @@ -51,7 +51,7 @@ def setUp(self):
if not os.path.exists(self.userRootDir):
os.makedirs(self.userRootDir)

def makeFakeSourceReductionFile(self,mcf):
def makeFakeSourceReductionFile(self,mcf,contents=None):

instr_name = mcf._user.get_last_instrument()

Expand All @@ -61,10 +61,13 @@ def makeFakeSourceReductionFile(self,mcf):

file_name = mcf._sample_reduction_file(instr_name)
full_file = os.path.join(file_path,file_name)
if not os.path.isfile(full_file):
fh=open(full_file,'w')
fh.write('#Test reduction file')
fh.close()
if os.path.isfile(full_file):
os.remove(full_file)
fh=open(full_file,'w')
fh.write('#Test reduction file\n')
fh.write('Contents={0}'.format(contents))
fh.close()
return full_file


def tearDown(self):
Expand Down Expand Up @@ -181,7 +184,8 @@ def test_build_3Experiments_config(self):


rbnum2='RB1999000'
targetDir = config['defaultsave.directory']

targetDir = self.get_save_dir()
rbdir2 = os.path.join(targetDir,self.userID,rbnum2)
if not os.path.exists(rbdir2):
os.makedirs(rbdir2)
Expand All @@ -200,7 +204,7 @@ def test_build_3Experiments_config(self):

mcf.init_user(self.userID,user)

self.makeFakeSourceReductionFile(mcf)
fake_source=self.makeFakeSourceReductionFile(mcf)
self.assertEqual(len(mcf._dynamic_configuration),6)
self.assertEqual(mcf._dynamic_configuration[1],'default.instrument=MERLIN')

Expand All @@ -223,17 +227,34 @@ def test_build_3Experiments_config(self):
os.makedirs(user1RootDir)
#
user1 = UserProperties()
user1.set_user_properties('MARI','20000124','CYCLE20001',rbdir2)
user1.set_user_properties('MARI','20990124','CYCLE20991',rbdir2)

mcf.init_user(user1ID,user1)
self.makeFakeSourceReductionFile(mcf)
source_file = self.makeFakeSourceReductionFile(mcf)

mcf.generate_config()
self.assertEqual(len(mcf._dynamic_configuration),6)
self.assertEqual(mcf._dynamic_configuration[1],'default.instrument=MARI')
config_file = os.path.join(self.userRootDir,'.mantid','Mantid.user.properties')
self.assertTrue(os.path.exists(os.path.join(user1RootDir,'.mantid')))
self.assertTrue(os.path.exists(config_file))
#
# Check sample reduction file
#
full_rb_path = rbdir2
cycle_id = user1.get_last_cycleID()
instr = user1.get_last_instrument()
target_file = mcf._target_reduction_file(instr,cycle_id)
full_target_file = os.path.join(full_rb_path,target_file)
self.assertTrue(os.path.exists(full_target_file))
# Fresh target file should always be replaced
self.assertTrue(mcf.script_need_replacing(source_file,full_target_file))
# modify target file access time:
access_time = os.path.getmtime(full_target_file)
now = time.time()
os.utime(full_target_file,(access_time ,now))
# should not replace modified target file
self.assertFalse(mcf.script_need_replacing(source_file,full_target_file))

#--------------------------------------------------------------------
# clean up
Expand Down

0 comments on commit 65a45cd

Please sign in to comment.