/[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.2 - (hide annotations) (download)
Wed Jun 4 07:57:03 2014 UTC (10 years, 6 months ago) by pam-ts
Branch: MAIN
Changes since 1.1: +3198 -55 lines
New tracking algorythm implementation (extended to up to 2 calorimeter planes and with level1 cleaning for nuclei)

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

  ViewVC Help
Powered by ViewVC 1.1.23