]>
Commit | Line | Data |
---|---|---|
46f95026 | 1 | /************************************************************************* |
cd469d61 | 2 | * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. * |
3 | * * | |
4 | * Author: The ALICE Off-line Project. * | |
5 | * Contributors are mentioned in the code where appropriate. * | |
6 | * * | |
7 | * Permission to use, copy, modify and distribute this software and its * | |
8 | * documentation strictly for non-commercial purposes is hereby granted * | |
9 | * without fee, provided that the above copyright notice appears in all * | |
10 | * copies and that both the copyright notice and this permission notice * | |
11 | * appear in the supporting documentation. The authors make no claims * | |
12 | * about the suitability of this software for any purpose. It is * | |
13 | * provided "as is" without express or implied warranty. * | |
14 | **************************************************************************/ | |
15 | ||
16 | // | |
17 | // Implementation of a branch replicator | |
18 | // to produce aods with only few branches. | |
19 | // | |
20 | // This replicator is in charge of replicating the nuclei primary vertices | |
21 | // tracks identified as nuclei with Z>=2, secondary vertices in form of | |
420938a5 | 22 | // AliAODRecoDecayLF2Prong and their daughter tracks. |
cd469d61 | 23 | // These informations are stored into a reduced AODs (AliAOD.NuclEx.root) |
24 | // | |
25 | // The vertices are filtered so that only the primary vertices make it | |
26 | // to the output aods. | |
27 | // | |
420938a5 | 28 | // The secondary vertices are recreated here, as a AliAODRecoDecayLF2Prong |
cd469d61 | 29 | // plus cuts that select secondary vericesoutside the primary vertex |
30 | ||
31 | // Authors: S. Bufalino (stefania.bufalino@cern.ch) | |
32 | // R. Lea (ramona.lea@cern.ch) | |
33 | // Based on AliAODMuonReplicator.cxx | |
34 | ||
35 | ||
36 | class AliESDv0; | |
37 | class AliESDVertex; | |
38 | class AliAODVertex; | |
39 | class AliAODRecoDecay; | |
40 | ||
41 | #include "AliAODDimuon.h" | |
42 | #include "AliAODEvent.h" | |
43 | #include "AliAODMCHeader.h" | |
44 | #include "AliAODMCParticle.h" | |
45 | #include "AliAODTZERO.h" | |
46 | #include "AliAODTrack.h" | |
47 | #include "AliAODVZERO.h" | |
420938a5 | 48 | //#include "AliAnalysisCuts.h" |
cd469d61 | 49 | #include "TF1.h" |
50 | #include "AliExternalTrackParam.h" | |
51 | #include "AliESDv0.h" | |
52 | #include "AliAODv0.h" | |
53 | #include "AliPIDResponse.h" | |
54 | #include <iostream> | |
55 | #include <cassert> | |
56 | #include "AliESDtrack.h" | |
57 | #include "TObjArray.h" | |
58 | #include "AliAnalysisFilter.h" | |
59 | #include "AliAODRecoDecay.h" | |
420938a5 | 60 | #include "AliAODRecoDecayLF.h" |
61 | #include "AliAODRecoDecayLF2Prong.h" | |
cd469d61 | 62 | |
63 | #include <TFile.h> | |
64 | #include <TDatabasePDG.h> | |
65 | #include <TString.h> | |
66 | #include <TList.h> | |
67 | #include "AliLog.h" | |
68 | #include "AliVEvent.h" | |
69 | #include "AliVVertex.h" | |
70 | #include "AliVTrack.h" | |
71 | #include "AliVertexerTracks.h" | |
72 | #include "AliKFVertex.h" | |
73 | #include "AliESDEvent.h" | |
74 | #include "AliESDVertex.h" | |
75 | #include "AliESDtrackCuts.h" | |
76 | #include "AliAODEvent.h" | |
77 | #include "AliAnalysisFilter.h" | |
420938a5 | 78 | //#include "AliAnalysisVertexingLF.h" |
cd469d61 | 79 | #include "AliAnalysisManager.h" |
80 | #include "AliAODNuclExReplicator.h" | |
81 | #include "TH1.h" | |
82 | #include "TCanvas.h" | |
83 | #include "AliInputEventHandler.h" | |
84 | ||
85 | using std::cout; | |
86 | using std::endl; | |
87 | ||
88 | ClassImp(AliAODNuclExReplicator) | |
89 | ||
90 | //_____________________________________________________________________________ | |
91 | AliAODNuclExReplicator::AliAODNuclExReplicator(const char* name, const char* title, | |
420938a5 | 92 | // AliAnalysisCuts* trackCut, |
93 | // AliAnalysisCuts* vertexCut, | |
cd469d61 | 94 | Int_t mcMode, |
95 | Int_t nsigmaTrk1, Int_t partType1, | |
96 | Int_t nsigmaTrk2, Int_t partType2 | |
97 | ) | |
98 | :AliAODBranchReplicator(name,title), | |
99 | fBzkG(0.), | |
100 | fCosMin(), | |
101 | fDCAtracksMin(), | |
102 | fRmax(), | |
103 | fRmin(), | |
104 | fDNmin(), | |
105 | fDPmin(), | |
106 | fHeader(0x0), | |
420938a5 | 107 | //fVertexCut(vertexCut), |
108 | fVertices(0x0), | |
cd469d61 | 109 | fNuclei(0x0), |
420938a5 | 110 | // fTrackCut(trackCut), |
111 | fSecondaryVerices(0x0), | |
cd469d61 | 112 | fDaughterTracks(0x0), |
113 | fList(0x0), | |
114 | fMCParticles(0x0), | |
115 | fMCHeader(0x0), | |
116 | fMCMode(mcMode), | |
117 | fLabelMap(), | |
118 | fParticleSelected(), | |
119 | fReplicateHeader(kTRUE), //replicateHeader //to be fixed | |
120 | fnSigmaTrk1(nsigmaTrk1), | |
121 | fnSigmaTrk2(nsigmaTrk2), | |
122 | fpartType1(partType1), | |
123 | fpartType2(partType2), | |
124 | fSecVtxWithKF(kFALSE), | |
125 | fVertexerTracks(0x0), | |
126 | fV1(0x0), | |
127 | fAODMapSize(0), | |
128 | fAODMap(0) | |
129 | ||
130 | { | |
131 | // default ctor | |
132 | } | |
133 | ||
134 | //_____________________________________________________________________________ | |
135 | AliAODNuclExReplicator::~AliAODNuclExReplicator() | |
136 | { | |
137 | // destructor | |
420938a5 | 138 | // delete fTrackCut; |
139 | // delete fVertexCut; | |
cd469d61 | 140 | delete fList; |
141 | } | |
142 | ||
143 | //_____________________________________________________________________________ | |
144 | void AliAODNuclExReplicator::SelectParticle(Int_t i) | |
145 | { | |
146 | // taking the absolute values here, need to take care | |
147 | // of negative daughter and mother | |
148 | // IDs when setting! | |
149 | ||
150 | if (!IsParticleSelected(TMath::Abs(i))) | |
151 | { | |
152 | fParticleSelected.Add(TMath::Abs(i),1); | |
153 | } | |
154 | } | |
155 | ||
156 | //_____________________________________________________________________________ | |
157 | Bool_t AliAODNuclExReplicator::IsParticleSelected(Int_t i) | |
158 | { | |
159 | // taking the absolute values here, need to take | |
160 | // care with negative daughter and mother | |
161 | // IDs when setting! | |
162 | return (fParticleSelected.GetValue(TMath::Abs(i))==1); | |
163 | } | |
164 | ||
165 | ||
166 | //_____________________________________________________________________________ | |
167 | void AliAODNuclExReplicator::CreateLabelMap(const AliAODEvent& source) | |
168 | { | |
169 | // | |
170 | // this should be called once all selections are done | |
171 | // | |
172 | ||
173 | fLabelMap.Delete(); | |
174 | ||
175 | TClonesArray* mcParticles = static_cast<TClonesArray*>(source.FindListObject(AliAODMCParticle::StdBranchName())); | |
176 | ||
177 | Int_t i(0); | |
178 | Int_t j(0); | |
179 | ||
180 | TIter next(mcParticles); | |
181 | ||
182 | while ( next() ) | |
183 | { | |
184 | if (IsParticleSelected(i)) | |
185 | { | |
186 | fLabelMap.Add(i,j++); | |
187 | } | |
188 | ++i; | |
189 | } | |
190 | } | |
191 | ||
192 | //_____________________________________________________________________________ | |
193 | Int_t AliAODNuclExReplicator::GetNewLabel(Int_t i) | |
194 | { | |
195 | // Gets the label from the new created Map | |
196 | // Call CreatLabelMap before | |
197 | // otherwise only 0 returned | |
198 | return fLabelMap.GetValue(TMath::Abs(i)); | |
199 | } | |
200 | ||
201 | //_____________________________________________________________________________ | |
202 | // void AliAODNuclExReplicator::FilterMC(const AliAODEvent& source) | |
203 | // { | |
204 | // // Filter MC information | |
205 | ||
206 | // fMCHeader->Reset(); | |
207 | // fMCParticles->Clear("C"); | |
208 | ||
209 | // AliAODMCHeader* mcHeader(0x0); | |
210 | // TClonesArray* mcParticles(0x0); | |
211 | ||
212 | // fParticleSelected.Delete(); | |
213 | ||
214 | // if ( fMCMode>=2 && !fTracks->GetEntries() ) return; | |
215 | // // for fMCMode==1 we only copy MC information for events where there's at least one muon track | |
216 | ||
217 | // mcHeader = static_cast<AliAODMCHeader*>(source.FindListObject(AliAODMCHeader::StdBranchName())); | |
218 | ||
219 | // if ( mcHeader ) | |
220 | // { | |
221 | // *fMCHeader = *mcHeader; | |
222 | // } | |
223 | ||
224 | // mcParticles = static_cast<TClonesArray*>(source.FindListObject(AliAODMCParticle::StdBranchName())); | |
225 | ||
226 | // if ( mcParticles && fMCMode>=2 ) | |
227 | // { | |
228 | // // loop on (kept) muon tracks to find their ancestors | |
229 | // TIter nextMT(fTracks); | |
230 | // AliAODTrack* mt; | |
231 | ||
232 | // while ( ( mt = static_cast<AliAODTrack*>(nextMT()) ) ) | |
233 | // { | |
234 | // Int_t label = mt->GetLabel(); | |
235 | ||
236 | // while ( label >= 0 ) | |
237 | // { | |
238 | // SelectParticle(label); | |
239 | // AliAODMCParticle* mother = static_cast<AliAODMCParticle*>(mcParticles->UncheckedAt(label)); | |
240 | // if (!mother) | |
241 | // { | |
242 | // AliError("Got a null mother ! Check that !"); | |
243 | // label = -1; | |
244 | // } | |
245 | // else | |
246 | // { | |
247 | // label = mother->GetMother(); | |
248 | // } | |
249 | // } | |
250 | // } | |
251 | ||
252 | // CreateLabelMap(source); | |
253 | ||
254 | // // Actual filtering and label remapping (shamelessly taken for the implementation of AliAODHandler::StoreMCParticles) | |
255 | // TIter nextMC(mcParticles); | |
256 | // AliAODMCParticle* p; | |
257 | // Int_t nmc(0); | |
258 | // Int_t nmcout(0); | |
259 | ||
260 | // while ( ( p = static_cast<AliAODMCParticle*>(nextMC()) ) ) | |
261 | // { | |
262 | // AliAODMCParticle c(*p); | |
263 | ||
264 | // if ( IsParticleSelected(nmc) ) | |
265 | // { | |
266 | // // | |
267 | // Int_t d0 = p->GetDaughter(0); | |
268 | // Int_t d1 = p->GetDaughter(1); | |
269 | // Int_t m = p->GetMother(); | |
270 | ||
271 | // // other than for the track labels, negative values mean | |
272 | // // no daughter/mother so preserve it | |
273 | ||
274 | // if(d0<0 && d1<0) | |
275 | // { | |
276 | // // no first daughter -> no second daughter | |
277 | // // nothing to be done | |
278 | // // second condition not needed just for sanity check at the end | |
279 | // c.SetDaughter(0,d0); | |
280 | // c.SetDaughter(1,d1); | |
281 | // } else if(d1 < 0 && d0 >= 0) | |
282 | // { | |
283 | // // Only one daughter | |
284 | // // second condition not needed just for sanity check at the end | |
285 | // if(IsParticleSelected(d0)) | |
286 | // { | |
287 | // c.SetDaughter(0,GetNewLabel(d0)); | |
288 | // } else | |
289 | // { | |
290 | // c.SetDaughter(0,-1); | |
291 | // } | |
292 | // c.SetDaughter(1,d1); | |
293 | // } | |
294 | // else if (d0 > 0 && d1 > 0 ) | |
295 | // { | |
296 | // // we have two or more daughters loop on the stack to see if they are | |
297 | // // selected | |
298 | // Int_t d0tmp = -1; | |
299 | // Int_t d1tmp = -1; | |
300 | // for (int id = d0; id<=d1;++id) | |
301 | // { | |
302 | // if (IsParticleSelected(id)) | |
303 | // { | |
304 | // if(d0tmp==-1) | |
305 | // { | |
306 | // // first time | |
307 | // d0tmp = GetNewLabel(id); | |
308 | // d1tmp = d0tmp; // this is to have the same schema as on the stack i.e. with one daugther d0 and d1 are the same | |
309 | // } | |
310 | // else d1tmp = GetNewLabel(id); | |
311 | // } | |
312 | // } | |
313 | // c.SetDaughter(0,d0tmp); | |
314 | // c.SetDaughter(1,d1tmp); | |
315 | // } else | |
316 | // { | |
317 | // AliError(Form("Unxpected indices %d %d",d0,d1)); | |
318 | // } | |
319 | ||
320 | // if ( m < 0 ) | |
321 | // { | |
322 | // c.SetMother(m); | |
323 | // } else | |
324 | // { | |
325 | // if (IsParticleSelected(m)) | |
326 | // { | |
327 | // c.SetMother(GetNewLabel(m)); | |
328 | // } | |
329 | // else | |
330 | // { | |
331 | // AliError(Form("PROBLEM Mother not selected %d", m)); | |
332 | // } | |
333 | // } | |
334 | ||
335 | // new ((*fMCParticles)[nmcout++]) AliAODMCParticle(c); | |
336 | // } | |
337 | ||
338 | // ++nmc; | |
339 | // } | |
340 | ||
341 | // // now remap the tracks... | |
342 | ||
343 | // TIter nextTrack(fTracks); | |
344 | // AliAODTrack* t; | |
345 | ||
346 | // while ( ( t = static_cast<AliAODTrack*>(nextTrack()) ) ) | |
347 | // { | |
348 | // t->SetLabel(GetNewLabel(t->GetLabel())); | |
349 | // } | |
350 | ||
351 | // } | |
352 | // else if ( mcParticles ) | |
353 | // { | |
354 | // // simple copy of input MC particles to ouput MC particles | |
355 | // TIter nextMC(mcParticles); | |
356 | // AliAODMCParticle* p; | |
357 | // Int_t nmcout(0); | |
358 | ||
359 | // while ( ( p = static_cast<AliAODMCParticle*>(nextMC()) ) ) | |
360 | // { | |
361 | // new ((*fMCParticles)[nmcout++]) AliAODMCParticle(*p); | |
362 | // } | |
363 | // } | |
364 | ||
365 | // AliDebug(1,Form("input mc %d output mc %d", | |
366 | // mcParticles ? mcParticles->GetEntries() : 0, | |
367 | // fMCParticles ? fMCParticles->GetEntries() : 0)); | |
368 | ||
369 | // } | |
370 | ||
371 | ||
372 | //_____________________________________________________________________________ | |
373 | TList* AliAODNuclExReplicator::GetList() const | |
374 | { | |
375 | // return (and build if not already done) our internal list of managed objects | |
376 | if (!fList) | |
377 | { | |
378 | ||
379 | if ( fReplicateHeader ) | |
380 | { | |
381 | fHeader = new AliAODHeader; | |
382 | } | |
383 | ||
384 | ||
420938a5 | 385 | fSecondaryVerices = new TClonesArray("AliAODRecoDecayLF2Prong",30); |
cd469d61 | 386 | fSecondaryVerices->SetName("SecondaryVertices"); |
387 | ||
388 | fVertices = new TClonesArray("AliAODVertex",2); | |
389 | fVertices->SetName("vertices"); | |
390 | ||
391 | fNuclei = new TClonesArray("AliAODTrack",30); | |
392 | fNuclei->SetName("Nuclei"); | |
393 | ||
394 | fDaughterTracks = new TClonesArray("AliAODTrack",30); | |
395 | fDaughterTracks->SetName("DaughterTracks"); | |
396 | ||
397 | ||
398 | fList = new TList; | |
399 | fList->SetOwner(kTRUE); | |
400 | ||
401 | fList->Add(fHeader); | |
402 | fList->Add(fVertices); | |
403 | fList->Add(fNuclei); | |
404 | fList->Add(fSecondaryVerices); | |
405 | fList->Add(fDaughterTracks); | |
406 | ||
407 | ||
408 | if ( fMCMode > 0 ) | |
409 | { | |
410 | fMCHeader = new AliAODMCHeader; | |
411 | fMCParticles = new TClonesArray("AliAODMCParticle",1000); | |
412 | fMCParticles->SetName(AliAODMCParticle::StdBranchName()); | |
413 | fList->Add(fMCHeader); | |
414 | fList->Add(fMCParticles); | |
415 | } | |
416 | } | |
417 | return fList; | |
418 | } | |
419 | ||
420 | //_____________________________________________________________________________ | |
421 | void AliAODNuclExReplicator::ReplicateAndFilter(const AliAODEvent& source) | |
422 | { | |
423 | // Replicate (and filter if filters are there) the relevant parts we're interested in AODEvent | |
424 | ||
425 | //----------------------------------------------- | |
426 | // AliPIDResponse | |
427 | ||
428 | AliPIDResponse *fPIDResponse; | |
429 | AliAnalysisManager *man=AliAnalysisManager::GetAnalysisManager(); | |
430 | AliInputEventHandler* inputHandler = (AliInputEventHandler*) (man->GetInputEventHandler()); | |
431 | fPIDResponse = inputHandler->GetPIDResponse(); | |
432 | ||
433 | //-------------------------------------------------------- | |
434 | ||
7b08784f | 435 | // printf("Execute NuclEx Replicator\n"); |
cd469d61 | 436 | |
420938a5 | 437 | //--------------------------------- |
438 | ||
cd469d61 | 439 | if (fReplicateHeader) |
440 | { | |
0a918d8d | 441 | AliAODHeader * header = dynamic_cast<AliAODHeader*>(source.GetHeader()); |
442 | if(!header) AliFatal("Not a standard AOD"); | |
443 | *fHeader = *(header); | |
cd469d61 | 444 | } |
445 | ||
446 | fVertices->Clear("C"); | |
447 | ||
448 | fNuclei->Clear("C"); | |
449 | ||
450 | fSecondaryVerices->Clear("C"); | |
451 | ||
452 | fDaughterTracks->Clear("C"); | |
420938a5 | 453 | |
454 | //---------------------------------- | |
cd469d61 | 455 | |
456 | // cout<<"Centrality AOD source: "<<source.GetHeader()->GetCentrality()<<endl; | |
457 | ||
458 | Int_t nsv(0); | |
459 | Int_t nnuclei(0); | |
460 | Int_t ntracksD(0); | |
461 | ||
462 | Int_t input(0); | |
463 | Double_t xdummy,ydummy; | |
464 | ||
420938a5 | 465 | AliAODRecoDecayLF2Prong *io2Prong = 0; |
cd469d61 | 466 | |
467 | TObjArray *twoTrackArray = new TObjArray(2); | |
468 | Double_t dispersion; | |
469 | ||
470 | // cout<<"Qui"<<endl; | |
471 | //cout<<source.GetMagneticField()<<endl; | |
472 | ||
473 | AliAODVertex *vtx = source.GetPrimaryVertex(); | |
474 | ||
475 | // cout<<"Source "<<source<<endl; | |
476 | //cout<<"vtx: "<<vtx<<endl; | |
477 | ||
478 | // A Set of very loose cut for a weak strange decay | |
479 | ||
480 | fCosMin = 0.99; | |
481 | fDCAtracksMin = 1; | |
482 | fRmax = 200.; | |
483 | fRmin = 0.1; | |
484 | fDNmin = 0.05; | |
485 | fDPmin = 0.05; | |
486 | ||
487 | //---------------------------------------------------------- | |
488 | ||
489 | // Int_t nindices=0; | |
490 | UShort_t *indices = 0; | |
491 | const Int_t entries = source.GetNumberOfTracks(); | |
492 | ||
493 | Double_t pos[3],cov[6]; | |
494 | vtx->GetXYZ(pos); | |
495 | vtx->GetCovarianceMatrix(cov); | |
496 | fV1 = new AliESDVertex(pos,cov,100.,100,vtx->GetName()); | |
497 | // cout<<"fV1 pricipal loop: "<<fV1<<endl; | |
498 | ||
499 | if(entries<=0) return; | |
500 | indices = new UShort_t[entries]; | |
501 | memset(indices,0,sizeof(UShort_t)*entries); | |
502 | fAODMapSize = 100000; | |
503 | fAODMap = new Int_t[fAODMapSize]; | |
504 | memset(fAODMap,0,sizeof(Int_t)*fAODMapSize); | |
505 | // cent=((AliAODEvent&)source)->GetCentrality(); | |
506 | ||
507 | //------------------------------------------------------------- | |
508 | ||
420938a5 | 509 | //AliAODRecoDecayLF *rd = 0; |
46f95026 | 510 | // AliAODRecoDecayLF2Prong*rd = 0; |
cd469d61 | 511 | |
512 | ||
513 | if(vtx->GetNContributors()<1) { | |
514 | ||
515 | // SPD vertex cut | |
516 | vtx =source.GetPrimaryVertexSPD(); | |
517 | ||
518 | if(vtx->GetNContributors()<1) { | |
519 | Info("AliAnalysisTaskHelium3Pi","No good vertex, skip event"); | |
520 | return; // NO GOOD VERTEX, SKIP EVENT | |
521 | } | |
522 | } | |
523 | ||
7e4263f5 | 524 | Double_t xPrimaryVertex=0.,yPrimaryVertex=0.; |
cd469d61 | 525 | xPrimaryVertex=vtx->GetX(); |
526 | yPrimaryVertex=vtx->GetY(); | |
cd469d61 | 527 | |
528 | fBzkG=source.GetMagneticField(); | |
529 | fVertexerTracks=new AliVertexerTracks(fBzkG); | |
530 | ||
531 | // TF1 *foPion=new TF1("foPion", "[0]*([1]*TMath::Power(TMath::Sqrt(1 + (x/0.13957)*(x/0.13957))/(x/0.13957) , [3]) - 1 - TMath::Power(TMath::Sqrt(1 + (x/0.13957)*(x/0.13957))/(x/0.13957) , [3])*TMath::Log([2] + 1/TMath::Power((x/0.13957), [4])))",0.01,20); | |
532 | // foPion->SetParameters(4.1,8.98482806165147636e+00,1.54000000000000005e-05,2.30445734159456084e+00,2.25624744086878559e+00); | |
533 | ||
534 | Double_t TrackNumber = source.GetNumberOfTracks(); | |
535 | ||
536 | //Tracks arrays | |
537 | ||
538 | TArrayI Track0(TrackNumber); //Pions | |
539 | Int_t nTrack0=0; | |
540 | ||
541 | TArrayI Track1(TrackNumber); //Helium3 | |
542 | Int_t nTrack1=0; | |
543 | ||
544 | for(Int_t j=0; j<TrackNumber; j++){ | |
545 | ||
546 | // cout<<"Inside loop tracks"<<endl; | |
547 | ||
548 | AliVTrack *track = (AliVTrack*)source.GetTrack(j); | |
549 | ||
550 | AliAODTrack *aodtrack =(AliAODTrack*)track; | |
551 | ||
552 | //----------------------------------------------------------- | |
553 | //Track cuts | |
554 | if(aodtrack->GetTPCNcls() < 70 )continue; | |
555 | if(aodtrack->Chi2perNDF() > 4 )continue; | |
556 | ||
557 | // cout<<"Filter Map: "<<aodtrack->GetFilterMap()<<endl; | |
558 | // if (!aodtrack->TestFilterMask(BIT(4))) continue; | |
559 | // if(aodtrack->TestFilterMask(BIT(4))!=0) | |
560 | // cout<<"!!!!!!!!!!!!!!!!!!!!!!!!!!! Filter bit mask: !!!!!!!!!!!!!!!!!!!!!!!!!!!"<<endl; | |
561 | ||
562 | if (!aodtrack->IsOn(AliAODTrack::kTPCrefit)) continue; | |
563 | if (!aodtrack->IsOn(AliAODTrack::kTPCin)) continue; | |
564 | if (aodtrack->IsOn(AliAODTrack::kITSpureSA)) continue; | |
565 | ||
566 | //--------------------------------------------------------------- | |
567 | ||
f26537d8 | 568 | // Double_t mom = aodtrack->GetDetPid()->GetTPCmomentum(); |
569 | Double_t mom = aodtrack->P(); | |
cd469d61 | 570 | |
571 | if(mom<0.150)continue; | |
f26537d8 | 572 | |
573 | ||
574 | ||
cd469d61 | 575 | Double_t nSigmaNegPion = TMath::Abs(fPIDResponse->NumberOfSigmasTPC(aodtrack,(AliPID::EParticleType)fpartType1)); |
576 | // cout<<"%%% nsigma Pi: "<<nSigmaNegPion<<endl; | |
577 | // Double_t nSigmaNegPion = TMath::Abs((aodtrack->GetTPCsignal() - foPion->Eval(mom))/foPion->Eval(mom))/0.07; | |
578 | ||
579 | if ( nSigmaNegPion <= fnSigmaTrk1 /*&& aodtrack->Charge()==-1*/){ | |
580 | Track0[nTrack0++]=j; | |
581 | } | |
582 | ||
583 | Double_t nSigmaNuclei = fPIDResponse->NumberOfSigmasTPC(aodtrack,(AliPID::EParticleType)fpartType2); //To be changed | |
584 | //cout<<"%%% nsigma Nuclei: "<<nSigmaNuclei<<endl; | |
585 | ||
586 | if(nSigmaNuclei>-fnSigmaTrk2 && aodtrack->GetTPCsignal()<1000 && mom>0.2){ | |
f26537d8 | 587 | |
588 | //Double_t triggerDeDx = 4*AliExternalTrackParam::BetheBlochAleph((mom*2)/(0.938*3),1.0288,31.9806,5.04114e-11,2.13096,2.38541); | |
cd469d61 | 589 | //if(aodtrack->GetTPCsignal() > triggerDeDx && aodtrack->GetTPCsignal()<5000 && mom>0.2 /*&& aodtrack->Charge()==1*/){ |
590 | ||
591 | Track1[nTrack1++]=j; | |
592 | new((*fNuclei)[nnuclei++]) AliAODTrack(*aodtrack); | |
593 | //cout<<"@@@ n sigma NUCLEI"<<nSigmaNuclei<<endl; | |
594 | } | |
595 | ||
596 | } | |
597 | ||
598 | // cout<<"Delete AodTrack..."<<endl; | |
599 | // delete aodtrack; | |
600 | // aodtrack->Delete(); | |
601 | ||
602 | //Set Track Daughters | |
603 | Track0.Set(nTrack0); | |
604 | Track1.Set(nTrack1); | |
605 | ||
606 | // cout<<"Track loops..."<<endl; | |
607 | ||
608 | AliAODTrack *postrackAOD = 0; | |
609 | AliAODTrack *negtrackAOD = 0; | |
610 | ||
611 | AliESDtrack *postrack = 0; | |
612 | AliESDtrack *negtrack = 0; | |
613 | ||
614 | // cout <<"nTrack1 "<< nTrack1<<endl; | |
615 | // cout <<"nTrack0 "<< nTrack0<<endl; | |
616 | ||
617 | for (Int_t i=0; i<nTrack1; i++){ //! He Tracks Loop | |
618 | ||
619 | // cout<<"Inside track loop"<<endl; | |
620 | ||
621 | Int_t Track1idx=Track1[i]; | |
622 | ||
623 | AliVTrack *trackpos = (AliVTrack*)source.GetTrack(Track1idx); | |
624 | ||
625 | postrackAOD = (AliAODTrack*)trackpos; | |
626 | postrack = new AliESDtrack(trackpos); | |
627 | ||
628 | for (Int_t k=0; k <nTrack0 ; k++) { //! Pion Tracks Loop | |
629 | ||
630 | Int_t Track0idx=Track0[k]; | |
631 | ||
632 | AliVTrack *trackneg = (AliVTrack*)source.GetTrack(Track0idx); | |
633 | negtrackAOD =(AliAODTrack*)trackneg; | |
634 | negtrack = new AliESDtrack(trackneg); | |
635 | ||
636 | twoTrackArray->AddAt(negtrack,0); | |
637 | twoTrackArray->AddAt(postrack,1); | |
638 | ||
639 | Double_t dcap1n1 = postrack->GetDCA(negtrack,fBzkG,xdummy,ydummy); | |
640 | ||
641 | Double_t dcap1toPV = TMath::Abs(postrack->GetD(xPrimaryVertex, yPrimaryVertex,fBzkG)); | |
642 | Double_t dcan1toPV = TMath::Abs(negtrack->GetD(xPrimaryVertex, yPrimaryVertex,fBzkG)); | |
643 | ||
644 | if(dcap1n1>fDCAtracksMin)continue; | |
645 | if((xdummy+ydummy)>fRmax )continue; | |
646 | if((xdummy+ydummy)< fRmin)continue; | |
647 | ||
648 | if ( dcan1toPV < fDNmin) | |
649 | if ( dcap1toPV < fDPmin) continue; | |
650 | ||
651 | // cout<<"dcap1n1: "<<dcap1n1<<endl; | |
652 | ||
653 | AliAODVertex *vertexp1n1 = ReconstructSecondaryVertex(twoTrackArray,dispersion,kTRUE); | |
654 | ||
655 | if(!vertexp1n1) { | |
656 | ||
657 | twoTrackArray->Clear(); | |
658 | delete negtrack; | |
659 | negtrack=NULL; | |
660 | continue; | |
661 | } | |
662 | ||
663 | // cout<<"vertexp1n1: "<<vertexp1n1<<endl; | |
664 | ||
665 | io2Prong = Make2Prong(twoTrackArray,source,vertexp1n1,dcap1n1); | |
666 | ||
667 | //cout<<"Fuori dal loop e' quello che salvo \npr0: "<<io2Prong->GetProngID(0)<<" pr1: "<<io2Prong->GetProngID(1)<<" pr2"<<io2Prong->GetProngID(2)<<endl; | |
668 | ||
669 | if(io2Prong->CosPointingAngle()<fCosMin)continue; | |
670 | ||
671 | // cout<<"if CPA \npr0: "<<io2Prong->GetProngID(0)<<" pr1: "<<io2Prong->GetProngID(1)<<" pr2"<<io2Prong->GetProngID(2)<<endl; | |
672 | // cout<<"pointing angle "<<io2Prong->CosPointingAngle()<<endl; | |
673 | ||
46f95026 | 674 | |
f26537d8 | 675 | // AliAODTrack *trk0 = (AliAODTrack*)io2Prong->GetDaughter(0); |
676 | // AliAODTrack *trk1 = (AliAODTrack*)io2Prong->GetDaughter(1); | |
46f95026 | 677 | |
1c4d3bfa | 678 | // cout<<"**********************************************"<<endl; |
679 | // cout<<trk0/*->GetID()*/<<" "<<negtrackAOD->GetID()<<endl; | |
680 | // cout<<trk1/*->GetID()*/<<" "<<postrackAOD->GetID()<<endl; | |
681 | // cout<<"d0 io2Prong: "<<io2Prong->GetProngID(1)<<endl; | |
682 | // cout<<"d1 io2Prong: "<<io2Prong->GetProngID(0)<<endl; | |
683 | // cout<<"**********************************************"<<endl; | |
46f95026 | 684 | |
685 | // rd = new((*fSecondaryVerices)[nsv++]) AliAODRecoDecayLF2Prong(*io2Prong); | |
686 | ||
687 | new((*fSecondaryVerices)[nsv++]) AliAODRecoDecayLF2Prong(*io2Prong); | |
688 | ||
7b08784f | 689 | // cout<<"QUELLO CHE SALVo \npr0: "<<rd->GetProngID(0)<<" pr1: "<<rd->GetProngID(1)<<" pr2"<<rd->GetProngID(2)<<endl; |
cd469d61 | 690 | |
691 | // rd->SetSecondaryVtx(vertexp1n1); | |
692 | // vertexp1n1->SetParent(rd); | |
693 | // AddRefs(vertexp1n1,rd,source,twoTrackArray); | |
694 | ||
695 | ||
696 | new((*fDaughterTracks)[ntracksD++]) AliAODTrack(*negtrackAOD); | |
697 | new((*fDaughterTracks)[ntracksD++]) AliAODTrack(*postrackAOD); | |
698 | ||
699 | delete negtrack; | |
700 | negtrack = NULL; | |
701 | ||
702 | delete vertexp1n1; | |
703 | vertexp1n1= NULL; | |
704 | continue; | |
705 | } | |
706 | ||
707 | delete postrack; | |
708 | postrack = NULL; | |
709 | ||
710 | } | |
711 | ||
712 | //---------------------------------------------------------- | |
f26537d8 | 713 | |
cd469d61 | 714 | assert(fVertices!=0x0); |
715 | fVertices->Clear("C"); | |
716 | TIter nextV(source.GetVertices()); | |
717 | AliAODVertex* v; | |
718 | Int_t nvertices(0); | |
719 | ||
720 | while ( ( v = static_cast<AliAODVertex*>(nextV()) ) ) | |
721 | { | |
f26537d8 | 722 | if ( v->GetType() == AliAODVertex::kPrimary || |
723 | v->GetType() == AliAODVertex::kMainSPD || | |
724 | v->GetType() == AliAODVertex::kPileupSPD || | |
725 | v->GetType() == AliAODVertex::kPileupTracks|| | |
726 | v->GetType() == AliAODVertex::kMainTPC ) | |
727 | { | |
cd469d61 | 728 | AliAODVertex* tmp = v->CloneWithoutRefs(); |
729 | AliAODVertex* copiedVertex = new((*fVertices)[nvertices++]) AliAODVertex(*tmp); | |
730 | ||
731 | // to insure the main vertex retains the ncontributors information | |
732 | // (which is otherwise computed dynamically from | |
733 | // references to tracks, which we do not keep in muon aods...) | |
734 | // we set it here | |
735 | ||
736 | copiedVertex->SetNContributors(v->GetNContributors()); | |
737 | ||
738 | // fVertices->Delete(); | |
739 | // delete copiedVertex; | |
740 | delete tmp; | |
741 | } | |
742 | } | |
743 | ||
7b08784f | 744 | // printf("....Done NuclEx Replicator...\n"); |
cd469d61 | 745 | |
746 | AliDebug(1,Form("input mu tracks=%d tracks=%d vertices=%d nnuclei=%d", | |
747 | input,fSecondaryVerices->GetEntries(),fVertices->GetEntries(),fNuclei->GetEntries())); | |
748 | ||
749 | // Finally, deal with MC information, if needed | |
750 | ||
751 | // if ( fMCMode > 0 ) | |
752 | // { | |
753 | // FilterMC(source); | |
754 | // } | |
755 | ||
756 | //cout<<"Delete..."<<endl; | |
757 | // delete foPion; | |
758 | // foPion = NULL; | |
759 | //cout<<"Delete 1"<< endl; | |
760 | ||
761 | if(io2Prong) {delete io2Prong; io2Prong=NULL;} | |
762 | //cout<<"Delete 2"<< endl; | |
763 | twoTrackArray->Delete(); delete twoTrackArray; | |
764 | //cout<<"Delete 3"<< endl; | |
765 | // vtx->Delete(); delete vtx; | |
766 | //cout<<"Delete 4"<< endl; | |
767 | if(fV1) { delete fV1; fV1=NULL; } | |
768 | //cout<<"Delete 5"<< endl; | |
769 | if(fAODMap) { delete [] fAODMap; fAODMap=NULL; } | |
7e4263f5 | 770 | delete []indices; |
cd469d61 | 771 | //cout<<"Delete 6"<< endl; |
772 | delete fVertexerTracks; | |
773 | ||
774 | ||
775 | } | |
776 | ||
777 | //----------------------------------------------------------------------------- | |
778 | ||
779 | AliAODVertex *AliAODNuclExReplicator::ReconstructSecondaryVertex(TObjArray *trkArray, | |
780 | Double_t &dispersion,Bool_t useTRefArray) const | |
781 | ||
782 | { | |
783 | // Secondary vertex reconstruction with AliVertexerTracks or AliKFParticle | |
784 | //AliCodeTimerAuto("",0); | |
785 | ||
786 | AliESDVertex *vertexESD = 0; | |
787 | AliAODVertex *vertexAOD = 0; | |
788 | ||
789 | if(!fSecVtxWithKF) { // AliVertexerTracks | |
790 | ||
791 | fVertexerTracks->SetVtxStart(fV1); | |
792 | vertexESD = (AliESDVertex*)fVertexerTracks->VertexForSelectedESDTracks(trkArray); | |
793 | ||
794 | if(!vertexESD) return vertexAOD; | |
795 | ||
796 | ||
e690d4d0 | 797 | Double_t vertRadius2=vertexESD->GetX()*vertexESD->GetX()+vertexESD->GetY()*vertexESD->GetY(); |
cd469d61 | 798 | if(vertRadius2>200.){ |
799 | // vertex outside beam pipe, reject candidate to avoid propagation through material | |
800 | delete vertexESD; vertexESD=NULL; | |
801 | return vertexAOD; | |
802 | } | |
803 | ||
804 | } else { // Kalman Filter vertexer (AliKFParticle) | |
805 | ||
806 | AliKFParticle::SetField(fBzkG); | |
807 | ||
808 | AliKFVertex vertexKF; | |
809 | ||
810 | Int_t nTrks = trkArray->GetEntriesFast(); | |
811 | for(Int_t i=0; i<nTrks; i++) { | |
812 | AliESDtrack *esdTrack = (AliESDtrack*)trkArray->At(i); | |
813 | AliKFParticle daughterKF(*esdTrack,211); | |
814 | vertexKF.AddDaughter(daughterKF); | |
815 | } | |
816 | vertexESD = new AliESDVertex(vertexKF.Parameters(), | |
817 | vertexKF.CovarianceMatrix(), | |
818 | vertexKF.GetChi2(), | |
819 | vertexKF.GetNContributors()); | |
820 | ||
821 | } | |
822 | // convert to AliAODVertex | |
823 | Double_t pos[3],cov[6],chi2perNDF; | |
824 | vertexESD->GetXYZ(pos); // position | |
825 | vertexESD->GetCovMatrix(cov); //covariance matrix | |
826 | chi2perNDF = vertexESD->GetChi2toNDF(); | |
827 | dispersion = vertexESD->GetDispersion(); | |
828 | delete vertexESD; | |
829 | vertexESD=NULL; | |
830 | ||
831 | Int_t nprongs= (useTRefArray ? 0 : trkArray->GetEntriesFast()); | |
832 | vertexAOD = new AliAODVertex(pos,cov,chi2perNDF,0x0,-1,AliAODVertex::kUndef,nprongs); | |
833 | ||
834 | //cout<<"------------------> Reconstruct vertexAOD: "<<vertexAOD<<endl; | |
835 | ||
836 | return vertexAOD; | |
837 | ||
838 | ||
839 | } | |
840 | ||
841 | //----------------------------------------------------------------------------- | |
842 | ||
420938a5 | 843 | AliAODRecoDecayLF2Prong* AliAODNuclExReplicator::Make2Prong(TObjArray *twoTrackArray,const AliAODEvent &evento, |
cd469d61 | 844 | AliAODVertex *secVert,Double_t dca) |
845 | ||
846 | ||
847 | { | |
848 | ||
849 | //cout<<"Inside make 2 prong"<<endl; | |
850 | ||
851 | Int_t charge[2]; | |
852 | charge[0]=1; //it was -1 //Ramona | |
853 | charge[1]=2; | |
854 | ||
420938a5 | 855 | // From AliAnalysisVertexingLF.cxx Method:Make2Prongs |
cd469d61 | 856 | |
857 | fBzkG = evento.GetMagneticField(); | |
858 | ||
859 | Double_t px[2],py[2],pz[2],d0[2],d0err[2]; | |
860 | // Also this has been changed //Ramona | |
861 | AliESDtrack *negtrack = (AliESDtrack*)twoTrackArray->UncheckedAt(0); | |
862 | AliESDtrack *postrack = (AliESDtrack*)twoTrackArray->UncheckedAt(1); | |
863 | ||
864 | //cout<<"negtrack: "<<negtrack<<" postrack: "<<postrack<<endl; | |
865 | //cout<<"kVeryBig: "<<kVeryBig<<endl; | |
866 | //cout<<"secVert: "<<secVert<<endl; | |
867 | ||
868 | // // propagate tracks to secondary vertex, to compute inv. mass | |
869 | ||
870 | postrack->PropagateToDCA(secVert,fBzkG,kVeryBig); | |
871 | negtrack->PropagateToDCA(secVert,fBzkG,kVeryBig); | |
872 | ||
873 | Double_t momentum[3]; | |
874 | ||
875 | negtrack->GetPxPyPz(momentum); | |
876 | px[0] = charge[0]*momentum[0]; | |
877 | py[0] = charge[0]*momentum[1]; | |
878 | pz[0] = charge[0]*momentum[2]; | |
879 | ||
880 | postrack->GetPxPyPz(momentum); | |
881 | px[1] = charge[1]*momentum[0]; | |
882 | py[1] = charge[1]*momentum[1]; | |
883 | pz[1] = charge[1]*momentum[2]; | |
884 | ||
885 | //cout<< px[0] <<" "<< " "<< py[0] << " "<< pz[0]<<endl; | |
886 | // px[0] = momentum[0]; py[0] = momentum[1]; pz[0] = momentum[2]; | |
887 | //cout<< px[1] <<" "<< " "<< py[1] << " "<< pz[1]<<endl; | |
888 | //px[1] = momentum[0]; py[1] = momentum[1]; pz[1] = momentum[2]; | |
889 | ||
890 | ||
891 | // primary vertex to be used by this candidate | |
892 | AliAODVertex *primVertexAOD = evento.GetPrimaryVertex(); | |
893 | //cout<<"primVertexAOD "<<primVertexAOD<<endl; | |
894 | if(!primVertexAOD) return 0x0; | |
895 | ||
896 | Double_t d0z0[2],covd0z0[3]; | |
897 | ||
7e4263f5 | 898 | d0z0[0] = -999.; |
899 | d0z0[1] = -999.; | |
900 | covd0z0[0] = -999.; | |
901 | covd0z0[1] = -999.; | |
902 | covd0z0[2] = -999.; | |
903 | ||
cd469d61 | 904 | d0[0] = d0z0[0]; |
905 | d0err[0] = TMath::Sqrt(TMath::Abs(covd0z0[0])); | |
906 | ||
907 | d0[1] = d0z0[0]; | |
908 | d0err[1] = TMath::Sqrt(TMath::Abs(covd0z0[0])); | |
909 | ||
420938a5 | 910 | // create the object AliAODRecoDecayLF2Prong |
911 | // AliAODRecoDecayLF2Prong *the2Prong = new AliAODRecoDecayLF2Prong(secVert,px,py,pz,d0,d0err,dcap1n1); | |
912 | AliAODRecoDecayLF2Prong *the2Prong = new AliAODRecoDecayLF2Prong(secVert,px,py,pz,d0,d0err,dca); | |
cd469d61 | 913 | the2Prong->SetOwnPrimaryVtx(primVertexAOD); |
914 | ||
915 | // the2Prong->SetProngIDs(2,{-999,999}); | |
916 | // UShort_t id0[2]={99999,999999}; | |
917 | // the2Prong->SetProngIDs(2,id0); | |
918 | ||
919 | UShort_t id[2]={(UShort_t)postrack->GetID(),(UShort_t)negtrack->GetID()}; | |
920 | the2Prong->SetProngIDs(2,id); | |
921 | ||
922 | // cout<<"\n\n\nMake 2 Prong: id[0]"<<id[0]<<" id[1]: "<<id[1]<<endl; | |
923 | // cout<<"Get: 1 "<<the2Prong->GetProngID(0)<<" 2 "<<the2Prong->GetProngID(1)<<endl; | |
924 | // cout<<"Get: 3 "<<the2Prong->GetProngID(2)<<" 4 "<<the2Prong->GetProngID(3)<<endl<<endl<<endl; | |
925 | //delete primVertexAOD; primVertexAOD=NULL; | |
926 | ||
927 | if(postrack->Charge()!=0 && negtrack->Charge()!=0) { | |
928 | ||
929 | AddDaughterRefs(secVert,(AliAODEvent&)evento,twoTrackArray); | |
930 | // AddDaughterRefs(secVert,(AliAODEvent*)evento,twoTrackArray); | |
931 | ||
932 | } | |
933 | ||
934 | return the2Prong; | |
935 | ||
936 | delete the2Prong; | |
937 | } | |
938 | ||
939 | //---------------------------------------------------------------------------- | |
940 | void AliAODNuclExReplicator::AddDaughterRefs(AliAODVertex *v, | |
941 | const AliAODEvent &event, | |
942 | const TObjArray *trkArray) const | |
943 | ||
944 | { | |
945 | // Add the AOD tracks as daughters of the vertex (TRef) | |
946 | // AliCodeTimerAuto("",0); | |
947 | // cout<<"Inside AddDaughterRefs "<<endl; | |
948 | ||
949 | Int_t nDg = v->GetNDaughters(); | |
950 | ||
951 | TObject *dg = 0; | |
952 | if(nDg) dg = v->GetDaughter(0); | |
953 | if(dg) return; // daughters already added | |
954 | ||
955 | Int_t nTrks = trkArray->GetEntriesFast(); | |
956 | ||
957 | AliExternalTrackParam *track = 0; | |
958 | AliAODTrack *aodTrack = 0; | |
959 | Int_t id; | |
960 | ||
961 | for(Int_t i=0; i<nTrks; i++) { | |
962 | track = (AliExternalTrackParam*)trkArray->UncheckedAt(i); | |
963 | ||
964 | id = (Int_t)track->GetID(); | |
965 | // printf("---> %d\n",id); | |
966 | if(id<0) continue; // this track is a AliAODRecoDecay | |
967 | ||
968 | aodTrack = (AliAODTrack*)event.GetTrack(fAODMap[id]); | |
969 | v->AddDaughter(aodTrack); | |
970 | } | |
971 | return; | |
972 | } | |
973 | //---------------------------------------------------------------------------- | |
974 | ||
420938a5 | 975 | void AliAODNuclExReplicator::AddRefs(AliAODVertex *v,AliAODRecoDecayLF *rd, |
cd469d61 | 976 | const AliAODEvent &event, |
977 | const TObjArray *trkArray) const | |
978 | ||
979 | { | |
980 | // Add the AOD tracks as daughters of the vertex (TRef) | |
981 | // Also add the references to the primary vertex and to the cuts | |
982 | //AliCodeTimerAuto("",0); | |
983 | ||
984 | AddDaughterRefs(v,event,trkArray); | |
985 | rd->SetPrimaryVtxRef((AliAODVertex*)event.GetPrimaryVertex()); | |
986 | return; | |
987 | } | |
988 | ||
989 | //--------------------------------------------------------------------------- | |
990 | ||
991 | void AliAODNuclExReplicator::Terminate(){ | |
992 | ||
993 | } |