83 fBmnHitsArray->Delete();
85 if (!fBmnPointsArray) {
86 Error(
"BmnDchHitProducer::Exec()",
" !!! Unknown branch name !!! ");
90 if (fVerbose) cout <<
"======================== DCH hit finder exec started ====================" << endl;
92 for (Int_t iPoint = 0; iPoint < fBmnPointsArray->GetEntriesFast(); iPoint++) {
96 Int_t track_id = dchPoint->GetTrackID();
97 Double_t x = dchPoint->GetX();
98 Double_t y = dchPoint->GetY();
99 Double_t z = dchPoint->GetZ();
100 Double_t px = dchPoint->GetPx();
101 Double_t py = dchPoint->GetPy();
102 Double_t pz = dchPoint->GetPz();
105 Int_t dchId = (z < 600.)? 1 : 2;
106 Double_t pdg = dchPoint->
GetPdgId();
107 Double_t charge = px*px +py*py +pz*pz;
110 if(
fabs(px*px +py*py +pz*pz)<.25)
continue;
113 hMCtr_ionID_dc1->Fill(pdg);
116 hMCtr_ionID_dc2->Fill(pdg);
119 Double_t x_shift = 0.0;
120 Double_t y_shift = 0.0;
123 Double_t x_loc = -(x - x_shift);
124 Double_t y_loc = y - y_shift;
125 Double_t v_loc = (x_loc + y_loc)/TMath::Sqrt2();
126 Double_t u_loc = (y_loc - x_loc)/TMath::Sqrt2();
129 Double_t wire_pos = DBL_MAX;
132 Double_t owdist = (fPlaneTypes[currentPlaneNum][1] ==
'a') ? 119.0 : 118.5;
134 if(fPlaneTypes[currentPlaneNum][0] ==
'x') wire_pos = x_loc + owdist;
135 if(fPlaneTypes[currentPlaneNum][0] ==
'y') wire_pos = y_loc + owdist;
136 if(fPlaneTypes[currentPlaneNum][0] ==
'v') wire_pos = v_loc + owdist;
137 if(fPlaneTypes[currentPlaneNum][0] ==
'u') wire_pos = u_loc + owdist;
142 if(wire_pos - Int_t(wire_pos) < 0.5) {
143 nearest_wire = Int_t(wire_pos);
147 nearest_wire = Int_t(wire_pos) + 1;
152 Double_t wdist = TMath::Abs(wire_pos - nearest_wire);
155 Double_t sigm_err = (wdist < 0.02) ? 0.08 : (wdist >= 0.02 && wdist < 0.1) ? 0.06 : (wdist >= 0.1 && wdist < 0.4) ? 0.015 : (wdist >= 0.4 && wdist < 0.41) ? 0.08 : 0.10;
157 Double_t dev = rand_gen.Gaus(0, sigm_err);
158 Double_t wdist_smeared = wdist+dev ;
160 if(wdist_smeared > .5 ){
162 wdist_smeared = 1. - wdist_smeared;
166 if(wdist_smeared < 0){
169 wdist_smeared = - wdist_smeared;
176 Double_t z1_smeared = z;
181 Double_t z2_smeared = z;
184 if(fPlaneTypes[currentPlaneNum][0] ==
'x') {
186 x1_smeared = -(x_loc - dev) + x_shift;
187 y1_smeared = y_loc + y_shift;
188 x2_smeared = (x1_smeared - 2*wdist_smeared) + x_shift;
189 y2_smeared = y1_smeared;
192 x1_smeared = -(x_loc + dev) + x_shift;
193 y1_smeared = y_loc + y_shift;
194 x2_smeared = (x1_smeared + 2*wdist_smeared) + x_shift;
195 y2_smeared = y1_smeared;
199 if(fPlaneTypes[currentPlaneNum][0] ==
'y') {
201 x1_smeared = -x_loc + x_shift;
202 y1_smeared = y_loc + y_shift - dev;
203 x2_smeared = x1_smeared;
204 y2_smeared = y1_smeared + 2*wdist_smeared + y_shift;
207 x1_smeared = -x_loc + x_shift;
208 y1_smeared = y_loc + y_shift + dev;
209 x2_smeared = x1_smeared;
210 y2_smeared = y1_smeared - 2*wdist_smeared + y_shift;
214 if(fPlaneTypes[currentPlaneNum][0] ==
'v') {
216 x1_smeared = -(((v_loc - dev) - u_loc)/TMath::Sqrt2()) + x_shift;
217 y1_smeared = (((v_loc - dev) + u_loc)/TMath::Sqrt2()) + y_shift;
218 x2_smeared = -(((v_loc + 2*wdist_smeared) - u_loc)/TMath::Sqrt2()) + x_shift;
219 y2_smeared = (((v_loc + 2*wdist_smeared) + u_loc)/TMath::Sqrt2()) + y_shift;
222 x1_smeared = -(((v_loc + dev) - u_loc)/TMath::Sqrt2()) + x_shift;
223 y1_smeared = (((v_loc + dev) + u_loc)/TMath::Sqrt2()) + y_shift;
224 x2_smeared = -(((v_loc - 2*wdist_smeared) - u_loc)/TMath::Sqrt2()) + x_shift;
225 y2_smeared = (((v_loc - 2*wdist_smeared) + u_loc)/TMath::Sqrt2()) + y_shift;
229 if(fPlaneTypes[currentPlaneNum][0] ==
'u') {
231 x1_smeared = -((v_loc - (u_loc - dev))/TMath::Sqrt2()) + x_shift;
232 y1_smeared = ((v_loc + (u_loc - dev))/TMath::Sqrt2()) + y_shift;
233 x2_smeared = -((v_loc - (u_loc + 2*wdist_smeared))/TMath::Sqrt2()) + x_shift;
234 y2_smeared = ((v_loc + (u_loc + 2*wdist_smeared))/TMath::Sqrt2()) + y_shift;
237 x1_smeared = -((v_loc - (u_loc + dev))/TMath::Sqrt2()) + x_shift;
238 y1_smeared = ((v_loc + (u_loc + dev))/TMath::Sqrt2()) + y_shift;
239 x2_smeared = -((v_loc - (u_loc - 2*wdist_smeared))/TMath::Sqrt2()) + x_shift;
240 y2_smeared = ((v_loc + (u_loc - 2*wdist_smeared))/TMath::Sqrt2()) + y_shift;
246 Bool_t info_out =
false;
248 cout <<
"(x:y:z) = ( " << x <<
" : " << y <<
" : " << z <<
" )\n";
249 cout <<
" pdg code "<<dchPoint->
GetPdgId()<<
" \n";
250 cout <<
" charge "<<dchPoint->
GetCharge()<<
" \n";
252 cout <<
" currentPlaneNum = " << currentPlaneNum <<
"\n";
253 cout <<
" PlaneType = " << fPlaneTypes[currentPlaneNum][0] <<
"\n";
254 cout <<
" dev "<<dev<<
" wdist_smeared = " <<wdist_smeared<<
"\n";
255 cout <<
" smeared1(x:y:z) = ( " << x1_smeared <<
" : " << y1_smeared <<
" : " << z1_smeared <<
" )\n";
256 cout <<
" smeared2(x:y:z) = ( " << x2_smeared <<
" : " << y2_smeared <<
" : " << z2_smeared <<
" )\n";
257 cout <<
" wdist = " << wdist <<
"\n";
258 cout <<
" wire_pos = " << wire_pos <<
"\n";
259 cout <<
" nearest_wire = " << nearest_wire <<
"\n";
260 cout <<
" sigm_err = " << sigm_err <<
"\n";
261 cout <<
" left = " << left <<
"\n";
262 cout <<
" dchId = " << dchId <<
"\n";
268 if(rand_gen.Uniform() <= 1.) {
270 BmnDchHit* hit =
new ((*fBmnHitsArray)[fBmnHitsArray->GetEntriesFast()])
271 BmnDchHit(0, TVector3(x, y, z), TVector3(sigm_err, sigm_err, 0.0), iPoint);
273 currentPlaneNum += (dchId == 1) ? 0 : 8;
284 if (fVerbose) cout <<
"======================== DCH hit finder exec finished ===================" << endl;