source: trunk/DataCheck/QuickLook/Step1.sh@ 17597

Last change on this file since 17597 was 17587, checked in by Daniela Dorner, 11 years ago
implemented usage of variable certaindate, implemented check for cases that data are deleted in wrong order, added regexp to search for file list
  • Property svn:executable set to *
File size: 17.4 KB
Line 
1#!/bin/bash
2#
3source `dirname $0`/../Sourcefile.sh
4printprocesslog "INFO starting $0"
5
6# get date (before 18h there is no new data to be processed)
7if [ "$certaindate" != "" ]
8then
9 checkstring=`echo $certaindate | grep -E -o '20[0-9][0-9]\/[01][0-9]\/[0-3][0-9]'`
10 if [ "$checkstring" = "" ]
11 then
12 echo "Please give the variable certaindate in the correct format (YYYY/MM/DD)"
13 finish
14 fi
15 datepath=$certaindate
16else
17 datepath=`date --date="-19HOUR" +%Y/%m/%d`
18fi
19date=`echo $datepath | sed -e 's/\///g'`
20printprocesslog "INFO processing "$datepath
21
22auxpathnewdaq=/newdaq/aux/$datepath
23# create aux directory on daq, if not yet there
24auxpath=/loc_data/aux/$datepath
25makedir $auxpath
26# create path for info files needed for analysis
27infopath=$anapath/info/$datepath
28makedir $infopath
29echo "" > $infopath/runrow.txt
30# create path for sequence files
31seqpath=$anapath/sequences/$datepath
32makedir $seqpath
33rawpathnewdaq=/newdaq/raw/$datepath
34rawpath=/loc_data/raw/$datepath
35
36# needed auxiliary files:
37# drive file with information about current source position
38drivefile=$auxpath/${date}.DRIVE_CONTROL_SOURCE_POSITION.fits
39drivefilenewdaq=$auxpathnewdaq/${date}.DRIVE_CONTROL_SOURCE_POSITION.fits
40# drive file with information about tracking position
41drivefile2=$auxpath/${date}.DRIVE_CONTROL_TRACKING_POSITION.fits
42drivefilenewdaq2=$auxpathnewdaq/${date}.DRIVE_CONTROL_TRACKING_POSITION.fits
43# file with magic weather information
44mweatherfile=$auxpath/${date}.MAGIC_WEATHER_DATA.fits
45mweatherfilenewdaq=$auxpathnewdaq/${date}.MAGIC_WEATHER_DATA.fits
46# file with trigger rates
47ratesfile=$auxpath/${date}.FTM_CONTROL_TRIGGER_RATES.fits
48ratesfilenewdaq=$auxpathnewdaq/${date}.FTM_CONTROL_TRIGGER_RATES.fits
49# file with trigger rates
50tempfile=$auxpath/${date}.FSC_CONTROL_TEMPERATURE.fits
51tempfilenewdaq=$auxpathnewdaq/${date}.FSC_CONTROL_TEMPERATURE.fits
52# file with trigger rates
53humfile=$auxpath/${date}.FSC_CONTROL_HUMIDITY.fits
54humfilenewdaq=$auxpathnewdaq/${date}.FSC_CONTROL_HUMIDITY.fits
55
56function rsync_aux_file()
57{
58 if ls $1 >/dev/null 2>&1
59 then
60 printprocesslog "INFO rsync "$1
61 # rsync
62 # from newdaq (/newdaq = /fact on newdaq), rsync server newdaq::newdaq/
63 # to daq (/daq = /loc_data on daq)
64 rsyncservernewdaq=`echo $1 | sed -e 's/^\//172.16.100.100::/'`
65 # old
66 #if ! rsync -a -T $rsynctempdir $1 $2
67 # new (workaround for problems on daq)
68 if ! rsync -a -T $rsynctempdir $rsyncservernewdaq $2
69 then
70 printprocesslog "WARN rsync of "$1" failed."
71 fi
72 else
73 printprocesslog "WARN "$1" missing."
74 fi
75}
76
77function check_daq()
78{
79 diskusage=( `df -P /raid10 | grep raid10 ` )
80 # check if more than 700 GB are left on /loc_data
81 if [ ${diskusage[3]} -lt $disklimitdaq ]
82 then
83 echo "WARN less than 700 left on /raid10 on node "$HOSTNAME
84 printprocesslog "WARN less than 700 left on /raid10 on node "$HOSTNAME
85 df -h /raid10
86 finish
87 fi
88}
89
90check_daq
91
92printprocesslog "INFO get lists of raw files on newdaq and daq"
93files=( `find $rawpathnewdaq -type f -regex '.*[.]fits[.]?[g]?[f]?[z]?' 2>/dev/null | sort` )
94# to treat links use:
95#files=( `find -L $rawpathnewdaq -regex '.*[.]fits[.]?[g]?[f]?[z]?' 2>/dev/null | sort` )
96
97if [ ${#files[@]} -eq 0 ]
98then
99 printprocesslog "INFO no raw files available yet for "$datepath
100 finish
101fi
102fileslocal=( `find $rawpath -type f -regex '.*[.]fits[.]?[g]?[f]?[z]?' | sort` )
103callistofiles=( `find $anapath/callisto -type f -name $date*-calibration.log | sort` )
104# get number of dataruns from DB
105query="SELECT Count(*) FROM RunInfo WHERE fNight="$date" AND fRunTypeKey=1"
106numdataruns=`sendquery`
107
108# create raw directory on daq, if not yet there
109makedir $rawpath
110
111#echo "INFO #files-daq:"${#fileslocal[@]}" #files-newdaq:"${#files[@]}" #callisto-logs:"${#callistofiles[@]}" #data-runs:"$numdataruns
112printprocesslog "INFO #files-daq:"${#fileslocal[@]}" #files-newdaq:"${#files[@]}" #callisto-logs:"${#callistofiles[@]}" #data-runs:"$numdataruns
113
114while [ ${#fileslocal[@]} -ne ${#files[@]} ] || [ $numdataruns -ne ${#callistofiles[@]} ] # || [ $numdataruns -ne 0 ] # FIXME: Logik ueberdenken u ueberarb
115do
116 # only continue with script
117 # when there is more than 10% space on daq
118 source `dirname $0`/../Sourcefile.sh
119 check_daq
120
121 numdataruns=0
122 #echo "INFO #files-daq:"${#fileslocal[@]}" #files-newdaq:"${#files[@]}" #callisto-logs:"${#callistofiles[@]}" #data-runs:"$numdataruns
123 printprocesslog "INFO status beginning of while-loop #files-daq:"${#fileslocal[@]}" #files-newdaq:"${#files[@]}" #callisto-logs:"${#callistofiles[@]}" #data-runs:"$numdataruns
124
125 rsync_aux_file $drivefilenewdaq $drivefile
126
127 # files on newdaq
128 for file in ${files[@]}
129 do
130 printprocesslog "processing "$file
131 #echo "processing "$file
132 localfile=`echo $file | sed -e 's/newdaq/loc_data/'`
133
134 source `dirname $0`/../Sourcefile.sh
135 # check if file is already transferred
136 if ! ls $localfile >/dev/null 2>&1
137 then
138 # check if it is drs-file
139 # get stop time from raw-file
140 if [ "`echo $file | grep -o drs`" == "drs" ]
141 then
142 nondrs=`basename $file | sed -e 's/[.]drs//g'`
143 nondrsfile=`find $rawpath -name $nondrs.*z`
144 #echo "nondrs: "$nondrsfile
145 tstop=`$factpath/fitsdump -h $nondrsfile 2>/dev/null | grep TSTOPI | grep -E -o '[0-9]+'`
146 else
147 tstop=`$factpath/fitsdump -h $file 2>/dev/null | grep TSTOPI | grep -E -o '[0-9]+'`
148 fi
149 #echo "tstop -"$tstop"-"
150 # when stop time is 0, file is not closed
151 # when an error is returned the tstop is empty
152 if [ "$tstop" == "0" ] || [ "$tstop" == "" ]
153 then
154 printprocesslog "WARN "$file" not yet closed."
155 # if a file is not closed and not touched for 30 minutes,
156 # it is assumed corrupted and still transferred
157 fileaccessed=`find $file -amin -30`
158 if ! [ "$fileaccessed" == "" ]
159 then
160 printprocesslog "INFO "$file" was accessed in the last 30 minutes => continue"
161 continue
162 else
163 printprocesslog "WARN: "$file" has empty TSTOP but was not touched for 30 minutes"
164 fileerror="yes"
165 fi
166 fi
167
168 # rsync
169 # from newdaq (/newdaq = /fact on newdaq), rsync server newdaq::newdaq/
170 # to daq (/daq = /loc_data on daq)
171 # to access rsync server via the dedicated network between
172 # daq and newdaq, use 172.16.100.100::newdaq
173 filersyncserver=`echo $file | sed -e 's/^\//172.16.100.100::/'`
174 # old
175 ##if ! rsync -av --stats --progress --bwlimit=$bwlimit $file $localfile
176 #if ! rsync -a -T $rsynctempdir --bwlimit=$bwlimit $file $localfile
177 # new
178 if ! rsync -a -W -T $rsynctempdir --bwlimit=$bwlimit $filersyncserver $localfile
179 then
180 printprocesslog "ERROR something went wrong with rsync of "$file
181 rm $localfile
182 continue
183 fi
184 printprocesslog "INFO "$file" rsynced successfully."
185 fi
186
187 if [ "`echo $localfile | grep -o drs`" != "drs" ]
188 then
189 runtype=`$factpath/fitsdump -h $localfile 2>/dev/null | grep RUNTYPE | grep -E -o "['][a-z0-9._-]+[']" | sed -e "s/'//g" -e "s/_/-/g" -e "s/[.]//g"`
190 runnum=`echo $localfile | cut -d_ -f3 | cut -d. -f1`
191 roi=`$factpath/fitsdump -h $localfile 2>/dev/null | grep ROI | grep -v ROITM | grep -E -o "[0-9][0-9][0-9][0-9]?" | sed -e "s/'//g" -e "s/_/-/g" -e "s/[.]//g"`
192 numevts=`$factpath/fitsdump -h $file 2>/dev/null | grep Events | grep -E -o '[0-9]+'`
193 printprocesslog "DEBUG runnum "$runnum" runtype "$runtype" roi "$roi" numevts "$numevts
194 if [ "$runtype" == "drs-time-upshifted" ]
195 then
196 printprocesslog "INFO file "$file" has runtype drs-time-upshifted -> continue "
197 continue
198 fi
199 #echo $runtype" "$runnum
200 if [ "$runtype" == "data" ]
201 then
202 if [ "$fileerror" = "yes" ]
203 then
204 printprocesslog "INFO do not further process corrupted file "$localfile
205 fileerror=
206 continue
207 fi
208 seqfile=$seqpath/${date}_${runnum}.seq
209 printprocesslog "INFO write data-seq "$seqfile
210 echo "# written by automatic analysis in LP" >$seqfile
211 echo "" >> $seqfile
212 echo "Sequence: "`echo $date | cut -c3-8`$runnum >> $seqfile
213 echo "Night: "`echo $datepath | sed -e 's/\//-/g'` >> $seqfile
214 echo "" >> $seqfile
215 echo "DrsSequence: "$drsseq >> $seqfile
216 echo "" >> $seqfile
217# echo $runrow" CalRuns"
218# echo $runrow | grep -E -o '[0-9]{3}light-pulser-ext300' | sed -e 's/light-pulser-ext300//g'
219 echo "CalRuns: "`echo $runrow | grep -E -o '[0-9]{3}light-pulser-ext300' | sed -e 's/light-pulser-ext300//g'` >> $seqfile
220 echo "PedRuns: "`echo $runrow | grep -E -o '[0-9]{3}pedestal300' | sed -e 's/pedestal300//g'` >> $seqfile
221 echo "DatRuns: "$runnum >> $seqfile
222 echo "" >> $seqfile
223 echo "DrsFiles: "$drsfile >> $seqfile
224 echo "" >> $seqfile
225 echo "#DrsFile: "$drsfile >> $seqfile
226 echo "" >> $seqfile
227
228# tstopi=`$factpath/fitsdump -h $localfile 2>/dev/null | grep TSTOPI | grep -E -o '[0-9]+'`
229# tstopf=`$factpath/fitsdump -h $localfile 2>/dev/null | grep TSTOPF | grep -E -o '[.][0-9]+'`
230# tstop=${tstopi}${tstopf}
231# coordinates=( `${factpath}/fitsdump ${drivefile} -c Ra_src Dec_src -r --filter='Time<'${tstop} 2>/dev/null | tail -1 2>&1` )
232# if [ "${coordinates[0]}" == "" ] || [ "${coordinates[1]}" == "" ]
233# then
234# printprocesslog "WARN couldn't get coordinates ("${coordinates[@]}") from "$drivefile
235# #echo "WARN couldn't get coordinates ("${coordinates[@]}") from "$drivefile
236# continue
237# fi
238# if [ "${coordinates[0]}" == "0" ] || [ "${coordinates[1]}" == "0" ]
239# then
240# printprocesslog "WARN coordinates "${coordinates[@]}
241# #echo "WARN coordinates "${coordinates[@]}
242# continue
243# fi
244# printprocesslog "DEBUG coordinates "${coordinates[@]}
245# query="SELECT fSourceKEY FROM scheduling.source WHERE "
246# query=$query" fRightAscension BETWEEN "${coordinates[0]}"-0.01 AND "${coordinates[0]}"+0.01 "
247# query=$query" AND fDeclination BETWEEN "${coordinates[1]}"-0.01 AND "${coordinates[1]}"+0.01 "
248# sourcekey=`sendquery`
249# if [ "$sourcekey" == "" ]
250# then
251# printprocesslog "WARN sourcekey empty - coordinates"${coordinates[@]}
252# fi
253
254 printprocesslog "INFO counting callisto logs and data files +1."
255 # get number of callisto logs
256 runcallistocount=`ps aux | grep RunCallisto | grep -E -o '20[12][0-9][01][0-9][0-3][0-9]_[0-9][0-9][0-9]' | sort | uniq | wc -l`
257 # count data runs
258 numdataruns=`echo " $numdataruns + 1 " | bc -l`
259 #echo "numdata +1"
260
261 #echo "cal: "$runcallistocount" numdat: "$numdataruns" numcallog: "${#callistofiles[@]}
262 printprocesslog "INFO running callistos: "$runcallistocount" #data-runs: "$numdataruns" #callisto-logs: "${#callistofiles[@]}
263 # do not overload system in case of a lot of files to be processed
264 # numruncallistos is set in setup.fact.lp.data
265 if [ $runcallistocount -ge $numruncallistos ]
266 then
267 printprocesslog "INFO "$runcallistocount" RunCallisto.sh are running -> continue"
268 #echo "INFO "$runcallistocount" RunCallisto.sh are running -> continue"
269 continue
270 fi
271 callistolog=`dirname $seqfile | sed -e "s/sequences/callisto/"`"/"$date"_"$runnum"-calibration.log"
272 if ! [ -e $callistolog ]
273 then
274 rsync_aux_file $drivefilenewdaq2 $drivefile2
275 rsync_aux_file $mweatherfilenewdaq $mweatherfile
276 rsync_aux_file $ratesfilenewdaq $ratesfile
277 rsync_aux_file $tempfilenewdaq $tempfile
278 rsync_aux_file $humfilenewdaq $humfile
279 #printprocesslog "INFO starting RunCallisto.sh for "$sourcekey" "$seqfile
280 #echo "INFO starting RunCallisto.sh for "$sourcekey" "$seqfile
281 #`dirname $0`/RunCallisto.sh $sourcekey $seqfile &
282 printprocesslog "INFO starting RunCallisto.sh for "$seqfile
283 #echo "INFO starting RunCallisto.sh for "$seqfile
284 `dirname $0`/RunCallisto.sh $seqfile &
285 fi
286 continue
287 else
288 # skip a non-data run when it has not 1000 evts
289 # as this means probably an fad-loss
290 if [ $numevts -ne 1000 ]
291 then
292 printprocesslog "INFO file "$file" is a non-data file ("$runtype") and has not 1000 events ("$numevts")"
293 continue
294 fi
295 fi
296 printprocesslog "DEBUG runrow "$runrow" (from variable) "
297 runrow=`cat $infopath/runrow.txt`
298 printprocesslog "DEBUG runrow "$runrow" (from file) "
299 runrow=$runrow$runnum$runtype$roi"_"
300 echo $runrow > $infopath/runrow.txt
301 if echo $runrow | grep -E '[0-9]{3}drs-pedestal1024_[0-9]{3}drs-gain1024_[0-9]{3}drs-pedestal1024_[0-9]{3}drs-pedestal1024_[0-9]{3}drs-time1024_[0-9]{3}pedestal300_[0-9]{3}pedestal300_' >/dev/null
302 then
303 runrow2=`echo $runrow | grep -E -o '[0-9]{3}drs-pedestal1024_[0-9]{3}drs-gain1024_[0-9]{3}drs-pedestal1024_[0-9]{3}drs-pedestal1024_[0-9]{3}drs-time1024_[0-9]{3}pedestal300_[0-9]{3}pedestal300_'`
304 run1=`echo $runrow2 | cut -d_ -f1 | sed -e 's/drs-pedestal1024//g'`
305 run2=`echo $runrow2 | cut -d_ -f2 | sed -e 's/drs-gain1024//g'`
306 run3=`echo $runrow2 | cut -d_ -f3 | sed -e 's/drs-pedestal1024//g'`
307 run4=`echo $runrow2 | cut -d_ -f4 | sed -e 's/drs-pedestal1024//g'`
308 run5=`echo $runrow2 | cut -d_ -f5 | sed -e 's/drs-time1024//g'`
309 run6=`echo $runrow2 | cut -d_ -f6 | sed -e 's/pedestal300//g'`
310 run7=`echo $runrow2 | cut -d_ -f7 | sed -e 's/pedestal300//g'`
311 seqfile=$seqpath/${date}_${run1}.drs.seq
312 printprocesslog "INFO write drs-seq "$seqfile
313 echo "# written by automatic analysis in LP" > $seqfile
314 echo "" >> $seqfile
315 echo "Sequence: "`echo $date | cut -c3-8`$run1 >> $seqfile
316 echo "Night: "`echo $datepath | sed -e 's/\//-/g'` >> $seqfile
317 echo "" >> $seqfile
318 echo "CalRuns: "$run2 >> $seqfile
319 echo "PedRuns: "$run6" "$run7 >> $seqfile
320 echo "DatRuns: "$run5 >> $seqfile
321 echo "DrsRuns: "$run1" "$run3" "$run4 >> $seqfile
322 echo "DrsFiles: "$run3" "$run6 >> $seqfile
323 echo "" >> $seqfile
324 echo "#DrsFile: "$run6 >> $seqfile
325 echo "" >> $seqfile
326 echo "" > $infopath/runrow.txt
327 drsseq=$run1
328 drsfile=$run6
329 fi
330 if echo $runrow | grep -E '[0-9]{3}pedestal300_[0-9]{3}light-pulser-ext300_' >/dev/null
331 then
332 echo "" > $infopath/runrow.txt
333 fi
334 fi
335 done
336 printprocesslog "INFO status after loop: "$runcallistocount" callistos running, "$numdataruns" data runs to process in total, "${#callistofiles[@]}" have already a callisto-logfile "
337
338 # get new file lists
339 printprocesslog "INFO get new file lists for "$datepath
340 files=( `find $rawpathnewdaq -type f -regex '.*[.]fits[.]?[g]?[f]?[z]?' | sort` )
341 fileslocal=( `find $rawpath -type f -regex '.*[.]fits[.]?[g]?[f]?[z]?' | sort` )
342 callistofiles=( `find $anapath/callisto -type f -name $date*-calibration.log | sort` )
343 #echo "INFO #files-daq:"${#fileslocal[@]}" #files-newdaq:"${#files[@]}" #callisto-logs:"${#callistofiles[@]}" #data-runs:"$numdataruns
344 printprocesslog "INFO status after for-loop #files-daq:"${#fileslocal[@]}" #files-newdaq:"${#files[@]}" #callisto-logs:"${#callistofiles[@]}" #data-runs:"$numdataruns
345
346 # wait and get new file lists
347 update=
348 if [ ${#fileslocal[@]} -eq ${#files[@]} ]
349 then
350 printprocesslog "INFO wait 60 seconds."
351 sleep 60
352 #echo "sleep 60..."
353 printprocesslog "INFO get new file lists for "$datepath
354 files=( `find $rawpathnewdaq -type f -regex '.*[.]fits[.]?[g]?[f]?[z]?' | sort` )
355 fileslocal=( `find $rawpath -type f -regex '.*[.]fits[.]?[g]?[f]?[z]?' | sort` )
356 callistofiles=( `find $anapath/callisto -type f -name $date*-calibration.log | sort` )
357 fi
358 #echo "INFO #files-daq:"${#fileslocal[@]}" #files-newdaq:"${#files[@]}" #callisto-logs:"${#callistofiles[@]}" #data-runs:"$numdataruns
359 printprocesslog "INFO status after wait end of while-loop #files-daq:"${#fileslocal[@]}" #files-newdaq:"${#files[@]}" #callisto-logs:"${#callistofiles[@]}" #data-runs:"$numdataruns
360
361 # this should not happen, but may in rare cases if data are deleted in the wrong order
362 if [ ${#files[@]} -lt ${#fileslocal[@]} ]
363 then
364 printprocesslog "ERROR numfiles on newdaq("${#files[@]}") < #files on daq ("${#fileslocal[@]}") - maybe deleting data in the wrong order?"
365 echo "ERROR numfiles on newdaq("${#files[@]}") < #files on daq ("${#fileslocal[@]}") - maybe deleting data in the wrong order?"
366 finish
367 fi
368done
369
370
371
372
Note: See TracBrowser for help on using the repository browser.