1 |
pam-fi |
1.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 |
|
|
} |