/[PAMELA software]/PamVMC/tof/src/PamVMCTofDig.cxx
ViewVC logotype

Contents of /PamVMC/tof/src/PamVMCTofDig.cxx

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.1 - (show annotations) (download)
Thu Feb 19 16:00:17 2009 UTC (15 years, 9 months ago) by nikolas
Branch: MAIN
Cleaning files before release

1 #include "PamVMCTofDig.h"
2 #include "TDatabasePDG.h"
3
4 #include <TMath.h>
5 #include <TRandom.h>
6
7 using TMath::Power;
8 using TMath::Exp;
9 using TMath::Abs;
10
11 ClassImp(PamVMCTofDig)
12
13
14 void PamVMCTofDig::LoadCalib(){
15
16 cout<<"Loading Tof Calibrations..."<<endl;
17
18 Int_t time=3;
19 Int_t type=202;
20
21 fdberr = fsql->Query_GL_PARAM(time,type);
22
23 fquery.str("");
24 fquery << fsql->GetPAR()->PATH.Data() << "/";
25 fquery << fsql->GetPAR()->NAME.Data();
26
27 ThrowCalFileUsage("TOF",fquery.str().c_str());
28
29 fcfile.open(fquery.str().c_str());
30 // fcfile.open("/opt/pamela-5.21/calib/tof-param/ToFCalibParam.txt");
31
32 if(!fcfile) ThrowCalFileWarning("TOF"); else {
33
34 Int_t temp;
35
36 for(Int_t i=0; i<NP; i++){
37 fcfile >> temp;
38 fcfile >> fatte1[i];
39 fcfile >> flambda1[i];
40 fcfile >> fatte2[i];
41 fcfile >> flambda2[i];
42 fcfile >> temp;
43 }
44
45 }
46
47 fcfile.close();
48 }
49
50
51
52
53 void PamVMCTofDig::DigitizeTOF(Int_t EventNo, Int_t PrimaryPDG){
54
55 fDEBUG = kFALSE;
56
57 // pC < 800
58 const Float_t ADC_pC0A = -4.437616e+01;
59 const Float_t ADC_pC1A = 1.573329e+00;
60 const Float_t ADC_pC2A = 2.780518e-04;
61 const Float_t ADC_pC3A = -2.302160e-07;
62 // pC > 800:
63 const Float_t ADC_pC0B = -2.245756e+02;
64 const Float_t ADC_pC1B = 2.184156e+00;
65 const Float_t ADC_pC2B = -4.171825e-04;
66 const Float_t ADC_pC3B = 3.789715e-08;
67
68 const Float_t pCthres=40.; // threshold in charge
69 const Int_t ADClast=4095; // no signal --> ADC ch=4095
70 const Int_t ADCsat=3100; // saturation value for the ADCs
71 const Int_t TDClast=4095;
72
73 for(Int_t i =0; i<NP; i++){
74 fQevePmt_pC[i]=ftdc[i]=ftdc1[i]=0.;
75 ftdcpmt[i]=1000.;
76 }
77
78
79
80 TClonesArray* hc = 0;
81 const char* keyplane [6] = {"S11Y","S12X","S21X","S22Y","S31Y","S32X"};
82 for(Int_t i=0; i<6; i++){
83 hc = (TClonesArray*)fhitscolmap.GetValue(keyplane[i]);
84 if (hc) DigitizeTofPlane(i,hc, PrimaryPDG);
85 hc = 0;
86 }
87
88 //+++++ ADC +++++
89
90 for(Int_t i=0; i<NP; i++){
91 if (fQevePmt_pC[i] < 800.)
92 fADCtof[i]= (Int_t)(ADC_pC0A + ADC_pC1A*fQevePmt_pC[i]
93 + ADC_pC2A*Power(fQevePmt_pC[i],2)
94 + ADC_pC3A*Power(fQevePmt_pC[i],3));
95 if ((fQevePmt_pC[i] > 800.) && (fQevePmt_pC[i] <= 2485.))
96 fADCtof[i]= (Int_t)(ADC_pC0B + ADC_pC1B*fQevePmt_pC[i]
97 + ADC_pC2B*Power(fQevePmt_pC[i],2)
98 + ADC_pC3B*Power(fQevePmt_pC[i],3));
99 if (fQevePmt_pC[i] > 2485.) fADCtof[i]= (Int_t)(1758. + 0.54*fQevePmt_pC[i]);
100 //assuming a fictional 0.54 ch/pC above ADCsat
101 if (fADCtof[i]>ADCsat) fADCtof[i]=ADCsat;
102 if (fQevePmt_pC[i] < pCthres) fADCtof[i]= ADClast;
103 if (fADCtof[i] < 0) fADCtof[i]=ADClast;
104 if (fADCtof[i] > ADClast) fADCtof[i]=ADClast;
105 }
106
107 // ====== TDC coincidence ======
108
109 Float_t t_coinc = 0;
110 Int_t ilast = 100;
111 for (Int_t ii=0; ii<NP;ii++)
112 if (ftdc[ii] > t_coinc) {
113 t_coinc = ftdc[ii];
114 ilast = ii;
115 }
116
117 for (Int_t ii=0; ii<NP;ii++){
118 if (ftdc[ii] != 0) ftdc1[ii] = t_coinc - ftdcpmt[ii]; // test 2
119 ftdc1[ii] = ftdc1[ii]/ftdcres[ii]; // divide by TDC resolution
120 if (ftdc[ii] != 0) ftdc1[ii] = ftdc1[ii] + fc3_S[ii]; // add cable length c3
121 }
122
123 if (fDEBUG)cout<<"====== TOF coincidence ======"<<endl;
124 for(Int_t i=0; i<NP; i++){
125 if(ftdc1[i] != 0.){
126 fTDCint[i]=(Int_t)ftdc1[i];
127 if (fTDCint[i]>4093) fTDCint[i]=TDClast; // 18-oct WM
128 if (fDEBUG)cout<<"PMT: "<<i<<" ADC: "<<fADCtof[i]<<" TDC: "
129 <<fTDCint[i]<<endl;
130 } else
131 fTDCint[i]= TDClast;
132 }
133 if (fDEBUG)cout<<"============================="<<endl;
134
135 //------ use channelmap for ToF: 18-oct WM
136 Int_t channelmap[] = {3,21,11,29,19,45,27,37,36,28,44,20,5,12,13,4,
137 6,47,14,39,22,31,30,23,38,15,46,7,0,33,16,24,
138 8,41,32,40,25,17,34,9,42,1,2,10,18,26,35,43};
139 Int_t ADChelp[NP],TDChelp[NP];
140 for(Int_t i=0; i<NP; i++){
141 Int_t ii=channelmap[i];
142 ADChelp[ii]= fADCtof[i];
143 TDChelp[ii]= fTDCint[i];
144 }
145 for(Int_t i=0; i<NP; i++){
146 fADCtof[i]= ADChelp[i];
147 fTDCint[i]= TDChelp[i];
148 }
149
150
151 // ====== write DataTof =======
152
153 UChar_t Ctrl3bit[8]={32,0,96,64,160,128,224,192}; // DC (msb in 8 bit word )
154 UChar_t tofBin;
155 UChar_t DataTof[276];
156 for (Int_t j=0; j < 276; j++)DataTof[j]=0x00;
157 UChar_t *pTof=DataTof;
158 for (Int_t j=0; j < 12; j++){ // loop on TDC #12
159 Int_t j12=j*23; // for each TDC 23 bytes (8 bits)
160 DataTof[j12+0]=0x00; // TDC_ID
161 DataTof[j12+1]=0x00; // EV_COUNT
162 DataTof[j12+2]=0x00; // TDC_MASK (1)
163 DataTof[j12+3]=0x00; // TDC_MASK (2)
164 for (Int_t k=0; k < 4; k++){ // for each TDC 4 channels (ADC+TDC)
165 Int_t jk12=j12+4*k; // ADC,TDC channel (0-47)
166 tofBin =(UChar_t)(fADCtof[k+4*j]/256); // ADC# (msb)
167 DataTof[jk12+4] = Bin2GrayTof(tofBin,DataTof[jk12+4]);
168 /* control bits inserted here, after the bin to gray conv - DC*/
169 DataTof[jk12+4] = Ctrl3bit[2*k] | DataTof[jk12+4];
170 tofBin=(UChar_t)(fADCtof[k+4*j]%256); // ADC# (lsb)
171 DataTof[jk12+5] = Bin2GrayTof(tofBin,DataTof[jk12+5]);
172 tofBin=(UChar_t)(fTDCint[k+4*j]/256); // TDC# (msb)
173 DataTof[jk12+6]=Bin2GrayTof(tofBin,DataTof[jk12+6]);
174 /* control bits inserted here, after the bin to gray conv - DC*/
175 DataTof[jk12+6] = Ctrl3bit[2*k+1] | DataTof[jk12+6];
176 tofBin=(UChar_t)(fTDCint[k+4*j]%256); // TDC# (lsb)
177 DataTof[jk12+7]=Bin2GrayTof(tofBin,DataTof[jk12+7]);
178 }
179 DataTof[j12+20]=0x00; // TEMP1
180 DataTof[j12+21]=0x00; // TEMP2
181 DataTof[j12+22]= EvaluateCrc(pTof,22); // CRC
182 pTof+=23;
183 }
184
185 //===== write DataTrigger =======
186
187 UChar_t DataTrigger[152];
188 for (Int_t j=0; j < 152; j++)DataTrigger[j]=0x00;
189 UChar_t *pTrg=DataTrigger;
190 // Only the variables with a (*) are modified; the others are set to 0
191 // info given in #bites data + #bites crc
192 // TB_READ_PMT_PLANE : 6 + 1
193 // TB_READ_EVENT_COUNT : 3 + 1 (*)
194 // TB_READ_TRIGGER_RATE : 12 + 1
195 // TB_READ_D_L_TIME : 4 + 1
196 // TB_READ_S4_CAL_COUNT : 4 + 1
197 // TB_READ_PMT_COUNT1 : 48 + 1
198 // TB_READ_PMT_COUNT2 : 48 + 1
199 // TB_READ_PATTERN_BUSY : 8 + 1
200 // TB_READ_PATTERN_TRIGGER: 7 + 1 (*)
201 // TB_READ_TRIGGER_CONF : 2 + 1 (*)
202 // TB_READ_EVENT_COUNT
203 UInt_t cTrg = EventNo; //counter
204 UInt_t cTrg2 = 0; //counter with bits inverted, according to document
205 //"formato dati provenienti dalla trigger board"
206 for (Int_t i=0; i < 24; i++){ // Use the first 24 bits
207 if (cTrg & (0x1 << i) )
208 cTrg2 = cTrg2 | (0x1 << (24-i));
209 }
210 DataTrigger[7] = (UChar_t)(cTrg2 >> 16); // 8 MSbits (out of 24)
211 DataTrigger[8] = (UChar_t)(cTrg2 >> 8); // 8 "middle" bits
212 DataTrigger[9] = (UChar_t)(cTrg2); // 8 LSbits
213 pTrg=DataTrigger+7;
214 DataTrigger[10]=EvaluateCrc(pTrg, 3);
215
216 // TB_READ_PATTERN_TRIGGER: bytes 141-148:
217 // PatternTrigMap[i] corresponds to bit i in TB_READ_PATTERN_TRIGGER:
218 // mapping according to documents:
219 // 1. "formato dati provenienti dalla trigger board"
220 // 2. "The ToF quicklook software", Appendix A (Campana, Nagni)
221 Int_t PatternTrigMap[]={29,42,43,1,16,7,17,28,33,41,46,2,15,8,18,27,
222 30,40,44,3,14,9,19,26,32,37,47,4,13,10,20,25,
223 34,31,38,45,5,12,21,24,36,35,39,48,6,11,22,23};
224 for (Int_t i=0; i<NP; i++){
225 if (ftdc1[channelmap[i]]!=0)
226 DataTrigger[147-(Int_t)((PatternTrigMap[i]+1)/8)]=DataTrigger[147-(Int_t)((PatternTrigMap[i]+1)/8)] | (0x1 << (PatternTrigMap[i]%8));
227 }
228 pTrg=DataTrigger+141;
229 DataTrigger[148]=EvaluateCrc(pTrg, 7);
230
231 // TB_READ_TRIGGER_CONF : set always acq.mode TOF4
232 //
233 // TOF1: S1-S2-S3 (&,|)
234 // TOF4: S2-S3 (&,&)
235 DataTrigger[149]=0x02;
236 DataTrigger[150]=0x0;
237 pTrg=DataTrigger+149;
238 DataTrigger[151]=EvaluateCrc(pTrg, 2);
239
240
241 //++++++ WRITE EVERYTHING TO DIGITIZER'S BUFFER +++//
242 cout<<"TOF Digitizing"<<endl;
243
244 fDataC.clear(); //clearing Tof & Trig data buffer
245
246 for(Int_t i= 0; i<152; i++) fDataC.push_back(DataTrigger[i]);
247
248 for(Int_t i= 0; i<276; i++) fDataC.push_back(DataTof[i]);
249
250 }
251
252 Float_t PamVMCTofDig::TimeRes(Int_t PrimaryPDG){
253
254 Float_t time_res[8] = {425.,210.,170.,130.,120.,120.,120.,120.};
255 Int_t Z = Int_t((TDatabasePDG::Instance()->GetParticle(PrimaryPDG))->Charge()/3.);
256
257 Float_t dt1 = 1.e-12*time_res[0]; // single PMT resolution for Z=1 (WM, Nov'07)
258 if ((Z > 1) && (Z < 9)) dt1=1.e-12*time_res[(Z-1)];
259 if (Z > 8) dt1=120.e-12;
260
261 return dt1;
262 }
263
264 void PamVMCTofDig::DigitizeTofPlane(Int_t planeNo, TClonesArray* HitColl, Int_t PrimaryPDG){
265
266 PamVMCDetectorHit * hit = 0;
267 const Float_t veff0 = 100.*1.0e8;//(m/s) light velocity in scintillator
268 const Float_t veff1 = 100.*1.5e8;//(m/s) light velocity in lightguide
269 const Float_t FGeo[2] = {0.5, 0.5}; //geometrical factor
270 const Float_t Pho_keV = 10.;// photons per keV in scintillator
271 const Float_t effi = 0.21; //photocathofe efficiency
272 const Float_t pmGain = 3.5e6; //PMT Gain: the same for all PMTs
273 const Float_t echarge = 1.6e-19; // electron charge
274 const Float_t thresh=20.; // to be defined better... (Wolfgang)
275
276 const Float_t dimel[6] = {33.0, 40.8 ,18.0, 15.0, 15.0, 18.0}; //(cm) TOF paddles dimensions
277 // S11 8 paddles 33.0 x 5.1 cm
278 // S12 6 paddles 40.8 x 5.5 cm
279 // S21 2 paddles 18.0 x 7.5 cm
280 // S22 2 paddles 15.0 x 9.0 cm
281 // S31 3 paddles 15.0 x 6.0 cm
282 // S32 3 paddles 18.0 x 5.0 cm
283
284 const Float_t s_l_g[6] = {8.0, 8.0, 20.9, 22.0, 9.8, 8.3 }; //(cm) length of the lightguide
285
286 const Float_t ScaleFact[48]={0.39, 0.49, 0.38, 0.40, 0.65, 0.51, 0.43,
287 0.49, 0.58, 0.38, 0.53, 0.57, 0.53, 0.45, 0.49, 0.16,
288 0.15, 0.44, 0.28, 0.57, 0.26, 0.72, 0.37, 0.29, 0.30, 0.89,
289 0.37, 0.08, 0.27, 0.23, 0.12, 0.22, 0.15, 0.16, 0.21,
290 0.19, 0.41, 0.32, 0.39, 0.38, 0.28, 0.66, 0.28, 0.40, 0.39, 0.40, 0.37, 0.35 };
291
292 Float_t t1, t2, tpos, Npho;
293 Float_t path[2], knorm[2], Atten[2], QhitPad_pC[2], QhitPmt_pC[2];
294 Int_t padNo, pmtleft, pmtright;
295 //LOOP
296 for(Int_t i =0; i<HitColl->GetEntriesFast(); i++){
297
298 hit = (PamVMCDetectorHit*)HitColl->At(i);
299
300 t1=t2 = hit->GetTOF();
301 padNo = hit->GetPOS()-1;
302 pmtleft=pmtright=0;
303 if(planeNo==2)
304 if(padNo==0)
305 padNo=1;
306 else
307 padNo=0;
308
309 Paddle2Pmt(planeNo,padNo, &pmtleft, &pmtright);
310
311 switch(planeNo){
312 case 0:
313 case 3:
314 case 4:
315 tpos = (hit->GetYIN()+hit->GetYOUT())/2.; //Y-planes
316 break;
317 case 1:
318 case 2:
319 case 5:
320 tpos = (hit->GetXIN()+hit->GetXOUT())/2.; //X-planes
321 break;
322 default:
323 cout<<"PamVMCTofDig::DigitizeTOFPlane wrong plane no "<<planeNo<<endl;
324 tpos = -100.;
325 break;
326 }
327
328 path[0]= tpos + dimel[planeNo]/2.; // path to left PMT
329 path[1]= dimel[planeNo]/2.- tpos; // path to right PMT
330
331 if (fDEBUG) {
332 cout <<"+++++ TOF HIT VERBOSE INFORMATION: +++++"<<endl;
333 cout <<"planeNo "<<planeNo<<" padNo "<< padNo <<" tpos "<< tpos <<"\n";
334 cout <<"pmtleft, pmtright "<<pmtleft<<","<<pmtright<<endl;
335 }
336
337 Npho = hit->GetEREL()*Pho_keV*1.0e6; //calculation of photons number
338
339 for(Int_t j=0; j<2; j++){
340 QhitPad_pC[j]= Npho*FGeo[j]*effi*pmGain*echarge*1.E12*ScaleFact[pmtleft+j];
341 knorm[j]=fatte1[pmtleft+j]*Exp(flambda1[pmtleft+j]*dimel[planeNo]/2.*Power(-1,j+1)) +
342 fatte2[pmtleft+j]*Exp(flambda2[pmtleft+j]*dimel[planeNo]/2.*Power(-1,j+1));
343 Atten[j]=fatte1[pmtleft+j]*Exp(tpos*flambda1[pmtleft+j]) +
344 fatte2[pmtleft+j]*Exp(tpos*flambda2[pmtleft+j]) ;
345 QhitPmt_pC[j]= QhitPad_pC[j]*Atten[j]/knorm[j];
346 if (fDEBUG) {
347 cout<<"pmtleft:"<<pmtleft<<" j:"<<j<<endl;
348 cout<<"atte1:"<<fatte1[pmtleft+j]<<" lambda1:"<<flambda1[pmtleft+j]
349 <<" atte2:"<<fatte2[pmtleft+j]<<" lambda2:"<<flambda2[pmtleft+j]
350 <<endl;
351 cout<<j<<" tpos:"<<tpos<<" knorm:"<<knorm[j]<<" "<<Atten[j]<<" "
352 <<"QhitPmt_pC "<<QhitPmt_pC[j]<<endl;
353 }
354 }
355
356 if(fDEBUG)cout<<"Energy release (keV):"<<hit->GetEREL()*1.e6<<" Npho:"<<Npho<<
357 " QhitPmt_pC(left,right):"<<QhitPmt_pC[0]<<" "<<QhitPmt_pC[1]<<endl;
358
359 fQevePmt_pC[pmtleft] += QhitPmt_pC[0]; //cdding charge from separate hits
360 fQevePmt_pC[pmtright] += QhitPmt_pC[1];
361
362 // TDC
363 // WM right and left <->
364 t1 += Abs(path[0]/veff0) + s_l_g[planeNo]/veff1;
365 t2 += Abs(path[1]/veff0) + s_l_g[planeNo]/veff1; // Signal reaches PMT
366 t1 = gRandom->Gaus(t1,TimeRes(PrimaryPDG)); //apply gaussian error dt
367 t2 = gRandom->Gaus(t2,TimeRes(PrimaryPDG)); //apply gaussian error dt
368 t1 += fc1_S[pmtleft] ; // Signal reaches Discriminator ,TDC starts to run
369 t2 += fc1_S[pmtright] ;
370
371 // check if signal is above threshold
372 // then check if tdcpmt is already filled by another hit...
373 // only re-fill if time is smaller
374 if (QhitPmt_pC[0] > thresh) {
375 if (ftdcpmt[pmtleft] == 1000.) { // fill for the first time
376 ftdcpmt[pmtleft] = t1;
377 ftdc[pmtleft] = t1 + fc2_S[pmtleft] ; // Signal reaches Coincidence
378 }
379 if (ftdcpmt[pmtleft] < 1000.) // is already filled!
380 if (t1 < ftdcpmt[pmtleft]) {
381 ftdcpmt[pmtleft] = t1;
382 t1 += fc2_S[pmtleft] ; // Signal reaches Coincidence
383 ftdc[pmtleft] = t1;
384 }
385 }
386 if (QhitPmt_pC[1] > thresh) {
387 if (ftdcpmt[pmtright] == 1000.) { // fill for the first time
388 ftdcpmt[pmtright] = t2;
389 ftdc[pmtright] = t2 + fc2_S[pmtright] ; // Signal reaches Coincidence
390 }
391 if (ftdcpmt[pmtright] < 1000.) // is already filled!
392 if (t2 < ftdcpmt[pmtright]) {
393 ftdcpmt[pmtright] = t2;
394 t2+= fc2_S[pmtright] ;
395 ftdc[pmtright] = t2;
396 }
397 }
398 if(fDEBUG)cout<<"Time(s):"<<hit->GetTOF()<<" t1:"<<t1<<" t2:"<<t2<<endl
399 <<"+++++ END OF TOF HIT +++++"<<endl;
400
401 };
402 //END OF HIT COLLECTION LOOP
403
404 }
405
406 void PamVMCTofDig::Paddle2Pmt(Int_t planeNo, Int_t padNo, Int_t *pl, Int_t *pr){
407 //* @param plane (0 - 5)
408 //* @param paddle (plane=0, paddle = 0,...5)
409 //* @param padid (0 - 23)
410 //
411 Int_t padid=-1;
412 Int_t pads[6]={8,6,2,2,3,3};
413 //
414 Int_t somma=0;
415 for(Int_t j=0; j<planeNo; j++) somma+=pads[j];
416 padid=padNo+somma;
417 *pl = padid*2;
418 *pr = *pl + 1; // WM
419
420 }
421
422
423 UChar_t PamVMCTofDig::Bin2GrayTof(UChar_t binaTOF,UChar_t grayTOF){
424 union graytof_data {
425 UChar_t word;
426 struct bit_field {
427 unsigned b0:1;
428 unsigned b1:1;
429 unsigned b2:1;
430 unsigned b3:1;
431 unsigned b4:1;
432 unsigned b5:1;
433 unsigned b6:1;
434 unsigned b7:1;
435 } bit;
436 } bi,gr;
437 //
438 bi.word = binaTOF;
439 gr.word = grayTOF;
440 //
441 gr.bit.b0 = bi.bit.b1 ^ bi.bit.b0;
442 gr.bit.b1 = bi.bit.b2 ^ bi.bit.b1;
443 gr.bit.b2 = bi.bit.b3 ^ bi.bit.b2;
444 gr.bit.b3 = bi.bit.b3;
445 //
446 /* bin to gray conversion 4 bit per time*/
447 //
448 gr.bit.b4 = bi.bit.b5 ^ bi.bit.b4;
449 gr.bit.b5 = bi.bit.b6 ^ bi.bit.b5;
450 gr.bit.b6 = bi.bit.b7 ^ bi.bit.b6;
451 gr.bit.b7 = bi.bit.b7;
452 //
453 return(gr.word);
454 }
455
456 void PamVMCTofDig::Crc8Tof(UChar_t *oldCRC, UChar_t *crcTof){
457 union crctof_data {
458 UChar_t word;
459 struct bit_field {
460 unsigned b0:1;
461 unsigned b1:1;
462 unsigned b2:1;
463 unsigned b3:1;
464 unsigned b4:1;
465 unsigned b5:1;
466 unsigned b6:1;
467 unsigned b7:1;
468 } bit;
469 } c,d,r;
470
471 c.word = *oldCRC;
472 //d.word = *newCRC;
473 d.word = *crcTof;
474 r.word = 0;
475
476 r.bit.b0 = c.bit.b7 ^ c.bit.b6 ^ c.bit.b0 ^
477 d.bit.b0 ^ d.bit.b6 ^ d.bit.b7;
478
479 r.bit.b1 = c.bit.b6 ^ c.bit.b1 ^ c.bit.b0 ^
480 d.bit.b0 ^ d.bit.b1 ^ d.bit.b6;
481
482 r.bit.b2 = c.bit.b6 ^ c.bit.b2 ^ c.bit.b1 ^ c.bit.b0 ^
483 d.bit.b0 ^ d.bit.b1 ^ d.bit.b2 ^ d.bit.b6;
484
485 r.bit.b3 = c.bit.b7 ^ c.bit.b3 ^ c.bit.b2 ^ c.bit.b1 ^
486 d.bit.b1 ^ d.bit.b2 ^ d.bit.b3 ^ d.bit.b7;
487
488 r.bit.b4 = c.bit.b4 ^ c.bit.b3 ^ c.bit.b2 ^
489 d.bit.b2 ^ d.bit.b3 ^ d.bit.b4;
490
491 r.bit.b5 = c.bit.b5 ^ c.bit.b4 ^ c.bit.b3 ^
492 d.bit.b3 ^ d.bit.b4 ^ d.bit.b5;
493
494 r.bit.b6 = c.bit.b6 ^ c.bit.b5 ^ c.bit.b4 ^
495 d.bit.b4 ^ d.bit.b5 ^ d.bit.b6;
496
497 r.bit.b7 = c.bit.b7 ^ c.bit.b6 ^ c.bit.b5 ^
498 d.bit.b5 ^ d.bit.b6 ^ d.bit.b7 ;
499
500 *crcTof=r.word;
501 //return r.word;
502 };
503
504
505
506
507 UChar_t PamVMCTofDig::EvaluateCrc(UChar_t *pTrg, Int_t nb) {
508 Bool_t DEBUG=false;
509 if (DEBUG)
510 return(0x00);
511
512 UChar_t crcTrg=0x00;
513 UChar_t *pc=&crcTrg, *pc2;
514 pc2=pTrg;
515 for (Int_t jp=0; jp < nb; jp++)
516 Crc8Tof(pc2++,pc);
517 return(crcTrg);
518 }

  ViewVC Help
Powered by ViewVC 1.1.23