/[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.4 - (hide annotations) (download)
Mon Jun 23 08:34:18 2014 UTC (10 years, 5 months ago) by pam-ts
Branch: MAIN
Changes since 1.3: +1 -1 lines
extended tracking-algorythm flag added
C

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

  ViewVC Help
Powered by ViewVC 1.1.23