#!/usr/bin/perl -w # Perl script which automatically create directories # and job scripts for mass preco processes # # input files # $work_dir = "/phenix/data25/satohiro/work_041202"; $root_dir = "$work_dir/root"; $mut_dir = "$work_dir/mut"; $dst_dir = "$work_dir/dst"; # output ROOT file will be stored if( ! -e $root_dir ) { mkdir( $root_dir, 0777 ) || die "can not open $root_dir"; } if( ! -e $mut_dir ) { mkdir( $mut_dir, 0777 ) || die "can not open $mut_dir"; } if( ! -e $dst_dir ) { mkdir( $dst_dir, 0777 ) || die "can not open $dst_dir"; } $orig_dir = "$work_dir/template"; if( ! -e $orig_dir ) { die "There is no input file directory \n"; } # directory and file of template ROOT macro $macro_reco = "quick.C"; # preco macro name $macro_dstana = "dstana.C"; # DST analysis macro name $batch_file = "$work_dir/preco.bat"; # top level batch file $merge_file = "$work_dir/merge.C"; #ROOT macro which merge all ROOT output file $job_script = "job_script"; # job script file name $input_file = "$work_dir/input_file.dat"; if( ! -e $input_file ) { die " There is no input data file\n"; } # input file name open( INPUT, $input_file ) || die " can not open PRECO input file\n"; @input = ; close( INPUT ); printf("number of lines = %d\n", $#input+1); $dir = 0; get_run_number(); # get run numbers from data file names for( $dir = 0; $dir < $#input+1; $dir++ ) { #if( -e "dir$dir" ) { #system( "rm -r -f dir$dir"); #} if( !( -e "dir$dir" )) { mkdir "dir$dir", 0777 || die "can not create directory"; } chomp( $input[ $dir ] ); chdir "dir$dir" || die " can not chdir\n"; system( "ln -fs $orig_dir/* ."); #system( "cp -d $orig_dir/quick.C ."); system( "ln -fs $input[$dir] data.prdf"); write_script(); chdir( "../" ) || die " can not chdir\n"; } open( BATCH, ">$batch_file") || die "can not open $batch_file"; select( BATCH ); for ( $i = 0; $i<$dir; $i++ ) { printf("cd dir$i\n"); printf("bsub -q phenix_cas -L /bin/tcsh < $job_script\n"); printf("cd ../\n"); printf("sleep 5\n"); } select( STDOUT ); close( BATCH ); open( MERGE, ">$merge_file") || die "can not open $merge_file"; select( MERGE ); printf("int merge(){\n"); #printf(" TChain* Event = new TChain(\"Event\");\n"); #printf(" TChain* muiroads = new TChain(\"muiroads\");\n"); #printf(" TChain* muotracks = new TChain(\"muotracks\");\n"); printf(" TChain* dimuons = new TChain(\"dimuons\");\n"); for( $i = 0; $i<$#input+1; $i++ ) { #printf(" Event->Add(\"$root_dir/$root_file_name[$i]\");\n"); #printf(" muiroads->Add(\"$root_dir/$root_file_name[$i]\");\n"); #printf(" muotracks->Add(\"$root_dir/$root_file_name[$i]\");\n"); printf(" dimuons->Add(\"$root_dir/$root_file_name[$i]\");\n"); } #printf(" Event->Merge(\"Event.root\");\n"); #printf(" muiroads->Merge(\"muiroads.root\");\n"); #printf(" muotracks->Merge(\"muotracks.root\");\n"); printf(" dimuons->Merge(\"dimuons.root\");\n"); printf("}\n"); select( STDOUT ); close( MERGE ); sub get_run_number() { for( $line = 0; $line< $#input+1; $line++ ) { $run_number[$line] = substr( $input[$line], 46, 5); $subevent_number[$line] = substr( $input[$line] ,59, 1); $root_file_name[$line] = "dst_ntuple_$run_number[$line]-$subevent_number[$line].root"; #$root_file_name[$line] = "dstana_00000$run_number[$line].root"; #$mut_file_name[$line] = "mut_00000$run_number[$line].root"; $mut_file_name[$line] = "mut_00000$run_number[$line]-$subevent_number[$line].root"; #$dst_file_name[$line] = "dst_00000$run_number[$line].root"; $dst_file_name[$line] = "dst_00000$run_number[$line]-$subevent_number[$line].root"; printf("$run_number[$line]\n"); #printf("$subevent_number[$line]\n"); } } sub write_script() { open( SCRIPT, ">$job_script" ) || die "can not open output file"; select( SCRIPT ); printf("/afs/rhic/phenix/software/calibration/data/LuxorLinker.pl 9\n"); printf("root -b -q $macro_reco >& preco.out\n"); printf("root -b -q $macro_dstana >& dstana.out\n"); printf("mv dstana_ntuple.root $root_dir/$root_file_name[$dir]\n"); printf("mv dstout.root $dst_dir/$dst_file_name[$dir]\n"); printf("mv mut.root $mut_dir/$mut_file_name[$dir]\n"); printf("/afs/rhic/phenix/software/calibration/data/LuxorLinker.pl -c\n"); select( STDOUT ); close( SCRIPT ); }