/[PAMELA software]/PamVMC/trk/src/PamVMCTrkDig.cxx
ViewVC logotype

Annotation of /PamVMC/trk/src/PamVMCTrkDig.cxx

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.5 - (hide annotations) (download)
Fri Jun 12 18:39:56 2009 UTC (15 years, 5 months ago) by pam-rm2
Branch: MAIN
CVS Tags: v1r0, HEAD
Changes since 1.1: +3 -3 lines
- Introduced user-defined names of output files and random seeds number.
Users can do it use options of PamVMCApplication constructor:
PamVMCApplication(const char* name,  const char *title, const char*
filename="pamtest", Int_t seed=0).
The Random object that I use is TRandom3 object which has astronomical
large period (in case of default initialization 0). All random generators
in the code use this object by calling of gRandom singleton which keeps
it.

- Corrected TOF digitization routine. No problems with TDC hits due to
hadronic interactions anymore.

- Some small changes was done to compile code under Root 5.23. +
geant4_vmc v. 2.6 without any warnings

- Some classes of PamG4RunConfiguartion was changed for geant4_vmc v.
2.6.Some obsolete classes was deleted as soon as developers implemented
regions.

- Navigation was changed from "geomRootToGeant4" to "geomRoot", because on
VMC web page written that as soon as Geant4 has no option ONLY/MANY
translation of overlapped geometry to Geant4 through VGM could be wrong.
I'd like to stay with Root navigation:
http://root.cern.ch/root/vmc/Geant4VMC.html. This should be default
option.

- New Tracker digitization routine written by Sergio was implemented

- PamVMC again became compatible with geant4_vmc v.2.5 and ROOT 5.20.
 The problem was that ROOT developers introduced in TVirtualMC class a new
method SetMagField and new base class:TVirtualMagField from which
user-defined classes shoukd be derived

