| 1 | # simulation of the real data for timecalibration
|
|---|
| 2 | #
|
|---|
| 3 | # Remo Dietlicher
|
|---|
| 4 | # ETH Zürich / Semesterarbeit
|
|---|
| 5 | #
|
|---|
| 6 | #
|
|---|
| 7 |
|
|---|
| 8 | import pyfact
|
|---|
| 9 | from myhisto import *
|
|---|
| 10 | from hist import *
|
|---|
| 11 | import numpy as np
|
|---|
| 12 | import numpy.random as rnd
|
|---|
| 13 | from ROOT import *
|
|---|
| 14 | from time import time
|
|---|
| 15 | from optparse import OptionParser
|
|---|
| 16 |
|
|---|
| 17 | NROI = 1024 # length of the DRS pipeline
|
|---|
| 18 | NEvents = 200 # Number of evaluated Event
|
|---|
| 19 | fsampling = 1024./512.1 # sampling frequency
|
|---|
| 20 | freq = 250. # testfrequency
|
|---|
| 21 | P_nom = 1000./freq # nominal Period due to testfrequency
|
|---|
| 22 | DAMPING = 0.02 # Damping applied to correction
|
|---|
| 23 | NChip = 1 # Number of Chips
|
|---|
| 24 |
|
|---|
| 25 | t_s = time()
|
|---|
| 26 |
|
|---|
| 27 | parser = OptionParser()
|
|---|
| 28 | parser.add_option('-e', '--extended', action = 'store_true', dest='extend', default = False )
|
|---|
| 29 | (options, args) = parser.parse_args()
|
|---|
| 30 |
|
|---|
| 31 | variante = "dat"
|
|---|
| 32 | alg = "Remo"
|
|---|
| 33 | save = "no"
|
|---|
| 34 |
|
|---|
| 35 | if(options.extend):
|
|---|
| 36 |
|
|---|
| 37 | variante = raw_input("Welche Daten? (sim/dat): ")
|
|---|
| 38 | alg = raw_input("Welcher Algorithmus? (Remo/Oliver): ")
|
|---|
| 39 | NChip = int(raw_input("Wieviele Chips? ([1, ... ,160]): "))
|
|---|
| 40 | NEvents = int(raw_input("Wieviele Events? ([1, ... , 1000]) "))
|
|---|
| 41 | save = raw_input("Soll CellTime gespeichert werden? (yes/no) ")
|
|---|
| 42 | tag = raw_input("Soll ein spezieller tag an das File angehängt werden? ")
|
|---|
| 43 |
|
|---|
| 44 | NPix = 9*NChip
|
|---|
| 45 |
|
|---|
| 46 | h = hist_list(tcalsimHistograms, NChip, "Chip")
|
|---|
| 47 | MeanXingHist = np.zeros(NROI)
|
|---|
| 48 |
|
|---|
| 49 | def Datainit(variante, NEvents):
|
|---|
| 50 |
|
|---|
| 51 | if(variante == "sim"):
|
|---|
| 52 | y_off = 3.4
|
|---|
| 53 |
|
|---|
| 54 | # Start is the first bin being written on.
|
|---|
| 55 | Startp = rnd.random(NEvents)*(NROI - 2) # project [0, 1] onto int([0, lpipe-1])
|
|---|
| 56 | Start = range(NEvents)
|
|---|
| 57 | for i, val in enumerate(Startp):
|
|---|
| 58 | Start[i] = int(round(val)) # getting integer values needed in roll later
|
|---|
| 59 |
|
|---|
| 60 | ID = np.zeros(NROI)
|
|---|
| 61 | x = np.linspace(0., float(NROI), NROI+1)
|
|---|
| 62 | ID = np.sin(x*2*np.pi/NROI+np.pi)*5
|
|---|
| 63 |
|
|---|
| 64 | dt_true = np.zeros(NROI)
|
|---|
| 65 | for i in range(NROI):
|
|---|
| 66 | dt_true[i] = ID[i+1]-ID[i]
|
|---|
| 67 |
|
|---|
| 68 | versch = np.sum(dt_true)/1024
|
|---|
| 69 | dt_true = dt_true - versch
|
|---|
| 70 | print np.sum(dt_true)
|
|---|
| 71 |
|
|---|
| 72 | #create time-array, time in nanoseconds
|
|---|
| 73 | t_nom = np.ones(NROI)/fsampling
|
|---|
| 74 | t_true = t_nom + dt_true
|
|---|
| 75 |
|
|---|
| 76 | # simulation of the real pipeline
|
|---|
| 77 | rCellTime = np.zeros([NEvents, NROI])
|
|---|
| 78 | for Event in range(NEvents):
|
|---|
| 79 | for i in range(NROI-1):
|
|---|
| 80 | rCellTime[Event][i+1] = rCellTime[Event][i]+t_true[i]
|
|---|
| 81 | rCellTime[Event] = np.roll(rCellTime[Event],-Start[Event])
|
|---|
| 82 | rCellTime[-Start[Event]:] += NROI/fsampling
|
|---|
| 83 |
|
|---|
| 84 | print "t_true tot = ", np.sum(t_true)
|
|---|
| 85 |
|
|---|
| 86 | # calculation of the nominal pipeline
|
|---|
| 87 | def CellTimef(t_nom):
|
|---|
| 88 | CellTime = np.zeros(NROI+1)
|
|---|
| 89 | for i in range(NROI):
|
|---|
| 90 | CellTime[i+1] = CellTime[i] + t_nom[i]
|
|---|
| 91 |
|
|---|
| 92 | return CellTime
|
|---|
| 93 |
|
|---|
| 94 | CellTime = CellTimef(t_nom)
|
|---|
| 95 |
|
|---|
| 96 | # Simulate Data
|
|---|
| 97 | Data = np.zeros([NEvents, NROI])
|
|---|
| 98 | for Event in range(NEvents):
|
|---|
| 99 | Data[Event] = np.sin(rCellTime[Event]*2.*np.pi/P_nom)+y_off
|
|---|
| 100 |
|
|---|
| 101 | if(variante == "dat"):
|
|---|
| 102 | t_true = 0
|
|---|
| 103 | Data = np.load("d1000.npy")
|
|---|
| 104 | Start = np.load("start_cells_1.npy")
|
|---|
| 105 |
|
|---|
| 106 |
|
|---|
| 107 | return Data, t_true, Start
|
|---|
| 108 |
|
|---|
| 109 | Data, t_true, Start = Datainit(variante, NEvents)
|
|---|
| 110 |
|
|---|
| 111 |
|
|---|
| 112 | # Functions needed for calibration
|
|---|
| 113 | # calculation of the nominal pipeline
|
|---|
| 114 | def CellTimef(t_nom):
|
|---|
| 115 | CellTime = np.zeros(NROI+1)
|
|---|
| 116 | for i in range(NROI):
|
|---|
| 117 | CellTime[i+1] = CellTime[i] + t_nom[i]
|
|---|
| 118 |
|
|---|
| 119 | return CellTime
|
|---|
| 120 |
|
|---|
| 121 | # getting t_nom from CellTime
|
|---|
| 122 | def t_nomf(CellTime):
|
|---|
| 123 | t_nom = np.zeros(NROI)
|
|---|
| 124 | for i in range(NROI):
|
|---|
| 125 | t_nom[i] = CellTime[i+1]-CellTime[i]
|
|---|
| 126 |
|
|---|
| 127 | return t_nom
|
|---|
| 128 |
|
|---|
| 129 |
|
|---|
| 130 |
|
|---|
| 131 | # find negative-going crossings of mean value
|
|---|
| 132 | def Crossing(Data, Mean, t_nom, Start, Chip):
|
|---|
| 133 | TimeXing = np.zeros(NROI)
|
|---|
| 134 | MeanXing = np.zeros(NROI)
|
|---|
| 135 | NumXing = 0
|
|---|
| 136 | CellTime = CellTimef(np.roll(t_nom, -Start))
|
|---|
| 137 |
|
|---|
| 138 | for i in range(NROI-1):
|
|---|
| 139 | if ((Data[i] > Mean) & (Data[i+1] < Mean)):
|
|---|
| 140 | MeanXing[NumXing] = i
|
|---|
| 141 | h.list[Chip].dict["lomeanxing"].Fill(np.mod(i+Start, NROI))
|
|---|
| 142 |
|
|---|
| 143 | FirstCell = CellTime[i]
|
|---|
| 144 | SecondCell = CellTime[i+1]
|
|---|
| 145 |
|
|---|
| 146 | TimeXing[NumXing] = FirstCell+(SecondCell-FirstCell)/(1.-Data[i+1]/(Data[i]))*(1.-Mean/(Data[i]))
|
|---|
| 147 | NumXing += 1
|
|---|
| 148 |
|
|---|
| 149 | # calculate the frequency of the testwave
|
|---|
| 150 | freqp = fsampling*NumXing*1000./1024
|
|---|
| 151 | h.list[Chip].dict["meanfreq"].Fill(freqp)
|
|---|
| 152 | if(np.abs(freqp-freq) > 20):
|
|---|
| 153 | print "This is not a timing calibration run!!"
|
|---|
| 154 | raise SystemExit
|
|---|
| 155 |
|
|---|
| 156 | return MeanXing, TimeXing, NumXing
|
|---|
| 157 |
|
|---|
| 158 |
|
|---|
| 159 |
|
|---|
| 160 | # find positive-going crossings of mean value
|
|---|
| 161 | def CrossingPos(Data, Mean, t_nom, Start, Chip):
|
|---|
| 162 | TimeXing = np.zeros(NROI)
|
|---|
| 163 | MeanXing = np.zeros(NROI)
|
|---|
| 164 | NumXing = 0
|
|---|
| 165 | CellTime = CellTimef(np.roll(t_nom, -Start))
|
|---|
| 166 |
|
|---|
| 167 | for i in range(NROI-1):
|
|---|
| 168 | if ((Data[i] < Mean) & (Data[i+1] > Mean)):
|
|---|
| 169 | MeanXing[NumXing] = i
|
|---|
| 170 | h.list[Chip].dict["lomeanxing"].Fill(np.mod(i+Start, NROI))
|
|---|
| 171 |
|
|---|
| 172 | FirstCell = CellTime[i]
|
|---|
| 173 | SecondCell = CellTime[i+1]
|
|---|
| 174 |
|
|---|
| 175 | TimeXing[NumXing] = FirstCell+(SecondCell-FirstCell)/(1.-Data[i+1]/(Data[i]))*(1.-Mean/(Data[i]))
|
|---|
| 176 | NumXing += 1
|
|---|
| 177 |
|
|---|
| 178 | # calculate the frequency of the testwave
|
|---|
| 179 | freqp = fsampling*NumXing*1000./1024
|
|---|
| 180 | h.list[Chip].dict["meanfreq"].Fill(freqp)
|
|---|
| 181 | if(np.abs(freqp-freq) > 20):
|
|---|
| 182 | print "This is not a timing calibration run!!"
|
|---|
| 183 | raise SystemExit
|
|---|
| 184 |
|
|---|
| 185 | return MeanXing, TimeXing, NumXing
|
|---|
| 186 |
|
|---|
| 187 |
|
|---|
| 188 |
|
|---|
| 189 | def CrossingOliver(Data, Mean, t_nom, Start, Chip):
|
|---|
| 190 |
|
|---|
| 191 | TimeXing = np.zeros(NROI)
|
|---|
| 192 | MeanXing = np.zeros(NROI)
|
|---|
| 193 | NumXing = 0
|
|---|
| 194 | CellTime = CellTimef(t_nom)
|
|---|
| 195 |
|
|---|
| 196 |
|
|---|
| 197 | for i in range(NROI-1):
|
|---|
| 198 | if ((Data[i] > Mean) & (Data[i+1] < Mean)):
|
|---|
| 199 | MeanXing[NumXing] = np.mod(i+Start, NROI)
|
|---|
| 200 |
|
|---|
| 201 | FirstCell = CellTime[np.mod(i+Start,NROI)]
|
|---|
| 202 | SecondCell = CellTime[np.mod(i+1+Start, NROI)]
|
|---|
| 203 |
|
|---|
| 204 | if(SecondCell < FirstCell): SecondCell =+ NROI/fsampl
|
|---|
| 205 |
|
|---|
| 206 | TimeXing[NumXing] = FirstCell+(SecondCell-FirstCell)/(1.-Data[i+1]/(Data[i]))*(1.-Mean/(Data[i]))
|
|---|
| 207 | NumXing += 1
|
|---|
| 208 |
|
|---|
| 209 | # calculate the frequency of the testwave
|
|---|
| 210 | freqp = fsampling*NumXing*1000./1024
|
|---|
| 211 | h.list[Chip].dict["meanfreq"].Fill(freqp)
|
|---|
| 212 | if(np.abs(freqp-freq) > 20):
|
|---|
| 213 | print "This is not a timing calibration run!!"
|
|---|
| 214 | raise SystemExit
|
|---|
| 215 |
|
|---|
| 216 | return MeanXing, TimeXing, NumXing
|
|---|
| 217 |
|
|---|
| 218 | # Determine time between crossings and apply correction
|
|---|
| 219 | def Corr(MeanXing, NumXing, TimeXing, t_nom, Start, Chip, Event):
|
|---|
| 220 |
|
|---|
| 221 | Ctot = np.zeros(NumXing)
|
|---|
| 222 |
|
|---|
| 223 | # loop over mean crossings
|
|---|
| 224 | for i in range(int(NumXing-1)):
|
|---|
| 225 | I1 = MeanXing[i]
|
|---|
| 226 | I2 = MeanXing[i+1]
|
|---|
| 227 | Period = TimeXing[i+1] - TimeXing[i]
|
|---|
| 228 | if(Event > 300):
|
|---|
| 229 | h.list[Chip].dict["period"].Fill(Period)
|
|---|
| 230 |
|
|---|
| 231 |
|
|---|
| 232 | if(np.abs(1-Period/P_nom) > 0.2):
|
|---|
| 233 | #print "Skipping zero crossing due to too large deviation of period."
|
|---|
| 234 | h.list[Chip].dict["loleftout"].Fill(MeanXing[i])
|
|---|
| 235 | h.list[Chip].dict["leftout"].Fill(np.mod(MeanXing[i]+Start, NROI))
|
|---|
| 236 | continue
|
|---|
| 237 |
|
|---|
| 238 | h.list[Chip].dict["lomeanxing"].Fill(MeanXing[i])
|
|---|
| 239 | h.list[Chip].dict["meanxing"].Fill(np.mod(MeanXing[i]+Start, NROI))
|
|---|
| 240 | MeanXingHist[np.mod(MeanXing[i]+Start, NROI)] += 1
|
|---|
| 241 |
|
|---|
| 242 | # calculate the frequency of the testwave
|
|---|
| 243 | freqp = 1000./Period
|
|---|
| 244 | h.list[Chip].dict["freq"].Fill(freqp)
|
|---|
| 245 |
|
|---|
| 246 | C = (P_nom-Period)*DAMPING
|
|---|
| 247 | Ctot[i] = P_nom-Period
|
|---|
| 248 |
|
|---|
| 249 | numnom = Period*fsampling
|
|---|
| 250 | Correction = np.zeros(NROI)
|
|---|
| 251 | Correction[I1+1:I2+1] += C/numnom
|
|---|
| 252 | Correction[:I1+1] -= (I2-I1)*C/(numnom*(NROI-(I2-I1)))
|
|---|
| 253 | Correction[I2+1:] -= (I2-I1)*C/(numnom*(NROI-(I2-I1)))
|
|---|
| 254 | """
|
|---|
| 255 | Correction = np.zeros(NROI)
|
|---|
| 256 | Correction[I1+1:I2+1] += C/(I2-I1)
|
|---|
| 257 | Correction[:I1+1] -= C/(NROI-(I2-I1))
|
|---|
| 258 | Correction[I2+1:] -= C/(NROI-(I2-I1))
|
|---|
| 259 |
|
|---|
| 260 | numnom = Period*fsampling
|
|---|
| 261 | Correction = np.zeros(NROI)
|
|---|
| 262 | Correction[I1+1:I2+1] += C/numnom
|
|---|
| 263 | """
|
|---|
| 264 |
|
|---|
| 265 | Correction = np.roll(Correction, Start)
|
|---|
| 266 | t_nom += Correction
|
|---|
| 267 | #t_nom = t_nom/np.sum(t_nom)*1024/fsampling
|
|---|
| 268 |
|
|---|
| 269 | if(Event > 200):
|
|---|
| 270 | h.list[Chip].dict["perioddevproj"].Fill(np.average(Ctot))
|
|---|
| 271 | h.list[Chip].dict["perioddev"].SetBinContent(Event+1, np.abs(np.average(Ctot)))
|
|---|
| 272 | h.list[Chip].dict["lomeanxing"].Fill(MeanXing[NumXing])
|
|---|
| 273 | h.list[Chip].dict["meanxing"].Fill(np.mod(MeanXing[NumXing]+Start, NROI))
|
|---|
| 274 | MeanXingHist[np.mod(MeanXing[NumXing]+Start, NROI)] += 1
|
|---|
| 275 |
|
|---|
| 276 |
|
|---|
| 277 | return t_nom
|
|---|
| 278 |
|
|---|
| 279 | def CorrOliver(MeanXing, NumXing, TimeXing, t_nom, Start, Chip):
|
|---|
| 280 |
|
|---|
| 281 | CellTime = CellTimef(t_nom)
|
|---|
| 282 | for i in range(int(NumXing-1)):
|
|---|
| 283 | I1 = MeanXing[i]
|
|---|
| 284 | I2 = MeanXing[i+1]
|
|---|
| 285 | Period = TimeXing[i+1] - TimeXing[i]
|
|---|
| 286 | if(Period<0): Period += NROI/fsampling
|
|---|
| 287 | h.list[Chip].dict["period"].Fill(Period)
|
|---|
| 288 |
|
|---|
| 289 | if(np.abs(1-Period/P_nom) > 0.2):
|
|---|
| 290 | print "Skipping zero crossing due to too large deviation of period."
|
|---|
| 291 | h.list[Chip].dict["loleftout"].Fill(MeanXing[i])
|
|---|
| 292 | h.list[Chip].dict["leftout"].Fill(np.mod(MeanXing[i]+Start, NROI))
|
|---|
| 293 | continue
|
|---|
| 294 |
|
|---|
| 295 | # calculate the frequency of the testwave
|
|---|
| 296 | freqp = 1000./Period
|
|---|
| 297 | h.list[Chip].dict["freq"].Fill(freqp)
|
|---|
| 298 |
|
|---|
| 299 |
|
|---|
| 300 | h.list[Chip].dict["lomeanxing"].Fill(MeanXing[i])
|
|---|
| 301 | h.list[Chip].dict["meanxing"].Fill(np.mod(MeanXing[i]+Start, NROI))
|
|---|
| 302 | MeanXingHist[np.mod(MeanXing[i]+Start, NROI)] += 1
|
|---|
| 303 |
|
|---|
| 304 | Correction = (P_nom-Period)*DAMPING
|
|---|
| 305 |
|
|---|
| 306 | # Positive correction from MeanXing[i] to MeanXing[i+1]
|
|---|
| 307 | # and negative to all others
|
|---|
| 308 | Time = 0
|
|---|
| 309 | for j in range(NROI):
|
|---|
| 310 | diff = CellTime[j+1] - CellTime[j]
|
|---|
| 311 | if ((I2>I1 and j>I1 and j<=I2) or (I2<I1 and (j<=I2 or j>I1))):
|
|---|
| 312 | diff += Correction/np.mod(I2-I1+NROI, NROI)
|
|---|
| 313 | else:
|
|---|
| 314 | diff -= Correction/(NROI-np.mod(I2-I1+NROI, NROI))
|
|---|
| 315 | CellTime[j] = Time
|
|---|
| 316 | Time += diff
|
|---|
| 317 | CellTime[NROI] = Time
|
|---|
| 318 |
|
|---|
| 319 | t_nom = t_nomf(CellTime)
|
|---|
| 320 |
|
|---|
| 321 | h.list[Chip].dict["lomeanxing"].Fill(MeanXing[NumXing-1])
|
|---|
| 322 | h.list[Chip].dict["meanxing"].Fill(np.mod(MeanXing[NumXing-1]+Start, NROI))
|
|---|
| 323 |
|
|---|
| 324 | return t_nom
|
|---|
| 325 |
|
|---|
| 326 |
|
|---|
| 327 | # create array to put the calibrated times for each cell in
|
|---|
| 328 | t_nom = np.ones(NROI)/fsampling
|
|---|
| 329 | # loop over events
|
|---|
| 330 | for Event in range( NEvents ):
|
|---|
| 331 | print "Event ", Event
|
|---|
| 332 | Chip = 0
|
|---|
| 333 |
|
|---|
| 334 | # loop over every 9th channel in Chip
|
|---|
| 335 | for Pix in range(NPix)[8::9]:
|
|---|
| 336 | print "Pix ", Pix
|
|---|
| 337 |
|
|---|
| 338 | # calculate t_nom for each pixel
|
|---|
| 339 | if(alg == "Remo"):
|
|---|
| 340 | MeanXing, TimeXing, NumXing = Crossing(Data[Event], np.average(Data[Event]), t_nom, int(Start[Event]), Chip)
|
|---|
| 341 | h.list[Chip].dict["numxing"].Fill(NumXing)
|
|---|
| 342 | t_nom = Corr(MeanXing, NumXing, TimeXing, t_nom, int(Start[Event]), Chip, Event)
|
|---|
| 343 | h.list[Chip].dict["conv"].SetBinContent(Event+1, np.average(np.abs(t_nom-t_true)))
|
|---|
| 344 |
|
|---|
| 345 |
|
|---|
| 346 | if(alg == "Oliver"):
|
|---|
| 347 | MeanXing, TimeXing, NumXing = CrossingOliver(Data[Event], np.average(Data[Event]), t_nom, int(Start[Event]), Chip)
|
|---|
| 348 | h.list[Chip].dict["numxing"].Fill(NumXing)
|
|---|
| 349 | t_nom = CorrOliver(MeanXing, NumXing, TimeXing, t_nom, int(Start[Event]), Chip)
|
|---|
| 350 | h.list[Chip].dict["conv"].SetBinContent(Event+1, np.average(np.abs(t_nom-t_true)))
|
|---|
| 351 |
|
|---|
| 352 | Chip += 1
|
|---|
| 353 |
|
|---|
| 354 | CellTime = CellTimef(t_nom)
|
|---|
| 355 |
|
|---|
| 356 | print "t_tot = ", np.sum(t_nom)
|
|---|
| 357 |
|
|---|
| 358 | if(save == "yes"):
|
|---|
| 359 | np.save(str(alg)+"_"+str(variante)+"_"+str(NEvents)+"x"+str(NChip)+str(tag), CellTime)
|
|---|
| 360 | np.savetxt(str(alg)+"_"+str(variante)+"_"+str(NEvents)+"x"+str(NChip)+str(tag), CellTime[None], fmt="%7.4f")
|
|---|
| 361 |
|
|---|
| 362 |
|
|---|
| 363 | for Chip in range(NChip):
|
|---|
| 364 | for i in range(NROI):
|
|---|
| 365 | h.list[Chip].dict["int_dev"].SetBinContent(i+1, CellTime[i]-i/fsampling)
|
|---|
| 366 | h.list[Chip].dict["diff_dev"].SetBinContent(i+1, t_nom[i]-1/fsampling)
|
|---|
| 367 | h.list[Chip].dict["data"].SetBinContent(i+1, Data[-1][i])
|
|---|
| 368 |
|
|---|
| 369 | pyfact.SaveHistograms(h.list, "tcal_"+str(alg)+"_"+str(variante)+str(tag)+".root", "RECREATE")
|
|---|
| 370 |
|
|---|
| 371 |
|
|---|
| 372 | t_f = time()
|
|---|
| 373 | print "vergangene Zeit = ", (t_f - t_s)/60., " min."
|
|---|
| 374 |
|
|---|
| 375 | print "Variante = ", variante
|
|---|
| 376 | print "Algorithmus = ", alg
|
|---|
| 377 | print "Speichern = ", save
|
|---|
| 378 | print "NChip = ", NChip
|
|---|
| 379 | print "NEvents = ", NEvents
|
|---|
| 380 | print "Histo saved as = ", "tcal_"+str(alg)+"_"+str(variante)+str(tag)+".root"
|
|---|
| 381 | if(save == "yes"):
|
|---|
| 382 | print "CellTime saved as = ", str(alg)+"_"+str(variante)+"_"+str(NEvents)+"x"+str(NChip)+str(tag)+".npy"
|
|---|