/[PAMELA software]/PamelaDigitizer/Digitizer.cxx
ViewVC logotype

Diff of /PamelaDigitizer/Digitizer.cxx

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 1.2 by orsi, Fri Sep 28 10:46:23 2007 UTC revision 1.6 by silvio, Wed Dec 5 13:02:50 2007 UTC
# Line 1  Line 1 
1  //               ------ PAMELA Digitizer ------  //               ------ PAMELA Digitizer ------
2  //  //
3  // Date, release and how-to: see file Pamelagp2Digits.cxx  // Date, release and how-to: see file Pamelagp2Digits.cxx
4  //  //
5  // NB: Check length physics packet [packet type (0x10 = physics data)]  // NB: Check length physics packet [packet type (0x10 = physics data)]
6  //  //
7  #include <sstream>  #include <sstream>
8  #include <fstream>  #include <fstream>
9  #include <stdlib.h>  #include <stdlib.h>
10  #include <stdio.h>  #include <stdio.h>
11  #include <string.h>  #include <string.h>
12  #include <ctype.h>  #include <ctype.h>
13  #include <time.h>  #include <time.h>
14  #include "Riostream.h"  #include "Riostream.h"
15  #include "TFile.h"  #include "TFile.h"
16  #include "TDirectory.h"  #include "TDirectory.h"
17  #include "TTree.h"  #include "TTree.h"
18  #include "TLeafI.h"  #include "TLeafI.h"
19  #include "TH1.h"  #include "TH1.h"
20  #include "TH2.h"  #include "TH2.h"
21  #include "TMath.h"  #include "TF1.h"
22  #include "TRandom.h"  #include "TMath.h"
23  #include "TSQLServer.h"  #include "TRandom.h"
24  #include "TSystem.h"  #include "TSQLServer.h"
25  //  #include "TSystem.h"
26  #include "Digitizer.h"  //
27  #include "CRC.h"  #include "Digitizer.h"
28  //  #include "CRC.h"
29  #include <PamelaRun.h>  //
30  #include <physics/calorimeter/CalorimeterEvent.h>  #include <PamelaRun.h>
31  #include <CalibCalPedEvent.h>  #include <physics/calorimeter/CalorimeterEvent.h>
32  #include "GLTables.h"  #include <CalibCalPedEvent.h>
33  //  #include "GLTables.h"
34  extern "C"{  //
35    short crc(short, short);  extern "C"{
36  };    short crc(short, short);
37  //  };
38    //
39  Digitizer::Digitizer(TTree* tree, char* &file_raw){  
40    fhBookTree = tree;  Digitizer::Digitizer(TTree* tree, char* &file_raw){
41    fFilename =  file_raw;    fhBookTree = tree;
42    fCounter = 0;    fFilename =  file_raw;
43    fOBT = 0;    fCounter = 0;
44      fCounterPhys = 0; // SO 5/12/'07
45    //    fOBT = 0;
46    // DB connections  
47    //    //
48    TString host = "mysql://localhost/pamelaprod";    // DB connections
49    TString user = "anonymous";    //
50    TString psw = "";    TString host = "mysql://localhost/pamelaprod";
51    //    TString user = "anonymous";
52    const char *pamdbhost=gSystem->Getenv("PAM_DBHOST");    TString psw = "";
53    const char *pamdbuser=gSystem->Getenv("PAM_DBUSER");    //
54    const char *pamdbpsw=gSystem->Getenv("PAM_DBPSW");    const char *pamdbhost=gSystem->Getenv("PAM_DBHOST");
55    if ( !pamdbhost ) pamdbhost = "";    const char *pamdbuser=gSystem->Getenv("PAM_DBUSER");
56    if ( !pamdbuser ) pamdbuser = "";    const char *pamdbpsw=gSystem->Getenv("PAM_DBPSW");
57    if ( !pamdbpsw ) pamdbpsw = "";    if ( !pamdbhost ) pamdbhost = "";
58    if ( strcmp(pamdbhost,"") ) host = pamdbhost;    if ( !pamdbuser ) pamdbuser = "";
59    if ( strcmp(pamdbuser,"") ) user = pamdbuser;    if ( !pamdbpsw ) pamdbpsw = "";
60    if ( strcmp(pamdbpsw,"") ) psw = pamdbpsw;    if ( strcmp(pamdbhost,"") ) host = pamdbhost;
61    fDbc = TSQLServer::Connect(host.Data(),user.Data(),psw.Data());    if ( strcmp(pamdbuser,"") ) user = pamdbuser;
62    //    if ( strcmp(pamdbpsw,"") ) psw = pamdbpsw;
63    GL_TABLES *glt = new GL_TABLES(host,user,psw);    fDbc = TSQLServer::Connect(host.Data(),user.Data(),psw.Data());
64    if ( glt->IsConnected(fDbc) ) printf("\n DB INFORMATION:\n SQL: %s Version: %s Host %s Port %i \n\n",fDbc->GetDBMS(),fDbc->ServerInfo(),fDbc->GetHost(),fDbc->GetPort());    //
65    //    GL_TABLES *glt = new GL_TABLES(host,user,psw);
66    // Use UTC in the DB and make timeout bigger    if ( glt->IsConnected(fDbc) ) printf("\n DB INFORMATION:\n SQL: %s Version: %s Host %s Port %i \n\n",fDbc->GetDBMS(),fDbc->ServerInfo(),fDbc->GetHost(),fDbc->GetPort());
67    //    //
68    stringstream myquery;    // Use UTC in the DB and make timeout bigger
69    myquery.str("");    //
70    myquery << "SET time_zone='+0:00'";    stringstream myquery;
71    fDbc->Query(myquery.str().c_str());    myquery.str("");
72    myquery.str("");    myquery << "SET time_zone='+0:00'";
73    myquery << "SET wait_timeout=173000;";    fDbc->Query(myquery.str().c_str());
74    fDbc->Query(myquery.str().c_str());    myquery.str("");
75    //    myquery << "SET wait_timeout=173000;";
76        fDbc->Query(myquery.str().c_str());
77    std:: cout << "preparing tree" << endl;    //
78      
79    // prepare tree    std:: cout << "preparing tree" << endl;
80    fhBookTree->SetBranchAddress("Irun",&Irun);  
81    fhBookTree->SetBranchAddress("Ievnt",&Ievnt);    // prepare tree
82    fhBookTree->SetBranchAddress("Ipa",&Ipa);    fhBookTree->SetBranchAddress("Irun",&Irun);
83    fhBookTree->SetBranchAddress("X0",&X0);    fhBookTree->SetBranchAddress("Ievnt",&Ievnt);
84    fhBookTree->SetBranchAddress("Y0",&Y0);    fhBookTree->SetBranchAddress("Ipa",&Ipa);
85    fhBookTree->SetBranchAddress("Z0",&Z0);    fhBookTree->SetBranchAddress("X0",&X0);
86    fhBookTree->SetBranchAddress("Theta",&Theta);    fhBookTree->SetBranchAddress("Y0",&Y0);
87    fhBookTree->SetBranchAddress("Phi",&Phi);    fhBookTree->SetBranchAddress("Z0",&Z0);
88    fhBookTree->SetBranchAddress("P0",&P0);    fhBookTree->SetBranchAddress("Theta",&Theta);
89    fhBookTree->SetBranchAddress("Nthtof",&Nthtof);    fhBookTree->SetBranchAddress("Phi",&Phi);
90    fhBookTree->SetBranchAddress("Ipltof",Ipltof);    fhBookTree->SetBranchAddress("P0",&P0);
91    fhBookTree->SetBranchAddress("Ipaddle",Ipaddle);    fhBookTree->SetBranchAddress("Nthtof",&Nthtof);
92    fhBookTree->SetBranchAddress("Ipartof",Ipartof);    fhBookTree->SetBranchAddress("Ipltof",Ipltof);
93    fhBookTree->SetBranchAddress("Xintof",Xintof);    fhBookTree->SetBranchAddress("Ipaddle",Ipaddle);
94    fhBookTree->SetBranchAddress("Yintof",Yintof);    fhBookTree->SetBranchAddress("Ipartof",Ipartof);
95    fhBookTree->SetBranchAddress("Zintof",Zintof);    fhBookTree->SetBranchAddress("Xintof",Xintof);
96    fhBookTree->SetBranchAddress("Xouttof",Xouttof);    fhBookTree->SetBranchAddress("Yintof",Yintof);
97    fhBookTree->SetBranchAddress("Youttof",Youttof);    fhBookTree->SetBranchAddress("Zintof",Zintof);
98    fhBookTree->SetBranchAddress("Zouttof",Zouttof);    fhBookTree->SetBranchAddress("Xouttof",Xouttof);
99    fhBookTree->SetBranchAddress("Ereltof",Ereltof);    fhBookTree->SetBranchAddress("Youttof",Youttof);
100    fhBookTree->SetBranchAddress("Timetof",Timetof);    fhBookTree->SetBranchAddress("Zouttof",Zouttof);
101    fhBookTree->SetBranchAddress("Pathtof",Pathtof);    fhBookTree->SetBranchAddress("Ereltof",Ereltof);
102    fhBookTree->SetBranchAddress("P0tof",P0tof);    fhBookTree->SetBranchAddress("Timetof",Timetof);
103    fhBookTree->SetBranchAddress("Nthcat",&Nthcat);    fhBookTree->SetBranchAddress("Pathtof",Pathtof);
104    fhBookTree->SetBranchAddress("Iparcat",Iparcat);    fhBookTree->SetBranchAddress("P0tof",P0tof);
105    fhBookTree->SetBranchAddress("Icat",Icat);    fhBookTree->SetBranchAddress("Nthcat",&Nthcat);
106    fhBookTree->SetBranchAddress("Xincat",Xincat);    fhBookTree->SetBranchAddress("Iparcat",Iparcat);
107    fhBookTree->SetBranchAddress("Yincat",Yincat);    fhBookTree->SetBranchAddress("Icat",Icat);
108    fhBookTree->SetBranchAddress("Zincat",Zincat);    fhBookTree->SetBranchAddress("Xincat",Xincat);
109    fhBookTree->SetBranchAddress("Xoutcat",Xoutcat);    fhBookTree->SetBranchAddress("Yincat",Yincat);
110    fhBookTree->SetBranchAddress("Youtcat",Youtcat);    fhBookTree->SetBranchAddress("Zincat",Zincat);
111    fhBookTree->SetBranchAddress("Zoutcat",Zoutcat);    fhBookTree->SetBranchAddress("Xoutcat",Xoutcat);
112    fhBookTree->SetBranchAddress("Erelcat",Erelcat);    fhBookTree->SetBranchAddress("Youtcat",Youtcat);
113    fhBookTree->SetBranchAddress("Timecat",Timecat);    fhBookTree->SetBranchAddress("Zoutcat",Zoutcat);
114    fhBookTree->SetBranchAddress("Pathcat",Pathcat);    fhBookTree->SetBranchAddress("Erelcat",Erelcat);
115    fhBookTree->SetBranchAddress("P0cat",P0cat);    fhBookTree->SetBranchAddress("Timecat",Timecat);
116    fhBookTree->SetBranchAddress("Nthcas",&Nthcas);    fhBookTree->SetBranchAddress("Pathcat",Pathcat);
117    fhBookTree->SetBranchAddress("Iparcas",Iparcas);    fhBookTree->SetBranchAddress("P0cat",P0cat);
118    fhBookTree->SetBranchAddress("Icas",Icas);    fhBookTree->SetBranchAddress("Nthcas",&Nthcas);
119    fhBookTree->SetBranchAddress("Xincas",Xincas);    fhBookTree->SetBranchAddress("Iparcas",Iparcas);
120    fhBookTree->SetBranchAddress("Yincas",Yincas);    fhBookTree->SetBranchAddress("Icas",Icas);
121    fhBookTree->SetBranchAddress("Zincas",Zincas);    fhBookTree->SetBranchAddress("Xincas",Xincas);
122    fhBookTree->SetBranchAddress("Xoutcas",Xoutcas);    fhBookTree->SetBranchAddress("Yincas",Yincas);
123    fhBookTree->SetBranchAddress("Youtcas",Youtcas);    fhBookTree->SetBranchAddress("Zincas",Zincas);
124    fhBookTree->SetBranchAddress("Zoutcas",Zoutcas);    fhBookTree->SetBranchAddress("Xoutcas",Xoutcas);
125    fhBookTree->SetBranchAddress("Erelcas",Erelcas);    fhBookTree->SetBranchAddress("Youtcas",Youtcas);
126    fhBookTree->SetBranchAddress("Timecas",Timecas);    fhBookTree->SetBranchAddress("Zoutcas",Zoutcas);
127    fhBookTree->SetBranchAddress("Pathcas",Pathcas);    fhBookTree->SetBranchAddress("Erelcas",Erelcas);
128    fhBookTree->SetBranchAddress("P0cas",P0cas);    fhBookTree->SetBranchAddress("Timecas",Timecas);
129    fhBookTree->SetBranchAddress("Nthspe",&Nthspe);    fhBookTree->SetBranchAddress("Pathcas",Pathcas);
130    fhBookTree->SetBranchAddress("Iparspe",Iparspe);    fhBookTree->SetBranchAddress("P0cas",P0cas);
131    fhBookTree->SetBranchAddress("Itrpb",Itrpb);    fhBookTree->SetBranchAddress("Nthspe",&Nthspe);
132    fhBookTree->SetBranchAddress("Itrsl",Itrsl);    fhBookTree->SetBranchAddress("Iparspe",Iparspe);
133    fhBookTree->SetBranchAddress("Itspa",Itspa);    fhBookTree->SetBranchAddress("Itrpb",Itrpb);
134    fhBookTree->SetBranchAddress("Xinspe",Xinspe);    fhBookTree->SetBranchAddress("Itrsl",Itrsl);
135    fhBookTree->SetBranchAddress("Yinspe",Yinspe);    fhBookTree->SetBranchAddress("Itspa",Itspa);
136    fhBookTree->SetBranchAddress("Zinspe",Zinspe);    fhBookTree->SetBranchAddress("Xinspe",Xinspe);
137    fhBookTree->SetBranchAddress("Xoutspe",Xoutspe);    fhBookTree->SetBranchAddress("Yinspe",Yinspe);
138    fhBookTree->SetBranchAddress("Youtspe",Youtspe);    fhBookTree->SetBranchAddress("Zinspe",Zinspe);
139    fhBookTree->SetBranchAddress("Zoutspe",Zoutspe);    fhBookTree->SetBranchAddress("Xoutspe",Xoutspe);
140    fhBookTree->SetBranchAddress("Xavspe",Xavspe);    fhBookTree->SetBranchAddress("Youtspe",Youtspe);
141    fhBookTree->SetBranchAddress("Yavspe",Yavspe);    fhBookTree->SetBranchAddress("Zoutspe",Zoutspe);
142    fhBookTree->SetBranchAddress("Zavspe",Zavspe);    fhBookTree->SetBranchAddress("Xavspe",Xavspe);
143    fhBookTree->SetBranchAddress("Erelspe",Erelspe);    fhBookTree->SetBranchAddress("Yavspe",Yavspe);
144    fhBookTree->SetBranchAddress("Pathspe",Pathspe);    fhBookTree->SetBranchAddress("Zavspe",Zavspe);
145    fhBookTree->SetBranchAddress("P0spe",P0spe);    fhBookTree->SetBranchAddress("Erelspe",Erelspe);
146    fhBookTree->SetBranchAddress("Nxmult",Nxmult);    fhBookTree->SetBranchAddress("Pathspe",Pathspe);
147    fhBookTree->SetBranchAddress("Nymult",Nymult);    fhBookTree->SetBranchAddress("P0spe",P0spe);
148    fhBookTree->SetBranchAddress("Nstrpx",&Nstrpx);    fhBookTree->SetBranchAddress("Nxmult",Nxmult);
149    fhBookTree->SetBranchAddress("Npstripx",Npstripx);    fhBookTree->SetBranchAddress("Nymult",Nymult);
150    fhBookTree->SetBranchAddress("Ntstripx",Ntstripx);    fhBookTree->SetBranchAddress("Nstrpx",&Nstrpx);
151    fhBookTree->SetBranchAddress("Istripx",Istripx);    fhBookTree->SetBranchAddress("Npstripx",Npstripx);
152    fhBookTree->SetBranchAddress("Qstripx",Qstripx);    fhBookTree->SetBranchAddress("Ntstripx",Ntstripx);
153    fhBookTree->SetBranchAddress("Xstripx",Xstripx);    fhBookTree->SetBranchAddress("Istripx",Istripx);
154    fhBookTree->SetBranchAddress("Nstrpy",&Nstrpy);    fhBookTree->SetBranchAddress("Qstripx",Qstripx);
155    fhBookTree->SetBranchAddress("Npstripy",Npstripy);    fhBookTree->SetBranchAddress("Xstripx",Xstripx);
156    fhBookTree->SetBranchAddress("Ntstripy",Ntstripy);    fhBookTree->SetBranchAddress("Nstrpy",&Nstrpy);
157    fhBookTree->SetBranchAddress("Istripy",Istripy);    fhBookTree->SetBranchAddress("Npstripy",Npstripy);
158    fhBookTree->SetBranchAddress("Qstripy",Qstripy);    fhBookTree->SetBranchAddress("Ntstripy",Ntstripy);
159    fhBookTree->SetBranchAddress("Ystripy",Ystripy);    fhBookTree->SetBranchAddress("Istripy",Istripy);
160    fhBookTree->SetBranchAddress("Nthcali",&Nthcali);    fhBookTree->SetBranchAddress("Qstripy",Qstripy);
161    fhBookTree->SetBranchAddress("Icaplane",Icaplane);    fhBookTree->SetBranchAddress("Ystripy",Ystripy);
162    fhBookTree->SetBranchAddress("Icastrip",Icastrip);    fhBookTree->SetBranchAddress("Nthcali",&Nthcali);
163    fhBookTree->SetBranchAddress("Icamod",Icamod);    fhBookTree->SetBranchAddress("Icaplane",Icaplane);
164    fhBookTree->SetBranchAddress("Enestrip",Enestrip);    fhBookTree->SetBranchAddress("Icastrip",Icastrip);
165    fhBookTree->SetBranchAddress("Nthcal",&Nthcal);    fhBookTree->SetBranchAddress("Icamod",Icamod);
166    fhBookTree->SetBranchAddress("Icapl",Icapl);    fhBookTree->SetBranchAddress("Enestrip",Enestrip);
167    fhBookTree->SetBranchAddress("Icasi",Icasi);    fhBookTree->SetBranchAddress("Nthcal",&Nthcal);
168    fhBookTree->SetBranchAddress("Icast",Icast);    fhBookTree->SetBranchAddress("Icapl",Icapl);
169    fhBookTree->SetBranchAddress("Xincal",Xincal);    fhBookTree->SetBranchAddress("Icasi",Icasi);
170    fhBookTree->SetBranchAddress("Yincal",Yincal);    fhBookTree->SetBranchAddress("Icast",Icast);
171    fhBookTree->SetBranchAddress("Zincal",Zincal);    fhBookTree->SetBranchAddress("Xincal",Xincal);
172    fhBookTree->SetBranchAddress("Erelcal",Erelcal);    fhBookTree->SetBranchAddress("Yincal",Yincal);
173    fhBookTree->SetBranchAddress("Nthnd",&Nthnd);    fhBookTree->SetBranchAddress("Zincal",Zincal);
174    fhBookTree->SetBranchAddress("Itubend",Itubend);    fhBookTree->SetBranchAddress("Erelcal",Erelcal);
175    fhBookTree->SetBranchAddress("Iparnd",Iparnd);    fhBookTree->SetBranchAddress("Nthnd",&Nthnd);
176    fhBookTree->SetBranchAddress("Xinnd",Xinnd);    fhBookTree->SetBranchAddress("Itubend",Itubend);
177    fhBookTree->SetBranchAddress("Yinnd",Yinnd);    fhBookTree->SetBranchAddress("Iparnd",Iparnd);
178    fhBookTree->SetBranchAddress("Zinnd",Zinnd);    fhBookTree->SetBranchAddress("Xinnd",Xinnd);
179    fhBookTree->SetBranchAddress("Xoutnd",Xoutnd);    fhBookTree->SetBranchAddress("Yinnd",Yinnd);
180    fhBookTree->SetBranchAddress("Youtnd",Youtnd);    fhBookTree->SetBranchAddress("Zinnd",Zinnd);
181    fhBookTree->SetBranchAddress("Zoutnd",Zoutnd);    fhBookTree->SetBranchAddress("Xoutnd",Xoutnd);
182    fhBookTree->SetBranchAddress("Erelnd",Erelnd);    fhBookTree->SetBranchAddress("Youtnd",Youtnd);
183    fhBookTree->SetBranchAddress("Timend",Timend);    fhBookTree->SetBranchAddress("Zoutnd",Zoutnd);
184    fhBookTree->SetBranchAddress("Pathnd",Pathnd);    fhBookTree->SetBranchAddress("Erelnd",Erelnd);
185    fhBookTree->SetBranchAddress("P0nd",P0nd);    fhBookTree->SetBranchAddress("Timend",Timend);
186    fhBookTree->SetBranchAddress("Nthcard",&Nthcard);    fhBookTree->SetBranchAddress("Pathnd",Pathnd);
187    fhBookTree->SetBranchAddress("Iparcard",Iparcard);    fhBookTree->SetBranchAddress("P0nd",P0nd);
188    fhBookTree->SetBranchAddress("Icard",Icard);    fhBookTree->SetBranchAddress("Nthcard",&Nthcard);
189    fhBookTree->SetBranchAddress("Xincard",Xincard);    fhBookTree->SetBranchAddress("Iparcard",Iparcard);
190    fhBookTree->SetBranchAddress("Yincard",Yincard);    fhBookTree->SetBranchAddress("Icard",Icard);
191    fhBookTree->SetBranchAddress("Zincard",Zincard);    fhBookTree->SetBranchAddress("Xincard",Xincard);
192    fhBookTree->SetBranchAddress("Xoutcard",Xoutcard);    fhBookTree->SetBranchAddress("Yincard",Yincard);
193    fhBookTree->SetBranchAddress("Youtcard",Youtcard);    fhBookTree->SetBranchAddress("Zincard",Zincard);
194    fhBookTree->SetBranchAddress("Zoutcard",Zoutcard);    fhBookTree->SetBranchAddress("Xoutcard",Xoutcard);
195    fhBookTree->SetBranchAddress("Erelcard",Erelcard);    fhBookTree->SetBranchAddress("Youtcard",Youtcard);
196    fhBookTree->SetBranchAddress("Timecard",Timecard);    fhBookTree->SetBranchAddress("Zoutcard",Zoutcard);
197    fhBookTree->SetBranchAddress("Pathcard",Pathcard);    fhBookTree->SetBranchAddress("Erelcard",Erelcard);
198    fhBookTree->SetBranchAddress("P0card",P0card);    fhBookTree->SetBranchAddress("Timecard",Timecard);
199      fhBookTree->SetBranchAddress("Pathcard",Pathcard);
200    fhBookTree->SetBranchStatus("*",0);    fhBookTree->SetBranchAddress("P0card",P0card);
201    
202  };    fhBookTree->SetBranchStatus("*",0);
203    
204    };
205    
206  void Digitizer::Close(){  
207    
208    delete fhBookTree;  void Digitizer::Close(){
209    
210  };    delete fhBookTree;
211    
212    };
213    
214    
215  void Digitizer::Loop() {  
216    //  
217    // opens the raw output file and loops over the events  void Digitizer::Loop() {
218    //    //
219    fOutputfile.open(fFilename, ios::out | ios::binary);    // opens the raw output file and loops over the events
220    //fOutputfile.open(Form("Output%s",fFilename), ios::out | ios::binary);    //
221    //    fOutputfile.open(fFilename, ios::out | ios::binary);
222    // Load in memory and save at the beginning of file the calorimeter calibration    //fOutputfile.open(Form("Output%s",fFilename), ios::out | ios::binary);
223    //    //
224    CaloLoadCalib();    // Load in memory and save at the beginning of file the calorimeter calibration
225    DigitizeCALOCALIB();    //
226      CaloLoadCalib();
227    //  load, digitize and write tracker calibration    DigitizeCALOCALIB();
228    LoadTrackCalib();  
229        //  load, digitize and write tracker calibration
230    DigitizeTrackCalib(1);    LoadTrackCalib();
231    UInt_t length=fTracklength*2;    
232    DigitizePSCU(length,0x12);    DigitizeTrackCalib(1);
233    AddPadding();    UInt_t length=fTracklength*2;
234    WriteTrackCalib();    DigitizePSCU(length,0x12,fDataPSCU);
235        AddPadding();
236    DigitizeTrackCalib(2);    WriteTrackCalib();
237    length=fTracklength*2;    
238    DigitizePSCU(length,0x13);    DigitizeTrackCalib(2);
239    AddPadding();    length=fTracklength*2;
240    WriteTrackCalib();    DigitizePSCU(length,0x13,fDataPSCU);
241        AddPadding();
242    LoadMipCor();  // some initialization of parameters -not used now-    WriteTrackCalib();
243    //  end loading, digitizing and writing tracker calibration  
244      DigitizeRunHeader();
245    //    WriteRunHeader();
246    // loops over the events  
247    //    LoadMipCor();  // some initialization of parameters -not used now-
248        //  end loading, digitizing and writing tracker calibration
249    Int_t nentries = fhBookTree->GetEntriesFast();  
250    Long64_t nbytes = 0;    //
251    for (Int_t i=0; i<nentries;i++) {    // loops over the events
252      //    //
253      nbytes += fhBookTree->GetEntry(i);    
254      // read detectors sequentially:    Int_t nentries = fhBookTree->GetEntriesFast();
255      // http://www.ts.infn.it/fileadmin/documents/physics/experiments/wizard/cpu/gen_arch/RM_Acquisition.pdf    Long64_t nbytes = 0;
256      // on pamelatov:    for (Int_t i=0; i<nentries;i++) {
257      // /cvs/yoda/techmodel/physics/NeutronDetectorReader.cpp      //
258      DigitizeTRIGGER();      nbytes += fhBookTree->GetEntry(i);
259      DigitizeTOF();      // read detectors sequentially:
260      DigitizeAC();      // http://www.ts.infn.it/fileadmin/documents/physics/experiments/wizard/cpu/gen_arch/RM_Acquisition.pdf
261      DigitizeCALO();      // on pamelatov: /cvs/yoda/techmodel/physics/NeutronDetectorReader.cpp
262      DigitizeTrack();      //DigitizeTRIGGER();
263      //DigitizeS4();      DigitizeTOF();
264      DigitizeND();      DigitizeAC();
265        //      DigitizeCALO();
266      // Add padding to 64 bits      DigitizeTrack();
267      //      DigitizeS4();
268      AddPadding();      DigitizeND();
269  //      //
270      // Create CPU header, we need packet type (0x10 = physics data) and packet length.      // Add padding to 64 bits
271      //      //
272      //UInt_t length=2*(fCALOlength+fACbuffer+fTracklength+fNDbuffer+fS4buffer)+fPadding+fTOFbuffer+fTRIGGERbuffer;      AddPadding();
273      UInt_t length=2*(fCALOlength+fACbuffer+fTracklength+fNDbuffer)+fPadding+fTOFbuffer+fTRIGGERbuffer;      //
274      DigitizePSCU(length,0x10);      // Create CPU header, we need packet type (0x10 = physics data) and packet length.
275      if ( !i%100 ) std::cout << "writing event " << i << endl;      //
276      WriteData();      UInt_t length=2*(fCALOlength+fACbuffer+fTracklength+fNDbuffer+fS4buffer)+fPadding+fTOFbuffer+fTRIGGERbuffer;
277    };      //UInt_t length=2*(fCALOlength+fACbuffer+fTracklength+fNDbuffer)+fPadding+fTOFbuffer+fTRIGGERbuffer;
278        DigitizePSCU(length,0x10,fDataPSCU);
279    fOutputfile.close();      if ( !i%100 ) std::cout << "writing event " << i << endl;
280    std::cout << "files closed" << endl << flush;      WriteData();
281      };
282  };  
283      DigitizeRunTrailer();
284  void Digitizer::AddPadding(){    WriteRunTrailer();
285    //  
286    Float_t pd0 = (fLen+16)/64.;    fOutputfile.close();
287    Float_t pd1 = pd0 - (Float_t)int(pd0);    std::cout << "files closed" << endl << flush;
288    Float_t padfrac = 64. - pd1 * 64.;  
289    //  };
290    UInt_t padbytes = (UInt_t)padfrac;  
291    if ( padbytes > 0 && padbytes < 64 ){  void Digitizer::DigitizeRunHeader(){
292      //    const Int_t lenRH = fRunHeaderbuffer*2;
293      // here the padding length    UChar_t buffRH[lenRH];
294      //    UShort_t buffPSCU[8];
295      fPadding = padbytes+64;    UChar_t *p;
296      //    p=buffRH;
297      // random padding bytes  
298      //    // header: 16 bytes
299      for (Int_t ur=0; ur<32; ur++){    DigitizePSCU(fRunHeaderbuffer*2,0x20,buffPSCU);
300        fDataPadding[ur] = (UShort_t)rand();    memcpy(p,buffPSCU,16*sizeof(UChar_t));
301      };    p+=16;
302    };  
303  };    // time stamp (uint32): 0x82569c97
304      *(p++) = 0x82;
305      *(p++) = 0x56;
306  void Digitizer::DigitizePSCU(UInt_t length, UChar_t type) {    *(p++) = 0x9C;
307    //    *(p++) = 0x97;
308    UChar_t buff[16];  
309    //    // acq_setting_mode (uint8)
310    // CPU signature    *(p++) = 2;
311    //    
312    buff[0] = 0xFA;    // obt (uint32)
313    buff[1] = 0xFE;    ULong64_t obt = fOBT + 30LL;
314    buff[2] = 0xDE;    while ( obt > 4294967295LL )
315    //      obt -= 4294967295LL;
316    // packet type (twice)    fOBT = (UInt_t)obt;
317    //    //
318    buff[3] = type;    *(p++) = (UChar_t)(fOBT >> 24);
319    buff[4] = type;    *(p++) = (UChar_t)(fOBT >> 16);
320    //    *(p++) = (UChar_t)(fOBT >> 8);
321    // counter    *(p++) = (UChar_t)fOBT;
322    //  
323    fCounter++;    // last time_sync_info (uint32)  (from file 000_001_00110)
324    while ( fCounter > 16777215 ){    *(p++) = 0x00;
325      fCounter -= 16777215;    *(p++) = 0x08;
326    };    *(p++) = 0x68;
327    //    *(p++) = 0xEF;
328    buff[5] = (UChar_t)(fCounter >> 16);  
329    buff[6] = (UChar_t)(fCounter >> 8);    // fav. working schedule (uint8)
330    buff[7] = (UChar_t)fCounter;    *(p++) = 0;
331    //  
332    // on board time    // eff. working schedule (uint8)
333    //    *(p++) = 0;
334    ULong64_t obt = fOBT + 30LL;  
335    //    // trigger_mode_A (uint32)
336    while ( obt > 4294967295LL ){    *(p++) = 0;
337      obt -= 4294967295LL;    *(p++) = 0;
338    };    *(p++) = 0;
339    fOBT = (UInt_t)obt;    *(p++) = 0x01;
340    //  
341    buff[8] = (UChar_t)(fOBT >> 24);    // trigger_mode_B (uint32)
342    buff[9] = (UChar_t)(fOBT >> 16);    *(p++) = 0;
343    buff[10] = (UChar_t)(fOBT >> 8);    *(p++) = 0;
344    buff[11] = (UChar_t)fOBT;    *(p++) = 0;
345    //    *(p++) = 0x03;
346    // Packet length  
347    //    // acq_after_calib (0,1) (uint8)
348    fLen = length;    *(p++) = 0;
349    //  
350    buff[12] = (UChar_t)(fLen >> 16);    // trk_calib_used (uint32)
351    buff[13] = (UChar_t)(fLen >> 8);    *(p++) = 0;
352    buff[14] = (UChar_t)fLen;    *(p++) = 0;
353    //    *(p++) = 0;
354    // CPU header CRC    *(p++) = 0x68;
355    //  
356    buff[15] = (BYTE)CM_Compute_CRC16((UINT16)0, (BYTE*)&buff, (UINT32)15);    // acq_build_info (4 zero bits + 28 1's) (uint32)
357    //    *(p++) = 0x3F;
358    memcpy(fDataPSCU,buff,16*sizeof(UChar_t));    *(p++) = 0xFF;
359    //    *(p++) = 0xFF;
360  };    *(p++) = 0xFF;
361    
362  void Digitizer::ClearCaloCalib(Int_t s){    // acq_var_info (11 bits) (uint16)
363    //    *(p++) = 0x23;
364    fcstwerr[s] = 0;    *(p++) = 0x7F;
365    fcperror[s] = 0.;  
366    for ( Int_t d=0 ; d<11 ;d++  ){    // cal_dsp_mask (uint8)
367      Int_t pre = -1;    *(p++) = 0;
368      for ( Int_t j=0; j<96 ;j++){  
369        if ( j%16 == 0 ) pre++;    // crc (uint16)
370        fcalped[s][d][j] = 0.;    UShort_t crcRH = (UShort_t)CM_Compute_CRC16((UINT16)0, (BYTE*)&buffRH, (UINT32)(fRunHeaderbuffer*2-2));
371        fcstwerr[s] = 0.;    *(p++) = (UChar_t)(crcRH << 8);
372        fcperror[s] = 0.;    *p = (UChar_t)crcRH;
373        fcalgood[s][d][j] = 0.;  
374        fcalthr[s][d][pre] = 0.;    memcpy(fDataRunHeader,buffRH,fRunHeaderbuffer*sizeof(UShort_t));
375        fcalrms[s][d][j] = 0.;  };
376        fcalbase[s][d][pre] = 0.;  
377        fcalvar[s][d][pre] = 0.;  void Digitizer::DigitizeRunTrailer(){
378      };    UChar_t buffRT[fRunTrailerbuffer*2];
379    };    UShort_t buffPSCU[8];
380    return;    UChar_t *p;
381  }    p=buffRT;
382    
383  Int_t Digitizer::CaloLoadCalib(Int_t s,TString fcalname, UInt_t calibno){    // header: 16 bytes
384    //    DigitizePSCU(fRunHeaderbuffer*2,0x21,buffPSCU);
385    //    memcpy(p,buffPSCU,16*sizeof(UChar_t));
386    UInt_t e = 0;    p+=16;
387    if ( s == 0 ) e = 0;  
388    if ( s == 1 ) e = 2;    // pkt_counter (uint32)
389    if ( s == 2 ) e = 3;    fCounterPhys++;
390    if ( s == 3 ) e = 1;    fCounter++;
391    //    while ( fCounterPhys > 16777215 )
392    ifstream myfile;      fCounterPhys -= 16777215;
393    myfile.open(fcalname.Data());    //
394    if ( !myfile ){        *(p++) = (UChar_t)(fCounterPhys >> 24);
395      return(-107);    *(p++) = (UChar_t)(fCounterPhys >> 16);
396    };    *(p++) = (UChar_t)(fCounterPhys >> 8);
397    myfile.close();    *(p++) = (UChar_t)fCounterPhys;
398    //  
399    TFile *File = new TFile(fcalname.Data());    // pkt_readyCounter: valid packets in the run (uint32)
400    if ( !File ) return(-108);    *(p++) = 0;
401    TTree *tr = (TTree*)File->Get("CalibCalPed");    *(p++) = 0;
402    if ( !tr ) return(-109);    *(p++) = 0;
403    //    *(p++) = 0;
404    TBranch *calo = tr->GetBranch("CalibCalPed");  
405    //    // obt (uint32)
406    pamela::CalibCalPedEvent *ce = 0;    ULong64_t obt = fOBT + 30LL;
407    tr->SetBranchAddress("CalibCalPed", &ce);    while ( obt > 4294967295LL )
408    //      obt -= 4294967295LL;
409    Long64_t ncalibs = calo->GetEntries();    fOBT = (UInt_t)obt;
410    //    //
411    if ( !ncalibs ) return(-110);    *(p++) = (UChar_t)(fOBT >> 24);
412    //    *(p++) = (UChar_t)(fOBT >> 16);
413    calo->GetEntry(calibno);    *(p++) = (UChar_t)(fOBT >> 8);
414    //    *(p++) = (UChar_t)fOBT;
415    if (ce->cstwerr[s] != 0 && ce->cperror[s] == 0 ) {  
416      fcstwerr[s] = ce->cstwerr[s];    // last time_sync_info (uint32)
417      fcperror[s] = ce->cperror[s];    *(p++) = 0;
418      for ( Int_t d=0 ; d<11 ;d++  ){    *(p++) = 0;
419        Int_t pre = -1;    *(p++) = 0;
420        for ( Int_t j=0; j<96 ;j++){    *(p++) = 0;
421          if ( j%16 == 0 ) pre++;  
422          fcalped[s][d][j] = ce->calped[e][d][j];    // crc (uint16)
423          fcalgood[s][d][j] = ce->calgood[e][d][j];    UShort_t crcRT = (UShort_t)CM_Compute_CRC16((UINT16)0, (BYTE*)(buffRT), (UINT32)(fRunTrailerbuffer*2-2));
424          fcalthr[s][d][pre] = ce->calthr[e][d][pre];    *(p++) = (UChar_t)(crcRT << 8);
425          fcalrms[s][d][j] = ce->calrms[e][d][j];    *p = (UChar_t)crcRT;
426          fcalbase[s][d][pre] = ce->calbase[e][d][pre];  
427          fcalvar[s][d][pre] = ce->calvar[e][d][pre];    memcpy(fDataRunTrailer,buffRT,fRunTrailerbuffer*sizeof(UShort_t));
428        };  };
429      };  
430    } else {  void Digitizer::AddPadding(){
431      printf(" CALORIMETER - ERROR: problems finding a good calibration in this file! \n\n ");    //
432      File->Close();    Float_t pd0 = (fLen+16)/64.;
433      return(-111);    Float_t pd1 = pd0 - (Float_t)int(pd0);
434    };    Float_t padfrac = 64. - pd1 * 64.;
435    File->Close();    //
436    return(0);    UInt_t padbytes = (UInt_t)padfrac;
437  }    if ( padbytes > 0 && padbytes < 64 ){
438        //
439        // here the padding length
440  void Digitizer::DigitizeCALOCALIB() {      //
441    //      fPadding = padbytes+64;
442    // Header of the four sections      //
443    //      // random padding bytes
444    fSecCalo[0] = 0xAA00; // XE      //
445    fSecCalo[1] = 0xB100; // XO      for (Int_t ur=0; ur<32; ur++){
446    fSecCalo[2] = 0xB600; // YE        fDataPadding[ur] = (UShort_t)rand();
447    fSecCalo[3] = 0xAD00; // YO      };
448    //    };
449    // length of the data is 0x1215  };
450    //  
451    fSecCALOLength[0] = 0x1215; // XE  
452    fSecCALOLength[1] = 0x1215; // XO  void Digitizer::DigitizePSCU(UInt_t length, UChar_t type, UShort_t *pPSCU) {
453    fSecCALOLength[2] = 0x1215; // YE    //
454    fSecCALOLength[3] = 0x1215; // YO    UChar_t buff[16];
455    //    //
456    Int_t chksum = 0;    // CPU signature
457    UInt_t tstrip = 0;    //  
458    UInt_t fSecPointer = 0;    buff[0] = 0xFA;
459    //    buff[1] = 0xFE;
460    for (Int_t sec=0; sec < 4; sec++){    buff[2] = 0xDE;
461      //    //
462      // sec =    0 -> XE      1 -> XO        2-> YE         3 -> YO    // packet type (twice)
463      //    //
464      fCALOlength = 0;    buff[3] = type;
465      memset(fDataCALO,0,sizeof(UShort_t)*fCALObuffer);    buff[4] = type;
466      fSecPointer = fCALOlength;    //
467      //    // counter
468      // First of all we have section header and packet length    //
469      //    fCounter++;
470      fDataCALO[fCALOlength] = fSecCalo[sec];    while ( fCounter > 16777215 ){
471      fCALOlength++;      fCounter -= 16777215;
472      fDataCALO[fCALOlength] = fSecCALOLength[sec];    };
473      fCALOlength++;    //
474      //    buff[5] = (UChar_t)(fCounter >> 16);
475      // Section XO is read in the opposite direction respect to the others    buff[6] = (UChar_t)(fCounter >> 8);
476      //    buff[7] = (UChar_t)fCounter;
477      chksum = 0;    //
478      //    // on board time
479      for (Int_t plane=0; plane < 11; plane++){    //
480        //    ULong64_t obt = fOBT + 30LL;
481        if ( sec == 1 ) tstrip = fCALOlength + 96*2;    //
482        //    while ( obt > 4294967295LL ){
483        for (Int_t strip=0; strip < 96; strip++){        obt -= 4294967295LL;
484          //    };
485          chksum += (Int_t)fcalped[sec][plane][strip];    fOBT = (UInt_t)obt;
486          //    //
487          // save value    buff[8] = (UChar_t)(fOBT >> 24);
488          //    buff[9] = (UChar_t)(fOBT >> 16);
489          if ( sec == 1 ){    buff[10] = (UChar_t)(fOBT >> 8);
490            tstrip -= 2;    buff[11] = (UChar_t)fOBT;
491            fDataCALO[tstrip] = (Int_t)fcalped[sec][plane][strip];    //
492            fDataCALO[tstrip+1] = (Int_t)fcalgood[sec][plane][strip];    // Packet length
493          } else {    //
494            fDataCALO[fCALOlength] = (Int_t)fcalped[sec][plane][strip];    fLen = length;
495            fDataCALO[fCALOlength+1] = (Int_t)fcalgood[sec][plane][strip];    //
496          };    buff[12] = (UChar_t)(fLen >> 16);
497          fCALOlength +=2;    buff[13] = (UChar_t)(fLen >> 8);
498        };    buff[14] = (UChar_t)fLen;
499        //    //
500      };    // CPU header CRC
501      //    //
502      fDataCALO[fCALOlength] = (UShort_t)chksum;    buff[15] = (BYTE)CM_Compute_CRC16((UINT16)0, (BYTE*)&buff, (UINT32)15);
503      fCALOlength++;    //
504      fDataCALO[fCALOlength] = 0;    //memcpy(fDataPSCU,buff,16*sizeof(UChar_t));
505      fCALOlength++;    memcpy(pPSCU,buff,16*sizeof(UChar_t));
506      fDataCALO[fCALOlength] = (UShort_t)((Int_t)(chksum >> 16));    //
507      fCALOlength++;  };
508      //  
509      // Section XO is read in the opposite direction respect to the others  void Digitizer::ClearCaloCalib(Int_t s){
510      //    //
511      chksum = 0;    fcstwerr[s] = 0;
512      //    fcperror[s] = 0.;
513      for (Int_t plane=0; plane < 11; plane++){    for ( Int_t d=0 ; d<11 ;d++  ){
514        //      Int_t pre = -1;
515        if ( sec == 1 ) tstrip = fCALOlength+6*2;      for ( Int_t j=0; j<96 ;j++){
516        //        if ( j%16 == 0 ) pre++;
517        for (Int_t strip=0; strip < 6; strip++){        fcalped[s][d][j] = 0.;
518          //        fcstwerr[s] = 0.;
519          chksum += (Int_t)fcalthr[sec][plane][strip];        fcperror[s] = 0.;
520          //        fcalgood[s][d][j] = 0.;
521          // save value        fcalthr[s][d][pre] = 0.;
522          //        fcalrms[s][d][j] = 0.;
523          if ( sec == 1 ){        fcalbase[s][d][pre] = 0.;
524            tstrip -= 2;        fcalvar[s][d][pre] = 0.;
525            fDataCALO[tstrip] = 0;      };
526            fDataCALO[tstrip+1] = (Int_t)fcalthr[sec][plane][strip];    };
527          } else {    return;
528            fDataCALO[fCALOlength] = 0;  }
529            fDataCALO[fCALOlength+1] = (Int_t)fcalthr[sec][plane][strip];  
530          };  Int_t Digitizer::CaloLoadCalib(Int_t s,TString fcalname, UInt_t calibno){
531          fCALOlength +=2;    //
532        };    //
533        //    UInt_t e = 0;
534      };    if ( s == 0 ) e = 0;
535      //    if ( s == 1 ) e = 2;
536      fDataCALO[fCALOlength] = 0;    if ( s == 2 ) e = 3;
537      fCALOlength++;    if ( s == 3 ) e = 1;
538      fDataCALO[fCALOlength] = (UShort_t)chksum;    //
539      fCALOlength++;    ifstream myfile;
540      fDataCALO[fCALOlength] = 0;    myfile.open(fcalname.Data());
541      fCALOlength++;    if ( !myfile ){    
542      fDataCALO[fCALOlength] = (UShort_t)((Int_t)(chksum >> 16));      return(-107);
543      fCALOlength++;    };
544      //    myfile.close();
545      // Section XO is read in the opposite direction respect to the others    //
546      //    TFile *File = new TFile(fcalname.Data());
547      for (Int_t plane=0; plane < 11; plane++){    if ( !File ) return(-108);
548        //    TTree *tr = (TTree*)File->Get("CalibCalPed");
549        if ( sec == 1 ) tstrip = fCALOlength+96*2;    if ( !tr ) return(-109);
550        //    //
551        for (Int_t strip=0; strip < 96; strip++){    TBranch *calo = tr->GetBranch("CalibCalPed");
552          //    //
553          // save value    pamela::CalibCalPedEvent *ce = 0;
554          //    tr->SetBranchAddress("CalibCalPed", &ce);
555          if ( sec == 1 ){    //
556            tstrip -= 2;    Long64_t ncalibs = calo->GetEntries();
557            fDataCALO[tstrip] = 0;    //
558            fDataCALO[tstrip+1] = (Int_t)fcalrms[sec][plane][strip];    if ( !ncalibs ) return(-110);
559          } else {    //
560            fDataCALO[fCALOlength] = 0;    calo->GetEntry(calibno);
561            fDataCALO[fCALOlength+1] = (Int_t)fcalrms[sec][plane][strip];    //
562          };    if (ce->cstwerr[s] != 0 && ce->cperror[s] == 0 ) {
563          fCALOlength += 2;      fcstwerr[s] = ce->cstwerr[s];
564        };      fcperror[s] = ce->cperror[s];
565        //      for ( Int_t d=0 ; d<11 ;d++  ){
566      };            Int_t pre = -1;
567      //        for ( Int_t j=0; j<96 ;j++){
568      // Section XO is read in the opposite direction respect to the others          if ( j%16 == 0 ) pre++;
569      //          fcalped[s][d][j] = ce->calped[e][d][j];
570      for (Int_t plane=0; plane < 11; plane++){          fcalgood[s][d][j] = ce->calgood[e][d][j];
571        //          fcalthr[s][d][pre] = ce->calthr[e][d][pre];
572        if ( sec == 1 ) tstrip = fCALOlength+6*4;          fcalrms[s][d][j] = ce->calrms[e][d][j];
573        //          fcalbase[s][d][pre] = ce->calbase[e][d][pre];
574        for (Int_t strip=0; strip < 6; strip++){          fcalvar[s][d][pre] = ce->calvar[e][d][pre];
575          //        };
576          // save value      };
577          //    } else {
578          if ( sec == 1 ){      printf(" CALORIMETER - ERROR: problems finding a good calibration in this file! \n\n ");
579            tstrip -= 4;      File->Close();
580            fDataCALO[tstrip] = 0;      return(-111);
581            fDataCALO[tstrip+1] = (Int_t)fcalbase[sec][plane][strip];    };
582            fDataCALO[tstrip+2] = 0;    File->Close();
583            fDataCALO[tstrip+3] = (Int_t)fcalvar[sec][plane][strip];    return(0);
584          } else {  }
585            fDataCALO[fCALOlength] = 0;  
586            fDataCALO[fCALOlength+1] = (Int_t)fcalbase[sec][plane][strip];  
587            fDataCALO[fCALOlength+2] = 0;  void Digitizer::DigitizeCALOCALIB() {
588            fDataCALO[fCALOlength+3] = (Int_t)fcalvar[sec][plane][strip];    //
589          };    // Header of the four sections
590          fCALOlength +=4;    //
591        };    fSecCalo[0] = 0xAA00; // XE
592        //    fSecCalo[1] = 0xB100; // XO
593      };          fSecCalo[2] = 0xB600; // YE
594      //    fSecCalo[3] = 0xAD00; // YO
595      //    //
596      // here we calculate and save the CRC    // length of the data is 0x1215
597      //    //
598      fDataCALO[fCALOlength] = 0;    fSecCALOLength[0] = 0x1215; // XE
599      fCALOlength++;    fSecCALOLength[1] = 0x1215; // XO
600      Short_t CRC = 0;    fSecCALOLength[2] = 0x1215; // YE
601      for (UInt_t i=0; i<(fCALOlength-fSecPointer); i++){    fSecCALOLength[3] = 0x1215; // YO
602        CRC=crc(CRC,fDataCALO[i+fSecPointer]);    //
603      };    Int_t chksum = 0;
604      fDataCALO[fCALOlength] = (UShort_t)CRC;    UInt_t tstrip = 0;
605      fCALOlength++;    UInt_t fSecPointer = 0;
606      //    //
607      UInt_t length=fCALOlength*2;    for (Int_t sec=0; sec < 4; sec++){
608      DigitizePSCU(length,0x18);      //
609      //      // sec =    0 -> XE      1 -> XO        2-> YE         3 -> YO
610      // Add padding to 64 bits      //
611      //      fCALOlength = 0;
612      AddPadding();      memset(fDataCALO,0,sizeof(UShort_t)*fCALObuffer);
613      //      fSecPointer = fCALOlength;
614      fOutputfile.write(reinterpret_cast<char*>(fDataPSCU),sizeof(UShort_t)*fPSCUbuffer);      //
615      UShort_t temp[1000000];      // First of all we have section header and packet length
616      memset(temp,0,sizeof(UShort_t)*1000000);      //
617      swab(fDataCALO,temp,sizeof(UShort_t)*fCALOlength);  // WE MUST SWAP THE BYTES!!!      fDataCALO[fCALOlength] = fSecCalo[sec];
618      fOutputfile.write(reinterpret_cast<char*>(temp),sizeof(UShort_t)*fCALOlength);      fCALOlength++;
619      //      fDataCALO[fCALOlength] = fSecCALOLength[sec];
620      // padding to 64 bytes      fCALOlength++;
621      //      //
622      if ( fPadding ){      // Section XO is read in the opposite direction respect to the others
623        fOutputfile.write(reinterpret_cast<char*>(fDataPadding),sizeof(UChar_t)*fPadding);      //
624      };      chksum = 0;
625      //      //
626      //          for (Int_t plane=0; plane < 11; plane++){
627    };        //
628    //        if ( sec == 1 ) tstrip = fCALOlength + 96*2;
629  };        //
630          for (Int_t strip=0; strip < 96; strip++){  
631  void Digitizer::CaloLoadCalib() {          //
632    //          chksum += (Int_t)fcalped[sec][plane][strip];
633    fGivenCaloCalib = 0; //                                  ####@@@@ should be given as input par @@@@####          //
634    //          // save value
635    // first of all load the MIP to ADC conversion values          //
636    //          if ( sec == 1 ){
637    stringstream calfile;            tstrip -= 2;
638    Int_t error = 0;            fDataCALO[tstrip] = (Int_t)fcalped[sec][plane][strip];
639    GL_PARAM *glparam = new GL_PARAM();            fDataCALO[tstrip+1] = (Int_t)fcalgood[sec][plane][strip];
640    //          } else {
641    // determine where I can find calorimeter ADC to MIP conversion file              fDataCALO[fCALOlength] = (Int_t)fcalped[sec][plane][strip];
642    //            fDataCALO[fCALOlength+1] = (Int_t)fcalgood[sec][plane][strip];
643    error = 0;          };
644    error = glparam->Query_GL_PARAM(3,101,fDbc);          fCALOlength +=2;
645    //        };
646    calfile.str("");        //
647    calfile << glparam->PATH.Data() << "/";      };
648    calfile << glparam->NAME.Data();      //
649    //      fDataCALO[fCALOlength] = (UShort_t)chksum;
650    printf("\n Using Calorimeter ADC to MIP conversion file: \n %s \n",calfile.str().c_str());      fCALOlength++;
651    FILE *f;      fDataCALO[fCALOlength] = 0;
652    f = fopen(calfile.str().c_str(),"rb");      fCALOlength++;
653    //      fDataCALO[fCALOlength] = (UShort_t)((Int_t)(chksum >> 16));
654    memset(fCalomip,0,4224*sizeof(fCalomip[0][0][0]));      fCALOlength++;
655    //      //
656    for (Int_t m = 0; m < 2 ; m++ ){      // Section XO is read in the opposite direction respect to the others
657      for (Int_t k = 0; k < 22; k++ ){      //
658        for (Int_t l = 0; l < 96; l++ ){      chksum = 0;
659          fread(&fCalomip[m][k][l],sizeof(fCalomip[m][k][l]),1,f);      //
660        };      for (Int_t plane=0; plane < 11; plane++){
661      };        //
662    };        if ( sec == 1 ) tstrip = fCALOlength+6*2;
663    fclose(f);        //
664    //        for (Int_t strip=0; strip < 6; strip++){
665    // determine which calibration has to be used and load it for each section          //
666    //            chksum += (Int_t)fcalthr[sec][plane][strip];
667    GL_CALO_CALIB *glcalo = new GL_CALO_CALIB();          //
668    GL_ROOT *glroot = new GL_ROOT();            // save value
669    TString fcalname;          //
670    UInt_t idcalib;          if ( sec == 1 ){
671    UInt_t calibno;            tstrip -= 2;
672    UInt_t utime = 0;            fDataCALO[tstrip] = 0;
673    //            fDataCALO[tstrip+1] = (Int_t)fcalthr[sec][plane][strip];
674    for (UInt_t s=0; s<4; s++){          } else {
675      //            fDataCALO[fCALOlength] = 0;
676      // clear calo calib variables for section s            fDataCALO[fCALOlength+1] = (Int_t)fcalthr[sec][plane][strip];
677      //          };
678      ClearCaloCalib(s);          fCALOlength +=2;
679      //        };
680      if ( fGivenCaloCalib ){        //
681        //      };
682        // a time has been given as input on the command line so retrieve the calibration that preceed that time      //
683        //      fDataCALO[fCALOlength] = 0;
684        glcalo->Query_GL_CALO_CALIB(fGivenCaloCalib,utime,s,fDbc);      fCALOlength++;
685        //        fDataCALO[fCALOlength] = (UShort_t)chksum;
686        calibno = glcalo->EV_ROOT;      fCALOlength++;
687        idcalib = glcalo->ID_ROOT_L0;      fDataCALO[fCALOlength] = 0;
688        //      fCALOlength++;
689        // determine path and name and entry of the calibration file      fDataCALO[fCALOlength] = (UShort_t)((Int_t)(chksum >> 16));
690        //      fCALOlength++;
691        printf("\n");      //
692        printf(" ** SECTION %i **\n",s);      // Section XO is read in the opposite direction respect to the others
693        //      //
694        glroot->Query_GL_ROOT(idcalib,fDbc);      for (Int_t plane=0; plane < 11; plane++){
695        //        //
696        stringstream name;        if ( sec == 1 ) tstrip = fCALOlength+96*2;
697        name.str("");        //
698        name << glroot->PATH.Data() << "/";        for (Int_t strip=0; strip < 96; strip++){
699        name << glroot->NAME.Data();          //
700        //          // save value
701        fcalname = (TString)name.str().c_str();          //
702        //          if ( sec == 1 ){
703        printf("\n Section %i : using  file %s calibration at entry %i: \n",s,fcalname.Data(),calibno);            tstrip -= 2;
704        //            fDataCALO[tstrip] = 0;
705      } else {            fDataCALO[tstrip+1] = (Int_t)fcalrms[sec][plane][strip];
706        error = 0;          } else {
707        error = glparam->Query_GL_PARAM(1,104,fDbc);            fDataCALO[fCALOlength] = 0;
708        //            fDataCALO[fCALOlength+1] = (Int_t)fcalrms[sec][plane][strip];
709        calfile.str("");          };
710        calfile << glparam->PATH.Data() << "/";          fCALOlength += 2;
711        calfile << glparam->NAME.Data();        };
712        //        //
713        printf("\n Section %i : using default calorimeter calibration: \n %s \n",s,calfile.str().c_str());      };    
714        //      //
715        fcalname = (TString)calfile.str().c_str();      // Section XO is read in the opposite direction respect to the others
716        calibno = s;      //
717        //      for (Int_t plane=0; plane < 11; plane++){
718      };        //
719      //        if ( sec == 1 ) tstrip = fCALOlength+6*4;
720      // load calibration variables in memory        //
721      //        for (Int_t strip=0; strip < 6; strip++){
722      CaloLoadCalib(s,fcalname,calibno);          //
723      //          // save value
724    };          //
725    //          if ( sec == 1 ){
726    // at this point we have in memory the calorimeter calibration and we can save it to disk in the correct format and use it to digitize the data            tstrip -= 4;
727    //            fDataCALO[tstrip] = 0;
728    delete glparam;            fDataCALO[tstrip+1] = (Int_t)fcalbase[sec][plane][strip];
729    delete glcalo;            fDataCALO[tstrip+2] = 0;
730    delete glroot;            fDataCALO[tstrip+3] = (Int_t)fcalvar[sec][plane][strip];
731  };          } else {
732              fDataCALO[fCALOlength] = 0;
733  void Digitizer::DigitizeCALO() {            fDataCALO[fCALOlength+1] = (Int_t)fcalbase[sec][plane][strip];
734    //            fDataCALO[fCALOlength+2] = 0;
735    fModCalo = 0; // 0 is RAW, 1 is COMPRESS, 2 is FULL     ####@@@@ should be given as input par @@@@####            fDataCALO[fCALOlength+3] = (Int_t)fcalvar[sec][plane][strip];
736    //          };
737    //          fCALOlength +=4;
738    //        };
739    fCALOlength = 0;  // reset total dimension of calo data        //
740    //      };      
741    // gpamela variables to be used      //
742    //      //
743    fhBookTree->SetBranchStatus("Nthcali",1);      // here we calculate and save the CRC
744    fhBookTree->SetBranchStatus("Icaplane",1);      //
745    fhBookTree->SetBranchStatus("Icastrip",1);      fDataCALO[fCALOlength] = 0;
746    fhBookTree->SetBranchStatus("Icamod",1);      fCALOlength++;
747    fhBookTree->SetBranchStatus("Enestrip",1);      Short_t CRC = 0;
748    //      for (UInt_t i=0; i<(fCALOlength-fSecPointer); i++){
749    // call different routines depending on the acq mode you want to simulate        CRC=crc(CRC,fDataCALO[i+fSecPointer]);
750    //      };
751    switch ( fModCalo ){      fDataCALO[fCALOlength] = (UShort_t)CRC;
752    case 0:      fCALOlength++;
753      this->DigitizeCALORAW();      //
754      break;      UInt_t length=fCALOlength*2;
755    case 1:      DigitizePSCU(length,0x18,fDataPSCU);
756      this->DigitizeCALOCOMPRESS();      //
757      break;      // Add padding to 64 bits
758    case 2:      //
759      this->DigitizeCALOFULL();      AddPadding();
760      break;      //
761    };      fOutputfile.write(reinterpret_cast<char*>(fDataPSCU),sizeof(UShort_t)*fPSCUbuffer);
762    //      UShort_t temp[1000000];
763  };      memset(temp,0,sizeof(UShort_t)*1000000);
764        swab(fDataCALO,temp,sizeof(UShort_t)*fCALOlength);  // WE MUST SWAP THE BYTES!!!
765  Float_t Digitizer::GetCALOen(Int_t sec, Int_t plane, Int_t strip){      fOutputfile.write(reinterpret_cast<char*>(temp),sizeof(UShort_t)*fCALOlength);
766    //      //
767    // determine plane and strip      // padding to 64 bytes
768    //      //
769    Int_t mplane = 0;      if ( fPadding ){
770    //        fOutputfile.write(reinterpret_cast<char*>(fDataPadding),sizeof(UChar_t)*fPadding);
771    // wrong!      };
772    //      //
773    //  if ( sec == 0 || sec == 3 ) mplane = (plane * 4) + sec + 1;        //    
774    //  if ( sec == 1 ) mplane = (plane * 4) + 2 + 1;      };
775    //  if ( sec == 2 ) mplane = (plane * 4) + 1 + 1;      //
776    //  };
777    if ( sec == 0 ) mplane = plane * 4 + 1; // it must be 0, 4, 8, ... (+1)  from plane = 0, 11  
778    if ( sec == 1 ) mplane = plane * 4 + 2 + 1; // it must be 2, 6, 10, ... (+1)  from plane = 0, 11  void Digitizer::CaloLoadCalib() {
779    if ( sec == 2 ) mplane = plane * 4 + 3 + 1; // it must be 3, 7, 11, ... (+1)  from plane = 0, 11    //
780    if ( sec == 3 ) mplane = plane * 4 + 1 + 1; // it must be 1, 5, 9, ... (+1)  from plane = 0, 11    fGivenCaloCalib = 0; //                                  ####@@@@ should be given as input par @@@@####
781    //    //
782    Int_t mstrip = strip + 1;    // first of all load the MIP to ADC conversion values
783    //    //
784    // search energy release in gpamela output    stringstream calfile;
785    //    Int_t error = 0;
786    for (Int_t i=0; i<Nthcali;i++){    GL_PARAM *glparam = new GL_PARAM();
787      if ( Icaplane[i] == mplane && Icastrip[i] == mstrip ){    //
788        return (Enestrip[i]);    // determine where I can find calorimeter ADC to MIP conversion file  
789      };    //
790    };    error = 0;
791    //    error = glparam->Query_GL_PARAM(3,101,fDbc);
792    // if not found it means no energy release so return 0.    //
793    //    calfile.str("");
794    return(0.);    calfile << glparam->PATH.Data() << "/";
795  };    calfile << glparam->NAME.Data();
796      //
797  void Digitizer::DigitizeCALORAW() {    printf("\n Using Calorimeter ADC to MIP conversion file: \n %s \n",calfile.str().c_str());
798    //    FILE *f;
799    // some variables    f = fopen(calfile.str().c_str(),"rb");
800    //    //
801    Float_t ens = 0.;    memset(fCalomip,0,4224*sizeof(fCalomip[0][0][0]));
802    UInt_t adcsig = 0;    //
803    UInt_t adcbase = 0;    for (Int_t m = 0; m < 2 ; m++ ){
804    UInt_t adc = 0;      for (Int_t k = 0; k < 22; k++ ){
805    Int_t pre = 0;        for (Int_t l = 0; l < 96; l++ ){
806    UInt_t l = 0;          fread(&fCalomip[m][k][l],sizeof(fCalomip[m][k][l]),1,f);
807    UInt_t lpl = 0;        };
808    UInt_t tstrip = 0;      };
809    UInt_t fSecPointer = 0;    };
810    Double_t pedenoise;    fclose(f);
811    Float_t rms = 0.;    //
812    Float_t pedestal = 0.;    // determine which calibration has to be used and load it for each section
813    //    //  
814    // clean the data structure    GL_CALO_CALIB *glcalo = new GL_CALO_CALIB();
815    //    GL_ROOT *glroot = new GL_ROOT();  
816    memset(fDataCALO,0,sizeof(UShort_t)*fCALObuffer);    TString fcalname;
817    //    UInt_t idcalib;
818    // Header of the four sections    UInt_t calibno;
819    //    UInt_t utime = 0;
820    fSecCalo[0] = 0xEA08; // XE    //
821    fSecCalo[1] = 0xF108; // XO    for (UInt_t s=0; s<4; s++){
822    fSecCalo[2] = 0xF608; // YE      //
823    fSecCalo[3] = 0xED08; // YO      // clear calo calib variables for section s
824    //      //
825    // length of the data is 0x0428 in RAW mode      ClearCaloCalib(s);
826    //      //
827    fSecCALOLength[0] = 0x0428; // XE      if ( fGivenCaloCalib ){
828    fSecCALOLength[1] = 0x0428; // XO        //
829    fSecCALOLength[2] = 0x0428; // YE        // a time has been given as input on the command line so retrieve the calibration that preceed that time
830    fSecCALOLength[3] = 0x0428; // YO        //
831    //        glcalo->Query_GL_CALO_CALIB(fGivenCaloCalib,utime,s,fDbc);
832    // let's start        //  
833    //        calibno = glcalo->EV_ROOT;
834    fCALOlength = 0;        idcalib = glcalo->ID_ROOT_L0;
835    //        //
836    for (Int_t sec=0; sec < 4; sec++){        // determine path and name and entry of the calibration file
837      //        //
838      // sec =    0 -> XE      1 -> XO        2-> YE         3 -> YO        printf("\n");
839      //        printf(" ** SECTION %i **\n",s);
840      l = 0;                 // XE and XO are Y planes        //
841      if ( sec < 2 ) l = 1;  // while YE and  YO are X planes        glroot->Query_GL_ROOT(idcalib,fDbc);
842      //        //
843      fSecPointer = fCALOlength;        stringstream name;
844      //        name.str("");
845      // First of all we have section header and packet length        name << glroot->PATH.Data() << "/";
846      //        name << glroot->NAME.Data();
847      fDataCALO[fCALOlength] = fSecCalo[sec];        //
848      fCALOlength++;        fcalname = (TString)name.str().c_str();
849      fDataCALO[fCALOlength] = fSecCALOLength[sec];        //
850      fCALOlength++;        printf("\n Section %i : using  file %s calibration at entry %i: \n",s,fcalname.Data(),calibno);
851      //        //
852      // selftrigger coincidences - in the future we should add here some code to simulate timing response of pre-amplifiers      } else {
853      //        error = 0;
854      for (Int_t autoplane=0; autoplane < 7; autoplane++){        error = glparam->Query_GL_PARAM(1,104,fDbc);
855        fDataCALO[fCALOlength] = 0x0000;        //
856        fCALOlength++;        calfile.str("");
857      };        calfile << glparam->PATH.Data() << "/";
858      //        calfile << glparam->NAME.Data();
859      //        //
860      // here comes data        printf("\n Section %i : using default calorimeter calibration: \n %s \n",s,calfile.str().c_str());
861      //        //
862      //        fcalname = (TString)calfile.str().c_str();
863      // Section XO is read in the opposite direction respect to the others        calibno = s;
864      //        //
865      if ( sec == 1 ){            };
866        tstrip = 96*11 + fCALOlength;      //
867      } else {      // load calibration variables in memory
868        tstrip = 0;      //
869      };      CaloLoadCalib(s,fcalname,calibno);
870      //      //
871      pre = -1;    };
872      //    //
873      for (Int_t strip=0; strip < 96; strip++){      // at this point we have in memory the calorimeter calibration and we can save it to disk in the correct format and use it to digitize the data
874        //    //
875        // which is the pre for this strip?    delete glparam;
876        //    delete glcalo;
877        if (strip%16 == 0) {    delete glroot;
878          pre++;  };
879        };  
880        //  void Digitizer::DigitizeCALO() {
881        if ( sec == 1 ) tstrip -= 11;    //
882        //    fModCalo = 0; // 0 is RAW, 1 is COMPRESS, 2 is FULL     ####@@@@ should be given as input par @@@@####
883        for (Int_t plane=0; plane < 11; plane++){    //
884          //    //
885          // here is wrong!!!!    //
886          //    fCALOlength = 0;  // reset total dimension of calo data
887          //    //
888          //      if ( plane%2 == 0 && sec%2 != 0){    // gpamela variables to be used
889          //        lpl = plane*2;    //
890          //      } else {    fhBookTree->SetBranchStatus("Nthcali",1);
891          //        lpl = (plane*2) + 1;    fhBookTree->SetBranchStatus("Icaplane",1);
892          //      };    fhBookTree->SetBranchStatus("Icastrip",1);
893          //    fhBookTree->SetBranchStatus("Icamod",1);
894          if ( sec == 0 || sec == 3 ) lpl = plane * 2;    fhBookTree->SetBranchStatus("Enestrip",1);
895          if ( sec == 1 || sec == 2 ) lpl = (plane * 2) + 1;    //
896          //    // call different routines depending on the acq mode you want to simulate
897          // get the energy in GeV from the simulation for that strip    //
898          //    switch ( fModCalo ){
899          ens = this->GetCALOen(sec,plane,strip);    case 0:
900          //      this->DigitizeCALORAW();
901          // convert it into ADC channels      break;
902          //          case 1:
903          adcsig = int(ens*fCalomip[l][lpl][strip]/fCALOGeV2MIPratio);      this->DigitizeCALOCOMPRESS();
904          //      break;
905          // sum baselines    case 2:
906          //      this->DigitizeCALOFULL();
907          adcbase = (UInt_t)fcalbase[sec][plane][pre];      break;
908          //    };
909          // add noise and pedestals    //
910          //        };
911          pedestal = fcalped[sec][plane][strip];  
912          rms = fcalrms[sec][plane][strip]/4.;  Float_t Digitizer::GetCALOen(Int_t sec, Int_t plane, Int_t strip){
913          //    //
914          // Add random gaussian noise of RMS rms and Centered in the pedestal    // determine plane and strip
915          //    //
916          pedenoise = gRandom->Gaus((Double_t)pedestal,(Double_t)rms);    Int_t mplane = 0;
917          //    //
918          // Sum all contribution    // wrong!
919          //    //
920          adc = adcsig + adcbase + (Int_t)round(pedenoise);    //  if ( sec == 0 || sec == 3 ) mplane = (plane * 4) + sec + 1;  
921          //    //  if ( sec == 1 ) mplane = (plane * 4) + 2 + 1;  
922          // Signal saturation    //  if ( sec == 2 ) mplane = (plane * 4) + 1 + 1;  
923          //    //
924          if ( adc > 0x7FFF ) adc = 0x7FFF;    if ( sec == 0 ) mplane = plane * 4 + 1; // it must be 0, 4, 8, ... (+1)  from plane = 0, 11
925          //    if ( sec == 1 ) mplane = plane * 4 + 2 + 1; // it must be 2, 6, 10, ... (+1)  from plane = 0, 11
926          // save value    if ( sec == 2 ) mplane = plane * 4 + 3 + 1; // it must be 3, 7, 11, ... (+1)  from plane = 0, 11
927          //    if ( sec == 3 ) mplane = plane * 4 + 1 + 1; // it must be 1, 5, 9, ... (+1)  from plane = 0, 11
928          if ( sec == 1 ){    //
929            fDataCALO[tstrip] = adc;    Int_t mstrip = strip + 1;
930            tstrip++;    //
931          } else {    // search energy release in gpamela output
932            fDataCALO[fCALOlength] = adc;    //
933          };    for (Int_t i=0; i<Nthcali;i++){
934          fCALOlength++;      if ( Icaplane[i] == mplane && Icastrip[i] == mstrip ){
935          //        return (Enestrip[i]);
936        };      };
937        //    };
938        if ( sec == 1 ) tstrip -= 11;    //
939        //    // if not found it means no energy release so return 0.
940      };    //
941      //    return(0.);
942      // here we calculate and save the CRC  };
943      //  
944      Short_t CRC = 0;  void Digitizer::DigitizeCALORAW() {
945      for (UInt_t i=0; i<(fCALOlength-fSecPointer); i++){    //
946        CRC=crc(CRC,fDataCALO[i+fSecPointer]);    // some variables
947      };    //
948      fDataCALO[fCALOlength] = (UShort_t)CRC;    Float_t ens = 0.;
949      fCALOlength++;    UInt_t adcsig = 0;
950      //    UInt_t adcbase = 0;
951    };    UInt_t adc = 0;
952    //    Int_t pre = 0;
953    //   for (Int_t i=0; i<fCALOlength; i++){    UInt_t l = 0;
954    //     printf(" WORD %i       DIGIT %0x   \n",i,fDataCALO[i]);    UInt_t lpl = 0;
955    //   };    UInt_t tstrip = 0;
956    //    UInt_t fSecPointer = 0;
957  };    Double_t pedenoise;
958      Float_t rms = 0.;
959  void Digitizer::DigitizeCALOCOMPRESS() {    Float_t pedestal = 0.;
960    //    //
961    printf(" COMPRESS MODE STILL NOT IMPLEMENTED! \n");      // clean the data structure
962    //    //
963    this->DigitizeCALORAW();    memset(fDataCALO,0,sizeof(UShort_t)*fCALObuffer);
964    return;    //
965    //    // Header of the four sections
966    //    //
967    //    fSecCalo[0] = 0xEA08; // XE
968    fSecCalo[0] = 0xEA00;    fSecCalo[1] = 0xF108; // XO
969    fSecCalo[1] = 0xF100;    fSecCalo[2] = 0xF608; // YE
970    fSecCalo[2] = 0xF600;    fSecCalo[3] = 0xED08; // YO
971    fSecCalo[3] = 0xED00;    //
972    //    // length of the data is 0x0428 in RAW mode
973    // length of the data in DSP mode must be calculated on fly during digitization    //
974    //    fSecCALOLength[0] = 0x0428; // XE
975    memset(fSecCALOLength,0x0,4*sizeof(UShort_t));    fSecCALOLength[1] = 0x0428; // XO
976    //    fSecCALOLength[2] = 0x0428; // YE
977    // here comes raw data    fSecCALOLength[3] = 0x0428; // YO
978    //    //
979    Int_t en = 0;    // let's start
980    //    //
981    for (Int_t sec=0; sec < 4; sec++){    fCALOlength = 0;
982      fDataCALO[en] = fSecCalo[sec];    //
983      en++;    for (Int_t sec=0; sec < 4; sec++){
984      fDataCALO[en] = fSecCALOLength[sec];      //
985      en++;      // sec =    0 -> XE      1 -> XO        2-> YE         3 -> YO
986      for (Int_t plane=0; plane < 11; plane++){      //
987        for (Int_t strip=0; strip < 11; strip++){      l = 0;                 // XE and XO are Y planes
988          fDataCALO[en] = 0x0;      if ( sec < 2 ) l = 1;  // while YE and  YO are X planes
989          en++;      //
990        };      fSecPointer = fCALOlength;
991      };      //
992    };      // First of all we have section header and packet length
993    //      //
994  };      fDataCALO[fCALOlength] = fSecCalo[sec];
995        fCALOlength++;
996  void Digitizer::DigitizeCALOFULL() {      fDataCALO[fCALOlength] = fSecCALOLength[sec];
997    //      fCALOlength++;
998    printf(" FULL MODE STILL NOT IMPLEMENTED! \n");        //
999    //      // selftrigger coincidences - in the future we should add here some code to simulate timing response of pre-amplifiers
1000    this->DigitizeCALORAW();      //
1001    return;      for (Int_t autoplane=0; autoplane < 7; autoplane++){
1002    //        fDataCALO[fCALOlength] = 0x0000;
1003    fSecCalo[0] = 0xEA00;        fCALOlength++;
1004    fSecCalo[1] = 0xF100;      };
1005    fSecCalo[2] = 0xF600;      //
1006    fSecCalo[3] = 0xED00;      //
1007    //      // here comes data
1008    // length of the data in DSP mode must be calculated on fly during digitization      //
1009    //      //
1010    memset(fSecCALOLength,0x0,4*sizeof(UShort_t));      // Section XO is read in the opposite direction respect to the others
1011    //      //
1012    // here comes raw data      if ( sec == 1 ){      
1013    //        tstrip = 96*11 + fCALOlength;
1014    Int_t  en = 0;      } else {
1015    //        tstrip = 0;
1016    for (Int_t sec=0; sec < 4; sec++){      };
1017      fDataCALO[en] = fSecCalo[sec];      //
1018      en++;      pre = -1;
1019      fDataCALO[en] = fSecCALOLength[sec];      //
1020      en++;      for (Int_t strip=0; strip < 96; strip++){  
1021      for (Int_t plane=0; plane < 11; plane++){        //
1022        for (Int_t strip=0; strip < 11; strip++){        // which is the pre for this strip?
1023          fDataCALO[en] = 0x0;        //
1024          en++;        if (strip%16 == 0) {
1025        };          pre++;
1026      };        };
1027    };        //
1028    //        if ( sec == 1 ) tstrip -= 11;
1029  };        //
1030          for (Int_t plane=0; plane < 11; plane++){
1031  void Digitizer::DigitizeTRIGGER() {          //
1032    //fDataTrigger: 153 bytes          // here is wrong!!!!
1033    for (Int_t j=0; j < 153; j++)          //
1034      fDataTrigger[0]=0x00;          //
1035  };          //      if ( plane%2 == 0 && sec%2 != 0){
1036            //        lpl = plane*2;
1037  Int_t Digitizer::DigitizeTOF() {          //      } else {
1038    //fDataTof: 12 x 23 bytes (=276 bytes)          //        lpl = (plane*2) + 1;
1039    UChar_t *pTof=fDataTof;          //      };
1040            //
1041    // --- activate branches:          if ( sec == 0 || sec == 3 ) lpl = plane * 2;
1042    fhBookTree->SetBranchStatus("Nthtof",1);          if ( sec == 1 || sec == 2 ) lpl = (plane * 2) + 1;
1043    fhBookTree->SetBranchStatus("Ipltof",1);          //
1044    fhBookTree->SetBranchStatus("Ipaddle",1);          // get the energy in GeV from the simulation for that strip
1045    fhBookTree->SetBranchStatus("Xintof",1);          //
1046    fhBookTree->SetBranchStatus("Yintof",1);          ens = this->GetCALOen(sec,plane,strip);
1047    fhBookTree->SetBranchStatus("Xouttof",1);          //
1048    fhBookTree->SetBranchStatus("Youttof",1);          // convert it into ADC channels
1049    fhBookTree->SetBranchStatus("Ereltof",1);          //      
1050    fhBookTree->SetBranchStatus("Timetof",1);          adcsig = int(ens*fCalomip[l][lpl][strip]/fCALOGeV2MIPratio);
1051    // not yet used: Zintof, Xouttof, Youttof, Zouttof          //
1052            // sum baselines
1053    // ------ evaluate energy in each pmt: ------          //
1054    // strip geometry (lenght/width)          adcbase = (UInt_t)fcalbase[sec][plane][pre];
1055    Float_t dimel[6] = {33.0, 40.8 ,18.0, 15.0, 15.0, 18.0};          //
1056    //Float_t dimes[6] = {5.1, 5.5, 7.5, 9.0, 6.0, 5.0};          // add noise and pedestals
1057              //      
1058    //  S11 8 paddles  33.0 x 5.1 cm          pedestal = fcalped[sec][plane][strip];
1059    //  S12 6 paddles  40.8 x 5.5 cm          rms = fcalrms[sec][plane][strip]/4.;
1060    //  S21 2 paddles  18.0 x 7.5 cm          //
1061    //  S22 2 paddles  15.0 x 9.0 cm          // Add random gaussian noise of RMS rms and Centered in the pedestal
1062    //  S31 3 paddles  15.0 x 6.0 cm          //
1063    //  S32 3 paddles  18.0 x 5.0 cm          pedenoise = gRandom->Gaus((Double_t)pedestal,(Double_t)rms);
1064            //
1065    // distance from the interaction point to the pmts (right,left)          // Sum all contribution
1066    Float_t xpath[2]={0., 0.}; /*path(cm) in X per S12,S21,S32 verso il pmt DX o SX*/          //
1067    Float_t ypath[2]={0., 0.}; /*path(cm) in Y per S11,S22,S31 verso il pmt DX o SX*/          adc = adcsig + adcbase + (Int_t)round(pedenoise);
1068    Float_t FGeo[2]={0., 0.}; /* fattore geometrico */          //
1069            // Signal saturation
1070    const Float_t Pho_keV = 10.;     // photons per keV in scintillator          //
1071    const Float_t echarge = 1.6e-19; // carica dell'elettrone          if ( adc > 0x7FFF ) adc = 0x7FFF;
1072    Float_t Npho=0.;          //
1073    Float_t QevePmt_pC[48];          // save value
1074    Float_t QhitPad_pC[2]={0., 0.};          //
1075    Float_t QhitPmt_pC[2]={0., 0.};          if ( sec == 1 ){
1076    Float_t pmGain = 3.5e6;  /* Gain: per il momento uguale per tutti */            fDataCALO[tstrip] = adc;
1077    Float_t effi=0.21;       /* Efficienza di fotocatodo */            tstrip++;
1078    Float_t ADC_pC=1.666667; // ADC_ch/pC conversion = 0.6 pC/channel (+30 di offset)          } else {
1079    Float_t ADCoffset=30.;            fDataCALO[fCALOlength] = adc;
1080    Int_t ADClast=4095;      // no signal --> ADC ch=4095          };
1081    Int_t ADCtof[48];          fCALOlength++;
1082    //Float_t ADCsat=3100;  ci pensiamo in futuro !          //
1083    //Float_t pCsat=2500;          };
1084    for(Int_t i=0; i<48; i++){        //
1085      QevePmt_pC[i] = 0;        if ( sec == 1 ) tstrip -= 11;
1086      ADCtof[i]=0;        //
1087    }      };
1088          //
1089    // ------ read calibration file (get A1, A2, lambda1, lambda2)      // here we calculate and save the CRC
1090    ifstream fileTriggerCalib;      //
1091    TString ftrigname="TrigCalibParam.txt";      Short_t CRC = 0;
1092    fileTriggerCalib.open(ftrigname.Data());      for (UInt_t i=0; i<(fCALOlength-fSecPointer); i++){
1093    if ( !fileTriggerCalib ) {        CRC=crc(CRC,fDataCALO[i+fSecPointer]);
1094      printf("debug: no trigger calib file!\n");      };
1095      return(-117); //check output!      fDataCALO[fCALOlength] = (UShort_t)CRC;
1096    };      fCALOlength++;
1097    Float_t atte1[48],atte2[48],lambda1[48],lambda2[48];      //
1098    Int_t temp=0;    };
1099    for(Int_t i=0; i<48; i++){    //
1100      fileTriggerCalib >> temp;    //   for (Int_t i=0; i<fCALOlength; i++){
1101      fileTriggerCalib >> atte1[i];    //     printf(" WORD %i       DIGIT %0x   \n",i,fDataCALO[i]);
1102      fileTriggerCalib >> atte2[i];    //   };
1103      fileTriggerCalib >> lambda1[i];    //
1104      fileTriggerCalib >> lambda2[i];  };
1105      fileTriggerCalib >> temp;  
1106    }  void Digitizer::DigitizeCALOCOMPRESS() {
1107    fileTriggerCalib.close();    //
1108      printf(" COMPRESS MODE STILL NOT IMPLEMENTED! \n");  
1109    //  Read from file the 48*4 values of the attenuation fit function    //
1110    //  NB: lambda<0; x,y defined in gpamela (=0 in the centre of the cavity)    this->DigitizeCALORAW();
1111    //    Qhitpmt_pC =  atte1 * exp(x/lambda1) + atte2 * exp(x/lambda2)    return;
1112      //
1113    //    fine lettura dal file */    //
1114      //
1115    //const Int_t nmax=??; = Nthtof    fSecCalo[0] = 0xEA00;
1116    Int_t ip, ipad;    fSecCalo[1] = 0xF100;
1117    //Int_t ipmt;    fSecCalo[2] = 0xF600;
1118    Int_t pmtleft=0, pmtright=0;    fSecCalo[3] = 0xED00;
1119    Int_t *pl, *pr;    //
1120    pl = &pmtleft;    // length of the data in DSP mode must be calculated on fly during digitization
1121    pr = &pmtright;    //
1122      memset(fSecCALOLength,0x0,4*sizeof(UShort_t));
1123    // TDC variables:    //
1124    Int_t TDClast=4095;      // no signal --> ADC ch=4095    // here comes raw data
1125    Int_t TDCint[48];    //
1126    Float_t  tdc[48],tdc1[48],tdcpmt[48];    Int_t en = 0;
1127    for(Int_t i=0; i<48; i++)    //
1128      tdcpmt[i] = 1000.;    for (Int_t sec=0; sec < 4; sec++){
1129    Float_t thresh=1.; // to be defined better... (Wolfgang)      fDataCALO[en] = fSecCalo[sec];
1130        en++;
1131      // === TDC: simulate timing for each paddle      fDataCALO[en] = fSecCALOLength[sec];
1132      Float_t dt1 = 285.e-12 ;   // single PMT resolution      en++;
1133      Float_t tdcres[50],c1_S[50],c2_S[50],c3_S[50];      for (Int_t plane=0; plane < 11; plane++){
1134      for(Int_t j=0;j<48;j++)  tdcres[j] = 50.E-12;   // TDC resolution 50 picosec        for (Int_t strip=0; strip < 11; strip++){
1135      for(Int_t j=0;j<48;j++)  c1_S[j] = 500.;  // cable length in channels          fDataCALO[en] = 0x0;
1136      for(Int_t j=0;j<48;j++)  c2_S[j] = 0.;          en++;
1137      for(Int_t j=0;j<48;j++)  c3_S[j] = 1000.;        };
1138      for(Int_t j=0;j<48;j++)  c1_S[j] = c1_S[j]*tdcres[j];   // cable length in sec      };
1139      for(Int_t j=0;j<48;j++)  c2_S[j] = c2_S[j]*tdcres[j];    };
1140       // ih = 0 + i1;  // not used?? (Silvio)    //
1141    };
1142    /* **********************************  inizio loop sugli hit */  
1143      void Digitizer::DigitizeCALOFULL() {
1144    for(Int_t nh=0; nh<Nthtof; nh++){    //
1145          printf(" FULL MODE STILL NOT IMPLEMENTED! \n");  
1146      for(Int_t j=0; j<2; j++) { // already done!! remove???    //
1147        xpath[j]=0.;    this->DigitizeCALORAW();
1148        ypath[j]=0.;    return;
1149        FGeo[j]=0.;    //
1150      }    fSecCalo[0] = 0xEA00;
1151      fSecCalo[1] = 0xF100;
1152      Float_t s_l_g[6] = {8.0, 8.0, 20.9, 22.0, 9.8, 8.3 };  // length of the lightguide    fSecCalo[2] = 0xF600;
1153      Float_t t1,t2,veff,veff1,veff0 ;    fSecCalo[3] = 0xED00;
1154      veff0 = 100.*1.0e8 ; // light velocity in the scintillator in m/sec    //
1155      veff1 = 100.*1.5e8; // light velocity in the lightguide in m/sec    // length of the data in DSP mode must be calculated on fly during digitization
1156      veff=veff0;         // signal velocity in the paddle    //
1157      memset(fSecCALOLength,0x0,4*sizeof(UShort_t));
1158      t1 = Timetof[nh] ;  // Start    //
1159      t2 = Timetof[nh] ;    // here comes raw data
1160      //
1161      // Donatella        Int_t  en = 0;
1162      // ridefiniz. piano e pad per i vettori in C    //
1163      ip = Ipltof[nh]-1;    for (Int_t sec=0; sec < 4; sec++){
1164      ipad = Ipaddle[nh]-1;      fDataCALO[en] = fSecCalo[sec];
1165      pmtleft=0;      en++;
1166      pmtright=0;      fDataCALO[en] = fSecCALOLength[sec];
1167          en++;
1168      //Paddle2Pmt((Int_t)ip, (Int_t) ipad, (Int_t*) &pmtleft, (Int_t*) &pmtright);      for (Int_t plane=0; plane < 11; plane++){
1169      Paddle2Pmt(ip, ipad, &pmtleft, &pmtright);        for (Int_t strip=0; strip < 11; strip++){
1170      //Paddle2Pmt(ip, ipad, pl, pr);          fDataCALO[en] = 0x0;
1171                en++;
1172      // per avere anche la corrispondenza pmt --> half board e canale        };
1173      // metodo GetPMTIndex(Int_t ipmt, Int_t &hb, Int_t &ch) // non lo usiamo x ora      };
1174        };
1175      /*calcola la pos media e il path all'interno della paddle */    //
1176      };
1177      Float_t tpos=0.;  
1178      Float_t path[2] = {0., 0.};  //void Digitizer::DigitizeTRIGGER() {
1179      //--- Strip in Y = S11,S22,S31 ------    //fDataTrigger: 152 bytes
1180      if(ip==0 || ip==3 || ip==4)    // corrected 30/11/'07 SO (was 153)
1181        tpos = (Yintof[nh]+Youttof[nh])/2.;    //for (Int_t j=0; j < 152; j++)
1182      else    //  fDataTrigger[j]=0x00;
1183        if(ip==1 || ip==2 || ip==5)   //--- Strip in X per S12,S21,S32  //};
1184          tpos = (Xintof[nh]+Xouttof[nh])/2.;  
1185        else if (ip!=6)  Int_t Digitizer::DigitizeTOF() {
1186          printf("*** Warning: this option should never occur! (ip=%2i, nh=%2i)\n",ip,nh);    //fDataTof: 12 x 23 bytes (=276 bytes)
1187      path[0]= tpos + dimel[ip]/2.;    UChar_t *pTof=fDataTof;
1188      path[1]= dimel[ip]/2.- tpos;    Bool_t DEBUG=false;
1189    
1190      //  cout <<"Strip N. ="<< ipaddle <<" piano n.= "<< iplane <<" POSIZ = "<< tpos <<"\n";    // --- activate branches:
1191      fhBookTree->SetBranchStatus("Nthtof",1);
1192      /* per il momento metto un fattore geometrico costante*/      fhBookTree->SetBranchStatus("Ipltof",1);
1193      FGeo[0] =0.5;    fhBookTree->SetBranchStatus("Ipaddle",1);
1194      FGeo[1] =0.5;    fhBookTree->SetBranchStatus("Xintof",1);
1195      //  FGeo[1] = atan(path[1]/dimes[ip])/6.28318; // frazione fotoni verso SX    fhBookTree->SetBranchStatus("Yintof",1);
1196      //  FGeo[2] = atan(path[2]/dimes[ip])/6.28318; // e verso DX    fhBookTree->SetBranchStatus("Xouttof",1);
1197            fhBookTree->SetBranchStatus("Youttof",1);
1198      /*  rimando la fluttuazione poissoniana sui fotoni prodotti    fhBookTree->SetBranchStatus("Ereltof",1);
1199          sto studiando come funziona la funzione:    fhBookTree->SetBranchStatus("Timetof",1);
1200          long int i = sto.Poisson(double x);  */    // not yet used: Zintof, Xouttof, Youttof, Zouttof
1201      //  Npho = Poisson(ERELTOF[nh])*Pho_keV*1e6   Eloss in GeV ?  
1202      Npho = Ereltof[nh]*Pho_keV*10.0e6;  // Eloss in GeV ?    // ------ evaluate energy in each pmt: ------
1203        // strip geometry (lenght/width)
1204      Float_t knorm[2]={0., 0.}; // Donatella    Float_t dimel[6] = {33.0, 40.8 ,18.0, 15.0, 15.0, 18.0};
1205      Float_t Atten[2]={0., 0.}; // Donatella    //Float_t dimes[6] = {5.1, 5.5, 7.5, 9.0, 6.0, 5.0};
1206      for(Int_t j=0; j<2; j++){    
1207        QhitPad_pC[j]= Npho*FGeo[j]*effi*pmGain*echarge;    //  S11 8 paddles  33.0 x 5.1 cm
1208        knorm[j]=QhitPad_pC[j]/(atte1[pmtleft+j]*exp((dimel[ip]/2.*pow(-1,j+1))/lambda1[pmtleft+j]) +    //  S12 6 paddles  40.8 x 5.5 cm
1209                                atte2[pmtleft+j]*exp((dimel[ip]/2.*pow(-1,j+1))/lambda2[pmtleft+j]));    //  S21 2 paddles  18.0 x 7.5 cm
1210      //  S22 2 paddles  15.0 x 9.0 cm
1211        Atten[j]=knorm[j]*(atte1[pmtleft+j]*exp(tpos/lambda1[pmtleft+j]) +    //  S31 3 paddles  15.0 x 6.0 cm
1212                           atte2[pmtleft+j]*exp(tpos/lambda2[pmtleft+j]));    //  S32 3 paddles  18.0 x 5.0 cm
1213          
1214        QhitPmt_pC[j]= QhitPad_pC[j]*Atten[j];    Float_t FGeo[2]={0., 0.}; /* geometrical factor */
1215      }  
1216          const Float_t Pho_keV = 10.;     // photons per keV in scintillator
1217      QevePmt_pC[pmtleft]  += QhitPmt_pC[0];    const Float_t echarge = 1.6e-19; // electron charge
1218      QevePmt_pC[pmtright] += QhitPmt_pC[1];    Float_t Npho=0.;
1219          Float_t QevePmt_pC[48];
1220      // TDC    Float_t QhitPad_pC[2]={0., 0.};
1221      t2 = t2 + fabs(path[0]/veff) + s_l_g[ip]/veff1 ;  // Signal reaches PMT    Float_t QhitPmt_pC[2]={0., 0.};
1222      t1 = t1 + fabs(path[1]/veff) + s_l_g[ip]/veff1;    Float_t pmGain = 3.5e6;  /* PMT Gain: the same for all PMTs */
1223          Float_t effi=0.21;       /* Efficienza di fotocatodo */
1224      TRandom r;  
1225      t1 = r.Gaus(t1,dt1);  //apply gaussian error  dt    //   Float_t ADC_pC0=-58.1;      //  ADC/pC conversion coefficient 0
1226      t2 = r.Gaus(t2,dt1);  //apply gaussian error  dt    //   Float_t ADC_pC1=1.728;      //  ADC/pC conversion coefficient 1
1227          //   Float_t ADC_pC2=-4.063e-05; //  ADC/pC conversion coefficient 2
1228      t1 = t1 + c1_S[pmtleft] ;  // Signal reaches Discriminator ,TDC starts  to run    //   Float_t ADC_pC3=-5.763e-08; //  ADC/pC conversion coefficient 3
1229      t2 = t2 + c1_S[pmtright] ;    
1230          // pC < 800
1231      // check if signal is above threshold    Float_t ADC_pC0A =   -4.437616e+01   ;
1232      // then check if tdcpmt is already filled by another hit...    Float_t ADC_pC1A =   1.573329e+00    ;
1233      // only re-fill if time is smaller    Float_t ADC_pC2A =   2.780518e-04  ;
1234          Float_t ADC_pC3A =  -2.302160e-07 ;
1235      if (QhitPmt_pC[0] > thresh)    
1236        if (tdcpmt[pmtleft] < 1000.) // is already filled!    // pC   > 800:
1237          if (t1 <  tdcpmt[pmtleft]) {    Float_t ADC_pC0B =    -2.245756e+02  ;
1238            tdcpmt[pmtleft] = t1;    Float_t ADC_pC1B =     2.184156e+00  ;
1239            t1 = t1 + c2_S[pmtleft] ;  // Signal reaches Coincidence    Float_t ADC_pC2B =     -4.171825e-04  ;
1240            tdc[pmtleft] = t1;    Float_t ADC_pC3B =     3.789715e-08  ;
1241          }  
1242          Float_t pCthres=40.;     // threshold in charge
1243      if (QhitPmt_pC[1] > thresh)    Int_t ADClast=4095;      // no signal --> ADC ch=4095
1244          if (tdcpmt[pmtright] < 1000.)  // is already filled!    Int_t ADCsat=3100;       // saturation value for the ADCs
1245            if (t2 <  tdcpmt[pmtright]) {    Int_t ADCtof[48];
1246              tdcpmt[pmtright] = t2;  
1247              t2 = t2 + c2_S[pmtright] ;  
1248              tdc[pmtright] = t2;    // ---- introduce scale factors to tune simul ADC to real data   24-oct DC
1249            }          //   Float_t ScaleFact[48]={0.18,0.22,0.35,0.26,0.47,0.35,0.31,0.37,
1250          //                     0.44,0.23,0.38,0.60,0.39,0.29,0.40,0.23,
1251    } // ****************************************       end loop over hits    //                     0.30,0.66,0.22,1.53,0.17,0.55,
1252      //                     0.84,0.19,0.21,1.64,0.62,0.13,
1253    // ======  ADC ======    //                     0.18,0.15,0.10,0.14,0.14,0.14,0.14,0.12,
1254    for(Int_t i=0; i<48; i++){    //                     0.26,0.18,0.25,0.23,0.20,0.40,0.19,0.23,0.25,0.23,0.25,0.20};
1255      if(QevePmt_pC[i] != 0.){    
1256        ADCtof[i]= (Int_t)(ADC_pC*QevePmt_pC[i] + ADCoffset);    // new scale factors: WM 30-Oct-07
1257        if(ADCtof[i]> ADClast) ADCtof[i]=ADClast;    //   Float_t ScaleFact[48]={0.35,0.41,0.32,0.34,0.58,0.47,0.42,0.44,
1258      } else    //                     0.50,0.34,0.50,0.50,0.51,0.42,0.46,0.25,
1259        ADCtof[i]= ADClast;    //                     0.20,0.38,0.29,0.49,0.24,0.68,
1260    };    //                     0.30,0.26,0.28,0.79,0.31,0.12,
1261      //                     0.25,0.21,0.14,0.20,
1262          //                     0.16,0.17,0.19,0.18,
1263    // ======  build  TDC coincidence  ======    //                     0.34,0.27,0.34,0.31,0.25,0.57,
1264      //                     0.24,0.34,0.34,0.32,0.31,0.30};
1265    Float_t t_coinc = 0;    
1266    Int_t ilast = 100;    Float_t ScaleFact[48]={0.39, 0.49, 0.38, 0.40, 0.65, 0.51, 0.43,
1267    for (Int_t ii=0; ii<48;ii++)                           0.49, 0.58, 0.38, 0.53, 0.57, 0.53, 0.45, 0.49, 0.16,
1268      if (tdc[ii] > t_coinc) {                           0.15, 0.44, 0.28, 0.57, 0.26, 0.72, 0.37, 0.29, 0.30, 0.89,
1269        t_coinc = tdc[ii];                           0.37, 0.08,  0.27, 0.23, 0.12, 0.22, 0.15, 0.16, 0.21,
1270        ilast = ii;                           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 };
1271      }  
1272        for(Int_t i=0; i<48; i++){
1273    //     cout<<ilast<<" "<<t_coinc<<endl;      QevePmt_pC[i] = 0;
1274    //     At t_coinc  trigger condition is fulfilled      ADCtof[i]=0;
1275        }
1276    for (Int_t ii=0; ii<48;ii++){    
1277      //      if (tdc[ii] != 0) tdc1[ii] = t_coinc - tdc[ii];   // test 1    // ------ read calibration file (get A1, A2, lambda1, lambda2)
1278      if (tdc[ii] != 0) tdc1[ii] = t_coinc - tdcpmt[ii];  // test 2    ifstream fileTriggerCalib;
1279      tdc1[ii] = tdc1[ii]/tdcres[ii];                     // divide by TDC resolution    TString ftrigname="TrigCalibParam.txt";
1280      if (tdc[ii] != 0) tdc1[ii] = tdc1[ii] + c3_S[ii];  // add cable length c3    fileTriggerCalib.open(ftrigname.Data());
1281      if ( !fileTriggerCalib ) {
1282    } // missing parenthesis inserted! (Silvio)      printf("debug: no trigger calib file!\n");
1283        return(-117); //check output!
1284    for(Int_t i=0; i<48; i++){    };
1285      if(tdc1[i] != 0.){    Float_t atte1[48],atte2[48],lambda1[48],lambda2[48];
1286        TDCint[i]=(Int_t)tdc1[i];    Int_t temp=0;
1287        //ADC[i]= ADC_pC * QevePmt_pC[i] + ADCoffset;    // correct readout WM Oct '07
1288        //if(ADC[i]> ADClast) ADC[i]=ADClast;    for(Int_t i=0; i<48; i++){
1289      } else      fileTriggerCalib >> temp;
1290        TDCint[i]= TDClast;      fileTriggerCalib >> atte1[i];
1291    }      fileTriggerCalib >> lambda1[i];
1292        fileTriggerCalib >> atte2[i];
1293  // ======  write fDataTof  =======      fileTriggerCalib >> lambda2[i];
1294    UChar_t tofBin;      fileTriggerCalib >> temp;
1295    for (Int_t j=0; j < 12; j++){    }
1296      Int_t j12=j*12;    fileTriggerCalib.close();
1297      fDataTof[j12+0]=0x00;   // TDC_ID  
1298      fDataTof[j12+1]=0x00;   // EV_COUNT    Int_t ip, ipad;
1299      fDataTof[j12+2]=0x00;   // TDC_MASK (1)    //Int_t ipmt;
1300      fDataTof[j12+3]=0x00;   // TDC_MASK (2)    Int_t pmtleft=0, pmtright=0;
1301      for (Int_t k=0; k < 4; k++){    Int_t *pl, *pr;
1302        Int_t jk12=j12+k;    pl = &pmtleft;
1303        tofBin=(UChar_t)(ADCtof[k+4*j]/256);   // ADC# (msb) (#=1+k+4*j)    pr = &pmtright;
1304        fDataTof[jk12+4] = Bin2GrayTof(tofBin,fDataTof[jk12+4]);  
1305        tofBin=(UChar_t)(ADCtof[k+4*j]%256);   // ADC# (lsb)    // TDC variables:
1306        fDataTof[jk12+5] = Bin2GrayTof(tofBin,fDataTof[jk12+5]);    Int_t TDClast=4095;      // no signal --> TDC ch=4095
1307        tofBin=(UChar_t)(TDCint[k+4*j]/256);   // TDC# (msb)    Int_t TDCint[48];
1308        fDataTof[jk12+6]=Bin2GrayTof(tofBin,fDataTof[jk12+6]);    Float_t  tdc[48],tdc1[48],tdcpmt[48];
1309        tofBin=(UChar_t)(TDCint[k+4*j]%256);   // TDC# (lsb)    for(Int_t i=0; i<48; i++) {
1310        fDataTof[jk12+7]=Bin2GrayTof(tofBin,fDataTof[jk12+7]);      tdcpmt[i] = 1000.;
1311      };      tdc[i]  = 0.;            // 18-oct WM
1312      fDataTof[j12+20]=0x00;   // TEMP1      tdc1[i] = 0.;            // 18-oct WM
1313      fDataTof[j12+21]=0x00;   // TEMP2    }
1314      fDataTof[j12+22]= EvaluateCrcTof(pTof);   // CRC  
1315      pTof+=23;    Float_t thresh=10.; // to be defined better... (Wolfgang)
1316    };  
1317    return(0);    // === TDC: simulate timing for each paddle
1318  };    //Float_t dt1 = 285.e-12 ;   // single PMT resolution
1319      Float_t dt1 = 425.e-12 ;   // single PMT resolution (WM, Nov'07)
1320  UChar_t Digitizer::Bin2GrayTof(UChar_t binaTOF,UChar_t grayTOF){    Float_t tdcres[50],c1_S[50],c2_S[50],c3_S[50];
1321    union graytof_data {    for(Int_t j=0;j<48;j++)  tdcres[j] = 50.E-12;   // TDC resolution 50 picosec
1322      UChar_t word;    for(Int_t j=0;j<48;j++)  c1_S[j] = 500.;  // cable length in channels
1323      struct bit_field {    for(Int_t j=0;j<48;j++)  c2_S[j] = 0.;
1324        unsigned b0:1;    for(Int_t j=0;j<48;j++)  c3_S[j] = 1000.;
1325        unsigned b1:1;    for(Int_t j=0;j<48;j++)  c1_S[j] = c1_S[j]*tdcres[j];   // cable length in sec
1326        unsigned b2:1;    for(Int_t j=0;j<48;j++)  c2_S[j] = c2_S[j]*tdcres[j];
1327        unsigned b3:1;    // ih = 0 + i1;  // not used?? (Silvio)
1328        unsigned b4:1;  
1329        unsigned b5:1;    /* **********************************  start loop over hits */
1330        unsigned b6:1;    
1331        unsigned b7:1;    for(Int_t nh=0; nh<Nthtof; nh++){
1332      } bit;      
1333    } bi,gr;      Float_t s_l_g[6] = {8.0, 8.0, 20.9, 22.0, 9.8, 8.3 };  // length of the lightguide
1334    //      Float_t t1,t2,veff,veff1,veff0 ;
1335    bi.word = binaTOF;      veff0 = 100.*1.0e8 ; // light velocity in the scintillator in m/sec
1336    gr.word = grayTOF;      veff1 = 100.*1.5e8; // light velocity in the lightguide in m/sec
1337    //      veff=veff0;         // signal velocity in the paddle
1338    gr.bit.b0 = bi.bit.b1 ^ bi.bit.b0;  
1339    gr.bit.b1 = bi.bit.b2 ^ bi.bit.b1;      t1 = Timetof[nh] ;  // Start
1340    gr.bit.b2 = bi.bit.b3 ^ bi.bit.b2;      t2 = Timetof[nh] ;
1341    gr.bit.b3 = bi.bit.b3;  
1342    //      // Donatella: redefinition plane and pad for vectors in C
1343    /* bin to gray conversion 4 bit per time*/      ip = Ipltof[nh]-1;
1344    //      ipad = Ipaddle[nh]-1;
1345    gr.bit.b4 = bi.bit.b5 ^ bi.bit.b4;      pmtleft=0;
1346    gr.bit.b5 = bi.bit.b6 ^ bi.bit.b5;      pmtright=0;
1347    gr.bit.b6 = bi.bit.b7 ^ bi.bit.b6;  
1348    gr.bit.b7 = bi.bit.b7;      // WM: S12 paddles are "reversed" (Nov'07)
1349    //      if (ip==2)
1350    return(gr.word);        if (ipad==0)
1351  }          ipad=1;
1352          else
1353  UChar_t Digitizer::EvaluateCrcTof(UChar_t *pTof) {          ipad=0;
1354    // UChar_t crcTof=0x00;  
1355    //   for (Int_t jp=0; jp < 23; jp++){      if (ip<6) {
1356    //     crcTof = crc8(...)        Paddle2Pmt(ip, ipad, &pmtleft, &pmtright);
1357    //   }  
1358    return(0x00);        // DC: evaluates mean position and path inside the paddle
1359  };    
1360          Float_t tpos=0.;
1361  //void Digitizer::Paddle2Pmt(Int_t plane, Int_t paddle, Int_t* &pmtleft, Int_t* &pmtright){        Float_t path[2] = {0., 0.};
1362  void Digitizer::Paddle2Pmt(Int_t plane, Int_t paddle, Int_t *pl, Int_t *pr){        //--- Strip in Y = S11,S22,S31 ------
1363    //* @param plane    (0 - 5)        if(ip==0 || ip==3 || ip==4)
1364    //* @param paddle   (plane=0, paddle = 0,...5)          tpos = (Yintof[nh]+Youttof[nh])/2.;
1365    //* @param padid    (0 - 23)          else
1366    //          if(ip==1 || ip==2 || ip==5)   //--- Strip in X for S12,S21,S32
1367    Int_t padid=-1;            tpos = (Xintof[nh]+Xouttof[nh])/2.;
1368    Int_t pads[6]={8,6,2,2,3,3};          else //if (ip!=6)
1369    //            printf("*** WARNING TOF: this option should never occur! (ip=%2i, nh=%2i)\n",ip,nh);
1370    Int_t somma=0;  
1371    Int_t np=plane;        path[0]= tpos + dimel[ip]/2.;   // path to left PMT
1372    for(Int_t j=0; j<np; j++)        path[1]= dimel[ip]/2.- tpos;    // path to right PMT
1373      somma+=pads[j];  
1374    padid=paddle+somma;        //  cout <<"Strip N. ="<< ipaddle <<" piano n.= "<< iplane <<" POSIZ = "<< tpos <<"\n";
1375    *pl = padid*2;        
1376    *pr = *pr + 1;        if (DEBUG) {
1377  };          cout <<" plane "<<ip<<" strip # ="<< ipad <<" tpos  "<< tpos <<"\n";
1378            cout <<"pmtleft, pmtright "<<pmtleft<<" "<<pmtright<<endl;
1379  void Digitizer::DigitizeAC() {        }
1380    // created:  J. Conrad, KTH        
1381    // modified: S. Orsi, INFN Roma2        // constant geometric factor, the rest is handled by the scaling factor
1382          FGeo[0] =0.5;
1383    fDataAC[0] = 0xACAC;        FGeo[1] =0.5;
1384    fDataAC[64]= 0xACAC;        //  FGeo[1] = atan(path[1]/dimes[ip])/6.28318; // fraction of photons toward left
1385    fDataAC[1] = 0xAC11;   // main card        //  FGeo[2] = atan(path[2]/dimes[ip])/6.28318; // toward right
1386    fDataAC[65] = 0xAC22;   // extra card        
1387          
1388    // the third word is a status word (dummy)        //  Npho = Poisson(ERELTOF[nh])*Pho_keV*1e6  Poissonian fluctuations to be inserted-DC
1389    fDataAC[2] = 0xFFFF; //FFEF?        Npho = Ereltof[nh]*Pho_keV*1.0e6;  // Eloss in GeV
1390    fDataAC[66] = 0xFFFF;        
1391          Float_t knorm[2]={0., 0.}; // Donatella
1392    const UInt_t nReg = 6;        Float_t Atten[2]={0., 0.}; // Donatella
1393          for(Int_t j=0; j<2; j++){
1394    // Registers (dummy)          QhitPad_pC[j]= Npho*FGeo[j]*effi*pmGain*echarge*1.E12*ScaleFact[pmtleft+j];
1395    for (UInt_t i=0; i<=nReg; i++){          // WM
1396      fDataAC[i+4] = 0xFFFF;          knorm[j]=atte1[pmtleft+j]*exp(lambda1[pmtleft+j]*dimel[ip]/2.*pow(-1,j+1)) +
1397      fDataAC[i+68] = 0xFFFF;            atte2[pmtleft+j]*exp(lambda2[pmtleft+j]*dimel[ip]/2.*pow(-1,j+1));
1398    }          Atten[j]=atte1[pmtleft+j]*exp(tpos*lambda1[pmtleft+j]) +
1399              atte2[pmtleft+j]*exp(tpos*lambda2[pmtleft+j]) ;
1400    // the last word is a CRC          QhitPmt_pC[j]= QhitPad_pC[j]*Atten[j]/knorm[j];
1401    // Dummy for the time being, but it might need to be calculated in the end          //              QhitPmt_pC[j]= QhitPad_pC[j]; //no attenuation
1402    fDataAC[63] = 0xABCD;  
1403    fDataAC[127] = 0xABCD;  
1404            if (DEBUG) {
1405    // shift registers, which one is with respect to PMT, where in            cout<<"pmtleft "<<pmtleft<<" j "<<j<<endl;
1406    // shift registers is a question of time relative trigger            cout<<" atte1 "<<atte1[pmtleft+j]<<"lambda1 "<<lambda1[pmtleft+j]<<" atte2 "<<atte2[pmtleft+j]<<"lambda2 "<<lambda2[pmtleft+j] <<endl;    
1407    // In level2: hitmap, hitmap-status (synchronised with a trigger),            cout<<j<<" tpos "<<tpos<<" knorm "<<knorm[j]<<" "<<Atten[j]<<" "<<"QhitPmt_pC "<<QhitPmt_pC[j]<<endl;    
1408    // status          }
1409                    }
1410    for (UInt_t i=0; i<=15; i++){        
1411      fDataAC[i+11] = 0x0000;          if (DEBUG)
1412      fDataAC[i+75] = 0x0000;          cout<<"Npho "<<Npho<<" QhitPmt_pC "<<QhitPmt_pC[0]<<" "<<QhitPmt_pC[1]<<endl;  
1413    }        
1414          QevePmt_pC[pmtleft]  += QhitPmt_pC[0];
1415    // singles counters are dummy        QevePmt_pC[pmtright] += QhitPmt_pC[1];
1416          
1417    for (UInt_t i=0; i<=16; i++){        // TDC
1418      fDataAC[i+26] = 0x0000;          // WM right and left <->
1419      fDataAC[i+90] = 0x0000;        //      t2 = t2 + fabs(path[0]/veff) + s_l_g[ip]/veff1 ;  // Signal reaches PMT
1420    }        //      t1 = t1 + fabs(path[1]/veff) + s_l_g[ip]/veff1;
1421      
1422    // coincidences are dummy        t1 = t1 + fabs(path[0]/veff) + s_l_g[ip]/veff1;
1423          t2 = t2 + fabs(path[1]/veff) + s_l_g[ip]/veff1 ;  // Signal reaches PMT
1424    for (UInt_t i=0; i<=7; i++){        
1425      fDataAC[i+42] = 0x0000;        t1 = gRandom->Gaus(t1,dt1); //apply gaussian error  dt
1426      fDataAC[i+106] = 0x0000;        t2 = gRandom->Gaus(t2,dt1); //apply gaussian error  dt
1427    }  
1428          t1 = t1 + c1_S[pmtleft] ;  // Signal reaches Discriminator ,TDC starts  to run
1429    // increments for every trigger might be needed at some point.        t2 = t2 + c1_S[pmtright] ;
1430    // dummy for now        
1431    fDataAC[50]  = 0x0000;        // check if signal is above threshold
1432    fDataAC[114] = 0x0000;        // then check if tdcpmt is already filled by another hit...
1433          // only re-fill if time is smaller
1434    // dummy FPGA clock        
1435          if (QhitPmt_pC[0] > thresh) {
1436    fDataAC[51] = 0x006C;          if (tdcpmt[pmtleft] == 1000.) {  // fill for the first time
1437    fDataAC[52] = 0x6C6C;            tdcpmt[pmtleft] = t1;
1438    fDataAC[115] = 0x006C;            tdc[pmtleft] = t1 + c2_S[pmtleft] ;  // Signal reaches Coincidence
1439    fDataAC[116] = 0x6C6C;          }
1440            if (tdcpmt[pmtleft] < 1000.) // is already filled!
1441              if (t1 <  tdcpmt[pmtleft]) {
1442    // dummy temperatures              tdcpmt[pmtleft] = t1;
1443    fDataAC[53] = 0x0000;              t1 = t1 + c2_S[pmtleft] ;  // Signal reaches Coincidence
1444    fDataAC[54] = 0x0000;              tdc[pmtleft] = t1;
1445    fDataAC[117] = 0x0000;            }
1446    fDataAC[118] = 0x0000;        }      
1447          if (QhitPmt_pC[1] > thresh) {
1448            if (tdcpmt[pmtright] == 1000.) {  // fill for the first time
1449    // dummy DAC thresholds            tdcpmt[pmtright] = t2;
1450    for (UInt_t i=0; i<=7; i++){            tdc[pmtright] = t2 + c2_S[pmtright] ;  // Signal reaches Coincidence
1451      fDataAC[i+55] = 0x1A13;            }
1452      fDataAC[i+119] = 0x1A13;          if (tdcpmt[pmtright] < 1000.)  // is already filled!
1453    }            if (t2 <  tdcpmt[pmtright]) {
1454                  tdcpmt[pmtright] = t2;
1455    // We activate all branches. Once the digitization algorithm              t2 = t2 + c2_S[pmtright] ;
1456    // is determined only the branches need to activated which involve needed              tdc[pmtright] = t2;
1457    // information            }      
1458            }
1459    fhBookTree->SetBranchStatus("Nthcat",1);  
1460    fhBookTree->SetBranchStatus("Iparcat",1);        if (DEBUG)
1461    fhBookTree->SetBranchStatus("Icat",1);          cout<<nh<<" "<<Timetof[nh]<<" "<<t1<<" "<<t2<<endl;
1462    fhBookTree->SetBranchStatus("Xincat",1);  
1463    fhBookTree->SetBranchStatus("Yincat",1);      } // ip < 6
1464    fhBookTree->SetBranchStatus("Zincat",1);  
1465    fhBookTree->SetBranchStatus("Xoutcat",1);    }; // ****************************************       end loop over hits
1466    fhBookTree->SetBranchStatus("Youtcat",1);    
1467    fhBookTree->SetBranchStatus("Zoutcat",1);    // ======  ADC ======
1468    fhBookTree->SetBranchStatus("Erelcat",1);  
1469    fhBookTree->SetBranchStatus("Timecat",1);    for(Int_t i=0; i<48; i++){
1470    fhBookTree->SetBranchStatus("Pathcat",1);      if (QevePmt_pC[i] < 800.)  ADCtof[i]= (Int_t)(ADC_pC0A + ADC_pC1A*QevePmt_pC[i] + ADC_pC2A*pow(QevePmt_pC[i],2) + ADC_pC3A*pow(QevePmt_pC[i],3));
1471    fhBookTree->SetBranchStatus("P0cat",1);      if (QevePmt_pC[i] > 800.)  ADCtof[i]= (Int_t)(ADC_pC0B + ADC_pC1B*QevePmt_pC[i] + ADC_pC2B*pow(QevePmt_pC[i],2) + ADC_pC3B*pow(QevePmt_pC[i],3));
1472    fhBookTree->SetBranchStatus("Nthcas",1);      if (QevePmt_pC[i] > 2485.) ADCtof[i]= (Int_t)(1758. + 0.54*QevePmt_pC[i]);  //assuming a fictional 0.54 ch/pC above ADCsat
1473    fhBookTree->SetBranchStatus("Iparcas",1);      if (ADCtof[i]>ADCsat) ADCtof[i]=ADCsat;
1474    fhBookTree->SetBranchStatus("Icas",1);      if (QevePmt_pC[i] < pCthres)  ADCtof[i]= ADClast;
1475    fhBookTree->SetBranchStatus("Xincas",1);      if (ADCtof[i] < 0) ADCtof[i]=ADClast;    
1476    fhBookTree->SetBranchStatus("Yincas",1);      if (ADCtof[i] > ADClast) ADCtof[i]=ADClast;
1477    fhBookTree->SetBranchStatus("Zincas",1);    }
1478    fhBookTree->SetBranchStatus("Xoutcas",1);  
1479    fhBookTree->SetBranchStatus("Youtcas",1);  //   for(Int_t i=0; i<48; i++){
1480    fhBookTree->SetBranchStatus("Zoutcas",1);  //     if(QevePmt_pC[i] >= pCthres){
1481    fhBookTree->SetBranchStatus("Erelcas",1);  //       ADCtof[i]= (Int_t)(ADC_pC0 + ADC_pC1*QevePmt_pC[i] + ADC_pC2*pow(QevePmt_pC[i],2) + ADC_pC3*pow(QevePmt_pC[i],3));
1482    fhBookTree->SetBranchStatus("Timecas",1);  //   } else
1483    fhBookTree->SetBranchStatus("Pathcas",1);  //       ADCtof[i]= ADClast;  
1484    fhBookTree->SetBranchStatus("P0cas",1);  // }
1485    fhBookTree->SetBranchStatus("Nthcard",1);    
1486    fhBookTree->SetBranchStatus("Iparcard",1);  // // ---- introduce scale factors to tune simul ADC to real data   24-oct DC
1487    fhBookTree->SetBranchStatus("Icard",1);  
1488    fhBookTree->SetBranchStatus("Xincard",1);  //   for(Int_t i=0; i<48; i++){
1489    fhBookTree->SetBranchStatus("Yincard",1);  //     if(ADCtof[i] != ADClast){
1490    fhBookTree->SetBranchStatus("Zincard",1);  //                              //      printf("%3d, %4d, %4.2f\n",i, ADCtof[i],ScaleFact[i]);
1491    fhBookTree->SetBranchStatus("Xoutcard",1);  //       ADCtof[i]= Int_t (ADCtof[i]*ScaleFact[i]);
1492    fhBookTree->SetBranchStatus("Youtcard",1);  //                              //      printf("%3d, %4d,\n",i, ADCtof[i]);
1493    fhBookTree->SetBranchStatus("Zoutcard",1);  //     }
1494    fhBookTree->SetBranchStatus("Erelcard",1);  //   }
1495    fhBookTree->SetBranchStatus("Timecard",1);  
1496    fhBookTree->SetBranchStatus("Pathcard",1);  //   for(Int_t i=0; i<48; i++){
1497    fhBookTree->SetBranchStatus("P0card",1);  //     if(ADCtof[i] != ADClast){
1498    //       if(ADCtof[i]> ADCsat) ADCtof[i]=ADCsat;
1499    // In this simpliefied approach we will assume that once  //       else if(ADCtof[i]< 0) ADCtof[i]=ADClast;    
1500    // a particle releases > 0.5 mip in one of the 12 AC detectors it  //   }
1501    // will fire. We will furthermore assume that both cards read out  //   }    
1502    // identical data.  
1503    
1504    // If you develop you digitization algorithm, you should start by  // ======  build  TDC coincidence  ======
1505    // identifying the information present in level2 (post-darth-vader)  
1506    // data.    Float_t t_coinc = 0;
1507      Int_t ilast = 100;
1508    Float_t SumEcat[5];    for (Int_t ii=0; ii<48;ii++)
1509    Float_t SumEcas[5];      if (tdc[ii] > t_coinc) {
1510    Float_t SumEcard[5];        t_coinc = tdc[ii];
1511    for (Int_t k= 0;k<5;k++){        ilast = ii;
1512      SumEcat[k]=0.;      }
1513      SumEcas[k]=0.;    
1514      SumEcard[k]=0.;    //     cout<<ilast<<" "<<t_coinc<<endl;
1515    };    //     At t_coinc  trigger condition is fulfilled
1516      
1517    if (Nthcat>50 || Nthcas>50 || Nthcard>50)    for (Int_t ii=0; ii<48;ii++){
1518      printf("Error! NthAC out of range!\n\n");      //      if (tdc[ii] != 0) tdc1[ii] = t_coinc - tdc[ii];   // test 1
1519        if (tdc[ii] != 0) tdc1[ii] = t_coinc - tdcpmt[ii];  // test 2
1520    // look in CAT      tdc1[ii] = tdc1[ii]/tdcres[ii];                     // divide by TDC resolution
1521    //  for (UInt_t k= 0;k<50;k++){      if (tdc[ii] != 0) tdc1[ii] = tdc1[ii] + c3_S[ii];  // add cable length c3
1522    for (Int_t k= 0;k<Nthcat;k++){    } // missing parenthesis inserted! (Silvio)
1523      if (Erelcat[k] > 0)  
1524        SumEcat[Icat[k]] += Erelcat[k];    for(Int_t i=0; i<48; i++){
1525    };      if(tdc1[i] != 0.){
1526          TDCint[i]=(Int_t)tdc1[i];
1527    // look in CAS        if (TDCint[i]>4093) TDCint[i]=TDClast;  // 18-oct WM
1528    for (Int_t k= 0;k<Nthcas;k++){        if (DEBUG)
1529      if (Erelcas[k] >0)          cout<<i<<" "<<TDCint[i]<<endl;
1530        SumEcas[Icas[k]] += Erelcas[k];        //ADC[i]= ADC_pC * QevePmt_pC[i] + ADCoffset;
1531    };        //if(ADC[i]> ADClast) ADC[i]=ADClast;
1532        } else
1533    // look in CARD        TDCint[i]= TDClast;
1534    for (Int_t k= 0;k<Nthcard;k++){    }
1535      if (Erelcard[k] >0)  
1536        SumEcard[Icard[k]] += Erelcard[k];    if (DEBUG)
1537    };      cout<<"-----------"<<endl;
1538    
1539    // channel mapping              Hit Map  
1540    // 1 CARD4                      0          LSB    //------ use channelmap for ToF: 18-oct WM
1541    // 2 CAT2                       0  
1542    // 3 CAS1                       0    Int_t  channelmap[] =  {3,21,11,29,19,45,27,37,36,28,44,20,5,12,13,4,
1543    // 4 NC                         0                            6,47,14,39,22,31,30,23,38,15,46,7,0,33,16,24,
1544    // 5 CARD2                      0                            8,41,32,40,25,17,34,9,42,1,2,10,18,26,35,43};
1545    // 6 CAT4                       1  
1546    // 7 CAS4                       0      Int_t ADChelp[48];
1547    // 8 NC                         0    Int_t TDChelp[48];
1548    // 9 CARD3                      0  
1549    // 10 CAT3                      0    for(Int_t i=0; i<48; i++){
1550    // 11 CAS3                      0      Int_t ii=channelmap[i];
1551    // 12 NC                        0      ADChelp[ii]= ADCtof[i];
1552    // 13 CARD1                     0      TDChelp[ii]= TDCint[i];
1553    // 14 CAT1                      0    }
1554    // 15 CAS2                      0  
1555    // 16 NC                        0          MSB    for(Int_t i=0; i<48; i++){
1556        ADCtof[i]= ADChelp[i];
1557    // In the first version only the hit-map is filled, not the SR.      TDCint[i]= TDChelp[i];
1558      }
1559    // Threshold: 0.8 MeV.  
1560    
1561    Float_t thr = 8e-4;    // ======  write fDataTof  =======
1562    
1563    fDataAC[3] = 0x0000;  
1564      //  UChar_t tdcadd[8]={1,0,3,2,5,4,7,6};  (coded in 3 bit)
1565    if (SumEcas[0] > thr)  fDataAC[3]  = 0x0004;    UChar_t Ctrl3bit[8]={32,0,96,64,160,128,224,192};  // DC (msb in 8 bit word )
1566    if (SumEcas[1] > thr)  fDataAC[3] += 0x4000;    
1567    if (SumEcas[2] > thr)  fDataAC[3] += 0x0400;    UChar_t tofBin;
1568    if (SumEcas[3] > thr)  fDataAC[3] += 0x0040;      for (Int_t j=0; j < 12; j++){   // loop on TDC #12
1569        Int_t j12=j*23;               // for each TDC 23 bytes (8 bits)
1570    if (SumEcat[0] > thr)  fDataAC[3] += 0x2000;      fDataTof[j12+0]=0x00;   // TDC_ID
1571    if (SumEcat[1] > thr)  fDataAC[3] += 0x0002;      fDataTof[j12+1]=0x00;   // EV_COUNT
1572    if (SumEcat[2] > thr)  fDataAC[3] += 0x0200;      fDataTof[j12+2]=0x00;   // TDC_MASK (1)
1573    if (SumEcat[3] > thr)  fDataAC[3] += 0x0020;      fDataTof[j12+3]=0x00;   // TDC_MASK (2)
1574          for (Int_t k=0; k < 4; k++){   // for each TDC 4 channels (ADC+TDC)
1575    if (SumEcard[0] > thr)  fDataAC[3] += 0x1000;            
1576    if (SumEcard[1] > thr)  fDataAC[3] += 0x0010;        Int_t jk12=j12+4*k;         // ADC,TDC channel (0-47)
1577    if (SumEcard[2] > thr)  fDataAC[3] += 0x0100;  
1578    if (SumEcard[3] > thr)  fDataAC[3] += 0x0001;        tofBin =(UChar_t)(ADCtof[k+4*j]/256);   // ADC# (msb)
1579          fDataTof[jk12+4] = Bin2GrayTof(tofBin,fDataTof[jk12+4]);
1580    fDataAC[67] = fDataAC[3];        /* control bits inserted here, after the bin to gray conv - DC*/
1581          fDataTof[jk12+4] = Ctrl3bit[2*k] | fDataTof[jk12+4];
1582    //    for (Int_t i=0; i<fACbuffer; i++){        tofBin=(UChar_t)(ADCtof[k+4*j]%256);   // ADC# (lsb)
1583    //    printf("%0x  ",fDataAC[i]);          fDataTof[jk12+5] = Bin2GrayTof(tofBin,fDataTof[jk12+5]);
1584    //    if ((i+1)%8 ==0) cout << endl;        tofBin=(UChar_t)(TDCint[k+4*j]/256);   // TDC# (msb)
1585    //   }        fDataTof[jk12+6]=Bin2GrayTof(tofBin,fDataTof[jk12+6]);
1586  };        /* control bits inserted here, after the bin to gray conv - DC*/
1587          fDataTof[jk12+6] = Ctrl3bit[2*k+1] | fDataTof[jk12+6];
1588          tofBin=(UChar_t)(TDCint[k+4*j]%256);   // TDC# (lsb)
1589          fDataTof[jk12+7]=Bin2GrayTof(tofBin,fDataTof[jk12+7]);
1590  void Digitizer::DigitizeS4(){      };
1591    // creato:  S. Borisov, INFN Roma2 e MEPHI, Sett 2007      fDataTof[j12+20]=0x00;   // TEMP1
1592    TString ciao,modo="ns";      fDataTof[j12+21]=0x00;   // TEMP2
1593    Int_t i,j,t,NdF,pmt,NdFT,S4,S4v=0,S4p=32;      fDataTof[j12+22]= EvaluateCrcTof(pTof);   // CRC
1594    Float_t E0,E1=1e-6,Ert,X,Y,Z,x,y,z,V[3],Xs[2],Ys[2],Zs[2],Yp[6],q,w,p=0.1,l,l0=500.;      pTof+=23;
1595    Xs[0]=-24.1;    };
1596    Xs[1]=24.1;  
1597    Ys[0]=-24.1;    // ======  evaluate trigger variables  =======
1598    Ys[1]=24.1;  
1599    Zs[0]=-0.5;    //fDataTrigger: 152 bytes  (corrected 30/11/'07 SO - it was 153)
1600    Zs[1]=0.5;  
1601    Yp[0]=-20.;    // initialization:
1602    Yp[2]=-1.;    for (Int_t j=0; j < 152; j++)
1603    Yp[4]=17.;      fDataTrigger[j]=0x00;
1604    for(i=0;i<3;i++)    UChar_t *pTrg=fDataTrigger;
1605      Yp[2*i+1]=Yp[2*i]+3;  
1606    srand(time(NULL));    // Only the variables with a (*) are modified; the others are set to 0
1607    // --- activate branches:    // info given in #bites data + #bites crc
1608    fhBookTree->SetBranchStatus("Nthtof",1);    // TB_READ_PMT_PLANE      :  6 + 1
1609    fhBookTree->SetBranchStatus("Ipltof",1);    // TB_READ_EVENT_COUNT    :  3 + 1 (*)
1610    fhBookTree->SetBranchStatus("Ipaddle",1);    // TB_READ_TRIGGER_RATE   : 12 + 1
1611        // TB_READ_D_L_TIME       :  4 + 1
1612    fhBookTree->SetBranchStatus("Xintof",1);    // TB_READ_S4_CAL_COUNT   :  4 + 1
1613    fhBookTree->SetBranchStatus("Yintof",1);    // TB_READ_PMT_COUNT1     : 48 + 1
1614    fhBookTree->SetBranchStatus("Xouttof",1);    // TB_READ_PMT_COUNT2     : 48 + 1
1615    fhBookTree->SetBranchStatus("Youttof",1);    // TB_READ_PATTERN_BUSY   :  8 + 1
1616        // TB_READ_PATTERN_TRIGGER:  7 + 1 (*)
1617    fhBookTree->SetBranchStatus("Ereltof",1);    // TB_READ_TRIGGER_CONF   :  2 + 1 (*)
1618    fhBookTree->SetBranchStatus("Timetof",1);  
1619    NdFT=0;    // TB_READ_EVENT_COUNT
1620    Ert=0;    fhBookTree->SetBranchStatus("Ievnt",&Ievnt);
1621    for(i=0;i<Nthtof;i++){    UInt_t cTrg  = (UInt_t)Ievnt;  //counter
1622      if(Ipltof[i]!=6) continue;    UInt_t cTrg2 = 0;  //counter with bits inverted, according to document
1623      Ert+=Ereltof[i];                       //"formato dati provenienti dalla trigger board"
1624            for (Int_t i=0; i < 24; i++){  // Use the first 24 bits
1625            if (cTrg & (0x1 << i) )
1626      if(modo=="ns") continue;        cTrg2 = cTrg2 | (0x1 << (24-i));
1627      NdF=Int_t(Ereltof[i]/E1);    };
1628      NdFT=0;    fDataTrigger[7] = (UChar_t)(cTrg2 >> 16); // 8 MSbits (out  of 24)
1629      X=Xintof[i];    fDataTrigger[8] = (UChar_t)(cTrg2 >> 8);  // 8 "middle" bits
1630      Y=Yintof[i];    fDataTrigger[9] = (UChar_t)(cTrg2);       // 8 LSbits
1631      Z=((Float_t)random()/(Float_t)0x7fffffff)-0.5;    pTrg=fDataTrigger+7;
1632      //cout<<"XYZ "<<X<<"  "<<Y<<"  "<<Z<<endl;    fDataTrigger[10]=EvaluateCrcTrigger(pTrg, 3);
1633      for(j=0;j<NdF;j++){  
1634        q=(Float_t)random()/(Float_t)0x7fffffff;    // TB_READ_PATTERN_TRIGGER: bytes 141-148:
1635        w=(Float_t)random()/(Float_t)0x7fffffff;    // PatternTrigMap[i] corresponds to bit i in TB_READ_PATTERN_TRIGGER:
1636        // cout<<"qw "<<q<<" "<<w<<endl;    // mapping according to documents:
1637        V[0]=p*cos(6.28318*q);    // 1. "formato dati provenienti dalla trigger board"
1638        V[1]=p*sin(6.28318*q);    // 2. "The ToF quicklook software", Appendix A (Campana, Nagni)
1639        V[2]=p*(2.*w-1.);    Int_t PatternTrigMap[]={29,42,43,1,16,7,17,28,33,41,46,2,15,8,18,27,
1640        pmt=0;                            30,40,44,3,14,9,19,26,32,37,47,4,13,10,20,25,
1641        x=X;                            34,31,38,45,5,12,21,24,36,35,39,48,6,11,22,23};
1642        y=Y;  
1643        z=Z;    for (Int_t i=0; i < 48; i++)
1644        while(pmt==0 && (x>Xs[0] && x<Xs[1])&&(y>Ys[0] && y<Ys[1])&&(z>Zs[0] && z<Zs[1])){      //if (ADCtof[i]>thrTrg)
1645          l=0;      if (tdc1[channelmap[i]]!=0)
1646          while(pmt==0 && (x>Xs[0] && x<Xs[1])&&(y>Ys[0] && y<Ys[1])&&(z>Zs[0] && z<Zs[1])){        fDataTrigger[147-(Int_t)((PatternTrigMap[i]+1)/8)]=fDataTrigger[147-(Int_t)((PatternTrigMap[i]+1)/8)] | (0x1 << (PatternTrigMap[i]%8));
1647            x+=V[0];    pTrg=fDataTrigger+141;
1648            y+=V[1];    fDataTrigger[148]=EvaluateCrcTrigger(pTrg, 7);
1649            z+=V[2];  
1650            l+=p;    // TB_READ_TRIGGER_CONF   : set always acq.mode TOF4
1651            //cout<<x<<"  "<<y<<"  "<<z<<"  "<<l<<endl;    //
1652            //cin>>ciao;    // TOF1: S1-S2-S3 (&,|)
1653          }    // TOF4: S2-S3 (&,&)
1654          if((x<Xs[0]+p || x>Xs[1]-p)&&(y>Ys[0]+p && y<Ys[1]-p)&&(z>Zs[0]+p && z<Zs[1]-p)){    fDataTrigger[149]=0x02;
1655            for(t=0;t<3;t++){    fDataTrigger[150]=0x0;
1656              if(y>=Yp[2*t] && y<Yp[2*t+1]){    pTrg=fDataTrigger+149;
1657                if(pmt==0)NdFT++;    fDataTrigger[151]=EvaluateCrcTrigger(pTrg, 2);
1658                pmt=1;  
1659                //cout<<NdFT<<endl;    return(0);
1660                break;  };
1661              }  
1662            }  
1663            if(pmt==1)break;  UChar_t Digitizer::Bin2GrayTof(UChar_t binaTOF,UChar_t grayTOF){
1664            V[0]=-V[0];    union graytof_data {
1665          }      UChar_t word;
1666          q=(Float_t)random()/(Float_t)0x7fffffff;      struct bit_field {
1667          w=1-exp(-l/l0);        unsigned b0:1;
1668          if(q<w)break;        unsigned b1:1;
1669          q=(Float_t)random()/(Float_t)0x7fffffff;        unsigned b2:1;
1670          w=0.5;        unsigned b3:1;
1671          if(q<w)break;        unsigned b4:1;
1672          if((x>Xs[0]+p && x<Xs[1]-p)&&(y<Ys[0]+p || y>Ys[1]-p)&&(z>Zs[0]+p && z<Zs[1]-p))V[1]=-V[1];        unsigned b5:1;
1673          if((x>Xs[0]+p && x<Xs[1]-p)&&(y>Ys[0]+p && y<Ys[1]-p)&&(z<Zs[0]+p || z>Zs[1]-p))V[2]=-V[2];        unsigned b6:1;
1674          x+=V[0];        unsigned b7:1;
1675          y+=V[1];      } bit;
1676          z+=V[2];    } bi,gr;
1677          l=0;    //
1678          //cout<<x<<"  "<<y<<"  "<<z<<"  "<<l<<endl;    bi.word = binaTOF;
1679                  //cin>>ciao;    gr.word = grayTOF;
1680        }    //
1681      }    gr.bit.b0 = bi.bit.b1 ^ bi.bit.b0;
1682    }    gr.bit.b1 = bi.bit.b2 ^ bi.bit.b1;
1683    Ert=Ert/0.002;    gr.bit.b2 = bi.bit.b3 ^ bi.bit.b2;
1684    q=(Float_t)(random())/(Float_t)(0x7fffffff);    gr.bit.b3 = bi.bit.b3;
1685    w=0.7;    //
1686    //E0=Float_t(4064)/7;    /* bin to gray conversion 4 bit per time*/
1687    E0=4064./7.;    //
1688    S4=(Int_t)(4064.*(1.-exp(-int(Ert)/E0)));    gr.bit.b4 = bi.bit.b5 ^ bi.bit.b4;
1689    //S4=Ert*7;    gr.bit.b5 = bi.bit.b6 ^ bi.bit.b5;
1690    i=S4/4;    gr.bit.b6 = bi.bit.b7 ^ bi.bit.b6;
1691    if(S4%4==0)    gr.bit.b7 = bi.bit.b7;
1692      S4v=S4+S4p;    //
1693    else if(S4%4==1) {    return(gr.word);
1694      if(q<w) S4v=S4-1+S4p;  }
1695      else S4v=S4+1+S4p;  
1696    } else if(S4%4==2)  UChar_t Digitizer::EvaluateCrcTof(UChar_t *pTof) {
1697      S4v=S4+S4p;    Bool_t DEBUG=false;
1698    else if(S4%4==3){    if (DEBUG)
1699      if(q<w) S4v=S4+1+S4p;      return(0x00);
1700      else S4v=S4-1+S4p;  
1701    }    UChar_t crcTof=0x00;
1702      UChar_t *pc=&crcTof, *pc2;
1703    cout << "Ert= " <<Ert<<"; S4v= "<<S4v<<"; S4= "<<S4<<endl;    pc2=pTof;
1704    fDataS4[0]=S4v;//0xf028;    for (Int_t jp=0; jp < 23; jp++){
1705    fDataS4[1]=0xd800;      //crcTof = crc8(...)
1706    fDataS4[2]=0x0300;      Crc8Tof(pc2++,pc);
1707    //  cout<<"  PMT  "<<NdFT<<"  "<<NdF<<endl;      //    printf("%2i --- %x\n",jp,crcTof);
1708    //cin>>ciao;    }
1709  }    return(crcTof);
1710    }
1711    
1712    UChar_t Digitizer::EvaluateCrcTrigger(UChar_t *pTrg, Int_t nb) {
1713  void Digitizer::DigitizeND(){    Bool_t DEBUG=false;
1714    // creato:  S. Borisov, INFN Roma2 e MEPHI, Sett 2007    if (DEBUG)
1715    Int_t i=0;      return(0x00);
1716    UShort_t NdN=0;  
1717    fhBookTree->SetBranchStatus("Nthnd",1);    UChar_t crcTrg=0x00;
1718    fhBookTree->SetBranchStatus("Itubend",1);    UChar_t *pc=&crcTrg, *pc2;
1719    fhBookTree->SetBranchStatus("Iparnd",1);      pc2=pTrg;
1720    fhBookTree->SetBranchStatus("Xinnd",1);    for (Int_t jp=0; jp < nb; jp++)
1721    fhBookTree->SetBranchStatus("Yinnd",1);      Crc8Tof(pc2++,pc);
1722    fhBookTree->SetBranchStatus("Zinnd",1);    return(crcTrg);
1723    fhBookTree->SetBranchStatus("Xoutnd",1);  }
1724    fhBookTree->SetBranchStatus("Youtnd",1);  
1725    fhBookTree->SetBranchStatus("Zoutnd",1);  void Digitizer::Crc8Tof(UChar_t *oldCRC, UChar_t *crcTof){
1726    fhBookTree->SetBranchStatus("Erelnd",1);    union crctof_data {
1727    fhBookTree->SetBranchStatus("Timend",1);      UChar_t word;
1728    fhBookTree->SetBranchStatus("Pathnd",1);      struct bit_field {
1729    fhBookTree->SetBranchStatus("P0nd",1);        unsigned b0:1;
1730    //cout<<"n="<<Nthnd<<"  "<<NdN<<"\n";        unsigned b1:1;
1731    for(i=0;i<Nthnd;i++){        unsigned b2:1;
1732      if(Iparnd[i]==13){        unsigned b3:1;
1733        NdN++;        unsigned b4:1;
1734      }        unsigned b5:1;
1735    }        unsigned b6:1;
1736    NdN=100;        unsigned b7:1;
1737    for(i=0;i<3;i++){      } bit;
1738      fDataND[2*i]=0x0000;    } c,d,r;
1739      fDataND[2*i+1]=0x010F;  
1740    }    c.word = *oldCRC;
1741    fDataND[0]=0xFF00 & (256*NdN);    //d.word = *newCRC;
1742  }    d.word = *crcTof;
1743      r.word = 0;
1744    
1745  void Digitizer::DigitizeDummy() {    r.bit.b0 = c.bit.b7 ^ c.bit.b6 ^ c.bit.b0 ^
1746                 d.bit.b0 ^ d.bit.b6 ^ d.bit.b7;
1747    fhBookTree->SetBranchStatus("Enestrip",1);  
1748      r.bit.b1 = c.bit.b6 ^ c.bit.b1 ^ c.bit.b0 ^
1749    // dumy header               d.bit.b0 ^ d.bit.b1 ^ d.bit.b6;
1750    fDataDummy[0] = 0xCAAA;  
1751      r.bit.b2 = c.bit.b6 ^ c.bit.b2 ^ c.bit.b1 ^ c.bit.b0 ^
1752    for (Int_t i=1; i<fDummybuffer; i++){               d.bit.b0 ^ d.bit.b1 ^ d.bit.b2 ^ d.bit.b6;
1753      fDataDummy[i] = 0xFFFF;  
1754      //   printf("%0x  ",fDataDummy[i]);      r.bit.b3 = c.bit.b7 ^ c.bit.b3 ^ c.bit.b2 ^ c.bit.b1 ^
1755      //if ((i+1)%8 ==0) cout << endl;               d.bit.b1 ^ d.bit.b2 ^ d.bit.b3 ^ d.bit.b7;
1756    }  
1757  };    r.bit.b4 = c.bit.b4 ^ c.bit.b3 ^ c.bit.b2 ^
1758                 d.bit.b2 ^ d.bit.b3 ^ d.bit.b4;
1759    
1760  void Digitizer::WriteData(){    r.bit.b5 = c.bit.b5 ^ c.bit.b4 ^ c.bit.b3 ^
1761                 d.bit.b3 ^ d.bit.b4 ^ d.bit.b5;
1762    // Routine that writes the data to a binary file  
1763    // PSCU data are already swapped    r.bit.b6 = c.bit.b6 ^ c.bit.b5 ^ c.bit.b4 ^
1764    fOutputfile.write(reinterpret_cast<char*>(fDataPSCU),sizeof(UShort_t)*fPSCUbuffer);               d.bit.b4 ^ d.bit.b5 ^ d.bit.b6;
1765    // TRG  
1766    fOutputfile.write(reinterpret_cast<char*>(fDataTrigger),sizeof(UChar_t)*153);    r.bit.b7 = c.bit.b7 ^ c.bit.b6 ^ c.bit.b5 ^
1767    // TOF               d.bit.b5 ^ d.bit.b6 ^ d.bit.b7 ;
1768    fOutputfile.write(reinterpret_cast<char*>(fDataTof),sizeof(UChar_t)*276);  
1769    // AC    *crcTof=r.word;
1770    UShort_t temp[1000000];    //return r.word;
1771    memset(temp,0,sizeof(UShort_t)*1000000);  };
1772    swab(fDataAC,temp,sizeof(UShort_t)*fACbuffer);  // WE MUST SWAP THE BYTES!!!  
1773    fOutputfile.write(reinterpret_cast<char*>(temp),sizeof(UShort_t)*fACbuffer);  //void Digitizer::Paddle2Pmt(Int_t plane, Int_t paddle, Int_t* &pmtleft, Int_t* &pmtright){
1774    // CALO  void Digitizer::Paddle2Pmt(Int_t plane, Int_t paddle, Int_t *pl, Int_t *pr){
1775    memset(temp,0,sizeof(UShort_t)*1000000);    //* @param plane    (0 - 5)
1776    swab(fDataCALO,temp,sizeof(UShort_t)*fCALOlength); // WE MUST SWAP THE BYTES!!!    //* @param paddle   (plane=0, paddle = 0,...5)
1777    fOutputfile.write(reinterpret_cast<char*>(temp),sizeof(UShort_t)*fCALOlength);    //* @param padid    (0 - 23)  
1778    // TRK    //
1779    memset(temp,0,sizeof(UShort_t)*1000000);    Int_t padid=-1;
1780    swab(fDataTrack,temp,sizeof(UShort_t)*fTracklength);  // WE MUST SWAP THE BYTES!!!    Int_t pads[6]={8,6,2,2,3,3};
1781    fOutputfile.write(reinterpret_cast<char*>(temp),sizeof(UShort_t)*fTracklength);    //
1782    fTracklength=0;    Int_t somma=0;
1783     // padding to 64 bytes    Int_t np=plane;
1784    //    for(Int_t j=0; j<np; j++)
1785    if ( fPadding ){      somma+=pads[j];
1786      fOutputfile.write(reinterpret_cast<char*>(fDataPadding),sizeof(UChar_t)*fPadding);    padid=paddle+somma;
1787    };    *pl = padid*2;
1788    // S4    //  *pr = *pr + 1;
1789    memset(temp,0,sizeof(UShort_t)*1000000);    *pr = *pl + 1; // WM
1790    swab(fDataS4,temp,sizeof(UShort_t)*fS4buffer);  // WE MUST SWAP THE BYTES!!!  };
1791    fOutputfile.write(reinterpret_cast<char*>(temp),sizeof(UShort_t)*fS4buffer);  
1792    // ND  void Digitizer::DigitizeAC() {
1793    memset(temp,0,sizeof(UShort_t)*1000000);    // created:  J. Conrad, KTH
1794    swab(fDataND,temp,sizeof(UShort_t)*fNDbuffer);  // WE MUST SWAP THE BYTES!!!    // modified: S. Orsi, INFN Roma2
1795    fOutputfile.write(reinterpret_cast<char*>(temp),sizeof(UShort_t)*fNDbuffer);    // fDataAC[0-63]:   main AC board
1796  };    // fDataAC[64-127]: extra AC board (identical to main board, for now)
1797    
1798      // We activate all branches. Once the digitization algorithm is determined
1799  void Digitizer::ReadData(){    // only the branches that involve needed information will be activated
1800      
1801    UShort_t InData[64];    fhBookTree->SetBranchStatus("Ievnt",&Ievnt);
1802      fhBookTree->SetBranchStatus("Nthcat",1);
1803    // for debuggigng purposes only, write your own routine if you like (many    fhBookTree->SetBranchStatus("Iparcat",1);
1804    // hardwired things.    fhBookTree->SetBranchStatus("Icat",1);
1805        fhBookTree->SetBranchStatus("Xincat",1);
1806    ifstream InputFile;    fhBookTree->SetBranchStatus("Yincat",1);
1807      fhBookTree->SetBranchStatus("Zincat",1);
1808    // if (!InputFile) {    fhBookTree->SetBranchStatus("Xoutcat",1);
1809      fhBookTree->SetBranchStatus("Youtcat",1);
1810    //     std::cout << "ERROR" << endl;    fhBookTree->SetBranchStatus("Zoutcat",1);
1811    //     // An error occurred!    fhBookTree->SetBranchStatus("Erelcat",1);
1812    //     // myFile.gcount() returns the number of bytes read.    fhBookTree->SetBranchStatus("Timecat",1);
1813    //     // calling myFile.clear() will reset the stream state    fhBookTree->SetBranchStatus("Pathcat",1);
1814    //     // so it is usable again.    fhBookTree->SetBranchStatus("P0cat",1);
1815    //   };    fhBookTree->SetBranchStatus("Nthcas",1);
1816      fhBookTree->SetBranchStatus("Iparcas",1);
1817      fhBookTree->SetBranchStatus("Icas",1);
1818        fhBookTree->SetBranchStatus("Xincas",1);
1819    //InputFile.seekg(0);    fhBookTree->SetBranchStatus("Yincas",1);
1820      fhBookTree->SetBranchStatus("Zincas",1);
1821    InputFile.open(fFilename, ios::in | ios::binary);    fhBookTree->SetBranchStatus("Xoutcas",1);
1822    //    fOutputfile.seekg(0);    fhBookTree->SetBranchStatus("Youtcas",1);
1823    if (!InputFile.is_open()) std::cout << "ERROR" << endl;    fhBookTree->SetBranchStatus("Zoutcas",1);
1824      fhBookTree->SetBranchStatus("Erelcas",1);
1825    InputFile.seekg(0);    fhBookTree->SetBranchStatus("Timecas",1);
1826        fhBookTree->SetBranchStatus("Pathcas",1);
1827    for (Int_t k=0; k<=1000; k++){    fhBookTree->SetBranchStatus("P0cas",1);
1828      InputFile.read(reinterpret_cast<char*>(InData),384*sizeof(UShort_t));    fhBookTree->SetBranchStatus("Nthcard",1);
1829      fhBookTree->SetBranchStatus("Iparcard",1);
1830      std::cout << "Read back: " << endl << endl;    fhBookTree->SetBranchStatus("Icard",1);
1831      fhBookTree->SetBranchStatus("Xincard",1);
1832      for (Int_t i=0; i<=384; i++){    fhBookTree->SetBranchStatus("Yincard",1);
1833        printf("%4x ", InData[i]);      fhBookTree->SetBranchStatus("Zincard",1);
1834        if ((i+1)%8 ==0) cout << endl;    fhBookTree->SetBranchStatus("Xoutcard",1);
1835      }    fhBookTree->SetBranchStatus("Youtcard",1);
1836      fhBookTree->SetBranchStatus("Zoutcard",1);
1837    }    fhBookTree->SetBranchStatus("Erelcard",1);
1838    cout << endl;    fhBookTree->SetBranchStatus("Timecard",1);
1839    InputFile.close();    fhBookTree->SetBranchStatus("Pathcard",1);
1840      fhBookTree->SetBranchStatus("P0card",1);
1841  };  
1842      fDataAC[0] = 0xACAC;
1843      fDataAC[64]= 0xACAC;
1844      fDataAC[1] = 0xAC11;  
1845  void Digitizer::DigitizeTrack() {    fDataAC[65] = 0xAC22;  
1846  //std:: cout << "Entering DigitizeTrack " << endl;  
1847  Float_t  AdcTrack[fNviews][fNstrips_view];  //  Vector of strips to be compressed    // the third word is a status word (dummy: "no errors are present in the AC boards")
1848      fDataAC[2] = 0xFFFF; //FFEF?
1849  Int_t Iview;    fDataAC[66] = 0xFFFF;
1850  Int_t Nstrip;  
1851      const UInt_t nReg = 6;
1852    for (Int_t j=0; j<fNviews;j++) {  
1853      // FPGA Registers (dummy)
1854      for (Int_t i=0; i<fNladder;i++) {    for (UInt_t i=0; i<=nReg; i++){
1855        fDataAC[i+4] = 0xFFFF;
1856        Float_t commonN1=gRandom->Gaus(0.,fSigmaCommon);      fDataAC[i+68] = 0xFFFF;
1857        Float_t commonN2=gRandom->Gaus(0.,fSigmaCommon);    }
1858        for (Int_t k=0; k<fNstrips_ladder;k++) {  
1859        Nstrip=i*fNstrips_ladder+k;    // the last word is a CRC
1860        AdcTrack[j][Nstrip]=gRandom->Gaus(fPedeTrack[j][Nstrip],fSigmaTrack[j][Nstrip]);    // Dummy for the time being, but it might need to be calculated in the end
1861        if(k<4*128) {AdcTrack[j][Nstrip] += commonN1;}  // full correlation of 4 VA1 Com. Noise    fDataAC[63] = 0xABCD;
1862        else {AdcTrack[j][Nstrip] += commonN2;}   // full correlation of 4 VA1 Com. Noise    fDataAC[127] = 0xABCD;
1863    
1864        };    // shift registers (moved to the end of the routine)
1865          
1866              //Int_t evntLSB=Ievnt%65536;
1867      };    //Int_t evntMSB=(Int_t)(Ievnt/65536);
1868      Int_t evntLSB=(UShort_t)Ievnt;
1869      Int_t evntMSB=Ievnt >> 16;
1870    };  
1871      // singles counters are dummy
1872      for (UInt_t i=0; i<=15; i++){  //SO Oct '07: // for (UInt_t i=0; i<=16; i++){
1873    fhBookTree->SetBranchStatus("Nstrpx",1);      //     fDataAC[i+26] = 0x0000;  
1874    fhBookTree->SetBranchStatus("Npstripx",1);      //     fDataAC[i+90] = 0x0000;
1875    fhBookTree->SetBranchStatus("Ntstripx",1);      fDataAC[i+26] = evntLSB;
1876    fhBookTree->SetBranchStatus("Istripx",1);      fDataAC[i+90] = evntLSB;
1877    fhBookTree->SetBranchStatus("Qstripx",1);    };
1878    fhBookTree->SetBranchStatus("Xstripx",1);    
1879    fhBookTree->SetBranchStatus("Nstrpy",1);    // coincidences are dummy (increment by 1 at each event)
1880    fhBookTree->SetBranchStatus("Npstripy",1);    // for (UInt_t i=0; i<=7; i++){
1881    fhBookTree->SetBranchStatus("Ntstripy",1);    //    fDataAC[i+42] = 0x0000;
1882    fhBookTree->SetBranchStatus("Istripy",1);    //    fDataAC[i+106] = 0x0000;
1883    fhBookTree->SetBranchStatus("Qstripy",1);    //   }
1884    fhBookTree->SetBranchStatus("Ystripy",1);    for (UInt_t i=0; i<=7; i++){
1885        fDataAC[i+42] = evntLSB;
1886        fDataAC[i+106] = evntLSB;
1887      };
1888    Float_t ADCfull;  
1889    Int_t iladd=0;    // increments for every trigger might be needed at some point.
1890    for (Int_t ix=0; ix<Nstrpx;ix++) {    // dummy for now
1891    Iview=Npstripx[ix]*2-1;    fDataAC[50]  = 0x0000;
1892    Nstrip=(Int_t)Istripx[ix]-1;    fDataAC[114] = 0x0000;
1893    if(Nstrip<fNstrips_ladder) iladd=0;  
1894    if((Nstrip>=fNstrips_ladder)&&(Nstrip<2*fNstrips_ladder)) iladd=1;    // dummy FPGA clock (increment by 1 at each event)
1895    if((Nstrip>=2*fNstrips_ladder)&&(Nstrip<3*fNstrips_ladder)) iladd=2;    /*    
1896    ADCfull=AdcTrack[Iview][Nstrip] += Qstripx[ix]*fMipCor[iladd][Iview];      fDataAC[51] = 0x006C;
1897    AdcTrack[Iview][Nstrip] *= SaturationTrack(ADCfull);      fDataAC[52] = 0x6C6C;
1898        fDataAC[115] = 0x006C;
1899    };      fDataAC[116] = 0x6C6C;
1900      */
1901      if (Ievnt<=0xFFFF) {
1902    for (Int_t iy=0; iy<Nstrpy;iy++) {      fDataAC[51] = 0x0000;
1903    Iview=Npstripy[iy]*2-2;      fDataAC[52] = Ievnt;
1904    Nstrip=(Int_t)Istripy[iy]-1;      fDataAC[115] = 0x0000;
1905    if(Nstrip<fNstrips_ladder) iladd=0;      fDataAC[116] = Ievnt;
1906    if((Nstrip>=fNstrips_ladder)&&(Nstrip<2*fNstrips_ladder)) iladd=1;    } else {
1907    if((Nstrip>=2*fNstrips_ladder)&&(Nstrip<3*fNstrips_ladder)) iladd=2;      fDataAC[51] = evntMSB;
1908    ADCfull=AdcTrack[Iview][Nstrip] -= Qstripy[iy]*fMipCor[iladd][Iview];      fDataAC[52] = evntLSB;
1909    AdcTrack[Iview][Nstrip] *= SaturationTrack(ADCfull);      fDataAC[115] = fDataAC[51];
1910        fDataAC[116] = fDataAC[52];
1911    };      }
1912          
1913  CompressTrackData(AdcTrack);  // Compress and Digitize data of one Ladder  in turn for all ladders    // dummy temperatures
1914      fDataAC[53] = 0x0000;
1915  };    fDataAC[54] = 0x0000;
1916      fDataAC[117] = 0x0000;
1917      fDataAC[118] = 0x0000;
1918    
1919  void Digitizer::DigitizeTrackCalib(Int_t ii) {  
1920      // dummy DAC thresholds
1921  std:: cout << "Entering DigitizeTrackCalib " << ii << endl;    for (UInt_t i=0; i<=7; i++){
1922  if( (ii!=1)&&(ii!=2) ) {      fDataAC[i+55] = 0x1A13;  
1923   std:: cout << "error wrong DigitizeTrackCalib argument" << endl;      fDataAC[i+119] = 0x1A13;
1924   return;    }
1925  };    
1926      // In this simpliefied approach we will assume that once
1927  memset(fDataTrack,0,sizeof(UShort_t)*fTRACKbuffer);    // a particle releases > 0.5 mip in one of the 12 AC detectors it
1928  fTracklength=0;    // will fire. We will furthermore assume that both cards read out
1929      // identical data.
1930  UShort_t Dato;  
1931      // If you develop your digitization algorithm, you should start by
1932  Float_t dato1;    // identifying the information present in level2 (post-darth-vader)
1933  Float_t dato2;    // data.
1934  Float_t dato3;  
1935  Float_t dato4;    Float_t SumEcat[5];
1936      Float_t SumEcas[5];
1937  UShort_t DatoDec;    Float_t SumEcard[5];
1938  UShort_t DatoDec1;    for (Int_t k= 0;k<5;k++){
1939  UShort_t DatoDec2;      SumEcat[k]=0.;
1940  UShort_t DatoDec3;      SumEcas[k]=0.;
1941  UShort_t DatoDec4;      SumEcard[k]=0.;
1942      };
1943  UShort_t EVENT_CAL;  
1944  UShort_t PED_L1;    if (Nthcat>50 || Nthcas>50 || Nthcard>50)
1945  UShort_t ReLength;      printf("*** ERROR AC! NthAC out of range!\n\n");
1946  UShort_t OveCheckCode;  
1947  //UShort_t PED_L2;    // energy dependence on position (see file AcFitOutputDistancePmt.C by S.Orsi)
1948  //UShort_t PED_L3HI;    // based on J.Lundquist's calculations (PhD thesis, page 94)
1949  //UShort_t PED_L3LO;    // function: [0]+[1]*atan([2]/(x+1)), where the 3 parameters are:
1950  //UShort_t SIG_L1HI;    //   8.25470e-01   +- 1.79489e-02
1951  //UShort_t SIG_L1LO;    //   6.41609e-01   +- 2.65846e-02
1952  //UShort_t SIG_L2HI;    //   9.81177e+00   +- 1.21284e+00
1953  //UShort_t SIG_L2LO;    // hp: 1 minimum ionising particle at 35cm from the PMT releases 1mip
1954  //UShort_t SIG_L3;  
1955  //UShort_t BAD_L1;    TF1 *attenAC = new TF1("fAttAC",".825+.64*atan(9.8/x)",0.,45.);
1956  //UShort_t BAD_L2LO;  
1957  //UShort_t BAD_L3HI;    // PMT positions: x,y,z: (average position of the 2 PMTs)
1958  //UShort_t BAD_L3LO;    Float_t posCasPmt[4][3]={{28.308, -17.168, 63.644},    // 1 - CAS CPU: x,y,z
1959  //UShort_t FLAG;                             {18.893, 24.913, 63.644},     // 2 - CAS DCDC
1960                               {-24.307, 17.162, 63.644},    // 3 - CAS VME  
1961                               {-17.765, -28.300, 63.644}};  // 4 - CAS IPM  
1962    Int_t DSPpos;    
1963    for (Int_t j=ii-1; j<fNviews;j+=2) {    Float_t dAC=0.; // distance from PMT
1964    UShort_t CkSum=0;    
1965    // here skip the dsp header and his trailer , to be written later    // look in CAT
1966    DSPpos=fTracklength;    //  for (UInt_t k= 0;k<50;k++){
1967    fTracklength=fTracklength+13+3;    for (Int_t k= 0;k<Nthcat;k++){
1968        if (Erelcat[k] > 0)
1969          SumEcat[Icat[k]] += Erelcat[k];
1970      for (Int_t i=0; i<fNladder;i++) {    };
1971        for (Int_t k=0; k<fNstrips_ladder;k++) {  
1972        // write in buffer the current LADDER    // look in CAS
1973        Dato=(UShort_t)fPedeTrack[j][i*fNstrips_ladder+k];    for (Int_t k= 0;k<Nthcas;k++){
1974        dato1=fPedeTrack[j][i*fNstrips_ladder+k]-Dato;      if (Erelcas[k] >0) {
1975          dAC=sqrt(pow((Xincas[k]+Xoutcas[k])/2 - posCasPmt[Icas[k]-1][0],2) + pow((Yincas[k]+Youtcas[k])/2 - posCasPmt[Icas[k]-1][1],2) + pow((Zincas[k]+Zoutcas[k])/2 - posCasPmt[Icas[k]-1][2],2));
1976        DatoDec1=(UShort_t)(dato1*2);        SumEcas[Icas[k]] += Erelcas[k]*attenAC->Eval(dAC);
1977        dato2=dato1*2-DatoDec1;      }
1978      };
1979        DatoDec2=(UShort_t)(dato2*2);  
1980        dato3=dato2*2-DatoDec2;    // look in CARD
1981            for (Int_t k= 0;k<Nthcard;k++){
1982        DatoDec3=(UShort_t)(dato3*2);      if (Erelcard[k] >0)
1983        dato4=dato3*2-DatoDec3;        SumEcard[Icard[k]] += Erelcard[k];
1984            };
1985        DatoDec4=(UShort_t)(dato4*2);  
1986            // channel mapping              Hit Map
1987        DatoDec=DatoDec1*0x0008+DatoDec2*0x0004+DatoDec3*0x0002+DatoDec4*0x0001;    // 1 CARD4                      0          LSB
1988        fDataTrack[fTracklength]=( (Dato << 4) | (DatoDec & 0x000F) );    // 2 CAT2                       0
1989        CkSum=CkSum^fDataTrack[fTracklength];    // 3 CAS1                       0
1990        fTracklength++;    // 4 NC                         0
1991        };    // 5 CARD2                      0
1992      // 6 CAT4                       1
1993        for (Int_t k=0; k<fNstrips_ladder;k++) {    // 7 CAS4                       0  
1994        // write in buffer the current LADDER    // 8 NC                         0
1995        Dato=(UShort_t)fSigmaTrack[j][i*fNstrips_ladder+k];    // 9 CARD3                      0
1996        dato1=fSigmaTrack[j][i*fNstrips_ladder+k]-Dato;    // 10 CAT3                      0
1997      // 11 CAS3                      0
1998        DatoDec1=(UShort_t)(dato1*2);    // 12 NC                        0
1999        dato2=dato1*2-DatoDec1;    // 13 CARD1                     0
2000      // 14 CAT1                      0
2001        DatoDec2=(UShort_t)(dato2*2);    // 15 CAS2                      0
2002        dato3=dato2*2-DatoDec2;    // 16 NC                        0          MSB
2003          
2004        DatoDec3=(UShort_t)(dato3*2);    // In the first version only the hit-map is filled, not the SR.
2005        dato4=dato3*2-DatoDec3;  
2006            // Threshold: 0.8 MeV.
2007        DatoDec4=(UShort_t)(dato4*2);  
2008            Float_t thr = 8e-4;
2009        DatoDec=DatoDec1*0x0008+DatoDec2*0x0004+DatoDec3*0x0002+DatoDec4*0x0001;  
2010            fDataAC[3] = 0x0000;
2011        fDataTrack[fTracklength]=( (Dato << 4) | (DatoDec & 0x000F) );  
2012        CkSum=CkSum^fDataTrack[fTracklength];    if (SumEcas[0] > thr)  fDataAC[3]  = 0x0004;
2013        fTracklength++;    if (SumEcas[1] > thr)  fDataAC[3] += 0x4000;
2014        };    if (SumEcas[2] > thr)  fDataAC[3] += 0x0400;
2015            if (SumEcas[3] > thr)  fDataAC[3] += 0x0040;  
2016        for (Int_t k=0; k<64;k++) {  
2017        fDataTrack[fTracklength]=0x0000;    if (SumEcat[0] > thr)  fDataAC[3] += 0x2000;
2018        CkSum=CkSum^fDataTrack[fTracklength];    if (SumEcat[1] > thr)  fDataAC[3] += 0x0002;
2019        fTracklength++;    if (SumEcat[2] > thr)  fDataAC[3] += 0x0200;
2020      if (SumEcat[3] > thr)  fDataAC[3] += 0x0020;
2021        };    
2022        // end ladder    if (SumEcard[0] > thr)  fDataAC[3] += 0x1000;
2023      if (SumEcard[1] > thr)  fDataAC[3] += 0x0010;
2024      // write in buffer the end ladder word    if (SumEcard[2] > thr)  fDataAC[3] += 0x0100;
2025      if(i==0) fDataTrack[fTracklength]=0x1807;    if (SumEcard[3] > thr)  fDataAC[3] += 0x0001;
2026      if(i==1) fDataTrack[fTracklength]=0x1808;  
2027      if(i==2) fDataTrack[fTracklength]=0x1809;    fDataAC[67] = fDataAC[3];
2028      CkSum=CkSum^fDataTrack[fTracklength];  
2029      fTracklength++;    // shift registers
2030      // the central bin is equal to the hitmap, all other bins in the shift register are 0
2031      // write in buffer the TRAILER    for (UInt_t i=0; i<=15; i++){
2032      ReLength=(UShort_t)((fNstrips_ladder*2+64+1)*2+3);      fDataAC[i+11] = 0x0000;  
2033      OveCheckCode=0x0000;      fDataAC[i+75] = 0x0000;
2034      }
2035      fDataTrack[fTracklength]=0x0000;    fDataAC[18] = fDataAC[3];
2036      fTracklength++;    fDataAC[82] = fDataAC[3];
2037      
2038      fDataTrack[fTracklength]=(ReLength >> 8);    //    for (Int_t i=0; i<fACbuffer; i++){
2039      fTracklength++;    //    printf("%0x  ",fDataAC[i]);  
2040        //    if ((i+1)%8 ==0) cout << endl;
2041      fDataTrack[fTracklength]=( (ReLength << 8) | (OveCheckCode & 0x00FF) );    //   }
2042      fTracklength++;  };
2043    
2044      // end TRAILER          
2045      };  void Digitizer::DigitizeS4(){
2046      Int_t DEBUG=0;
2047    // write in buffer the DSP header    // creato:  S. Borisov, INFN Roma2 e MEPHI, Sett 2007
2048      TString ciao,modo="ns";
2049    fDataTrack[DSPpos]=(0xE800 | ( ((j+1) << 3) | 0x0005) );    Int_t i,j,t,NdF,pmt,NdFT,S4,S4v=0,S4p=32;
2050        Float_t E0,E1=1e-6,Ert,X,Y,Z,x,y,z,V[3],Xs[2],Ys[2],Zs[2],Yp[6],q,w,p=0.1,l,l0=500;
2051    fDataTrack[DSPpos+1]=0x01A9;    Xs[0]=-24.1;
2052      Xs[1]=24.1;
2053    fDataTrack[DSPpos+2]=0x8740;    Ys[0]=-24.1;
2054        Ys[1]=24.1;
2055    EVENT_CAL=0;    Zs[0]=-0.5;
2056    fDataTrack[DSPpos+3]=(0x1A00 | ( (0x03FF & EVENT_CAL)>> 1) );    Zs[1]=0.5;
2057        Yp[0]=-20.;
2058    PED_L1=0;    Yp[2]=-1.;
2059    fDataTrack[DSPpos+4]=( ((EVENT_CAL << 15) | 0x5002 ) | ((0x03FF & PED_L1) << 2) );    Yp[4]=17.;
2060        for(i=0;i<3;i++)
2061    // FROM HERE WE WRITE AS ALL VARIABLE apart CkSum are =0        Yp[2*i+1]=Yp[2*i]+3;
2062      srand(time(NULL));
2063    fDataTrack[DSPpos+5]=0x8014;    // --- activate branches:
2064        fhBookTree->SetBranchStatus("Nthtof",1);
2065    fDataTrack[DSPpos+6]=0x00A0;    fhBookTree->SetBranchStatus("Ipltof",1);
2066        fhBookTree->SetBranchStatus("Ipaddle",1);
2067    fDataTrack[DSPpos+7]=0x0500;    
2068        fhBookTree->SetBranchStatus("Xintof",1);
2069    fDataTrack[DSPpos+8]=0x2801;    fhBookTree->SetBranchStatus("Yintof",1);
2070        fhBookTree->SetBranchStatus("Xouttof",1);
2071    fDataTrack[DSPpos+9]=0x400A;    fhBookTree->SetBranchStatus("Youttof",1);
2072        
2073    fDataTrack[DSPpos+10]=0x0050;    fhBookTree->SetBranchStatus("Ereltof",1);
2074        fhBookTree->SetBranchStatus("Timetof",1);
2075    CkSum=(CkSum >> 8)^(CkSum&0x00FF);    NdFT=0;
2076    fDataTrack[DSPpos+11]=(0x0280 | (CkSum >> 3));    Ert=0;
2077        for(i=0;i<Nthtof;i++){
2078    fDataTrack[DSPpos+12]=(0x1FFF | (CkSum << 13) );      if(Ipltof[i]!=6) continue;
2079        Ert+=Ereltof[i];
2080    // end dsp header            
2081        if(modo=="ns") continue;
2082    // write in buffer the TRAILER      NdF=Int_t(Ereltof[i]/E1);
2083          NdFT=0;
2084    ReLength=(UShort_t)((13*2)+3);      X=Xintof[i];
2085    OveCheckCode=0x0000;      Y=Yintof[i];
2086    fDataTrack[DSPpos+13]=0x0000;      Z=(Float_t)(random())/(Float_t)(0x7fffffff)-0.5;
2087        //cout<<"XYZ "<<X<<"  "<<Y<<"  "<<Z<<endl;
2088    fDataTrack[DSPpos+14]=(ReLength >> 8);      for(j=0;j<NdF;j++){
2089            q=(Float_t)random()/(Float_t)0x7fffffff;
2090    fDataTrack[DSPpos+15]=( (ReLength << 8) | (OveCheckCode & 0x00FF) );        w=(Float_t)random()/(Float_t)0x7fffffff;
2091            // cout<<"qw "<<q<<" "<<w<<endl;
2092    // end TRAILER        V[0]=p*cos(6.28318*q);
2093          V[1]=p*sin(6.28318*q);
2094          V[2]=p*(2.*w-1.);
2095          pmt=0;
2096            x=X;
2097    // end DSP            y=Y;
2098    };            z=Z;
2099          while(pmt==0 && (x>Xs[0] && x<Xs[1])&&(y>Ys[0] && y<Ys[1])&&(z>Zs[0] && z<Zs[1])){
2100            l=0;
2101            while(pmt==0 && (x>Xs[0] && x<Xs[1])&&(y>Ys[0] && y<Ys[1])&&(z>Zs[0] && z<Zs[1])){
2102  };            x+=V[0];
2103              y+=V[1];
2104  void Digitizer::WriteTrackCalib() {            z+=V[2];
2105              l+=p;
2106              //cout<<x<<"  "<<y<<"  "<<z<<"  "<<l<<endl;
2107  std:: cout << " Entering WriteTrackCalib " << endl;            //cin>>ciao;
2108            }
2109  fOutputfile.write(reinterpret_cast<char*>(fDataPSCU),sizeof(UShort_t)*fPSCUbuffer);          if((x<Xs[0]+p || x>Xs[1]-p)&&(y>Ys[0]+p && y<Ys[1]-p)&&(z>Zs[0]+p && z<Zs[1]-p)){
2110              for(t=0;t<3;t++){
2111  UShort_t temp[1000000];              if(y>=Yp[2*t] && y<Yp[2*t+1]){
2112  memset(temp,0,sizeof(UShort_t)*1000000);                if(pmt==0)NdFT++;
2113  swab(fDataTrack,temp,sizeof(UShort_t)*fTracklength);  // WE MUST SWAP THE BYTES!!!                pmt=1;
2114  fOutputfile.write(reinterpret_cast<char*>(temp),sizeof(UShort_t)*fTracklength);                //cout<<NdFT<<endl;
2115  fTracklength=0;                break;
2116  if ( fPadding ){              }
2117        fOutputfile.write(reinterpret_cast<char*>(fDataPadding),sizeof(UChar_t)*fPadding);            }
2118  };            if(pmt==1)break;
2119              V[0]=-V[0];
2120  };          }
2121            q=(Float_t)random()/(Float_t)0x7fffffff;
2122            w=1-exp(-l/l0);
2123  void Digitizer::ClearTrackCalib() {          if(q<w)break;
2124            q=(Float_t)random()/(Float_t)0x7fffffff;
2125  std:: cout << "Entering ClearTrackCalib " << endl;          w=0.5;
2126                if(q<w)break;
2127              if((x>Xs[0]+p && x<Xs[1]-p)&&(y<Ys[0]+p || y>Ys[1]-p)&&(z>Zs[0]+p && z<Zs[1]-p))V[1]=-V[1];
2128  };          if((x>Xs[0]+p && x<Xs[1]-p)&&(y>Ys[0]+p && y<Ys[1]-p)&&(z<Zs[0]+p || z>Zs[1]-p))V[2]=-V[2];
2129            x+=V[0];
2130            y+=V[1];
2131  void Digitizer::LoadTrackCalib() {          z+=V[2];
2132  std:: cout << "Entering LoadTrackCalib " << endl;          l=0;
2133            //cout<<x<<"  "<<y<<"  "<<z<<"  "<<l<<endl;
2134  // Generate the pedestals and sigmas according to parametrization                  //cin>>ciao;
2135    for (Int_t j=0; j<fNviews;j++) {        }
2136      for (Int_t i=0; i<fNstrips_view;i++) {      }
2137          }
2138      if((j+1)%2==0) {    Ert=Ert/0.002;
2139      fPedeTrack[j][i]=gRandom->Gaus(fAvePedex,fSigmaPedex);    q=(Float_t)(random())/(Float_t)0x7fffffff;
2140      fSigmaTrack[j][i]=gRandom->Gaus(fAveSigmax,fSigmaSigmax);    w=0.7;
2141      };    //E0=(Float_t)(4064./7.);
2142      if((j+1)%2==1) {    E0=4064./7.;
2143      fPedeTrack[j][i]=gRandom->Gaus(fAvePedey,fSigmaPedey);    if(Ert<1) S4=0;
2144      fSigmaTrack[j][i]=gRandom->Gaus(fAveSigmay,fSigmaSigmay);    else S4=(Int_t)(4064.*(1.-exp(-(Ert-1.)/E0)));
2145      };    i=S4/4;
2146          if(S4%4==0)
2147      };      S4v=S4+S4p;
2148    };        else if(S4%4==1){
2149        if(q<w) S4v=S4-1+S4p;
2150          else S4v=S4+1+S4p;
2151        } else if(S4%4==2) S4v=S4+S4p;
2152  };    else if(S4%4==3){
2153        if(q<w) S4v=S4+1+S4p;
2154  void Digitizer::LoadMipCor() {      else S4v=S4-1+S4p;
2155  std:: cout << "Entering LoadMipCor" << endl;    }
2156    Float_t xfactor=1./151.6*1.04;    if (DEBUG)
2157    Float_t yfactor=1./152.1;      cout<<"Ert_S4 = " << Ert << " --- S4v = " << S4v << endl;
2158      fDataS4[0]=S4v;//0xf028;
2159    fMipCor[0][0]=140.02*yfactor;    fDataS4[1]=0xd800;
2160    fMipCor[0][1]=140.99*xfactor;    fDataS4[2]=0x0300;
2161    fMipCor[0][2]=134.48*yfactor;    //cout<<"  PMT  "<<NdFT<<"  "<<NdF<<endl;
2162    fMipCor[0][3]=144.41*xfactor;    //cin>>ciao;
2163    fMipCor[0][4]=140.74*yfactor;  }
2164    fMipCor[0][5]=142.28*xfactor;  
2165    fMipCor[0][6]=134.53*yfactor;  
2166    fMipCor[0][7]=140.63*xfactor;  
2167    fMipCor[0][8]=135.55*yfactor;  void Digitizer::DigitizeND(){
2168    fMipCor[0][9]=138.00*xfactor;    // creato:  S. Borisov, INFN Roma2 e MEPHI, Sett 2007
2169    fMipCor[0][10]=154.95*yfactor;    Int_t i=0;
2170    fMipCor[0][11]=158.44*xfactor;    UShort_t NdN=0;
2171        fhBookTree->SetBranchStatus("Nthnd",1);
2172        fhBookTree->SetBranchStatus("Itubend",1);
2173    fMipCor[1][0]=136.07*yfactor;    fhBookTree->SetBranchStatus("Iparnd",1);  
2174    fMipCor[1][1]=135.59*xfactor;    fhBookTree->SetBranchStatus("Xinnd",1);
2175    fMipCor[1][2]=142.69*yfactor;    fhBookTree->SetBranchStatus("Yinnd",1);
2176    fMipCor[1][3]=138.19*xfactor;    fhBookTree->SetBranchStatus("Zinnd",1);
2177    fMipCor[1][4]=137.35*yfactor;    fhBookTree->SetBranchStatus("Xoutnd",1);
2178    fMipCor[1][5]=140.23*xfactor;    fhBookTree->SetBranchStatus("Youtnd",1);
2179    fMipCor[1][6]=153.15*yfactor;    fhBookTree->SetBranchStatus("Zoutnd",1);
2180    fMipCor[1][7]=151.42*xfactor;    fhBookTree->SetBranchStatus("Erelnd",1);
2181    fMipCor[1][8]=129.76*yfactor;    fhBookTree->SetBranchStatus("Timend",1);
2182    fMipCor[1][9]=140.63*xfactor;    fhBookTree->SetBranchStatus("Pathnd",1);
2183    fMipCor[1][10]=157.87*yfactor;    fhBookTree->SetBranchStatus("P0nd",1);
2184    fMipCor[1][11]=153.64*xfactor;    //cout<<"n="<<Nthnd<<"  "<<NdN<<"\n";
2185      for(i=0;i<Nthnd;i++){
2186    fMipCor[2][0]=134.98*yfactor;      if(Iparnd[i]==13){
2187    fMipCor[2][1]=143.95*xfactor;        NdN++;
2188    fMipCor[2][2]=140.23*yfactor;      }
2189    fMipCor[2][3]=138.88*xfactor;    }
2190    fMipCor[2][4]=137.95*yfactor;    //NdN=100; //only for debug
2191    fMipCor[2][5]=134.87*xfactor;  
2192    fMipCor[2][6]=157.56*yfactor;    for(i=0;i<3;i++){
2193    fMipCor[2][7]=157.31*xfactor;      fDataND[2*i]=0x0000;
2194    fMipCor[2][8]=141.37*yfactor;      fDataND[2*i+1]=0x010F;
2195    fMipCor[2][9]=143.39*xfactor;    }
2196    fMipCor[2][10]=156.15*yfactor;    fDataND[0]=0xFF00 & (256*NdN);
2197    fMipCor[2][11]=158.79*xfactor;  }
2198    
2199  /*  
2200    for (Int_t j=0; j<fNviews;j++) {  void Digitizer::DigitizeDummy() {
2201      for (Int_t i=0; i<fNstrips_view;i++) {  
2202      fMipCor[j][i]=1.;    fhBookTree->SetBranchStatus("Enestrip",1);
2203      };  
2204    };        // dumy header
2205      fDataDummy[0] = 0xCAAA;
2206        
2207  */      for (Int_t i=1; i<fDummybuffer; i++){
2208  };      fDataDummy[i] = 0xFFFF;
2209        //   printf("%0x  ",fDataDummy[i]);  
2210  void Digitizer::CompressTrackData(Float_t AdcTrack[fNviews][fNstrips_view]) {      //if ((i+1)%8 ==0) cout << endl;
2211  // copy of the corresponding compression fortran routine + new digitization    }
2212  // std:: cout << "Entering CompressTrackData " << endl;  };
2213  Int_t oldval=0;  
2214  Int_t newval=0;  void Digitizer::WriteRunHeader(){
2215  Int_t trasmesso=0;    fOutputfile.write(reinterpret_cast<char*>(fDataRunHeader),sizeof(UShort_t)*fRunHeaderbuffer);
2216  Int_t ntrastot=0;  };
2217  Float_t real;  
2218  Float_t inte;  void Digitizer::WriteRunTrailer(){
2219  Int_t cercacluster=0;    fOutputfile.write(reinterpret_cast<char*>(fDataRunTrailer),sizeof(UShort_t)*fRunTrailerbuffer);
2220  Int_t kt=0;  };
2221  static const int DSPbufferSize = 4000; // 13 bit buffer to be rearranged in 16 bit Track buffer  
2222  UShort_t DataDSP[DSPbufferSize];  // 13 bit  buffer to be rearranged in 16 bit Track buffer  void Digitizer::WriteData(){
2223  UShort_t DSPlength;  // 13 bit buffer to be rearranged in 16 bit Track buffer  
2224      // Routine that writes the data to a binary file
2225  memset(fDataTrack,0,sizeof(UShort_t)*fTRACKbuffer); // probably not necessary becouse already done ?    // PSCU data are already swapped
2226  fTracklength=0;    fOutputfile.write(reinterpret_cast<char*>(fDataPSCU),sizeof(UShort_t)*fPSCUbuffer);
2227      // TRG
2228    for (Int_t iv=0; iv<fNviews;iv++) {    fOutputfile.write(reinterpret_cast<char*>(fDataTrigger),sizeof(UChar_t)*fTRIGGERbuffer); //30/11/07 SO; it was 153
2229    memset(DataDSP,0,sizeof(UShort_t)*DSPbufferSize);    // TOF
2230    DSPlength=16; // skip the header, to be written later    fOutputfile.write(reinterpret_cast<char*>(fDataTof),sizeof(UChar_t)*fTOFbuffer);
2231    UShort_t CheckSum=0;    // AC
2232  // write dsp header on buffer    UShort_t temp[1000000];
2233      memset(temp,0,sizeof(UShort_t)*1000000);
2234  //    fDataTrack[fTracklength]=0xE805;    swab(fDataAC,temp,sizeof(UShort_t)*fACbuffer);  // WE MUST SWAP THE BYTES!!!
2235  //    fTracklength++;    fOutputfile.write(reinterpret_cast<char*>(temp),sizeof(UShort_t)*fACbuffer);
2236      // CALO
2237  //    fDataTrack[fTracklength]=0x01A9;    memset(temp,0,sizeof(UShort_t)*1000000);
2238  //    fTracklength++;    swab(fDataCALO,temp,sizeof(UShort_t)*fCALOlength); // WE MUST SWAP THE BYTES!!!
2239      fOutputfile.write(reinterpret_cast<char*>(temp),sizeof(UShort_t)*fCALOlength);
2240  // end dsp header    // TRK
2241      memset(temp,0,sizeof(UShort_t)*1000000);
2242     //    swab(fDataTrack,temp,sizeof(UShort_t)*fTracklength);  // WE MUST SWAP THE BYTES!!!
2243     // INIZIO VISTA IV - TAKE PROPER ACTION    fOutputfile.write(reinterpret_cast<char*>(temp),sizeof(UShort_t)*fTracklength);
2244     //    fTracklength=0;
2245       // padding to 64 bytes
2246      //
2247      if ( fPadding ){
2248      for (Int_t ladder=0; ladder<fNladder;ladder++) {      fOutputfile.write(reinterpret_cast<char*>(fDataPadding),sizeof(UChar_t)*fPadding);
2249        Int_t k=0;    };
2250        while (k<fNstrips_ladder) {    // S4
2251          // compress write in buffer the current LADDER    memset(temp,0,sizeof(UShort_t)*1000000);
2252          if ( k == 0)  {    swab(fDataS4,temp,sizeof(UShort_t)*fS4buffer);  // WE MUST SWAP THE BYTES!!!
2253            real=modff(AdcTrack[iv][ladder*fNstrips_ladder+k],&inte);    fOutputfile.write(reinterpret_cast<char*>(temp),sizeof(UShort_t)*fS4buffer);
2254            if (real > 0.5) inte=inte+1;    // ND
2255            newval=(Int_t)inte -(Int_t)fPedeTrack[iv][ladder*fNstrips_ladder+k];    memset(temp,0,sizeof(UShort_t)*1000000);
2256            // first strip of ladder is transmitted    swab(fDataND,temp,sizeof(UShort_t)*fNDbuffer);  // WE MUST SWAP THE BYTES!!!
2257            // DC_TOT first " << AdcTrack[iv][ladder*fNstrips_ladder+k] << endl;    fOutputfile.write(reinterpret_cast<char*>(temp),sizeof(UShort_t)*fNDbuffer);
2258            DataDSP[DSPlength]=( ((UShort_t)inte) & 0x0FFF);  };
2259            DSPlength++;    
2260            ntrastot++;  
2261            trasmesso=1;  void Digitizer::ReadData(){
2262            oldval=newval;  
2263            kt=k;    UShort_t InData[64];
2264            k++;  
2265            continue;    // for debuggigng purposes only, write your own routine if you like (many
2266          };    // hardwired things.
2267          real=modff(AdcTrack[iv][ladder*fNstrips_ladder+k],&inte);    
2268          if (real > 0.5) inte=inte+1;    ifstream InputFile;
2269          newval=(Int_t)inte -(Int_t)(fPedeTrack[iv][ladder*fNstrips_ladder+k]);  
2270          cercacluster=1; // ?????????    // if (!InputFile) {
2271          if (cercacluster==1) {  
2272              //     std::cout << "ERROR" << endl;
2273   // controlla l'ordine di tutti queste strip ladder e DSP !!!!!!!          //     // An error occurred!
2274            Int_t diff=0;    //     // myFile.gcount() returns the number of bytes read.
2275      //     // calling myFile.clear() will reset the stream state
2276                //     // so it is usable again.
2277            switch ((iv+1)%2) {    //   };
2278            case 0: diff=newval-oldval;  
2279            break;  
2280            case 1: diff=oldval-newval;        
2281            break;    //InputFile.seekg(0);
2282            };  
2283      InputFile.open(fFilename, ios::in | ios::binary);
2284            if (diff>fCutclu*(Int_t)fSigmaTrack[iv][ladder*fNstrips_ladder+k]) {    //    fOutputfile.seekg(0);
2285              Int_t clval=newval;    if (!InputFile.is_open()) std::cout << "ERROR" << endl;
2286              Int_t klp=k;        // go on to search for maximum  
2287              klp++;    InputFile.seekg(0);
2288      
2289              while(klp<fNstrips_ladder) {    for (Int_t k=0; k<=1000; k++){
2290                real=modff(AdcTrack[iv][ladder*fNstrips_ladder+klp],&inte);      InputFile.read(reinterpret_cast<char*>(InData),384*sizeof(UShort_t));
2291                if (real > 0.5) inte=inte+1;  
2292                Int_t clvalp=(Int_t)inte -(Int_t)fPedeTrack[iv][ladder*fNstrips_ladder+klp];      std::cout << "Read back: " << endl << endl;
2293                if((iv+1)%2==0) {  
2294        for (Int_t i=0; i<=384; i++){
2295                  if(clvalp>clval) {        printf("%4x ", InData[i]);  
2296                     clval=clvalp;        if ((i+1)%8 ==0) cout << endl;
2297                     k=klp;}      }
2298                  else break; // max of cluster found  
2299      }
2300                } else {      cout << endl;
2301      InputFile.close();
2302                  if(clvalp<clval) {  
2303                     clval=clvalp;  };
2304                     k=klp;}  
2305                  else break; // max of cluster found  
2306    
2307                };  void Digitizer::DigitizeTrack() {
2308                  //std:: cout << "Entering DigitizeTrack " << endl;
2309                klp++;  Float_t  AdcTrack[fNviews][fNstrips_view];  //  Vector of strips to be compressed
2310              };  
2311    Int_t Iview;
2312              Int_t kl1=k-fNclst; // max of cluster (or end of ladder ?)  Int_t Nstrip;
2313              trasmesso=0;  
2314              if(kl1<0)  kl1=0;    for (Int_t j=0; j<fNviews;j++) {
2315    
2316              if(kt>=kl1) kl1=kt+1;      for (Int_t i=0; i<fNladder;i++) {
2317              if( (kt+1)==kl1 ) trasmesso=1;  
2318          Float_t commonN1=gRandom->Gaus(0.,fSigmaCommon);
2319          Float_t commonN2=gRandom->Gaus(0.,fSigmaCommon);
2320                      for (Int_t k=0; k<fNstrips_ladder;k++) {
2321              Int_t kl2=k+fNclst;        Nstrip=i*fNstrips_ladder+k;
2322              if(kl2>=fNstrips_ladder) kl2=fNstrips_ladder-1;        AdcTrack[j][Nstrip]=gRandom->Gaus(fPedeTrack[j][Nstrip],fSigmaTrack[j][Nstrip]);
2323          if(k<4*128) {AdcTrack[j][Nstrip] += commonN1;}  // full correlation of 4 VA1 Com. Noise
2324              for(Int_t klt=kl1 ; klt<=kl2 ; klt++) {        else {AdcTrack[j][Nstrip] += commonN2;}   // full correlation of 4 VA1 Com. Noise
2325                if(trasmesso==0) {  
2326                //  std:: cout << "STRIP " << klt << endl;        };
2327                //  std:: cout << "ADC_TOT " <<AdcTrack[iv][ladder*fNstrips_ladder+klt] << endl;        
2328            
2329                  DataDSP[DSPlength]=( ((UShort_t)klt) | 0x1000);      };
2330                  DSPlength++;    
2331                  ntrastot++;  
2332                  };
2333    
2334                  real=modff(AdcTrack[iv][ladder*fNstrips_ladder+klt],&inte);  
2335                  if (real > 0.5) inte=inte+1;    fhBookTree->SetBranchStatus("Nstrpx",1);
2336                  DataDSP[DSPlength]=( ((UShort_t)inte) & 0x0FFF);    fhBookTree->SetBranchStatus("Npstripx",1);
2337                  DSPlength++;    fhBookTree->SetBranchStatus("Ntstripx",1);
2338                  ntrastot++;    fhBookTree->SetBranchStatus("Istripx",1);
2339                  fhBookTree->SetBranchStatus("Qstripx",1);
2340                 }    fhBookTree->SetBranchStatus("Xstripx",1);
2341                 else {    fhBookTree->SetBranchStatus("Nstrpy",1);
2342                 //   std:: cout << "ADC_TOT " <<AdcTrack[iv][ladder*fNstrips_ladder+klt] << endl;    fhBookTree->SetBranchStatus("Npstripy",1);
2343                  real=modff(AdcTrack[iv][ladder*fNstrips_ladder+klt],&inte);    fhBookTree->SetBranchStatus("Ntstripy",1);
2344                  if (real > 0.5) inte=inte+1;    fhBookTree->SetBranchStatus("Istripy",1);
2345                  DataDSP[DSPlength]=( ((UShort_t)inte) & 0x0FFF);    fhBookTree->SetBranchStatus("Qstripy",1);
2346                  DSPlength++;                  fhBookTree->SetBranchStatus("Ystripy",1);
2347                  ntrastot++;  
2348                  };  
2349                  trasmesso=1;                          
2350              };  // end trasmission    Float_t ADCfull;
2351              kt=kl2;    Int_t iladd=0;
2352              k=kl2;    for (Int_t ix=0; ix<Nstrpx;ix++) {
2353              real=modff(AdcTrack[iv][ladder*fNstrips_ladder+kt],&inte);    Iview=Npstripx[ix]*2-1;
2354              if (real > 0.5) inte=inte+1;    Nstrip=(Int_t)Istripx[ix]-1;
2355              oldval=(Int_t)inte -(Int_t)fPedeTrack[iv][ladder*fNstrips_ladder+kt];    if(Nstrip<fNstrips_ladder) iladd=0;
2356              k++;    if((Nstrip>=fNstrips_ladder)&&(Nstrip<2*fNstrips_ladder)) iladd=1;
2357              continue;    if((Nstrip>=2*fNstrips_ladder)&&(Nstrip<3*fNstrips_ladder)) iladd=2;
2358      ADCfull=AdcTrack[Iview][Nstrip] += Qstripx[ix]*fMipCor[iladd][Iview];
2359      AdcTrack[Iview][Nstrip] *= SaturationTrack(ADCfull);
2360            }; // end cercacluster  
2361          }; // end cercacluster    };
2362          
2363  // start ZOP check for strips no  
2364            for (Int_t iy=0; iy<Nstrpy;iy++) {
2365        if(abs(newval-oldval)>=fCutzop*(Int_t)fSigmaTrack[iv][ladder*fNstrips_ladder+k]) {    Iview=Npstripy[iy]*2-2;
2366      Nstrip=(Int_t)Istripy[iy]-1;
2367         if(trasmesso==0) {    if(Nstrip<fNstrips_ladder) iladd=0;
2368         // std:: cout << "STRIP " << k << endl;    if((Nstrip>=fNstrips_ladder)&&(Nstrip<2*fNstrips_ladder)) iladd=1;
2369         // std:: cout << "ADC_TOT " << AdcTrack[iv][ladder*fNstrips_ladder+k] << endl;    if((Nstrip>=2*fNstrips_ladder)&&(Nstrip<3*fNstrips_ladder)) iladd=2;
2370      ADCfull=AdcTrack[Iview][Nstrip] -= Qstripy[iy]*fMipCor[iladd][Iview];
2371           DataDSP[DSPlength]=( ((UShort_t)k) | 0x1000);    AdcTrack[Iview][Nstrip] *= SaturationTrack(ADCfull);
2372           DSPlength++;    
2373           ntrastot++;    };  
2374                      
2375    CompressTrackData(AdcTrack);  // Compress and Digitize data of one Ladder  in turn for all ladders
2376           real=modff(AdcTrack[iv][ladder*fNstrips_ladder+k],&inte);  
2377           if (real > 0.5) inte=inte+1;  };
2378           DataDSP[DSPlength]=( ((UShort_t)inte) & 0x0FFF);  
2379           DSPlength++;  
2380           ntrastot++;  
2381    void Digitizer::DigitizeTrackCalib(Int_t ii) {
2382         }  
2383         else {  std:: cout << "Entering DigitizeTrackCalib " << ii << endl;
2384         //  std:: cout << "ADC_TOT " << AdcTrack[iv][ladder*fNstrips_ladder+k] << endl;  if( (ii!=1)&&(ii!=2) ) {
2385           real=modff(AdcTrack[iv][ladder*fNstrips_ladder+k],&inte);   std:: cout << "error wrong DigitizeTrackCalib argument" << endl;
2386           if (real > 0.5) inte=inte+1;   return;
2387           DataDSP[DSPlength]=(  ((UShort_t)inte) & 0x0FFF);  };
2388           DSPlength++;  
2389           ntrastot++;        memset(fDataTrack,0,sizeof(UShort_t)*fTRACKbuffer);
2390         };  fTracklength=0;
2391         trasmesso=1;  
2392         oldval=newval;  UShort_t Dato;
2393         kt=k;  
2394    Float_t dato1;
2395        }    Float_t dato2;
2396        else trasmesso=0;  Float_t dato3;
2397        // end zop  Float_t dato4;
2398          
2399        k++;        UShort_t DatoDec;
2400        };  // end cycle inside ladder  UShort_t DatoDec1;
2401  // write here the end ladder bytes  UShort_t DatoDec2;
2402  //            std:: cout << "FINE LADDER " << ladder+1 << endl;  UShort_t DatoDec3;
2403    UShort_t DatoDec4;
2404        DataDSP[DSPlength]=( ((UShort_t)(ladder+1))  | 0x1800);  
2405        DSPlength++;  UShort_t EVENT_CAL;
2406        ntrastot++;  UShort_t PED_L1;
2407        trasmesso=0;  UShort_t ReLength;
2408    UShort_t OveCheckCode;
2409      };  //end cycle inside dsp  //UShort_t PED_L2;
2410  //  std:: cout << "FINE DSP " << iv+1 << endl;  //UShort_t PED_L3HI;
2411  // here put DSP header  //UShort_t PED_L3LO;
2412      DataDSP[0]=(0x1CA0 | ((UShort_t)(iv+1)) );  //UShort_t SIG_L1HI;
2413      UShort_t Nword=(DSPlength*13)/16;  //UShort_t SIG_L1LO;
2414      if( ((DSPlength*13)%16)!=0) Nword++;  //UShort_t SIG_L2HI;
2415      DataDSP[1]=(0x1400 | ( Nword >> 10));  //UShort_t SIG_L2LO;
2416      DataDSP[2]=(0x1400 | ( Nword & 0x03FF) );  //UShort_t SIG_L3;
2417      DataDSP[3]=(0x1400 | (( (UShort_t)(fCounter >> 10) ) & 0x03FF) );  //UShort_t BAD_L1;
2418      DataDSP[4]=(0x1400 | (( (UShort_t)(fCounter) )  & 0x03FF) );  //UShort_t BAD_L2LO;
2419      DataDSP[5]=(0x1400 | ( (UShort_t)(fNclst << 7) ) | ( (UShort_t)(fCutzop << 4) )  //UShort_t BAD_L3HI;
2420       | ( (UShort_t)fCutzop  ) );  //UShort_t BAD_L3LO;
2421      DataDSP[6]=0x1400;  //UShort_t FLAG;
2422      DataDSP[7]=0x1400;  
2423      DataDSP[8]=0x1400;  
2424      DataDSP[9]=0x1400;    Int_t DSPpos;
2425      DataDSP[10]=0x1400;    for (Int_t j=ii-1; j<fNviews;j+=2) {
2426      DataDSP[11]=0x1400;    UShort_t CkSum=0;
2427      DataDSP[12]=0x1400;    // here skip the dsp header and his trailer , to be written later
2428      DataDSP[13]=0x1400;    DSPpos=fTracklength;
2429      DataDSP[14]=(0x1400 | (CheckSum & 0x00FF) );    fTracklength=fTracklength+13+3;
2430      DataDSP[15]=0x1C00;  
2431  // end DSP header      
2432        for (Int_t i=0; i<fNladder;i++) {
2433          for (Int_t k=0; k<fNstrips_ladder;k++) {
2434  // write 13 bit DataDSP bufer inside 16 bit fDataTrack buffer        // write in buffer the current LADDER
2435      Int_t Bit16free=16;        Dato=(UShort_t)fPedeTrack[j][i*fNstrips_ladder+k];
2436      UShort_t Dato;        dato1=fPedeTrack[j][i*fNstrips_ladder+k]-Dato;
2437      for (Int_t NDSP=0; NDSP<DSPlength;NDSP++) {  
2438        Int_t Bit13ToWrite=13;        DatoDec1=(UShort_t)(dato1*2);
2439        while(Bit13ToWrite>0) {        dato2=dato1*2-DatoDec1;
2440          if(Bit13ToWrite<=Bit16free) {  
2441            Dato=((DataDSP[NDSP]&(0xFFFF >> (16-Bit13ToWrite)))<<(Bit16free-Bit13ToWrite));        DatoDec2=(UShort_t)(dato2*2);
2442            fDataTrack[fTracklength]=fDataTrack[fTracklength] | Dato ;        dato3=dato2*2-DatoDec2;
2443            Bit16free=Bit16free-Bit13ToWrite;        
2444            Bit13ToWrite=0;        DatoDec3=(UShort_t)(dato3*2);
2445            if(Bit16free==0) {        dato4=dato3*2-DatoDec3;
2446              if(NDSP>15) CheckSum=CheckSum^fDataTrack[fTracklength];        
2447              fTracklength++;        DatoDec4=(UShort_t)(dato4*2);
2448              Bit16free=16;        
2449            };                  DatoDec=DatoDec1*0x0008+DatoDec2*0x0004+DatoDec3*0x0002+DatoDec4*0x0001;
2450          }        fDataTrack[fTracklength]=( (Dato << 4) | (DatoDec & 0x000F) );
2451          else if(Bit13ToWrite>Bit16free) {        CkSum=CkSum^fDataTrack[fTracklength];
2452            Dato=( (DataDSP[NDSP]&(0xFFFF >> (16-Bit13ToWrite) ) ) >> (Bit13ToWrite-Bit16free) );        fTracklength++;
2453            fDataTrack[fTracklength]=fDataTrack[fTracklength] | Dato ;        };
2454            if(NDSP>15) CheckSum=CheckSum^fDataTrack[fTracklength];  
2455            fTracklength++;        for (Int_t k=0; k<fNstrips_ladder;k++) {
2456            Bit13ToWrite=Bit13ToWrite-Bit16free;        // write in buffer the current LADDER
2457            Bit16free=16;          Dato=(UShort_t)fSigmaTrack[j][i*fNstrips_ladder+k];
2458          };        dato1=fSigmaTrack[j][i*fNstrips_ladder+k]-Dato;
2459            
2460        }; // end cycle while(Bit13ToWrite>0)        DatoDec1=(UShort_t)(dato1*2);
2461                    dato2=dato1*2-DatoDec1;
2462      }; // end cycle DataDSP  
2463      if(Bit16free!=16) { fTracklength++; CheckSum=CheckSum^fDataTrack[fTracklength]; };        DatoDec2=(UShort_t)(dato2*2);
2464      CheckSum=(CheckSum >> 8)^(CheckSum&0x00FF);        dato3=dato2*2-DatoDec2;
2465      fDataTrack[fTracklength-Nword+11]=(0x0280 | (CheckSum >> 3));        
2466      fDataTrack[fTracklength-Nword+12]=(0x1C00 | (CheckSum << 13) );        DatoDec3=(UShort_t)(dato3*2);
2467          dato4=dato3*2-DatoDec3;
2468  // end write 13 bit DataDSP bufer inside 16 bit fDataTrack buffer        
2469          DatoDec4=(UShort_t)(dato4*2);
2470  //write trailer on buffer        
2471      UShort_t ReLength=(UShort_t)((Nword+13)*2+3);        DatoDec=DatoDec1*0x0008+DatoDec2*0x0004+DatoDec3*0x0002+DatoDec4*0x0001;
2472      UShort_t OveCheckCode=0x0000;        
2473          fDataTrack[fTracklength]=( (Dato << 4) | (DatoDec & 0x000F) );
2474      fDataTrack[fTracklength]=0x0000;        CkSum=CkSum^fDataTrack[fTracklength];
2475      fTracklength++;        fTracklength++;
2476            };
2477      fDataTrack[fTracklength]=(ReLength >> 8);        
2478      fTracklength++;        for (Int_t k=0; k<64;k++) {
2479            fDataTrack[fTracklength]=0x0000;
2480      fDataTrack[fTracklength]=( (ReLength << 8) | (OveCheckCode & 0x00FF) );        CkSum=CkSum^fDataTrack[fTracklength];
2481      fTracklength++;          fTracklength++;
2482  // end trailer  
2483  //    std:: cout  << "DSPlength  " <<DSPlength << endl;        };
2484  //    std:: cout << "Nword " << Nword  << endl;        // end ladder
2485  //    std:: cout <<  "ReLength " << ReLength << endl;  
2486    };          // write in buffer the end ladder word
2487  //    std:: cout << "ntrastot " << ntrastot << endl;          if(i==0) fDataTrack[fTracklength]=0x1807;
2488        if(i==1) fDataTrack[fTracklength]=0x1808;
2489  };      if(i==2) fDataTrack[fTracklength]=0x1809;
2490        CkSum=CkSum^fDataTrack[fTracklength];
2491        fTracklength++;
2492  Float_t Digitizer::SaturationTrack(Float_t ADC) {  
2493    Float_t SatFact=1.;      // write in buffer the TRAILER
2494    if(ADC<70.) { SatFact=80./ADC; };      ReLength=(UShort_t)((fNstrips_ladder*2+64+1)*2+3);
2495    if(ADC>3000.) { SatFact=3000./ADC; };      OveCheckCode=0x0000;
2496    return SatFact;  
2497  };      fDataTrack[fTracklength]=0x0000;
2498        fTracklength++;
2499      
2500        fDataTrack[fTracklength]=(ReLength >> 8);
2501        fTracklength++;
2502      
2503        fDataTrack[fTracklength]=( (ReLength << 8) | (OveCheckCode & 0x00FF) );
2504        fTracklength++;
2505    
2506        // end TRAILER        
2507        };
2508    
2509      // write in buffer the DSP header
2510    
2511      fDataTrack[DSPpos]=(0xE800 | ( ((j+1) << 3) | 0x0005) );
2512      
2513      fDataTrack[DSPpos+1]=0x01A9;
2514    
2515      fDataTrack[DSPpos+2]=0x8740;
2516      
2517      EVENT_CAL=0;
2518      fDataTrack[DSPpos+3]=(0x1A00 | ( (0x03FF & EVENT_CAL)>> 1) );
2519      
2520      PED_L1=0;
2521      fDataTrack[DSPpos+4]=( ((EVENT_CAL << 15) | 0x5002 ) | ((0x03FF & PED_L1) << 2) );
2522      
2523      // FROM HERE WE WRITE AS ALL VARIABLE apart CkSum are =0  
2524    
2525      fDataTrack[DSPpos+5]=0x8014;
2526      
2527      fDataTrack[DSPpos+6]=0x00A0;
2528      
2529      fDataTrack[DSPpos+7]=0x0500;
2530      
2531      fDataTrack[DSPpos+8]=0x2801;
2532      
2533      fDataTrack[DSPpos+9]=0x400A;
2534      
2535      fDataTrack[DSPpos+10]=0x0050;
2536      
2537      CkSum=(CkSum >> 8)^(CkSum&0x00FF);
2538      fDataTrack[DSPpos+11]=(0x0280 | (CkSum >> 3));
2539      
2540      fDataTrack[DSPpos+12]=(0x1FFF | (CkSum << 13) );
2541    
2542      // end dsp header
2543    
2544      // write in buffer the TRAILER
2545      
2546      ReLength=(UShort_t)((13*2)+3);
2547      OveCheckCode=0x0000;
2548      fDataTrack[DSPpos+13]=0x0000;
2549    
2550      fDataTrack[DSPpos+14]=(ReLength >> 8);
2551      
2552      fDataTrack[DSPpos+15]=( (ReLength << 8) | (OveCheckCode & 0x00FF) );
2553      
2554      // end TRAILER
2555    
2556    
2557    
2558      
2559      // end DSP    
2560      };    
2561    
2562    
2563    
2564    };
2565    
2566    void Digitizer::WriteTrackCalib() {
2567    
2568    
2569    std:: cout << " Entering WriteTrackCalib " << endl;
2570    
2571    fOutputfile.write(reinterpret_cast<char*>(fDataPSCU),sizeof(UShort_t)*fPSCUbuffer);
2572    
2573    UShort_t temp[1000000];
2574    memset(temp,0,sizeof(UShort_t)*1000000);
2575    swab(fDataTrack,temp,sizeof(UShort_t)*fTracklength);  // WE MUST SWAP THE BYTES!!!
2576    fOutputfile.write(reinterpret_cast<char*>(temp),sizeof(UShort_t)*fTracklength);
2577    fTracklength=0;
2578    if ( fPadding ){
2579          fOutputfile.write(reinterpret_cast<char*>(fDataPadding),sizeof(UChar_t)*fPadding);
2580    };
2581    
2582    };
2583    
2584    
2585    void Digitizer::ClearTrackCalib() {
2586    
2587    std:: cout << "Entering ClearTrackCalib " << endl;
2588        
2589      
2590    };
2591    
2592    
2593    void Digitizer::LoadTrackCalib() {
2594    std:: cout << "Entering LoadTrackCalib " << endl;
2595    
2596    // Generate the pedestals and sigmas according to parametrization
2597      for (Int_t j=0; j<fNviews;j++) {
2598        for (Int_t i=0; i<fNstrips_view;i++) {
2599        
2600        if((j+1)%2==0) {
2601        fPedeTrack[j][i]=gRandom->Gaus(fAvePedex,fSigmaPedex);
2602        fSigmaTrack[j][i]=gRandom->Gaus(fAveSigmax,fSigmaSigmax);
2603        };
2604        if((j+1)%2==1) {
2605        fPedeTrack[j][i]=gRandom->Gaus(fAvePedey,fSigmaPedey);
2606        fSigmaTrack[j][i]=gRandom->Gaus(fAveSigmay,fSigmaSigmay);
2607        };
2608        
2609        };
2610      };    
2611    
2612      
2613      
2614    };
2615    
2616    void Digitizer::LoadMipCor() {
2617    std:: cout << "Entering LoadMipCor" << endl;
2618      Float_t xfactor=1./151.6*1.04;
2619      Float_t yfactor=1./152.1;
2620    
2621      fMipCor[0][0]=140.02*yfactor;
2622      fMipCor[0][1]=140.99*xfactor;
2623      fMipCor[0][2]=134.48*yfactor;
2624      fMipCor[0][3]=144.41*xfactor;
2625      fMipCor[0][4]=140.74*yfactor;
2626      fMipCor[0][5]=142.28*xfactor;
2627      fMipCor[0][6]=134.53*yfactor;
2628      fMipCor[0][7]=140.63*xfactor;
2629      fMipCor[0][8]=135.55*yfactor;
2630      fMipCor[0][9]=138.00*xfactor;
2631      fMipCor[0][10]=154.95*yfactor;
2632      fMipCor[0][11]=158.44*xfactor;
2633      
2634      
2635      fMipCor[1][0]=136.07*yfactor;
2636      fMipCor[1][1]=135.59*xfactor;
2637      fMipCor[1][2]=142.69*yfactor;
2638      fMipCor[1][3]=138.19*xfactor;
2639      fMipCor[1][4]=137.35*yfactor;
2640      fMipCor[1][5]=140.23*xfactor;
2641      fMipCor[1][6]=153.15*yfactor;
2642      fMipCor[1][7]=151.42*xfactor;
2643      fMipCor[1][8]=129.76*yfactor;
2644      fMipCor[1][9]=140.63*xfactor;
2645      fMipCor[1][10]=157.87*yfactor;
2646      fMipCor[1][11]=153.64*xfactor;
2647    
2648      fMipCor[2][0]=134.98*yfactor;
2649      fMipCor[2][1]=143.95*xfactor;
2650      fMipCor[2][2]=140.23*yfactor;
2651      fMipCor[2][3]=138.88*xfactor;
2652      fMipCor[2][4]=137.95*yfactor;
2653      fMipCor[2][5]=134.87*xfactor;
2654      fMipCor[2][6]=157.56*yfactor;
2655      fMipCor[2][7]=157.31*xfactor;
2656      fMipCor[2][8]=141.37*yfactor;
2657      fMipCor[2][9]=143.39*xfactor;
2658      fMipCor[2][10]=156.15*yfactor;
2659      fMipCor[2][11]=158.79*xfactor;
2660    
2661    /*
2662      for (Int_t j=0; j<fNviews;j++) {
2663        for (Int_t i=0; i<fNstrips_view;i++) {
2664        fMipCor[j][i]=1.;
2665        };
2666      };    
2667    
2668        
2669    */  
2670    };
2671    
2672    void Digitizer::CompressTrackData(Float_t AdcTrack[fNviews][fNstrips_view]) {
2673    // copy of the corresponding compression fortran routine + new digitization
2674    // std:: cout << "Entering CompressTrackData " << endl;
2675    Int_t oldval=0;
2676    Int_t newval=0;
2677    Int_t trasmesso=0;
2678    Int_t ntrastot=0;
2679    Float_t real;
2680    Float_t inte;
2681    Int_t cercacluster=0;
2682    Int_t kt=0;
2683    static const int DSPbufferSize = 4000; // 13 bit buffer to be rearranged in 16 bit Track buffer
2684    UShort_t DataDSP[DSPbufferSize];  // 13 bit  buffer to be rearranged in 16 bit Track buffer
2685    UShort_t DSPlength;  // 13 bit buffer to be rearranged in 16 bit Track buffer
2686    
2687    memset(fDataTrack,0,sizeof(UShort_t)*fTRACKbuffer); // probably not necessary becouse already done ?
2688    fTracklength=0;
2689    
2690      for (Int_t iv=0; iv<fNviews;iv++) {
2691      memset(DataDSP,0,sizeof(UShort_t)*DSPbufferSize);
2692      DSPlength=16; // skip the header, to be written later
2693      UShort_t CheckSum=0;
2694    // write dsp header on buffer
2695    
2696    //    fDataTrack[fTracklength]=0xE805;
2697    //    fTracklength++;
2698    
2699    //    fDataTrack[fTracklength]=0x01A9;
2700    //    fTracklength++;
2701    
2702    // end dsp header
2703    
2704       //
2705       // INIZIO VISTA IV - TAKE PROPER ACTION
2706       //
2707    
2708    
2709    
2710        for (Int_t ladder=0; ladder<fNladder;ladder++) {
2711          Int_t k=0;
2712          while (k<fNstrips_ladder) {
2713            // compress write in buffer the current LADDER
2714            if ( k == 0)  {
2715              real=modff(AdcTrack[iv][ladder*fNstrips_ladder+k],&inte);
2716              if (real > 0.5) inte=inte+1;
2717              newval=(Int_t)inte -(Int_t)fPedeTrack[iv][ladder*fNstrips_ladder+k];
2718              // first strip of ladder is transmitted
2719              // DC_TOT first " << AdcTrack[iv][ladder*fNstrips_ladder+k] << endl;
2720              DataDSP[DSPlength]=( ((UShort_t)inte) & 0x0FFF);
2721              DSPlength++;  
2722              ntrastot++;
2723              trasmesso=1;
2724              oldval=newval;
2725              kt=k;
2726              k++;
2727              continue;
2728            };
2729            real=modff(AdcTrack[iv][ladder*fNstrips_ladder+k],&inte);
2730            if (real > 0.5) inte=inte+1;
2731            newval=(Int_t)inte -(Int_t)(fPedeTrack[iv][ladder*fNstrips_ladder+k]);
2732            cercacluster=1; // ?????????
2733            if (cercacluster==1) {
2734            
2735     // controlla l'ordine di tutti queste strip ladder e DSP !!!!!!!      
2736              Int_t diff=0;
2737    
2738              
2739              switch ((iv+1)%2) {
2740              case 0: diff=newval-oldval;
2741              break;
2742              case 1: diff=oldval-newval;    
2743              break;
2744              };
2745    
2746              if (diff>fCutclu*(Int_t)fSigmaTrack[iv][ladder*fNstrips_ladder+k]) {
2747                Int_t clval=newval;
2748                Int_t klp=k;        // go on to search for maximum
2749                klp++;
2750    
2751                while(klp<fNstrips_ladder) {
2752                  real=modff(AdcTrack[iv][ladder*fNstrips_ladder+klp],&inte);
2753                  if (real > 0.5) inte=inte+1;
2754                  Int_t clvalp=(Int_t)inte -(Int_t)fPedeTrack[iv][ladder*fNstrips_ladder+klp];
2755                  if((iv+1)%2==0) {
2756    
2757                    if(clvalp>clval) {
2758                       clval=clvalp;
2759                       k=klp;}
2760                    else break; // max of cluster found
2761    
2762                  } else {  
2763    
2764                    if(clvalp<clval) {
2765                       clval=clvalp;
2766                       k=klp;}
2767                    else break; // max of cluster found
2768    
2769                  };
2770                  
2771                  klp++;
2772                };
2773    
2774                Int_t kl1=k-fNclst; // max of cluster (or end of ladder ?)
2775                trasmesso=0;
2776                if(kl1<0)  kl1=0;
2777    
2778                if(kt>=kl1) kl1=kt+1;
2779                if( (kt+1)==kl1 ) trasmesso=1;
2780    
2781    
2782                
2783                Int_t kl2=k+fNclst;
2784                if(kl2>=fNstrips_ladder) kl2=fNstrips_ladder-1;
2785    
2786                for(Int_t klt=kl1 ; klt<=kl2 ; klt++) {
2787                  if(trasmesso==0) {
2788                  //  std:: cout << "STRIP " << klt << endl;
2789                  //  std:: cout << "ADC_TOT " <<AdcTrack[iv][ladder*fNstrips_ladder+klt] << endl;
2790    
2791                    DataDSP[DSPlength]=( ((UShort_t)klt) | 0x1000);
2792                    DSPlength++;  
2793                    ntrastot++;
2794                
2795    
2796                    real=modff(AdcTrack[iv][ladder*fNstrips_ladder+klt],&inte);
2797                    if (real > 0.5) inte=inte+1;
2798                    DataDSP[DSPlength]=( ((UShort_t)inte) & 0x0FFF);
2799                    DSPlength++;
2800                    ntrastot++;
2801                
2802                   }
2803                   else {
2804                   //   std:: cout << "ADC_TOT " <<AdcTrack[iv][ladder*fNstrips_ladder+klt] << endl;
2805                    real=modff(AdcTrack[iv][ladder*fNstrips_ladder+klt],&inte);
2806                    if (real > 0.5) inte=inte+1;
2807                    DataDSP[DSPlength]=( ((UShort_t)inte) & 0x0FFF);
2808                    DSPlength++;              
2809                    ntrastot++;
2810                    };
2811                    trasmesso=1;                        
2812                };  // end trasmission
2813                kt=kl2;
2814                k=kl2;
2815                real=modff(AdcTrack[iv][ladder*fNstrips_ladder+kt],&inte);
2816                if (real > 0.5) inte=inte+1;
2817                oldval=(Int_t)inte -(Int_t)fPedeTrack[iv][ladder*fNstrips_ladder+kt];
2818                k++;
2819                continue;
2820    
2821    
2822              }; // end cercacluster
2823            }; // end cercacluster
2824          
2825    // start ZOP check for strips no
2826          
2827          if(abs(newval-oldval)>=fCutzop*(Int_t)fSigmaTrack[iv][ladder*fNstrips_ladder+k]) {
2828    
2829           if(trasmesso==0) {
2830           // std:: cout << "STRIP " << k << endl;
2831           // std:: cout << "ADC_TOT " << AdcTrack[iv][ladder*fNstrips_ladder+k] << endl;
2832    
2833             DataDSP[DSPlength]=( ((UShort_t)k) | 0x1000);
2834             DSPlength++;  
2835             ntrastot++;
2836                
2837    
2838             real=modff(AdcTrack[iv][ladder*fNstrips_ladder+k],&inte);
2839             if (real > 0.5) inte=inte+1;
2840             DataDSP[DSPlength]=( ((UShort_t)inte) & 0x0FFF);
2841             DSPlength++;
2842             ntrastot++;
2843    
2844           }
2845           else {
2846           //  std:: cout << "ADC_TOT " << AdcTrack[iv][ladder*fNstrips_ladder+k] << endl;
2847             real=modff(AdcTrack[iv][ladder*fNstrips_ladder+k],&inte);
2848             if (real > 0.5) inte=inte+1;
2849             DataDSP[DSPlength]=(  ((UShort_t)inte) & 0x0FFF);
2850             DSPlength++;
2851             ntrastot++;      
2852           };
2853           trasmesso=1;
2854           oldval=newval;
2855           kt=k;
2856    
2857          }  
2858          else trasmesso=0;
2859          // end zop
2860          
2861          k++;      
2862          };  // end cycle inside ladder
2863    // write here the end ladder bytes
2864    //            std:: cout << "FINE LADDER " << ladder+1 << endl;
2865    
2866          DataDSP[DSPlength]=( ((UShort_t)(ladder+1))  | 0x1800);
2867          DSPlength++;
2868          ntrastot++;
2869          trasmesso=0;
2870    
2871        };  //end cycle inside dsp
2872    //  std:: cout << "FINE DSP " << iv+1 << endl;
2873    // here put DSP header
2874        DataDSP[0]=(0x1CA0 | ((UShort_t)(iv+1)) );
2875        UShort_t Nword=(DSPlength*13)/16;
2876        if( ((DSPlength*13)%16)!=0) Nword++;
2877        DataDSP[1]=(0x1400 | ( Nword >> 10));
2878        DataDSP[2]=(0x1400 | ( Nword & 0x03FF) );
2879        DataDSP[3]=(0x1400 | (( (UShort_t)(fCounter >> 10) ) & 0x03FF) );
2880        DataDSP[4]=(0x1400 | (( (UShort_t)(fCounter) )  & 0x03FF) );
2881        DataDSP[5]=(0x1400 | ( (UShort_t)(fNclst << 7) ) | ( (UShort_t)(fCutzop << 4) )
2882         | ( (UShort_t)fCutzop  ) );
2883        DataDSP[6]=0x1400;
2884        DataDSP[7]=0x1400;
2885        DataDSP[8]=0x1400;
2886        DataDSP[9]=0x1400;
2887        DataDSP[10]=0x1400;
2888        DataDSP[11]=0x1400;
2889        DataDSP[12]=0x1400;
2890        DataDSP[13]=0x1400;
2891        DataDSP[14]=(0x1400 | (CheckSum & 0x00FF) );
2892        DataDSP[15]=0x1C00;
2893    // end DSP header    
2894    
2895    
2896    // write 13 bit DataDSP bufer inside 16 bit fDataTrack buffer
2897        Int_t Bit16free=16;
2898        UShort_t Dato;
2899        for (Int_t NDSP=0; NDSP<DSPlength;NDSP++) {
2900          Int_t Bit13ToWrite=13;
2901          while(Bit13ToWrite>0) {
2902            if(Bit13ToWrite<=Bit16free) {
2903              Dato=((DataDSP[NDSP]&(0xFFFF >> (16-Bit13ToWrite)))<<(Bit16free-Bit13ToWrite));
2904              fDataTrack[fTracklength]=fDataTrack[fTracklength] | Dato ;
2905              Bit16free=Bit16free-Bit13ToWrite;
2906              Bit13ToWrite=0;
2907              if(Bit16free==0) {
2908                if(NDSP>15) CheckSum=CheckSum^fDataTrack[fTracklength];
2909                fTracklength++;
2910                Bit16free=16;
2911              };          
2912            }
2913            else if(Bit13ToWrite>Bit16free) {
2914              Dato=( (DataDSP[NDSP]&(0xFFFF >> (16-Bit13ToWrite) ) ) >> (Bit13ToWrite-Bit16free) );
2915              fDataTrack[fTracklength]=fDataTrack[fTracklength] | Dato ;
2916              if(NDSP>15) CheckSum=CheckSum^fDataTrack[fTracklength];
2917              fTracklength++;
2918              Bit13ToWrite=Bit13ToWrite-Bit16free;
2919              Bit16free=16;  
2920            };
2921            
2922          }; // end cycle while(Bit13ToWrite>0)
2923              
2924        }; // end cycle DataDSP
2925        if(Bit16free!=16) { fTracklength++; CheckSum=CheckSum^fDataTrack[fTracklength]; };
2926        CheckSum=(CheckSum >> 8)^(CheckSum&0x00FF);
2927        fDataTrack[fTracklength-Nword+11]=(0x0280 | (CheckSum >> 3));
2928        fDataTrack[fTracklength-Nword+12]=(0x1C00 | (CheckSum << 13) );
2929    
2930    // end write 13 bit DataDSP bufer inside 16 bit fDataTrack buffer
2931    
2932    //write trailer on buffer
2933        UShort_t ReLength=(UShort_t)((Nword+13)*2+3);
2934        UShort_t OveCheckCode=0x0000;
2935    
2936        fDataTrack[fTracklength]=0x0000;
2937        fTracklength++;
2938      
2939        fDataTrack[fTracklength]=(ReLength >> 8);
2940        fTracklength++;
2941      
2942        fDataTrack[fTracklength]=( (ReLength << 8) | (OveCheckCode & 0x00FF) );
2943        fTracklength++;  
2944    // end trailer
2945    //    std:: cout  << "DSPlength  " <<DSPlength << endl;
2946    //    std:: cout << "Nword " << Nword  << endl;
2947    //    std:: cout <<  "ReLength " << ReLength << endl;
2948      };    
2949    //    std:: cout << "ntrastot " << ntrastot << endl;    
2950    
2951    };
2952    
2953    
2954    Float_t Digitizer::SaturationTrack(Float_t ADC) {
2955      Float_t SatFact=1.;
2956      if(ADC<70.) { SatFact=80./ADC; };
2957      if(ADC>3000.) { SatFact=3000./ADC; };
2958      return SatFact;
2959    };
2960    
2961    
2962    
2963    
2964    
2965    

Legend:
Removed from v.1.2  
changed lines
  Added in v.1.6

  ViewVC Help
Powered by ViewVC 1.1.23