19#include "FairLogger.h"
20#include "FairRootManager.h"
27static Double_t workTime = 0.0;
32 if (!IsActive())
return;
34 clock_t tStart = clock();
35 PrepareArraysToProcessEvent();
36 if (fDebug) cout <<
"\n======================== Upstream track finder exec started ===================\n" << endl;
37 if (fDebug) printf(
"Event number: %d\n", fEventNo);
40 if (fDebug) cout<<
"--------------Read-------------"<<endl;
41 ReadSiliconTracks(par_ab_SiTr,par_SiTr_z,NSiTracks, vec_points);
42 ReadSiliconHits(SiXYhits,NSiXYhits);
44 if (fDebug) cout<<
"--------------Reco: MWPCSegments-----"<<endl;
45 ReadMWPCSegments(par_ab_Ch,par_Seg_z,Nseg_Ch, vec_points);
46 if (fDebug) cout<<
"--------------Reco: MWPCTracks"<<endl;
47 ReadMWPCTracks(par_ab_tr,par_ab_trz,NPCTracks);
50 if (fDebug) cout<<
"--------------Matching Si-tracks & PC-tracks-----"<<endl;
51 PCTracksSiTracksMatching(par_ab_SiTr,par_SiTr_z,NSiTracks,par_ab_tr,par_ab_trz,NPCTracks,vtmpSeg,OutVector);
52 if (fDebug) cout<<
"--------------Matching Si-tracks & PC-segments---"<<endl;
53 PCSegmentsSiTracksMatching(par_ab_SiTr,par_SiTr_z,NSiTracks,par_ab_Ch,par_Seg_z,Nseg_Ch,vtmpSeg,OutVector);
54 if (fDebug) cout<<
"--------------Adding hits-------------------------"<<endl;
55 GetAddSiHits(OutVector,SiXYhits,NSiXYhits);
56 GetHitsToPoints(OutVector,par_ab_tr,NPCTracks,par_ab_Ch,Nseg_Ch,Points,NumPoints);
58 if (fDebug) cout<<
"--------------Fit--------------------------------"<<endl;
59 CalculationOfChi2(Points, NumPoints, vecUpTracks);
61 if (fDebug) PrintAllTracks(vecUpTracks);
62 if (!expData) MCefficiencyCalculation(vec_points, vecUpTracks);
64 if (fDebug) cout<<
"----TrackRecording--------------------------------"<<endl;
65 TrackRecording(vecUpTracks);
67 if (fDebug) cout << endl;
68 if (fDebug) cout <<
"======================== Upstream track finder exec finished ===================" << endl;
69 clock_t tFinish = clock();
70 workTime += ((Double_t) (tFinish - tStart)) / CLOCKS_PER_SEC;
74void BmnUpstreamTracking::MCefficiencyCalculation(vector<MC_points> &points, vector<UpTracks> &vecUp){
76 if (fDebug) cout<<
" ---UpMC tracks association--"<<endl;
78 Double_t delta2[4] = {-999.,-999.,-999.,-999.};
79 Double_t sig[4] = {0.03, 4., 0.03, 4.};
82 Double_t dmc_match[kMaxMC];
83 Int_t mc_tr_assoc[kMaxMC];
85 for (Int_t j = 0; j < kMaxMC; j++) {
95 if (fDebug) cout<<
" MC "<<points.size()<<
" UpTracks "<<vecUp.size()<<endl;
97 Int_t Ngood_mc_tracks = 0;
98 Int_t Ngood_reco_tracks = 0;
99 for (
size_t itr = 0; itr < points.size(); itr++) {
103 if (fDebug ) cout<<
" Np "<<points.at(itr).Np<<
" pdg "<<points.at(itr).Pdg<<endl;
104 if (fDebug && points.at(itr).Np >=7
105 && points.at(itr).np_3si == 0
106 && (points.at(itr).Np_ch2 > 3 || points.at(itr).Np_ch3 > 3) ){
109 hDen_mcuptr->Fill(1);
110 hDen_mcuptr->Fill(0);
111 hY_vs_Xmctrue->Fill(points.at(itr).param[1],points.at(itr).param[3]);
114 cout<<
" itr "<<itr<<
" Ngood_mc_tracks "<<Ngood_mc_tracks<<endl;
118 for(
size_t iup= 0; iup < vecUp.size(); iup ++) {
119 delta2[0] = points.at(itr).param[0] - vecUp.at(iup).param[0];
120 delta2[1] = points.at(itr).param[1] - vecUp.at(iup).param[1];
121 delta2[2] = points.at(itr).param[2] - vecUp.at(iup).param[2];
122 delta2[3] = points.at(itr).param[3] - vecUp.at(iup).param[3];
125 dmatch = (delta2[0]*delta2[0])/(sig[0]*sig[0])+
126 (delta2[1]*delta2[1])/(sig[1]*sig[1])+
127 (delta2[2]*delta2[2])/(sig[2]*sig[2])+
128 (delta2[3]*delta2[3])/(sig[3]*sig[3]);
131 if (fDebug && delta2[0] > -900.) hdAx_tr_mc_comb->Fill(delta2[0]);
132 if (fDebug && delta2[1] > -900.) hdX_tr_mc_comb ->Fill(delta2[1]);
133 if (fDebug && delta2[2] > -900.) hdAy_tr_mc_comb->Fill(delta2[2]);
134 if (fDebug && delta2[3] > -900.) hdY_tr_mc_comb ->Fill(delta2[3]);
136 if (fDebug) cout<<
" imc "<<itr<<
" iup "<<iup<<
" Nhits "<<vecUp.at(iup).Nhits<<
" ax_mc "<<points.at(itr).param[0]<<
" ay_mc "<<points.at(itr).param[2]
137 <<
" ax_up "<<vecUp.at(iup).param[0]<<
" ay_up "<<vecUp.at(iup).param[2]<<
138 " dmc_match "<< dmc_match[itr] <<
" "<<dmatch<<
" delta2[0] "<<delta2[0]<<
" delta2[1] "<<delta2[1]<<
" delta2[2] "<<delta2[2]<<
" delta2[3] "<<delta2[3]<<endl;
140 if ( dmc_match[itr] > dmatch){
141 dmc_match[itr] = dmatch;
142 mc_tr_assoc[itr] = iup;
155 if (mc_tr_assoc[itr] > -1){
156 cout<<
" mc itr "<<itr<<
" rec "<<mc_tr_assoc[itr]<<endl;
157 if (dax > -900.) hdAx_uptr_mc->Fill(dax);
158 if (dx > -900.) hdX_uptr_mc ->Fill(dx);
159 if (day > -900.) hdAy_uptr_mc->Fill(day);
160 if (dy > -900.) hdY_uptr_mc ->Fill(dy);
166 if (fDebug) cout<<
"reject poorly chosen association segments "<<endl;
167 for (
size_t itr = 0; itr < points.size(); itr++) {
168 if (mc_tr_assoc[itr] == -1)
continue;
170 for (
size_t itr2 = 0; itr2 < points.size(); itr2++) {
171 if (itr2 == itr)
continue;
172 if (mc_tr_assoc[itr2] == -1)
continue;
174 if (mc_tr_assoc[itr] == mc_tr_assoc[itr2]){
175 if (dmc_match[itr2] > dmc_match[itr] ) mc_tr_assoc[itr2] = -1;
177 mc_tr_assoc[itr] = -1;
184 if (fDebug) cout<<
" mc_Id "<<points.at(itr).Id<<
" pdg "<<points.at(itr).Pdg<<
" assoc "<<mc_tr_assoc[itr]<<endl;
185 if (fDebug && mc_tr_assoc[itr] > -1 && fDebug && points.at(itr).Np >=7
186 && points.at(itr).np_3si == 0
187 && (points.at(itr).Np_ch2 > 3 || points.at(itr).Np_ch3 > 3)){
188 if ( points.at(itr).xWas3 && points.at(itr).uWas3 && points.at(itr).vWas3 &&
189 points.at(itr).xWas2 && points.at(itr).uWas2 && points.at(itr).vWas2 )hNum_mcuptr->Fill(1);
191 hNum_mcuptr->Fill(0);
197 if (fDebug) cout<<
" Ngood_mc_tracks "<<Ngood_mc_tracks<<
" Ngood_reco_tracks "<<Ngood_reco_tracks<<endl;
199 hNtr_reco->Fill(Ngood_reco_tracks);
200 hNtr_mc ->Fill(Ngood_mc_tracks);
201 hNtr_mc_vs_reco ->Fill(Ngood_reco_tracks,Ngood_mc_tracks);
202 if (Ngood_mc_tracks == 2) hNrecoTrif2mc->Fill(Ngood_reco_tracks);
205 for (
size_t itr = 0; itr < points.size(); itr++) {
206 if (mc_tr_assoc[itr] > -1) vecUp.at(mc_tr_assoc[itr]).Pdg = points.at(itr).Pdg;
210 Bool_t track1_was = 0;
212 Bool_t ifSelectedCases = 0;
213 if (fDebug) cout<<
" reco tracks: "<<endl;
215 if (Ngood_mc_tracks == 2 ) ifNmc2 = 1;
217 if ( vecUp.size() == 2 && Ngood_mc_tracks == 2){
218 for (
size_t iup= 0; iup < vecUp.size(); iup ++) {
219 if (fDebug) cout<<
" iup "<<iup<<
" found code pdg "<<vecUp.at(iup).Pdg <<endl;
220 if (track1_was == 0){
222 tt.track1_pdg = vecUp.at(0).Pdg;
223 tt.track1[0] = vecUp.at(iup).param[0];
224 tt.track1[1] = vecUp.at(iup).param[1];
225 tt.track1[2] = vecUp.at(iup).param[2];
226 tt.track1[3] = vecUp.at(iup).param[3];
228 if (track1_was == 1){
229 tt.track2_pdg = vecUp.at(1).Pdg;
230 tt.track2[0] = vecUp.at(iup).param[0];
231 tt.track2[1] = vecUp.at(iup).param[1];
232 tt.track2[2] = vecUp.at(iup).param[2];
233 tt.track2[3] = vecUp.at(iup).param[3];
236 if (track1_was == 1) vec_twotracks.push_back(tt);
237 if (fDebug) cout<<
" vec_twotracks "<<vec_twotracks.size()<<endl;
240 if (vec_twotracks.size() == 1){
243 (vec_twotracks.at(itr).track1_pdg == PDG_Be7 && vec_twotracks.at(itr).track2_pdg == PDG_p) || (vec_twotracks.at(itr).track2_pdg == PDG_Be7 && vec_twotracks.at(itr).track1_pdg == PDG_p) ||
244 (vec_twotracks.at(itr).track1_pdg == PDG_Be7 && vec_twotracks.at(itr).track2_pdg == PDG_H2) || (vec_twotracks.at(itr).track2_pdg == PDG_Be7 && vec_twotracks.at(itr).track1_pdg == PDG_H2) ||
245 (vec_twotracks.at(itr).track1_pdg == PDG_Be7 && vec_twotracks.at(itr).track2_pdg == PDG_He4) || (vec_twotracks.at(itr).track2_pdg == PDG_Be7 && vec_twotracks.at(itr).track1_pdg == PDG_He4)||
246 (vec_twotracks.at(itr).track1_pdg == PDG_Be7 && vec_twotracks.at(itr).track2_pdg == PDG_He3) || (vec_twotracks.at(itr).track2_pdg == PDG_Be7 && vec_twotracks.at(itr).track1_pdg == PDG_He3)||
247 (vec_twotracks.at(itr).track1_pdg == PDG_Li7 && vec_twotracks.at(itr).track2_pdg == PDG_He4) || (vec_twotracks.at(itr).track2_pdg == PDG_Li7 && vec_twotracks.at(itr).track1_pdg == PDG_He4)||
248 (vec_twotracks.at(itr).track1_pdg == PDG_Li7 && vec_twotracks.at(itr).track2_pdg == PDG_He3) || (vec_twotracks.at(itr).track2_pdg == PDG_Li7 && vec_twotracks.at(itr).track1_pdg == PDG_He3)||
249 (vec_twotracks.at(itr).track1_pdg == PDG_Li6 && vec_twotracks.at(itr).track2_pdg == PDG_He4) || (vec_twotracks.at(itr).track2_pdg == PDG_Li6 && vec_twotracks.at(itr).track1_pdg == PDG_He4)||
250 (vec_twotracks.at(itr).track1_pdg == PDG_Li6 && vec_twotracks.at(itr).track2_pdg == PDG_He3) || (vec_twotracks.at(itr).track2_pdg == PDG_Li6 && vec_twotracks.at(itr).track1_pdg == PDG_He3)||
251 (vec_twotracks.at(itr).track1_pdg == PDG_He4 && vec_twotracks.at(itr).track2_pdg == PDG_He4)
253 ) ifSelectedCases = 1;
255 if(fDebug) cout<<
" pdg1 "<<vec_twotracks.at(itr).track1_pdg <<
" pdg2 "<<vec_twotracks.at(itr).track2_pdg<<
" ifSelectedCases "<<ifSelectedCases<<endl;
256 Double_t CosA = (vec_twotracks.at(itr).track1[0]*vec_twotracks.at(itr).track2[0] + vec_twotracks.at(itr).track1[2]*vec_twotracks.at(itr).track2[2] + 1)/
257 (
sqrt((vec_twotracks.at(itr).track1[0]*vec_twotracks.at(itr).track1[0] + vec_twotracks.at(itr).track1[2]*vec_twotracks.at(itr).track1[2] + 1)*
258 (vec_twotracks.at(itr).track2[0]*vec_twotracks.at(itr).track2[0] + vec_twotracks.at(itr).track2[2]*vec_twotracks.at(itr).track2[2] + 1)));
259 Double_t alpha = TMath::ACos(CosA);
260 Double_t alphaDeg = TMath::RadToDeg()* alpha;
261 if(fDebug) cout<<
" alpha "<<alpha<<
" CosA "<<CosA<<
" ToDeg "<<alphaDeg<<endl;
262 hAngle_reco->Fill(alphaDeg);
263 if (ifNmc2) hAngle_recoifNmc2->Fill(alphaDeg);
264 if (ifNmc2 && ifSelectedCases) hAngle_recoifNmc2Cases->Fill(alphaDeg);
274void BmnUpstreamTracking::ReadSiliconTracks(Double_t** par_ab, Double_t* par_z, Int_t & NTracks, vector<MC_points> & vec){
277 if (fDebug) cout<<
" MC_SiliconTracks:"<<endl;
282 int Np_in_3st[kMaxMC];
283 int mcTracksArray[kMaxMC];
284 double Xmc[kMaxMC][fNstations];
285 double Ymc[kMaxMC][fNstations];
286 double Zmc[kMaxMC][fNstations];
287 for (Int_t Id= 0; Id < kMaxMC; Id++) {
290 mcTracksArray[Id] = -1;
291 for (Int_t
i = 0;
i < fNstations;
i++) {
298 for (Int_t iMC = 0; iMC < fSiTracksSim->GetEntriesFast(); ++iMC) {
301 Double_t x_MC = hit->GetX();
302 Double_t y_MC = hit->GetY();
303 Double_t z_MC = hit->GetZ();
307 if (tr_before != trackId_MC) {
309 mcTracksArray[Nmc_tracks] = trackId_MC;
311 tr_before = trackId_MC;
313 if (z_MC > -320.) {st_mc = 3; Np_in_3st[Nmc_tracks]++; }
314 if (z_MC < -434. && z_MC > -436. ) st_mc = 2;
315 if (z_MC < -438.) st_mc = 1;
316 if (fDebug) cout<<
" Id "<<trackId_MC<<
" x "<<x_MC<<
" y "<<y_MC<<
" z "<<z_MC<<
" st_mc "<<st_mc<<endl;
318 Xmc[Nmc_tracks][st_mc] = x_MC;
319 Ymc[Nmc_tracks][st_mc] = y_MC;
320 Zmc[Nmc_tracks][st_mc] = z_MC;
321 Nst_mc[Nmc_tracks]++;
326 for (Int_t Id= 0; Id < kMaxMC; Id++) {
328 for (Int_t
i = 0;
i < fNstations;
i++) {
329 tmpTr.x_si[
i] = Xmc[Id][
i];
330 tmpTr.y_si[
i] = Ymc[Id][
i];
331 tmpTr.z_si[
i] = Zmc[Id][
i];
334 tmpTr.Id = mcTracksArray[Id];
335 tmpTr.Np_Si = Nst_mc[Id];
336 if (Np_in_3st[Id] == tmpTr.Np_Si ) tmpTr.np_3si = 1;
337 if (fDebug && Np_in_3st[Id] > 0 ) cout<<
" Np_in_3st "<<Np_in_3st[Id] <<
" tmpTr.Np_Si "<<tmpTr.Np_Si<<
" tmpTr.np_3si "<<tmpTr.np_3si<<endl;
338 if (Nst_mc[Id] >= 2 && Np_in_3st[Id] > 0) vec.push_back(tmpTr);
341 if (fDebug) cout<<
" vec_points.size() "<<vec.size()<<endl;
344 if ( fDebug ) cout<<endl;
347 if (fDebug) cout<<
"----Reco_SiliconTracks:"<<endl;
348 for (Int_t iTrack = 0; iTrack < fSiTracks->GetEntriesFast(); iTrack++) {
354 if ( fDebug ) cout<<
" SiTr "<<iTrack<<
" SiTx "<<par->GetTx()<<
" SiX "<<par->GetX()<<
" SiTy "<<par->GetTy()<<
" SiY "<<par->GetY()<<
" SiZ "<<par->GetZ()<<
" Nhits "<<track->
GetNHits()<<endl;
356 par_ab[0][NTracks]= par->GetTx();
357 par_ab[1][NTracks]= par->GetX();
358 par_ab[2][NTracks]= par->GetTy();
359 par_ab[3][NTracks]= par->GetY();
360 par_ab[4][NTracks]= track->
GetNHits();
361 par_z[NTracks] = par->GetZ();
365 if ( fDebug ) cout<<endl;
371void BmnUpstreamTracking::ReadSiliconHits(Double_t*** hits, Int_t* NSihits){
373 if ( fDebug ) cout<<
" Hits from Tracks "<<endl;
374 for (Int_t iSihit = 0; iSihit < fSilHits->GetEntriesFast(); iSihit++) {
380 if ( fDebug ) cout<<
" st "<<st<<
" hit: X "<<hit->GetX()<<
" Y "<<hit->GetY()<<
" Sigx "<<hit->GetDx()<<
" Sigy "<<hit->GetDy()<<endl;
381 hits[st][NSihits[st]][0] = hit->GetX();
382 hits[st][NSihits[st]][1] = hit->GetY();
383 hits[st][NSihits[st]][2] = hit->GetZ();
384 hits[st][NSihits[st]][3] = hit->GetDx();
385 hits[st][NSihits[st]][4] = hit->GetDy();
386 hits[st][NSihits[st]][5] = hit->
GetModule();
394void BmnUpstreamTracking::ReadMWPCSegments(Double_t*** par_ab, Double_t** par_z, Int_t* Nseg, vector<MC_points> & vec){
395 for (Int_t iSeg = 0; iSeg < fMWPCSegments->GetEntries() ; ++iSeg) {
402 if ( Z_mwpc >= -859. && Z_mwpc <= -857.) ich = 0;
403 if ( Z_mwpc >= -760. && Z_mwpc <= -758.) ich = 1;
404 if ( Z_mwpc >= -365. && Z_mwpc <= -363.) ich = 2;
405 if ( Z_mwpc >= -215. && Z_mwpc <= -213.) ich = 3;
407 if ( ich < 0)
continue;
410 par_ab[ich][0][Nseg[ich]]= segment->
GetParamFirst()->GetTx();
412 par_ab[ich][2][Nseg[ich]]= segment->
GetParamFirst()->GetTy();
414 par_ab[ich][4][Nseg[ich]]= segment->
GetNHits();
415 par_ab[ich][5][Nseg[ich]]= segment->
GetParamFirst()->GetCovariance(0, 0);
416 par_ab[ich][6][Nseg[ich]]= segment->
GetParamFirst()->GetCovariance(1, 1);
417 par_ab[ich][7][Nseg[ich]]= segment->
GetParamFirst()->GetCovariance(2, 2);
418 par_ab[ich][8][Nseg[ich]]= segment->
GetParamFirst()->GetCovariance(3, 3);
422 par_ab[ich][1][Nseg[ich]]+= -X_shift - X_shift_seg[ich];
423 par_ab[ich][3][Nseg[ich]]+= -Y_shift;
430 if (fDebug)cout<<
"----MC: MWPCSegments"<<endl;
432 Int_t mcTracksArray[kMaxMC];
433 Int_t mcTracksPdg[kMaxMC];
434 Double_t X2mc[kMaxMC][kNPlanes];
437 Double_t X3mc[kMaxMC][kNPlanes];
440 int Npl_MC2[kMaxMC];
int Npl_MC3[kMaxMC];
442 for (Int_t Id= 0; Id < kMaxMC; Id++) {
445 mcTracksArray[Id] = -1;
446 mcTracksPdg[Id] = -1;
447 for (Int_t
i = 0;
i < kNPlanes;
i++) {
461 for (Int_t iMC = 0; iMC < fBmnHitsArray->GetEntriesFast(); ++iMC) {
473 if (tr_before != trackId_MC) {
475 mcTracksArray[Nmc_tracks] = hit->
GetHitId();
476 mcTracksPdg[Nmc_tracks] = hit->
GetPdgId();
478 tr_before = trackId_MC;
481 X2mc[Nmc_tracks][pl_MC] = hit->GetX();
484 Npl_MC2[Nmc_tracks]++;
487 X3mc[Nmc_tracks][pl_MC] = hit->GetX();
490 Npl_MC3[Nmc_tracks]++;
499 if (fDebug)cout<<
" Nmc_tracks "<<Nmc_tracks<<
" MC vec_points.size() "<<vec.size()<<endl;
502 for (Int_t
id = 0;
id < Nmc_tracks;
id++) {
503 if (fDebug)cout<<
" id "<<
id<<
" Id_mc "<< mcTracksArray[
id]<<
" pdg "<<mcTracksPdg[
id]<<
" Npl2 "<<Npl_MC2[
id]<<
" Npl3 "<<Npl_MC3[
id]<<endl;
505 for (
size_t itr = 0; itr < vec.size(); itr++) {
507 if (Npl_MC2[
id] >= 4 || Npl_MC3[
id] >= 4){
508 if (vec.at(itr).Id == mcTracksArray[
id]) {
509 vec.at(itr).Pdg = mcTracksPdg[
id];
510 vec.at(itr).Np_ch2 = Npl_MC2[
id];
511 vec.at(itr).Np_ch3 = Npl_MC3[
id];
512 vec.at(itr).Np_P = Npl_MC2[
id] + Npl_MC3[
id];
513 vec.at(itr).Np = vec.at(itr).Np_P + vec.at(itr).Np_Si;
516 if (X3mc[
id][5] > -900.) i3 =5;
517 if (i3 < 0 && X3mc[
id][4] > -900.) i3 =4;
518 if (i3 < 0 && X3mc[
id][3] > -900.) i3 =3;
521 if (isi < 0 && vec.at(itr).x_si[1] > -900.) isi = 1;
522 if (isi < 0 && vec.at(itr).x_si[2] > -900.) isi = 2;
525 vec.at(itr).param[0] = (vec.at(itr).x_si[isi] - vec.at(itr).x_si[3])/(vec.at(itr).z_si[isi] - vec.at(itr).z_si[3]);
526 vec.at(itr).param[1] = vec.at(itr).param[0]*(-350 - vec.at(itr).z_si[3]) + vec.at(itr).x_si[3];
527 vec.at(itr).param[2] = (vec.at(itr).y_si[isi] - vec.at(itr).y_si[3])/(vec.at(itr).z_si[isi] - vec.at(itr).z_si[3]);
528 vec.at(itr).param[3] = vec.at(itr).param[2]*(-350 - vec.at(itr).z_si[3]) + vec.at(itr).y_si[3];
530 if (fDebug)cout<<
" si mc: x3 "<<vec.at(itr).x_si[3]<<
" z3 "<<vec.at(itr).z_si[3]<<
" UpX "<<vec.at(itr).param[1]<<endl;
532 if (X2mc[
id][0] > -900. || X2mc[
id][3] > -900.) vec.at(itr).xWas2 = 1;
533 if (X2mc[
id][1] > -900. || X2mc[
id][4] > -900.) vec.at(itr).vWas2 = 1;
534 if (X2mc[
id][2] > -900. || X2mc[
id][5] > -900.) vec.at(itr).uWas2 = 1;
536 if (X3mc[
id][0] > -900. || X3mc[
id][3] > -900.) vec.at(itr).xWas3 = 1;
537 if (X3mc[
id][1] > -900. || X3mc[
id][4] > -900.) vec.at(itr).vWas3 = 1;
538 if (X3mc[
id][2] > -900. || X3mc[
id][5] > -900.) vec.at(itr).uWas3 = 1;
549 cout<<
"----MCtrue all systems, size: "<<vec.size()<<endl;
550 for (
size_t itr = 0; itr < vec.size(); itr++) {
551 cout<<
" itr "<<itr<<
" Id "<<vec.at(itr).Id<<
" Np_Si "<<vec.at(itr).Np_Si<<
" Np_P "<<vec.at(itr).Np_P<<
" Np_ch2 "<<vec.at(itr).Np_ch2<<
" Np_ch3 "<<vec.at(itr).Np_ch3<<endl;
552 cout<<
" itr "<<itr<<
" Id "<<vec.at(itr).Id<<
" Up: ax "<<vec.at(itr).param[0]<<
" bx "<<vec.at(itr).param[1]<<
553 " ay "<<vec.at(itr).param[2]<<
" by "<<vec.at(itr).param[3]<<endl;
555 cout<<
" Xt "<<vec.at(itr).param[0]*( kZ_target - Zcentr ) + vec.at(itr).param[1]<<
556 " Yt "<<vec.at(itr).param[2]*( kZ_target - Zcentr ) + vec.at(itr).param[3]<<endl;
558 hAx_upmc->Fill(vec.at(itr).param[0]);
559 hX_upmc ->Fill(vec.at(itr).param[1]);
560 hAy_upmc->Fill(vec.at(itr).param[2]);
561 hY_upmc ->Fill(vec.at(itr).param[3]);
566 if (fDebug)cout<<endl;
570void BmnUpstreamTracking::ReadMWPCTracks(Double_t*** par_ab, Double_t** par_z, Int_t* NTracks){
571 for (Int_t iTr = 0; iTr < fMWPCTracks->GetEntriesFast() ; ++iTr) {
577 if ( Z >= -809. && Z <= -807.) ip = 0;
578 if ( Z >= -290. && Z <= -288.) ip = 1;
579 if ( ip < 0)
continue;
583 par_ab[ip][0][NTracks[ip]] = track->
GetParamFirst()->GetTx() ;
584 par_ab[ip][1][NTracks[ip]] = track->
GetParamFirst()->GetX() ;
585 par_ab[ip][2][NTracks[ip]] = track->
GetParamFirst()->GetTy() ;
586 par_ab[ip][3][NTracks[ip]] = track->
GetParamFirst()->GetY() ;
587 par_ab[ip][4][NTracks[ip]] = track->
GetNHits();
588 par_ab[ip][5][NTracks[ip]] = track->
GetParamFirst()->GetCovariance(0, 0);
589 par_ab[ip][6][NTracks[ip]] = track->
GetParamFirst()->GetCovariance(1, 1);
590 par_ab[ip][7][NTracks[ip]] = track->
GetParamFirst()->GetCovariance(2, 2);
591 par_ab[ip][8][NTracks[ip]] = track->
GetParamFirst()->GetCovariance(3, 3);
594 par_ab[1][1][NTracks[ip]]+= -X_shift;
595 par_ab[1][3][NTracks[ip]]+= -Y_shift;
612void BmnUpstreamTracking::PCTracksSiTracksMatching(Double_t** par_Si, Double_t* par_Siz, Int_t & NTracksSi,
613Double_t*** par_PC, Double_t** par_PCz, Int_t* NTracksPC, vector<Smatch> & vec_m, vector<Smatch> & Out){
618 if (fDebug) cout<<
" NTracksSi "<<NTracksSi<<
" NPCTracks[1] "<<NPCTracks[1]<<endl;
620 for (Int_t iSi=0; iSi < NTracksSi; ++iSi){
621 for (Int_t iPCtr = 0; iPCtr < NPCTracks[1]; ++iPCtr){
623 Double_t dz = par_PCz[1][iPCtr] - par_Siz[iSi];
625 Double_t dAx = par_Si[0][iSi] - par_PC[1][0][iPCtr] ;
626 Double_t dAy = par_Si[2][iSi] - par_PC[1][2][iPCtr] ;
627 Double_t dX = (par_Si[0][iSi]* dz + par_Si[1][iSi]) - par_PC[1][1][iPCtr];
628 Double_t dY = (par_Si[2][iSi]* dz + par_Si[3][iSi]) - par_PC[1][3][iPCtr];
635 if (fDebug) cout<<
" Si("<<iSi<<
")-P1("<<iPCtr<<
"): dAx("<<cutAx<<
") "<<dAx<<
" dAy("<<cutAy<<
") "<<dAy<<
" dX("<<cutX<<
") "<<dX<<
" dY("<<cutY<<
") "<<dY<<endl;
636 if (
fabs(dAx) < cutAx &&
fabs(dAy) < cutAy &&
fabs(dX) < cutX &&
fabs(dY) < cutY ){
637 if (fDebug) cout<<
"after cuts: Si "<<iSi<<
"- P1 "<<iPCtr<<endl;
638 Double_t Chi2_match = dX*dX + 0.25*dY*dY;
644 tmpSeg.
Nhits1 = par_Si[4][iSi];
645 tmpSeg.
Nhits2 = par_PC[1][4][iPCtr];
646 tmpSeg.
Z1 = par_Siz[iSi];
647 tmpSeg.
Z2 = par_PCz[1][iPCtr];
650 tmpSeg.
Chi2m = Chi2_match;
653 for(
int ipar = 0; ipar < 4; ipar++){
654 tmpSeg.
param1[ipar] = par_Si[ipar][iSi];
655 tmpSeg.
param2[ipar] = par_PC[1][ipar][iPCtr];
657 vec_m.push_back(tmpSeg);
668 if (fDebug) cout<<
" --End PCtracks: size "<<vtmpSeg.size()<<endl;
670 if (vtmpSeg.size() > 0){
672 RecordingBest(PCtrack, vec_m, Out);
675 if (fDebug) cout<<
"PCTracksSiTracksMatching: OutVector.size() "<<Out.size()<<endl;
676 for (
size_t iter = 0; iter < Out.size(); ++iter) {
677 if (fDebug) printf(
" OutVector.at(%zu): %8.4f | Si %d - PC %d Seg2 %d - Seg3 %d\n", iter, Out.at(iter).Chi2m, Out.at(iter).Ind1, Out.at(iter).Ind2, Out.at(iter).Inds2, Out.at(iter).Inds3 );
683void BmnUpstreamTracking::PCSegmentsSiTracksMatching(Double_t** par_Si, Double_t* par_Siz, Int_t & NTracksSi,
684Double_t*** par_PC, Double_t** par_PCz, Int_t* NSegPC, vector<Smatch> & vec_m, vector<Smatch> & Out){
687 if ( fDebug ) cout<<endl;
688 if ( fDebug ) cout<<
" ----Matching: PC segments Ch2 ---"<<endl;
689 if ( fDebug ) cout<<
" NTracksSi "<<NTracksSi<<
" NSegPC[2] "<<NSegPC[2]<<endl;
690 for (
int iSi=0; iSi < NTracksSi; ++iSi){
691 for(
int iseg2 = 0; iseg2 < NSegPC[2]; ++iseg2){
693 Double_t dz2 = par_PCz[2][iseg2] - par_Siz[iSi];
695 Double_t X_extr2 = par_Si[0][iSi]* dz2 + par_Si[1][iSi];
696 Double_t Y_extr2 = par_Si[2][iSi]* dz2 + par_Si[3][iSi];
698 Double_t dX = X_extr2 - par_PC[2][1][iseg2];
699 Double_t dY = Y_extr2 - par_PC[2][3][iseg2];
704 if (fDebug) cout<<
" Si["<<iSi<<
"]-Seg2["<<iseg2<<
"] : dX("<<cutX<<
") "<<dX<<
" dY("<<cutY<<
") "<<dY<<endl;
705 if (
fabs(dX) < cutX &&
fabs(dY) < cutY ){
708 if (fDebug) cout<<
" cuts ok:iseg2 "<<iseg2<<endl;
709 RecordCandidateSeg(iSi, iseg2, iseg3, par_Si, par_PC, par_Siz, par_PCz, dX, dY, vec_m);
715 if (fDebug) cout<<
" --End PCiseg2 : now vec_m.size "<<vec_m.size()<<endl;
716 if (fDebug) cout<<endl;
718 if ( fDebug ) cout<<endl;
719 if ( fDebug ) cout<<
" ----Matching: PC segments Ch3 ---"<<endl;
720 if ( fDebug ) cout<<
" NTracksSi "<<NTracksSi<<
" NSegPC[3] "<<NSegPC[3]<<endl;
721 for (
int iSi=0; iSi < NSiTracks; ++iSi){
722 for(
int iseg3 = 0; iseg3 < NSegPC[3]; ++iseg3){
724 Double_t dz3 = par_PCz[3][iseg3] - par_Siz[iSi];
725 Double_t X_extr3 = par_Si[0][iSi]* dz3 + par_Si[1][iSi];
726 Double_t Y_extr3 = par_Si[2][iSi]* dz3 + par_Si[3][iSi];
728 Double_t dX = X_extr3 - par_PC[3][1][iseg3];
729 Double_t dY = Y_extr3 - par_PC[3][3][iseg3];
733 if (fDebug) cout<<
" Si["<<iSi<<
"]-Seg3["<<iseg3<<
"] : dX("<<cutX<<
") "<<dX<<
" dY("<<cutY<<
") "<<dY<<endl;
734 if (
fabs(dX) < cutX &&
fabs(dY) < cutY ){
737 RecordCandidateSeg(iSi, iseg2, iseg3, par_Si, par_PC, par_Siz, par_PCz, dX, dY, vec_m);
743 if (fDebug) cout<<
" --End PCiseg3 : now vec_m.size "<<vec_m.size()<<endl;
745 if (vec_m.size() > 0){
747 RecordingBest(PCtrack, vec_m, Out);
749 if (fDebug) cout<<
" vec_m.size() "<<vec_m.size()<<
" Out.size() "<<Out.size()<<endl;
750 if (fDebug) cout<<endl;
755void BmnUpstreamTracking::RecordCandidateSeg(Int_t & iSi, Int_t & is2, Int_t & is3,
756Double_t ** par_Si, Double_t*** par_PC,
757Double_t* par_Siz, Double_t** ZPC,
758Double_t & dx, Double_t & dy, vector<Smatch>& vtmp){
760 if ( fDebug ) cout<<
" RecordCandidateSeg: Inds: seg2 "<<is2<<
" seg3 "<<is3<<endl;
769 Double_t Chi2_match = dx*dx + 0.25*dy*dy;
775 tmpSeg.
Z1 = par_Siz[iSi];
776 tmpSeg.
Zs2 = ZPC[ich][iseg];
779 tmpSeg.
Chi2m = Chi2_match;
780 if ( fDebug ) cout<<
" iSi "<<iSi<<
" iseg2 "<<is2<<
" iseg3 "<<is3<<
" dX "<<dx<<
" dY "<<dy<<
" Chi2_match "<<Chi2_match<<endl;
782 for(
int ipar = 0; ipar < 4; ipar++) {
783 tmpSeg.
param1[ipar] = par_Si[ipar][iSi];
784 tmpSeg.
params2[ipar] = par_PC[ich][ipar][iseg];
786 vtmp.push_back(tmpSeg);
792void BmnUpstreamTracking::RecordingBest(Int_t & iPCtrack, vector<Smatch> & vec, vector<Smatch> & OutVec){
793 if ( iPCtrack > -1 ){
794 if (fDebug) cout<<endl;
795 if (fDebug) cout<<
"--RecordingBest: tracks --"<<endl;
800 OutVec.push_back(vec.at(0));
801 if (fDebug) cout<<
"--isMatch: Chi2 "<<vec.at(0).Chi2m<<endl;
805 for (
size_t iter = 0; iter < vec.size(); ++iter) {
806 if (fDebug) printf(
" vtmpSeg.at(%zu): %8.4f | %d - %d\n", iter, vec.at(iter).Chi2m, vec.at(iter).Ind1, vec.at(iter).Ind2 );
808 for (
size_t InIter = 0; InIter < OutVec.size(); ++InIter) {
809 if(vec.at(iter).Ind1 == OutVec.at(InIter).Ind1 || vec.at(iter).Ind2 == OutVec.at(InIter).Ind2) {
816 if (fDebug) cout<<
"--isMatch: Chi2 "<<vec.at(iter).Chi2m<<endl;
817 OutVec.push_back(vec.at(iter));
821 if (fDebug) cout<<
" Now OutVec.size "<<OutVec.size()<<endl;
824 if (fDebug) cout<<
"--RecordingBest: segs --"<<endl;
830 for (
size_t iter = 0; iter < vec.size(); ++iter) {
831 if (fDebug) printf(
" vec.at(%zu): %8.4f | Si %d - Seg2 %d - Seg3 %d\n", iter, vec.at(iter).Chi2m, vec.at(iter).Ind1, vec.at(iter).Inds2, vec.at(iter).Inds3 );
833 for (
size_t InIter = 0; InIter < OutVec.size(); ++InIter) {
834 if ( vec.at(iter).Ind1 == OutVec.at(InIter).Ind1 && OutVec.at(InIter).Ind2 > -1 ) {
838 if((vec.at(iter).Ind1 == OutVec.at(InIter).Ind1 && OutVec.at(InIter).Inds3 > -1) || (vec.at(iter).Ind1 == OutVec.at(InIter).Ind1 && vec.at(iter).Inds2 == OutVec.at(InIter).Inds2) ){
842 if((vec.at(iter).Ind1 == OutVec.at(InIter).Ind1 && OutVec.at(InIter).Inds2 > -1) || (vec.at(iter).Ind1 == OutVec.at(InIter).Ind1 && vec.at(iter).Inds3 == OutVec.at(InIter).Inds3) ){
846 if( (OutVec.at(InIter).Inds2 > -1 && vec.at(iter).Inds2 == OutVec.at(InIter).Inds2 ) || ( OutVec.at(InIter).Inds3 > -1 && vec.at(iter).Inds3 == OutVec.at(InIter).Inds3) ){
851 if (fDebug) cout<<
" writing unique index "<<endl;
853 if (fDebug) cout<<
"--isMatch: Chi2 "<<vec.at(iter).Chi2m<<
" Inds2 "<<vec.at(iter).Inds2<<
" Inds3 "<<vec.at(iter).Inds3<<endl;
854 OutVec.push_back(vec.at(iter));
858 if (fDebug) cout<<
" RecordingBest: Now OutVec.size "<<OutVec.size()<<endl;
859 for (
size_t iter = 0; iter < OutVec.size(); ++iter) {
860 if (fDebug) cout<<
" iter "<<iter<<
" index: Si:"<<OutVec.at(iter).Ind1<<
" PCtr: "<< OutVec.at(iter).Ind2<<
" PCseg2: "<<OutVec.at(iter).Inds2<<
" PCseg3: "<<OutVec.at(iter).Inds3<<endl;
871void BmnUpstreamTracking::GetAddSiHits(vector<Smatch> & Out, Double_t*** hits, Int_t* Nh){
873Double_t tmp_array[kNumStSi][6];
874if (fDebug) cout<<
"--GetAddSiHits--"<<endl;
876 for (
size_t iter = 0; iter < Out.size(); ++iter) {
877 if (fDebug) printf(
" Out.at(%zu): %8.4f | Si %d - PC %d Seg2 %d - Seg3 %d\n", iter, Out.at(iter).Chi2m, Out.at(iter).Ind1, Out.at(iter).Ind2, Out.at(iter).Inds2, Out.at(iter).Inds3 );
880 for (
int st=1; st < kNumStSi; ++st){
881 for (
int i=0;
i < 5; ++
i){
882 tmp_array[st][
i] = -999.;
884 for (
int ihit=0; ihit < Nh[st]; ++ihit){
885 if ( Out.at(iter).Ind1 == ihit ){
887 tmp_array[st][0] = hits[st][ihit][0];
888 tmp_array[st][1] = hits[st][ihit][1];
889 tmp_array[st][2] = hits[st][ihit][2];
890 tmp_array[st][3] = hits[st][ihit][3];
891 tmp_array[st][4] = hits[st][ihit][4];
892 tmp_array[st][5] = hits[st][ihit][5];
897 for(
int st = 1; st < kNumStSi; ++st){
898 Out.at(iter).SiCoordX[st] = tmp_array[st][0];
899 Out.at(iter).SiCoordY[st] = tmp_array[st][1];
900 Out.at(iter).SiCoordZ[st] = tmp_array[st][2];
901 Out.at(iter).SiSigmaX[st] = tmp_array[st][3];
902 Out.at(iter).SiSigmaY[st] = tmp_array[st][4];
903 Out.at(iter).SiMod[st] = tmp_array[st][5];
904 if (fDebug) cout<<
" st "<<st<<
" X "<<tmp_array[st][0]<<
" Y "<<tmp_array[st][1]<<
" Z "<<tmp_array[st][2]<<
" mod "<<tmp_array[st][5]<<endl;
914void BmnUpstreamTracking::GetHitsToPoints(vector<Smatch> & Out,Double_t*** ab_tr, Int_t* NPCTracks_, Double_t*** ab_Ch,
915Int_t* Nseg_ch_, Double_t*** Points_, Int_t & NumPoints_){
916 if (fDebug) cout<<
" ---GetHitsToPoints---"<<endl;
917 for (
size_t iter = 0; iter < Out.size(); iter++) {
918 if ( fDebug ) cout<<
" silicon points "<<endl;
919 for (
int ist=1; ist < kNumStSi; ++ist){
921 Points_[iter][ist-1][0] = Out.at(iter).SiCoordX[ist];
922 Points_[iter][ist-1][1] = Out.at(iter).SiCoordY[ist];
923 Points_[iter][ist-1][2] = Out.at(iter).SiCoordZ[ist];
924 Points_[iter][ist-1][3] = Out.at(iter).SiSigmaX[ist];
925 Points_[iter][ist-1][4] = Out.at(iter).SiSigmaY[ist];
926 if ( fDebug ) cout<<
" X["<<ist<<
"] "<<Points_[iter][ist-1][0] <<
" Y["<<ist<<
"] "<<Points_[ist-1][ist][1] <<endl;
928 Points_[iter][ist][0] = Out.at(iter).SiCoordX[ist];
929 Points_[iter][ist][1] = Out.at(iter).SiCoordY[ist];
930 Points_[iter][ist][2] = Out.at(iter).SiCoordZ[ist];
931 Points_[iter][ist][3] = Out.at(iter).SiSigmaX[ist];
932 Points_[iter][ist][4] = Out.at(iter).SiSigmaY[ist];
933 if ( fDebug ) cout<<
" X["<<ist<<
"] "<<Points_[iter][ist][0] <<
" Y["<<ist<<
"] "<<Points_[iter][ist][1] <<endl;
936 for (
int ipctr=0; ipctr < NPCTracks_[1]; ++ipctr){
938 if ( Out.at(iter).Ind2 == ipctr){
940 Double_t deltaAx = ab_tr[1][7][ipctr];
941 Double_t deltaAy = ab_tr[1][8][ipctr];
943 Points_[iter][2][0] = Out.at(iter).param2[0]*(Z_Chamber[2]-Z_pair[1]) + Out.at(iter).param2[1];
944 Points_[iter][4][0] = Out.at(iter).param2[0]*(Z_Chamber[3]-Z_pair[1]) + Out.at(iter).param2[1];
946 Points_[iter][2][1] = Out.at(iter).param2[2]*(Z_Chamber[2]-Z_pair[1]) + Out.at(iter).param2[3];
947 Points_[iter][4][1] = Out.at(iter).param2[2]*(Z_Chamber[3]-Z_pair[1]) + Out.at(iter).param2[3];
949 Points_[iter][2][3] = Out.at(iter).param2[0]*SigmXmwpc + Out.at(iter).param2[1]*deltaAx + SigmXmwpc;
950 Points_[iter][2][4] = Out.at(iter).param2[2]*SigmYmwpc + Out.at(iter).param2[3]*deltaAy + SigmYmwpc;
951 Points_[iter][4][3] = SigmXmwpc;
952 Points_[iter][4][4] = SigmYmwpc;
954 cout<<
" MWPCs from track"<<endl;
955 cout<<
" X3 "<<Points_[iter][2][0] <<
" X4 "<<Points_[iter][4][0] <<endl;
956 cout<<
" Y3 "<<Points_[iter][2][1] <<
" X4 "<<Points_[iter][4][1] <<endl;
962 for (
int iseg2=0; iseg2 < Nseg_ch_[2]; ++iseg2){
963 if ( Out.at(iter).Inds2 == iseg2){
964 Points_[iter][2][0] = ab_Ch[2][1][iseg2];
965 Points_[iter][2][1] = ab_Ch[2][3][iseg2];
966 Points_[iter][2][3] = SigmXmwpc;
967 Points_[iter][2][4] = SigmYmwpc;
969 cout<<
" MWPCs from segment"<<endl;
970 cout<<
" X3 "<<Points_[iter][2][0] <<
" Y3 "<<Points_[iter][2][1]<<endl;
975 for (
int iseg3=0; iseg3 < Nseg_ch_[3]; ++iseg3){
976 if ( Out.at(iter).Inds3 == iseg3){
977 Points_[iter][4][0] = ab_Ch[3][1][iseg3];
978 Points_[iter][4][1] = ab_Ch[3][3][iseg3];
979 Points_[iter][4][3] = SigmXmwpc;
980 Points_[iter][4][4] = SigmYmwpc;
982 cout<<
" MWPCs from segment"<<endl;
983 cout<<
" X4 "<<Points_[iter][4][0] <<
" Y4 "<<Points_[iter][4][1]<<endl;
989 Points_[iter][2][2] = Z_Chamber[2];
990 Points_[iter][4][2] = Z_Chamber[3];
999void BmnUpstreamTracking::CalculationOfChi2(Double_t*** Points_, Int_t & NumPoints_, vector<UpTracks> & vec ){
1000 if (fDebug) cout<<
" Check points before fit "<<
" Zcentr "<<Zcentr<<endl;
1002 for (
int ip =0; ip < NumPoints_; ++ip){
1004 for (
int ist =0; ist < kPoints; ++ist){
1005 Points_[ip][ist][0] += X_shiftUp[ist];
1006 Points_[ip][ist][1] += Y_shiftUp[ist];
1007 Points_[ip][ist][2] -= Zcentr;
1009 if (Points_[ip][ist][0] > -900.) Nhits_before++;
1010 if (Points_[ip][ist][1] > -900.) Nhits_before++;
1013 if (fDebug) cout<<
" Nhits_before "<<Nhits_before<<endl;
1016 for (Int_t
i = 0;
i < kPoints; ++
i) {
1017 for (Int_t j = 0; j < 5; ++j) {
1018 Xforglfit[
i][j] = -999.;
1021 Double_t ChiSquare_ ;
1022 for (Int_t itr = 0; itr < NumPoints_; ++itr) {
1024 if (Nhits_before < 6 )
continue;
1027 if(fDebug) cout<<endl;
1028 if(fDebug) cout<<
"--GlobalFit--"<<endl;
1031 for (Int_t
i = 0;
i < 4; ++
i){
1032 for (Int_t j = 0; j < 4; ++j){
1033 Amatr[
i][j] = 0.; }}
1034 for (Int_t
i = 0;
i < 4; ++
i) { rhs[
i] = 0; }
1035 for (Int_t
i = 0;
i < 16; ++
i) { AmatrArray[
i] = 0; }
1036 for (Int_t
i = 0;
i < 16; ++
i) { AmatrInverted[
i] = 0; }
1038 for (Int_t
i = 0;
i < kPoints; ++
i) {
1039 for (Int_t j = 0; j < kPoin_Par; ++j) {
1040 Xforglfit[
i][j] = Points_[itr][
i][j];
1043 for (Int_t j = 0; j < kPoin_Par; ++j) {
1048 GlobalFit(Xforglfit,Amatr, rhs);
1052 for (Int_t row = 0; row < 4; ++row) {
1053 for (Int_t col = 0; col < 4; ++col) {
1054 AmatrArray[4*col + row] = Amatr[row][col];
1058 bool ifSuccess = InvertMatrix(AmatrArray, AmatrInverted);
1060 if (!ifSuccess) {cout<<
"???? InvertMatrix is unsuccessfull ????"<<endl; }
1061 if (!ifSuccess) {cout<<
"???? InvertMatrix is unsuccessfull ????"<<endl;
return;}
1063 Double_t line_[4] = {0.,0.,0.,0.};
1064 for (Int_t coeff = 0; coeff < 4; ++coeff) {
1065 for (Int_t iCol = 0; iCol < 4; ++iCol) {
1067 line_[coeff] += AmatrInverted[4*iCol + coeff]*rhs[iCol];
1071 if ( fDebug ) cout<<
" ax "<<line_[0]<<
" bx "<<line_[1]<<
" ay "<<line_[2]<<
" by "<<line_[3]<<endl;
1072 if ( fDebug ) cout<<endl;
1076 for (Int_t ist = 0; ist < kPoints; ++ist) {
1077 if (Xforglfit[ist][0] < -900. )
continue;
1079 Double_t hit = Xforglfit[ist][0] ;
1080 Double_t fit = line_[0]*Xforglfit[ist][2] + line_[1];
1083 Double_t sigmaX_2 = Xforglfit[ist][3]*Xforglfit[ist][3];
1084 ChiSquare_ += ((hit-fit)*(hit-fit))/(sigmaX_2);
1088 if ( fDebug ) cout<<
" ist "<<ist<<
" hitx "<<hit<<
" fit "<<fit<<
" dx "<<hit-fit<<
" Z "<<Xforglfit[ist][2]<<
" sigma "<<Xforglfit[ist][3]<<
" ChiSquare_ "<<ChiSquare_<<endl;
1091 for (Int_t ist = 0; ist < kPoints; ++ist) {
1092 if (Xforglfit[ist][1] < -900. )
continue;
1094 Double_t hit = Xforglfit[ist][1];
1095 Double_t fit = line_[2]*Xforglfit[ist][2] + line_[3];
1098 Double_t sigmaY_2 = Xforglfit[ist][4]*Xforglfit[ist][4];
1099 ChiSquare_ += ((hit-fit)*(hit-fit))/(sigmaY_2);
1102 if ( fDebug) cout<<
" ist "<<ist<<
" hity "<<hit<<
" fit "<<fit<<
" dy "<<hit-fit<<
" Z "<<Xforglfit[ist][2]<<
" sigma "<<Xforglfit[ist][4]<<
" ChiSquare_ "<<ChiSquare_<<endl;
1105 Double_t ChiSquareNdf = ChiSquare_/(nhits - 4);
1107 if (ChiSquareNdf < kChi2_Max && nhits > 5){
1109 tmptr.
Chi2 = ChiSquareNdf;
1111 if ( fDebug) cout<<
" Chi2 "<<tmptr.
Chi2<<
" nhits "<<nhits<<endl;
1112 if ( fDebug) cout<<
" ------"<<endl;
1114 for (Int_t iCol = 0; iCol < 4; ++iCol) {
1115 tmptr.
param[iCol] = line_[iCol];
1119 for (Int_t ist = 0; ist < kPoints; ++ist) {
1120 tmptr.
CoordZ[ist] = Xforglfit[ist][2];
1121 tmptr.
CoordX[ist] = Xforglfit[ist][0];
1122 if (tmptr.
CoordX[ist]< -900. )
continue;
1126 for (Int_t ist = 0; ist < kPoints; ++ist) {
1127 tmptr.
CoordY[ist] = Xforglfit[ist][1];
1128 if (tmptr.
CoordY[ist]< -900. )
continue;
1131 tmptr.
Nhits = nhits;
1132 vec.push_back(tmptr);
1141void BmnUpstreamTracking::PrintAllTracks(vector<UpTracks> & vecUp){
1143 cout<<
" ------PrintAllTracks: "<<vecUp.size()<<endl;
1144 for (
size_t itr =0; itr < vecUp.size(); ++itr){
1146 cout<<
" itr "<<itr<<
" Chi2 "<<vecUp.at(itr).Chi2<<
" Ax "<<vecUp.at(itr).param[0]<<
" bx "<<vecUp.at(itr).param[1]<<
" Ay "<<vecUp.at(itr).param[2]<<
" by "<<vecUp.at(itr).param[3]<<
" Nhits "<<vecUp.at(itr).Nhits<<endl;
1148 cout<<
"--X--"<<endl;
1149 for (Int_t st = 0; st < kPoints; ++st) {
1150 if ( vecUp.at(itr).CoordX[st] < -900.)
continue;
1151 Double_t
Hit = vecUp.at(itr).CoordX[st];
1152 Double_t Fit = vecUp.at(itr).param[0] * vecUp.at(itr).CoordZ[st] + vecUp.at(itr).param[1];
1153 hResXst[st]->Fill(Hit - Fit);
1154 cout<<
" st "<<st<<
" Xhit "<<
Hit<<
" Xfit "<< Fit<<
" Z "<<vecUp.at(itr).CoordZ[st]<<endl;
1156 cout<<
"--Y--"<<endl;
1157 for (Int_t st = 0; st < kPoints; ++st) {
1158 if ( vecUp.at(itr).CoordY[st] < -900.)
continue;
1159 Double_t
Hit = vecUp.at(itr).CoordY[st];
1160 Double_t Fit = vecUp.at(itr).param[2] * vecUp.at(itr).CoordZ[st] + vecUp.at(itr).param[3];
1161 hResYst[st]->Fill(Hit - Fit);
1162 cout<<
" st "<<st<<
" Yhit "<<
Hit<<
" Yfit "<< Fit<<
" Z "<<vecUp.at(itr).CoordZ[st]<<endl;
1164 Double_t x_target = vecUp.at(itr).param[0]*( kZ_target - Zcentr ) + vecUp.at(itr).param[1];
1165 Double_t y_target = vecUp.at(itr).param[2]*( kZ_target - Zcentr ) + vecUp.at(itr).param[3];
1167 hAx_fitUp->Fill(vecUp.at(itr).param[0]);
1168 hAy_fitUp->Fill(vecUp.at(itr).param[2]);
1169 hx_fitUp->Fill(vecUp.at(itr).param[1]);
1170 hy_fitUp->Fill(vecUp.at(itr).param[3]);
1171 hvertexXYUp->Fill(x_target,y_target);
1172 hy_vs_x_Up->Fill(vecUp.at(itr).param[1],vecUp.at(itr).param[3]);
1173 hchi2_fitUp->Fill(vecUp.at(itr).Chi2);
1174 hNhitsUp->Fill(vecUp.at(itr).Nhits);
1175 hTyTx_Up->Fill(vecUp.at(itr).param[0],vecUp.at(itr).param[2]);
1183void BmnUpstreamTracking::TrackRecording(vector<UpTracks> & vecUp)
1185 for (
size_t InIter = 0; InIter < vecUp.size(); ++InIter) {
1205 FairTrackParam trackParaml;
1206 trackParaml.SetPosition(TVector3(vecUp.at(InIter).param[1]+ Shift_toCenterOfMagnetX, vecUp.at(InIter).param[3]+ Shift_toCenterOfMagnetY,Zcentr));
1207 trackParaml.SetTx(vecUp.at(InIter).param[0]+Shift_toCenterOfMagnetAX);
1208 trackParaml.SetTy(vecUp.at(InIter).param[2]+Shift_toCenterOfMagnetAY);
1210 BmnTrack *track =
new ((*fBmnUpstreamTracksArray)[fBmnUpstreamTracksArray->GetEntriesFast()])
BmnTrack();
1211 track->
SetChi2(vecUp.at(InIter).Chi2);
1212 track->
SetNHits(vecUp.at(InIter).Nhits);
1223bool BmnUpstreamTracking::InvertMatrix(Double_t *
m, Double_t *invOut) {
1224 Double_t inv[16], det;
1227 inv[0] =
m[5] *
m[10] *
m[15] -
m[5] *
m[11] *
m[14] -
m[9] *
m[6] *
m[15] +
m[9] *
m[7] *
m[14] +
m[13] *
m[6] *
m[11] -
m[13] *
m[7] *
m[10];
1228 inv[4] = -
m[4] *
m[10] *
m[15] +
m[4] *
m[11] *
m[14] +
m[8] *
m[6] *
m[15] -
m[8] *
m[7] *
m[14] -
m[12] *
m[6] *
m[11] +
m[12] *
m[7] *
m[10];
1229 inv[8] =
m[4] *
m[9] *
m[15] -
m[4] *
m[11] *
m[13] -
m[8] *
m[5] *
m[15] +
m[8] *
m[7] *
m[13] +
m[12] *
m[5] *
m[11] -
m[12] *
m[7] *
m[9];
1230 inv[12] = -
m[4] *
m[9] *
m[14] +
m[4] *
m[10] *
m[13] +
m[8] *
m[5] *
m[14] -
m[8] *
m[6] *
m[13] -
m[12] *
m[5] *
m[10] +
m[12] *
m[6] *
m[9];
1231 inv[1] = -
m[1] *
m[10] *
m[15] +
m[1] *
m[11] *
m[14] +
m[9] *
m[2] *
m[15] -
m[9] *
m[3] *
m[14] -
m[13] *
m[2] *
m[11] +
m[13] *
m[3] *
m[10];
1232 inv[5] =
m[0] *
m[10] *
m[15] -
m[0] *
m[11] *
m[14] -
m[8] *
m[2] *
m[15] +
m[8] *
m[3] *
m[14] +
m[12] *
m[2] *
m[11] -
m[12] *
m[3] *
m[10];
1233 inv[9] = -
m[0] *
m[9] *
m[15] +
m[0] *
m[11] *
m[13] +
m[8] *
m[1] *
m[15] -
m[8] *
m[3] *
m[13] -
m[12] *
m[1] *
m[11] +
m[12] *
m[3] *
m[9];
1234 inv[13] =
m[0] *
m[9] *
m[14] -
m[0] *
m[10] *
m[13] -
m[8] *
m[1] *
m[14] +
m[8] *
m[2] *
m[13] +
m[12] *
m[1] *
m[10] -
m[12] *
m[2] *
m[9];
1235 inv[2] =
m[1] *
m[6] *
m[15] -
m[1] *
m[7] *
m[14] -
m[5] *
m[2] *
m[15] +
m[5] *
m[3] *
m[14] +
m[13] *
m[2] *
m[7] -
m[13] *
m[3] *
m[6];
1236 inv[6] = -
m[0] *
m[6] *
m[15] +
m[0] *
m[7] *
m[14] +
m[4] *
m[2] *
m[15] -
m[4] *
m[3] *
m[14] -
m[12] *
m[2] *
m[7] +
m[12] *
m[3] *
m[6];
1237 inv[10] =
m[0] *
m[5] *
m[15] -
m[0] *
m[7] *
m[13] -
m[4] *
m[1] *
m[15] +
m[4] *
m[3] *
m[13] +
m[12] *
m[1] *
m[7] -
m[12] *
m[3] *
m[5];
1238 inv[14] = -
m[0] *
m[5] *
m[14] +
m[0] *
m[6] *
m[13] +
m[4] *
m[1] *
m[14] -
m[4] *
m[2] *
m[13] -
m[12] *
m[1] *
m[6] +
m[12] *
m[2] *
m[5];
1239 inv[3] = -
m[1] *
m[6] *
m[11] +
m[1] *
m[7] *
m[10] +
m[5] *
m[2] *
m[11] -
m[5] *
m[3] *
m[10] -
m[9] *
m[2] *
m[7] +
m[9] *
m[3] *
m[6];
1240 inv[7] =
m[0] *
m[6] *
m[11] -
m[0] *
m[7] *
m[10] -
m[4] *
m[2] *
m[11] +
m[4] *
m[3] *
m[10] +
m[8] *
m[2] *
m[7] -
m[8] *
m[3] *
m[6];
1241 inv[11] = -
m[0] *
m[5] *
m[11] +
m[0] *
m[7] *
m[9] +
m[4] *
m[1] *
m[11] -
m[4] *
m[3] *
m[9] -
m[8] *
m[1] *
m[7] +
m[8] *
m[3] *
m[5];
1242 inv[15] =
m[0] *
m[5] *
m[10] -
m[0] *
m[6] *
m[9] -
m[4] *
m[1] *
m[10] +
m[4] *
m[2] *
m[9] +
m[8] *
m[1] *
m[6] -
m[8] *
m[2] *
m[5];
1243 det =
m[0] * inv[0] +
m[1] * inv[4] +
m[2] * inv[8] +
m[3] * inv[12];
1248 for (
i = 0;
i < 16;
i++)
1249 invOut[
i] = inv[
i] * det;
1255void BmnUpstreamTracking::GlobalFit(Double_t** XYZsigXY, Double_t** Amatr_, Double_t* rhs_){
1257 Double_t sigmaX_2 = 999.;
1258 Double_t sigmaY_2 = 999.;
1259 Double_t X = 999., Y = 999., Z =999.;
1261 for (Int_t iSt = 0; iSt < kPoints; ++iSt) {
1263 Z = XYZsigXY[iSt][2];
1265 if (XYZsigXY[iSt][0] > -900.){
1266 X = XYZsigXY[iSt][0];
1267 sigmaX_2 = XYZsigXY[iSt][3]* XYZsigXY[iSt][3];
1269 Amatr_[0][0] += 2*Z*Z/sigmaX_2;
1270 Amatr_[0][1] += 2*Z/sigmaX_2;
1271 rhs_[0] += 2*Z*X/sigmaX_2;
1273 Amatr_[1][0] += 2*Z/sigmaX_2;
1274 Amatr_[1][1] += 2/sigmaX_2;
1275 rhs_[1] += 2*X/sigmaX_2;
1278 if (XYZsigXY[iSt][1] > -900.){
1279 Y = XYZsigXY[iSt][1];
1280 sigmaY_2 = XYZsigXY[iSt][4]* XYZsigXY[iSt][4];
1282 Amatr_[2][2] += 2*Z*Z/sigmaY_2;
1283 Amatr_[2][3] += 2*Z/sigmaY_2;
1284 rhs_[2] += 2*Z*Y/sigmaY_2;
1286 Amatr_[3][2] += 2*Z/sigmaY_2;
1287 Amatr_[3][3] += 2/sigmaY_2;
1288 rhs_[3] += 2*Y/sigmaY_2;
1291 for (Int_t coeff = 0; coeff < 4; ++coeff) {
1292 for (Int_t iCol = 0; iCol < 4; ++iCol) {
1306 if (fVerbose) cout <<
"BmnUpstreamTracking == Init ==" << endl;
1307 FairRootManager* ioman = FairRootManager::Instance();
1310 fSiTracks = (TClonesArray*) ioman->GetObject(fInputBranchName1);
1313 cout<<
"BmnUpstreamTracking::Init(): branch "<<fInputBranchName1<<
" not found! Task will be deactivated"<<endl;
1318 fSilHits = (TClonesArray*) ioman->GetObject(fInputBranchHits);
1320 cout<<
"BmnUpstreamTracking::Init(): branch "<<fInputBranchHits<<
" not found! Task will be deactivated"<<endl;
1325 fMWPCTracks = (TClonesArray*) ioman->GetObject(fInputBranchName2);
1327 cout<<
"BmnUpstreamTracking::Init(): branch "<<fInputBranchName2<<
" not found! Task will be deactivated"<<endl;
1331 fMWPCSegments = (TClonesArray*) ioman->GetObject(fInputBranchName3);
1334 cout<<
"BmnUpstreamTracking::Init(): branch "<<fInputBranchName3<<
" not found! Task will be deactivated"<<endl;
1341 cout<<
" !expData "<<endl;
1342 fSiTracksSim = (TClonesArray*) ioman->GetObject(fInputBranchNameSimTrue);
1344 cout<<
"BmnUpstreamTracking::Init(): branch "<<fInputBranchNameSimTrue<<
" not found! Task will be deactivated"<<endl;
1348 fBmnHitsArray = (TClonesArray*)ioman->GetObject(fInputBranchName);
1349 cout <<
"fBmnHitsArray = " << fInputBranchName <<
"\n";
1350 if (!fBmnHitsArray) {
1351 cout <<
"BmnMwpcHitFinder::Init(): branch " << fInputBranchName <<
" not found! Task will be deactivated" << endl;
1358 fBmnUpstreamTracksArray =
new TClonesArray(fOutputTracksBranchName);
1359 ioman->Register(
"BmnUpstreamTrack",
"UpstreamTrack", fBmnUpstreamTracksArray, kTRUE);
1361 par_ab_Ch =
new Double_t**[kNumChambers];
1362 par_ab_tr =
new Double_t**[kNumPairs];
1363 SiXYhits =
new Double_t**[kNumStSi];
1364 Points =
new Double_t**[kBig];
1365 par_ab_SiTr =
new Double_t*[kNumPars];
1366 par_ab_trz =
new Double_t*[kNumPairs];
1367 par_Seg_z =
new Double_t*[kNumChambers];
1368 Xforglfit =
new Double_t*[kPoints];
1369 Amatr =
new Double_t*[4];
1370 par_SiTr_z =
new Double_t[kBig];
1371 X_shift_seg =
new Double_t[kNumChambers];
1372 Z_pair =
new Double_t[kNumPairs];
1373 Z_Chamber =
new Double_t[kNumChambers];
1374 AmatrInverted =
new Double_t[16];
1375 rhs =
new Double_t[4];
1376 AmatrArray =
new Double_t[16];
1377 line =
new Double_t[4];
1378 Nseg_Ch =
new Int_t[kNumChambers];
1379 NPCTracks =
new Int_t[kNumPairs];
1380 NSiXYhits =
new Int_t[kNumStSi];
1381 X_shiftUp =
new Double_t[kPoints];
1382 Y_shiftUp =
new Double_t[kPoints];
1384 for (Int_t
i = 0;
i < 4;
i++) {
1385 Amatr[
i] =
new Double_t[4];
1388 for (Int_t iPars = 0; iPars < kNumPars; iPars++) {
1389 par_ab_SiTr[iPars] =
new Double_t[kBig];
1392 for (Int_t iCh = 0; iCh < kNumChambers; iCh++) {
1393 par_Seg_z[iCh] =
new Double_t[kBig];
1394 par_ab_Ch[iCh] =
new Double_t*[kNumPars];
1395 for (Int_t iPars = 0; iPars < kNumPars; iPars++) {
1396 par_ab_Ch[iCh][iPars] =
new Double_t[kBig];
1399 for (Int_t ip = 0; ip < kNumPairs; ip++) {
1400 par_ab_tr[ip] =
new Double_t*[kNumPars];
1401 par_ab_trz[ip] =
new Double_t[kBig];
1402 for (Int_t iPars = 0; iPars < kNumPars; iPars++) {
1403 par_ab_tr[ip][iPars] =
new Double_t[kBig];
1406 for (Int_t ist = 0; ist < kNumStSi; ist++) {
1407 SiXYhits[ist] =
new Double_t*[kBig];
1408 for (Int_t ib = 0; ib < kBig; ib++) {
1409 SiXYhits[ist][ib] =
new Double_t[kNumPars];
1412 for (Int_t ib = 0; ib < kBig; ib++) {
1413 Points[ib] =
new Double_t*[kPoints];
1414 for (Int_t ip = 0; ip < kPoints; ip++) {
1415 Points[ib][ip] =
new Double_t[kPoin_Par];
1418 for (Int_t ip = 0; ip < kPoints; ip++) {
1419 Xforglfit[ip] =
new Double_t[kPoin_Par];
1425 hAx_fitUp =
new TH1D(
"Ax_fitUp",
"Tx_fitUp;[rad]", 200, -0.03, 0.03);fList.Add(hAx_fitUp);
1426 hAy_fitUp =
new TH1D(
"Ay_fitUp",
"Ty_fitUp;[rad]", 200, -0.05, 0.05); fList.Add(hAy_fitUp);
1427 hx_fitUp =
new TH1D(
"x_fitUp",
"x_fitUp;[cm]", 200, -10, 10);fList.Add(hx_fitUp);
1428 hy_fitUp =
new TH1D(
"y_fitUp",
"y_fitUp;[cm]", 200, -15, 5);fList.Add(hy_fitUp);
1429 hy_vs_x_Up =
new TH2D(
"y_vs_x_Up",
";X[cm];Y[cm]", 200, -10, 10, 200, -15, 5);fList.Add(hy_vs_x_Up);
1430 hvertexXYUp =
new TH2D(
"vertexXYUp",
"vertexUp;X[cm];Y[cm]", 200, -10, 10, 200, -10, 10);fList.Add(hvertexXYUp);
1431 hTyTx_Up=
new TH2D(
"hTyTx_Up",
"hTyTx_Up", 100, -0.04, 0.04, 100, -0.04, 0.04);fList.Add(hTyTx_Up);
1433 hchi2_fitUp =
new TH1D(
"chi2_fitUp",
"Chi2", 100, 0, 100);fList.Add(hchi2_fitUp);
1434 hNhitsUp =
new TH1D(
"NhitsUp",
"Number of hits", 10, 0.5, 10.5);fList.Add(hNhitsUp);
1436 hAx_upmc =
new TH1D(
"Ax_upmc",
"Ax_upmc;[rad]", 100, -0.05, 0.05);fList.Add(hAx_upmc);
1437 hAy_upmc =
new TH1D(
"Ay_upmc",
"Ay_upmc;[rad]", 100, -0.05, 0.05);fList.Add(hAy_upmc);
1438 hX_upmc =
new TH1D(
"X_upmc",
"X_upmc;[rad]", 100, -10, 10);fList.Add(hX_upmc);
1439 hY_upmc =
new TH1D(
"Y_upmc",
"Y_upmc;[rad]", 100, -10, 10);fList.Add(hY_upmc);
1441 hdAx_tr_mc_comb =
new TH1D(
"dAx_tr_mc_comb",
"dAx_tr_mc_comb", 100, -0.005, 0.005);fList.Add(hdAx_tr_mc_comb);
1442 hdAy_tr_mc_comb =
new TH1D(
"dAy_tr_mc_comb",
"dAy_tr_mc_comb", 100, -0.005, 0.005);fList.Add(hdAy_tr_mc_comb);
1443 hdX_tr_mc_comb =
new TH1D(
"dX_tr_mc_comb",
"dX_tr_mc_comb", 100, -10, 10); fList.Add(hdX_tr_mc_comb);
1444 hdY_tr_mc_comb =
new TH1D(
"dY_tr_mc_comb",
"dY_tr_mc_comb", 100, -10, 10); fList.Add(hdY_tr_mc_comb);
1446 hdAx_uptr_mc =
new TH1D(
"dAx_uptr_mc",
"dAx_uptr_mc", 200, -0.002, 0.002);fList.Add(hdAx_uptr_mc);
1447 hdAy_uptr_mc =
new TH1D(
"dAy_uptr_mc",
"dAy_uptr_mc", 200, -0.005, 0.005);fList.Add(hdAy_uptr_mc);
1448 hdX_uptr_mc =
new TH1D(
"dX_uptr_mc",
"dX_uptr_mc", 200, -2, 2); fList.Add(hdX_uptr_mc);
1449 hdY_uptr_mc =
new TH1D(
"dY_uptr_mc",
"dY_uptr_mc", 200, -2, 2); fList.Add(hdY_uptr_mc);
1450 hY_vs_Xmctrue=
new TH2D(
"Y_vs_Xmctrue",
"mctrue;X[cm];Y[cm]", 200, -10, 10, 200, -15, 5);fList.Add(hY_vs_Xmctrue);
1453 hNtr_reco =
new TH1D(
"Ntr_reco",
"N up tr reco", 10, 0,10); fList.Add(hNtr_reco);
1454 hNtr_mc =
new TH1D(
"Ntr_mc",
"N up tr mc", 10, 0,10); fList.Add(hNtr_mc);
1455 hNtr_mc_vs_reco =
new TH2D(
"Ntr_mc_vs_reco",
"; Nupreco; Nupmctrue", 10, 0,10, 10, 0,10);fList.Add(hNtr_mc_vs_reco);
1456 hNrecoTrif2mc =
new TH1D(
"NrecoTrif2mc",
"N Up tracks if Nmc=2", 3, 0,3); fList.Add(hNrecoTrif2mc);
1457 hAngle_reco =
new TH1D(
"Angle_reco",
"Angle_reco if Nreco = 2 ;[deg];N/0.02^{o}", 200, 0., 4.); fList.Add(hAngle_reco);
1458 hAngle_recoifNmc2 =
new TH1D(
"Angle_recoifNmc2",
"Angle_reco if Nreco = 2 & Nmc = 2;[deg];N/0.02^{o}", 200, 0., 4.); fList.Add(hAngle_recoifNmc2);
1459 hAngle_recoifNmc2Cases =
new TH1D(
"Angle_recoifNmc2Cases",
"Angle_reco if Nreco = 2 & Nmc = 2 & SelectedCases;[deg];N/0.02^{o}", 200, 0., 4.); fList.Add(hAngle_recoifNmc2Cases);
1461 hNum_mcuptr =
new TH1D(
"hNum_mcuptr",
"Num_mcuptr", 2, 0, 2);fList.Add(hNum_mcuptr);
1462 hDen_mcuptr =
new TH1D(
"hDen_mcuptr",
"Den_mcuptr", 2, 0, 2);fList.Add(hDen_mcuptr);
1463 hEff_mcuptr =
new TH1D(
"hEff_mcuptr",
"Eff_mc_uptr", 2, 0, 2);fList.Add(hEff_mcuptr);
1464 hEff_mcuptr->GetXaxis()->SetBinLabel(1,
"2+3 coord");
1465 hEff_mcuptr->GetXaxis()->SetBinLabel(2,
"only 3coord");
1468 for (Int_t
i = 0;
i < kPoints; ++
i) {
1469 if (
i == 2 ||
i == 4) h =
new TH1D(Form(
"ResXst%d",
i), Form(
"ResXst%d",
i), 100, -0.5, 0.5);
1470 else h =
new TH1D(Form(
"ResXst%d",
i), Form(
"ResXst%d",
i), 150, -0.015, 0.015);
1472 hResXst.push_back(h);
1474 for (Int_t
i = 0;
i < kPoints; ++
i) {
1475 if (
i == 2 ||
i == 4) h =
new TH1D(Form(
"ResYst%d",
i), Form(
"ResYst%d",
i), 100, -0.25, 0.25);
1477 else h =
new TH1D(Form(
"ResYst%d",
i), Form(
"ResYst%d",
i), 100, -0.4, 0.4);
1479 hResYst.push_back(h);
1483 Z_pair[0] = -808.816;
1484 Z_pair[1] = -289.401;
1485 Z_Chamber[0] = -858.155579;
1486 Z_Chamber[1] = -761.476562;
1487 Z_Chamber[2] = -364.255554;
1488 Z_Chamber[3] = -214.545547;
1492 X_shift_seg[0] = 0.;
1493 X_shift_seg[1] = 0.;
1494 X_shift_seg[2] = -0.04;
1495 X_shift_seg[3] = -0.05;
1496 Shift_toCenterOfMagnetX = 0.039;
1497 Shift_toCenterOfMagnetY = 0.9;
1498 Shift_toCenterOfMagnetAX = 0.;
1499 Shift_toCenterOfMagnetAY = 0.0019;
1504 X_shift_seg[0] = 0.;
1505 X_shift_seg[1] = 0.;
1506 X_shift_seg[2] = 0.;
1507 X_shift_seg[3] = 0.;
1508 Shift_toCenterOfMagnetX = 0.;
1509 Shift_toCenterOfMagnetY = 0.;
1510 Shift_toCenterOfMagnetAX = 0.;
1511 Shift_toCenterOfMagnetAY = 0.;
1536void BmnUpstreamTracking::PrepareArraysToProcessEvent() {
1537 fBmnUpstreamTracksArray->Clear();
1539 vecUpTracks.clear();
1541 vec_twotracks.clear();
1544 for (Int_t iPars = 0; iPars < kNumPars; iPars++) {
1545 for (Int_t j = 0; j < kBig; j++) {
1546 par_ab_SiTr[iPars][j] = -999.;
1547 par_SiTr_z[j] = -999.;
1551 for (Int_t iCh = 0; iCh < kNumChambers; iCh++) {
1554 for (Int_t iPars = 0; iPars < kNumPars; iPars++) {
1555 for (Int_t j = 0; j < kBig; j++) {
1556 par_ab_Ch[iCh][iPars][j] = -999.;
1557 par_Seg_z[iCh][j] = -999.;
1561 for (Int_t ip = 0; ip < kNumPairs; ip++) {
1563 for (Int_t iPars = 0; iPars < kNumPars; iPars++) {
1564 for (Int_t j = 0; j < kBig; j++) {
1565 par_ab_tr[ip][iPars][j] = -999.;
1569 for (Int_t ist = 0; ist < kNumStSi; ist++) {
1571 for (Int_t ib = 0; ib < kBig; ib++) {
1572 for (Int_t iPars = 0; iPars < kNumPars; iPars++) {
1573 SiXYhits[ist][ib][iPars] = -999.;
1577 for (Int_t ib = 0; ib < kBig; ib++) {
1578 for (Int_t ip = 0; ip < kPoints; ip++) {
1579 for (Int_t
i = 0;
i < kPoin_Par;
i++) {
1580 Points[ib][ip][
i] = -999.;
1593 hchi2_fitUp(nullptr),
1595 hdAx_tr_mc_comb(nullptr),
1596 hdX_tr_mc_comb(nullptr),
1597 hdAy_tr_mc_comb(nullptr),
1598 hdY_tr_mc_comb(nullptr),
1599 hdAx_uptr_mc(nullptr),
1600 hdX_uptr_mc(nullptr),
1601 hdAy_uptr_mc(nullptr),
1602 hdY_uptr_mc(nullptr),
1603 hDen_mcuptr(nullptr),
1604 hNum_mcuptr(nullptr),
1605 hEff_mcuptr(nullptr),
1612 hNrecoTrif2mc(nullptr),
1613 hAngle_reco(nullptr),
1614 hAngle_recoifNmc2(nullptr),
1615 hAngle_recoifNmc2Cases(nullptr),
1616 hNtr_mc_vs_reco(nullptr),
1617 hy_vs_x_Up(nullptr),
1618 hY_vs_Xmctrue(nullptr),
1619 hvertexXYUp(nullptr),
1626 fRunNumber = runNumber;
1628 fInputBranchName1 =
"BmnSiliconTrack";
1629 fInputBranchName2 =
"BmnMwpcTrack";
1630 fInputBranchName3 =
"BmnMwpcSegment";
1631 fInputBranchHits =
"BmnSiliconHits";
1632 fOutputTracksBranchName =
"BmnTrack";
1635 fInputBranchNameSimTrue =
"BmnSiliconHitClean";
1636 fInputBranchName =
"BmnMwpcHit";
1646 for (Int_t iPars = 0; iPars < kNumPars; iPars++) {
1647 delete[] par_ab_SiTr[iPars];
1649 for (Int_t iCh = 0; iCh < kNumChambers; iCh++) {
1650 for (Int_t iPars = 0; iPars < kNumPars; iPars++) {
1651 delete[] par_ab_Ch[iCh][iPars];
1653 delete[] par_ab_Ch[iCh];
1654 delete[] par_Seg_z[iCh];
1656 for (Int_t ip = 0; ip < kNumPairs; ip++) {
1657 for (Int_t iPars = 0; iPars < kNumPars; iPars++) {
1658 delete[] par_ab_tr[ip][iPars];
1660 delete[] par_ab_tr[ip];
1661 delete[] par_ab_trz[ip];
1663 for (Int_t ist = 0; ist < kNumStSi; ist++) {
1664 for (Int_t ib = 0; ib < kBig; ib++) {
1665 delete[] SiXYhits[ist][ib];
1667 delete[] SiXYhits[ist];
1669 for (Int_t ib = 0; ib < kBig; ib++) {
1670 for (Int_t ip = 0; ip < kPoints; ip++) {
1671 delete[] Points[ib][ip];
1673 delete[] Points[ib];
1675 for (Int_t ip = 0; ip < kPoints; ip++) {
1676 delete[] Xforglfit[ip];
1678 for (Int_t
i = 0;
i < 4;
i++) {
1682 delete[] AmatrInverted;
1684 delete[] AmatrArray;
1691 delete[] par_ab_trz;
1693 delete[] par_ab_SiTr;
1694 delete[] par_SiTr_z;
1698 delete[] X_shift_seg;
1713 hEff_mcuptr->Divide(hNum_mcuptr,hDen_mcuptr,1,1);
1714 printf(
"BmnUpstreamTracking: write hists to file... ");
1715 fOutputFileName = Form(
"hUpstreamTracks_run%d.root", fRunNumber);
1716 cout<< fOutputFileName <<endl;
1717 TFile file(fOutputFileName,
"RECREATE");
1721 cout <<
"Work time of the UpstreamTrack finder: " << workTime <<
" s" << endl;
friend F32vec4 sqrt(const F32vec4 &a)
friend F32vec4 fabs(const F32vec4 &a)
Short_t GetStation() const
Short_t GetMwpcId() const
void SetChi2(Double_t chi2)
void SetParamLast(FairTrackParam &par)
FairTrackParam * GetParamFirst()
FairTrackParam * GetParamLast()
virtual ~BmnUpstreamTracking()
static bool compareSegments(const Smatch &a, const Smatch &b)
virtual void Exec(Option_t *opt)
virtual InitStatus Init()