| 1 | #!/usr/bin/python
|
|---|
| 2 | #
|
|---|
| 3 | # Remo Dietlicher
|
|---|
| 4 | # ETH Zurich
|
|---|
| 5 | # Semesterarbeit
|
|---|
| 6 | #
|
|---|
| 7 | import pyfact
|
|---|
| 8 | from myhisto import *
|
|---|
| 9 | from hist import *
|
|---|
| 10 | import numpy as np
|
|---|
| 11 | import numpy.random as rnd
|
|---|
| 12 | from scipy import interpolate as ip
|
|---|
| 13 | from ROOT import *
|
|---|
| 14 | from time import time
|
|---|
| 15 | from optparse import OptionParser
|
|---|
| 16 |
|
|---|
| 17 | def ftcal(NChip, NEventsp, h,
|
|---|
| 18 | dfname = '/data00/fact-construction/raw/2011/11/24/20111124_014.fits.gz',
|
|---|
| 19 | calfname = '/data00/fact-construction/raw/2011/11/24/20111124_012.drs.fits.gz'):
|
|---|
| 20 |
|
|---|
| 21 | rd = pyfact.rawdata( dfname, calfname )
|
|---|
| 22 |
|
|---|
| 23 | fsampling = 1024./512. # sampling frequency
|
|---|
| 24 | freq = 250. # testfrequency
|
|---|
| 25 | P_nom = 1000./freq # nominal Period due to testfrequency
|
|---|
| 26 | DAMPING = 0.02 # Damping applied to correction
|
|---|
| 27 |
|
|---|
| 28 |
|
|---|
| 29 | # Functions needed for calibration
|
|---|
| 30 | # find negative-going crossings of mean value
|
|---|
| 31 | def Crossing(Data, Mean, t_nom, Start, Chip):
|
|---|
| 32 | TimeXing = np.zeros(rd.NROI)
|
|---|
| 33 | MeanXing = np.zeros(rd.NROI)
|
|---|
| 34 | NumXing = 0
|
|---|
| 35 | CellTime = CellTimef(np.roll(t_nom, -Start))
|
|---|
| 36 |
|
|---|
| 37 | for i in range(rd.NROI-1):
|
|---|
| 38 | if ((Data[i] > Mean) & (Data[i+1] < Mean)):
|
|---|
| 39 | MeanXing[NumXing] = i
|
|---|
| 40 |
|
|---|
| 41 | FirstCell = CellTime[i]
|
|---|
| 42 | SecondCell = CellTime[i+1]
|
|---|
| 43 |
|
|---|
| 44 | TimeXing[NumXing] = FirstCell+(SecondCell-FirstCell)/(1.-Data[i+1]/(Data[i]))*(1.-Mean/(Data[i]))
|
|---|
| 45 | NumXing += 1
|
|---|
| 46 |
|
|---|
| 47 | # calculate the frequency of the testwave
|
|---|
| 48 | freqp = fsampling*NumXing*1000./1024
|
|---|
| 49 | if(np.abs(freqp-freq) > 20):
|
|---|
| 50 | print "This is not a timecalibration run!!"
|
|---|
| 51 | raise SystemExit
|
|---|
| 52 |
|
|---|
| 53 | return MeanXing, TimeXing, NumXing
|
|---|
| 54 |
|
|---|
| 55 | # Determine time between crossings and apply correction
|
|---|
| 56 | def Corr(MeanXing, NumXing, TimeXing, t_nom, Start, Chip, Event):
|
|---|
| 57 |
|
|---|
| 58 | Ctot = np.zeros(NumXing)
|
|---|
| 59 |
|
|---|
| 60 | # loop over mean crossings
|
|---|
| 61 | for i in range(int(NumXing-1)):
|
|---|
| 62 | I1 = MeanXing[i]
|
|---|
| 63 | I2 = MeanXing[i+1]
|
|---|
| 64 | Period = TimeXing[i+1] - TimeXing[i]
|
|---|
| 65 |
|
|---|
| 66 |
|
|---|
| 67 | if(np.abs(1-Period/P_nom) > 0.2):
|
|---|
| 68 | continue
|
|---|
| 69 |
|
|---|
| 70 |
|
|---|
| 71 | if(Event == NEvents-1):
|
|---|
| 72 | h.list[Chip].dict["periods"].Fill(Period)
|
|---|
| 73 | if(Event == 0):
|
|---|
| 74 | h.list[Chip].dict["periods0"].Fill(Period)
|
|---|
| 75 |
|
|---|
| 76 |
|
|---|
| 77 |
|
|---|
| 78 | # calculate the frequency of the testwave
|
|---|
| 79 | freqp = 1000./Period
|
|---|
| 80 |
|
|---|
| 81 | C = (P_nom-Period)*DAMPING
|
|---|
| 82 | Ctot[i] = P_nom-Period
|
|---|
| 83 |
|
|---|
| 84 |
|
|---|
| 85 | numnom = Period*fsampling
|
|---|
| 86 | Correction = np.zeros(rd.NROI)
|
|---|
| 87 | Correction[I1+1:I2+1] += C/numnom
|
|---|
| 88 | Correction[:I1+1] -= (I2-I1)*C/(numnom*(rd.NROI-(I2-I1)))
|
|---|
| 89 | Correction[I2+1:] -= (I2-I1)*C/(numnom*(rd.NROI-(I2-I1)))
|
|---|
| 90 |
|
|---|
| 91 | Correction = np.roll(Correction, Start)
|
|---|
| 92 | t_nom += Correction
|
|---|
| 93 |
|
|---|
| 94 |
|
|---|
| 95 | if(Event > 200):
|
|---|
| 96 | h.list[Chip].dict["perioddevproj"].Fill(np.average(Ctot))
|
|---|
| 97 | h.list[Chip].dict["perioddev"].SetBinContent(Event+1, np.average(np.abs(Ctot)))
|
|---|
| 98 |
|
|---|
| 99 | return t_nom
|
|---|
| 100 |
|
|---|
| 101 |
|
|---|
| 102 | # Summing up the nominal times for each cell to the total cell time.
|
|---|
| 103 | def CellTimef(t_nom):
|
|---|
| 104 | CellTime = np.zeros(rd.NROI+1)
|
|---|
| 105 | for i in range(rd.NROI):
|
|---|
| 106 | CellTime[i+1] = CellTime[i] + t_nom[i]
|
|---|
| 107 |
|
|---|
| 108 | return CellTime
|
|---|
| 109 |
|
|---|
| 110 | # getting t_nom from CellTime
|
|---|
| 111 | def t_nomf(CellTime):
|
|---|
| 112 | t_nom = np.zeros(rd.NROI)
|
|---|
| 113 | for i in range(rd.NROI):
|
|---|
| 114 | t_nom[i] = CellTime[i+1]-CellTime[i]
|
|---|
| 115 |
|
|---|
| 116 | return t_nom
|
|---|
| 117 |
|
|---|
| 118 |
|
|---|
| 119 | rd.next()
|
|---|
| 120 | NPIX = NChip*9
|
|---|
| 121 | NEvents = NEventsp
|
|---|
| 122 |
|
|---|
| 123 | # create array to put the calibrated times for each cell in
|
|---|
| 124 | t_nom = np.ones([NPIX, rd.NROI])/fsampling
|
|---|
| 125 | DataTot = np.zeros([NEvents, NChip, rd.NROI])
|
|---|
| 126 |
|
|---|
| 127 | # loop over events
|
|---|
| 128 | for Event in range( NEvents ):
|
|---|
| 129 | print "Event ", Event
|
|---|
| 130 | Chip = 0
|
|---|
| 131 |
|
|---|
| 132 | # loop over every 9th channel in Chip
|
|---|
| 133 | for Pix in range(NPIX)[8::9]:
|
|---|
| 134 | print "Pix ", Pix
|
|---|
| 135 |
|
|---|
| 136 | # calculate t_nom for each pixel
|
|---|
| 137 | MeanXing, TimeXing, NumXing = Crossing(rd.acalData[Pix], np.average(rd.acalData[Pix]), t_nom[Pix], rd.startCells[Pix], Chip)
|
|---|
| 138 | t_nom[Pix] = Corr(MeanXing, NumXing, TimeXing, t_nom[Pix], rd.startCells[Pix], Chip, Event)
|
|---|
| 139 |
|
|---|
| 140 | DataTot[Event][Chip] = np.roll(rd.acalData[Pix], rd.startCells[Pix])
|
|---|
| 141 |
|
|---|
| 142 | Chip += 1
|
|---|
| 143 |
|
|---|
| 144 | rd.next()
|
|---|
| 145 |
|
|---|
| 146 | CellTime = np.zeros([NPIX, rd.NROI+1])
|
|---|
| 147 |
|
|---|
| 148 | DataMean = np.average(DataTot, 0)
|
|---|
| 149 |
|
|---|
| 150 | for Pix in range(NPIX):
|
|---|
| 151 | CellTime[Pix] = CellTimef(t_nom[Pix])
|
|---|
| 152 |
|
|---|
| 153 | t_nom = t_nom[8::9]
|
|---|
| 154 | CellTime = CellTime[8::9]
|
|---|
| 155 |
|
|---|
| 156 |
|
|---|
| 157 | return CellTime, DataMean
|
|---|
| 158 |
|
|---|