#!/usr/bin/python # ''' function callisto produce and save calibrated FACT data ''' from ROOT import * # get the MARS library loaded gSystem.Load( '/data02/scratch/Mars_20111207_2145_from_data/libmars.so' ) from ROOT import * def callisto( drsfile, datafile, mapfile, plotfile = '~/res/t-callisto.root'): """ write calibrated data files """ if mapfile == '': map = NULL else: usemap = True map = mapfile # signal extraction parameter # Extraction range in slices. It will always(!) contain the full range of integration first_slice, last_slice = 30, 250 # 15ns # Integral range left and right of the maximum in slices rise_time, fall_time = 13, 23 type = MExtralgoSpline.kIntegralRel # Data files to be processed read5 = MRawFitsRead() read5.LoadMap( map ) read5.AddFile( datafile ) # create a display instance d = MStatusDisplay() loop = MEvtLoop() # create an eventloop instance loop.SetDisplay( d ) # bad_pixel_list = [ 424, 583, 830, 923, 1208, 1388 ] badpixels = MBadPixelsCam() badpixels.InitSize(1440) for pixel in bad_pixel_list: badpixels[ pixel ].SetUnsuitable(MBadPixelsPix.kUnsuitable) drscalib = MDrsCalibration() if drscalib.ReadFits( drsfile ) != True : print 'problems reading drsfile: ', drsfile exit( -1 ) timecam = MCalibrationRelTimeCam() tlist = MTaskList() plist2 = MParList() plist2.AddToList( tlist ); plist2.AddToList( drscalib ); plist2.AddToList( badpixels ); plist2.AddToList( timecam ); apply = MGeomApply() drsapply = MDrsCalibApply() cont = MContinue( 'MRawEvtHeader.GetTriggerID != 4' ) extractor = MExtractTimeAndChargeSpline() extractor.SetRange( first_slice, last_slice ) extractor.SetRiseTimeHiGain( rise_time ) extractor.SetFallTimeHiGain( fall_time ) extractor.SetChargeType( type ) extractor.SetSaturationLimit(600000) extractor.SetNoiseCalculation( kFALSE ) evtA1 = MHCamEvent(0, "Extra'd", "Extracted Calibration Signal;;S [cnts/sl]") evtA2 = MHCamEvent(4, "ArrTm", "Extracted ArrivalTime;;T") fillA1 = MFillH(evtA1, "MExtractedSignalCam", "FillExtractedSignal") fillA2 = MFillH(evtA2, "MArrivalTimeCam", "FillArrivalTime") # Use this for data, but not for calibration events evtA1.SetErrorSpread( kFALSE ) conv = MCalibrateData() conv.SetCalibrationMode( MCalibrateData.kNone ) conv.SetPedestalFlag( MCalibrateData.kNo ) calctm = MCalibrateRelTimes() treat = MBadPixelsTreat() treat.SetProcessPedestalRun( kFALSE ) treat.SetProcessPedestalEvt( kFALSE ) evtB1 = MHCamEvent(0, "Interp'd","Interpolated Signal scaled with A/A_{0};;S [phe]") evtB1.SetErrorSpread( kFALSE ) fillB1 = MFillH(evtB1, "MSignalCam", "FillInterpolated") # fname = TString( Form('s/([0-9]+_[0-9]+)[.]fits([.]gz)?$/%s\\/$1_C.root/', outpath ) ) # fname = TString() fname = "s/([0-9]+_[0-9]+)[.]fits([.]gz)?$/.\\/$1_C.root/" # print 'fname: ', fname # The second rule is for the case reading raw-files! write = MWriteRootFile(2, fname, "NEW", "Calibrated Data") write.AddContainer("MRawRunHeader", "RunHeaders") write.AddContainer("MGeomCam", "RunHeaders") write.AddContainer("MSignalCam", "Events") write.AddContainer("MTime", "Events") write.AddContainer("MRawEvtHeader", "Events") # write.AddContainer("MTriggerPattern", "Events") # ------------------ Setup histograms and fill tasks ---------------- tlist.AddToList( read5 ) tlist.AddToList( cont ) tlist.AddToList( apply ) tlist.AddToList( drsapply ) tlist.AddToList( extractor ) tlist.AddToList( fillA1 ) tlist.AddToList( fillA2 ) tlist.AddToList( conv ) tlist.AddToList( calctm ) tlist.AddToList( treat ) tlist.AddToList( fillB1 ) tlist.AddToList( write ) loop.SetParList( plist2 ) # if ( loop.Eventloop() ): exit( -1 ) # if ( loop.GetDisplay() ): exit( -1 ) print 'loop.Eventloop(): ', loop.Eventloop() print 'loop.GetDisplay(): ', loop.GetDisplay() title = '-- Calibrate Signal: ' + drsfile + ' --' d.SetTitle( title, kFALSE); # TString path; # path += Form("%s%s-callisto.root", outpath, TString(TString(strrchr(drsfile, '/'))(0, 13)).Data()); d.SaveAs( plotfile )