Line Code
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107
import helpers
import os
import shutil
import argparse
import glob
import condorTemplates

def main():
    parser = argparse.ArgumentParser(description="Automatically run APE measurements")
    parser.add_argument("--workingArea", action="store", dest="workingArea",
                          help="Config file that configures measurement")
    parser.add_argument("--dataDir", action="store", dest="dataDir",
                          help="Path of files")
    parser.add_argument("--fileName", action="store", dest="fileName",
                          help="Filenames")
    parser.add_argument("--measName", action="store", dest="measName",
                          help="Measurement name")
    parser.add_argument("--maxIterations", action="store", dest="maxIterations", default=15, type=int,
                          help="Max Iterations")
    parser.add_argument("--maxEvents", action="store", dest="maxEvents", default=-1, type=int,
                          help="Max Events")
    parser.add_argument("--isBaseline", action="store", dest="isBaseline",
                          help="Baseline measurement")
    parser.add_argument("--baselineName", action="store", dest="baselineName",
                          help="Baseline measurement")
    parser.add_argument("--isCosmics", action="store", dest="isCosmics", 
                          help="Is cosmics dataset")
    parser.add_argument("--globalTag", action="store", dest="globalTag", 
                          help="global Tag")
                          
    
    args = parser.parse_args()
    # argparser can't handle bool arguments
    args.isBaseline = (args.isBaseline == "True")
    args.isCosmics = (args.isCosmics == "True")
    
    
    files = glob.glob(os.path.join(args.dataDir, "{}_*.root".format(args.fileName)))
    files.sort()
    numFiles = len(files)
    
    base = os.environ['CMSSW_BASE']
    
    workingFolder = os.path.join(args.workingArea,args.measName)
    dag_name = "measurement.dag"
    if args.isBaseline:
        dag_name = "baseline.dag"
        
    # set up dag script
    with open(os.path.join(workingFolder, dag_name), "w") as dag_script:
        for iteration in range(0, args.maxIterations+1):
            # in the last iteration (usually iteration 15) additional plots are produced
            firstIter=(iteration==0)
            lastIter=(iteration==args.maxIterations)
            refitJobs = []
            dag_script.write("#iteration {}\n".format(iteration))
            
            # refit jobs
            for fileNumber in range(1, numFiles+1):
                # for each file, a refit job is started, the results are merged in the next step once all refit jobs are finished
                refitJob = "refit_{}_iter{}_{}".format(args.measName, iteration, fileNumber)
                refitJobs.append(refitJob)
                refitJobFile = os.path.join(workingFolder,"refit_iter{}_{}.sub".format(iteration, fileNumber))
                fileLocation = os.path.join(args.dataDir, "{}_{}.root".format(args.fileName,fileNumber))
                with open(refitJobFile, "w") as refitJobSub:
                    refitJobSub.write(condorTemplates.refitterSubTemplate.format(
                                                            base=base, 
                                                            workingArea=args.workingArea,
                                                            fileLocation=fileLocation,
                                                            globalTag=args.globalTag,
                                                            measName=args.measName,
                                                            fileNumber=fileNumber,
                                                            iteration=iteration,
                                                            lastIter=lastIter,
                                                            isCosmics=args.isCosmics,
                                                            maxEvents=args.maxEvents))
                    
                dag_script.write("JOB {} {}\n".format(refitJob, refitJobFile))
            
            # If this is not the first iteration, the refit jobs need to wait for the previous iteration to finish
            if not firstIter:
                iterationJobPrev = "iteration_{}_iter{}".format(args.measName, (iteration-1))
                dag_script.write("PARENT {} CHILD {}\n".format(iterationJobPrev, " ".join(refitJobs)))
            
            # finish iteration job
            iterationJob = "iteration_{}_iter{}".format(args.measName, iteration)
            iterationJobFile = os.path.join(workingFolder, "iteration_iter{}.sub".format(iteration))
            with open(iterationJobFile, "w") as iterationJobSub:
                iterationJobSub.write(condorTemplates.iterationSubTemplate.format(
                                                            base=base,
                                                            workingArea=args.workingArea,
                                                            measName=args.measName,
                                                            numFiles=numFiles,
                                                            iteration=iteration,
                                                            isBaseline=args.isBaseline,
                                                            baselineName=args.baselineName
                                                            ))
            
            dag_script.write("JOB {} {}\n".format(iterationJob, iterationJobFile))
            dag_script.write("PARENT {} CHILD {}\n".format(" ".join(refitJobs),iterationJob))
            dag_script.write("\n")
    
   


if __name__ == "__main__":
    main()