1 nikolas 1.1 #include "PamVMCTrkDig.h"
2     #include <TMath.h>
3    
4     ClassImp(PamVMCTrkDig)
5    
6     using TMath::Abs;
7    
8     void PamVMCTrkDig::LoadFile(){
9    
10     cout<<"Loading Tracker Calibrations..."<<endl;
11    
12     Int_t time=0;
13     Int_t type=8;
14    
15     fdberr = fsql->Query_GL_PARAM(time,type);
16     //we hardcoded values of time and type of calibrations
17     //later we'll introduce an options which allow us to load
18     //from different sources
19    
20     if(fdberr<0){
21     TString crfname = fpath+"/CalibTrk_00110_000_000.root";
22     cout<<"No such record in DB for TRK: time="<<time
23     <<" type="<<type<<endl
24     <<"We will use file:"<<crfname<<endl;
25    
26     fcrfile = new TFile(crfname);
27    
28     } else {
29    
30     fquery.str("");
31     fquery << fsql->GetPAR()->PATH.Data() << "/";
32     fquery << fsql->GetPAR()->NAME.Data();
33    
34     ThrowCalFileUsage("TRK",fquery.str().c_str());
35    
36     fcrfile = new TFile(fquery.str().c_str());
37     }
38    
39     if(!fcrfile) ThrowCalFileWarning("TRK"); else
40     if(fcrfile->IsZombie()){
41     ThrowCalFileWarning("TRK"); //critical error
42     return;
43     }
44    
45     //Load calibrations. I don't know, some empiric numbers of
46     //broken VA chips introduced. Should be load as options..
47    
48     //------X-plane------//
49     TTree *tr1 = (TTree*)fcrfile->Get("CalibTrk1");
50     if ( !tr1 ){
51     cout<<"!!!WARNING Tree CalibTrk1 in file "<<fcrfile->GetName()
52     <<" was NOT found!!!"<<endl;
53     return;
54     }
55     CalibTrk1Event *caldata1 = 0;
56     TBranch *trbr1 = tr1->GetBranch("CalibTrk1");
57     tr1->SetBranchAddress("CalibTrk1", &caldata1);
58     trbr1->GetEntry(0);
59    
60     Int_t Kview,jj;
61    
62     for (Int_t i=0; i<6;i++) {
63     for (Int_t j=0; j<3072;j++) {
64     jj=j;
65     // broken va1 replaced
66     BrokenStrip(0,4,i,j,jj);
67     BrokenStrip(5,12,i,j,jj);
68    
69     Kview=caldata1->DSPnumber[i]-1;
70     fPedeTrack[Kview][j]=caldata1->DSPped_par[i][jj];
71     fSigmaTrack[Kview][j]=caldata1->DSPsig_par[i][jj];
72     if(caldata1->DSPbad_par[i][jj]==1) fSigmaTrack[Kview][j]=-fSigmaTrack[Kview][j];
73     };
74     };
75    
76     //------Y-plane------//
77     TTree *tr2 = (TTree*)fcrfile->Get("CalibTrk2");
78     if ( !tr2 ){
79     cout<<"!!!WARNING Tree CalibTrk2 in file "<<fcrfile->GetName()
80     <<" was NOT found!!!"<<endl;
81     return;
82     }
83     CalibTrk2Event *caldata2 = 0;
84     TBranch *trbr2 = tr2->GetBranch("CalibTrk2");
85     tr2->SetBranchAddress("CalibTrk2",&caldata2);
86     trbr2->GetEntry(1);
87    
88     for (Int_t i=0; i<6;i++) {
89     for (Int_t j=0; j<3072;j++) {
90     jj=j;
91     // broken va1 replaced
92     BrokenStrip(2,3,i,j,jj);
93     BrokenStrip(2,5,i,j,jj);
94     BrokenStrip(2,6,i,j,jj);
95     BrokenStrip(2,7,i,j,jj);
96     BrokenStrip(2,11,i,j,jj);
97    
98     Kview=caldata2->DSPnumber[i]-1;
99     fPedeTrack[Kview][j]=caldata2->DSPped_par[i][jj];
100     fSigmaTrack[Kview][j]=caldata2->DSPsig_par[i][jj];
101     if(caldata2->DSPbad_par[i][jj]==1) fSigmaTrack[Kview][j]=-fSigmaTrack[Kview][j];
102     };
103     };
104    
105     fcrfile->Close();
106     }
107    
108    
109     void PamVMCTrkDig::DigitizeTrackCalib(Int_t n){
110    
111     cout<<"Starting Tracker Calibrations..."<<endl;
112     if( (n!=1)&&(n!=2) ) {
113     cout << "!!!ERROR: Wrong DigitizeTrackCalib argument!!!" << endl;
114     return;
115     };
116    
117     fData.clear();
118    
119     UShort_t Dato;
120    
121     USBuffer tempdat; //temporary buffer to keep data before writing DSP data
122     USBuffer::const_iterator p; //iterator;
123    
124     Float_t dato1,dato2,dato3,dato4;
125     UShort_t DatoDec,DatoDec1,DatoDec2,DatoDec3,DatoDec4;
126     UShort_t EVENT_CAL, PED_L1, ReLength,OveCheckCode;
127     UShort_t CkSum;
128    
129     for (Int_t j=n-1; j<fNviews;j+=2) { //0(1)...12
130     CkSum=0;
131     // here skip the dsp header and his trailer , to be written later
132     tempdat.clear(); //clearing temporary buffer
133     for (Int_t i=0; i<fNladder;i++) { //0...2
134     for (Int_t k=0; k<fNstrips_ladder;k++) { //0...1023
135     // write in buffer the current LADDER
136     Dato=(UShort_t)fPedeTrack[j][i*fNstrips_ladder+k];
137     dato1=fPedeTrack[j][i*fNstrips_ladder+k]-Dato;
138    
139     DatoDec1=(UShort_t)(dato1*2);
140     dato2=dato1*2-DatoDec1;
141    
142     DatoDec2=(UShort_t)(dato2*2);
143     dato3=dato2*2-DatoDec2;
144    
145     DatoDec3=(UShort_t)(dato3*2);
146     dato4=dato3*2-DatoDec3;
147    
148     DatoDec4=(UShort_t)(dato4*2);
149    
150     DatoDec=DatoDec1*0x0008+DatoDec2*0x0004+DatoDec3*0x0002+DatoDec4*0x0001;
151    
152     tempdat.push_back( ((Dato << 4) | (DatoDec & 0x000F)) );
153     CkSum^=tempdat.back();
154     };
155    
156     for (Int_t k=0; k<fNstrips_ladder;k++) { //0...1023
157     // write in buffer the current LADDER
158     Dato=(UShort_t)fabs(fSigmaTrack[j][i*fNstrips_ladder+k]);
159     dato1=fabs(fSigmaTrack[j][i*fNstrips_ladder+k])-Dato;
160    
161     DatoDec1=(UShort_t)(dato1*2);
162     dato2=dato1*2-DatoDec1;
163    
164     DatoDec2=(UShort_t)(dato2*2);
165     dato3=dato2*2-DatoDec2;
166    
167     DatoDec3=(UShort_t)(dato3*2);
168     dato4=dato3*2-DatoDec3;
169    
170     DatoDec4=(UShort_t)(dato4*2);
171    
172     DatoDec=DatoDec1*0x0008+DatoDec2*0x0004+DatoDec3*0x0002+DatoDec4*0x0001;
173    
174     tempdat.push_back( ((Dato << 4) | (DatoDec & 0x000F)) );
175     CkSum^=tempdat.back();
176     };
177    
178     for (Int_t k=0; k<64;k++) { //0...63
179     UShort_t DatoBad=0x0000;
180     for (Int_t nb=0; nb<16;nb++) {
181     if( fSigmaTrack[j][i*fNstrips_ladder+k*16+nb]<0. ) DatoBad=( DatoBad | (0x8000 >> nb) );
182     };
183    
184     tempdat.push_back(DatoBad);
185     CkSum^=tempdat.back();
186     };
187     // end ladder
188    
189     // write in buffer the end ladder word
190    
191     switch(i){
192     case 0:
193     tempdat.push_back(0x1807);
194     break;
195     case 1:
196     tempdat.push_back(0x1808);
197     break;
198     case 2:
199     tempdat.push_back(0x1808);
200     break;
201     default:
202     break;
203     }
204     CkSum^=tempdat.back();
205    
206     // write in buffer the TRAILER
207     ReLength=(UShort_t)((fNstrips_ladder*2+64+1)*2+3);
208     OveCheckCode=0x0000;
209    
210    
211     tempdat.push_back(0x0000);
212     tempdat.push_back((ReLength >> 8));
213     tempdat.push_back(( (ReLength << 8) | (OveCheckCode & 0x00FF) ));
214    
215     }; // end TRAILER
216    
217     cout<<"LENGTH OF TEMPDAT"<<tempdat.size()<<endl;
218     // write in buffer the DSP header
219    
220     fData.push_back((0xE800 | ( ((j+1) << 3) | 0x0005) ));
221     fData.push_back(0x01A9);
222     fData.push_back(0x8740);
223     EVENT_CAL=0;
224     fData.push_back((0x1A00 | ( (0x03FF & EVENT_CAL)>> 1) ));
225     PED_L1=0;
226     fData.push_back(( ((EVENT_CAL << 15) | 0x5002 ) | ((0x03FF & PED_L1) << 2) ));
227     fData.push_back(0x8014);
228     fData.push_back(0x00A0);
229     fData.push_back(0x0500);
230     fData.push_back(0x2801);
231     fData.push_back(0x400A);
232     fData.push_back(0x0050);
233     CkSum=(CkSum >> 8)^(CkSum&0x00FF);
234     fData.push_back((0x0280 | (CkSum >> 3)));
235     fData.push_back((0x1FFF | (CkSum << 13) ));
236    
237     ReLength=(UShort_t)((13*2)+3);
238     OveCheckCode=0x0000;
239     fData.push_back(0x0000);
240     fData.push_back((ReLength >> 8));
241     fData.push_back(( (ReLength << 8) | (OveCheckCode & 0x00FF) ));
242     cout<<"fDATA length before adding:"<<fData.size()<<endl;
243     // Now we will copy to fData vector data from tempdat:
244     p = tempdat.begin();
245     while( p != tempdat.end() ){
246     fData.push_back(*p);
247     p++;
248     }
249     cout<<"fDATA length after adding:"<<fData.size()<<endl;
250     };
251     }
252    
253     void PamVMCTrkDig::WriteCalib(){
254     cout<<"Writing Tracker Calibrations..."<<endl;
255     fraw->WritePSCU(&fDataPSCU);
256     fraw->CopyUShortToBuff(&fData);
257     if(fPadding) fraw->WritePadding(&fDataPadding);
258     }
259    
260     void PamVMCTrkDig::LoadMipCor(){
261    
262     std:: cout << "Entering LoadMipCor" << endl;
263    
264     Float_t xfactor=1./151.6*1.04;
265     Float_t yfactor=1./152.1;
266    
267     fMipCor[0][0]=140.02*yfactor;
268     fMipCor[0][1]=140.99*xfactor;
269     fMipCor[0][2]=134.48*yfactor;
270     fMipCor[0][3]=144.41*xfactor;
271     fMipCor[0][4]=140.74*yfactor;
272     fMipCor[0][5]=142.28*xfactor;
273     fMipCor[0][6]=134.53*yfactor;
274     fMipCor[0][7]=140.63*xfactor;
275     fMipCor[0][8]=135.55*yfactor;
276     fMipCor[0][9]=138.00*xfactor;
277     fMipCor[0][10]=154.95*yfactor;
278     fMipCor[0][11]=158.44*xfactor;
279    
280    
281     fMipCor[1][0]=136.07*yfactor;
282     fMipCor[1][1]=135.59*xfactor;
283     fMipCor[1][2]=142.69*yfactor;
284     fMipCor[1][3]=138.19*xfactor;
285     fMipCor[1][4]=137.35*yfactor;
286     fMipCor[1][5]=140.23*xfactor;
287     fMipCor[1][6]=153.15*yfactor;
288     fMipCor[1][7]=151.42*xfactor;
289     fMipCor[1][8]=129.76*yfactor;
290     fMipCor[1][9]=140.63*xfactor;
291     fMipCor[1][10]=157.87*yfactor;
292     fMipCor[1][11]=153.64*xfactor;
293    
294     fMipCor[2][0]=134.98*yfactor;
295     fMipCor[2][1]=143.95*xfactor;
296     fMipCor[2][2]=140.23*yfactor;
297     fMipCor[2][3]=138.88*xfactor;
298     fMipCor[2][4]=137.95*yfactor;
299     fMipCor[2][5]=134.87*xfactor;
300     fMipCor[2][6]=157.56*yfactor;
301     fMipCor[2][7]=157.31*xfactor;
302     fMipCor[2][8]=141.37*yfactor;
303     fMipCor[2][9]=143.39*xfactor;
304     fMipCor[2][10]=156.15*yfactor;
305     fMipCor[2][11]=158.79*xfactor;
306    
307     }
308    
309    
310     void PamVMCTrkDig::Digitize(){
311    
312     fData.clear();
313    
314    
315     Int_t Iview;
316     Int_t Nstrip;
317    
318     for (Int_t j=0; j<fNviews;j++) {
319    
320     for (Int_t i=0; i<fNladder;i++) {
321    
322 pam-rm2 1.5 Float_t commonN1=frandom->Gaus(0.,fSigmaCommon);
323     Float_t commonN2=frandom->Gaus(0.,fSigmaCommon);
324 nikolas 1.1 for (Int_t k=0; k<fNstrips_ladder;k++) {
325     Nstrip=i*fNstrips_ladder+k;
326     Float_t Sigma=Abs(fSigmaTrack[j][Nstrip]);
327 pam-rm2 1.5 AdcTrack[j][Nstrip]=frandom->Gaus(fPedeTrack[j][Nstrip],Sigma );
328 nikolas 1.1 if(k<4*128) {AdcTrack[j][Nstrip] += commonN1;} // full correlation of 4 VA1 Com. Noise
329     else {AdcTrack[j][Nstrip] += commonN2;} // full correlation of 4 VA1 Com. Noise
330     if(AdcTrack[j][Nstrip] < 0. ) AdcTrack[j][Nstrip]=0.;
331     if(AdcTrack[j][Nstrip] > 4095.) AdcTrack[j][Nstrip]=4095.;
332     };
333     };
334     };
335    
336     if (fhits){
337     Float_t ADCfull;
338     Int_t iladd=0;
339     for (Int_t ix=0; ix<fhits->GetNXHit();ix++) {
340     Iview=((fhits->GetXHit(ix))->fnpstrip)*2-1;
341     Nstrip=(Int_t)((fhits->GetXHit(ix))->fistrip)-1;
342     if(Nstrip<fNstrips_ladder) iladd=0;
343     if((Nstrip>=fNstrips_ladder)&&(Nstrip<2*fNstrips_ladder)) iladd=1;
344     if((Nstrip>=2*fNstrips_ladder)&&(Nstrip<3*fNstrips_ladder)) iladd=2;
345     ADCfull=AdcTrack[Iview][Nstrip] += ((fhits->GetXHit(ix))->fqstrip)*fMipCor[iladd][Iview];
346     AdcTrack[Iview][Nstrip] *= SaturationTrackx(ADCfull);
347     };
348    
349    
350     for (Int_t iy=0; iy<fhits->GetNYHit();iy++) {
351     Iview=((fhits->GetYHit(iy))->fnpstrip)*2-2;
352     Nstrip=(Int_t)((fhits->GetYHit(iy))->fistrip)-1;
353     if(Nstrip<fNstrips_ladder) iladd=0;
354     if((Nstrip>=fNstrips_ladder)&&(Nstrip<2*fNstrips_ladder)) iladd=1;
355     if((Nstrip>=2*fNstrips_ladder)&&(Nstrip<3*fNstrips_ladder)) iladd=2;
356     ADCfull=AdcTrack[Iview][Nstrip] -= ((fhits->GetYHit(iy))->fqstrip)*fMipCor[iladd][Iview];
357     AdcTrack[Iview][Nstrip] *= SaturationTracky(ADCfull);
358     };
359    
360     CompressTrackData();
361     };
362     }
363    
364    
365     void PamVMCTrkDig::CompressTrackData(){
366    
367     // copy of the corresponding compression fortran routine + new digitization
368    
369     Int_t oldval=0;
370     Int_t newval=0;
371     Int_t trasmesso=0;
372     Int_t ntrastot=0;
373     Float_t real, inte;
374     Int_t cercacluster=0;
375     Int_t kt=0;
376     static const int DSPbufferSize = 4000; // 13 bit buffer to be rearranged in 16 bit Track buffer
377     UShort_t DataDSP[DSPbufferSize]; // 13 bit buffer to be rearranged in 16 bit Track buffer
378     UShort_t DSPlength; // 13 bit buffer to be rearranged in 16 bit Track buffer
379     UShort_t CheckSum, Nword, Dato, DATA, ReLength, OveCheckCode;
380     Int_t k, diff, clval, clvalp, klp, kl1, kl2, Bit16free, Bit13ToWrite;
381    
382    
383     for (Int_t iv=0; iv<fNviews;iv++) {
384     memset(DataDSP,0,sizeof(UShort_t)*DSPbufferSize);
385     DSPlength=16; // skip the header, to be written later
386     CheckSum=0;
387    
388     for (Int_t ladder=0; ladder<fNladder;ladder++) {
389     k=0;
390     while (k<fNstrips_ladder) {
391     // compress write in buffer the current LADDER
392     if ( k == 0) {
393     real=modff(AdcTrack[iv][ladder*fNstrips_ladder+k],&inte);
394     if (real > 0.5) inte=inte+1;
395     newval=(Int_t)inte -(Int_t)fPedeTrack[iv][ladder*fNstrips_ladder+k];
396     // first strip of ladder is transmitted
397     DataDSP[DSPlength]=( ((UShort_t)inte) & 0x0FFF);
398     DSPlength++;
399     ntrastot++;
400     trasmesso=1;
401     oldval=newval;
402     kt=k;
403     k++;
404     continue;
405     };
406     real=modff(AdcTrack[iv][ladder*fNstrips_ladder+k],&inte);
407     if (real > 0.5) inte=inte+1;
408     newval=(Int_t)inte -(Int_t)(fPedeTrack[iv][ladder*fNstrips_ladder+k]);
409    
410     cercacluster=1; //PAR?
411    
412     if (cercacluster==1) {
413    
414     diff=0;
415     switch ((iv+1)%2) {
416     case 0: diff=newval-oldval;
417     break;
418     case 1: diff=oldval-newval;
419     break;
420     };
421    
422    
423     if (diff>fCutclu*(Int_t)fabs(fSigmaTrack[iv][ladder*fNstrips_ladder+k]) ) {
424     clval=newval;
425     klp=k; // go on to search for maximum
426     klp++;
427    
428     while(klp<fNstrips_ladder) {
429     real=modff(AdcTrack[iv][ladder*fNstrips_ladder+klp],&inte);
430     if (real > 0.5) inte=inte+1;
431     clvalp=(Int_t)inte -(Int_t)fPedeTrack[iv][ladder*fNstrips_ladder+klp];
432     if((iv+1)%2==0) {
433    
434     if(clvalp>clval) {
435     clval=clvalp;
436     k=klp;}
437     else break; // max of cluster found
438    
439     } else {
440    
441     if(clvalp<clval) {
442     clval=clvalp;
443     k=klp;}
444     else break; // max of cluster found
445     };
446     klp++;
447     };
448    
449     kl1=k-fNclst; // max of cluster (or end of ladder ?)
450     trasmesso=0;
451     if(kl1<0) kl1=0;
452     if(kt>=kl1) kl1=kt+1;
453     if( (kt+1)==kl1 ) trasmesso=1;
454    
455     kl2=k+fNclst;
456     if(kl2>=fNstrips_ladder) kl2=fNstrips_ladder-1;
457    
458     for(Int_t klt=kl1 ; klt<=kl2 ; klt++) {
459     if(trasmesso==0) {
460    
461     DataDSP[DSPlength]=( ((UShort_t)klt) | 0x1000);
462     DSPlength++;
463     ntrastot++;
464    
465     real=modff(AdcTrack[iv][ladder*fNstrips_ladder+klt],&inte);
466     if (real > 0.5) inte=inte+1;
467     DataDSP[DSPlength]=( ((UShort_t)inte) & 0x0FFF);
468     DSPlength++;
469     ntrastot++;
470    
471     }
472     else {
473    
474     real=modff(AdcTrack[iv][ladder*fNstrips_ladder+klt],&inte);
475     if (real > 0.5) inte=inte+1;
476     DataDSP[DSPlength]=( ((UShort_t)inte) & 0x0FFF);
477     DSPlength++;
478     ntrastot++;
479     };
480     trasmesso=1;
481     }; // end trasmission
482     kt=kl2;
483     k=kl2;
484     real=modff(AdcTrack[iv][ladder*fNstrips_ladder+kt],&inte);
485     if (real > 0.5) inte=inte+1;
486     oldval=(Int_t)inte -(Int_t)fPedeTrack[iv][ladder*fNstrips_ladder+kt];
487     k++;
488     continue;
489     }
490     }//END cercacluster
491    
492     // start ZOP check for strips no
493    
494     if(abs(newval-oldval)>=fCutzop*(Int_t)fabs(fSigmaTrack[iv][ladder*fNstrips_ladder+k]) ) { if(trasmesso==0) {
495    
496     DataDSP[DSPlength]=( ((UShort_t)k) | 0x1000);
497     DSPlength++;
498     ntrastot++;
499    
500     real=modff(AdcTrack[iv][ladder*fNstrips_ladder+k],&inte);
501     if (real > 0.5) inte=inte+1;
502     DataDSP[DSPlength]=( ((UShort_t)inte) & 0x0FFF);
503     DSPlength++;
504     ntrastot++;
505    
506     } else {
507     real=modff(AdcTrack[iv][ladder*fNstrips_ladder+k],&inte);
508     if (real > 0.5) inte=inte+1;
509     DataDSP[DSPlength]=( ((UShort_t)inte) & 0x0FFF);
510     DSPlength++;
511     ntrastot++;
512     };
513     trasmesso=1;
514     oldval=newval;
515     kt=k;
516    
517     }
518     else trasmesso=0;
519     // end zop
520     k++;
521     };
522    
523     DataDSP[DSPlength]=( ((UShort_t)(ladder+1)) | 0x1800);
524     DSPlength++;
525     ntrastot++;
526     trasmesso=0;
527    
528     }; //end cycle inside dsp
529    
530     // here put DSP header
531     DataDSP[0]=(0x1CA0 | ((UShort_t)(iv+1)) );
532     Nword=(DSPlength*13)/16;
533     if( ((DSPlength*13)%16)!=0) Nword++;
534     DataDSP[1]=(0x1400 | ( Nword >> 10));
535     DataDSP[2]=(0x1400 | ( Nword & 0x03FF) );
536     DataDSP[3]=(0x1400 | (( (UShort_t)(fraw->GetCounter() >> 10) ) & 0x03FF) );
537     DataDSP[4]=(0x1400 | (( (UShort_t)(fraw->GetCounter()) ) & 0x03FF) );
538     DataDSP[5]=(0x1400 | ( (UShort_t)(fNclst << 7) ) | ( (UShort_t)(fCutzop << 4) )
539     | ( (UShort_t)fCutzop ) );
540     DataDSP[6]=0x1400;
541     DataDSP[7]=0x1400;
542     DataDSP[8]=0x1400;
543     DataDSP[9]=0x1400;
544     DataDSP[10]=0x1400;
545     DataDSP[11]=0x1400;
546     DataDSP[12]=0x1400;
547     DataDSP[13]=0x1400;
548     DataDSP[14]=(0x1400 | (CheckSum & 0x00FF) );
549     DataDSP[15]=0x1C00;
550     // end DSP header
551    
552     // write 13 bit DataDSP bufer inside 16 bit fDataTrack buffer
553    
554     Bit16free=16;
555     DATA = 0;
556     for (Int_t NDSP=0; NDSP<DSPlength;NDSP++) {
557     Bit13ToWrite=13;
558     while(Bit13ToWrite>0) {
559     if(Bit13ToWrite<=Bit16free) {
560     Dato=((DataDSP[NDSP]&(0xFFFF >> (16-Bit13ToWrite)))<<(Bit16free-Bit13ToWrite));
561     DATA = DATA | Dato ;
562     Bit16free=Bit16free-Bit13ToWrite;
563     Bit13ToWrite=0;
564     if(Bit16free==0) {
565     if(NDSP>15) CheckSum=CheckSum^DATA;
566     fData.push_back(DATA);
567     DATA = 0;
568     Bit16free=16;
569     };
570     }
571     else if(Bit13ToWrite>Bit16free) {
572     Dato=( (DataDSP[NDSP]&(0xFFFF >> (16-Bit13ToWrite) ) ) >> (Bit13ToWrite-Bit16free) );
573     DATA = DATA | Dato ;
574     fData.push_back(DATA);
575     if(NDSP>15) CheckSum=CheckSum^DATA;
576     DATA = 0;
577     Bit13ToWrite=Bit13ToWrite-Bit16free;
578     Bit16free=16;
579     };
580    
581     }; // end cycle while(Bit13ToWrite>0)
582    
583     }; // end cycle DataDSP
584    
585     if(Bit16free!=16) {
586     fData.push_back(DATA);
587     DATA= 0;
588     CheckSum=CheckSum^DATA;
589     };
590     CheckSum=(CheckSum >> 8)^(CheckSum&0x00FF);
591     fData.at(fData.size()-Nword+11)=(0x0280 | (CheckSum >> 3));
592     fData.at(fData.size()-Nword+12)=(0x1C00 | (CheckSum << 13) );
593    
594     // end write 13 bit DataDSP bufer inside 16 bit fDataTrack buffer
595    
596     //write trailer on buffer
597     ReLength=(UShort_t)((Nword+13)*2+3);
598     OveCheckCode=0x0000;
599     fData.push_back(0x0000);
600     fData.push_back((ReLength >> 8));
601     fData.push_back(( (ReLength << 8) | (OveCheckCode & 0x00FF) ));
602    
603     // end trailer
604    
605    
606     }//END VIEWS CYCLE
607    
608    
609     }
610    
611    
612     Float_t PamVMCTrkDig::SaturationTrackx(Float_t ADC) {
613     Float_t SatFact=1.;
614     if(ADC<1.) { SatFact=1./ADC; };
615     if(ADC>3000.) { SatFact=3000./ADC; };
616     return SatFact;
617     };
618    
619    
620     Float_t PamVMCTrkDig::SaturationTracky(Float_t ADC) {
621     Float_t SatFact=1.;
622     if(ADC<70.) { SatFact=70./ADC; };
623     if(ADC>4095.) { SatFact=4095./ADC; };
624     return SatFact;
625     };

  ViewVC Help
Powered by ViewVC 1.1.23