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

Annotation of /PamVMC_update/tof/src/PamVMCTofDig.cxx

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.1 - (hide annotations) (download)
Tue Oct 15 15:51:21 2013 UTC (11 years, 4 months ago) by formato
Branch point for: MAIN, rel
Initial revision

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

  ViewVC Help
Powered by ViewVC 1.1.23