/[PAMELA software]/DarthVader/TrackerLevel2/src/ExtTrkingAlg.cpp
ViewVC logotype

Annotation of /DarthVader/TrackerLevel2/src/ExtTrkingAlg.cpp

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.7 - (hide annotations) (download)
Wed Oct 15 08:45:51 2014 UTC (10 years, 1 month ago) by pam-ts
Branch: MAIN
CVS Tags: v10REDr01, v10RED, HEAD
Changes since 1.6: +3 -2 lines
*** empty log message ***

1 pam-fi 1.1 /**
2     * \file ExtTrkingAlg.cpp
3     * \author Elena Vannuccini
4     **/
5     #include <ExtTrkingAlg.h>
6     #include <iostream>
7     #include <math.h>
8    
9     using namespace std;
10     /**
11     * Constructor
12 pam-ts 1.2 *
13     * @param id Algorythm identifier
14     *
15     * id = 0 The algorythm looks for tracks with >= 3x2y hits on the tracker plane.
16     * It fills a TClonesArray of TrkTrack objects.
17     * id = 1 The first plane (y) of the calorimeter is also used.
18     * It fills a TClonesArray of ExtTrack objects.
19     * id = 2 The first two planes (y+x) of the calorimeter are also used.
20     * It fills a TClonesArray of ExtTrack objects.
21     *
22 pam-fi 1.1 */
23     ExtTrkingAlg::ExtTrkingAlg(Int_t id){
24    
25     _whichAlg = id;
26    
27    
28 mocchiut 1.6 SetDebug(false);
29 pam-fi 1.1
30     if(id == 0){
31 mocchiut 1.6 if(_debug){
32 mocchiut 1.3 cout << "ExtTrkingAlg::ExtTrkingAlg("<<id<<")"<<endl;
33 pam-ts 1.5 // cout << "Creating array of TrkTrack objects "<<endl;
34 mocchiut 1.3 cout << "WARNING!!! tracking not accurate!! bug not fixed yet... "<<endl;
35 mocchiut 1.6 }
36 pam-fi 1.1 _trkArray = new TClonesArray("TrkTrack");
37 pam-ts 1.2 //
38     _sel_nClstrMAX = 20. ; // selection parameter: maximum number of cluster
39     _sel_nPlaneXMIN = 3.; // selection parameter: minimum number of hit x-views
40     _sel_nPlaneYMIN = 2.; // selection parameter: minimum number of hit y-views
41     //
42     _alg_nClFixX = 3.; // algorythm parameter: n.hits required on X view
43     _alg_nClFixY = 2.; // algorythm parameter:n.hits required on Y view
44     _alg_nTrackMAX = 400.; // algorythm parameter: maximum num. of track candidates
45     _alg_nViewCal= 0; // ignored
46     // _alg_nViewCalFix= 0; // ignored
47    
48     NEXTVIEWS = 12 +_alg_nViewCal;
49     NEXTPLANES = 6 +_alg_nViewCal;
50     _extTrack = NULL;//ignored
51     _zMech = NULL;//ignored
52    
53    
54     // }else if (id == 1 ){
55     }else if ( (id >= 100 && id < 144) ||
56     (id >= 200 && id < 244) ||
57     false){ //add n calo planes
58 mocchiut 1.6 if(_debug){
59 mocchiut 1.3 cout << "ExtTrkingAlg::ExtTrkingAlg("<<id<<")"<<endl;
60 pam-ts 1.5 // cout << "Creating array of ExtTrack objects "<<endl;
61 mocchiut 1.6 }
62 pam-ts 1.2 _trkArray = new TClonesArray("ExtTrack");
63     //
64     _alg_nClFixX = 3.; // algorythm parameter: n.hits required on X view
65     _alg_nClFixY = 2.; // algorythm parameter:n.hits required on Y view
66     _alg_nTrackMAX = 1000.; // algorythm parameter: maximum num. of track candidates
67     // _alg_nViewCal = 1; // algorythm parameter: n.calorimeter planes included
68     //_alg_nViewCal = 1; // algorythm parameter: n.calorimeter planes included
69    
70     if((int)(id/100)==1)_alg_nViewCal = id - 100; // algorythm parameter: n.calorimeter planes included
71     if((int)(id/200)==1)_alg_nViewCal = id - 200; // algorythm parameter: n.calorimeter planes included
72    
73     //
74 pam-ts 1.4 _sel_nClstrMAX = 15.;//10. ; // selection parameter: maximum number of cluster
75 pam-ts 1.2 _sel_nPlaneXMIN = (_alg_nViewCal ? 2 : 3); // selection parameter: minimum number of hit x-views
76     _sel_nPlaneYMIN = 2 - (int)(_alg_nViewCal+1)/2 ; // selection parameter: minimum number of hit y-views
77    
78     NEXTVIEWS = 12 +_alg_nViewCal;
79     NEXTPLANES = 6 +_alg_nViewCal;
80     _extTrack = new ExtTrack(NEXTPLANES);
81     _zMech = new float[NEXTPLANES];
82    
83     // -----------------------------------
84     // set Z-coord of tracker planes
85     // -----------------------------------
86     _zMech[0]=ZTRK1;
87     _zMech[1]=ZTRK2;
88     _zMech[2]=ZTRK3;
89     _zMech[3]=ZTRK4;
90     _zMech[4]=ZTRK5;
91     _zMech[5]=ZTRK6;
92     // _extTrack->SetZ(0,ZTRK1);
93     // _extTrack->SetZ(1,ZTRK2);
94     // _extTrack->SetZ(2,ZTRK3);
95     // _extTrack->SetZ(3,ZTRK4);
96     // _extTrack->SetZ(4,ZTRK5);
97     // _extTrack->SetZ(5,ZTRK6);
98    
99 pam-ts 1.5
100    
101 pam-ts 1.2 _caloStripRoto.clear();
102     for(int iv=0; iv<_alg_nViewCal; iv++){ //loop over calorimater tracking planes
103     for(int is=0; is<9; is++){ //loop over calorimeter sensors
104     CaloStripRoto s(1-iv%2, (int)(iv/2), is, false);//flight 0-order align
105     s.ResetAligParams();//reset 1-order align parameters
106     _caloStripRoto.push_back(s) ;
107     }
108     }
109     //------------------------------------------
110     // read alignment parameters
111     //------------------------------------------
112 mocchiut 1.6 // printf("qui debug : %i \n",_debug);
113 mocchiut 1.3 if(_debug) cout << "Reading calorimeter alignment parameters"<<endl;
114 pam-ts 1.2 const char *pamca = gSystem->Getenv("PAM_CALIB");
115     TString filep = "/trk-param/align_param_calo-0/CaloAlignParams.txt";
116     filep.Prepend(pamca);
117 pam-ts 1.5
118     if(_debug)cout << " ---> "<<filep.Data()<<endl;
119 pam-ts 1.2 std::fstream fs;
120     fs.open (filep.Data(), std::fstream::in );
121 pam-ts 1.5
122     if(!fs.is_open()){
123    
124     cout <<" WARNING!!!!!!!!!!!! error opening file "<<filep.Data()<<endl;
125     cout <<" No alignment parameters loaded "<<endl;
126     }
127     // do{
128     while(fs.is_open() && !fs.eof()){
129    
130 pam-ts 1.2 int view,plane,sensor;
131     float par[5],err[5];
132     fs>>view >> plane>> sensor;
133     for(int i=0; i<5; i++)fs>>par[i]>>err[i];
134    
135    
136     if(plane*2+1-view<_alg_nViewCal){
137    
138    
139     int index = (plane*2+1-view)*9 + sensor;
140 mocchiut 1.3 if(_debug){
141     cout<<index<<" >> ";
142     cout<<view << " "<<plane<<" "<<sensor<<" ";
143     for(int i=0; i<5; i++)cout<<setw(10)<<par[i]<<" "<<setw(10)<<err[i]<<" ";
144     cout<<endl;
145     }
146 pam-ts 1.2
147     _caloStripRoto[index].SetAligParams__fPitch(par[0]);
148     _caloStripRoto[index].SetAligParams__shift(par+1);
149     _caloStripRoto[index].SetAligParams__alpha(par[4]);
150     // _caloStripRoto[index].SetSiSensor(sensor);
151     // _caloStripRoto[index].SetView(view);
152     // _caloStripRoto[index].SetPlane(plane);
153    
154 pam-ts 1.5 };
155     // }while(!fs.eof());
156     };
157 pam-ts 1.2 fs.close();
158 pam-fi 1.1
159 pam-ts 1.2 // -----------------------------------
160     // set Z-coord of calorimeter planes
161     // -----------------------------------
162     for(int plane=0; plane<22; plane++){
163     for(int view=1; view>=0; view--){
164     int strip = 0;
165     CaloStrip st = CaloStrip(false);//flight align
166     st.Set(view,plane,strip);
167     int index = 2*plane + !view;
168     if(index >= _alg_nViewCal)break;
169     // _extTrack->SetZ(6+index,st.GetZ());
170     _zMech[6+index]=st.GetZ();
171     }
172     }
173    
174     for(int ip =0 ; ip<_extTrack->nplanes; ip++ )_extTrack->SetZ(ip,_zMech[ip]);
175    
176 mocchiut 1.3 if ( _debug ){
177     cout <<" Extended-track Z-coordinates: "<<endl;
178     for(int ip =0 ; ip<_extTrack->nplanes; ip++ )cout << _extTrack->zm[ip]<<endl;
179     }
180 pam-fi 1.1 }else{
181 mocchiut 1.3 if ( _debug ){
182     cout << "ExtTrkingAlg(Int_t id) -- algorythm id="<<id<<" not valid "<<endl;
183     cout << "--> Track array not created "<<endl;
184     }
185 pam-ts 1.2 _sel_nClstrMAX = 0.;
186     _sel_nPlaneXMIN = 0.;
187     _sel_nPlaneYMIN = 0.;
188     //
189     _alg_nClFixX = 0.;
190     _alg_nClFixY = 0.;
191     _alg_nTrackMAX = 0.;
192     _alg_nViewCal = 0;
193     // _alg_nViewCalFix= 0;
194    
195     NEXTVIEWS = 12 +_alg_nViewCal;
196     NEXTPLANES = 6 +_alg_nViewCal;
197     _extTrack = NULL;//ignored
198    
199     }
200 pam-fi 1.1
201 pam-ts 1.2 CaloStrip st = CaloStrip(false);
202     for(int view=0; view<2; view++){
203     for(int plane=0; plane<22; plane++){
204     for(int strip=0; strip<96; strip++){
205     st.Set(view,plane,strip);
206     _caloCoord[view][plane][strip]=(view ? st.GetY() : st.GetX());
207     _caloZ[plane*2+(view?0:1)]=st.GetZ();
208     }
209     }
210 pam-fi 1.1 }
211 pam-ts 1.2 _caloTj = new Trajectory(44,_caloZ);
212     // _caloTj->Dump();
213 pam-fi 1.1
214 pam-ts 1.2 int ngf = TrkParams::nGF;
215     float *zgf = TrkParams::zGF;
216     _tgf = new Trajectory(ngf,zgf);
217     // _tgf->Dump();
218    
219 pam-fi 1.1 Clear();
220    
221     };
222    
223     /**
224     * Reset the algorythm flags and output
225     */
226 pam-ts 1.2 // void ExtTrkingAlg::Reset(){
227 pam-fi 1.1
228 pam-ts 1.2 // if(_trkArray)_trkArray->Clear("C");
229 pam-fi 1.1
230 pam-ts 1.2 // };
231 pam-fi 1.1
232     /**
233     * Clear the event and reset the algorythm
234     */
235     void ExtTrkingAlg::Clear(Option_t* option){
236    
237     SetTrkLevel1();
238     SetTrkLevel2();
239    
240     SetToFLevel2();
241    
242     SetCaloLevel1();
243     SetCaloLevel2();
244    
245 pam-ts 1.2 if(_trkArray)_trkArray->Clear("C");
246    
247     };
248     /**
249     * DElete all
250     */
251    
252     void ExtTrkingAlg::Delete(){
253     if(_trkArray) delete _trkArray;
254     if(_caloTj) delete _caloTj;
255     if(_tgf) delete _tgf;
256     if(_zMech)delete [] _zMech;
257     }
258    
259 pam-fi 1.1
260     /**
261     * Set selection parameters
262     */
263     void ExtTrkingAlg::SetSelectionParams(double* par){
264    
265     _sel_nClstrMAX = (Int_t)par[0]; // selection parameter: maximum number of cluster
266     _sel_nPlaneXMIN = (Int_t)par[1]; // selection parameter: minimum number of hit x-views
267     _sel_nPlaneYMIN = (Int_t)par[2]; // selection parameter: minimum number of hit y-views
268    
269     };
270     /**
271     * Set algorythm parameters
272     */
273     void ExtTrkingAlg::SetAlgorythmParams(double* par){
274    
275     _alg_nClFixX = (Int_t)par[0]; // algorythm parameter: n.hits required on X view
276     _alg_nClFixY = (Int_t)par[1]; // algorythm parameter:n.hits required on X view
277     _alg_nTrackMAX = (Int_t)par[2]; // algorythm parameter: maximum num. of track candidates
278 pam-ts 1.2 _alg_nViewCal= (Int_t)par[3]; // algorythm parameter: n. calorimeter planes included
279     // _alg_nViewCalFix= (Int_t)par[4]; //
280    
281 pam-fi 1.1 };
282    
283     /**
284     * Get the track array
285     */
286     TClonesArray* ExtTrkingAlg::GetTrackArray(Bool_t reset){
287    
288 pam-ts 1.2 if( reset && _trkArray) _trkArray->Clear("C");
289 pam-fi 1.1 // if( !_procDone )ProcessEvent();
290    
291     return _trkArray;
292    
293     };
294     /**
295     * Pre-select the event
296     */
297     Bool_t ExtTrkingAlg::CheckEvent(){
298    
299 pam-ts 1.5 if(!_trk_l1)return false;
300     TrkLevel1 *trkl1 = _trk_l1;//event->GetTrkLevel1();
301 pam-fi 1.1 int nClstrMAX = _sel_nClstrMAX; //maximum number of cluster
302 pam-ts 1.5 /////////////////////////////////////////////////////////////////////
303     /// dump selection
304     /////////////////////////////////////////////////////////////////////
305     if(_debug){
306     cout << " n.clusters "<<trkl1->nclstr()<<endl;
307     }
308     if(trkl1->nclstr() > nClstrMAX) return false;
309 pam-fi 1.1 /////////////////////////////////////////////////////////////////////
310     /// count number of hit planes
311     /////////////////////////////////////////////////////////////////////
312 pam-ts 1.5 int nPlaneXMIN = _sel_nPlaneXMIN;
313     int nPlaneYMIN = _sel_nPlaneYMIN;
314 pam-fi 1.1 int nHitX[] = {0,0,0,0,0,0};
315     int nHitY[] = {0,0,0,0,0,0};
316 pam-ts 1.5 for(int ic=0; ic<trkl1->nclstr(); ic++){
317     if (trkl1->GetCluster(ic)->IsX() ) nHitX[trkl1->GetCluster(ic)->GetPlane()-1]++;
318     else if (trkl1->GetCluster(ic)->IsY() ) nHitY[trkl1->GetCluster(ic)->GetPlane()-1]++;
319     }
320 pam-fi 1.1 /////////////////////////////////////////////////////////////////////
321     /// set minimum condition 3x+2y
322     /////////////////////////////////////////////////////////////////////
323     int nPlaneX=0;
324     for(int ip=0; ip<6; ip++)if(nHitX[ip])nPlaneX++;
325     int nPlaneY=0;
326     for(int ip=0; ip<6; ip++)if(nHitY[ip])nPlaneY++;
327 pam-ts 1.5
328 pam-fi 1.1 /////////////////////////////////////////////////////////////////////
329     /// dump selection
330     /////////////////////////////////////////////////////////////////////
331     if(_debug){
332 pam-ts 1.5 cout << " n.x-hit planes "<<nPlaneX<<endl;
333     cout << " n.y-hit planes "<<nPlaneY<<endl;
334     }
335     if( nPlaneX<nPlaneXMIN ) return false;
336     if( nPlaneY<nPlaneYMIN ) return false;
337    
338    
339     // if(!_trk_l2)return true;
340     // TrkLevel2 *trkl2 = _trk_l2;//event->GetTrkLevel2();
341     // /////////////////////////////////////////////////////////////////////
342     // /// dump selection
343     // /////////////////////////////////////////////////////////////////////
344     // if(_debug){
345     // cout << " n.tracks "<<trkl2->GetNTracks()<<endl;
346     // cout << " n.x-singles "<<trkl2->nclsx()<<endl;
347     // cout << " n.y-singles "<<trkl2->nclsy()<<endl;
348     // cout << " n.y-singles "<<trkl2->nclsy()<<endl;
349     // }
350     // if(trkl2->nclsy()+trkl2->nclsx() > nClstrMAX) return false;
351     // /////////////////////////////////////////////////////////////////////
352     // /// count number of hit planes
353     // /////////////////////////////////////////////////////////////////////
354     // int nPlaneXMIN = _sel_nPlaneXMIN;
355     // int nPlaneYMIN = _sel_nPlaneYMIN;
356     // int nHitX[] = {0,0,0,0,0,0};
357     // int nHitY[] = {0,0,0,0,0,0};
358     // for(int ix=0; ix<trkl2->nclsx(); ix++)nHitX[trkl2->GetSingletX(ix)->plane-1]++;
359     // for(int iy=0; iy<trkl2->nclsy(); iy++)nHitY[trkl2->GetSingletY(iy)->plane-1]++;
360     // /////////////////////////////////////////////////////////////////////
361     // /// set minimum condition 3x+2y
362     // /////////////////////////////////////////////////////////////////////
363     // int nPlaneX=0;
364     // for(int ip=0; ip<6; ip++)if(nHitX[ip])nPlaneX++;
365     // int nPlaneY=0;
366     // for(int ip=0; ip<6; ip++)if(nHitY[ip])nPlaneY++;
367     // /////////////////////////////////////////////////////////////////////
368     // /// dump selection
369     // /////////////////////////////////////////////////////////////////////
370     // if(_debug){
371     // cout << " n.x-planes with singles "<<nPlaneX<<endl;
372     // cout << " n.y-planes with singles "<<nPlaneY<<endl;
373     // }
374 pam-fi 1.1 ////////////////////////////////////////////////////////////////////////
375     //
376     // check condition for retracking
377     //
378     ////////////////////////////////////////////////////////////////////////
379 pam-ts 1.5 // if(trkl2->GetNTracks()==0 && nPlaneX<nPlaneXMIN) return false;
380     // if(trkl2->GetNTracks()==0 && nPlaneY<nPlaneYMIN) return false;
381 pam-fi 1.1
382     return true;
383    
384     };
385    
386    
387     /**
388     * Process the event
389     */
390 pam-ts 1.2 void ExtTrkingAlg::ProcessEvent0(Bool_t force){
391 pam-fi 1.1
392     if(_debug)cout << " |---------------------------------------------------| "<<endl;
393 pam-ts 1.2 if(_debug)cout << " void ExtTrkingAlg::ProcessEvent0("<<force<<") "<<endl;
394 pam-fi 1.1
395    
396     if(_debug && !_trk_l1)cout << " Missing TrkLevel1 object --- ciao! "<<endl;
397     if(!_trk_l1)return;
398    
399    
400     //===========================
401     // pre-selection
402     //===========================
403    
404     Bool_t RETRACK = CheckEvent();
405    
406     if(_debug)cout <<" Pre-selection result: "<<RETRACK<<endl;
407     if( !force && !RETRACK )return;
408    
409    
410     //===========================
411     // tracking
412     //===========================
413    
414 pam-ts 1.2 // TClonesArray &tracks = *_trkArray;
415     // tracks.Clear();
416    
417    
418 pam-fi 1.1 multimap<int,TrkTrack> trackCandidates[12]; // map: last filled view vs TrkTrack
419     int mapIndex = 0;
420     multimap<int,TrkTrack>::iterator trkBegin;
421     multimap<int,TrkTrack>::iterator trkEnd;
422     int iCand;
423    
424     // ------------------------------------------------
425     // fill a map VIEW(0-11)-CLUSTER
426     // ------------------------------------------------
427     multimap<int,int> clusterMap;
428     if(_debug)cout<<"-------- CLUSTERs --------"<<endl;
429     for(int icl=0; icl<_trk_l1->nclstr(); icl++){
430     clusterMap.insert( pair<int,int>( _trk_l1->GetCluster(icl)->view-1, icl ));
431     if(_debug)cout << icl << " - view "<<_trk_l1->GetCluster(icl)->view<<" ladder "<<_trk_l1->GetCluster(icl)->GetLadder()<<" strip "<<_trk_l1->GetCluster(icl)->maxs<<endl;
432     }
433     // ------------------------------------------------
434     // define iterators over clusters on the same view
435     // ------------------------------------------------
436     pair <multimap<int,int>::iterator, multimap<int,int>::iterator> ret[12];
437     multimap<int,int>::iterator it[12];
438     for(int iv=0; iv<12; iv++)ret[iv] = clusterMap.equal_range(iv);
439    
440     //====================================================================
441     // PARAMETERS
442     //====================================================================
443     // ------------------------------------------------
444     // number of points per candidate
445     // ------------------------------------------------
446     int nClFixX = _alg_nClFixX; // n.hits required on X view
447     int nClFixY = _alg_nClFixY; // n.hits required on X view
448     int nTrackMAX = _alg_nTrackMAX; //
449     //==================================================
450     // ------------------------------------------------
451     // start: one candidate for each cluster
452     // ------------------------------------------------
453     //==================================================
454     if(_debug)cout<<"-------- MINIMAL --------"<<endl;
455     for(int iv=0; iv<12; iv++){ //loop over all views
456    
457     if( !(iv%2) && (int)(0.5*iv) > 6-nClFixX)continue;
458     if( (iv%2) && (int)(0.5*iv) > 6-nClFixY)continue;
459    
460     for ( it[iv]=ret[iv].first; it[iv]!=ret[iv].second; ++it[iv]){ //loop over clusters on the view
461     for (int is=0; is<2; is++){ //loop over sensors
462     int icl = it[iv]->second;
463     TrkCluster *cluster = _trk_l1->GetCluster(icl);
464     int ladder = cluster->GetLadder()-1;
465     int plane = cluster->GetPlane()-1;
466     bool isY = (cluster->view)%2;
467     bool isX = !isY;
468     //
469     // if(_debug && isX )cout << " ^^^^^^^ X plane "<<plane<<" ladder "<<ladder<<" strip "<<cluster->maxs <<endl;
470     // if(_debug && isY )cout << " ^^^^^^^ Y plane "<<plane<<" ladder "<<ladder<<" strip "<<cluster->maxs <<endl;
471    
472     TrkTrack t_track = TrkTrack();
473    
474     if( isX )t_track.SetXGood(plane,icl+1,ladder,is);
475     if( isY )t_track.SetYGood(plane,icl+1,ladder,is);
476    
477     trackCandidates[mapIndex].insert(pair<int,TrkTrack>(iv, TrkTrack(t_track)));
478    
479     }
480     }
481     };
482    
483     //==============================================================
484     // -------------------------------------------------------------
485     // next: add views to each candidate, up to nClFixX+nClFixY
486     // -------------------------------------------------------------
487     //==============================================================
488     for( ;mapIndex < nClFixX+nClFixY-1 ;++mapIndex){
489    
490     trkBegin = trackCandidates[mapIndex].begin();
491     trkEnd = trackCandidates[mapIndex].end();
492     if(_debug)cout<<"MAP "<<mapIndex<<" -----------"<<endl;
493    
494     for( multimap<int,TrkTrack>::iterator trkIter = trkBegin; trkIter!=trkEnd; ++trkIter){
495    
496     TrkTrack trackCand = (*trkIter).second;
497     int lastView = (*trkIter).first; //last inserted view
498     int lastPlane = (int)(0.5*lastView);
499     int lastLadder = trackCand.GetLadder(lastPlane);
500     int lastSensor = trackCand.GetSensor(lastPlane);
501    
502     // if(_debug)cout<<"MAP "<<mapIndex<<" last v "<<lastView<<" NX "<<trackCand.GetNX()<<" NY "<<trackCand.GetNY()<<endl;
503    
504     for(int iv=lastView+1; iv<12; iv++){ //loop over next views
505    
506     if( (iv%2) && (int)(0.5*iv) > 6-nClFixX+trackCand.GetNX())continue; //not enough x-view left
507     if( !(iv%2) && (int)(0.5*iv) > 6-nClFixY+trackCand.GetNY())continue; //not enough y-view left
508    
509     if( (iv%2) && trackCand.GetNX()==nClFixX )continue;//ok?
510     if( !(iv%2) && trackCand.GetNY()==nClFixY )continue;//ok?
511    
512     for ( it[iv]=ret[iv].first; it[iv]!=ret[iv].second; ++it[iv]){ //loop over clusters on the view
513    
514     int icl = it[iv]->second;
515     TrkCluster *cluster = _trk_l1->GetCluster(icl);
516     int ladder = cluster->GetLadder()-1;//(_trk_l1->GetCluster(icl)->maxs-1)%1024 + 1;
517     int plane = cluster->GetPlane()-1;
518     bool isY = (cluster->view)%2;
519     bool isX = !isY;
520    
521     if( plane==lastPlane && ladder!=lastLadder)continue;
522    
523    
524     for (int is=0; is<2; is++){ //loop over sensors
525    
526     if( plane==lastPlane && is!=lastSensor)continue;
527    
528     // if(_debug)cout<<"MAP "<<mapIndex<<" last v "<<lastView;
529     // if(_debug)cout<<" +cl "<<icl<<" s"<<is<<endl;
530    
531     TrkTrack t_track = TrkTrack();
532     trackCand.Copy(t_track); //copy the candidate parameters...
533    
534     if( isX )t_track.SetXGood(plane,icl+1,ladder,is); //...add a point...
535     if( isY )t_track.SetYGood(plane,icl+1,ladder,is);
536    
537     trackCandidates[mapIndex+1].insert(pair<int,TrkTrack>(iv, TrkTrack(t_track))); //...and store a new candidate
538     };//end loop over sensors
539     };//end loop over clusters on the view iv
540     };//endl loop over views
541     }//end loop over candidates
542     }//end iterations
543    
544    
545 mocchiut 1.3 if( trackCandidates[mapIndex].size() > (uint)nTrackMAX ){ // EM, warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
546 pam-fi 1.1 if(_debug)cout << "n.candidates "<<trackCandidates[mapIndex].size()<<" > "<<nTrackMAX<<endl;
547     return;//to many candidates
548     }
549     if(_debug){
550     trkBegin = trackCandidates[mapIndex].begin();
551     trkEnd = trackCandidates[mapIndex].end();
552     for( multimap<int,TrkTrack>::iterator trkIter = trkBegin; trkIter!=trkEnd; ++trkIter){
553     TrkTrack &trackCand = (*trkIter).second;
554     cout << " >> ";
555     cout << " X: ";
556     for(int ip=0; ip<6; ip++)
557 mocchiut 1.3 if(trackCand.GetClusterX_ID(ip)>=0)cout << trackCand.GetClusterX_ID(ip)<<":"<<trackCand.GetSensor(ip)<<"|";
558 pam-fi 1.1 cout << " Y: ";
559     for(int ip=0; ip<6; ip++)
560 mocchiut 1.3 if(trackCand.GetClusterY_ID(ip)>=0)cout << trackCand.GetClusterY_ID(ip)<<":"<<trackCand.GetSensor(ip)<<"|";
561 pam-fi 1.1 cout << endl;
562     }
563     }
564     if(_debug)cout << "n.candidates "<<trackCandidates[mapIndex].size()<<endl;
565    
566 pam-ts 1.2 //==============================================================
567 pam-fi 1.1 // -------------------------------------------------------------
568     // first selection of track candidates, based on chi2
569     // -------------------------------------------------------------
570     //==============================================================
571     if(_debug)cout<<"-------- CHI2 --------"<<endl;
572     trkBegin = trackCandidates[mapIndex].begin();
573     trkEnd = trackCandidates[mapIndex].end();
574     mapIndex++;
575     iCand = 0;
576     for( multimap<int,TrkTrack>::iterator trkIter = trkBegin; trkIter!=trkEnd; ++trkIter){
577     int lastView = (*trkIter).first;
578     TrkTrack &trackCand = (*trkIter).second;
579     int ifail=0;
580     trackCand.FitReset();
581     trackCand.Fit(0.,ifail,0,1);//re-evaluate cluster position from level1
582     if(ifail!=0)trackCand.FitReset();
583    
584     // -----------------------------------
585     // first selection of track candidates
586     // -----------------------------------
587     if(TMath::IsNaN(trackCand.chi2))continue;
588     if(trackCand.chi2 <= 0. || trackCand.chi2 > 1.e7)continue;
589     // if(trackCand.chi2 < 0. || trackCand.chi2 > 10. )continue;
590     iCand++;
591    
592     if(_debug){
593     cout<< " TRK chi2 "<<setw(13)<<trackCand.chi2;
594     cout <<" | al: ";
595     for(int i=0; i<5; i++)cout <<setw(10)<< trackCand.al[i];
596     cout <<" | ";
597     for(int ip=0; ip<6; ip++)
598     if(trackCand.GetClusterX_ID(ip)>=0)cout << trackCand.GetClusterX_ID(ip)<<":"<<trackCand.GetSensor(ip)<<"|";
599     cout << " Y: ";
600     for(int ip=0; ip<6; ip++)
601     if(trackCand.GetClusterY_ID(ip)>=0)cout << trackCand.GetClusterY_ID(ip)<<":"<<trackCand.GetSensor(ip)<<"|"; cout << endl;
602     }
603    
604     // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
605     // evaluated coordinates (to define GF)
606     // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
607     int ngf = TrkParams::nGF;
608     float *zgf = TrkParams::zGF;
609     Trajectory tgf = Trajectory(ngf,zgf);
610     tgf.DoTrack(trackCand.al);//<<<< integrate the trajectory
611     for(int ip=0; ip<ngf; ip++){
612     trackCand.xGF[ip] = tgf.x[ip];
613     trackCand.yGF[ip] = tgf.y[ip];
614     }
615    
616     trackCandidates[mapIndex].insert(pair<int,TrkTrack>(lastView, TrkTrack(trackCand)));
617    
618     };
619     if(trackCandidates[mapIndex].size()==0)return;//no good candidates
620    
621     if(_debug)cout << "n.candidates "<<trackCandidates[mapIndex].size()<<endl;
622     //=================================================================
623     // ----------------------------------------------------------------
624     // CALORIMETER
625     // ----------------------------------------------------------------
626     //=================================================================
627     if(_cal_l1){
628     if(_debug)cout<<"-------- CALORIMETER --------"<<endl;
629     // -----------------------------------
630     // evaluate calorimeter variables
631     // -----------------------------------
632 pam-ts 1.2 // float caloCoord[2][22][96];
633     // float caloZ[44];
634     // for(int view=0; view<2; view++){
635     // for(int plane=0; plane<22; plane++){
636     // for(int strip=0; strip<96; strip++){
637     // CaloStrip st = CaloStrip(false);
638     // st.Set(view,plane,strip);
639     // caloCoord[view][plane][strip]=(view ? st.GetY() : st.GetX());
640     // caloZ[plane*2+(view?0:1)]=st.GetZ();
641     // }
642     // }
643     // }
644     // Trajectory caloTj = Trajectory(44,caloZ);
645 pam-fi 1.1 // for(int iz=0; iz<44;iz++)cout<<caloZ[iz]<<endl;
646     //test calo
647     // float caloEvent[2][22][96];
648     CaloLevel1* l1=_cal_l1;//event->GetCaloLevel1();
649     // if(!l1)return;
650     vector<float> caloChi2;
651     vector<int> caloHit; int caloHitMAX=0;
652     vector<float> caloMip;
653     trkBegin = trackCandidates[mapIndex].begin();
654     trkEnd = trackCandidates[mapIndex].end();
655     for( multimap<int,TrkTrack>::iterator trkIter = trkBegin; trkIter!=trkEnd; ++trkIter){
656     TrkTrack trackCand = ((*trkIter).second);
657    
658 pam-ts 1.2 trackCand.DoTrack(_caloTj);//integrate the trajectory through the calorimeter
659 pam-fi 1.1
660     float chi2 = 0.;
661     int nhit = 0;
662     float cmip = 0.;
663     for(Int_t ih=0; ih<l1->istrip; ih++){
664     Int_t view = -1;
665     Int_t plane = -1;
666     Int_t strip = -1;
667     Float_t mip = l1->DecodeEstrip(ih,view,plane,strip);
668     if(view<0)continue;
669     if(plane<0)continue;
670     if(strip<0)continue;
671     if(mip<=0)continue;
672 pam-ts 1.2 float dxy = _caloCoord[view][plane][strip]-(view?_caloTj->y[plane*2+(view?0:1)]:_caloTj->x[plane*2+(view?0:1)]);
673 pam-fi 1.1 if(plane<11) chi2+= mip * TMath::Power(dxy,2.);
674     // caloZ[plane*2+(view?0:1)]=st.GetZ();
675     if( fabs(dxy) < 2. && plane<11)nhit++;
676     if( fabs(dxy) < 2. && plane<11)cmip+=mip;
677     };
678     if(l1->istrip>0)chi2 = chi2/l1->istrip;
679    
680     caloHit.push_back(nhit);
681     if(nhit>caloHitMAX)caloHitMAX=nhit;
682    
683     if(_debug){
684     cout << " CALO ";
685     // cout << " chi2 "<< chi2 <<" ";
686     cout << " nhit (< 11th plane) "<< nhit <<" ";
687     // cout << " mip "<< cmip <<" ";
688     cout <<endl;
689     };
690     }
691    
692     //=================================================================
693     // ----------------------------------------------------------------
694     // selection of track candidates, based on n.calorimeter hits
695     // ----------------------------------------------------------------
696     //=================================================================
697     trkBegin = trackCandidates[mapIndex].begin();
698     trkEnd = trackCandidates[mapIndex].end();
699     mapIndex++;
700     iCand = 0;
701     for( multimap<int,TrkTrack>::iterator trkIter = trkBegin; trkIter!=trkEnd; ++trkIter){
702     int lastView = (*trkIter).first;
703     TrkTrack &trackCand = (*trkIter).second;
704     if(caloHit[iCand]==caloHitMAX)trackCandidates[mapIndex].insert(pair<int,TrkTrack>(lastView, TrkTrack(trackCand)));
705     iCand++;
706     }
707     if(trackCandidates[mapIndex].size()==0)return;//no good candidates
708     if(_debug)cout << "n.candidates "<<trackCandidates[mapIndex].size()<<endl;
709    
710     }
711    
712     //=================================================================
713     // ----------------------------------------------------------------
714     // TOF
715     // ----------------------------------------------------------------
716     //=================================================================
717     if(_tof_l2){
718     if(_debug)cout<<"-------- TOF --------"<<endl;
719     trkBegin = trackCandidates[mapIndex].begin();
720     trkEnd = trackCandidates[mapIndex].end();
721     ToFLevel2* tl2=_tof_l2;//event->GetToFLevel2();
722     // if(!tl2)return;
723     iCand =0;
724     vector<int> tofHit; int tofHitMAX=0;
725     for( multimap<int,TrkTrack>::iterator trkIter = trkBegin; trkIter!=trkEnd; ++trkIter){
726     // int lastView = (*trkIter).first;
727     TrkTrack &trackCand = (*trkIter).second;
728    
729     int nhit =0;
730     for(int iToF=0; iToF<6; iToF++){
731    
732     int iGF = iToF;
733     if(iToF>3)iGF = iToF+8;
734     int iPaddle = tl2->GetPaddleIdOfTrack( trackCand.xGF[iGF], trackCand.yGF[iGF], iToF);
735     if( tl2->HitPaddle(iToF,iPaddle) )nhit++;
736    
737     }
738     iCand++;
739    
740     tofHit.push_back(nhit);
741     if(nhit>tofHitMAX)tofHitMAX=nhit;
742    
743     if(_debug){
744     cout << " TOF nhit "<< nhit <<" ";
745     cout <<endl;
746     }
747    
748     }
749     //=================================================================
750     // ----------------------------------------------------------------
751     // selection of track candidates, based on n.tof hits
752     // ----------------------------------------------------------------
753     //=================================================================
754     trkBegin = trackCandidates[mapIndex].begin();
755     trkEnd = trackCandidates[mapIndex].end();
756     mapIndex++;
757     iCand = 0;
758     for( multimap<int,TrkTrack>::iterator trkIter = trkBegin; trkIter!=trkEnd; ++trkIter){
759     int lastView = (*trkIter).first;
760     TrkTrack &trackCand = (*trkIter).second;
761     if(tofHit[iCand]==tofHitMAX)trackCandidates[mapIndex].insert(pair<int,TrkTrack>(lastView, TrkTrack(trackCand)));
762     iCand++;
763     }
764     if(trackCandidates[mapIndex].size()==0)return;//no good candidates
765     if(_debug)cout << "n.candidates "<<trackCandidates[mapIndex].size()<<endl;
766    
767     }
768    
769    
770     //=================================================================
771     // ----------------------------------------------------------------
772     // TRACK MERGING
773     // ----------------------------------------------------------------
774     //=================================================================
775     if(_debug)cout<<"-------- MERGING --------"<<endl;
776     trkBegin = trackCandidates[mapIndex].begin();
777     trkEnd = trackCandidates[mapIndex].end();
778     mapIndex++;
779     float chi2Min=1e10;
780     iCand = 0;
781     for( multimap<int,TrkTrack>::iterator trkIter1 = trkBegin; trkIter1!=trkEnd; ++trkIter1){ //loop over tracks (1)
782    
783     TrkTrack &trackCand1 = (*trkIter1).second;// get candidate 1...
784    
785     TrkTrack t_track = TrkTrack();// ...create a new TrkTrack instance...
786     trackCand1.Copy(t_track); // ...and make a copy
787    
788     bool HBM = false; //has been merged
789    
790     for( multimap<int,TrkTrack>::iterator trkIter2 = trkBegin; trkIter2!=trkEnd; ++trkIter2){//loop over tracks (2)
791    
792     TrkTrack &trackCand2 = (*trkIter2).second; // get candidate 2...
793    
794     // if(_debug){
795     // cout <<" X: ";
796     // for(int ip=0; ip<6; ip++)
797     // if(t_track.GetClusterX_ID(ip)>=0)cout << t_track.GetClusterX_ID(ip)<<":"<<t_track.GetSensor(ip)<<"|";
798     // cout << " Y: ";
799     // for(int ip=0; ip<6; ip++)
800     // if(t_track.GetClusterY_ID(ip)>=0)cout << t_track.GetClusterY_ID(ip)<<":"<<t_track.GetSensor(ip)<<"|";
801     // cout << " + ";
802     // cout <<" X: ";
803     // for(int ip=0; ip<6; ip++)
804     // if(trackCand2.GetClusterX_ID(ip)>=0)cout << trackCand2.GetClusterX_ID(ip)<<":"<<trackCand2.GetSensor(ip)<<"|";
805     // cout << " Y: ";
806     // for(int ip=0; ip<6; ip++)
807     // if(trackCand2.GetClusterY_ID(ip)>=0)cout << trackCand2.GetClusterY_ID(ip)<<":"<<trackCand2.GetSensor(ip)<<"|";
808     // cout << " -----> ";
809     // }
810    
811     bool CBM = true;
812     for(int ip=0; ip<6; ip++){ //loop over planes
813     if( t_track.XGood(ip) &&
814     trackCand2.XGood(ip) &&
815     ( t_track.GetClusterX_ID(ip)!=trackCand2.GetClusterX_ID(ip) || t_track.GetSensor(ip)!=trackCand2.GetSensor(ip) ) &&
816     true )CBM=false; // if both have a x-hit and it is not the same ---> they cannot be merged
817     if(!CBM)break;
818     if( t_track.YGood(ip) &&
819     trackCand2.YGood(ip) &&
820     ( t_track.GetClusterY_ID(ip)!=trackCand2.GetClusterY_ID(ip) || t_track.GetSensor(ip)!=trackCand2.GetSensor(ip) ) &&
821     true )CBM=false; // if both have a y-hit and it is not the same ---> they cannot be merged
822     if(!CBM)break;
823     }
824     // if(_debug)cout << " can be merged ? "<<CBM<<endl;
825     if(!CBM)continue; //go to the next candidate
826     ///////////
827     //merging//
828     ///////////
829     for(int ip=0; ip<6; ip++){
830     if( !(t_track.XGood(ip)) && trackCand2.XGood(ip) )
831     t_track.SetXGood(ip,trackCand2.GetClusterX_ID(ip)+1,trackCand2.GetLadder(ip),trackCand2.GetSensor(ip));
832     if( !(t_track.YGood(ip)) && trackCand2.YGood(ip) )
833     t_track.SetYGood(ip,trackCand2.GetClusterY_ID(ip)+1,trackCand2.GetLadder(ip),trackCand2.GetSensor(ip));
834     };
835     HBM = true;
836     }//end loop over tracks (2)
837    
838    
839     // cout << "<< ";
840     // for(int ip=0; ip<6; ip++) cout <<setw(4)<< t_track.GetClusterX_ID(ip);
841     // for(int ip=0; ip<6; ip++) cout <<setw(4)<< t_track.GetClusterY_ID(ip);
842     // cout << endl;
843     // cout<< " TRK chi2 "<<setw(10)<<t_track.chi2;
844     // cout <<" | al ";
845     // for(int i=0; i<5; i++)cout <<setw(10)<< t_track.al[i];
846     // cout << endl;
847    
848     ///////////////////////////////////////////////////////// FIT START
849     // int ifail=0;
850     // // TrkParams::SetDebugMode();
851     // t_track.FitReset(); //angles set to zero
852     // t_track.Fit(0.,ifail,0,1);//re-evaluate cluster position from level1
853     // if( TMath::IsNaN(t_track.chi2) )continue;
854     // if( ifail != 0 )continue;
855     // t_track.Fit(0.,ifail,0,1);//evaluate again taking into account the track angle
856     // if( TMath::IsNaN(t_track.chi2) )continue;
857     // if( ifail != 0 )continue;
858     ///////////////////////////////////////////////////////// FIT FINISH
859     // cout << "Merged: "<<endl;
860     // cout << "X "; for(int ip=0; ip<6; ip++)cout << t_track.XGood(ip); cout << endl;
861     // cout << "Y "; for(int ip=0; ip<6; ip++)cout << t_track.YGood(ip); cout << endl;
862     //
863     //check if track has been already inserted
864     //
865     multimap<int,TrkTrack>::iterator trkB = trackCandidates[mapIndex].begin();
866     multimap<int,TrkTrack>::iterator trkE = trackCandidates[mapIndex].end();
867     //
868     bool ADD = true;
869     for( multimap<int,TrkTrack>::iterator trkI = trkB; trkI!=trkE; ++trkI){
870     TrkTrack &trackC = (*trkI).second;
871     bool SAME=true;
872     for(int ip=0; ip<6; ip++)
873     if( t_track.GetClusterX_ID(ip) != trackC.GetClusterX_ID(ip) ||
874     t_track.GetClusterY_ID(ip) != trackC.GetClusterY_ID(ip) ||
875     t_track.GetSensor(ip) != trackC.GetSensor(ip) ||
876     false)SAME=false;
877     if(SAME){
878     ADD=false;
879     break;
880     }
881     }
882     // if(_debug)cout <<" ADD ? "<<ADD<<endl;
883     if(ADD){
884    
885     // cout << "-----> INSERT "<<endl;
886     if(_debug){
887     cout << " >> HBM "<<HBM;
888     cout << " X:";for(int ip=0; ip<6; ip++)cout << t_track.XGood(ip);
889     cout << " Y:";for(int ip=0; ip<6; ip++)cout << t_track.YGood(ip);
890     cout << " S:";for(int ip=0; ip<6; ip++)cout << t_track.GetSensor(ip);
891     }
892    
893     ///////////////////////////////////////////////////////// FIT START
894     int ifail=0;
895     t_track.FitReset(); //angles set to zero
896     t_track.Fit(0.,ifail,0,1);//re-evaluate cluster position from level1
897     if( TMath::IsNaN(t_track.chi2) )continue;
898     if( ifail != 0 )continue;
899     t_track.Fit(0.,ifail,0,1);//evaluate again taking into account the track angle
900     if( TMath::IsNaN(t_track.chi2) )continue;
901     if( ifail != 0 )continue;
902     ///////////////////////////////////////////////////////// FIT FINISH
903    
904     if(_debug){
905     cout << " >> al: ";for(int i=0; i<5; i++)cout <<setw(10)<< t_track.al[i];
906     cout << " chi2: "<<setw(10)<< t_track.chi2;
907     cout << endl;
908     }
909    
910     // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
911     // evaluated coordinates (to define GF)
912     // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
913     int ngf = TrkParams::nGF;
914     float *zgf = TrkParams::zGF;
915     Trajectory tgf = Trajectory(ngf,zgf);
916     tgf.DoTrack(t_track.al);//<<<< integrate the trajectory
917     for(int ip=0; ip<ngf; ip++){
918     t_track.xGF[ip] = tgf.x[ip];
919     t_track.yGF[ip] = tgf.y[ip];
920     }
921     // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
922     // evaluated other track info
923     // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
924     for(int ip=0; ip<6; ip++){
925     float factor = 0.;
926     factor += TMath::Power(TMath::Tan(TMath::ACos(-1)*t_track.axv[ip]/180.),2);
927     factor += TMath::Power(TMath::Tan(TMath::ACos(-1)*t_track.ayv[ip]/180.),2);
928     factor += 1.;
929     factor = TMath::Sqrt(factor);
930     // factor = 1.;///TEMP
931     if(t_track.XGood(ip)){
932     int iclx = t_track.GetClusterX_ID(ip);
933     TrkCluster *clusterx = _trk_l1->GetCluster(iclx);
934     float mip = TrkParams::GetMIP(clusterx->GetLadder()-1,clusterx->view-1);
935     t_track.dedx_x[ip] = clusterx->GetSignal()/(factor>0.?factor:1.)/(mip>0.?mip:1.);
936     t_track.multmaxx[ip] = clusterx->GetMultiplicity()*10000+clusterx->maxs;
937     t_track.seedx[ip] = clusterx->clsignal[clusterx->indmax]/clusterx->clsigma[clusterx->indmax];//clusterx->GetSignalToNoise(0,7);
938     t_track.xpu[ip] = 0.;//complicato....
939     }
940     if(t_track.YGood(ip)){
941     int icly = t_track.GetClusterY_ID(ip);
942     TrkCluster *clustery = _trk_l1->GetCluster(icly);
943     float mip = TrkParams::GetMIP(clustery->GetLadder()-1,clustery->view-1);
944     t_track.dedx_y[ip] = clustery->GetSignal()/(factor>0.?factor:1.)/(mip>0.?mip:1.);
945     t_track.multmaxy[ip] = clustery->GetMultiplicity()*10000+clustery->maxs;
946     t_track.seedy[ip] = clustery->clsignal[clustery->indmax]/clustery->clsigma[clustery->indmax];//clustery->GetSignalToNoise(0,7);
947     t_track.ypu[ip] = 0.;//complicato....
948     }
949     }
950     ///////////////////////////////////////////////////////// end additional info
951    
952     // cout << "ADD "<<endl;
953     trackCandidates[mapIndex].insert(pair<int,TrkTrack>(t_track.GetNX()+t_track.GetNY(), TrkTrack(t_track)));
954     if(t_track.GetNX()+t_track.GetNY()>5 && t_track.chi2<chi2Min) chi2Min=t_track.chi2;
955     iCand++;
956     }//end add-candidate condition
957    
958     }//end first loop on candidates
959     if(_debug)cout << "n.candidates "<<trackCandidates[mapIndex].size()<<endl;
960    
961     //=================================================================
962     // ----------------------------------------------------------------
963     // chi2 selection
964     // ----------------------------------------------------------------
965     //=================================================================
966     pair <multimap<int,TrkTrack>::iterator, multimap<int,TrkTrack>::iterator> nxny[12];
967     for(int inxny=0; inxny<12; inxny++){
968     nxny[inxny] = trackCandidates[mapIndex].equal_range(inxny);
969     for ( multimap<int,TrkTrack>::iterator it = nxny[inxny].first; it!=nxny[inxny].second; ++it){
970     TrkTrack &trackC = (*it).second;
971     // cout << " NX+NY "<< trackC.GetNX()+trackC.GetNY() <<" chi2 "<<trackC.chi2<< " R(GV) "<<trackC.GetRigidity()<<endl;
972     // if( trackC.chi2==0 )continue;
973     if( trackC.GetNX()+trackC.GetNY() > 5 && trackC.chi2>chi2Min )continue;
974     trackCandidates[mapIndex+1].insert(pair<int,TrkTrack>(inxny, TrkTrack(trackC)));
975     }
976     }
977     mapIndex++;
978    
979     if(_debug)cout << "n.candidates "<<trackCandidates[mapIndex].size()<<endl;
980    
981     //=================================================================
982     // ----------------------------------------------------------------
983     // save tracks
984     // ----------------------------------------------------------------
985     //=================================================================
986     trkBegin = trackCandidates[mapIndex].begin();
987     trkEnd = trackCandidates[mapIndex].end();
988     iCand = 0;
989 pam-ts 1.2 TClonesArray &tracks = *_trkArray;
990     tracks.Clear();
991 pam-fi 1.1 for( multimap<int,TrkTrack>::iterator trkIter = trkBegin; trkIter!=trkEnd; ++trkIter){
992     TrkTrack trackCand = ((*trkIter).second);
993     trackCand.seqno = iCand;
994     // trackCand.Dump();
995     new(tracks[iCand]) TrkTrack(trackCand);
996     iCand++;
997     };
998    
999    
1000    
1001     };
1002 pam-ts 1.2 /**
1003     * Fill cluster map with tracker clusters
1004     */
1005     void ExtTrkingAlg::FillClusterMap(multimap<int,int> &map,TrkLevel1* l1,Int_t vOffset){
1006    
1007     if(_debug)cout<<"-------- TRK CLUSTERs --------"<<endl;
1008    
1009     // _trk_cl.clear();
1010    
1011     if(!l1)return;
1012    
1013     ExtHit *trkCl = new ExtHit();
1014    
1015     for(int icl=0; icl<l1->nclstr(); icl++){
1016    
1017     // trkCl->Reset();
1018    
1019     // l1->GetCluster(icl)->GetLevel1Struct();// to use F77 routines //PERICOLOSO
1020     // trkCl->coordPU = (float)(l1->GetCluster(icl)->maxs) - 1. + l1->GetCluster(icl)->GetCOG();
1021     // trkCl->coordCm = 1000.; //TEMPORANEO forse non serve
1022     // trkCl->resCm = 1000.;//TEMPORANEO
1023     // trkCl->signal = l1->GetCluster(icl)->GetSignal();
1024     // trkCl->mult = l1->GetCluster(icl)->GetMultiplicity();
1025     // trkCl->view = l1->GetCluster(icl)->view-1;
1026    
1027     // _trk_cl.push_back(ExtHit(*trkCl));
1028    
1029     map.insert( pair<int,int>( l1->GetCluster(icl)->view-1 + vOffset, icl ));
1030     if(_debug)cout << icl << " - view(0-11) "<<l1->GetCluster(icl)->view-1<<" ladder(012) "<<l1->GetCluster(icl)->GetLadder()-1<<" strip "<<l1->GetCluster(icl)->maxs<<endl;
1031     }
1032    
1033     // l1->GetLevel1Struct(); //necessario per ritornare al contenuto originale del common
1034    
1035     if(trkCl)delete trkCl;
1036     };
1037    
1038     /**
1039     * Fill cluster map with calorimeter clusters
1040     */
1041     void ExtTrkingAlg::FillClusterMap(multimap<int,int> &map,CaloLevel1* l1,Int_t vOffset){
1042    
1043     if(_debug)cout<<"-------- CALO CLUSTERs -------- on VIEW < "<<_alg_nViewCal<<endl;
1044 pam-fi 1.1
1045 pam-ts 1.2 if(_alg_nViewCal<=0)return;
1046    
1047     _cal_cl.clear();
1048    
1049     if(!l1)return;
1050    
1051    
1052     // ==========================
1053     // CALORIMETER CLUSTERING
1054     // ==========================
1055     CaloStrip st = CaloStrip(false);
1056     ExtHit *caloCl=NULL;
1057     Int_t nCl = 0;
1058     for(Int_t ih=0; ih<l1->istrip; ih++){//loop over calorimeter hits
1059     Int_t view = -1; // 0-x 1-y
1060     Int_t plane = -1; // 0-21
1061     Int_t strip = -1; // 0-95
1062     Float_t mip = l1->DecodeEstrip(ih,view,plane,strip);
1063    
1064     // if(strip == 0 || strip == 95)cout <<" strip "<<strip<<" OK "<<endl;
1065 mocchiut 1.6 if((strip < 0 || strip > 95) && _debug)cout <<" strip "<<strip<<" AHI AHI "<<endl;
1066 pam-ts 1.2
1067     if(view<0)continue;
1068     if(plane<0)continue;
1069     if(strip<0)continue;
1070     if(mip<=0)continue;
1071    
1072     // cout << ih << " -- "<<view<<" "<<plane<<" "<<strip<<endl;
1073     st.Set(view,plane,strip);// evaluate strip coordinates
1074     //
1075     int vv = plane*2+(int)(!view); //0-43 odd x even y
1076     float cc = (view ? st.GetY() : st.GetX()); //coordinate
1077     float ss = mip; //signal
1078     float pp = (float)strip; //pitch units
1079    
1080     if( vv >= _alg_nViewCal ){//view not included
1081     if(!caloCl)continue;
1082     if(caloCl->mult>0){ //if there is a cluster under construction...
1083     _cal_cl.push_back(ExtHit(*caloCl));//store it
1084     map.insert( pair<int,int>(caloCl->view + vOffset, nCl ));
1085     if(_debug)cout << nCl << " - view(0-43) "<< caloCl->view<<" strip "<<caloCl->start<<"-"<<caloCl->start+caloCl->mult-1<<endl;
1086     nCl++;
1087     caloCl->Reset();
1088     caloCl->Set(strip,vv); // start new one... (without adding the strip)
1089     }
1090     continue; //... and skip this view
1091     }
1092     // --------------
1093     // @first hit:
1094     // --------------
1095     if(!caloCl){
1096     caloCl = new ExtHit(strip,vv);//create cluster starting
1097     caloCl->Add(cc,pp,ss);//add strip
1098     continue;
1099     }
1100     //-------------------
1101     //check previous hit
1102     //-------------------
1103     if(
1104     vv != caloCl->view || //hit on a different view
1105     strip > caloCl->start + caloCl->mult ||//not adjacent to previous one
1106     strip == 32 || //different ladder
1107     strip == 64 || //different ladder
1108     false ){
1109     // is a new cluster:
1110     // store previous one, if not already stored
1111     if(caloCl->mult > 0){
1112     _cal_cl.push_back(ExtHit(*caloCl));
1113     map.insert( pair<int,int>(caloCl->view + vOffset, nCl ));
1114     if(_debug)cout << nCl << " - view(0-43) "<< caloCl->view<<" strip "<<caloCl->start<<"-"<<caloCl->start+caloCl->mult-1<<endl;
1115     nCl++;
1116     };
1117     //
1118     caloCl->Reset(); // reset
1119     caloCl->Set(strip,vv); // start new one from strip
1120    
1121     }
1122     caloCl->Add(cc,pp,ss); //add strip
1123     };//end loop over calorimeter hits
1124    
1125     if(caloCl)delete caloCl;
1126    
1127     return;
1128    
1129     };
1130 pam-fi 1.1 /**
1131 pam-ts 1.2 * Evaluate positions
1132 pam-fi 1.1 */
1133 pam-ts 1.2 bool ExtTrkingAlg::EvaluateClusterPosition_Tracker( int iclx, int icly,int lad, int sen, float *xmABar, float *ymABar, float *zmAB){
1134    
1135     TrkParams::Load(1);
1136     if( !TrkParams::IsLoaded(1) ){
1137     cout << "Bool_t ExtTrkingAlg::EvaluateClusterPosition_Tracker ---ERROR--- m.field not loaded "<<endl;
1138     return false;
1139     }
1140     TrkParams::Load(4);
1141     if( !TrkParams::IsLoaded(4) ){
1142     cout << "Bool_t ExtTrkingAlg::EvaluateClusterPosition_Tracker ---ERROR--- p.f.a. par. not loaded "<<endl;
1143     return false;
1144     }
1145     TrkParams::Load(5);
1146     if( !TrkParams::IsLoaded(5) ){
1147     cout << "Bool_t ExtTrkingAlg::EvaluateClusterPosition_Tracker ---ERROR--- alignment par. not loaded "<<endl;
1148     return false;
1149     }
1150     // cout << ip<<" ** "<<xm[ip]<<" / "<<ym[ip]<<endl;;
1151     int icx = iclx+1;//0=no-cluster,1-N
1152     int icy = icly+1;//0=no-cluster,1-N
1153     int sensor = sen+1;//<< convenzione "Paolo"
1154     int ip = (_trk_l1->GetCluster(TMath::Max(iclx,icly))->view-1)/2;//ip=0-5
1155     if(ip==5 && sensor!=0)sensor=3-sensor;//<< convenzione "Elena"
1156     int ladder = lad+1;
1157     float ax = (float)xmABar[3];
1158     float ay = (float)ymABar[3];
1159     float v[3];
1160     v[0]=xmABar[0];
1161     v[1]=ymABar[0];
1162     v[2]=zmAB[0];
1163     float bfx = 10*TrkParams::GetBX(v);//Tesla
1164     float bfy = 10*TrkParams::GetBY(v);//Tesla
1165     int ipp=ip+1;
1166    
1167     // cout<<"xyzpam_("<<ipp<<","<<icx<<","<<icy<<","<<ladder<<","<<sensor<<"...)"<<endl;
1168     // e` una cosa bruttissima lo so ma che ci posso fare? mica posso fare tutto io!!
1169     // ma lo sai a che ora me so` svegliata stamattina??
1170     xyzpam_(&ipp,&icx,&icy,&ladder,&sensor,&ax,&ay,&bfx,&bfy);
1171     // cout<<" ip l s------------------- "<<ip<<ladder<<sensor<<" zm "<<track_.zm[ip]<<endl;
1172     extern cMini2track track_;
1173    
1174     xmABar[0]=track_.xm[ip];
1175     ymABar[0]=track_.ym[ip];
1176     zmAB[0]=track_.zm[ip];
1177    
1178     xmABar[1]=track_.xm_a[ip];
1179     ymABar[1]=track_.ym_a[ip];
1180     zmAB[1]=track_.zm_a[ip];//
1181    
1182    
1183     xmABar[2]=track_.xm_b[ip];
1184     ymABar[2]=track_.ym_b[ip];
1185     zmAB[2]=track_.zm_b[ip];//
1186    
1187     xmABar[4]=track_.resx[ip];
1188     ymABar[4]=track_.resy[ip];
1189    
1190     return true;
1191    
1192     }
1193     // bool ExtTrkingAlg::EvaluateClusterPosition_Calorimeter( int icl, int sensor, float *xmABar, float *ymABar, float *zmAB, float def){
1194    
1195     // ExtHit cluster = _cal_cl[icl];
1196     // // int plane = 6 + cluster.view; //0...21
1197     // int plane = (int)(cluster.view / 2 ); //0...21
1198     // int ladder = (int)(cluster.coordPU / 32);//0...2
1199     // bool isX = (cluster.view)%2;
1200     // bool isY = !isX;
1201    
1202    
1203     // bool ROTO = (sensor>=0);//if sensor is assigned (0,1,2) the strip can be rototraslated
1204    
1205    
1206     // CaloStrip st = CaloStrip(false);
1207     // //----------------------------
1208     // // Z-coordinate
1209     // //----------------------------
1210     // st.Set((int)isY,plane,ladder*32);//
1211    
1212     // float coordCm_Z0 = st.GetZ();
1213    
1214     // float size = 80.5; //(cm) larghezza del sensore + zone morte
1215     // //----------------------------
1216     // // strip-segment coordinates
1217     // //----------------------------
1218     // float coordCm_LA = cluster.coordCm;
1219     // float coordCm_LB = cluster.coordCm;
1220     // float coordCm_SA = (-1)*size*1.5; //full calorimeter size
1221     // float coordCm_SB = (+1)*size*1.5; //full calorimeter size
1222     // float coordCm_ZA = coordCm_Z0;
1223     // float coordCm_ZB = coordCm_Z0;
1224    
1225     // //----------------------------
1226     // // rototraslation
1227     // //----------------------------
1228     // if(ROTO){
1229     // //-----------------------------
1230     // // sensor origin coordinates
1231     // //-----------------------------
1232     // st.Set( (int)isY, plane, ladder*32);//
1233     // float coordCm_L0 = ( isX ? st.GetX() : st.GetY());
1234     // st.Set((int)(!isY), plane, sensor*32 );
1235     // float coordCm_S0 = (!isX ? st.GetX() : st.GetY());
1236    
1237     // coordCm_SA = (-1)*size*0.5 + (sensor-1)*size; //sensor size
1238     // coordCm_SB = (+1)*size*0.5 + (sensor-1)*size; //sensor size
1239    
1240     // //-----------------------------
1241     // // alignment pamameters
1242     // //-----------------------------
1243     // float fPitch = 1.;
1244     // float shift[]= {0.,0.,0.};//(L,S,Z)
1245     // float alpha = 0.;
1246     // //-----------------------------
1247    
1248     // //coordinate relative al sensore
1249     // coordCm_LA = coordCm_LA - coordCm_L0;
1250     // coordCm_SA = coordCm_SA - coordCm_S0;
1251     // coordCm_ZA = coordCm_ZA - coordCm_Z0;
1252     // coordCm_LB = coordCm_LB - coordCm_L0;
1253     // coordCm_SB = coordCm_SB - coordCm_S0;
1254     // coordCm_ZB = coordCm_ZB - coordCm_Z0;
1255    
1256     // //variazione di pitch
1257     // coordCm_LA = coordCm_LA * fPitch;
1258     // coordCm_LB = coordCm_LB * fPitch;
1259    
1260     // //rotazione
1261     // float LA = coordCm_LA - alpha * coordCm_SA;
1262     // float SA = coordCm_SA + alpha * coordCm_LA;
1263     // float LB = coordCm_LB - alpha * coordCm_SB;
1264     // float SB = coordCm_SB + alpha * coordCm_LB;
1265    
1266     // //traslazione
1267     // coordCm_LA = LA + shift[0];
1268     // coordCm_SA = SA + shift[1];
1269     // coordCm_ZA = coordCm_ZA + shift[2];
1270     // coordCm_LB = LB + shift[0];
1271     // coordCm_SB = SB + shift[1];
1272     // coordCm_ZB = coordCm_ZB + shift[2];
1273    
1274     // //sistema di riferimento generale
1275    
1276     // coordCm_LA = coordCm_LA + coordCm_L0;
1277     // coordCm_SA = coordCm_SA + coordCm_S0;
1278     // coordCm_ZA = coordCm_ZA + coordCm_Z0;
1279     // coordCm_LB = coordCm_LB + coordCm_L0;
1280     // coordCm_SB = coordCm_SB + coordCm_S0;
1281     // coordCm_ZB = coordCm_ZB + coordCm_Z0;
1282    
1283     // }
1284    
1285     // xmABar[0] = -100.;
1286     // ymABar[0] = -100.;
1287     // zmAB[0] = 0.5*coordCm_ZA+0.5*coordCm_ZB;
1288    
1289     // xmABar[1] = (isX ? coordCm_LA : coordCm_SA);
1290     // ymABar[1] = (isY ? coordCm_LA : coordCm_SA);
1291     // zmAB[1] = coordCm_ZA;
1292    
1293    
1294     // xmABar[2]= (isX ? coordCm_LB : coordCm_SB);
1295     // ymABar[2]= (isY ? coordCm_LB : coordCm_SB);
1296     // zmAB[2] = coordCm_ZB;
1297    
1298    
1299     // //----------------------------
1300     // // evaluate spatial resolution
1301     // //----------------------------
1302    
1303    
1304     // float res_dig = 0.24/sqrt(12.);
1305    
1306     // float res_ms = 0.;
1307    
1308     // if(def!=0.){
1309    
1310     // float rig = 1/def; if(rig<0)rig = -rig;
1311     // float factor = 0.;
1312     // factor += TMath::Power(TMath::Tan(TMath::ACos(-1)*xmABar[3]/180.),2);
1313     // factor += TMath::Power(TMath::Tan(TMath::ACos(-1)*ymABar[3]/180.),2);
1314     // factor += 1.;
1315     // factor = TMath::Sqrt(factor);
1316    
1317     // int view = cluster.view; //0... 43
1318    
1319     // int nW = (int)((view + 1)/2);
1320     // float dW = 0.74*factor;//X0
1321     // float dW_cm = 0.26*factor;//cm
1322     // float dSi_cm = 0.; //cm
1323     // if(isY && plane>0) dSi_cm = ( plane%2 ? 0.228 : 0.428);
1324     // dSi_cm *= factor;
1325     // // multiple scattering angle
1326     // float theta = 0.;//ms
1327     // theta = 0.0136/rig;
1328     // theta = theta * sqrt(dW) * (1.+0.038*log(dW));
1329     // float Vt = theta*theta; //cov(theta,theta)
1330     // float Vy = Vt * dW_cm * dW_cm /3.; //cov(y,y)
1331     // float Vty = 0.87 * Vt * Vy; //cov(theta,y)
1332     // float Vc = Vy + dSi_cm * dSi_cm * Vt + 2. * dSi_cm * Vty;
1333     // float rms = sqrt( Vc );
1334     // // if(isY)t_track.resy[ip] = sqrt(rms*rms + t_track.resy[ip]*t_track.resy[ip]);
1335     // // else t_track.resx[ip] = sqrt(rms*rms + t_track.resx[ip]*t_track.resx[ip]);
1336     // // if(isY) VMS[nW] = rms*rms;
1337     // // if(_debug)cout <<endl<<view<<" nW "<<nW<<" res(MS) "<<rms<<" factor "<<factor;
1338    
1339     // if(view>=3)cout << " --> NB error computation not accurate ";
1340     // res_ms = rms;
1341    
1342     // }
1343    
1344    
1345    
1346    
1347     // xmABar[4]= (isX ? sqrt(res_dig*res_dig+res_ms*res_ms) : 1000.);
1348     // ymABar[4]= (isY ? sqrt(res_dig*res_dig+res_ms*res_ms) : 1000.);
1349    
1350    
1351    
1352     // }
1353     bool ExtTrkingAlg::EvaluateClusterPosition_Calorimeter( int icl, int& sisensor, float *xmABar, float *ymABar, float *zmAB, float def){
1354    
1355     ExtHit cluster = _cal_cl[icl];
1356     // int plane = 6 + cluster.view; //0...21
1357     int plane = (int)(cluster.view / 2 ); //0...21
1358     int ladder = (int)(cluster.coordPU / 32);//0...2
1359 mocchiut 1.3 // int view = cluster.view;//0...43 // EM, unused variable
1360 pam-ts 1.2 bool isX = (cluster.view)%2;
1361     bool isY = !isX;
1362    
1363    
1364     // int sisensor = -1;
1365    
1366    
1367     // CaloStripRoto temp;
1368    
1369     bool ROTO = ( xmABar[0]!=0. && ymABar[0]!=0.);
1370     // ------------------------------------------------------------------------------
1371     //
1372     // check if the cluster belongs to the hit sensor (xmABar[0],ymABar[0] must be provided)
1373     // evaluate the hit sensor number
1374     //
1375     // ------------------------------------------------------------------------------
1376     if(ROTO){
1377    
1378    
1379     for(int is=0;is<3; is++){
1380     int sis = GetCaloSiSensor((int)isY,ladder,is);
1381     // cout << "view, ladder, is :"<<(int)isY<<ladder<<is<<" ---> sis "<<sis<<endl;
1382     int index = (plane*2+1-(int)isY)*9 + sis;
1383     CaloStripRoto extst = _caloStripRoto[index];
1384     // cout << "index "<<index<<endl;
1385     // cout << " -> view "<<extst.GetView()<<endl;
1386     // cout << " -> plane "<<extst.GetPlane()<<endl;
1387     // cout << " -> sisensor "<<extst.GetSiSensor()<<endl;
1388     // cout << " -> ladder "<<extst.GetLadder(<<" "<<GetCaloLadder(extst.GetView(),extst.GetSiSensor())<<endl;
1389     bool inside = extst.SensorContains(xmABar[0],ymABar[0]);
1390     // cout << " inside "<<sis<<" ?? "<<inside<<endl;
1391     if( inside ){
1392     sisensor = sis;
1393     continue;
1394     }
1395     }
1396    
1397     if(sisensor==-1){
1398     // cout << "ATTENZIONE!!! sisensor "<<sisensor<<" x,y "<<xmABar[0]<<" "<<ymABar[0]<<endl;
1399     }
1400     }
1401    
1402     // ------------------------------------------------------------------------------
1403     //
1404     // if no sensor is hit, skip rototraslation
1405     //
1406     // ------------------------------------------------------------------------------
1407     if(sisensor==-1)ROTO=false;
1408     // ------------------------------------------------------------------------------
1409     //
1410     // now evaluate strip A-B coordinates
1411     //
1412     // ------------------------------------------------------------------------------
1413     if(ROTO){
1414    
1415     int index = (plane*2+1-(int)isY)*9 + sisensor;
1416     CaloStripRoto extst = _caloStripRoto[index];
1417     // CaloStrip st = extst.st;
1418    
1419     // cout << " extst.Set("<<(int)isY<<", "<<plane<<", "<<cluster.coordPU<<", "<<sensor<<") "<<endl;
1420     // extst.Set((int)isY, plane, cluster.coordPU, sensor);
1421    
1422 mocchiut 1.6 if( sisensor != extst.GetSiSensor() && _debug )cout << " extst.GetSiSensor() "<<extst.GetSiSensor()<<" != "<<sisensor<<endl;
1423     if( plane != extst.GetPlane() && _debug )cout << " extst.GetPlane() "<<extst.GetPlane()<<" != "<<plane<<endl;
1424     if( (int)isY != extst.GetView() && _debug )cout << " extst.GetView() "<<extst.GetView()<<" != "<<isY<<endl;
1425 pam-ts 1.2 // cout << " extst.SetStrip("<<cluster.coordPU<<") "<<endl;
1426     extst.SetStrip(cluster.coordPU);
1427    
1428    
1429     xmABar[0] = -100.;
1430     ymABar[0] = -100.;
1431     zmAB[0] = 0.5*extst.fZA+0.5*extst.fZB;
1432    
1433     xmABar[1] = extst.fXA;
1434     ymABar[1] = extst.fYA;
1435     zmAB[1] = extst.fZA;
1436    
1437    
1438     xmABar[2]= extst.fXB;
1439     ymABar[2]= extst.fYB;
1440     zmAB[2] = extst.fZB;
1441    
1442     xmABar[4]= (isX ? extst.GetSpatialResolution(def, xmABar[3], ymABar[3], 1.) : 1000.);
1443     ymABar[4]= (isY ? extst.GetSpatialResolution(def, xmABar[3], ymABar[3], 1.) : 1000.);
1444    
1445    
1446     }else{
1447    
1448    
1449     CaloStrip st = CaloStrip(false);
1450     //----------------------------
1451     // Z-coordinate
1452     //----------------------------
1453     st.Set((int)isY,plane,ladder*32);//
1454    
1455     float coordCm_Z0 = st.GetZ();
1456    
1457     float size = 80.5; //(cm) larghezza del sensore + zone morte
1458     //----------------------------
1459     // strip-segment coordinates
1460     //----------------------------
1461     float coordCm_LA = cluster.coordCm;
1462     float coordCm_LB = cluster.coordCm;
1463     float coordCm_SA = (-1)*size*1.5; //full calorimeter size
1464     float coordCm_SB = (+1)*size*1.5; //full calorimeter size
1465     float coordCm_ZA = coordCm_Z0;
1466     float coordCm_ZB = coordCm_Z0;
1467    
1468     //----------------------------
1469     // rototraslation
1470     //----------------------------
1471    
1472     xmABar[0] = -100.;
1473     ymABar[0] = -100.;
1474     zmAB[0] = 0.5*coordCm_ZA+0.5*coordCm_ZB;
1475    
1476     xmABar[1] = (isX ? coordCm_LA : coordCm_SA);
1477     ymABar[1] = (isY ? coordCm_LA : coordCm_SA);
1478     zmAB[1] = coordCm_ZA;
1479    
1480    
1481     xmABar[2]= (isX ? coordCm_LB : coordCm_SB);
1482     ymABar[2]= (isY ? coordCm_LB : coordCm_SB);
1483     zmAB[2] = coordCm_ZB;
1484    
1485    
1486    
1487    
1488     //----------------------------
1489     // evaluate spatial resolution
1490     //----------------------------
1491    
1492    
1493     float res_dig = 0.24/sqrt(12.);
1494 pam-fi 1.1
1495 pam-ts 1.2 float res_ms = 0.;
1496 pam-fi 1.1
1497 pam-ts 1.2 if(def!=0.){
1498    
1499     float rig = 1/def; if(rig<0)rig = -rig;
1500     float factor = 0.;
1501     factor += TMath::Power(TMath::Tan(TMath::ACos(-1)*xmABar[3]/180.),2);
1502     factor += TMath::Power(TMath::Tan(TMath::ACos(-1)*ymABar[3]/180.),2);
1503     factor += 1.;
1504     factor = TMath::Sqrt(factor);
1505    
1506     int view = cluster.view; //0... 43
1507    
1508 mocchiut 1.3 // int nW = (int)((view + 1)/2); // EM, unused variable
1509 pam-ts 1.2 float dW = 0.74*factor;//X0
1510     float dW_cm = 0.26*factor;//cm
1511     float dSi_cm = 0.; //cm
1512     if(isY && plane>0) dSi_cm = ( plane%2 ? 0.228 : 0.428);
1513     dSi_cm *= factor;
1514     // multiple scattering angle
1515     float theta = 0.;//ms
1516     theta = 0.0136/rig;
1517     theta = theta * sqrt(dW) * (1.+0.038*log(dW));
1518     float Vt = theta*theta; //cov(theta,theta)
1519     float Vy = Vt * dW_cm * dW_cm /3.; //cov(y,y)
1520     float Vty = 0.87 * Vt * Vy; //cov(theta,y)
1521     float Vc = Vy + dSi_cm * dSi_cm * Vt + 2. * dSi_cm * Vty;
1522     float rms = sqrt( Vc );
1523     // if(isY)t_track.resy[ip] = sqrt(rms*rms + t_track.resy[ip]*t_track.resy[ip]);
1524     // else t_track.resx[ip] = sqrt(rms*rms + t_track.resx[ip]*t_track.resx[ip]);
1525     // if(isY) VMS[nW] = rms*rms;
1526     // if(_debug)cout <<endl<<view<<" nW "<<nW<<" res(MS) "<<rms<<" factor "<<factor;
1527    
1528 mocchiut 1.6 if(view>=3 && _debug)cout << " --> NB error computation not accurate ";
1529 pam-ts 1.2 res_ms = rms;
1530    
1531     }
1532    
1533     xmABar[4]= (isX ? sqrt(res_dig*res_dig+res_ms*res_ms) : 1000.);
1534     ymABar[4]= (isY ? sqrt(res_dig*res_dig+res_ms*res_ms) : 1000.);
1535    
1536     }
1537    
1538 mocchiut 1.3 return true; // EM, warning: no return statement in function returning non-void [-Wreturn-type]
1539 pam-fi 1.1 }
1540 pam-ts 1.2
1541    
1542    
1543     /**
1544     * Process the event
1545     */
1546     void ExtTrkingAlg::ProcessEvent1(Bool_t force){
1547    
1548     if(_debug)cout << " |---------------------------------------------------| "<<endl;
1549     if(_debug)cout << " void ExtTrkingAlg::ProcessEvent1("<<force<<") "<<endl;
1550    
1551    
1552     if(_debug && !_trk_l1)cout << " Missing TrkLevel1 object --- ciao! "<<endl;
1553     if(!_trk_l1)return;
1554    
1555    
1556     //===========================
1557     // pre-selection
1558     //===========================
1559    
1560     Bool_t RETRACK = CheckEvent();
1561    
1562     if(_debug)cout <<" Pre-selection result: "<<RETRACK<<endl;
1563     if( !force && !RETRACK )return;
1564    
1565    
1566     //===========================
1567     // tracking
1568     //===========================
1569    
1570     // TClonesArray &tracks = *_trkArray;
1571     // tracks.Clear();
1572     TClonesArray &tracks = *_trkArray;
1573     tracks.Clear();
1574    
1575    
1576     multimap<int,ExtTrack> trackCandidates[NEXTVIEWS]; // map: last hit view vs TrkTrack
1577     int mapIndex = 0;
1578     multimap<int,ExtTrack>::iterator trkBegin;
1579     multimap<int,ExtTrack>::iterator trkEnd;
1580     int iCand;
1581    
1582     // ------------------------------------------------
1583     // fill a map VIEW-CLUSTER
1584     // ------------------------------------------------
1585     multimap<int,int> clusterMap;
1586     FillClusterMap(clusterMap,_trk_l1,0);// trk clusters
1587     FillClusterMap(clusterMap,_cal_l1,12);// calorimeter clusters
1588    
1589    
1590     // ------------------------------------------------
1591     // define iterators over clusters on the same view
1592     // ------------------------------------------------
1593     pair <multimap<int,int>::iterator, multimap<int,int>::iterator> ret[NEXTVIEWS];
1594     multimap<int,int>::iterator it[NEXTVIEWS];
1595     for(int iv=0; iv<NEXTVIEWS; iv++)ret[iv] = clusterMap.equal_range(iv);
1596    
1597    
1598     //====================================================================
1599     // PARAMETERS
1600     //====================================================================
1601     // ------------------------------------------------
1602     // number of points per candidate
1603     // ------------------------------------------------
1604     int nClFixX = _alg_nClFixX; // n.hits required on X view
1605     int nClFixY = _alg_nClFixY; // n.hits required on X view
1606     int nTrackMAX = _alg_nTrackMAX; //
1607     //==================================================
1608     // ------------------------------------------------
1609     // start: one candidate for each cluster
1610     // ------------------------------------------------
1611     //==================================================
1612     if(_debug)cout<<"-------- MINIMAL TRACK-CANDIDATES --------";
1613     if(_debug)cout<<nClFixX<<"X"<<nClFixY<<"Y"<<endl;
1614     for(int iv=0; iv<NEXTVIEWS; iv++){ //loop over all views
1615    
1616     if( !(iv%2) && (int)(0.5*iv) > NEXTVIEWS/2-nClFixX)continue;
1617     if( (iv%2) && (int)(0.5*iv) > NEXTVIEWS/2-nClFixY)continue;
1618    
1619     if(iv >= NEXTVIEWS - _alg_nViewCal )continue; //skip calo hits
1620    
1621     for ( it[iv]=ret[iv].first; it[iv]!=ret[iv].second; ++it[iv]){ //loop over clusters on the view
1622    
1623    
1624    
1625     int icl = it[iv]->second;
1626    
1627     TrkCluster *cluster = _trk_l1->GetCluster(icl);
1628     // cluster->Dump();
1629     int ladder = cluster->GetLadder()-1; //
1630     int plane = cluster->GetPlane()-1;
1631     bool isY = (cluster->view)%2;// F77 1-12 ??
1632     bool isX = !isY;
1633    
1634    
1635     /// TRACKER ==============================================================================
1636     for (int is=0; is<2; is++){ //loop over sensors
1637    
1638     //cout <<endl<< " view "<<iv<<" plane "<<plane<<" cluster "<<icl<<" on sensor "<<is<<endl;
1639    
1640     ExtTrack& t_track = *_extTrack;
1641    
1642     t_track.ResetXY();
1643     for(int ip =0 ; ip<t_track.nplanes; ip++ )t_track.SetZ(ip,_zMech[ip]);
1644     // t_track.Dump();
1645    
1646    
1647     // >>>> insert point
1648     float xmABar[]={0.,0.,0.,0.,0.}; // inizializzare a zero l'angolo, come prima stima per il PFA
1649     float ymABar[]={0.,0.,0.,0.,0.};
1650     float zmAB[]={t_track.zm[plane],0.,0.};//mechanical z-coordinate
1651     EvaluateClusterPosition_Tracker( (isX?icl:-1), (isY?icl:-1), ladder, is, xmABar, ymABar, zmAB);
1652    
1653     if( isX ){
1654     t_track.SetX(plane,xmABar[1],xmABar[2],ymABar[1],ymABar[2],xmABar[4]);
1655     t_track.SetZ(plane,0.5*(zmAB[1]+zmAB[2]));
1656     t_track.SetXGood(plane,icl+1,ladder,is);
1657     // t_track.SetYGood(plane,0,ladder,is);
1658     }
1659     if( isY ){
1660     t_track.SetY(plane,xmABar[1],xmABar[2],ymABar[1],ymABar[2],ymABar[4]);
1661     t_track.SetZ(plane,0.5*(zmAB[1]+zmAB[2]));
1662     t_track.SetYGood(plane,icl+1,ladder,is);
1663     // t_track.SetXGood(plane,0,ladder,is);
1664     }
1665     trackCandidates[mapIndex].insert(pair<int,ExtTrack>(iv, t_track));
1666    
1667     }
1668    
1669    
1670    
1671     }
1672     }
1673    
1674     //==============================================================
1675     // -------------------------------------------------------------
1676     // next: add views to each candidate, up to nClFixX+nClFixY
1677     // -------------------------------------------------------------
1678     //==============================================================
1679     for( ;mapIndex < nClFixX+nClFixY-1 ;++mapIndex){
1680    
1681     trkBegin = trackCandidates[mapIndex].begin();
1682     trkEnd = trackCandidates[mapIndex].end();
1683     if(_debug)cout<<"MAP "<<mapIndex<<" ----------- n.candidates "<<trackCandidates[mapIndex].size()<<endl;
1684    
1685     for( multimap<int,ExtTrack>::iterator trkIter = trkBegin; trkIter!=trkEnd; ++trkIter){
1686    
1687    
1688     ExtTrack trackCand = (*trkIter).second;
1689     int lastView = (*trkIter).first; //last inserted view
1690     bool lastIsTrk = (lastView < NEXTVIEWS - _alg_nViewCal);
1691     int lastPlane = (int)(0.5*lastView);
1692     if(!lastIsTrk)lastPlane =lastView-6;
1693     int lastLadder = trackCand.GetLadder(lastPlane);
1694     int lastSensor = trackCand.GetSensor(lastPlane);
1695    
1696    
1697     // if(_debug)cout<<"MAP "<<mapIndex<<" last v "<<lastView<<" NX "<<trackCand.GetNX()<<" NY "<<trackCand.GetNY()<<endl;
1698    
1699     for(int iv=lastView+1; iv<NEXTVIEWS; iv++){ //loop over next views
1700    
1701     bool isTrk = (iv < NEXTVIEWS - _alg_nViewCal);
1702     bool isX = (iv)%2;
1703     bool isY = !isX;
1704    
1705    
1706     // if( (iv%2) && (int)(0.5*iv) > 6-nClFixX+trackCand.GetNX())continue; //not enough x-view left
1707     // if( !(iv%2) && (int)(0.5*iv) > 6-nClFixY+trackCand.GetNY())continue; //not enough y-view left
1708    
1709     // if( (iv%2) && trackCand.GetNX()==nClFixX )continue;//ok?
1710     // if( !(iv%2) && trackCand.GetNY()==nClFixY )continue;//ok?
1711    
1712     if( isX && trackCand.GetNX()==nClFixX )continue;//ok?
1713     if( isY && trackCand.GetNY()==nClFixY )continue;//ok?
1714    
1715    
1716     if( isX && (int)(0.5*iv) > 6+_alg_nViewCal/2 - nClFixX+trackCand.GetNX())continue; //not enough x-view left
1717     if( isY && (int)(0.5*iv) > 6+(_alg_nViewCal+1)/2 - nClFixY+trackCand.GetNY())continue; //not enough y-view left
1718    
1719    
1720     for ( it[iv]=ret[iv].first; it[iv]!=ret[iv].second; ++it[iv]){ //loop over clusters on the view
1721    
1722     int icl = it[iv]->second;
1723    
1724     if(isTrk){
1725     /// TRACKER ==================================================
1726    
1727    
1728     TrkCluster *cluster = _trk_l1->GetCluster(icl);
1729     int ladder = cluster->GetLadder()-1;//(_trk_l1->GetCluster(icl)->maxs-1)%1024 + 1;
1730     int plane = cluster->GetPlane()-1;
1731     // bool isY = (cluster->view)%2;
1732     // bool isX = !isY;
1733    
1734     if( plane==lastPlane && ladder!=lastLadder)continue;
1735    
1736    
1737     for (int is=0; is<2; is++){ //loop over sensors
1738    
1739     if( plane==lastPlane && is!=lastSensor)continue;
1740    
1741     // if(_debug)cout<<"MAP "<<mapIndex<<" last v "<<lastView;
1742     // if(_debug)cout<<" +cl "<<icl<<" s"<<is<<endl;
1743    
1744     ExtTrack t_track = ExtTrack();
1745     trackCand.Copy(t_track); //copy the candidate parameters...
1746    
1747     bool isXY = (isX && t_track.YGood(plane)) || (isY && t_track.XGood(plane)) ;
1748    
1749    
1750     float xmABar[]={0.,0.,0.,0.,0.}; //importante inizializzare a zero, come prima stima per il PFA
1751     float ymABar[]={0.,0.,0.,0.,0.};
1752     float zmAB[]={t_track.zm[plane],0.,0.};
1753    
1754     if( isX ){
1755     int iclx = icl;
1756     int icly = (isXY ? t_track.GetClusterY_ID(plane) : -1 );
1757    
1758     EvaluateClusterPosition_Tracker( iclx, icly , ladder, is, xmABar, ymABar, zmAB);
1759    
1760     if(isXY){
1761     t_track.SetXY(plane,xmABar[0],ymABar[0],xmABar[4],ymABar[4]);
1762     t_track.SetZ(plane,zmAB[0]);
1763     }else{
1764     t_track.SetX(plane,xmABar[1],xmABar[2],ymABar[1],ymABar[2],xmABar[4]);
1765     t_track.SetZ(plane,0.5*(zmAB[1]+zmAB[2]));
1766     }
1767     t_track.SetXGood(plane,iclx+1,ladder,is); //...add a point...
1768     t_track.SetYGood(plane,icly+1,ladder,is);
1769     }
1770     //
1771     if( isY ){
1772     int iclx = (isXY ? t_track.GetClusterX_ID(plane) : -1 );
1773     int icly = icl;
1774    
1775     EvaluateClusterPosition_Tracker( iclx, icly , ladder, is, xmABar, ymABar, zmAB);
1776    
1777     if(isXY){
1778     t_track.SetXY(plane,xmABar[0],ymABar[0],xmABar[4],ymABar[4]);
1779     t_track.SetZ(plane,zmAB[0]);
1780     }else{
1781     t_track.SetY(plane,xmABar[1],xmABar[2],ymABar[1],ymABar[2],ymABar[4]);
1782     t_track.SetZ(plane,0.5*(zmAB[1]+zmAB[2]));
1783     };
1784     t_track.SetYGood(plane,icly+1,ladder,is);
1785     t_track.SetXGood(plane,iclx+1,ladder,is);
1786     }
1787    
1788     trackCandidates[mapIndex+1].insert(pair<int,ExtTrack>(iv, t_track)); //...and store a new candidate
1789     };//end loop over sensors
1790    
1791     }else{
1792     /// CALORIMETER =================================================
1793     ExtHit cluster = _cal_cl[icl];
1794     int plane = 6 + cluster.view;
1795    
1796     if( plane==lastPlane )continue;
1797    
1798     int ladder = (int)(cluster.coordPU / 32);
1799     int sensor = -1; //not yet known
1800     bool isX = (cluster.view)%2;
1801     bool isY = !isX;
1802    
1803     ExtTrack t_track = ExtTrack();
1804     trackCand.Copy(t_track);
1805    
1806     float xmABar[]={0.,0.,0.,0.,0.}; //importante inizializzare a zero, come prima stima per il PFA
1807     float ymABar[]={0.,0.,0.,0.,0.}; // sensor is not evaluated
1808     float zmAB[]={0.,0.,0.};
1809     EvaluateClusterPosition_Calorimeter( icl, sensor, xmABar, ymABar, zmAB);
1810    
1811    
1812     if( isX ){
1813     t_track.SetX(plane,xmABar[1],xmABar[2],ymABar[1],ymABar[2],xmABar[4]);
1814     t_track.SetZ(plane,0.5*(zmAB[1]+zmAB[2]));
1815     t_track.SetXGood(plane,icl+1, ladder, sensor); //...add a point.
1816     t_track.SetYGood(plane, 0, ladder, sensor); //...add a point...
1817     }
1818     if( isY ){
1819     t_track.SetY(plane,xmABar[1],xmABar[2],ymABar[1],ymABar[2],xmABar[4]);
1820     t_track.SetZ(plane,0.5*(zmAB[1]+zmAB[2]));
1821     t_track.SetYGood(plane,icl+1, ladder, sensor);
1822     t_track.SetXGood(plane, 0, ladder, sensor);
1823     }
1824     trackCandidates[mapIndex+1].insert(pair<int,ExtTrack>(iv, t_track)); //...and store a new ca
1825    
1826     }
1827    
1828 mocchiut 1.3 if( trackCandidates[mapIndex].size() > (uint)nTrackMAX ){ // EM, compilation warning comparison between signed and unsigned
1829 pam-ts 1.2 if(_debug)cout << "n.candidates "<<trackCandidates[mapIndex].size()<<" > "<<nTrackMAX<<endl;
1830     return;//to many candidates
1831     }
1832    
1833     };//end loop over clusters on the view iv
1834     };//endl loop over views
1835     }//end loop over candidates
1836     }//end iterations
1837    
1838    
1839     // if( trackCandidates[mapIndex].size() > nTrakMAX ){
1840     // if(_debug)cout << "n.candidates "<<trackCandidates[mapIndex].size()<<" > "<<nTrackMAX<<endl;
1841     // return;//to many candidates
1842     // }
1843    
1844     // if(_debug){
1845     // trkBegin = trackCandidates[mapIndex].begin();
1846     // trkEnd = trackCandidates[mapIndex].end();
1847     // for( multimap<int,ExtTrack>::iterator trkIter = trkBegin; trkIter!=trkEnd; ++trkIter){
1848     // ExtTrack &trackCand = (*trkIter).second;
1849     // cout << " >> ";
1850     // cout << " X: ";
1851     // for(int ip=0; ip<NEXTPLANES; ip++)cout << (trackCand.XGood(ip) ? "o" : "-");
1852     // cout << " Y: ";
1853     // for(int ip=0; ip<NEXTPLANES; ip++)cout << (trackCand.YGood(ip) ? "o" : "-");
1854    
1855     // cout << endl;
1856     // }
1857     // }
1858    
1859     if(_debug)cout<<"MAP "<<mapIndex<<" ----------- n.candidates "<<trackCandidates[mapIndex].size()<<endl;
1860    
1861     if(_debug)cout << "n.candidates "<<trackCandidates[mapIndex].size()<<endl;
1862    
1863     if(trackCandidates[mapIndex].size()==0)return;//no good candidates
1864    
1865     //===============================================================================================
1866     // -------------------------------------------------------------
1867     // first selection of track candidates, based on chi2
1868     // -------------------------------------------------------------
1869     //===============================================================================================
1870     if(_debug)cout<<"-------- CHI2 --------"<<endl;
1871     trkBegin = trackCandidates[mapIndex].begin();
1872     trkEnd = trackCandidates[mapIndex].end();
1873     mapIndex++;
1874     iCand = 0;
1875     for( multimap<int,ExtTrack>::iterator trkIter = trkBegin; trkIter!=trkEnd; ++trkIter){
1876     int lastView = (*trkIter).first;
1877     ExtTrack &trackCand = (*trkIter).second;
1878     int ifail=0;
1879     trackCand.ResetFit();
1880     trackCand.Fit(0.,ifail,0);
1881     if(ifail!=0)trackCand.ResetFit();
1882    
1883     // -----------------------------------
1884     // first selection of track candidates
1885     // -----------------------------------
1886     if(TMath::IsNaN(trackCand.chi2))continue;
1887     if(trackCand.chi2 <= 0. || trackCand.chi2 > 1.e7)continue;
1888     // if(trackCand.chi2 < 0. || trackCand.chi2 > 10. )continue;
1889     iCand++;
1890    
1891     if(_debug){
1892     cout<< " TRK chi2 "<<setw(13)<<trackCand.chi2;
1893     cout <<" | al: ";
1894     for(int i=0; i<5; i++)cout <<setw(10)<< trackCand.al[i];
1895     cout <<" | ";
1896     cout << " X: ";
1897     for(int ip=0; ip<NEXTPLANES; ip++)cout << (trackCand.XGood(ip) ? "o" : "-");
1898     // for(int ip=0; ip<trackCand.nplanes; ip++)
1899     // if(trackCand.GetClusterX_ID(ip)>=0)cout << trackCand.GetClusterX_ID(ip)<<":"<<trackCand.GetSensor(ip)<<"|";
1900     cout << " | ";
1901     cout << " Y: ";
1902     for(int ip=0; ip<NEXTPLANES; ip++)cout << (trackCand.YGood(ip) ? "o" : "-");
1903     cout << endl;
1904     // for(int ip=0; ip<trackCand.nplanes; ip++)
1905     // if(trackCand.GetClusterY_ID(ip)>=0)cout << trackCand.GetClusterY_ID(ip)<<":"<<trackCand.GetSensor(ip)<<"|"; cout << endl;
1906     }
1907    
1908     // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1909     // evaluated coordinates (to define GF)
1910     // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1911     // int ngf = TrkParams::nGF;
1912     // float *zgf = TrkParams::zGF;
1913     // Trajectory tgf = Trajectory(ngf,zgf);
1914     // _tgf->DoTrack(trackCand.al);//<<<< integrate the trajectory
1915     // for(int ip=0; ip<ngf; ip++){
1916     // trackCand.xGF[ip] = tgf->x[ip];
1917     // trackCand.yGF[ip] = tgf->y[ip];
1918     // }
1919    
1920     trackCandidates[mapIndex].insert(pair<int,ExtTrack>(lastView, trackCand));
1921    
1922     }
1923     if(trackCandidates[mapIndex].size()==0)return;//no good candidates
1924    
1925     if(_debug)cout << "n.candidates "<<trackCandidates[mapIndex].size()<<endl;
1926     //=================================================================
1927     // ----------------------------------------------------------------
1928     // CALORIMETER
1929     // ----------------------------------------------------------------
1930     //=================================================================
1931     if(_cal_l1){
1932     if(_debug)cout<<"-------- CALORIMETER --------"<<endl;
1933     // -----------------------------------
1934     // evaluate calorimeter variables
1935     // -----------------------------------
1936     // float caloCoord[2][22][96];
1937     // float caloZ[44];
1938     // for(int view=0; view<2; view++){
1939     // for(int plane=0; plane<22; plane++){
1940     // for(int strip=0; strip<96; strip++){
1941     // CaloStrip st = CaloStrip(false);
1942     // st.Set(view,plane,strip);
1943     // caloCoord[view][plane][strip]=(view ? st.GetY() : st.GetX());
1944     // caloZ[plane*2+(view?0:1)]=st.GetZ();
1945     // }
1946     // }
1947     // }
1948     // Trajectory caloTj = Trajectory(44,caloZ);
1949     // for(int iz=0; iz<44;iz++)cout<<caloZ[iz]<<endl;
1950     //test calo
1951     // float caloEvent[2][22][96];
1952     CaloLevel1* l1=_cal_l1;//event->GetCaloLevel1();
1953     // if(!l1)return;
1954     vector<float> caloChi2;
1955     vector<int> caloHit; int caloHitMAX=0;
1956     vector<float> caloMip;
1957     trkBegin = trackCandidates[mapIndex].begin();
1958     trkEnd = trackCandidates[mapIndex].end();
1959     for( multimap<int,ExtTrack>::iterator trkIter = trkBegin; trkIter!=trkEnd; ++trkIter){
1960     ExtTrack trackCand = ((*trkIter).second);
1961    
1962     // trackCand.DoTrack(&caloTj);//integrate the trajectory through the calorimeter
1963     _caloTj->DoTrack(trackCand.al,trackCand.zini);
1964     // _caloTj->Dump();
1965    
1966     float chi2 = 0.;
1967     int nhit = 0;
1968     float cmip = 0.;
1969     for(Int_t ih=0; ih<l1->istrip; ih++){
1970     Int_t view = -1;
1971     Int_t plane = -1;
1972     Int_t strip = -1;
1973     Float_t mip = l1->DecodeEstrip(ih,view,plane,strip);
1974     if(view<0)continue;
1975     if(plane<0)continue;
1976     if(strip<0)continue;
1977     if(mip<=0)continue;
1978     float dxy = _caloCoord[view][plane][strip]-(view?_caloTj->y[plane*2+(view?0:1)]:_caloTj->x[plane*2+(view?0:1)]);
1979     if(plane<11) chi2+= mip * TMath::Power(dxy,2.);
1980     // caloZ[plane*2+(view?0:1)]=st.GetZ();
1981     if( fabs(dxy) < 2. && plane<11)nhit++;
1982     if( fabs(dxy) < 2. && plane<11)cmip+=mip;
1983     };
1984     if(l1->istrip>0)chi2 = chi2/l1->istrip;
1985    
1986     caloHit.push_back(nhit);
1987     if(nhit>caloHitMAX)caloHitMAX=nhit;
1988    
1989     if(_debug){
1990     cout << " CALO ";
1991     // cout << " chi2 "<< chi2 <<" ";
1992     cout << " nhit (< 11th plane) "<< nhit <<" ";
1993     // cout << " mip "<< cmip <<" ";
1994     cout <<endl;
1995     };
1996     }
1997    
1998    
1999     //=================================================================
2000     // ----------------------------------------------------------------
2001     // selection of track candidates, based on n.calorimeter hits
2002     // ----------------------------------------------------------------
2003     //=================================================================
2004     trkBegin = trackCandidates[mapIndex].begin();
2005     trkEnd = trackCandidates[mapIndex].end();
2006     mapIndex++;
2007     iCand = 0;
2008     for( multimap<int,ExtTrack>::iterator trkIter = trkBegin; trkIter!=trkEnd; ++trkIter){
2009     int lastView = (*trkIter).first;
2010     ExtTrack &trackCand = (*trkIter).second;
2011     if(caloHit[iCand]==caloHitMAX)trackCandidates[mapIndex].insert(pair<int,ExtTrack>(lastView, trackCand));
2012     iCand++;
2013     }
2014     if(trackCandidates[mapIndex].size()==0)return;//no good candidates
2015     if(_debug)cout << "n.candidates "<<trackCandidates[mapIndex].size()<<endl;
2016    
2017     }
2018    
2019    
2020     //=================================================================
2021     // ----------------------------------------------------------------
2022     // TOF
2023     // ----------------------------------------------------------------
2024     //=================================================================
2025     if(_tof_l2){
2026     if(_debug)cout<<"-------- TOF --------"<<endl;
2027     trkBegin = trackCandidates[mapIndex].begin();
2028     trkEnd = trackCandidates[mapIndex].end();
2029     ToFLevel2* tl2=_tof_l2;//event->GetToFLevel2();
2030     // if(!tl2)return;
2031     iCand =0;
2032     vector<int> tofHit; int tofHitMAX=0;
2033     for( multimap<int,ExtTrack>::iterator trkIter = trkBegin; trkIter!=trkEnd; ++trkIter){
2034     // int lastView = (*trkIter).first;
2035     ExtTrack &trackCand = (*trkIter).second;
2036    
2037     _tgf->DoTrack(trackCand.al);//<<<< integrate the trajectory
2038    
2039     for(int ip=0; ip<TrkParams::nGF; ip++){
2040     trackCand.xGF[ip] = _tgf->x[ip];
2041     trackCand.yGF[ip] = _tgf->y[ip];
2042     }
2043    
2044     int nhit =0;
2045     for(int iToF=0; iToF<6; iToF++){
2046    
2047     int iGF = iToF;
2048     if(iToF>3)iGF = iToF+8;
2049     int iPaddle = tl2->GetPaddleIdOfTrack( trackCand.xGF[iGF], trackCand.yGF[iGF], iToF);
2050     if( tl2->HitPaddle(iToF,iPaddle) )nhit++;
2051    
2052     }
2053     iCand++;
2054    
2055     tofHit.push_back(nhit);
2056     if(nhit>tofHitMAX)tofHitMAX=nhit;
2057    
2058     if(_debug){
2059     cout << " TOF nhit "<< nhit <<" ";
2060     cout <<endl;
2061     }
2062    
2063     }
2064     //=================================================================
2065     // ----------------------------------------------------------------
2066     // selection of track candidates, based on n.tof hits
2067     // ----------------------------------------------------------------
2068     //=================================================================
2069     trkBegin = trackCandidates[mapIndex].begin();
2070     trkEnd = trackCandidates[mapIndex].end();
2071     mapIndex++;
2072     iCand = 0;
2073     for( multimap<int,ExtTrack>::iterator trkIter = trkBegin; trkIter!=trkEnd; ++trkIter){
2074     int lastView = (*trkIter).first;
2075     ExtTrack &trackCand = (*trkIter).second;
2076     if(tofHit[iCand]==tofHitMAX)trackCandidates[mapIndex].insert(pair<int,ExtTrack>(lastView, ExtTrack(trackCand)));
2077     iCand++;
2078    
2079     }
2080     if(_debug)cout << "n.candidates "<<trackCandidates[mapIndex].size()<<endl;
2081     if(trackCandidates[mapIndex].size()==0)return;//no good candidates
2082    
2083     }
2084    
2085     if(_debug){
2086    
2087     cout<< " Minimal-track SUMMARY:"<<endl;
2088    
2089     trkBegin = trackCandidates[mapIndex].begin();
2090     trkEnd = trackCandidates[mapIndex].end();
2091     for( multimap<int,ExtTrack>::iterator trkIter = trkBegin; trkIter!=trkEnd; ++trkIter){
2092     ExtTrack &trackCand = (*trkIter).second;
2093     cout<< " TRK chi2 "<<setw(13)<<trackCand.chi2;
2094     cout <<" | al: ";
2095     for(int i=0; i<5; i++)cout <<setw(10)<< trackCand.al[i];
2096     cout <<" | ";
2097     cout << " X: ";
2098     // for(int ip=0; ip<NEXTPLANES; ip++)cout << (trackCand.XGood(ip) ? "o" : "-");
2099     for(int ip=0; ip<trackCand.nplanes; ip++){
2100     if(trackCand.GetClusterX_ID(ip)>=0)
2101     cout << setw(2)<<trackCand.GetClusterX_ID(ip);
2102     else
2103     cout << "__";
2104     }
2105     cout << " | ";
2106     cout << " Y: ";
2107     // for(int ip=0; ip<NEXTPLANES; ip++)cout << (trackCand.YGood(ip) ? "o" : "-");
2108     for(int ip=0; ip<trackCand.nplanes; ip++){
2109     if(trackCand.GetClusterY_ID(ip)>=0)
2110     cout << setw(2)<<trackCand.GetClusterY_ID(ip);
2111     else
2112     cout << "__";
2113     }
2114     cout << " S:";for(int ip=0; ip<trackCand.nplanes; ip++)cout<< trackCand.GetSensor(ip)+1;
2115     cout << endl;
2116    
2117     }
2118     }
2119    
2120     //=================================================================
2121     // ----------------------------------------------------------------
2122     // TRACK MERGING
2123     // ----------------------------------------------------------------
2124     //=================================================================
2125     if(_debug)cout<<"-------- MERGING --------";
2126     trkBegin = trackCandidates[mapIndex].begin();
2127     trkEnd = trackCandidates[mapIndex].end();
2128     mapIndex++;
2129     float chi2Min=1e10;
2130     iCand = 0;
2131     for( multimap<int,ExtTrack>::iterator trkIter1 = trkBegin; trkIter1!=trkEnd; ++trkIter1){ //loop over tracks (1)
2132    
2133     ExtTrack &trackCand1 = (*trkIter1).second;// get candidate 1...
2134    
2135     ExtTrack t_track = ExtTrack();// ...create a new ExtTrack instance...
2136     trackCand1.Copy(t_track); // ...and make a copy
2137    
2138     bool HBM = false; //has been merged
2139    
2140     for( multimap<int,ExtTrack>::iterator trkIter2 = trkBegin; trkIter2!=trkEnd; ++trkIter2){//loop over tracks (2)
2141    
2142     ExtTrack &trackCand2 = (*trkIter2).second; // get candidate 2...
2143    
2144     bool CBM = true;
2145     for(int ip=0; ip<NEXTPLANES; ip++){ //loop over planes
2146     if( t_track.XGood(ip) &&
2147     trackCand2.XGood(ip) &&
2148     ( t_track.GetClusterX_ID(ip)!=trackCand2.GetClusterX_ID(ip) || t_track.GetSensor(ip)!=trackCand2.GetSensor(ip) ) &&
2149     true )CBM=false; // if both have a x-hit and it is not the same ---> they cannot be merged
2150     if(!CBM)break;
2151     if( t_track.YGood(ip) &&
2152     trackCand2.YGood(ip) &&
2153     ( t_track.GetClusterY_ID(ip)!=trackCand2.GetClusterY_ID(ip) || t_track.GetSensor(ip)!=trackCand2.GetSensor(ip) ) &&
2154     true )CBM=false; // if both have a y-hit and it is not the same ---> they cannot be merged
2155     if(!CBM)break;
2156     }
2157     // if(_debug)cout << " can be merged ? "<<CBM<<endl;
2158     if(!CBM)continue; //go to the next candidate
2159     ///////////
2160     //merging//
2161     ///////////
2162     // cout <<endl<<" check merging al (1) ";
2163     // for(int i=0; i<5; i++)cout <<setw(10)<< t_track.al[i];
2164     // cout <<endl<<" with al (2) ";
2165     // for(int i=0; i<5; i++)cout <<setw(10)<< trackCand2.al[i];
2166    
2167     for(int ip=0; ip<NEXTPLANES; ip++){
2168     if( !(t_track.XGood(ip)) && trackCand2.XGood(ip) ){
2169     int ygood_temp = t_track.ygood[ip];
2170    
2171     if(t_track.YGood(ip)){
2172     t_track.SetXY(ip,trackCand2.xm[ip],t_track.ym[ip],trackCand2.resx[ip],t_track.resy[ip]);
2173     // cout<<"confronta "<<trackCand2.zm[ip]<<" - "<<t_track.zm[ip]<<" = "<<trackCand2.zm[ip]-t_track.zm[ip]<<endl;
2174     }else{
2175     t_track.SetX(ip,trackCand2.xma[ip],trackCand2.xmb[ip],trackCand2.yma[ip],trackCand2.ymb[ip],trackCand2.resx[ip]);
2176     t_track.SetZ(ip,0.5*(trackCand2.zma[ip]+trackCand2.zmb[ip]));
2177     }
2178     t_track.xgood[ip] = trackCand2.xgood[ip];//assign cluster + sensor
2179     t_track.ygood[ip] = ygood_temp;//assign cluster + sensor
2180    
2181     HBM = true;
2182     }
2183     if( !(t_track.YGood(ip)) && trackCand2.YGood(ip) ) {
2184    
2185     int xgood_temp = t_track.xgood[ip];
2186    
2187     if(t_track.XGood(ip)){
2188     t_track.SetXY(ip,t_track.xm[ip],trackCand2.ym[ip],t_track.resx[ip],trackCand2.resy[ip]);
2189     // cout<<"confronta "<<trackCand2.zm[ip]<<" - "<<t_track.zm[ip]<<" = "<<trackCand2.zm[ip]-t_track.zm[ip]<<endl;
2190     }else{
2191     t_track.SetY(ip,trackCand2.xma[ip],trackCand2.xmb[ip],trackCand2.yma[ip],trackCand2.ymb[ip],trackCand2.resy[ip]);
2192     t_track.SetZ(ip,0.5*(trackCand2.zma[ip]+trackCand2.zmb[ip]));
2193     }
2194     t_track.ygood[ip] = trackCand2.ygood[ip];//assign cluster + sensor
2195     t_track.xgood[ip] = xgood_temp;//assign cluster + sensor
2196     HBM = true;
2197     }
2198     };
2199    
2200     }//end loop over tracks (2)
2201    
2202    
2203     // cout << "<< ";
2204     // for(int ip=0; ip<6; ip++) cout <<setw(4)<< t_track.GetClusterX_ID(ip);
2205     // for(int ip=0; ip<6; ip++) cout <<setw(4)<< t_track.GetClusterY_ID(ip);
2206     // cout << endl;
2207     // cout<< " TRK chi2 "<<setw(10)<<t_track.chi2;
2208     // cout <<" | al ";
2209     // for(int i=0; i<5; i++)cout <<setw(10)<< t_track.al[i];
2210     // cout << endl;
2211    
2212     ///////////////////////////////////////////////////////// FIT START
2213     // int ifail=0;
2214     // // TrkParams::SetDebugMode();
2215     // t_track.FitReset(); //angles set to zero
2216     // t_track.Fit(0.,ifail,0,1);//re-evaluate cluster position from level1
2217     // if( TMath::IsNaN(t_track.chi2) )continue;
2218     // if( ifail != 0 )continue;
2219     // t_track.Fit(0.,ifail,0,1);//evaluate again taking into account the track angle
2220     // if( TMath::IsNaN(t_track.chi2) )continue;
2221     // if( ifail != 0 )continue;
2222     ///////////////////////////////////////////////////////// FIT FINISH
2223     // cout << "Merged: "<<endl;
2224     // cout << "X "; for(int ip=0; ip<6; ip++)cout << t_track.XGood(ip); cout << endl;
2225     // cout << "Y "; for(int ip=0; ip<6; ip++)cout << t_track.YGood(ip); cout << endl;
2226     //
2227     //check if track has been already inserted
2228     //
2229     multimap<int,ExtTrack>::iterator trkB = trackCandidates[mapIndex].begin();
2230     multimap<int,ExtTrack>::iterator trkE = trackCandidates[mapIndex].end();
2231     //
2232     bool ADD = true;
2233     for( multimap<int,ExtTrack>::iterator trkI = trkB; trkI!=trkE; ++trkI){
2234     ExtTrack &trackC = (*trkI).second;
2235     bool SAME=true;
2236     for(int ip=0; ip<NEXTPLANES; ip++){
2237     bool isTrk = (ip < NEXTPLANES - _alg_nViewCal);
2238     if( t_track.GetClusterX_ID(ip) != trackC.GetClusterX_ID(ip) )SAME=false;
2239     if( t_track.GetClusterY_ID(ip) != trackC.GetClusterY_ID(ip) )SAME=false;
2240     if( isTrk && t_track.GetSensor(ip) != trackC.GetSensor(ip) )SAME=false;
2241     }
2242     if(SAME){
2243     ADD=false;
2244     break;
2245     }
2246     }
2247     // if(_debug)cout <<" ADD ? "<<ADD<<endl;
2248    
2249     // cout << "-----> INSERT "<<endl;
2250     if(_debug){
2251    
2252     cout << endl;
2253     cout<< " TRK chi2 "<<setw(13)<<t_track.chi2;
2254     cout <<" | al: ";
2255     for(int i=0; i<5; i++)cout <<setw(10)<< t_track.al[i];
2256     cout <<" | ";
2257     cout << " X: ";
2258     // for(int ip=0; ip<NEXTPLANES; ip++)cout << (t_track.XGood(ip) ? "o" : "-");
2259     for(int ip=0; ip<t_track.nplanes; ip++){
2260     if(t_track.GetClusterX_ID(ip)>=0)
2261     cout << setw(2)<<t_track.GetClusterX_ID(ip);
2262     else
2263     cout << "__";
2264     }
2265     cout << " | ";
2266     cout << " Y: ";
2267     // for(int ip=0; ip<NEXTPLANES; ip++)cout << (t_track.YGood(ip) ? "o" : "-");
2268     for(int ip=0; ip<t_track.nplanes; ip++){
2269     if(t_track.GetClusterY_ID(ip)>=0)
2270     cout << setw(2)<<t_track.GetClusterY_ID(ip);
2271     else
2272     cout << "__";
2273     }
2274     cout << " S:";for(int ip=0; ip<t_track.nplanes; ip++)cout<< t_track.GetSensor(ip)+1;
2275     if(HBM)cout << " >> Merged";
2276    
2277     }
2278    
2279    
2280     if(ADD){
2281    
2282     // cout << " >> re-evaluate...";
2283     // ///////////////////////////////////////////////////////// FIT START
2284     int ifail=0;
2285     t_track.ResetFit();
2286     // t_track.Dump();
2287     t_track.Fit(0.,ifail,0);//
2288     if( ifail != 0 || TMath::IsNaN(t_track.chi2) ){
2289     // if(_debug){
2290     // t_track.ResetFit();
2291     // t_track.Fit(0.,ifail,2);//
2292     // }
2293     continue;
2294     }
2295    
2296     // t_track.Fit(0.,ifail,0,1);//evaluate again taking into account the track angle
2297     // if( TMath::IsNaN(t_track.chi2) )continue;
2298     // if( ifail != 0 )continue;
2299     // ///////////////////////////////////////////////////////// FIT FINISH
2300    
2301    
2302    
2303     // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
2304     // re-evaluated coordinates
2305     // and
2306     // evaluated other track info
2307     // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
2308 mocchiut 1.3 // float VMS[22];VMS[0]=0.; // EM, 2245:13: warning: variable ?VMS? set but not used [-Wunused-but-set-variable]
2309 pam-ts 1.2 for(int ip=0; ip<NEXTPLANES; ip++){
2310    
2311     if(!t_track.XGood(ip)&&!t_track.YGood(ip))continue;
2312    
2313     int iclx = t_track.GetClusterX_ID(ip);
2314     int icly = t_track.GetClusterY_ID(ip);
2315     int ladder = t_track.GetLadder(ip);//ok
2316     int sensor = t_track.GetSensor(ip);// not yet assigned for calo
2317    
2318     bool isTrk = (ip < NEXTPLANES - _alg_nViewCal);
2319     bool isXY = t_track.XGood(ip)*t_track.YGood(ip);
2320     bool isX = t_track.XGood(ip) && !isXY;
2321     bool isY = t_track.YGood(ip) && !isXY;
2322    
2323     // cout <<endl<< ip << " xgood "<<t_track.xgood[ip]<<" ygood "<<t_track.ygood[ip];
2324     // cout <<endl<< ip << " iclx "<<iclx<<" icly "<<icly;
2325    
2326     // continue;
2327     //=========================================
2328     // evaluate angular factor
2329     //=========================================
2330     float factor = 0.;
2331     factor += TMath::Power(TMath::Tan(TMath::ACos(-1)*t_track.axv[ip]/180.),2);
2332     factor += TMath::Power(TMath::Tan(TMath::ACos(-1)*t_track.ayv[ip]/180.),2);
2333     factor += 1.;
2334     factor = TMath::Sqrt(factor);
2335     // factor = 1.;///TEMP
2336    
2337    
2338     //=========================================
2339     // re-evaluate coordinates
2340     //=========================================
2341     float xmABar[]={t_track.xv[ip],0.,0.,t_track.axv[ip],0.};//importante passare gli angoli e la coordinata!!
2342     float ymABar[]={t_track.yv[ip],0.,0.,t_track.ayv[ip],0.};//importante passare gli angoli e la coordinata!!
2343     float zmAB[]={t_track.zv[ip],0.,0.};
2344    
2345     if(isTrk){
2346     EvaluateClusterPosition_Tracker( iclx, icly, ladder, sensor, xmABar, ymABar, zmAB);
2347     }else{
2348     EvaluateClusterPosition_Calorimeter( (int)fmax((float)iclx,(float)icly), sensor, xmABar, ymABar, zmAB, t_track.al[4]);
2349     // now the hiyt sensor is assigned
2350     }
2351     if(isXY){
2352     t_track.SetXY(ip,xmABar[0],ymABar[0],xmABar[4],ymABar[4]);
2353     t_track.SetZ(ip,zmAB[0]);
2354     }
2355     if(isX ){
2356     t_track.SetX( ip,xmABar[1],xmABar[2],ymABar[1],ymABar[2],xmABar[4]);
2357     t_track.SetZ(ip,0.5*(zmAB[1]+zmAB[2]));
2358     }
2359     if(isY ){
2360     t_track.SetY( ip,xmABar[1],xmABar[2],ymABar[1],ymABar[2],ymABar[4]);
2361     t_track.SetZ(ip,0.5*(zmAB[1]+zmAB[2]));
2362     }
2363    
2364     t_track.SetXGood(ip,(sensor == -1 ? 0 : iclx+1),ladder,sensor);
2365     t_track.SetYGood(ip,(sensor == -1 ? 0 : icly+1),ladder,sensor);
2366    
2367     //=========================================
2368     // re-evaluate resolution (calorimeter only)
2369     // taking into account multiple scattering
2370     //=========================================
2371     // if(!isTrk && ip > NEXTPLANES - _alg_nViewCal){
2372     // int nW = (int)((ip - 6 + 1)/2);
2373     // float dW = 0.74*factor;//X0
2374     // float dW_cm = 0.26*factor;//cm
2375     // float dSi_cm = 0.; //cm
2376     // if(isY) dSi_cm = ( ip%2 ? 0.228 : 0.428);
2377     // dSi_cm *= factor;
2378     // float theta = 0.;
2379     // if(t_track.GetRigidity()!=0.)theta = 0.0136/t_track.GetRigidity();
2380     // theta = theta * sqrt(dW) * (1.+0.038*log(dW));
2381     // float Vt = theta*theta; //cov(theta,theta)
2382     // float Vy = Vt * dW_cm * dW_cm /3.; //cov(y,y)
2383     // float Vty = 0.87 * Vt * Vy; //cov(theta,y)
2384     // float Vc = Vy + dSi_cm * dSi_cm * Vt + 2. * dSi_cm * Vty;
2385     // float rms = sqrt( Vc + (nW>0 ? VMS[nW-1] : 0.) );
2386     // if(_debug)cout <<endl<< ip<<" nW "<<nW<<" res(MS) "<<rms;
2387     // if(isY)t_track.resy[ip] = sqrt(rms*rms + t_track.resy[ip]*t_track.resy[ip]);
2388     // else t_track.resx[ip] = sqrt(rms*rms + t_track.resx[ip]*t_track.resx[ip]);
2389     // if(isY) VMS[nW] = rms*rms;
2390     // }
2391    
2392     //=========================================
2393     // evaluate other quantities
2394     //=========================================
2395     float smip,multmax;
2396     if(t_track.XGood(ip)){
2397     if(isTrk){
2398     TrkCluster *cluster = _trk_l1->GetCluster(iclx);
2399     float mip = TrkParams::GetMIP(cluster->GetLadder()-1,cluster->view-1);
2400     smip = cluster->GetSignal()/(mip>0.?mip:1.);
2401     multmax = cluster->GetMultiplicity()*10000+cluster->maxs;
2402     }else{
2403     ExtHit cluster = _cal_cl[iclx];
2404     smip = cluster.signal;//mip
2405     multmax = cluster.mult*10000+lrint(cluster.coordPU);
2406     }
2407     t_track.dedx_x[ip] = smip/(factor>0.?factor:1.);
2408     t_track.multmaxx[ip] = multmax;
2409     }
2410     if(t_track.YGood(ip)){
2411     if(isTrk){
2412     TrkCluster *cluster = _trk_l1->GetCluster(icly);
2413     float mip = TrkParams::GetMIP(cluster->GetLadder()-1,cluster->view-1);
2414     smip = cluster->GetSignal()/(mip>0.?mip:1.);
2415     multmax = cluster->GetMultiplicity()*10000+cluster->maxs;
2416     }else{
2417     ExtHit cluster = _cal_cl[icly];
2418     smip = cluster.signal;//mip
2419     multmax = cluster.mult*10000+lrint(cluster.coordPU);
2420     }
2421     t_track.dedx_y[ip] = smip/(factor>0.?factor:1.);
2422     t_track.multmaxy[ip] = multmax;
2423     }
2424     }
2425     ///////////////////////////////////////////////////////// end additional info
2426    
2427    
2428    
2429    
2430     // ///////////////////////////////////////////////////////// RE-FIT START
2431     t_track.Fit(0.,ifail,0);//evaluate again taking into account the track angle
2432     if( TMath::IsNaN(t_track.chi2) )continue;
2433     if( ifail != 0 )continue;
2434     // ///////////////////////////////////////////////////////// RE-FIT FINISH
2435     if(_debug){
2436     // cout << endl;
2437     // cout << " >> al: ";for(int i=0; i<5; i++)cout <<setw(10)<< t_track.al[i];
2438     // cout << " chi2: "<<setw(10)<< t_track.chi2;
2439     // cout << endl;
2440     cout << endl;
2441     // cout << " >> al: ";for(int i=0; i<5; i++)cout <<setw(10)<< t_track.al[i];
2442     // cout << " chi2: "<<setw(10)<< t_track.chi2;
2443     // // cout << endl;
2444     cout<< " TRK chi2 "<<setw(13)<<t_track.chi2;
2445     cout <<" | al: ";
2446     for(int i=0; i<5; i++)cout <<setw(10)<< t_track.al[i];
2447     cout <<" | ";
2448     cout << " X: ";
2449     // for(int ip=0; ip<NEXTPLANES; ip++)cout << (t_track.XGood(ip) ? "o" : "-");
2450     for(int ip=0; ip<t_track.nplanes; ip++){
2451     if(t_track.GetClusterX_ID(ip)>=0)
2452     cout << setw(2)<<t_track.GetClusterX_ID(ip);
2453     else
2454     cout << "__";
2455     }
2456     cout << " | ";
2457     cout << " Y: ";
2458     // for(int ip=0; ip<NEXTPLANES; ip++)cout << (t_track.YGood(ip) ? "o" : "-");
2459     for(int ip=0; ip<t_track.nplanes; ip++){
2460     if(t_track.GetClusterY_ID(ip)>=0)
2461     cout << setw(2)<<t_track.GetClusterY_ID(ip);
2462     else
2463     cout << "__";
2464     }
2465     cout << " S:";for(int ip=0; ip<t_track.nplanes; ip++)cout<< t_track.GetSensor(ip)+1;
2466     cout << " >> ADD ";
2467     }
2468    
2469     _caloTj->DoTrack(t_track.al,t_track.zini);
2470     for(int ip=0; ip<_caloTj->npoint; ip++){
2471     t_track.xGF[ip] = _caloTj->x[ip];
2472     t_track.yGF[ip] = _caloTj->y[ip];
2473     }
2474    
2475     // cout << "ADD "<<endl;
2476     trackCandidates[mapIndex].insert(pair<int,ExtTrack>(t_track.GetNX()+t_track.GetNY(), ExtTrack(t_track)));
2477     if(t_track.GetNX()+t_track.GetNY()>5 && t_track.chi2<chi2Min) chi2Min=t_track.chi2;
2478     iCand++;
2479     }//end add-candidate condition
2480    
2481     }//end first loop on candidates
2482     if(_debug)cout <<endl<< "n.candidates "<<trackCandidates[mapIndex].size()<<endl;
2483    
2484     // cout << "CHI2 min "<<chi2Min<<endl;
2485     //=================================================================
2486     // ----------------------------------------------------------------
2487     // chi2 selection
2488     // ----------------------------------------------------------------
2489     //=================================================================
2490     pair <multimap<int,ExtTrack>::iterator, multimap<int,ExtTrack>::iterator> nxny[NEXTVIEWS];
2491     // for(int inxny=0; inxny<NEXTVIEWS; inxny++){
2492     bool NMTI =false;//not-minimal track inserted
2493     for(int inxny=NEXTVIEWS-1; inxny>=nClFixX+nClFixY; inxny--){
2494     nxny[inxny] = trackCandidates[mapIndex].equal_range(inxny);
2495     // cout << " --- n "<<inxny<<endl;
2496     for ( multimap<int,ExtTrack>::iterator it = nxny[inxny].first; it!=nxny[inxny].second; ++it){
2497     ExtTrack &trackC = (*it).second;
2498     // cout << " NX+NY "<< trackC.GetNX()+trackC.GetNY() <<" chi2 "<<trackC.chi2<< " R(GV) "<<trackC.GetRigidity()<<endl;
2499     // if( trackC.chi2==0 )continue;
2500     if( (trackC.GetNX()+trackC.GetNY() > 5 && trackC.chi2>chi2Min ) ||
2501     (trackC.GetNX()+trackC.GetNY() == 5 && NMTI ) ||
2502     false)continue;
2503    
2504     trackCandidates[mapIndex+1].insert(pair<int,ExtTrack>(inxny, ExtTrack(trackC)));
2505     // cout << " insert "<<endl;
2506    
2507     if( trackC.GetNX()+trackC.GetNY() > 5 )NMTI=true;
2508     }
2509     }
2510     mapIndex++;
2511    
2512     // if(_debug)cout << "n.candidates "<<trackCandidates[mapIndex].size()<<endl;
2513    
2514     if(trackCandidates[mapIndex].size()==0)return;//no good candidates
2515    
2516     if(_debug){
2517    
2518     cout<< " Selected-track SUMMARY:"<<endl;
2519    
2520     trkBegin = trackCandidates[mapIndex].begin();
2521     trkEnd = trackCandidates[mapIndex].end();
2522     for( multimap<int,ExtTrack>::iterator trkIter = trkBegin; trkIter!=trkEnd; ++trkIter){
2523     ExtTrack &trackCand = (*trkIter).second;
2524     cout<< " TRK chi2 "<<setw(13)<<trackCand.chi2;
2525     cout <<" | al: ";
2526     for(int i=0; i<5; i++)cout <<setw(10)<< trackCand.al[i];
2527     cout <<" | ";
2528     cout << " X: ";
2529     // for(int ip=0; ip<NEXTPLANES; ip++)cout << (trackCand.XGood(ip) ? "o" : "-");
2530     for(int ip=0; ip<trackCand.nplanes; ip++){
2531     if(trackCand.GetClusterX_ID(ip)>=0)
2532     cout << setw(2)<<trackCand.GetClusterX_ID(ip);
2533     else
2534     cout << "__";
2535     }
2536     cout << " | ";
2537     cout << " Y: ";
2538     // for(int ip=0; ip<NEXTPLANES; ip++)cout << (trackCand.YGood(ip) ? "o" : "-");
2539     for(int ip=0; ip<trackCand.nplanes; ip++){
2540     if(trackCand.GetClusterY_ID(ip)>=0)
2541     cout << setw(2)<<trackCand.GetClusterY_ID(ip);
2542     else
2543     cout << "__";
2544     }
2545     cout << " S:";for(int ip=0; ip<trackCand.nplanes; ip++)cout<< trackCand.GetSensor(ip)+1;
2546     cout <<" MDR="<<1./sqrt(trackCand.coval[4][4])<<endl;
2547     cout << endl;
2548     // for(int ip=0; ip<trackCand.nplanes; ip++)
2549     // if(trackCand.GetClusterY_ID(ip)>=0)cout << trackCand.GetClusterY_ID(ip)<<":"<<trackCand.GetSensor(ip)<<"|"; cout << endl;
2550    
2551     }
2552     }
2553     //=================================================================
2554     // ----------------------------------------------------------------
2555     // save tracks
2556     // ----------------------------------------------------------------
2557     //=================================================================
2558     trkBegin = trackCandidates[mapIndex].begin();
2559     trkEnd = trackCandidates[mapIndex].end();
2560     iCand = 0;
2561     // TClonesArray &tracks = *_trkArray;
2562     // tracks.Clear();
2563     for( multimap<int,ExtTrack>::iterator trkIter = trkBegin; trkIter!=trkEnd; ++trkIter){
2564     ExtTrack trackCand = ((*trkIter).second);
2565     // trackCand.seqno = iCand;
2566     // trackCand.Dump();
2567     new(tracks[iCand]) ExtTrack(trackCand);
2568     iCand++;
2569     };
2570    
2571    
2572    
2573     };
2574     /**
2575     *
2576     */
2577    
2578     void ExtTrkingAlg::ProcessEvent2(Bool_t force){
2579    
2580    
2581     // _debug=true;
2582    
2583     if(_debug)cout << " |---------------------------------------------------| "<<endl;
2584     if(_debug)cout << " void ExtTrkingAlg::ProcessEvent2("<<force<<") "<<endl;
2585    
2586    
2587     if(_debug && !_trk_l1)cout << " Missing TrkLevel1 object --- ciao! "<<endl;
2588     if(!_trk_l1)return;
2589    
2590    
2591     //===========================
2592     // pre-selection
2593     //===========================
2594    
2595     Bool_t RETRACK = CheckEvent();
2596    
2597     if(_debug)cout <<" Pre-selection result: "<<RETRACK<<endl;
2598     if( !force && !RETRACK )return;
2599    
2600     NEXTVIEWS = 12 +_alg_nViewCal;
2601     NEXTPLANES = 6 +_alg_nViewCal;
2602    
2603     //===========================
2604     // tracking
2605     //===========================
2606    
2607     // TClonesArray &tracks = *_trkArray;
2608     // tracks.Clear();
2609     TClonesArray &tracks = *_trkArray;
2610     tracks.Clear("C");
2611    
2612     int maxSize = (5+5)*(_alg_nViewCal+1);//boh?!
2613     multimap<int,ExtTrack> trackCandidates[maxSize]; // map: last hit view vs TrkTrack
2614     int mapIndex = 0;
2615     multimap<int,ExtTrack>::iterator trkBegin;
2616     multimap<int,ExtTrack>::iterator trkEnd;
2617     int iCand;
2618    
2619     // ------------------------------------------------
2620     // fill a map VIEW-CLUSTER
2621     // ------------------------------------------------
2622     multimap<int,int> clusterMap;
2623     FillClusterMap(clusterMap,_trk_l1,0);// trk clusters
2624     FillClusterMap(clusterMap,_cal_l1,12);// calorimeter clusters
2625    
2626    
2627     // ------------------------------------------------
2628     // define iterators over clusters on the same view
2629     // ------------------------------------------------
2630     pair <multimap<int,int>::iterator, multimap<int,int>::iterator> ret[NEXTVIEWS];
2631     multimap<int,int>::iterator it[NEXTVIEWS];
2632     for(int iv=0; iv<NEXTVIEWS; iv++)ret[iv] = clusterMap.equal_range(iv);
2633    
2634    
2635     //====================================================================
2636     // PARAMETERS
2637     //====================================================================
2638     // ------------------------------------------------
2639     // number of points per candidate
2640     // ------------------------------------------------
2641     int nClFixX = _alg_nClFixX; // n.hits required on X view
2642     int nClFixY = _alg_nClFixY; // n.hits required on X view
2643     int nTrackMAX = _alg_nTrackMAX; //
2644    
2645    
2646    
2647     /////////////////////////////////////////////////////////////////////////
2648     //
2649     //
2650     // start loop over n.calo planes to be included
2651     //
2652     /////////////////////////////////////////////////////////////////////////
2653    
2654     for(int nViewCal=0; nViewCal<=_alg_nViewCal; nViewCal++){
2655    
2656     NEXTVIEWS = 12 +nViewCal;
2657     NEXTPLANES = 6 +nViewCal;
2658    
2659     if(_debug)cout<<">>>>>>>>>>> INCLUDE "<<nViewCal<<" CALORIMETER VIEWS "<<endl;
2660     // cout<<">>>>>>>>>>> INCLUDE "<<nViewCal<<" CALORIMETER VIEWS "<<endl;
2661     //==================================================
2662     // ------------------------------------------------
2663     // start: one candidate for each cluster
2664     // ------------------------------------------------
2665     //==================================================
2666     if(_debug)cout<<"-------- MINIMAL TRACK-CANDIDATES --------";
2667     if(_debug)cout<<nClFixX<<"X"<<nClFixY<<"Y"<<endl;
2668    
2669    
2670     for(int iv=0; iv<NEXTVIEWS; iv++){ //loop over all views
2671    
2672     if( !(iv%2) && (int)(0.5*iv) > NEXTVIEWS/2-nClFixX)continue;
2673     if( (iv%2) && (int)(0.5*iv) > NEXTVIEWS/2-nClFixY)continue;
2674    
2675     if(iv >= NEXTVIEWS - nViewCal )continue; //skip calo hits
2676    
2677     for ( it[iv]=ret[iv].first; it[iv]!=ret[iv].second; ++it[iv]){ //loop over clusters on the view
2678    
2679    
2680    
2681     int icl = it[iv]->second;
2682    
2683     TrkCluster *cluster = _trk_l1->GetCluster(icl);
2684     // cluster->Dump();
2685     int ladder = cluster->GetLadder()-1; //
2686     int plane = cluster->GetPlane()-1;
2687     bool isY = (cluster->view)%2;// F77 1-12 ??
2688     bool isX = !isY;
2689    
2690    
2691     /// TRACKER ==============================================================================
2692     for (int is=0; is<2; is++){ //loop over sensors
2693    
2694     //cout <<endl<< " view "<<iv<<" plane "<<plane<<" cluster "<<icl<<" on sensor "<<is<<endl;
2695    
2696     ExtTrack& t_track = *_extTrack;
2697    
2698     t_track.ResetXY();
2699     // for(int ip =0 ; ip<t_track.nplanes; ip++ )t_track.SetZ(ip,_zMech[ip]);
2700     // t_track.Dump();
2701    
2702    
2703     // >>>> insert point
2704     float xmABar[]={0.,0.,0.,0.,0.}; // inizializzare a zero l'angolo, come prima stima per il PFA
2705     float ymABar[]={0.,0.,0.,0.,0.};
2706     float zmAB[]={t_track.zm[plane],0.,0.};//mechanical z-coordinate
2707     EvaluateClusterPosition_Tracker( (isX?icl:-1), (isY?icl:-1), ladder, is, xmABar, ymABar, zmAB);
2708    
2709     if( isX ){
2710     t_track.SetX(plane,xmABar[1],xmABar[2],ymABar[1],ymABar[2],xmABar[4]);
2711     t_track.SetZ(plane,0.5*(zmAB[1]+zmAB[2]));
2712     t_track.SetXGood(plane,icl+1,ladder,is);
2713     // t_track.SetYGood(plane,0,ladder,is);
2714     }
2715     if( isY ){
2716     t_track.SetY(plane,xmABar[1],xmABar[2],ymABar[1],ymABar[2],ymABar[4]);
2717     t_track.SetZ(plane,0.5*(zmAB[1]+zmAB[2]));
2718     t_track.SetYGood(plane,icl+1,ladder,is);
2719     // t_track.SetXGood(plane,0,ladder,is);
2720     }
2721     trackCandidates[mapIndex].insert(pair<int,ExtTrack>(iv, t_track));
2722    
2723     }
2724    
2725    
2726    
2727     }
2728     }
2729    
2730    
2731     //==============================================================
2732     // -------------------------------------------------------------
2733     // next: add views to each candidate, up to nClFixX+nClFixY
2734     // -------------------------------------------------------------
2735     //==============================================================
2736     // for( ;mapIndex < nClFixX+nClFixY-1 ;++mapIndex){
2737     for( int iii=0; iii< nClFixX+nClFixY-1; iii++){
2738    
2739     // if(mapIndex>0)trackCandidates[mapIndex-1].clear();
2740    
2741     trkBegin = trackCandidates[mapIndex].begin();
2742     trkEnd = trackCandidates[mapIndex].end();
2743     if(_debug)cout<<"MAP "<<mapIndex<<" ----------- n.candidates "<<trackCandidates[mapIndex].size()<<endl;
2744    
2745     for( multimap<int,ExtTrack>::iterator trkIter = trkBegin; trkIter!=trkEnd; ++trkIter){
2746    
2747    
2748     ExtTrack trackCand = (*trkIter).second;
2749     int lastView = (*trkIter).first; //last inserted view
2750     bool lastIsTrk = (lastView < NEXTVIEWS - nViewCal);
2751     int lastPlane = (int)(0.5*lastView);
2752     if(!lastIsTrk)lastPlane =lastView-6;
2753     int lastLadder = trackCand.GetLadder(lastPlane);
2754     int lastSensor = trackCand.GetSensor(lastPlane);
2755    
2756    
2757     // cout <<" >>> lastView "<<lastView<< " NEXTVIEWS "<<NEXTVIEWS<<endl;
2758    
2759     for(int iv=lastView+1; iv<NEXTVIEWS; iv++){ //loop over next views
2760    
2761     bool isTrk = (iv < NEXTVIEWS - nViewCal);
2762     bool isX = (iv)%2;
2763     bool isY = !isX;
2764    
2765    
2766     // if( (iv%2) && (int)(0.5*iv) > 6-nClFixX+trackCand.GetNX())continue; //not enough x-view left
2767     // if( !(iv%2) && (int)(0.5*iv) > 6-nClFixY+trackCand.GetNY())continue; //not enough y-view left
2768    
2769     // if( (iv%2) && trackCand.GetNX()==nClFixX )continue;//ok?
2770     // if( !(iv%2) && trackCand.GetNY()==nClFixY )continue;//ok?
2771    
2772     if( isX && trackCand.GetNX()==nClFixX )continue;//ok?
2773     if( isY && trackCand.GetNY()==nClFixY )continue;//ok?
2774    
2775    
2776     if( isX && (int)(0.5*iv) > 6+nViewCal/2 - nClFixX+trackCand.GetNX())continue; //not enough x-view left
2777     if( isY && (int)(0.5*iv) > 6+(nViewCal+1)/2 - nClFixY+trackCand.GetNY())continue; //not enough y-view left
2778    
2779     for ( it[iv]=ret[iv].first; it[iv]!=ret[iv].second; ++it[iv]){ //loop over clusters on the view
2780    
2781     int icl = it[iv]->second;
2782    
2783     // cout <<" >>> icl "<<icl<<endl;
2784    
2785     if(isTrk){
2786     /// TRACKER ==================================================
2787    
2788    
2789     TrkCluster *cluster = _trk_l1->GetCluster(icl);
2790     int ladder = cluster->GetLadder()-1;//(_trk_l1->GetCluster(icl)->maxs-1)%1024 + 1;
2791     int plane = cluster->GetPlane()-1;
2792     // bool isY = (cluster->view)%2;
2793     // bool isX = !isY;
2794    
2795     if( plane==lastPlane && ladder!=lastLadder)continue;
2796    
2797    
2798     for (int is=0; is<2; is++){ //loop over sensors
2799    
2800     if( plane==lastPlane && is!=lastSensor)continue;
2801    
2802     // if(_debug)cout<<"MAP "<<mapIndex<<" last v "<<lastView;
2803     // if(_debug)cout<<" +cl "<<icl<<" s"<<is<<endl;
2804    
2805     ExtTrack t_track = ExtTrack();
2806     trackCand.Copy(t_track); //copy the candidate parameters...
2807    
2808     bool isXY = (isX && t_track.YGood(plane)) || (isY && t_track.XGood(plane)) ;
2809    
2810    
2811     float xmABar[]={0.,0.,0.,0.,0.}; //importante inizializzare a zero, come prima stima per il PFA
2812     float ymABar[]={0.,0.,0.,0.,0.};
2813     float zmAB[]={t_track.zm[plane],0.,0.};
2814    
2815     if( isX ){
2816     int iclx = icl;
2817     int icly = (isXY ? t_track.GetClusterY_ID(plane) : -1 );
2818    
2819     EvaluateClusterPosition_Tracker( iclx, icly , ladder, is, xmABar, ymABar, zmAB);
2820    
2821     if(isXY){
2822     t_track.SetXY(plane,xmABar[0],ymABar[0],xmABar[4],ymABar[4]);
2823     t_track.SetZ(plane,zmAB[0]);
2824     }else{
2825     t_track.SetX(plane,xmABar[1],xmABar[2],ymABar[1],ymABar[2],xmABar[4]);
2826     t_track.SetZ(plane,0.5*(zmAB[1]+zmAB[2]));
2827     }
2828     t_track.SetXGood(plane,iclx+1,ladder,is); //...add a point...
2829     t_track.SetYGood(plane,icly+1,ladder,is);
2830     }
2831     //
2832     if( isY ){
2833     int iclx = (isXY ? t_track.GetClusterX_ID(plane) : -1 );
2834     int icly = icl;
2835    
2836     EvaluateClusterPosition_Tracker( iclx, icly , ladder, is, xmABar, ymABar, zmAB);
2837    
2838     if(isXY){
2839     t_track.SetXY(plane,xmABar[0],ymABar[0],xmABar[4],ymABar[4]);
2840     t_track.SetZ(plane,zmAB[0]);
2841     }else{
2842     t_track.SetY(plane,xmABar[1],xmABar[2],ymABar[1],ymABar[2],ymABar[4]);
2843     t_track.SetZ(plane,0.5*(zmAB[1]+zmAB[2]));
2844     };
2845     t_track.SetYGood(plane,icly+1,ladder,is);
2846     t_track.SetXGood(plane,iclx+1,ladder,is);
2847     }
2848    
2849     trackCandidates[mapIndex+1].insert(pair<int,ExtTrack>(iv, t_track)); //...and store a new candidate
2850     };//end loop over sensors
2851    
2852     }else{
2853     /// CALORIMETER =================================================
2854     ExtHit cluster = _cal_cl[icl];
2855     int plane = 6 + cluster.view;
2856    
2857     if( plane==lastPlane )continue;
2858    
2859     int ladder = (int)(cluster.coordPU / 32);
2860     int sensor = -1; //not yet known
2861     bool isX = (cluster.view)%2;
2862     bool isY = !isX;
2863    
2864     ExtTrack t_track = ExtTrack();
2865     trackCand.Copy(t_track);
2866    
2867     float xmABar[]={0.,0.,0.,0.,0.}; //importante inizializzare a zero, come prima stima per il PFA
2868     float ymABar[]={0.,0.,0.,0.,0.};
2869     float zmAB[]={0.,0.,0.};
2870     EvaluateClusterPosition_Calorimeter( icl, sensor, xmABar, ymABar, zmAB);
2871    
2872    
2873     if( isX ){
2874     t_track.SetX(plane,xmABar[1],xmABar[2],ymABar[1],ymABar[2],xmABar[4]);
2875     t_track.SetZ(plane,0.5*(zmAB[1]+zmAB[2]));
2876     t_track.SetXGood(plane,icl+1, ladder, sensor); //...add a point.
2877     t_track.SetYGood(plane, 0, ladder, sensor); //...add a point...
2878     }
2879     if( isY ){
2880     t_track.SetY(plane,xmABar[1],xmABar[2],ymABar[1],ymABar[2],xmABar[4]);
2881     t_track.SetZ(plane,0.5*(zmAB[1]+zmAB[2]));
2882     t_track.SetYGood(plane,icl+1, ladder, sensor);
2883     t_track.SetXGood(plane, 0, ladder, sensor);
2884     }
2885     trackCandidates[mapIndex+1].insert(pair<int,ExtTrack>(iv, t_track)); //...and store a new ca
2886    
2887     }
2888    
2889 mocchiut 1.3 if( trackCandidates[mapIndex+1].size() > (uint)nTrackMAX ){ //EM, 2826:50: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
2890 pam-ts 1.2 if(_debug)cout << "n.candidates "<<trackCandidates[mapIndex+1].size()<<" > "<<nTrackMAX<<endl;
2891     return;//to many candidates
2892     }
2893    
2894     };//end loop over clusters on the view iv
2895     };//endl loop over views
2896     }//end loop over candidates
2897    
2898     mapIndex++;
2899    
2900     }//end iterations
2901    
2902     if(_debug)cout<<"end of cluster inclusion"<<endl;
2903     if(_debug)cout<<"MAP "<<mapIndex<<" ----------- n.candidates "<<trackCandidates[mapIndex].size()<<endl;
2904     // if(_debug)cout << "n.candidates "<<trackCandidates[mapIndex].size()<<endl;
2905    
2906    
2907     //-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
2908     if(trackCandidates[mapIndex].size()==0){
2909     // mapIndex++;
2910     continue;//increment one calo plane
2911     }
2912     //-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
2913    
2914    
2915     //===============================================================================================
2916     // -------------------------------------------------------------
2917     // first selection of track candidates, based on chi2
2918     // -------------------------------------------------------------
2919     //===============================================================================================
2920     if(_debug)cout<<"-------- CHI2 --------"<<endl;
2921     // if(mapIndex>0)trackCandidates[mapIndex-1].clear();
2922     trkBegin = trackCandidates[mapIndex].begin();
2923     trkEnd = trackCandidates[mapIndex].end();
2924     mapIndex++;
2925     iCand = 0;
2926     for( multimap<int,ExtTrack>::iterator trkIter = trkBegin; trkIter!=trkEnd; ++trkIter){
2927     int lastView = (*trkIter).first;
2928     ExtTrack &trackCand = (*trkIter).second;
2929     int ifail=0;
2930    
2931    
2932 pam-ts 1.7 // trackCand.Dump();
2933    
2934 pam-ts 1.2 trackCand.ResetFit();
2935     trackCand.Fit(0.,ifail,0);
2936     if(ifail!=0)trackCand.ResetFit();
2937    
2938 pam-ts 1.7 // trackCand.Dump();
2939 pam-ts 1.2
2940    
2941     // -----------------------------------
2942     // first selection of track candidates
2943     // -----------------------------------
2944     if(TMath::IsNaN(trackCand.chi2))continue;
2945     if(trackCand.chi2 <= 0. || trackCand.chi2 > 1.e7)continue;
2946     // if(trackCand.chi2 < 0. || trackCand.chi2 > 10. )continue;
2947     iCand++;
2948    
2949     if(_debug){
2950     cout<< " TRK chi2 "<<setw(13)<<trackCand.chi2;
2951     cout <<" | al: ";
2952     for(int i=0; i<5; i++)cout <<setw(10)<< trackCand.al[i];
2953     cout <<" | ";
2954     cout << " X: ";
2955     for(int ip=0; ip<NEXTPLANES; ip++)cout << (trackCand.XGood(ip) ? "o" : "-");
2956     // for(int ip=0; ip<trackCand.nplanes; ip++)
2957     // if(trackCand.GetClusterX_ID(ip)>=0)cout << trackCand.GetClusterX_ID(ip)<<":"<<trackCand.GetSensor(ip)<<"|";
2958     cout << " | ";
2959     cout << " Y: ";
2960     for(int ip=0; ip<NEXTPLANES; ip++)cout << (trackCand.YGood(ip) ? "o" : "-");
2961     cout << endl;
2962     // for(int ip=0; ip<trackCand.nplanes; ip++)
2963     // if(trackCand.GetClusterY_ID(ip)>=0)cout << trackCand.GetClusterY_ID(ip)<<":"<<trackCand.GetSensor(ip)<<"|"; cout << endl;
2964     }
2965     trackCandidates[mapIndex].insert(pair<int,ExtTrack>(lastView, trackCand));
2966    
2967     }
2968    
2969    
2970     //-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
2971     if(trackCandidates[mapIndex].size()==0){
2972     mapIndex++;
2973     continue;//increment one calo plane
2974     }
2975     //-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
2976    
2977     if(_debug)cout << "n.candidates "<<trackCandidates[mapIndex].size()<<endl;
2978    
2979    
2980     //=================================================================
2981     // ----------------------------------------------------------------
2982     // CALORIMETER
2983     // ----------------------------------------------------------------
2984     //=================================================================
2985     if(_cal_l1){
2986     if(_debug)cout<<"-------- CALORIMETER --------"<<endl;
2987    
2988     CaloLevel1* l1=_cal_l1;//event->GetCaloLevel1();
2989     // if(!l1)return;
2990     vector<float> caloChi2;
2991     vector<int> caloHit; int caloHitMAX=0;
2992     vector<float> caloMip;
2993     // if(mapIndex>0)trackCandidates[mapIndex-1].clear();
2994     trkBegin = trackCandidates[mapIndex].begin();
2995     trkEnd = trackCandidates[mapIndex].end();
2996     for( multimap<int,ExtTrack>::iterator trkIter = trkBegin; trkIter!=trkEnd; ++trkIter){
2997     ExtTrack trackCand = ((*trkIter).second);
2998    
2999     // trackCand.DoTrack(&caloTj);//integrate the trajectory through the calorimeter
3000     _caloTj->DoTrack(trackCand.al,trackCand.zini);
3001     // _caloTj->Dump();
3002    
3003     float chi2 = 0.;
3004     int nhit = 0;
3005     float cmip = 0.;
3006     for(Int_t ih=0; ih<l1->istrip; ih++){
3007     Int_t view = -1;
3008     Int_t plane = -1;
3009     Int_t strip = -1;
3010     Float_t mip = l1->DecodeEstrip(ih,view,plane,strip);
3011     if(view<0)continue;
3012     if(plane<0)continue;
3013     if(strip<0)continue;
3014     if(mip<=0)continue;
3015     float dxy = _caloCoord[view][plane][strip]-(view?_caloTj->y[plane*2+(view?0:1)]:_caloTj->x[plane*2+(view?0:1)]);
3016     if(plane<11) chi2+= mip * TMath::Power(dxy,2.);
3017     // caloZ[plane*2+(view?0:1)]=st.GetZ();
3018     if( fabs(dxy) < 2. && plane<11)nhit++;
3019     if( fabs(dxy) < 2. && plane<11)cmip+=mip;
3020     };
3021     if(l1->istrip>0)chi2 = chi2/l1->istrip;
3022    
3023     caloHit.push_back(nhit);
3024     if(nhit>caloHitMAX)caloHitMAX=nhit;
3025    
3026     if(_debug){
3027     cout << " CALO ";
3028     // cout << " chi2 "<< chi2 <<" ";
3029     cout << " nhit (< 11th plane) "<< nhit <<" ";
3030     // cout << " mip "<< cmip <<" ";
3031     cout <<endl;
3032     };
3033     }
3034    
3035     //=================================================================
3036     // ----------------------------------------------------------------
3037     // selection of track candidates, based on n.calorimeter hits
3038     // ----------------------------------------------------------------
3039     //=================================================================
3040     // if(mapIndex>0)trackCandidates[mapIndex-1].clear();
3041     trkBegin = trackCandidates[mapIndex].begin();
3042     trkEnd = trackCandidates[mapIndex].end();
3043     mapIndex++;
3044     iCand = 0;
3045     for( multimap<int,ExtTrack>::iterator trkIter = trkBegin; trkIter!=trkEnd; ++trkIter){
3046     int lastView = (*trkIter).first;
3047     ExtTrack &trackCand = (*trkIter).second;
3048     if(caloHit[iCand]==caloHitMAX)trackCandidates[mapIndex].insert(pair<int,ExtTrack>(lastView, trackCand));
3049     iCand++;
3050     }
3051    
3052     //-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
3053     if(trackCandidates[mapIndex].size()==0){
3054     mapIndex++;
3055     continue;//increment one calo plane
3056     }
3057     //-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
3058    
3059     if(_debug)cout << "n.candidates "<<trackCandidates[mapIndex].size()<<endl;
3060    
3061     }// end if calo event
3062    
3063    
3064    
3065    
3066     //=================================================================
3067     // ----------------------------------------------------------------
3068     // TOF
3069     // ----------------------------------------------------------------
3070     //=================================================================
3071     if(_tof_l2){
3072     if(_debug)cout<<"-------- TOF --------"<<endl;
3073     // if(mapIndex>0)trackCandidates[mapIndex-1].clear();
3074     trkBegin = trackCandidates[mapIndex].begin();
3075     trkEnd = trackCandidates[mapIndex].end();
3076     ToFLevel2* tl2=_tof_l2;//event->GetToFLevel2();
3077     // if(!tl2)return;
3078     iCand =0;
3079     vector<int> tofHit; int tofHitMAX=0;
3080     for( multimap<int,ExtTrack>::iterator trkIter = trkBegin; trkIter!=trkEnd; ++trkIter){
3081     // int lastView = (*trkIter).first;
3082     ExtTrack &trackCand = (*trkIter).second;
3083    
3084     _tgf->DoTrack(trackCand.al);//<<<< integrate the trajectory
3085    
3086     for(int ip=0; ip<TrkParams::nGF; ip++){
3087     trackCand.xGF[ip] = _tgf->x[ip];
3088     trackCand.yGF[ip] = _tgf->y[ip];
3089     }
3090    
3091     int nhit =0;
3092     for(int iToF=0; iToF<6; iToF++){
3093    
3094     int iGF = iToF;
3095     if(iToF>3)iGF = iToF+8;
3096     int iPaddle = tl2->GetPaddleIdOfTrack( trackCand.xGF[iGF], trackCand.yGF[iGF], iToF);
3097     if( tl2->HitPaddle(iToF,iPaddle) )nhit++;
3098    
3099     }
3100     iCand++;
3101    
3102     tofHit.push_back(nhit);
3103     if(nhit>tofHitMAX)tofHitMAX=nhit;
3104    
3105     if(_debug){
3106     cout << " TOF nhit "<< nhit <<" ";
3107     cout <<endl;
3108     }
3109    
3110    
3111     }
3112     //=================================================================
3113     // ----------------------------------------------------------------
3114     // selection of track candidates, based on n.tof hits
3115     // ----------------------------------------------------------------
3116     //=================================================================
3117     // if(mapIndex>0)trackCandidates[mapIndex-1].clear();
3118     trkBegin = trackCandidates[mapIndex].begin();
3119     trkEnd = trackCandidates[mapIndex].end();
3120     mapIndex++;
3121     iCand = 0;
3122     for( multimap<int,ExtTrack>::iterator trkIter = trkBegin; trkIter!=trkEnd; ++trkIter){
3123     int lastView = (*trkIter).first;
3124     ExtTrack &trackCand = (*trkIter).second;
3125     if(tofHit[iCand]==tofHitMAX)trackCandidates[mapIndex].insert(pair<int,ExtTrack>(lastView, ExtTrack(trackCand)));
3126     iCand++;
3127    
3128     }
3129     if(_debug)cout << "n.candidates "<<trackCandidates[mapIndex].size()<<endl;
3130    
3131     //-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
3132     if(trackCandidates[mapIndex].size()==0){
3133     mapIndex++;
3134     continue;//increment one calo plane
3135     }
3136     //-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
3137    
3138     }
3139    
3140     if(_debug){
3141    
3142     cout<< " Minimal-track SUMMARY:"<<endl;
3143    
3144     // if(mapIndex>0)trackCandidates[mapIndex-1].clear();
3145     trkBegin = trackCandidates[mapIndex].begin();
3146     trkEnd = trackCandidates[mapIndex].end();
3147     for( multimap<int,ExtTrack>::iterator trkIter = trkBegin; trkIter!=trkEnd; ++trkIter){
3148     ExtTrack &trackCand = (*trkIter).second;
3149     cout<< " TRK chi2 "<<setw(13)<<trackCand.chi2;
3150     cout <<" | al: ";
3151     for(int i=0; i<5; i++)cout <<setw(10)<< trackCand.al[i];
3152     cout <<" | ";
3153     cout << " X: ";
3154     // for(int ip=0; ip<NEXTPLANES; ip++)cout << (trackCand.XGood(ip) ? "o" : "-");
3155     for(int ip=0; ip<trackCand.nplanes; ip++){
3156     if(trackCand.GetClusterX_ID(ip)>=0)
3157     cout << setw(2)<<trackCand.GetClusterX_ID(ip);
3158     else
3159     cout << "__";
3160     }
3161     cout << " | ";
3162     cout << " Y: ";
3163     // for(int ip=0; ip<NEXTPLANES; ip++)cout << (trackCand.YGood(ip) ? "o" : "-");
3164     for(int ip=0; ip<trackCand.nplanes; ip++){
3165     if(trackCand.GetClusterY_ID(ip)>=0)
3166     cout << setw(2)<<trackCand.GetClusterY_ID(ip);
3167     else
3168     cout << "__";
3169     }
3170     cout << " S:";for(int ip=0; ip<trackCand.nplanes; ip++)cout<< trackCand.GetSensor(ip)+1;
3171     cout << endl;
3172    
3173     }
3174     }
3175     //=================================================================
3176     // ----------------------------------------------------------------
3177     // TRACK MERGING
3178     // ----------------------------------------------------------------
3179     //=================================================================
3180     if(_debug)cout<<"-------- MERGING --------";
3181     // if(mapIndex>0)trackCandidates[mapIndex-1].clear();
3182     trkBegin = trackCandidates[mapIndex].begin();
3183     trkEnd = trackCandidates[mapIndex].end();
3184     mapIndex++;
3185     float chi2Min=1e10;
3186     iCand = 0;
3187     for( multimap<int,ExtTrack>::iterator trkIter1 = trkBegin; trkIter1!=trkEnd; ++trkIter1){ //loop over tracks (1)
3188    
3189     ExtTrack &trackCand1 = (*trkIter1).second;// get candidate 1...
3190    
3191     ExtTrack t_track = ExtTrack();// ...create a new ExtTrack instance...
3192     trackCand1.Copy(t_track); // ...and make a copy
3193    
3194     bool HBM = false; //has been merged
3195    
3196     for( multimap<int,ExtTrack>::iterator trkIter2 = trkBegin; trkIter2!=trkEnd; ++trkIter2){//loop over tracks (2)
3197    
3198     ExtTrack &trackCand2 = (*trkIter2).second; // get candidate 2...
3199    
3200     bool CBM = true;
3201     for(int ip=0; ip<NEXTPLANES; ip++){ //loop over planes
3202     if( t_track.XGood(ip) &&
3203     trackCand2.XGood(ip) &&
3204     ( t_track.GetClusterX_ID(ip)!=trackCand2.GetClusterX_ID(ip) || t_track.GetSensor(ip)!=trackCand2.GetSensor(ip) ) &&
3205     true )CBM=false; // if both have a x-hit and it is not the same ---> they cannot be merged
3206     if(!CBM)break;
3207     if( t_track.YGood(ip) &&
3208     trackCand2.YGood(ip) &&
3209     ( t_track.GetClusterY_ID(ip)!=trackCand2.GetClusterY_ID(ip) || t_track.GetSensor(ip)!=trackCand2.GetSensor(ip) ) &&
3210     true )CBM=false; // if both have a y-hit and it is not the same ---> they cannot be merged
3211     if(!CBM)break;
3212     }
3213     // if(_debug)cout << " can be merged ? "<<CBM<<endl;
3214     if(!CBM)continue; //go to the next candidate
3215     ///////////
3216     //merging//
3217     ///////////
3218     // cout <<endl<<" check merging al (1) ";
3219     // for(int i=0; i<5; i++)cout <<setw(10)<< t_track.al[i];
3220     // cout <<endl<<" with al (2) ";
3221     // for(int i=0; i<5; i++)cout <<setw(10)<< trackCand2.al[i];
3222     for(int ip=0; ip<NEXTPLANES; ip++){
3223     if( !(t_track.XGood(ip)) && trackCand2.XGood(ip) ){
3224     int ygood_temp = t_track.ygood[ip];
3225    
3226     if(t_track.YGood(ip)){
3227     t_track.SetXY(ip,trackCand2.xm[ip],t_track.ym[ip],trackCand2.resx[ip],t_track.resy[ip]);
3228     // cout<<"confronta "<<trackCand2.zm[ip]<<" - "<<t_track.zm[ip]<<" = "<<trackCand2.zm[ip]-t_track.zm[ip]<<endl;
3229     }else{
3230     t_track.SetX(ip,trackCand2.xma[ip],trackCand2.xmb[ip],trackCand2.yma[ip],trackCand2.ymb[ip],trackCand2.resx[ip]);
3231     t_track.SetZ(ip,0.5*(trackCand2.zma[ip]+trackCand2.zmb[ip]));
3232     }
3233     t_track.xgood[ip] = trackCand2.xgood[ip];//assign cluster + sensor
3234     t_track.ygood[ip] = ygood_temp;//assign cluster + sensor
3235    
3236     HBM = true;
3237     }
3238     if( !(t_track.YGood(ip)) && trackCand2.YGood(ip) ) {
3239    
3240     int xgood_temp = t_track.xgood[ip];
3241    
3242     if(t_track.XGood(ip)){
3243     t_track.SetXY(ip,t_track.xm[ip],trackCand2.ym[ip],t_track.resx[ip],trackCand2.resy[ip]);
3244     // cout<<"confronta "<<trackCand2.zm[ip]<<" - "<<t_track.zm[ip]<<" = "<<trackCand2.zm[ip]-t_track.zm[ip]<<endl;
3245     }else{
3246     t_track.SetY(ip,trackCand2.xma[ip],trackCand2.xmb[ip],trackCand2.yma[ip],trackCand2.ymb[ip],trackCand2.resy[ip]);
3247     t_track.SetZ(ip,0.5*(trackCand2.zma[ip]+trackCand2.zmb[ip]));
3248     }
3249     t_track.ygood[ip] = trackCand2.ygood[ip];//assign cluster + sensor
3250     t_track.xgood[ip] = xgood_temp;//assign cluster + sensor
3251     HBM = true;
3252     }
3253     };
3254    
3255     }//end loop over tracks (2)
3256     //
3257     //check if track has been already inserted
3258     //
3259     // if(mapIndex>0)trackCandidates[mapIndex-1].clear();
3260     multimap<int,ExtTrack>::iterator trkB = trackCandidates[mapIndex].begin();
3261     multimap<int,ExtTrack>::iterator trkE = trackCandidates[mapIndex].end();
3262     //
3263     bool ADD = true;
3264     for( multimap<int,ExtTrack>::iterator trkI = trkB; trkI!=trkE; ++trkI){
3265     ExtTrack &trackC = (*trkI).second;
3266     bool SAME=true;
3267     for(int ip=0; ip<NEXTPLANES; ip++){
3268     bool isTrk = (ip < NEXTPLANES - nViewCal);
3269     if( t_track.GetClusterX_ID(ip) != trackC.GetClusterX_ID(ip) )SAME=false;
3270     if( t_track.GetClusterY_ID(ip) != trackC.GetClusterY_ID(ip) )SAME=false;
3271     if( isTrk && t_track.GetSensor(ip) != trackC.GetSensor(ip) )SAME=false;
3272     }
3273     if(SAME){
3274     ADD=false;
3275     break;
3276     }
3277     }
3278     // if(_debug)cout <<" ADD ? "<<ADD<<endl;
3279    
3280     // cout << "-----> INSERT "<<endl;
3281     if(_debug){
3282    
3283     cout << endl;
3284     // cout<< " TRK chi2 "<<setw(13)<<t_track.chi2;
3285     cout<< " TRK chi2 "<<".............";
3286     cout <<" | al: ";
3287     // for(int i=0; i<5; i++)cout <<setw(10)<< t_track.al[i];
3288     for(int i=0; i<5; i++)cout <<"..........";
3289     cout <<" | ";
3290     cout << " X: ";
3291     // for(int ip=0; ip<NEXTPLANES; ip++)cout << (t_track.XGood(ip) ? "o" : "-");
3292     for(int ip=0; ip<t_track.nplanes; ip++){
3293     if(t_track.GetClusterX_ID(ip)>=0)
3294     cout << setw(2)<<t_track.GetClusterX_ID(ip);
3295     else
3296     cout << "__";
3297     }
3298     cout << " | ";
3299     cout << " Y: ";
3300     // for(int ip=0; ip<NEXTPLANES; ip++)cout << (t_track.YGood(ip) ? "o" : "-");
3301     for(int ip=0; ip<t_track.nplanes; ip++){
3302     if(t_track.GetClusterY_ID(ip)>=0)
3303     cout << setw(2)<<t_track.GetClusterY_ID(ip);
3304     else
3305     cout << "__";
3306     }
3307     cout << " S:";for(int ip=0; ip<t_track.nplanes; ip++)cout<< t_track.GetSensor(ip)+1;
3308     if(HBM)cout << " >> Merged";
3309     // cout << endl;
3310     }
3311    
3312     if(ADD){
3313     // cout << " >> re-evaluate...";
3314     // cout << " >> Merged? "<<HBM;
3315     // cout << "| X:";
3316     // for(int ip=0; ip<NEXTPLANES; ip++){
3317     // if(t_track.GetClusterX_ID(ip)>=0)
3318     // cout << setw(2)<<t_track.GetClusterX_ID(ip);
3319     // else
3320     // cout << "__";
3321     // }
3322     // // for(int ip=0; ip<NEXTPLANES; ip++)cout<< t_track.XGood(ip);
3323     // cout << "| Y:";
3324     // for(int ip=0; ip<NEXTPLANES; ip++){
3325     // if(t_track.GetClusterY_ID(ip)>=0)
3326     // cout << setw(2)<<t_track.GetClusterY_ID(ip);
3327     // else
3328     // cout << "__";
3329     // }
3330     // // for(int ip=0; ip<NEXTPLANES; ip++)cout<< t_track.YGood(ip);
3331     // cout << " S:";for(int ip=0; ip<NEXTPLANES; ip++)cout<< t_track.GetSensor(ip)+1;
3332     // cout << endl;
3333    
3334     // ///////////////////////////////////////////////////////// FIT START
3335     int ifail=0;
3336     t_track.ResetFit();
3337     // t_track.Dump();
3338     t_track.Fit(0.,ifail,0);//
3339     if( ifail != 0 || TMath::IsNaN(t_track.chi2) ){
3340     // if(_debug){
3341     // t_track.ResetFit();
3342     // t_track.Fit(0.,ifail,2);//
3343     // }
3344     continue;
3345     }
3346    
3347     // t_track.Fit(0.,ifail,0,1);//evaluate again taking into account the track angle
3348     // if( TMath::IsNaN(t_track.chi2) )continue;
3349     // if( ifail != 0 )continue;
3350     // ///////////////////////////////////////////////////////// FIT FINISH
3351    
3352    
3353    
3354     // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
3355     // re-evaluated coordinates
3356     // and
3357     // evaluated other track info
3358     // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
3359 mocchiut 1.3 //float VMS[22];VMS[0]=0.; //EM, 3295:14: warning: variable ?VMS? set but not used [-Wunused-but-set-variable]
3360 pam-ts 1.2 for(int ip=0; ip<NEXTPLANES; ip++){
3361    
3362     if(!t_track.XGood(ip)&&!t_track.YGood(ip))continue;
3363    
3364     int iclx = t_track.GetClusterX_ID(ip);
3365     int icly = t_track.GetClusterY_ID(ip);
3366     int ladder = t_track.GetLadder(ip);//ok
3367     int sensor = t_track.GetSensor(ip);//not assigned yet for calo
3368    
3369     bool isTrk = (ip < NEXTPLANES - nViewCal);
3370     bool isXY = t_track.XGood(ip)*t_track.YGood(ip);
3371     bool isX = t_track.XGood(ip) && !isXY;
3372     bool isY = t_track.YGood(ip) && !isXY;
3373    
3374     // cout <<endl<< ip << " xgood "<<t_track.xgood[ip]<<" ygood "<<t_track.ygood[ip];
3375     // cout <<endl<< ip << " iclx "<<iclx<<" icly "<<icly;
3376    
3377     // continue;
3378     //=========================================
3379     // evaluate angular factor
3380     //=========================================
3381     float factor = 0.;
3382     factor += TMath::Power(TMath::Tan(TMath::ACos(-1)*t_track.axv[ip]/180.),2);
3383     factor += TMath::Power(TMath::Tan(TMath::ACos(-1)*t_track.ayv[ip]/180.),2);
3384     factor += 1.;
3385     factor = TMath::Sqrt(factor);
3386     // factor = 1.;///TEMP
3387    
3388     //=========================================
3389     // re-evaluate coordinates
3390     //=========================================
3391     float xmABar[]={t_track.xv[ip],0.,0.,t_track.axv[ip],0.};//importante passare gli angoli!!
3392     float ymABar[]={t_track.yv[ip],0.,0.,t_track.ayv[ip],0.};//importante passare gli angoli!!
3393     float zmAB[]={t_track.zv[ip],0.,0.};
3394    
3395     if(isTrk){
3396     EvaluateClusterPosition_Tracker( iclx, icly, ladder, sensor, xmABar, ymABar, zmAB);
3397     }else{
3398     // cout <<" ------------ EvaluateClusterPosition_Calorimeter ----------------"<<endl;
3399     // cout << "IN: "<<(int)fmax((float)iclx,(float)icly)<<endl;
3400     // cout << "IN: "<<sensor<<endl;
3401     // cout << "IN: "<<xmABar[0]<<endl;
3402     // cout << "IN: "<<ymABar[0]<<endl;
3403     // cout << "IN: "<<zmAB[0]<<endl;
3404     // cout << "IN: "<<t_track.al[4]<<endl;
3405     EvaluateClusterPosition_Calorimeter( (int)fmax((float)iclx,(float)icly), sensor, xmABar, ymABar, zmAB, t_track.al[4]);
3406     // cout << ip << " SENSOR "<<sensor<<endl;
3407     }
3408     if(isXY){
3409     t_track.SetXY(ip,xmABar[0],ymABar[0],xmABar[4],ymABar[4]);
3410     t_track.SetZ(ip,zmAB[0]);
3411     }
3412     if(isX ){
3413     t_track.SetX( ip,xmABar[1],xmABar[2],ymABar[1],ymABar[2],xmABar[4]);
3414     t_track.SetZ(ip,0.5*(zmAB[1]+zmAB[2]));
3415     }
3416     if(isY ){
3417     t_track.SetY( ip,xmABar[1],xmABar[2],ymABar[1],ymABar[2],ymABar[4]);
3418     t_track.SetZ(ip,0.5*(zmAB[1]+zmAB[2]));
3419     }
3420    
3421     t_track.SetXGood(ip,(sensor == -1 ? 0 : iclx+1),ladder,sensor);
3422     t_track.SetYGood(ip,(sensor == -1 ? 0 : icly+1),ladder,sensor);
3423     // t_track.SetXGood(ip,iclx+1,ladder,sensor);
3424     // t_track.SetYGood(ip,icly+1,ladder,sensor);
3425    
3426     //=========================================
3427     // evaluate other quantities
3428     //=========================================
3429     float smip,multmax;
3430     if(t_track.XGood(ip)){
3431     if(isTrk){
3432     TrkCluster *cluster = _trk_l1->GetCluster(iclx);
3433     float mip = TrkParams::GetMIP(cluster->GetLadder()-1,cluster->view-1);
3434     smip = cluster->GetSignal()/(mip>0.?mip:1.);
3435     multmax = cluster->GetMultiplicity()*10000+cluster->maxs;
3436     }else{
3437     ExtHit cluster = _cal_cl[iclx];
3438     smip = cluster.signal;//mip
3439     multmax = cluster.mult*10000+lrint(cluster.coordPU);
3440     }
3441     t_track.dedx_x[ip] = smip/(factor>0.?factor:1.);
3442     t_track.multmaxx[ip] = multmax;
3443     }
3444     if(t_track.YGood(ip)){
3445     if(isTrk){
3446     TrkCluster *cluster = _trk_l1->GetCluster(icly);
3447     float mip = TrkParams::GetMIP(cluster->GetLadder()-1,cluster->view-1);
3448     smip = cluster->GetSignal()/(mip>0.?mip:1.);
3449     multmax = cluster->GetMultiplicity()*10000+cluster->maxs;
3450     }else{
3451     ExtHit cluster = _cal_cl[icly];
3452     smip = cluster.signal;//mip
3453     multmax = cluster.mult*10000+lrint(cluster.coordPU);
3454     }
3455     t_track.dedx_y[ip] = smip/(factor>0.?factor:1.);
3456     t_track.multmaxy[ip] = multmax;
3457     }
3458     }
3459     ///////////////////////////////////////////////////////// end additional info
3460    
3461     // ///////////////////////////////////////////////////////// RE-FIT START
3462     t_track.Fit(0.,ifail,0);//evaluate again taking into account the track angle
3463     if( TMath::IsNaN(t_track.chi2) )continue;
3464     if( ifail != 0 )continue;
3465     // ///////////////////////////////////////////////////////// RE-FIT FINISH
3466     if(_debug){
3467     cout << endl;
3468     // cout << " >> al: ";for(int i=0; i<5; i++)cout <<setw(10)<< t_track.al[i];
3469     // cout << " chi2: "<<setw(10)<< t_track.chi2;
3470     // // cout << endl;
3471     cout<< " TRK chi2 "<<setw(13)<<t_track.chi2;
3472     cout <<" | al: ";
3473     for(int i=0; i<5; i++)cout <<setw(10)<< t_track.al[i];
3474     cout <<" | ";
3475     cout << " X: ";
3476     // for(int ip=0; ip<NEXTPLANES; ip++)cout << (t_track.XGood(ip) ? "o" : "-");
3477     for(int ip=0; ip<t_track.nplanes; ip++){
3478     if(t_track.GetClusterX_ID(ip)>=0)
3479     cout << setw(2)<<t_track.GetClusterX_ID(ip);
3480     else
3481     cout << "__";
3482     }
3483     cout << " | ";
3484     cout << " Y: ";
3485     // for(int ip=0; ip<NEXTPLANES; ip++)cout << (t_track.YGood(ip) ? "o" : "-");
3486     for(int ip=0; ip<t_track.nplanes; ip++){
3487     if(t_track.GetClusterY_ID(ip)>=0)
3488     cout << setw(2)<<t_track.GetClusterY_ID(ip);
3489     else
3490     cout << "__";
3491     }
3492     cout << " S:";for(int ip=0; ip<t_track.nplanes; ip++)cout<< t_track.GetSensor(ip)+1;
3493     cout << " >> ADD ";
3494     }
3495    
3496     _caloTj->DoTrack(t_track.al,t_track.zini);
3497     for(int ip=0; ip<_caloTj->npoint; ip++){
3498     t_track.xGF[ip] = _caloTj->x[ip];
3499     t_track.yGF[ip] = _caloTj->y[ip];
3500     }
3501    
3502     // cout << "ADD "<<endl;
3503     trackCandidates[mapIndex].insert(pair<int,ExtTrack>(t_track.GetNX()+t_track.GetNY(), ExtTrack(t_track)));
3504     if(t_track.GetNX()+t_track.GetNY()>5 && t_track.chi2<chi2Min) chi2Min=t_track.chi2;
3505     iCand++;
3506     }//end add-candidate condition
3507    
3508     }//end first loop on candidates
3509     if(_debug)cout <<endl<< "n.candidates "<<trackCandidates[mapIndex].size()<<endl;
3510    
3511    
3512    
3513     //=================================================================
3514     // ----------------------------------------------------------------
3515     // chi2 selection
3516     // ----------------------------------------------------------------
3517     //=================================================================
3518     pair <multimap<int,ExtTrack>::iterator, multimap<int,ExtTrack>::iterator> nxny[NEXTVIEWS];
3519     // for(int inxny=0; inxny<NEXTVIEWS; inxny++){
3520     bool NMTI =false;//not-minimal track inserted
3521     for(int inxny=NEXTVIEWS-1; inxny>=nClFixX+nClFixY; inxny--){
3522     nxny[inxny] = trackCandidates[mapIndex].equal_range(inxny);
3523     // cout << " --- n "<<inxny<<endl;
3524     for ( multimap<int,ExtTrack>::iterator it = nxny[inxny].first; it!=nxny[inxny].second; ++it){
3525     ExtTrack &trackC = (*it).second;
3526     // cout << " NX+NY "<< trackC.GetNX()+trackC.GetNY() <<" chi2 "<<trackC.chi2<< " R(GV) "<<trackC.GetRigidity()<<endl;
3527     // if( trackC.chi2==0 )continue;
3528     if( (trackC.GetNX()+trackC.GetNY() > 5 && trackC.chi2>chi2Min ) ||
3529     (trackC.GetNX()+trackC.GetNY() == 5 && NMTI ) ||
3530     (trackC.GetNX()+trackC.GetNY() == 5 && trackC.chi2>1. ) ||
3531     false)continue;
3532    
3533     trackCandidates[mapIndex+1].insert(pair<int,ExtTrack>(inxny, ExtTrack(trackC)));
3534     // cout << " insert "<<endl;
3535    
3536     if( trackC.GetNX()+trackC.GetNY() > 5 )NMTI=true;
3537     }
3538     }
3539     mapIndex++;
3540    
3541     //-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
3542     if(
3543     trackCandidates[mapIndex].size()==0 ||
3544     (trackCandidates[mapIndex].size()>1 && nViewCal < _alg_nViewCal ) ||
3545     false){
3546     mapIndex++;
3547     continue;//increment one calo plane
3548     }
3549     //-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
3550    
3551     if(_debug){
3552    
3553     cout<< " Selected-track SUMMARY:"<<endl;
3554    
3555     // if(mapIndex>0)trackCandidates[mapIndex-1].clear();
3556     trkBegin = trackCandidates[mapIndex].begin();
3557     trkEnd = trackCandidates[mapIndex].end();
3558     for( multimap<int,ExtTrack>::iterator trkIter = trkBegin; trkIter!=trkEnd; ++trkIter){
3559     ExtTrack &trackCand = (*trkIter).second;
3560     cout<< " TRK chi2 "<<setw(13)<<trackCand.chi2;
3561     cout <<" | al: ";
3562     for(int i=0; i<5; i++)cout <<setw(10)<< trackCand.al[i];
3563     cout <<" | ";
3564     cout << " X: ";
3565     // for(int ip=0; ip<NEXTPLANES; ip++)cout << (trackCand.XGood(ip) ? "o" : "-");
3566     for(int ip=0; ip<trackCand.nplanes; ip++){
3567     if(trackCand.GetClusterX_ID(ip)>=0)
3568     cout << setw(2)<<trackCand.GetClusterX_ID(ip);
3569     else
3570     cout << "__";
3571     }
3572     cout << " | ";
3573     cout << " Y: ";
3574     // for(int ip=0; ip<NEXTPLANES; ip++)cout << (trackCand.YGood(ip) ? "o" : "-");
3575     for(int ip=0; ip<trackCand.nplanes; ip++){
3576     if(trackCand.GetClusterY_ID(ip)>=0)
3577     cout << setw(2)<<trackCand.GetClusterY_ID(ip);
3578     else
3579     cout << "__";
3580     }
3581     cout << " S:";for(int ip=0; ip<trackCand.nplanes; ip++)cout<< trackCand.GetSensor(ip)+1;
3582     cout <<" MDR="<<1./sqrt(trackCand.coval[4][4])<<endl;
3583     cout << endl;
3584     // for(int ip=0; ip<trackCand.nplanes; ip++)
3585     // if(trackCand.GetClusterY_ID(ip)>=0)cout << trackCand.GetClusterY_ID(ip)<<":"<<trackCand.GetSensor(ip)<<"|"; cout << endl;
3586    
3587     }
3588     }
3589    
3590    
3591     //=================================================================
3592     // ----------------------------------------------------------------
3593     // save tracks
3594     // ----------------------------------------------------------------
3595     //=================================================================
3596     // cout << mapIndex << endl;
3597     if(mapIndex>=maxSize)cout <<" ORRORE!!!! mapIndex"<<mapIndex<<" >= "<<maxSize<<endl;
3598     // if(mapIndex>0)trackCandidates[mapIndex-1].clear();
3599     trkBegin = trackCandidates[mapIndex].begin();
3600     trkEnd = trackCandidates[mapIndex].end();
3601     iCand = 0;
3602     // TClonesArray &tracks = *_trkArray;
3603     // tracks.Clear();
3604     for( multimap<int,ExtTrack>::iterator trkIter = trkBegin; trkIter!=trkEnd; ++trkIter){
3605     ExtTrack trackCand = ((*trkIter).second);
3606     // cout << iCand << " "<< trackCand.al[4] <<endl;
3607     // trackCand.seqno = iCand;
3608     // trackCand.Dump();
3609     new(tracks[iCand]) ExtTrack(trackCand);
3610     iCand++;
3611     };
3612     break;
3613    
3614    
3615    
3616     }// end loop over n.calo planes to be included
3617    
3618    
3619    
3620    
3621    
3622     }
3623    
3624    
3625     /**
3626     *
3627     */
3628     void ExtTrkingAlg::ProcessEvent(Bool_t force){
3629    
3630     if(_whichAlg == 0) ProcessEvent0(force);
3631     else if(_whichAlg >= 100 && _whichAlg < 144) ProcessEvent1(force);
3632     else if(_whichAlg >= 200 && _whichAlg < 244) ProcessEvent2(force);
3633     else{
3634     cout << " Algorythm id "<< _whichAlg <<" not implemented "<<endl;
3635     }
3636    
3637     };
3638     /**
3639     *
3640     */
3641     void ExtTrkingAlg::Dump(){
3642    
3643     cout << "|--|--|--|--|--|--|--|--|--|--|--|"<<endl;
3644     cout << "ExtTrkingAlg::Dump() "<<endl<<endl;
3645     cout << " algorythm "<<setw(10)<<_whichAlg <<endl;
3646     cout << " debug "<<setw(10)<< _debug <<endl;
3647     cout << " TrkLevel1 "<<setw(10)<<_trk_l1 <<endl;
3648     cout << " TrkLevel2 "<<setw(10)<<_trk_l2 <<endl;
3649     cout << " CaloLevel1"<<setw(10)<<_cal_l1 <<endl;
3650     cout << " CaloLevel2"<<setw(10)<<_cal_l2 <<endl;
3651     cout << " ToFLevel2 "<<setw(10)<<_tof_l2 <<endl;
3652     cout << "Pre-selection parameters "<<endl;
3653     cout << " nClstrMAX "<<setw(10)<<_sel_nClstrMAX <<endl;
3654     cout << " nPlaneXMIN "<<setw(10)<<_sel_nPlaneXMIN <<endl;
3655     cout << " nPlaneYMIN "<<setw(10)<<_sel_nPlaneYMIN <<endl;
3656     cout << "Algorythm parameters "<<endl;
3657     cout << " nClFixX "<<setw(10)<<_alg_nClFixX <<endl;
3658     cout << " nClFixY "<<setw(10)<<_alg_nClFixY <<endl;
3659     cout << " nTrackMAX "<<setw(10)<<_alg_nTrackMAX <<endl;
3660     cout << " nViewCal "<<setw(10)<<_alg_nViewCal <<endl;
3661     cout << "|--|--|--|--|--|--|--|--|--|--|--|"<<endl;
3662    
3663     }
3664    
3665    
3666    
3667     ////////////////////////////////////////////////////////////////////////
3668     //
3669     //
3670     //
3671     //
3672     ////////////////////////////////////////////////////////////////////////
3673     // int GetSensor(int view, int sis){
3674     // if(sis<0||sis>8)return -1;
3675     // if(view<0||view>1)return -1;
3676     // if(!view)return (int)(sis/3);
3677     // else return sis%3;
3678     // };
3679     // int GetLadder(int view, int sis){
3680     // if(sis<0||sis>8)return -1;
3681     // if(view<0||view>1)return -1;
3682     // if(!view)return sis%3;
3683     // else return (int)(sis/3);
3684     // };
3685     // int GetSiSensor(int view, int l, int s){
3686     // if(view<0||view>1)return -1;
3687     // if(s<0||s>2)return -1;
3688     // if(!view) return 3*s+l;
3689     // else return 3*l+s;
3690     // };
3691    
3692     int CaloStripRoto::GetSensor(){
3693     return GetCaloSensor(GetView(),GetSiSensor());
3694     };
3695     int CaloStripRoto::GetLadder(){
3696     return GetCaloLadder(GetView(),GetSiSensor());
3697     };
3698    
3699     void CaloStripRoto::ResetAligParams(){
3700     fPitch = 1.;
3701     shift[0]=0.; //L
3702     shift[1]=0.; //S
3703     shift[2]=0.; //Z
3704     alpha = 0.;
3705    
3706     // siSensor = -1;;
3707    
3708     };
3709     /*1
3710     *
3711    
3712     *
3713     */
3714     bool CaloStripRoto::SensorContains(float x, float y){
3715    
3716     float toll = 0.2;//cm
3717    
3718     // cout << "S -- SetStrip("<<GetLadder()*32+0<<")"<<endl;
3719    
3720     // cout << " extst.SetStrip("<<GetLadder()*32+0<<") "<<endl;
3721     SetStrip(GetLadder()*32+0);
3722     float xM0,yM0;
3723     float d0 = GetDistanceTo(x,y,xM0,yM0);
3724    
3725     if( yM0-toll > fYB && yM0 > fYA )return false;
3726     if( yM0+toll < fYB && yM0 < fYA )return false;
3727    
3728     if( xM0-toll > fXB && xM0 > fXA )return false;
3729     if( xM0+toll < fXB && xM0 < fXA )return false;
3730    
3731     // cout << "D -- SetStrip("<<GetLadder()*32+31<<")"<<endl;
3732     // cout << " extst.SetStrip("<<GetLadder()*32+31<<") "<<endl;
3733     SetStrip(GetLadder()*32+31);
3734     float xM31,yM31;
3735     float d31 = GetDistanceTo(x,y,xM31,yM31);
3736    
3737    
3738     if( d0+d31 > 31*fPitch*0.244+2.*toll)return false;
3739    
3740     return true;
3741    
3742     };
3743    
3744     CaloStripRoto::CaloStripRoto(int view, int plane, int sisensor, Bool_t usemechanicalalignement){
3745    
3746     SetView(view);
3747     SetPlane(plane);
3748     SetSiSensor(sisensor);
3749    
3750     st = CaloStrip(usemechanicalalignement);
3751     ResetAligParams();
3752     if(!usemechanicalalignement){
3753     // cout <<" SETTA I PARAMETRI DI ALLINEAMNETO -- da implementare"<<endl;
3754     }
3755    
3756     // Set(view,plane,0,GetSiSensor());
3757     } ///< Default Constructor.
3758    
3759    
3760    
3761     // relative to pamela reference system (convenzione emiliano):
3762     //
3763     // y ^
3764     // |
3765     // | 6 7 8 sisensor
3766     // | 3 4 5
3767     // | 0 1 2
3768     // ------------> x
3769     //
3770     // relative to silicon sensor
3771     //
3772     // S ^
3773     // | |
3774     // 2 | | <- strip direction
3775     // sensor 1 | |
3776     // 0 |...|...
3777     // ------------> L
3778     // 0 1 2
3779     // ladder
3780     //
3781     //
3782     void CaloStripRoto::Set(Int_t view, Int_t plane, float strip, int sisensor){
3783    
3784    
3785     SetView(view);
3786     SetPlane(plane);
3787    
3788    
3789     float size = 8.05; //(cm) larghezza del sensore + zone morte
3790    
3791    
3792     //----------------------------
3793     // Z-coordinate
3794     //----------------------------
3795    
3796     float coordCM_strip;
3797     if( strip >0. && strip < 95.){
3798     st.Set( view,plane,(int)strip);// istrip
3799     coordCM_strip = ( view ? st.GetY() : st.GetX() );
3800     coordCM_strip *= (1-strip+(int)strip);
3801     st.Set( view,plane,(int)strip+1);// istrip+1
3802     coordCM_strip += (strip-(int)strip)*( view ? st.GetY() : st.GetX() );
3803     }else{
3804     // cout << "CaloStripRoto::Set( "<<view<<","<<plane<<","<<strip<<","<<sisensor<<")"<<endl;
3805     // cout << " ---> ERROR: 0 =< strip =< 95 " << endl;
3806     if(strip>=95.)strip=95.;
3807     if(strip<=0.)strip=0.;
3808     st.Set( view,plane,(int)strip);// istrip
3809     coordCM_strip = ( view ? st.GetY() : st.GetX() );
3810     }
3811     float coordCm_Z0 = st.GetZ();
3812     //----------------------------
3813     // strip-segment coordinates
3814     //----------------------------
3815     float coordCm_LA = coordCM_strip;
3816     float coordCm_LB = coordCM_strip;
3817     float coordCm_SA = (-1)*size*1.5; //full calorimeter size
3818     float coordCm_SB = (+1)*size*1.5; //full calorimeter size
3819     float coordCm_ZA = coordCm_Z0;
3820     float coordCm_ZB = coordCm_Z0;
3821    
3822     //----------------------------
3823     // rototraslation
3824     //----------------------------
3825     //if sisensor is assigned (0,...8) the strip can be rototraslated
3826     bool ROTO = (sisensor>=0&&sisensor<9);
3827    
3828     if(ROTO){
3829    
3830    
3831     if(
3832     GetCaloSiSensor(view,(int)(strip/32),0) != sisensor &&
3833     GetCaloSiSensor(view,(int)(strip/32),1) != sisensor &&
3834     GetCaloSiSensor(view,(int)(strip/32),2) != sisensor &&
3835     true){
3836     cout << " Strip "<<strip<<" does not belong to sensor "<<sisensor<<endl;
3837     cout << " input data are inconsistent --- output might be wrong "<<endl;
3838     } ;
3839    
3840    
3841     int sensor = GetCaloSensor(view, sisensor);//0-1-2
3842     int ladder = GetCaloLadder(view, sisensor);//0-1-2
3843     if( ladder != (int)(strip / 32) ){
3844     cout << " void CaloStripRoto::Set(..) --- ERROR --- strip "<<strip<<" does not match Si-sensor "<<sisensor<<endl;
3845     return;
3846     }
3847    
3848     //-----------------------------
3849     // sensor origin coordinates
3850     //-----------------------------
3851    
3852     st.Set( view, plane, ladder*32); //strip = 0-32-64
3853     float coordCm_L0 = ( view ? st.GetY() : st.GetX());
3854     st.Set( (int)(!view), plane, sensor*32 );//strip = 0-32-64
3855     float coordCm_S0 = ( view ? st.GetX() : st.GetY());
3856    
3857     //set sensor size
3858     coordCm_SA = (-1)*size*0.5 + (sensor-1)*size;
3859     coordCm_SB = (+1)*size*0.5 + (sensor-1)*size;
3860    
3861     //coordinate relative al sensore
3862     coordCm_LA = coordCm_LA - coordCm_L0;
3863     coordCm_SA = coordCm_SA - coordCm_S0;
3864     coordCm_ZA = coordCm_ZA - coordCm_Z0;
3865     coordCm_LB = coordCm_LB - coordCm_L0;
3866     coordCm_SB = coordCm_SB - coordCm_S0;
3867     coordCm_ZB = coordCm_ZB - coordCm_Z0;
3868    
3869     //variazione di pitch
3870     coordCm_LA = coordCm_LA * fPitch;
3871     coordCm_LB = coordCm_LB * fPitch;
3872    
3873     //rotazione
3874     float LA = coordCm_LA - alpha * coordCm_SA;
3875     float SA = coordCm_SA + alpha * coordCm_LA;
3876     float LB = coordCm_LB - alpha * coordCm_SB;
3877     float SB = coordCm_SB + alpha * coordCm_LB;
3878    
3879     //traslazione
3880     coordCm_LA = LA + (!view ? shift[0] : shift[1]);
3881     coordCm_SA = SA + ( view ? shift[1] : shift[0]);
3882     coordCm_ZA = coordCm_ZA + shift[2];
3883     coordCm_LB = LB + shift[0];
3884     coordCm_SB = SB + shift[1];
3885     coordCm_ZB = coordCm_ZB + shift[2];
3886    
3887     //back to sistema di riferimento generale
3888    
3889     coordCm_LA = coordCm_LA + coordCm_L0;
3890     coordCm_SA = coordCm_SA + coordCm_S0;
3891     coordCm_ZA = coordCm_ZA + coordCm_Z0;
3892     coordCm_LB = coordCm_LB + coordCm_L0;
3893     coordCm_SB = coordCm_SB + coordCm_S0;
3894     coordCm_ZB = coordCm_ZB + coordCm_Z0;
3895    
3896     }
3897    
3898     fXA = (!view ? coordCm_LA : coordCm_SA);
3899     fYA = ( view ? coordCm_LA : coordCm_SA);
3900     fZA = coordCm_ZA;
3901    
3902     fXB = (!view ? coordCm_LB : coordCm_SB);
3903     fYB = ( view ? coordCm_LB : coordCm_SB);
3904     fZB = coordCm_ZB;
3905    
3906    
3907     st.Set(view,plane,(int)strip);// istrip
3908    
3909     };
3910     //
3911     //
3912     //
3913     //
3914     //
3915     //
3916     float CaloStripRoto::GetSpatialResolution(float def, float degx, float degy, float beta){
3917    
3918     float res_dig = 0.24/sqrt(12.);
3919    
3920     if(def==0.)return res_dig;
3921    
3922     float res_ms = 0.;
3923    
3924     // Int_t GetView(){return (fView-1);} ///< Get strip view [0-1]
3925     // Int_t GetPlane(){return (fPlane-1);} ///< Get strip plane [0-21]
3926     // Int_t GetStrip(){return (fStrip-1);} ///< Get strip number [0-95]
3927    
3928    
3929     float rig = 1/def; if(rig<0)rig = -rig;
3930     float factor = 0.;
3931     factor += TMath::Power(TMath::Tan(TMath::ACos(-1)*degx/180.),2);
3932     factor += TMath::Power(TMath::Tan(TMath::ACos(-1)*degy/180.),2);
3933     factor += 1.;
3934     factor = TMath::Sqrt(factor);
3935    
3936     int view = st.GetPlane()*2 + 1 - st.GetView() ;//cluster.view; //0... 43
3937    
3938     // int nW = (int)((view + 1)/2);
3939     float dW = 0.74*factor;//X0
3940     float dW_cm = 0.26*factor;//cm
3941     float dSi_cm = 0.; //cm
3942     if(view && st.GetPlane()>0) dSi_cm = ( st.GetPlane()%2 ? 0.228 : 0.428);
3943     dSi_cm *= factor;
3944     // multiple scattering angle
3945     float theta = 0.;//ms
3946     theta = 0.0136/rig;
3947     theta = theta * sqrt(dW) * (1.+0.038*log(dW));
3948     float Vt = theta*theta; //cov(theta,theta)
3949     float Vy = Vt * dW_cm * dW_cm /3.; //cov(y,y)
3950     float Vty = 0.87 * Vt * Vy; //cov(theta,y)
3951     float Vc = Vy + dSi_cm * dSi_cm * Vt + 2. * dSi_cm * Vty;
3952     float rms = sqrt( Vc );
3953     // if(isY)t_track.resy[ip] = sqrt(rms*rms + t_track.resy[ip]*t_track.resy[ip]);
3954     // else t_track.resx[ip] = sqrt(rms*rms + t_track.resx[ip]*t_track.resx[ip]);
3955     // if(isY) VMS[nW] = rms*rms;
3956     // if(_debug)cout <<endl<<view<<" nW "<<nW<<" res(MS) "<<rms<<" factor "<<factor;
3957    
3958     if(view>=3){
3959     cout << " --> NB resolution not accurate for layer "<<view<<endl;;
3960     cout <<"st.GetPlane() "<<st.GetPlane()<<endl;
3961     cout <<"st.GetView() "<<st.GetView()<<endl;
3962     }
3963     res_ms = rms;
3964    
3965     return sqrt(res_ms*res_ms + res_dig*res_dig);
3966    
3967     };
3968     /**
3969     *
3970     *
3971     *
3972     *
3973     */
3974     float CaloStripRoto::GetDistanceTo(float xP, float yP, float& xM, float &yM ){
3975    
3976    
3977     bool isX = fabs(fXA-fXB) < fabs(fYA-fYB);
3978    
3979    
3980     if(isX){
3981     float beta = (fXB-fXA)/(fYB-fYA);
3982     float alpha = fXA - beta * fYA;
3983     yM = ( yP + beta*xP - beta*alpha )/(1+beta*beta);
3984     xM = alpha + beta * yM;
3985     }else{
3986     float beta = (fYB-fYA)/(fXB-fXA);
3987     float alpha = fYA - beta * fXA;
3988     xM = ( xP + beta*yP - beta*alpha )/(1+beta*beta);
3989     yM = alpha + beta * xM;
3990     }
3991    
3992     return sqrt((xM-xP)*(xM-xP) + (yM-yP)*(yM-yP));
3993    
3994     };

  ViewVC Help
Powered by ViewVC 1.1.23