2 #include "G4Poisson.hh" 3 #include "Randomize.hh" 5 #include <CCDB/Calibration.h> 6 #include <CCDB/Model/Assignment.h> 7 #include <CCDB/CalibrationGenerator.h> 14 #include "CLHEP/Units/PhysicalConstants.h" 15 using namespace CLHEP;
23 if(runno == -1)
return ftc;
26 ftc.
date =
"2015-11-29";
27 if(getenv (
"CCDB_CONNECTION") != NULL)
28 ftc.
connection = (string) getenv(
"CCDB_CONNECTION");
30 ftc.
connection =
"mysql://clas12reader@clasdb.jlab.org/clas12";
45 cout<<
"FTOF:Setting time resolution"<<endl;
46 for(
int p=0; p<3; p++)
48 for(
int c=1; c<ftc.
npaddles[p]+1;c++)
50 if(p==0) ftc.
tres[p].push_back(1e-3*(c*5.45+74.55));
51 if(p==1) ftc.
tres[p].push_back(1e-3*(c*0.90+29.10));
52 if(p==2) ftc.
tres[p].push_back(1e-3*(c*5.00+145.0));
62 vector<vector<double> > data;
64 auto_ptr<Calibration> calib(CalibrationGenerator::CreateCalibration(ftc.
connection));
65 cout<<
"Connecting to "<<ftc.
connection<<
"/calibration/ftof"<<endl;
67 cout<<
"FTOF:Getting attenuation"<<endl;
68 sprintf(ftc.
database,
"/calibration/ftof/attenuation:%d",ftc.
runNo);
69 data.clear(); calib->GetCalib(data,ftc.
database);
70 for(
unsigned row = 0; row < data.size(); row++)
72 isec = data[row][0]; ilay = data[row][1]; istr = data[row][2];
73 ftc.
attlen[isec-1][ilay-1][0].push_back(data[row][3]);
74 ftc.
attlen[isec-1][ilay-1][1].push_back(data[row][4]);
77 cout<<
"FTOF:Getting effective_velocity"<<endl;
78 sprintf(ftc.
database,
"/calibration/ftof/effective_velocity:%d",ftc.
runNo);
79 data.clear(); calib->GetCalib(data,ftc.
database);
80 for(
unsigned row = 0; row < data.size(); row++)
82 isec = data[row][0]; ilay = data[row][1]; istr = data[row][2];
83 ftc.
veff[isec-1][ilay-1][0].push_back(data[row][3]);
84 ftc.
veff[isec-1][ilay-1][1].push_back(data[row][4]);
87 cout<<
"FTOF:Getting status"<<endl;
88 sprintf(ftc.
database,
"/calibration/ftof/status:%d",ftc.
runNo);
89 data.clear() ; calib->GetCalib(data,ftc.
database);
90 for(
unsigned row = 0; row < data.size(); row++)
92 isec = data[row][0]; ilay = data[row][1]; istr = data[row][2];
93 ftc.
status[isec-1][ilay-1][0].push_back(data[row][3]);
94 ftc.
status[isec-1][ilay-1][1].push_back(data[row][4]);
97 cout<<
"FTOF:Getting gain_balance"<<endl;
98 sprintf(ftc.
database,
"/calibration/ftof/gain_balance:%d",ftc.
runNo);
99 data.clear() ; calib->GetCalib(data,ftc.
database);
100 for(
unsigned row = 0; row < data.size(); row++)
102 isec = data[row][0]; ilay = data[row][1]; istr = data[row][2];
103 ftc.
countsForMIP[isec-1][ilay-1][0].push_back(data[row][3]);
104 ftc.
countsForMIP[isec-1][ilay-1][1].push_back(data[row][4]);
107 cout<<
"FTOF:Getting time_walk"<<endl;
108 sprintf(ftc.
database,
"/calibration/ftof/time_walk:%d",ftc.
runNo);
109 data.clear() ; calib->GetCalib(data,ftc.
database);
110 for(
unsigned row = 0; row < data.size(); row++)
112 isec = data[row][0]; ilay = data[row][1]; istr = data[row][2];
113 ftc.
twlk[isec-1][ilay-1][0].push_back(data[row][3]);
114 ftc.
twlk[isec-1][ilay-1][1].push_back(data[row][4]);
115 ftc.
twlk[isec-1][ilay-1][2].push_back(data[row][5]);
116 ftc.
twlk[isec-1][ilay-1][3].push_back(data[row][6]);
117 ftc.
twlk[isec-1][ilay-1][4].push_back(data[row][7]);
118 ftc.
twlk[isec-1][ilay-1][5].push_back(data[row][8]);
126 if(ftc.
runNo != runno)
128 cout <<
" > Initializing " << HCname <<
" digitization for run number " << runno << endl;
129 ftc = initializeFTOFConstants(runno);
137 map<string, double> dgtz;
138 vector<identifier> identity = aHit->
GetId();
140 int sector = identity[0].id;
141 int panel = identity[1].id;
142 int paddle = identity[2].id;
149 double dLeft = length + tInfos.
lx;
150 double dRight = length - tInfos.
lx;
153 double attlenL = ftc.
attlen[sector-1][panel-1][0][paddle-1];
154 double attlenR = ftc.
attlen[sector-1][panel-1][1][paddle-1];
157 double attLeft = exp(-dLeft/cm/attlenL);
158 double attRight = exp(-dRight/cm/attlenR);
164 double gainLeft = sqrt(attLeft*attRight);
165 double gainRight = gainLeft;
168 double eneL = tInfos.
eTot*attLeft;
169 double eneR = tInfos.
eTot*attRight;
185 adclu = eneL*ftc.
countsForMIP[sector-1][panel-1][0][paddle-1]/ftc.
dEMIP[panel-1]/gainLeft;
188 adcru = eneR*ftc.
countsForMIP[sector-1][panel-1][1][paddle-1]/ftc.
dEMIP[panel-1]/gainRight;
191 double npheL = G4Poisson(eneL*ftc.
pmtPEYld);
195 adcl = eneL*ftc.
countsForMIP[sector-1][panel-1][0][paddle-1]/ftc.
dEMIP[panel-1]/gainLeft;
196 double A = ftc.
twlk[sector-1][panel-1][0][paddle-1];
197 double B = ftc.
twlk[sector-1][panel-1][1][paddle-1];
199 double timeWalkLeft = A/pow(adcl,B);
200 double tLeftU = tInfos.
time + dLeft/ftc.
veff[sector-1][panel-1][0][paddle-1]/cm + timeWalkLeft;
201 double tLeft = G4RandGauss::shoot(tLeftU, sqrt(2)*ftc.
tres[panel-1][paddle-1]);
202 tdclu = tLeftU*ftc.
tdcLSB;
206 double npheR = G4Poisson(eneR*ftc.
pmtPEYld);
210 adcr = eneR*ftc.
countsForMIP[sector-1][panel-1][1][paddle-1]/ftc.
dEMIP[panel-1]/gainRight;
211 double A = ftc.
twlk[sector-1][panel-1][3][paddle-1];
212 double B = ftc.
twlk[sector-1][panel-1][4][paddle-1];
214 double timeWalkRight = A/pow(adcr,B);
215 double tRightU = tInfos.
time + dRight/ftc.
veff[sector-1][panel-1][1][paddle-1]/cm + timeWalkRight;
216 double tRight = G4RandGauss::shoot(tRightU, sqrt(2)*ftc.
tres[panel-1][paddle-1]);
217 tdcru = tRightU*ftc.
tdcLSB;
222 switch (ftc.
status[sector-1][panel-1][0][paddle-1])
240 cout <<
" > Unknown FTOF status: " << ftc.
status[sector-1][panel-1][0][paddle-1] <<
" for sector " << sector <<
", panel " << panel <<
", paddle " << paddle <<
" left " << endl;
243 switch (ftc.
status[sector-1][panel-1][1][paddle-1])
261 cout <<
" > Unknown FTOF status: " << ftc.
status[sector-1][panel-1][1][paddle-1] <<
" for sector " << sector <<
", panel " << panel <<
", paddle " << paddle <<
" right " << endl;
269 dgtz[
"sector"] = sector;
270 dgtz[
"paddle"] = paddle;
275 dgtz[
"ADCLu"] = adclu;
276 dgtz[
"ADCRu"] = adcru;
277 dgtz[
"TDCLu"] = tdclu;
278 dgtz[
"TDCRu"] = tdcru;
285 id[
id.size()-1].id_sharing = 1;
294 map< string, vector <int> > MH;
vector< double > attlen[6][3][2]
vector< int > status[6][3][2]
void initWithRunNumber(int runno)
vector< double > twlk[6][3][6]
vector< identifier > GetId()
vector< identifier > processID(vector< identifier >, G4Step *, detector)
map< string, double > integrateDgt(MHit *, int)
map< string, vector< int > > multiDgt(MHit *, int)
vector< double > countsForMIP[6][3][2]
vector< double > dimensions
vector of dimensions. Size, units depends on solid type
vector< double > veff[6][3][2]