1 |
#include <PamLevel2.h> |
2 |
//-------------------------------------- |
3 |
// |
4 |
// |
5 |
//-------------------------------------- |
6 |
/** |
7 |
* Default constructor |
8 |
*/ |
9 |
PamTrack::PamTrack(){ |
10 |
trk_track = this->TrkTrack::GetTrkTrack(); |
11 |
calo_track = this->CaloTrkVar::GetCaloTrkVar(); |
12 |
tof_track = this->ToFTrkVar::GetToFTrkVar(); |
13 |
}; |
14 |
//-------------------------------------- |
15 |
// |
16 |
// |
17 |
//-------------------------------------- |
18 |
/** |
19 |
* Constructor |
20 |
*/ |
21 |
PamTrack::PamTrack(TrkTrack* t, CaloTrkVar* c, ToFTrkVar* o){ |
22 |
trk_track = this->TrkTrack::GetTrkTrack(); |
23 |
calo_track = this->CaloTrkVar::GetCaloTrkVar(); |
24 |
tof_track = this->ToFTrkVar::GetToFTrkVar(); |
25 |
if(t) *trk_track = *t; |
26 |
if(c) *calo_track = *c; |
27 |
if(o) *tof_track = *o; |
28 |
}; |
29 |
|
30 |
//-------------------------------------- |
31 |
// |
32 |
// |
33 |
//-------------------------------------- |
34 |
/** |
35 |
* Constructor |
36 |
*/ |
37 |
PamLevel2::PamLevel2(){ |
38 |
trk_obj = this->TrkLevel2::GetTrkLevel2(); |
39 |
calo_obj = this->CaloLevel2::GetCaloLevel2(); |
40 |
tof_obj = this->ToFLevel2::GetToFLevel2(); |
41 |
trig_obj = this->TrigLevel2::GetTrigLevel2(); |
42 |
s4_obj = this->S4Level2::GetS4Level2(); |
43 |
nd_obj = this->NDLevel2::GetNDLevel2(); |
44 |
ac_obj = this->AcLevel2::GetAcLevel2(); |
45 |
}; |
46 |
//-------------------------------------- |
47 |
// |
48 |
// |
49 |
//-------------------------------------- |
50 |
/** |
51 |
* Retrieves the it-th stored track. |
52 |
* It override TrkLevel2::GetTrack(int it). |
53 |
* @param itrk Track number, ranging from 0 to GetNTracks(). |
54 |
*/ |
55 |
|
56 |
PamTrack* PamLevel2::GetStoredTrack(Int_t itrk){ |
57 |
|
58 |
// retrieve itrk-th tracker stored track |
59 |
TrkTrack *t = 0; |
60 |
CaloTrkVar *c = 0; |
61 |
ToFTrkVar *o = 0; |
62 |
|
63 |
if( itrk >=0 && itrk < TrkLevel2::ntrk() ){ |
64 |
t = TrkLevel2::GetStoredTrack(itrk); |
65 |
c = CaloLevel2::GetCaloTrkVar(t->GetSeqNo()); |
66 |
o = ToFLevel2::GetToFTrkVar(t->GetSeqNo()); |
67 |
}; |
68 |
// retrieve related ToF-track |
69 |
|
70 |
// hence create a "PamTrack" object |
71 |
PamTrack *track = 0; |
72 |
if(t && c && o)track = new PamTrack(t,c,o); |
73 |
return track; |
74 |
|
75 |
} |
76 |
//-------------------------------------- |
77 |
// |
78 |
// |
79 |
//-------------------------------------- |
80 |
/** |
81 |
* Sort physical (tracker) tracks and stores them in a TObjectArray (of TrkTrack objects). |
82 |
* The total number of physical tracks is given by GetNTracks() and the it-th physical track can be retrieved by means of the method GetTrack(int it). |
83 |
* This method overrides TrkLevel2::GetTracks(), where sorting is done by decreasing number of fit points and increasing chi^2. |
84 |
* PamLevel2::GetTracks() keeps the same track order given by TrkLevel2::GetTracks(), but checks image selection by using calorimeter and ToF tracking information. |
85 |
*/ |
86 |
TClonesArray *PamLevel2::GetTracks(){ |
87 |
|
88 |
// define new array for sorted tracker tracks |
89 |
TClonesArray *aa = new TClonesArray("TrkTrack"); |
90 |
TClonesArray &sorted = *aa; |
91 |
|
92 |
// loop over the tracks sorted by the tracker |
93 |
for(Int_t i=0; i < TrkLevel2::GetNTracks(); i++){ |
94 |
|
95 |
TrkTrack *ts=0; |
96 |
|
97 |
// get tracker tracks |
98 |
TrkTrack *tp = TrkLevel2::GetTrack(i); //tracker |
99 |
CaloTrkVar *cp = CaloLevel2::GetCaloTrkVar(tp->GetSeqNo()); //calorimeter |
100 |
ToFTrkVar *op = ToFLevel2::GetToFTrkVar(tp->GetSeqNo()); //tof |
101 |
|
102 |
// if track has an image, check image selection |
103 |
if(tp->HasImage()){ |
104 |
TrkTrack *ti = TrkLevel2::GetTrackImage(i); //tracker (image) |
105 |
CaloTrkVar *ci = CaloLevel2::GetCaloTrkVar(ti->GetSeqNo());//calorimeter (image) |
106 |
ToFTrkVar *oi = ToFLevel2::GetToFTrkVar(ti->GetSeqNo()); //tof (image) |
107 |
|
108 |
//assign starting scores |
109 |
Int_t tp_score = 1; |
110 |
Int_t ti_score = 0; |
111 |
// ------------------------ |
112 |
// calorimeter check |
113 |
// ------------------------ |
114 |
if( |
115 |
npcfit[1] > 3 && //no. of fit planes on Y view |
116 |
// varcfit[1] < 50.&& //fit variance on Y view |
117 |
true){ |
118 |
|
119 |
Float_t resy_p = cp->tbar[0][1] - cbar[0][1];if(resy_p < 0)resy_p= - resy_p; |
120 |
Float_t resy_i = ci->tbar[0][1] - cbar[0][1];if(resy_i < 0)resy_i= - resy_i; |
121 |
|
122 |
if(resy_p <= resy_i) tp_score++; |
123 |
else ti_score++; |
124 |
}; |
125 |
// ------------------------ |
126 |
// TOF check |
127 |
// ------------------------ |
128 |
|
129 |
// ------------------------ |
130 |
// the winner is.... |
131 |
// ------------------------ |
132 |
if(tp_score > ti_score) ts = tp;//the track sorted by the tracker!! |
133 |
else ts = ti;//its image!! |
134 |
|
135 |
}else{ |
136 |
ts = tp; |
137 |
}; |
138 |
|
139 |
new(sorted[i]) TrkTrack(*ts); //save the track in the sorted array |
140 |
}; |
141 |
|
142 |
return aa; |
143 |
}; |
144 |
//-------------------------------------- |
145 |
// |
146 |
// |
147 |
//-------------------------------------- |
148 |
/** |
149 |
* Retrieves the it-th Pamela "physical" track. |
150 |
* It override TrkLevel2::GetTrack(int it). |
151 |
* @param it Track number, ranging from 0 to GetNTracks(). |
152 |
*/ |
153 |
PamTrack *PamLevel2::GetTrack(int it){ |
154 |
|
155 |
TClonesArray *aa = this->GetTracks(); |
156 |
TClonesArray &sorted = *aa; |
157 |
|
158 |
TrkTrack *t = 0; |
159 |
CaloTrkVar *c = 0; |
160 |
ToFTrkVar *o = 0; |
161 |
|
162 |
if( it >=0 && it < TrkLevel2::GetNTracks() ){ |
163 |
t = (TrkTrack*)sorted[it]; |
164 |
c = CaloLevel2::GetCaloTrkVar(t->GetSeqNo()); |
165 |
o = ToFLevel2::GetToFTrkVar(t->GetSeqNo()); |
166 |
}; |
167 |
|
168 |
// hence create a "PamTrack" object |
169 |
PamTrack *track = 0; |
170 |
if(t && c && o)track = new PamTrack(t,c,o); |
171 |
return track; |
172 |
|
173 |
}; |
174 |
//-------------------------------------- |
175 |
// |
176 |
// |
177 |
//-------------------------------------- |
178 |
/** |
179 |
* Retrieves (if present) the image of the it-th Pamela "physical" track, sorted by the method PamLevel2::GetTracks(). |
180 |
* @param it Track number, ranging from 0 to GetNTracks(). |
181 |
*/ |
182 |
PamTrack *PamLevel2::GetTrackImage(int it){ |
183 |
|
184 |
TClonesArray *aa = this->GetTracks(); |
185 |
TClonesArray &sorted = *aa; |
186 |
|
187 |
TrkTrack *t = 0; |
188 |
CaloTrkVar *c = 0; |
189 |
ToFTrkVar *o = 0; |
190 |
|
191 |
if( it >=0 && it < TrkLevel2::GetNTracks() ){ |
192 |
TrkTrack *temp = (TrkTrack*)sorted[it]; |
193 |
if( temp->HasImage() ){ |
194 |
t = TrkLevel2::GetStoredTrack(temp->GetImageSeqNo()); |
195 |
c = CaloLevel2::GetCaloTrkVar(temp->GetImageSeqNo()); |
196 |
o = ToFLevel2::GetToFTrkVar(temp->GetImageSeqNo()); |
197 |
}; |
198 |
}; |
199 |
|
200 |
// hence create a "PamTrack" object |
201 |
PamTrack *image = 0; |
202 |
if(t && c && o)image = new PamTrack(t,c,o); |
203 |
return image; |
204 |
|
205 |
} |
206 |
|
207 |
//-------------------------------------- |
208 |
// |
209 |
// |
210 |
//-------------------------------------- |
211 |
/** |
212 |
* Get the Pamela detector trees and make them friends. |
213 |
*/ |
214 |
TTree *PamLevel2::LoadPamTrees(TFile *f){ |
215 |
|
216 |
TTree *Tout =0; |
217 |
|
218 |
// Tracker |
219 |
TTree *T = (TTree*)f->Get("Tracker"); |
220 |
if(T) { |
221 |
T->SetBranchAddress("TrkLevel2", GetPointerToTrk()); |
222 |
cout << "Tracker : set branch address TrkLevel2"<<endl; |
223 |
if(!Tout)Tout=T; |
224 |
}else{ |
225 |
cout << "Tracker : missing tree"<<endl; |
226 |
}; |
227 |
// Calorimeter |
228 |
TTree *C = (TTree*)f->Get("Calorimeter"); |
229 |
if(C) { |
230 |
C->SetBranchAddress("CaloLevel2", GetPointerToCalo()); |
231 |
cout << "Calorimeter : set branch address CaloLevel2"<<endl; |
232 |
if(!Tout)Tout=C; |
233 |
else Tout->AddFriend(C); |
234 |
}else{ |
235 |
cout << "Calorimeter : missing tree"<<endl; |
236 |
}; |
237 |
// ToF |
238 |
TTree *O = (TTree*)f->Get("ToF"); |
239 |
if(O) { |
240 |
O->SetBranchAddress("ToFLevel2", GetPointerToToF()); |
241 |
cout << "ToF : set branch address ToFLevel2"<<endl; |
242 |
if(!Tout)Tout=O; |
243 |
else Tout->AddFriend(O); |
244 |
}else{ |
245 |
cout << "ToF : missing tree"<<endl; |
246 |
}; |
247 |
// Trigger |
248 |
TTree *R = (TTree*)f->Get("Trigger"); |
249 |
if(R) { |
250 |
R->SetBranchAddress("TrigLevel2", GetPointerToTrig()); |
251 |
cout << "Trigger : set branch address TrigLevel2"<<endl; |
252 |
if(!Tout)Tout=O; |
253 |
else Tout->AddFriend(R); |
254 |
}else{ |
255 |
cout << "Trigger : missing tree"<<endl; |
256 |
}; |
257 |
// S4 |
258 |
TTree *S = (TTree*)f->Get("S4"); |
259 |
if(S) { |
260 |
S->SetBranchAddress("S4Level2", GetPointerToS4()); |
261 |
cout << "S4 : set branch address S4Level2"<<endl; |
262 |
if(!Tout)Tout=O; |
263 |
else Tout->AddFriend(S); |
264 |
}else{ |
265 |
cout << "S4 : missing tree"<<endl; |
266 |
}; |
267 |
// Neutron Detector |
268 |
TTree *N = (TTree*)f->Get("NeutronD"); |
269 |
if(N) { |
270 |
N->SetBranchAddress("NDLevel2", GetPointerToND()); |
271 |
cout << "NeutronD : set branch address NDLevel2"<<endl; |
272 |
if(!Tout)Tout=O; |
273 |
else Tout->AddFriend(N); |
274 |
}else{ |
275 |
cout << "NeutronD : missing tree"<<endl; |
276 |
}; |
277 |
// Anticounters |
278 |
TTree *A = (TTree*)f->Get("Anticounter"); |
279 |
if(A) { |
280 |
A->SetBranchAddress("AcLevel2", GetPointerToAc()); |
281 |
cout << "Anticounter : set branch address AcLevel2"<<endl; |
282 |
if(!Tout)Tout=O; |
283 |
else Tout->AddFriend(A); |
284 |
}else{ |
285 |
cout << "Anticounter : missing tree"<<endl; |
286 |
}; |
287 |
|
288 |
return Tout; |
289 |
|
290 |
} |