1 /**************************************************************************
\r
2 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
\r
4 * Author: The ALICE Off-line Project. *
\r
5 * Contributors are mentioned in the code where appropriate. *
\r
7 * Permission to use, copy, modify and distribute this software and its *
\r
8 * documentation strictly for non-commercial purposes is hereby granted *
\r
9 * without fee, provided that the above copyright notice appears in all *
\r
10 * copies and that both the copyright notice and this permission notice *
\r
11 * appear in the supporting documentation. The authors make no claims *
\r
12 * about the suitability of this software for any purpose. It is *
\r
13 * provided "as is" without express or implied warranty. *
\r
14 **************************************************************************/
\r
18 #include <TPDGCode.h>
\r
19 #include <TDatabasePDG.h>
\r
22 #include "TTreeStream.h"
\r
25 #include "TCanvas.h"
\r
27 #include "TObjArray.h"
\r
29 #include "TMatrixD.h"
\r
30 #include "TRandom3.h"
\r
32 #include "AliHeader.h"
\r
33 #include "AliGenEventHeader.h"
\r
34 #include "AliInputEventHandler.h"
\r
35 #include "AliStack.h"
\r
36 #include "AliTrackReference.h"
\r
38 #include "AliPhysicsSelection.h"
\r
39 #include "AliAnalysisTask.h"
\r
40 #include "AliAnalysisManager.h"
\r
41 #include "AliESDEvent.h"
\r
42 #include "AliESDfriend.h"
\r
43 #include "AliMCEvent.h"
\r
44 #include "AliESDInputHandler.h"
\r
45 #include "AliESDVertex.h"
\r
46 #include "AliTracker.h"
\r
47 #include "AliGeomManager.h"
\r
49 #include "AliCentrality.h"
\r
50 #include "AliESDVZERO.h"
\r
51 #include "AliMultiplicity.h"
\r
53 #include "AliESDtrackCuts.h"
\r
54 #include "AliMCEventHandler.h"
\r
55 #include "AlidNdPt.h"
\r
56 #include "AlidNdPtEventCuts.h"
\r
57 #include "AlidNdPtAcceptanceCuts.h"
\r
59 #include "AlidNdPtTrackDumpTask.h"
\r
60 #include "AliKFParticle.h"
\r
61 #include "AliESDv0.h"
\r
63 using namespace std;
\r
65 ClassImp(AlidNdPtTrackDumpTask)
\r
67 //_____________________________________________________________________________
\r
68 AlidNdPtTrackDumpTask::AlidNdPtTrackDumpTask(const char *name)
\r
69 : AliAnalysisTaskSE(name)
\r
75 , fUseMCInfo(kFALSE)
\r
76 , fUseESDfriends(kFALSE)
\r
77 , fdNdPtEventCuts(0)
\r
78 , fdNdPtAcceptanceCuts(0)
\r
79 , fdNdPtRecAcceptanceCuts(0)
\r
81 , fTrigger(AliTriggerAnalysis::kMB1)
\r
82 , fAnalysisMode(AlidNdPtHelper::kTPC)
\r
83 , fTreeSRedirector(0)
\r
84 , fCentralityEstimator(0)
\r
85 , fLowPtTrackDownscaligF(0)
\r
86 , fLowPtV0DownscaligF(0)
\r
87 , fProcessAll(kFALSE)
\r
91 // Define input and output slots here
\r
92 DefineOutput(1, TList::Class());
\r
96 //_____________________________________________________________________________
\r
97 AlidNdPtTrackDumpTask::~AlidNdPtTrackDumpTask()
\r
99 if(fOutput) delete fOutput; fOutput =0;
\r
100 if(fTreeSRedirector) delete fTreeSRedirector; fTreeSRedirector =0;
\r
102 if(fdNdPtEventCuts) delete fdNdPtEventCuts; fdNdPtEventCuts=NULL;
\r
103 if(fdNdPtAcceptanceCuts) delete fdNdPtAcceptanceCuts; fdNdPtAcceptanceCuts=NULL;
\r
104 if(fdNdPtRecAcceptanceCuts) delete fdNdPtRecAcceptanceCuts; fdNdPtRecAcceptanceCuts=NULL;
\r
105 if(fEsdTrackCuts) delete fEsdTrackCuts; fEsdTrackCuts=NULL;
\r
108 //____________________________________________________________________________
\r
109 Bool_t AlidNdPtTrackDumpTask::Notify()
\r
111 static Int_t count = 0;
\r
113 TTree *chain = (TChain*)GetInputData(0);
\r
116 Printf("Processing %d. file: %s", count, chain->GetCurrentFile()->GetName());
\r
122 //_____________________________________________________________________________
\r
123 void AlidNdPtTrackDumpTask::UserCreateOutputObjects()
\r
125 // Create histograms
\r
127 fOutput = new TList;
\r
128 fOutput->SetOwner();
\r
131 // create temporary file for output tree
\r
132 fTreeSRedirector = new TTreeSRedirector("jotwinow_Temp_Trees.root");
\r
134 PostData(1, fOutput);
\r
137 //_____________________________________________________________________________
\r
138 void AlidNdPtTrackDumpTask::UserExec(Option_t *)
\r
141 // Called for each event
\r
145 fESD = (AliESDEvent*) (InputEvent());
\r
147 Printf("ERROR: ESD event not available");
\r
155 Printf("ERROR: MC event not available");
\r
160 if(fUseESDfriends) {
\r
161 fESDfriend = static_cast<AliESDfriend*>(fESD->FindListObject("AliESDfriend"));
\r
163 Printf("ERROR: ESD friends not available");
\r
169 ProcessAll(fESD,fMC,fESDfriend); // all track stages and MC
\r
170 ProcessV0(fESD,fMC,fESDfriend);
\r
171 ProcessLaser(fESD,fMC,fESDfriend);
\r
172 ProcessdEdx(fESD,fMC,fESDfriend);
\r
174 ProcessMCEff(fESD,fMC,fESDfriend);
\r
177 Process(fESD,fMC,fESDfriend);
\r
178 ProcessV0(fESD,fMC,fESDfriend);
\r
179 ProcessLaser(fESD,fMC,fESDfriend);
\r
180 ProcessdEdx(fESD,fMC,fESDfriend);
\r
182 ProcessMCEff(fESD,fMC,fESDfriend);
\r
185 // Post output data.
\r
186 PostData(1, fOutput);
\r
189 //_____________________________________________________________________________
\r
190 void AlidNdPtTrackDumpTask::Process(AliESDEvent *const esdEvent, AliMCEvent * const mcEvent, AliESDfriend *const /*esdFriend*/)
\r
193 // Select real events with high-pT tracks
\r
196 AliDebug(AliLog::kError, "esdEvent not available");
\r
200 // get selection cuts
\r
201 AlidNdPtEventCuts *evtCuts = GetEventCuts();
\r
202 AlidNdPtAcceptanceCuts *accCuts = GetAcceptanceCuts();
\r
203 AliESDtrackCuts *esdTrackCuts = GetTrackCuts();
\r
205 if(!evtCuts || !accCuts || !esdTrackCuts) {
\r
206 Printf("ERROR cuts not available");
\r
210 // trigger selection
\r
211 Bool_t isEventTriggered = kTRUE;
\r
212 AliPhysicsSelection *physicsSelection = NULL;
\r
213 AliTriggerAnalysis* triggerAnalysis = NULL;
\r
216 AliInputEventHandler* inputHandler = (AliInputEventHandler*) AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler();
\r
219 Printf("ERROR: Could not receive input handler");
\r
224 TTree *chain = (TChain*)GetInputData(0);
\r
226 Printf("ERROR: Could not receive input chain");
\r
229 TObjString fileName(chain->GetCurrentFile()->GetName());
\r
232 if(evtCuts->IsTriggerRequired())
\r
235 isEventTriggered = inputHandler->IsEventSelected() & AliVEvent::kMB;
\r
237 physicsSelection = static_cast<AliPhysicsSelection*> (inputHandler->GetEventSelection());
\r
238 if(!physicsSelection) return;
\r
239 //SetPhysicsTriggerSelection(physicsSelection);
\r
241 if (isEventTriggered && (GetTrigger() == AliTriggerAnalysis::kV0AND)) {
\r
242 // set trigger (V0AND)
\r
243 triggerAnalysis = physicsSelection->GetTriggerAnalysis();
\r
244 if(!triggerAnalysis) return;
\r
245 isEventTriggered = triggerAnalysis->IsOfflineTriggerFired(esdEvent, GetTrigger());
\r
249 // centrality determination
\r
250 Float_t centralityF = -1;
\r
251 AliCentrality *esdCentrality = esdEvent->GetCentrality();
\r
252 centralityF = esdCentrality->GetCentralityPercentile(fCentralityEstimator.Data());
\r
254 // use MC information
\r
255 AliHeader* header = 0;
\r
256 AliGenEventHeader* genHeader = 0;
\r
257 AliStack* stack = 0;
\r
260 Int_t multMCTrueTracks = 0;
\r
265 AliDebug(AliLog::kError, "mcEvent not available");
\r
268 // get MC event header
\r
269 header = mcEvent->Header();
\r
271 AliDebug(AliLog::kError, "Header not available");
\r
274 // MC particle stack
\r
275 stack = mcEvent->Stack();
\r
277 AliDebug(AliLog::kError, "Stack not available");
\r
282 genHeader = header->GenEventHeader();
\r
284 AliDebug(AliLog::kError, "Could not retrieve genHeader from Header");
\r
287 genHeader->PrimaryVertex(vtxMC);
\r
289 // multipliticy of all MC primary tracks
\r
290 // in Zv, pt and eta ranges)
\r
291 multMCTrueTracks = AlidNdPtHelper::GetMCTrueTrackMult(mcEvent,evtCuts,accCuts);
\r
295 // get reconstructed vertex
\r
296 //const AliESDVertex* vtxESD = 0;
\r
297 const AliESDVertex* vtxESD = 0;
\r
298 if(GetAnalysisMode() == AlidNdPtHelper::kTPC) {
\r
299 vtxESD = esdEvent->GetPrimaryVertexTPC();
\r
301 else if(GetAnalysisMode() == AlidNdPtHelper::kTPCITS) {
\r
302 vtxESD = esdEvent->GetPrimaryVertexTracks();
\r
308 if(!vtxESD) return;
\r
310 Bool_t isEventOK = evtCuts->AcceptEvent(esdEvent,mcEvent,vtxESD);
\r
311 //printf("isEventOK %d, isEventTriggered %d \n",isEventOK, isEventTriggered);
\r
312 //printf("GetAnalysisMode() %d \n",GetAnalysisMode());
\r
315 // check event cuts
\r
316 if(isEventOK && isEventTriggered)
\r
320 // get IR information
\r
322 AliESDHeader *esdHeader = 0;
\r
323 esdHeader = esdEvent->GetHeader();
\r
324 if(!esdHeader) return;
\r
325 Int_t ir1 = esdHeader->GetTriggerIREntries(); //all ir-s
\r
326 Int_t ir2 = esdHeader->GetTriggerIREntries(-1,1); // int2 set, 180 ms time interval
\r
329 Double_t vert[3] = {0};
\r
330 vert[0] = vtxESD->GetXv();
\r
331 vert[1] = vtxESD->GetYv();
\r
332 vert[2] = vtxESD->GetZv();
\r
333 Int_t mult = vtxESD->GetNContributors();
\r
334 Double_t bz = esdEvent->GetMagneticField();
\r
335 Double_t runNumber = esdEvent->GetRunNumber();
\r
336 Double_t evtTimeStamp = esdEvent->GetTimeStamp();
\r
337 Int_t evtNumberInFile = esdEvent->GetEventNumberInFile();
\r
340 for (Int_t iTrack = 0; iTrack < esdEvent->GetNumberOfTracks(); iTrack++)
\r
342 AliESDtrack *track = esdEvent->GetTrack(iTrack);
\r
343 if(!track) continue;
\r
344 if(track->Charge()==0) continue;
\r
345 if(!esdTrackCuts->AcceptTrack(track)) continue;
\r
346 if(!accCuts->AcceptTrack(track)) continue;
\r
348 // downscale low-pT tracks
\r
349 Double_t scalempt= TMath::Min(track->Pt(),10.);
\r
350 Double_t downscaleF = gRandom->Rndm();
\r
351 downscaleF *= fLowPtTrackDownscaligF;
\r
352 if(TMath::Exp(2*scalempt)<downscaleF) continue;
\r
353 //printf("TMath::Exp(2*scalempt) %e, downscaleF %e \n",TMath::Exp(2*scalempt), downscaleF);
\r
355 AliExternalTrackParam * tpcInner = (AliExternalTrackParam *)(track->GetTPCInnerParam());
\r
356 if (!tpcInner) continue;
\r
357 // transform to the track reference frame
\r
358 Bool_t isOK = kFALSE;
\r
359 isOK = tpcInner->Rotate(track->GetAlpha());
\r
360 isOK = tpcInner->PropagateTo(track->GetX(),esdEvent->GetMagneticField());
\r
361 if(!isOK) continue;
\r
363 // Dump to the tree
\r
367 if(!fTreeSRedirector) return;
\r
368 (*fTreeSRedirector)<<"dNdPtTree"<<
\r
369 "fileName.="<<&fileName<<
\r
370 "runNumber="<<runNumber<<
\r
371 "evtTimeStamp="<<evtTimeStamp<<
\r
372 "evtNumberInFile="<<evtNumberInFile<<
\r
374 "vertX="<<vert[0]<<
\r
375 "vertY="<<vert[1]<<
\r
376 "vertZ="<<vert[2]<<
\r
380 "esdTrack.="<<track<<
\r
381 "centralityF="<<centralityF<<
\r
386 PostData(1, fOutput);
\r
390 //_____________________________________________________________________________
\r
391 void AlidNdPtTrackDumpTask::ProcessLaser(AliESDEvent *const esdEvent, AliMCEvent * const /*mcEvent*/, AliESDfriend *const /*esdFriend*/)
\r
394 // Process laser events
\r
397 AliDebug(AliLog::kError, "esdEvent not available");
\r
402 TTree *chain = (TChain*)GetInputData(0);
\r
404 Printf("ERROR: Could not receive input chain");
\r
407 TObjString fileName(chain->GetCurrentFile()->GetName());
\r
410 const AliESDHeader* esdHeader = esdEvent->GetHeader();
\r
411 if(esdHeader && esdHeader->GetEventSpecie()==AliRecoParam::kCalib)
\r
413 Int_t countLaserTracks = 0;
\r
414 for (Int_t iTrack = 0; iTrack < esdEvent->GetNumberOfTracks(); iTrack++)
\r
416 AliESDtrack *track = esdEvent->GetTrack(iTrack);
\r
417 if(!track) continue;
\r
419 if(track->GetTPCInnerParam()) countLaserTracks++;
\r
422 if(countLaserTracks > 100)
\r
424 Double_t runNumber = esdEvent->GetRunNumber();
\r
425 Double_t evtTimeStamp = esdEvent->GetTimeStamp();
\r
426 Int_t evtNumberInFile = esdEvent->GetEventNumberInFile();
\r
427 Double_t bz = esdEvent->GetMagneticField();
\r
429 if(!fTreeSRedirector) return;
\r
430 (*fTreeSRedirector)<<"Laser"<<
\r
431 "fileName.="<<&fileName<<
\r
432 "runNumber="<<runNumber<<
\r
433 "evtTimeStamp="<<evtTimeStamp<<
\r
434 "evtNumberInFile="<<evtNumberInFile<<
\r
436 "multTPCtracks="<<countLaserTracks<<
\r
442 //_____________________________________________________________________________
\r
443 void AlidNdPtTrackDumpTask::ProcessAll(AliESDEvent *const esdEvent, AliMCEvent * const mcEvent, AliESDfriend *const esdFriend)
\r
446 // Select real events with high-pT tracks
\r
447 // Calculate and stor in the output tree:
\r
448 // TPC constrained tracks
\r
449 // InnerParams constrained tracks
\r
451 // ITSout-InnerParams tracks
\r
452 // chi2 distance between TPC constrained and TPC-ITS tracks
\r
453 // chi2 distance between TPC refitted constrained and TPC-ITS tracks
\r
454 // chi2 distance between ITSout and InnerParams tracks
\r
455 // MC information:
\r
456 // track references at ITSin, TPCin; InnerParam at first TPC track reference,
\r
457 // particle ID, mother ID, production mechanism ...
\r
461 AliDebug(AliLog::kError, "esdEvent not available");
\r
465 // get selection cuts
\r
466 AlidNdPtEventCuts *evtCuts = GetEventCuts();
\r
467 AlidNdPtAcceptanceCuts *accCuts = GetAcceptanceCuts();
\r
468 AliESDtrackCuts *esdTrackCuts = GetTrackCuts();
\r
470 if(!evtCuts || !accCuts || !esdTrackCuts) {
\r
471 AliDebug(AliLog::kError, "cuts not available");
\r
475 // trigger selection
\r
476 Bool_t isEventTriggered = kTRUE;
\r
477 AliPhysicsSelection *physicsSelection = NULL;
\r
478 AliTriggerAnalysis* triggerAnalysis = NULL;
\r
481 AliInputEventHandler* inputHandler = (AliInputEventHandler*) AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler();
\r
484 Printf("ERROR: Could not receive input handler");
\r
489 TTree *chain = (TChain*)GetInputData(0);
\r
491 Printf("ERROR: Could not receive input chain");
\r
494 TObjString fileName(chain->GetCurrentFile()->GetName());
\r
497 if(evtCuts->IsTriggerRequired())
\r
500 isEventTriggered = inputHandler->IsEventSelected() & AliVEvent::kMB;
\r
502 physicsSelection = static_cast<AliPhysicsSelection*> (inputHandler->GetEventSelection());
\r
503 if(!physicsSelection) return;
\r
504 //SetPhysicsTriggerSelection(physicsSelection);
\r
506 if (isEventTriggered && (GetTrigger() == AliTriggerAnalysis::kV0AND)) {
\r
507 // set trigger (V0AND)
\r
508 triggerAnalysis = physicsSelection->GetTriggerAnalysis();
\r
509 if(!triggerAnalysis) return;
\r
510 isEventTriggered = triggerAnalysis->IsOfflineTriggerFired(esdEvent, GetTrigger());
\r
514 // centrality determination
\r
515 Float_t centralityF = -1;
\r
516 AliCentrality *esdCentrality = esdEvent->GetCentrality();
\r
517 centralityF = esdCentrality->GetCentralityPercentile(fCentralityEstimator.Data());
\r
519 // use MC information
\r
520 AliHeader* header = 0;
\r
521 AliGenEventHeader* genHeader = 0;
\r
522 AliStack* stack = 0;
\r
525 Int_t multMCTrueTracks = 0;
\r
530 AliDebug(AliLog::kError, "mcEvent not available");
\r
533 // get MC event header
\r
534 header = mcEvent->Header();
\r
536 AliDebug(AliLog::kError, "Header not available");
\r
539 // MC particle stack
\r
540 stack = mcEvent->Stack();
\r
542 AliDebug(AliLog::kError, "Stack not available");
\r
547 genHeader = header->GenEventHeader();
\r
549 AliDebug(AliLog::kError, "Could not retrieve genHeader from Header");
\r
552 genHeader->PrimaryVertex(vtxMC);
\r
554 // multipliticy of all MC primary tracks
\r
555 // in Zv, pt and eta ranges)
\r
556 multMCTrueTracks = AlidNdPtHelper::GetMCTrueTrackMult(mcEvent,evtCuts,accCuts);
\r
560 // get reconstructed vertex
\r
561 //const AliESDVertex* vtxESD = 0;
\r
562 const AliESDVertex* vtxESD = 0;
\r
563 if(GetAnalysisMode() == AlidNdPtHelper::kTPC) {
\r
564 vtxESD = esdEvent->GetPrimaryVertexTPC();
\r
566 else if(GetAnalysisMode() == AlidNdPtHelper::kTPCITS) {
\r
567 vtxESD = esdEvent->GetPrimaryVertexTracks();
\r
573 if(!vtxESD) return;
\r
575 Bool_t isEventOK = evtCuts->AcceptEvent(esdEvent,mcEvent,vtxESD);
\r
576 //printf("isEventOK %d, isEventTriggered %d \n",isEventOK, isEventTriggered);
\r
577 //printf("GetAnalysisMode() %d \n",GetAnalysisMode());
\r
580 // check event cuts
\r
581 if(isEventOK && isEventTriggered)
\r
584 // get IR information
\r
586 AliESDHeader *esdHeader = 0;
\r
587 esdHeader = esdEvent->GetHeader();
\r
588 if(!esdHeader) return;
\r
589 Int_t ir1 = esdHeader->GetTriggerIREntries(); //all ir-s
\r
590 Int_t ir2 = esdHeader->GetTriggerIREntries(-1,1); // int2 set, 180 ms time interval
\r
593 Double_t vert[3] = {0};
\r
594 vert[0] = vtxESD->GetXv();
\r
595 vert[1] = vtxESD->GetYv();
\r
596 vert[2] = vtxESD->GetZv();
\r
597 Int_t mult = vtxESD->GetNContributors();
\r
598 Double_t bz = esdEvent->GetMagneticField();
\r
599 Double_t runNumber = esdEvent->GetRunNumber();
\r
600 Double_t evtTimeStamp = esdEvent->GetTimeStamp();
\r
601 Int_t evtNumberInFile = esdEvent->GetEventNumberInFile();
\r
604 for (Int_t iTrack = 0; iTrack < esdEvent->GetNumberOfTracks(); iTrack++)
\r
606 AliESDtrack *track = esdEvent->GetTrack(iTrack);
\r
607 if(!track) continue;
\r
608 if(track->Charge()==0) continue;
\r
609 if(!esdTrackCuts->AcceptTrack(track)) continue;
\r
610 if(!accCuts->AcceptTrack(track)) continue;
\r
612 // downscale low-pT tracks
\r
613 Double_t scalempt= TMath::Min(track->Pt(),10.);
\r
614 Double_t downscaleF = gRandom->Rndm();
\r
615 downscaleF *= fLowPtTrackDownscaligF;
\r
616 if(TMath::Exp(2*scalempt)<downscaleF) continue;
\r
617 //printf("TMath::Exp(2*scalempt) %e, downscaleF %e \n",TMath::Exp(2*scalempt), downscaleF);
\r
619 // Dump to the tree
\r
621 // TPC constrained tracks
\r
622 // InnerParams constrained tracks
\r
624 // ITSout-InnerParams tracks
\r
625 // chi2 distance between TPC constrained and TPC-ITS tracks
\r
626 // chi2 distance between TPC refitted constrained and TPC-ITS tracks
\r
627 // chi2 distance between ITSout and InnerParams tracks
\r
630 Double_t x[3]; track->GetXYZ(x);
\r
631 Double_t b[3]; AliTracker::GetBxByBz(x,b);
\r
634 // Transform TPC inner params to track reference frame
\r
636 Bool_t isOKtpcInner = kFALSE;
\r
637 AliExternalTrackParam * tpcInner = (AliExternalTrackParam *)(track->GetTPCInnerParam());
\r
639 // transform to the track reference frame
\r
640 isOKtpcInner = tpcInner->Rotate(track->GetAlpha());
\r
641 isOKtpcInner = tpcInner->PropagateTo(track->GetX(),esdEvent->GetMagneticField());
\r
645 // Constrain TPC inner to vertex
\r
646 // clone TPCinner has to be deleted
\r
648 Bool_t isOKtpcInnerC = kFALSE;
\r
649 AliExternalTrackParam * tpcInnerC = new AliExternalTrackParam(*(track->GetTPCInnerParam()));
\r
651 isOKtpcInnerC = ConstrainTPCInner(tpcInnerC,vtxESD,b);
\r
652 isOKtpcInnerC = tpcInnerC->Rotate(track->GetAlpha());
\r
653 isOKtpcInnerC = tpcInnerC->PropagateTo(track->GetX(),esdEvent->GetMagneticField());
\r
657 // Constrain TPC refitted tracks at inner TPC wall (InnerParams) to vertex
\r
658 // Clone track InnerParams has to be deleted
\r
660 Bool_t isOKtrackInnerC = kFALSE;
\r
661 AliExternalTrackParam * trackInnerC = new AliExternalTrackParam(*(track->GetInnerParam()));
\r
663 isOKtrackInnerC = ConstrainTrackInner(trackInnerC,vtxESD,track->GetMass(),b);
\r
664 isOKtrackInnerC = trackInnerC->Rotate(track->GetAlpha());
\r
665 isOKtrackInnerC = trackInnerC->PropagateTo(track->GetX(),esdEvent->GetMagneticField());
\r
669 // calculate chi2 between vi and vj vectors
\r
670 // with covi and covj covariance matrices
\r
671 // chi2ij = (vi-vj)^(T)*(covi+covj)^(-1)*(vi-vj)
\r
673 TMatrixD deltaT(5,1), deltaTtrackC(5,1);
\r
674 TMatrixD delta(1,5), deltatrackC(1,5);
\r
675 TMatrixD covarM(5,5), covarMtrackC(5,5);
\r
676 TMatrixD chi2(1,1);
\r
677 TMatrixD chi2trackC(1,1);
\r
679 if(isOKtpcInnerC && isOKtrackInnerC)
\r
681 for (Int_t ipar=0; ipar<5; ipar++) {
\r
682 deltaT(ipar,0)=tpcInnerC->GetParameter()[ipar]-track->GetParameter()[ipar];
\r
683 delta(0,ipar)=tpcInnerC->GetParameter()[ipar]-track->GetParameter()[ipar];
\r
685 deltaTtrackC(ipar,0)=trackInnerC->GetParameter()[ipar]-track->GetParameter()[ipar];
\r
686 deltatrackC(0,ipar)=trackInnerC->GetParameter()[ipar]-track->GetParameter()[ipar];
\r
688 for (Int_t jpar=0; jpar<5; jpar++) {
\r
689 Int_t index=track->GetIndex(ipar,jpar);
\r
690 covarM(ipar,jpar)=track->GetCovariance()[index]+tpcInnerC->GetCovariance()[index];
\r
691 covarMtrackC(ipar,jpar)=track->GetCovariance()[index]+trackInnerC->GetCovariance()[index];
\r
695 // chi2 distance TPC constrained and TPC+ITS
\r
696 TMatrixD covarMInv = covarM.Invert();
\r
697 TMatrixD mat2 = covarMInv*deltaT;
\r
698 chi2 = delta*mat2;
\r
701 // chi2 distance TPC refitted constrained and TPC+ITS
\r
702 TMatrixD covarMInvtrackC = covarMtrackC.Invert();
\r
703 TMatrixD mat2trackC = covarMInvtrackC*deltaTtrackC;
\r
704 chi2trackC = deltatrackC*mat2trackC;
\r
705 //chi2trackC.Print();
\r
710 // Propagate ITSout to TPC inner wall
\r
711 // and calculate chi2 distance to track (InnerParams)
\r
713 const Double_t kTPCRadius=85;
\r
714 const Double_t kStep=3;
\r
716 // clone track InnerParams has to be deleted
\r
717 Bool_t isOKtrackInnerC2 = kFALSE;
\r
718 AliExternalTrackParam *trackInnerC2 = new AliExternalTrackParam(*(track->GetInnerParam()));
\r
719 if (trackInnerC2) {
\r
720 isOKtrackInnerC2 = AliTracker::PropagateTrackToBxByBz(trackInnerC2,kTPCRadius,track->GetMass(),kStep,kFALSE);
\r
723 Bool_t isOKouterITSc = kFALSE;
\r
724 AliExternalTrackParam *outerITSc = NULL;
\r
725 TMatrixD chi2OuterITS(1,1);
\r
727 if(esdFriend && esdFriend->TestSkipBit()==kFALSE)
\r
729 // propagate ITSout to TPC inner wall
\r
730 AliESDfriendTrack *friendTrack = esdFriend->GetTrack(iTrack);
\r
734 outerITSc = new AliExternalTrackParam(*friendTrack->GetITSOut());
\r
737 isOKouterITSc = AliTracker::PropagateTrackToBxByBz(outerITSc,kTPCRadius,track->GetMass(),kStep,kFALSE);
\r
738 isOKouterITSc = outerITSc->Rotate(trackInnerC2->GetAlpha());
\r
739 isOKouterITSc = outerITSc->PropagateTo(trackInnerC2->GetX(),esdEvent->GetMagneticField());
\r
742 // calculate chi2 between outerITS and innerParams
\r
743 // cov without z-coordinate at the moment
\r
745 TMatrixD deltaTouterITS(4,1);
\r
746 TMatrixD deltaouterITS(1,4);
\r
747 TMatrixD covarMouterITS(4,4);
\r
749 if(isOKtrackInnerC2 && isOKouterITSc) {
\r
752 for (Int_t ipar=0; ipar<5; ipar++) {
\r
754 deltaTouterITS(kipar,0)=outerITSc->GetParameter()[ipar]-trackInnerC2->GetParameter()[ipar];
\r
755 deltaouterITS(0,kipar)=outerITSc->GetParameter()[ipar]-trackInnerC2->GetParameter()[ipar];
\r
759 for (Int_t jpar=0; jpar<5; jpar++) {
\r
760 Int_t index=outerITSc->GetIndex(ipar,jpar);
\r
761 if(ipar !=1 || jpar!=1) {
\r
762 covarMouterITS(kipar,kjpar)=outerITSc->GetCovariance()[index]+trackInnerC2->GetCovariance()[index];
\r
764 if(jpar!=1) kjpar++;
\r
766 if(ipar!=1) kipar++;
\r
769 // chi2 distance ITSout and InnerParams
\r
770 TMatrixD covarMInvouterITS = covarMouterITS.Invert();
\r
771 TMatrixD mat2outerITS = covarMInvouterITS*deltaTouterITS;
\r
772 chi2OuterITS = deltaouterITS*mat2outerITS;
\r
773 //chi2OuterITS.Print();
\r
782 TParticle *particle=NULL, *particleTPC=NULL, *particleITS=NULL;
\r
783 TParticle *particleMother=NULL, *particleMotherTPC=NULL, *particleMotherITS=NULL;
\r
784 Int_t mech=-1, mechTPC=-1, mechITS=-1;
\r
785 Bool_t isPrim=kFALSE, isPrimTPC=kFALSE, isPrimITS=kFALSE;
\r
786 Bool_t isFromStrangess=kFALSE, isFromStrangessTPC=kFALSE, isFromStrangessITS=kFALSE;
\r
787 Bool_t isFromConversion=kFALSE, isFromConversionTPC=kFALSE, isFromConversionITS=kFALSE;
\r
788 Bool_t isFromMaterial=kFALSE, isFromMaterialTPC=kFALSE, isFromMaterialITS=kFALSE;
\r
790 AliTrackReference *refTPCIn = NULL;
\r
791 AliTrackReference *refITS = NULL;
\r
793 Bool_t isOKtrackInnerC3 = kFALSE;
\r
794 AliExternalTrackParam *trackInnerC3 = new AliExternalTrackParam(*(track->GetInnerParam()));
\r
803 Int_t label = TMath::Abs(track->GetLabel());
\r
804 particle = stack->Particle(label);
\r
805 if(particle && particle->GetPDG() && particle->GetPDG()->Charge()!=0.)
\r
807 particleMother = GetMother(particle,stack);
\r
808 mech = particle->GetUniqueID();
\r
809 isPrim = stack->IsPhysicalPrimary(label);
\r
810 isFromStrangess = IsFromStrangeness(label,stack);
\r
811 isFromConversion = IsFromConversion(label,stack);
\r
812 isFromMaterial = IsFromMaterial(label,stack);
\r
818 Int_t labelTPC = TMath::Abs(track->GetTPCLabel());
\r
819 particleTPC = stack->Particle(labelTPC);
\r
820 if(particleTPC && particleTPC->GetPDG() && particleTPC->GetPDG()->Charge()!=0.)
\r
822 particleMotherTPC = GetMother(particleTPC,stack);
\r
823 mechTPC = particleTPC->GetUniqueID();
\r
824 isPrimTPC = stack->IsPhysicalPrimary(labelTPC);
\r
825 isFromStrangessTPC = IsFromStrangeness(labelTPC,stack);
\r
826 isFromConversionTPC = IsFromConversion(labelTPC,stack);
\r
827 isFromMaterialTPC = IsFromMaterial(labelTPC,stack);
\r
831 // store first track reference
\r
835 TClonesArray *trefs=0;
\r
836 Int_t status = mcEvent->GetParticleAndTR(track->GetTPCLabel(), part, trefs);
\r
838 if(status>0 && part && trefs && part->GetPDG() && part->GetPDG()->Charge()!=0.)
\r
840 Int_t nTrackRef = trefs->GetEntries();
\r
841 //printf("nTrackRef %d \n",nTrackRef);
\r
843 Int_t countITS = 0;
\r
844 for (Int_t iref = 0; iref < nTrackRef; iref++)
\r
846 AliTrackReference *ref = (AliTrackReference *)trefs->At(iref);
\r
848 // Ref. in the middle ITS
\r
849 if(ref && ref->DetectorId()==AliTrackReference::kITS)
\r
851 if(!refITS && countITS==2) {
\r
853 //printf("refITS %p \n",refITS);
\r
859 if(ref && ref->DetectorId()==AliTrackReference::kTPC)
\r
863 //printf("refTPCIn %p \n",refTPCIn);
\r
869 // transform inner params to TrackRef
\r
871 if(refTPCIn && trackInnerC3)
\r
873 Double_t kRefPhi = TMath::ATan2(refTPCIn->Y(),refTPCIn->X());
\r
874 isOKtrackInnerC3 = trackInnerC3->Rotate(kRefPhi);
\r
875 isOKtrackInnerC3 = AliTracker::PropagateTrackToBxByBz(trackInnerC3,refTPCIn->R(),track->GetMass(),kStep,kFALSE);
\r
882 Int_t labelITS = TMath::Abs(track->GetITSLabel());
\r
883 particleITS = stack->Particle(labelITS);
\r
884 if(particleITS && particleITS->GetPDG() && particleITS->GetPDG()->Charge()!=0.)
\r
886 particleMotherITS = GetMother(particleITS,stack);
\r
887 mechITS = particleITS->GetUniqueID();
\r
888 isPrimITS = stack->IsPhysicalPrimary(labelITS);
\r
889 isFromStrangessITS = IsFromStrangeness(labelITS,stack);
\r
890 isFromConversionITS = IsFromConversion(labelITS,stack);
\r
891 isFromMaterialITS = IsFromMaterial(labelITS,stack);
\r
896 Bool_t dumpToTree=kFALSE;
\r
898 if(isOKtpcInnerC && isOKtrackInnerC) dumpToTree = kTRUE;
\r
899 if(fUseESDfriends && isOKtrackInnerC2 && isOKouterITSc) dumpToTree = kTRUE;
\r
900 if(fUseMCInfo && isOKtrackInnerC3) dumpToTree = kTRUE;
\r
903 if(fTreeSRedirector && dumpToTree)
\r
905 (*fTreeSRedirector)<<"dNdPtTree"<<
\r
906 "fileName.="<<&fileName<<
\r
907 "runNumber="<<runNumber<<
\r
908 "evtTimeStamp="<<evtTimeStamp<<
\r
909 "evtNumberInFile="<<evtNumberInFile<<
\r
911 "vertX="<<vert[0]<<
\r
912 "vertY="<<vert[1]<<
\r
913 "vertZ="<<vert[2]<<
\r
917 "esdTrack.="<<track<<
\r
918 "extTPCInnerC.="<<tpcInnerC<<
\r
919 "extInnerParamC.="<<trackInnerC<<
\r
920 "extInnerParam.="<<trackInnerC2<<
\r
921 "extOuterITS.="<<outerITSc<<
\r
922 "extInnerParamRef.="<<trackInnerC3<<
\r
923 "refTPCIn.="<<refTPCIn<<
\r
924 "refITS.="<<refITS<<
\r
925 "chi2TPCInnerC="<<chi2(0,0)<<
\r
926 "chi2InnerC="<<chi2trackC(0,0)<<
\r
927 "chi2OuterITS="<<chi2OuterITS(0,0)<<
\r
928 "centralityF="<<centralityF<<
\r
929 "particle.="<<particle<<
\r
930 "particleMother.="<<particleMother<<
\r
932 "isPrim="<<isPrim<<
\r
933 "isFromStrangess="<<isFromStrangess<<
\r
934 "isFromConversion="<<isFromConversion<<
\r
935 "isFromMaterial="<<isFromMaterial<<
\r
936 "particleTPC.="<<particleTPC<<
\r
937 "particleMotherTPC.="<<particleMotherTPC<<
\r
938 "mechTPC="<<mechTPC<<
\r
939 "isPrimTPC="<<isPrimTPC<<
\r
940 "isFromStrangessTPC="<<isFromStrangessTPC<<
\r
941 "isFromConversionTPC="<<isFromConversionTPC<<
\r
942 "isFromMaterialTPC="<<isFromMaterialTPC<<
\r
943 "particleITS.="<<particleITS<<
\r
944 "particleMotherITS.="<<particleMotherITS<<
\r
945 "mechITS="<<mechITS<<
\r
946 "isPrimITS="<<isPrimITS<<
\r
947 "isFromStrangessITS="<<isFromStrangessITS<<
\r
948 "isFromConversionITS="<<isFromConversionITS<<
\r
949 "isFromMaterialITS="<<isFromMaterialITS<<
\r
953 if(tpcInnerC) delete tpcInnerC;
\r
954 if(trackInnerC) delete trackInnerC;
\r
955 if(trackInnerC2) delete trackInnerC2;
\r
956 if(outerITSc) delete outerITSc;
\r
957 if(trackInnerC3) delete trackInnerC3;
\r
961 PostData(1, fOutput);
\r
965 //_____________________________________________________________________________
\r
966 void AlidNdPtTrackDumpTask::ProcessMCEff(AliESDEvent *const esdEvent, AliMCEvent * const mcEvent, AliESDfriend *const /*esdFriend*/)
\r
969 // Fill tree for efficiency studies MC only
\r
972 AliDebug(AliLog::kError, "esdEvent not available");
\r
977 AliDebug(AliLog::kError, "mcEvent not available");
\r
981 // get selection cuts
\r
982 AlidNdPtEventCuts *evtCuts = GetEventCuts();
\r
983 AlidNdPtAcceptanceCuts *accCuts = GetAcceptanceCuts();
\r
984 AliESDtrackCuts *esdTrackCuts = GetTrackCuts();
\r
986 if(!evtCuts || !accCuts || !esdTrackCuts) {
\r
987 AliDebug(AliLog::kError, "cuts not available");
\r
991 // trigger selection
\r
992 Bool_t isEventTriggered = kTRUE;
\r
993 AliPhysicsSelection *physicsSelection = NULL;
\r
994 AliTriggerAnalysis* triggerAnalysis = NULL;
\r
997 AliInputEventHandler* inputHandler = (AliInputEventHandler*) AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler();
\r
1000 Printf("ERROR: Could not receive input handler");
\r
1005 TTree *chain = (TChain*)GetInputData(0);
\r
1007 Printf("ERROR: Could not receive input chain");
\r
1010 TObjString fileName(chain->GetCurrentFile()->GetName());
\r
1013 if(evtCuts->IsTriggerRequired())
\r
1016 isEventTriggered = inputHandler->IsEventSelected() & AliVEvent::kMB;
\r
1018 physicsSelection = static_cast<AliPhysicsSelection*> (inputHandler->GetEventSelection());
\r
1019 if(!physicsSelection) return;
\r
1021 if (isEventTriggered && (GetTrigger() == AliTriggerAnalysis::kV0AND)) {
\r
1022 // set trigger (V0AND)
\r
1023 triggerAnalysis = physicsSelection->GetTriggerAnalysis();
\r
1024 if(!triggerAnalysis) return;
\r
1025 isEventTriggered = triggerAnalysis->IsOfflineTriggerFired(esdEvent, GetTrigger());
\r
1029 // centrality determination
\r
1030 Float_t centralityF = -1;
\r
1031 AliCentrality *esdCentrality = esdEvent->GetCentrality();
\r
1032 centralityF = esdCentrality->GetCentralityPercentile(fCentralityEstimator.Data());
\r
1034 // use MC information
\r
1035 AliHeader* header = 0;
\r
1036 AliGenEventHeader* genHeader = 0;
\r
1037 AliStack* stack = 0;
\r
1040 Int_t multMCTrueTracks = 0;
\r
1045 AliDebug(AliLog::kError, "mcEvent not available");
\r
1048 // get MC event header
\r
1049 header = mcEvent->Header();
\r
1051 AliDebug(AliLog::kError, "Header not available");
\r
1054 // MC particle stack
\r
1055 stack = mcEvent->Stack();
\r
1057 AliDebug(AliLog::kError, "Stack not available");
\r
1062 genHeader = header->GenEventHeader();
\r
1064 AliDebug(AliLog::kError, "Could not retrieve genHeader from Header");
\r
1067 genHeader->PrimaryVertex(vtxMC);
\r
1069 // multipliticy of all MC primary tracks
\r
1070 // in Zv, pt and eta ranges)
\r
1071 multMCTrueTracks = AlidNdPtHelper::GetMCTrueTrackMult(mcEvent,evtCuts,accCuts);
\r
1075 // get reconstructed vertex
\r
1076 //const AliESDVertex* vtxESD = 0;
\r
1077 const AliESDVertex* vtxESD = 0;
\r
1078 if(GetAnalysisMode() == AlidNdPtHelper::kTPC) {
\r
1079 vtxESD = esdEvent->GetPrimaryVertexTPC();
\r
1081 else if(GetAnalysisMode() == AlidNdPtHelper::kTPCITS) {
\r
1082 vtxESD = esdEvent->GetPrimaryVertexTracks();
\r
1088 if(!vtxESD) return;
\r
1090 Bool_t isEventOK = evtCuts->AcceptEvent(esdEvent,mcEvent,vtxESD);
\r
1091 //printf("isEventOK %d, isEventTriggered %d \n",isEventOK, isEventTriggered);
\r
1092 //printf("GetAnalysisMode() %d \n",GetAnalysisMode());
\r
1094 // check event cuts
\r
1095 if(isEventOK && isEventTriggered)
\r
1097 if(IsUseMCInfo())
\r
1099 if(!stack) return;
\r
1104 TParticle *particle=NULL;
\r
1105 TParticle *particleMother=NULL;
\r
1108 // reco event info
\r
1109 Double_t vert[3] = {0};
\r
1110 vert[0] = vtxESD->GetXv();
\r
1111 vert[1] = vtxESD->GetYv();
\r
1112 vert[2] = vtxESD->GetZv();
\r
1113 Int_t mult = vtxESD->GetNContributors();
\r
1114 Double_t bz = esdEvent->GetMagneticField();
\r
1115 Double_t runNumber = esdEvent->GetRunNumber();
\r
1116 Double_t evtTimeStamp = esdEvent->GetTimeStamp();
\r
1117 Int_t evtNumberInFile = esdEvent->GetEventNumberInFile();
\r
1119 // loop over MC stack
\r
1120 for (Int_t iMc = 0; iMc < stack->GetNtrack(); ++iMc)
\r
1122 particle = stack->Particle(iMc);
\r
1126 // only charged particles
\r
1127 if(!particle->GetPDG()) continue;
\r
1128 Double_t charge = particle->GetPDG()->Charge()/3.;
\r
1129 if (TMath::Abs(charge) < 0.001)
\r
1132 // only primary particles
\r
1133 Bool_t prim = stack->IsPhysicalPrimary(iMc);
\r
1134 if(!prim) continue;
\r
1136 // downscale low-pT particles
\r
1137 Double_t scalempt= TMath::Min(particle->Pt(),10.);
\r
1138 Double_t downscaleF = gRandom->Rndm();
\r
1139 downscaleF *= fLowPtTrackDownscaligF;
\r
1140 if(TMath::Exp(2*scalempt)<downscaleF) continue;
\r
1142 // is particle in acceptance
\r
1143 if(!accCuts->AcceptTrack(particle)) continue;
\r
1145 // check if particle reconstructed
\r
1146 Bool_t isRec = kFALSE;
\r
1147 Int_t trackIndex = -1;
\r
1148 for (Int_t iTrack = 0; iTrack < esdEvent->GetNumberOfTracks(); iTrack++)
\r
1151 AliESDtrack *track = esdEvent->GetTrack(iTrack);
\r
1152 if(!track) continue;
\r
1153 if(track->Charge()==0) continue;
\r
1154 if(esdTrackCuts->AcceptTrack(track) && accCuts->AcceptTrack(track))
\r
1156 Int_t label = TMath::Abs(track->GetLabel());
\r
1157 if(label == iMc) {
\r
1159 trackIndex = iTrack;
\r
1165 // Store information in the output tree
\r
1166 AliESDtrack *recTrack = NULL;
\r
1167 if(trackIndex>-1) {
\r
1168 recTrack = esdEvent->GetTrack(trackIndex);
\r
1170 recTrack = new AliESDtrack();
\r
1173 particleMother = GetMother(particle,stack);
\r
1174 mech = particle->GetUniqueID();
\r
1176 //MC particle track length
\r
1177 Double_t tpcTrackLength = 0.;
\r
1178 AliMCParticle *mcParticle = (AliMCParticle*) mcEvent->GetTrack(iMc);
\r
1181 tpcTrackLength = mcParticle->GetTPCTrackLength(bz,0.05,counter,3.0);
\r
1186 if(fTreeSRedirector) {
\r
1187 (*fTreeSRedirector)<<"MCEffTree"<<
\r
1188 "fileName.="<<&fileName<<
\r
1189 "runNumber="<<runNumber<<
\r
1190 "evtTimeStamp="<<evtTimeStamp<<
\r
1191 "evtNumberInFile="<<evtNumberInFile<<
\r
1193 "vertX="<<vert[0]<<
\r
1194 "vertY="<<vert[1]<<
\r
1195 "vertZ="<<vert[2]<<
\r
1197 "esdTrack.="<<recTrack<<
\r
1199 "tpcTrackLength="<<tpcTrackLength<<
\r
1200 "particle.="<<particle<<
\r
1201 "particleMother.="<<particleMother<<
\r
1206 if(trackIndex <0 && recTrack) delete recTrack; recTrack=0;
\r
1211 PostData(1, fOutput);
\r
1214 //_____________________________________________________________________________
\r
1215 Bool_t AlidNdPtTrackDumpTask::IsHighDeDxParticle(AliESDtrack * track) {
\r
1217 // check if particle is Z > 1
\r
1219 if (track->GetTPCNcls() < 60) return kFALSE;
\r
1220 Double_t mom = track->GetInnerParam()->GetP();
\r
1221 if (mom < 0.2) return kFALSE; // protection against unexpected behavior of Aleph parameterization
\r
1222 Float_t dca[2], bCov[3];
\r
1223 track->GetImpactParameters(dca,bCov);
\r
1226 Double_t triggerDeDx = 4*AliExternalTrackParam::BetheBlochAleph((mom*2)/(0.938*3),1.0288,31.9806,5.04114e-11,2.13096,2.38541);
\r
1228 if (track->GetTPCsignal() > triggerDeDx && track->GetTPCsignal()<1000 && TMath::Abs(dca[0])<3.) return kTRUE;
\r
1233 //_____________________________________________________________________________
\r
1234 void AlidNdPtTrackDumpTask::ProcessV0(AliESDEvent *const esdEvent, AliMCEvent * const mcEvent, AliESDfriend *const /*esdFriend*/)
\r
1237 // Select real events with V0 (K0s and Lambda) high-pT candidates
\r
1240 AliDebug(AliLog::kError, "esdEvent not available");
\r
1244 // get selection cuts
\r
1245 AlidNdPtEventCuts *evtCuts = GetEventCuts();
\r
1246 AlidNdPtAcceptanceCuts *accCuts = GetAcceptanceCuts();
\r
1247 AliESDtrackCuts *esdTrackCuts = GetTrackCuts();
\r
1249 if(!evtCuts || !accCuts || !esdTrackCuts) {
\r
1250 AliDebug(AliLog::kError, "cuts not available");
\r
1254 // trigger selection
\r
1255 Bool_t isEventTriggered = kTRUE;
\r
1256 AliPhysicsSelection *physicsSelection = NULL;
\r
1257 AliTriggerAnalysis* triggerAnalysis = NULL;
\r
1260 AliInputEventHandler* inputHandler = (AliInputEventHandler*) AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler();
\r
1261 if (!inputHandler)
\r
1263 Printf("ERROR: Could not receive input handler");
\r
1268 TTree *chain = (TChain*)GetInputData(0);
\r
1270 Printf("ERROR: Could not receive input chain");
\r
1273 TObjString fileName(chain->GetCurrentFile()->GetName());
\r
1276 if(evtCuts->IsTriggerRequired())
\r
1279 isEventTriggered = inputHandler->IsEventSelected() & AliVEvent::kMB;
\r
1281 physicsSelection = static_cast<AliPhysicsSelection*> (inputHandler->GetEventSelection());
\r
1282 if(!physicsSelection) return;
\r
1283 //SetPhysicsTriggerSelection(physicsSelection);
\r
1285 if (isEventTriggered && (GetTrigger() == AliTriggerAnalysis::kV0AND)) {
\r
1286 // set trigger (V0AND)
\r
1287 triggerAnalysis = physicsSelection->GetTriggerAnalysis();
\r
1288 if(!triggerAnalysis) return;
\r
1289 isEventTriggered = triggerAnalysis->IsOfflineTriggerFired(esdEvent, GetTrigger());
\r
1293 // centrality determination
\r
1294 Float_t centralityF = -1;
\r
1295 AliCentrality *esdCentrality = esdEvent->GetCentrality();
\r
1296 centralityF = esdCentrality->GetCentralityPercentile(fCentralityEstimator.Data());
\r
1299 // get reconstructed vertex
\r
1300 //const AliESDVertex* vtxESD = 0;
\r
1301 const AliESDVertex* vtxESD = 0;
\r
1302 if(GetAnalysisMode() == AlidNdPtHelper::kTPC) {
\r
1303 vtxESD = esdEvent->GetPrimaryVertexTPC();
\r
1305 else if(GetAnalysisMode() == AlidNdPtHelper::kTPCITS) {
\r
1306 vtxESD = esdEvent->GetPrimaryVertexTracks();
\r
1312 if(!vtxESD) return;
\r
1314 Bool_t isEventOK = evtCuts->AcceptEvent(esdEvent,mcEvent,vtxESD);
\r
1315 //printf("isEventOK %d, isEventTriggered %d \n",isEventOK, isEventTriggered);
\r
1316 //printf("GetAnalysisMode() %d \n",GetAnalysisMode());
\r
1318 // check event cuts
\r
1319 if(isEventOK && isEventTriggered) {
\r
1321 // Dump the pt downscaled V0 into the tree
\r
1323 Int_t ntracks = esdEvent->GetNumberOfTracks();
\r
1324 Int_t nV0s = esdEvent->GetNumberOfV0s();
\r
1325 Int_t run = esdEvent->GetRunNumber();
\r
1326 Int_t time= esdEvent->GetTimeStamp();
\r
1327 Int_t evNr=esdEvent->GetEventNumberInFile();
\r
1328 Double_t bz = esdEvent->GetMagneticField();
\r
1331 for (Int_t iv0=0; iv0<nV0s; iv0++){
\r
1332 AliESDv0 * v0 = esdEvent->GetV0(iv0);
\r
1333 if (!v0) continue;
\r
1334 AliESDtrack * track0 = esdEvent->GetTrack(v0->GetIndex(0));
\r
1335 AliESDtrack * track1 = esdEvent->GetTrack(v0->GetIndex(1));
\r
1336 if (!track0) continue;
\r
1337 if (!track1) continue;
\r
1338 if (track0->GetSign()<0) {
\r
1339 track1 = esdEvent->GetTrack(v0->GetIndex(0));
\r
1340 track0 = esdEvent->GetTrack(v0->GetIndex(1));
\r
1343 Bool_t isDownscaled = IsV0Downscaled(v0);
\r
1344 if (isDownscaled) continue;
\r
1345 AliKFParticle kfparticle; //
\r
1346 Int_t type=GetKFParticle(v0,esdEvent,kfparticle);
\r
1347 if (type==0) continue;
\r
1349 if(!fTreeSRedirector) return;
\r
1350 (*fTreeSRedirector)<<"V0s"<<
\r
1351 "isDownscaled="<<isDownscaled<<
\r
1353 "fileName.="<<&fileName<<
\r
1354 "runNumber="<<run<<
\r
1355 "evtTimeStamp="<<time<<
\r
1356 "evtNumberInFile="<<evNr<<
\r
1358 "ntracks="<<ntracks<<
\r
1360 "kf.="<<&kfparticle<<
\r
1361 "track0.="<<track0<<
\r
1362 "track1.="<<track1<<
\r
1363 "centralityF="<<centralityF<<
\r
1367 PostData(1, fOutput);
\r
1370 //_____________________________________________________________________________
\r
1371 void AlidNdPtTrackDumpTask::ProcessdEdx(AliESDEvent *const esdEvent, AliMCEvent * const mcEvent, AliESDfriend *const /*esdFriend*/)
\r
1374 // Select real events with large TPC dEdx signal
\r
1377 AliDebug(AliLog::kError, "esdEvent not available");
\r
1381 // get selection cuts
\r
1382 AlidNdPtEventCuts *evtCuts = GetEventCuts();
\r
1383 AlidNdPtAcceptanceCuts *accCuts = GetAcceptanceCuts();
\r
1384 AliESDtrackCuts *esdTrackCuts = GetTrackCuts();
\r
1386 if(!evtCuts || !accCuts || !esdTrackCuts) {
\r
1387 AliDebug(AliLog::kError, "cuts not available");
\r
1392 TTree *chain = (TChain*)GetInputData(0);
\r
1394 Printf("ERROR: Could not receive input chain");
\r
1397 TObjString fileName(chain->GetCurrentFile()->GetName());
\r
1400 Bool_t isEventTriggered = kTRUE;
\r
1401 AliPhysicsSelection *physicsSelection = NULL;
\r
1402 AliTriggerAnalysis* triggerAnalysis = NULL;
\r
1405 AliInputEventHandler* inputHandler = (AliInputEventHandler*) AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler();
\r
1406 if (!inputHandler)
\r
1408 Printf("ERROR: Could not receive input handler");
\r
1412 if(evtCuts->IsTriggerRequired())
\r
1415 isEventTriggered = inputHandler->IsEventSelected() & AliVEvent::kMB;
\r
1417 physicsSelection = static_cast<AliPhysicsSelection*> (inputHandler->GetEventSelection());
\r
1418 if(!physicsSelection) return;
\r
1420 if (isEventTriggered && (GetTrigger() == AliTriggerAnalysis::kV0AND)) {
\r
1421 // set trigger (V0AND)
\r
1422 triggerAnalysis = physicsSelection->GetTriggerAnalysis();
\r
1423 if(!triggerAnalysis) return;
\r
1424 isEventTriggered = triggerAnalysis->IsOfflineTriggerFired(esdEvent, GetTrigger());
\r
1428 // get reconstructed vertex
\r
1429 const AliESDVertex* vtxESD = 0;
\r
1430 if(GetAnalysisMode() == AlidNdPtHelper::kTPC) {
\r
1431 vtxESD = esdEvent->GetPrimaryVertexTPC();
\r
1433 else if(GetAnalysisMode() == AlidNdPtHelper::kTPCITS) {
\r
1434 vtxESD = esdEvent->GetPrimaryVertexTracks();
\r
1439 if(!vtxESD) return;
\r
1441 Bool_t isEventOK = evtCuts->AcceptEvent(esdEvent,mcEvent,vtxESD);
\r
1442 //printf("isEventOK %d, isEventTriggered %d \n",isEventOK, isEventTriggered);
\r
1443 //printf("GetAnalysisMode() %d \n",GetAnalysisMode());
\r
1446 // check event cuts
\r
1447 if(isEventOK && isEventTriggered)
\r
1449 Double_t vert[3] = {0};
\r
1450 vert[0] = vtxESD->GetXv();
\r
1451 vert[1] = vtxESD->GetYv();
\r
1452 vert[2] = vtxESD->GetZv();
\r
1453 Int_t mult = vtxESD->GetNContributors();
\r
1454 Double_t bz = esdEvent->GetMagneticField();
\r
1455 Double_t runNumber = esdEvent->GetRunNumber();
\r
1456 Double_t evtTimeStamp = esdEvent->GetTimeStamp();
\r
1457 Int_t evtNumberInFile = esdEvent->GetEventNumberInFile();
\r
1460 for (Int_t iTrack = 0; iTrack < esdEvent->GetNumberOfTracks(); iTrack++)
\r
1462 AliESDtrack *track = esdEvent->GetTrack(iTrack);
\r
1463 if(!track) continue;
\r
1464 if(track->Charge()==0) continue;
\r
1465 if(!esdTrackCuts->AcceptTrack(track)) continue;
\r
1466 if(!accCuts->AcceptTrack(track)) continue;
\r
1468 if(!IsHighDeDxParticle(track)) continue;
\r
1470 if(!fTreeSRedirector) return;
\r
1471 (*fTreeSRedirector)<<"dEdx"<<
\r
1472 "fileName.="<<&fileName<<
\r
1473 "runNumber="<<runNumber<<
\r
1474 "evtTimeStamp="<<evtTimeStamp<<
\r
1475 "evtNumberInFile="<<evtNumberInFile<<
\r
1477 "vertX="<<vert[0]<<
\r
1478 "vertY="<<vert[1]<<
\r
1479 "vertZ="<<vert[2]<<
\r
1481 "esdTrack.="<<track<<
\r
1487 //_____________________________________________________________________________
\r
1488 Int_t AlidNdPtTrackDumpTask::GetKFParticle(AliESDv0 *const v0, AliESDEvent * const event, AliKFParticle & kfparticle)
\r
1491 // Create KF particle in case the V0 fullfill selection criteria
\r
1493 // Selection criteria
\r
1494 // 0. algorithm cut
\r
1497 // 4. rough mass cut
\r
1498 // 5. Normalized pointing angle cut
\r
1500 const Double_t cutMass=0.2;
\r
1501 const Double_t kSigmaDCACut=3;
\r
1503 // 0.) algo cut - accept only on the fly
\r
1505 if (v0->GetOnFlyStatus() ==kFALSE) return 0;
\r
1509 AliESDtrack * track0 = event->GetTrack(v0->GetIndex(0));
\r
1510 AliESDtrack * track1 = event->GetTrack(v0->GetIndex(1));
\r
1512 TCut cutD="abs(track0.fD/sqrt(track0.fCdd))>2&&abs(track1.fD/sqrt(track1.fCdd))>2";
\r
1513 TCut cutTheta="abs(track0.fP[3])<1&&abs(track1.fP[3])<1";
\r
1514 TCut cutNcl="track0.GetTPCClusterInfo(2,1)>100&&track1.GetTPCClusterInfo(2,1)>100";
\r
1516 if (TMath::Abs(track0->GetTgl())>1) return 0;
\r
1517 if (TMath::Abs(track1->GetTgl())>1) return 0;
\r
1518 if ((track0->GetTPCClusterInfo(2,1))<100) return 0;
\r
1519 if ((track1->GetTPCClusterInfo(2,1))<100) return 0;
\r
1520 //if ((track0->GetITSclusters(0))<2) return 0;
\r
1521 //if ((track1->GetITSclusters(0))<2) return 0;
\r
1522 Float_t pos0[2]={0}, cov0[3]={0};
\r
1523 Float_t pos1[2]={0}, cov1[3]={0};
\r
1524 track0->GetImpactParameters(pos0,cov0);
\r
1525 track0->GetImpactParameters(pos1,cov1);
\r
1527 if (TMath::Abs(pos0[0])<kSigmaDCACut*TMath::Sqrt(cov0[0])) return 0;
\r
1528 if (TMath::Abs(pos1[0])<kSigmaDCACut*TMath::Sqrt(cov1[0])) return 0;
\r
1533 Double_t chi2KF = v0->GetKFInfo(2,2,2);
\r
1534 if (chi2KF>25) return 0;
\r
1536 // 4.) Rough mass cut - 0.200 GeV
\r
1538 static Double_t masses[2]={-1};
\r
1540 masses[0] = TDatabasePDG::Instance()->GetParticle("K_S0")->Mass();
\r
1541 masses[1] = TDatabasePDG::Instance()->GetParticle("Lambda0")->Mass();
\r
1543 Double_t mass00= v0->GetEffMass(0,0);
\r
1544 Double_t mass22= v0->GetEffMass(2,2);
\r
1545 Double_t mass42= v0->GetEffMass(4,2);
\r
1546 Double_t mass24= v0->GetEffMass(2,4);
\r
1547 Bool_t massOK=kFALSE;
\r
1552 if (TMath::Abs(mass00-0)<cutMass) {
\r
1553 massOK=kTRUE; type+=1;
\r
1554 if (TMath::Abs(mass00-0)<dmass) {
\r
1556 dmass=TMath::Abs(mass00-0);
\r
1560 if (TMath::Abs(mass24-masses[1])<cutMass) {
\r
1561 massOK=kTRUE; type+=2;
\r
1562 if (TMath::Abs(mass24-masses[1])<dmass){
\r
1563 dmass = TMath::Abs(mass24-masses[1]);
\r
1568 if (TMath::Abs(mass42-masses[1])<cutMass) {
\r
1569 massOK=kTRUE; type+=4;
\r
1570 if (TMath::Abs(mass42-masses[1])<dmass){
\r
1571 dmass = TMath::Abs(mass42-masses[1]);
\r
1576 if (TMath::Abs(mass22-masses[0])<cutMass) {
\r
1577 massOK=kTRUE; type+=8;
\r
1578 if (TMath::Abs(mass22-masses[0])<dmass){
\r
1579 dmass = TMath::Abs(mass22-masses[0]);
\r
1584 if (type==0) return 0;
\r
1586 const Int_t spdg[5]={kPositron,kMuonPlus,kPiPlus, kKPlus, kProton};
\r
1587 const AliExternalTrackParam *paramP = v0->GetParamP();
\r
1588 const AliExternalTrackParam *paramN = v0->GetParamN();
\r
1589 if (paramP->GetSign()<0){
\r
1590 paramP=v0->GetParamP();
\r
1591 paramN=v0->GetParamN();
\r
1593 //Double_t *pparam1 = (Double_t*)paramP->GetParameter();
\r
1594 //Double_t *pparam2 = (Double_t*)paramN->GetParameter();
\r
1596 AliKFParticle kfp1( *paramP, spdg[p1] );
\r
1597 AliKFParticle kfp2( *paramN, -1 *spdg[p2] );
\r
1598 AliKFParticle V0KF;
\r
1605 Double_t errPhi = V0KF.GetErrPhi();
\r
1606 Double_t pointAngle= TMath::ACos(v0->GetV0CosineOfPointingAngle());
\r
1607 if (pointAngle/errPhi>10) return 0;
\r
1612 //_____________________________________________________________________________
\r
1613 Bool_t AlidNdPtTrackDumpTask::IsV0Downscaled(AliESDv0 *const v0)
\r
1616 // Downscale randomly low pt V0
\r
1619 Double_t maxPt= TMath::Max(v0->GetParamP()->Pt(), v0->GetParamN()->Pt());
\r
1620 Double_t scalempt= TMath::Min(maxPt,10.);
\r
1621 Double_t downscaleF = gRandom->Rndm();
\r
1622 downscaleF *= fLowPtV0DownscaligF;
\r
1624 //printf("V0 TMath::Exp(2*scalempt) %e, downscaleF %e \n",TMath::Exp(2*scalempt), downscaleF);
\r
1625 if (TMath::Exp(2*scalempt)<downscaleF) return kTRUE;
\r
1629 TH1F his1("his1","his1",100,0,10);
\r
1630 TH1F his2("his2","his2",100,0,10);
\r
1631 {for (Int_t i=0; i<10000; i++){
\r
1632 Double_t rnd=gRandom->Exp(1);
\r
1633 Bool_t isDownscaled =TMath::Exp(rnd)<100*gRandom->Rndm();
\r
1635 if (!isDownscaled) his2->Fill(rnd);
\r
1643 //_____________________________________________________________________________
\r
1645 Bool_t AlidNdPtTrackDumpTask::MakeTPCInnerC(AliESDtrack *const track, const AliESDVertex* vtx, Double_t b[3])
\r
1648 // return TPC inner constrain object (must be deleted)
\r
1651 if(!track) return NULL;
\r
1652 if(!vtx) return NULL;
\r
1654 AliExternalTrackParam * tpcInnerC = NULL;
\r
1655 Bool_t isOK = kFALSE;
\r
1657 tpcInnerC = new AliExternalTrackParam(*(track->GetTPCInnerParam()));
\r
1658 if (!tpcInnerC) return NULL;
\r
1659 isOK = ConstrainTPCInner(tpcInnerC,vtx,b);
\r
1660 isOK = tpcInnerC->Rotate(track->GetAlpha());
\r
1661 isOK = tpcInnerC->PropagateTo(track->GetX(),b[2]);
\r
1667 if(fTreeSRedirector) {
\r
1668 (*fTreeSRedirector)<<"dNdPtTree"<<
\r
1669 (*fTreeSRedirector)<<"dNdPtTree"<<
\r
1670 "esdTrack.="<<track<<
\r
1671 "extTPCInnerC.="<<tpcInnerC<<
\r
1672 "chi2TPCInnerC="<<chi2TPCInnerC;
\r
1679 //_____________________________________________________________________________
\r
1680 Bool_t AlidNdPtTrackDumpTask::ConstrainTPCInner(AliExternalTrackParam *const tpcInnerC, const AliESDVertex* vtx, Double_t b[3])
\r
1682 // Constrain TPC inner params constrained
\r
1684 if(!tpcInnerC) return kFALSE;
\r
1685 if(!vtx) return kFALSE;
\r
1687 Double_t dz[2],cov[3];
\r
1688 //AliESDVertex *vtx= (AliESDVertex *)esdEvent->GetPrimaryVertex();
\r
1689 //if(!tpcInnerC->PropagateToDCA(vtx, esdEvent->GetMagneticField(), 3, dz, cov)) return kFALSE;
\r
1690 //if(!tpcInnerC->PropagateToDCA(vtx, Bz, 3, dz, cov)) return kFALSE;
\r
1691 if(!tpcInnerC->PropagateToDCABxByBz(vtx, b, 3, dz, cov)) return kFALSE;
\r
1694 Double_t covar[6]; vtx->GetCovMatrix(covar);
\r
1695 Double_t p[2]={tpcInnerC->GetParameter()[0]-dz[0],tpcInnerC->GetParameter()[1]-dz[1]};
\r
1696 Double_t c[3]={covar[2],0.,covar[5]};
\r
1697 Double_t chi2C=tpcInnerC->GetPredictedChi2(p,c);
\r
1698 if (chi2C>kVeryBig) return kFALSE;
\r
1700 if(!tpcInnerC->Update(p,c)) return kFALSE;
\r
1706 //_____________________________________________________________________________
\r
1708 AliExternalTrackParam * AlidNdPtTrackDumpTask::CalculateChi2(AliESDtrack *const track, AliExternalTrackParam *const trackParam)
\r
1711 // calculate chi2 between vi and vj vectors
\r
1712 // with covi and covj covariance matrices
\r
1713 // chi2ij = (vi-vj)^(T)*(covi+covj)^(-1)*(vi-vj)
\r
1716 if(!track) return 0;
\r
1717 if(!trackParam) return 0;
\r
1719 TMatrixD deltaT(5,1);
\r
1720 TMatrixD delta(1,5);
\r
1721 TMatrixD covarM(5,5);
\r
1723 for (Int_t ipar=0; ipar<5; ipar++) {
\r
1724 deltaT(ipar,0)=trackParam->GetParameter()[ipar]-track->GetParameter()[ipar];
\r
1725 delta(0,ipar)=trackParam->GetParameter()[ipar]-track->GetParameter()[ipar];
\r
1726 for (Int_t jpar=0; jpar<5; jpar++) {
\r
1727 Int_t index=track->GetIndex(ipar,jpar);
\r
1728 covarM(ipar,jpar)=track->GetCovariance()[index]+trackParam->GetCovariance()[index];
\r
1733 TMatrixD covarMInv = covarM.Invert();
\r
1734 TMatrixD mat2 = covarMInv*deltaT;
\r
1735 TMatrixD chi2 = delta*mat2;
\r
1738 return ((Double_t)chi(0,0));
\r
1742 //_____________________________________________________________________________
\r
1744 AliExternalTrackParam * AlidNdPtTrackDumpTask::CalculateChi2(AliExternalTrackParam *const trackParam1, AliExternalTrackParam *const trackParam2)
\r
1747 // calculate chi2 between vi and vj vectors
\r
1748 // with covi and covj covariance matrices
\r
1749 // chi2ij = (vi-vj)^(T)*(covi+covj)^(-1)*(vi-vj)
\r
1752 if(!track) return 0;
\r
1753 if(!trackParam) return 0;
\r
1755 TMatrixD deltaT(5,1);
\r
1756 TMatrixD delta(1,5);
\r
1757 TMatrixD covarM(5,5);
\r
1759 for (Int_t ipar=0; ipar<5; ipar++) {
\r
1760 deltaT(ipar,0)=trackParam1->GetParameter()[ipar]-trackParam2->GetParameter()[ipar];
\r
1761 delta(0,ipar)=trackParam1->GetParameter()[ipar]-trackParam2->GetParameter()[ipar];
\r
1762 for (Int_t jpar=0; jpar<5; jpar++) {
\r
1763 Int_t index=track->GetIndex(ipar,jpar);
\r
1764 covarM(ipar,jpar)=trackParam1->GetCovariance()[index]+trackParam2->GetCovariance()[index];
\r
1769 TMatrixD covarMInv = covarM.Invert();
\r
1770 TMatrixD mat2 = covarMInv*deltaT;
\r
1771 TMatrixD chi2 = delta*mat2;
\r
1774 return ((Double_t)chi(0,0));
\r
1779 //_____________________________________________________________________________
\r
1781 AliExternalTrackParam * AlidNdPtTrackDumpTask::MakeTrackInnerC(AliESDtrack *const track, const AliESDVertex* vtx, Double_t b[3])
\r
1784 // Constrain TPC refitted tracks at inner TPC wall (InnerParams)
\r
1787 if(!track) return NULL;
\r
1788 if(!vtx) return NULL;
\r
1790 // clone track InnerParams has to be deleted
\r
1791 AliExternalTrackParam * trackInnerC = new AliExternalTrackParam(*(track->GetInnerParam()));
\r
1792 if (!trackInnerC) return NULL;
\r
1793 Bool_t isOK = ConstrainTrackInner(trackInnerC,vtx,track->GetMass(),b);
\r
1794 isOK = trackInnerC->Rotate(track->GetAlpha());
\r
1795 isOK = trackInnerC->PropagateTo(track->GetX(),b[2]);
\r
1797 if(trackInnerC) delete trackInnerC;
\r
1803 if(fTreeSRedirector)
\r
1805 (*fTreeSRedirector)<<"dNdPtTree"<<
\r
1806 "extInnerParamC.="<<trackInnerC<<
\r
1807 "chi2InnerC="<<chi2InnerC<<
\r
1811 return trackInnerC;
\r
1815 //_____________________________________________________________________________
\r
1816 Bool_t AlidNdPtTrackDumpTask::ConstrainTrackInner(AliExternalTrackParam *const trackInnerC, const AliESDVertex* vtx, Double_t mass, Double_t b[3])
\r
1818 // Constrain TPC inner params constrained
\r
1820 if(!trackInnerC) return kFALSE;
\r
1821 if(!vtx) return kFALSE;
\r
1823 const Double_t kRadius = 2.8;
\r
1824 const Double_t kMaxStep = 1.0;
\r
1826 Double_t dz[2],cov[3];
\r
1828 //AliESDVertex *vtx= (AliESDVertex *)esdEvent->GetPrimaryVertex();
\r
1829 //if(!trackInnerC->PropagateToDCA(vtx, esdEvent->GetMagneticField(), 3, dz, cov)) return kFALSE;
\r
1830 //if(!trackInnerC->PropagateToDCA(vtx, Bz, 3, dz, cov)) return kFALSE;
\r
1832 if(!AliTracker::PropagateTrackToBxByBz(trackInnerC,kRadius,mass,kMaxStep,kFALSE)) return kFALSE;
\r
1833 if(!trackInnerC->PropagateToDCABxByBz(vtx, b, 3, dz, cov)) return kFALSE;
\r
1836 Double_t covar[6]; vtx->GetCovMatrix(covar);
\r
1837 Double_t p[2]={trackInnerC->GetParameter()[0]-dz[0],trackInnerC->GetParameter()[1]-dz[1]};
\r
1838 Double_t c[3]={covar[2],0.,covar[5]};
\r
1839 Double_t chi2C=trackInnerC->GetPredictedChi2(p,c);
\r
1840 if (chi2C>kVeryBig) return kFALSE;
\r
1842 if(!trackInnerC->Update(p,c)) return kFALSE;
\r
1847 //_____________________________________________________________________________
\r
1849 AliExternalTrackParam * AlidNdPtTrackDumpTask::PropagateInnerParam(AliESDtrack *const track, Double_t radius, Double_t step)
\r
1852 // Propagate InnerParams to inner wall
\r
1854 if(!track) return NULL;
\r
1856 Bool_t isOK = kFALSE;
\r
1858 // clone track InnerParams has to be deleted
\r
1859 AliExternalTrackParam *trackInnerC2 = new AliExternalTrackParam(*(track->GetInnerParam()));
\r
1860 if (!trackInnerC2) return NULL;
\r
1861 isOK = AliTracker::PropagateTrackToBxByBz(trackInnerC2,radius,track->GetMass(),step,kFALSE);
\r
1863 delete trackInnerC2;
\r
1867 return trackInnerC2;
\r
1872 //_____________________________________________________________________________
\r
1874 AliExternalTrackParam * AlidNdPtTrackDumpTask::PropagateITSOut(Int_t iTrack, AliExternalTrackParam * trackParam, AliESDfriend *const esdFriend, Double_t b[3], Double_t radius, Double_t step)
\r
1877 // Propagate ITSout to TPC inner wall
\r
1880 if(!track) return NULL;
\r
1881 if(!esdFriend) return NULL;
\r
1883 Bool_t isOK = kFALSE;
\r
1884 AliExternalTrackParam *outerITSc = 0;
\r
1886 if(esdFriend && esdFriend->TestSkipBit()==kFALSE)
\r
1888 // propagate ITSout to TPC inner wall
\r
1889 AliESDfriendTrack *friendTrack = esdFriend->GetTrack(iTrack);
\r
1892 if( (outerITSc = new AliExternalTrackParam(*friendTrack->GetITSOut())) )
\r
1894 if(AliTracker::PropagateTrackToBxByBz(outerITSc,radius,track->GetMass(),step,kFALSE))
\r
1896 // transform ITSout to the track InnerParams reference frame
\r
1897 isOK = outerITSc->Rotate(trackInnerC2->GetAlpha());
\r
1898 isOK = outerITSc->PropagateTo(trackInnerC2->GetX(),b[2]);
\r
1900 if(trackInnerC2) delete trackInnerC2;
\r
1901 if(outerITSc) delete outerITSc;
\r
1906 // calculate chi2 between outerITS and innerParams
\r
1907 // cov without z-coordinate at the moment
\r
1909 TMatrixD deltaTouterITS(4,1);
\r
1910 TMatrixD deltaouterITS(1,4);
\r
1911 TMatrixD covarMouterITS(4,4);
\r
1915 for (Int_t ipar=0; ipar<5; ipar++) {
\r
1917 deltaTouterITS(kipar,0)=outerITSc->GetParameter()[ipar]-trackInnerC2->GetParameter()[ipar];
\r
1918 deltaouterITS(0,kipar)=outerITSc->GetParameter()[ipar]-trackInnerC2->GetParameter()[ipar];
\r
1922 for (Int_t jpar=0; jpar<5; jpar++) {
\r
1923 Int_t index=outerITSc->GetIndex(ipar,jpar);
\r
1924 if(ipar !=1 || jpar!=1) {
\r
1925 covarMouterITS(kipar,kjpar)=outerITSc->GetCovariance()[index]+trackInnerC2->GetCovariance()[index];
\r
1927 if(jpar!=1) kjpar++;
\r
1929 if(ipar!=1) kipar++;
\r
1932 // chi2 distance ITSout and InnerParams
\r
1933 TMatrixD covarMInvouterITS = covarMouterITS.Invert();
\r
1934 TMatrixD mat2outerITS = covarMInvouterITS*deltaTouterITS;
\r
1935 TMatrixD chi2OuterITS = deltaouterITS*mat2outerITS;
\r
1936 //chi2OuterITS.Print();
\r
1937 chi2ITSout = chi2OuterITS(0,0);
\r
1939 // dump to the tree
\r
1940 if(fTreeSRedirector)
\r
1942 (*fTreeSRedirector)<<"dNdPtTree"<<
\r
1943 "extInnerParam.="<<trackInnerC2<<
\r
1944 "extOuterITS.="<<outerITSc<<
\r
1945 "chi2OuterITS="<<chi2ITSout;
\r
1952 if(trackInnerC2) delete trackInnerC2;
\r
1953 if(outerITSc) delete outerITSc;
\r
1959 //_____________________________________________________________________________
\r
1961 Bool_t AlidNdPtTrackDumpTask::UseMCInfoAndDump(AliMCEvent *const mcEvent, AliESDtrack *const track, AliStack *const stack)
\r
1966 if(!mcEvent) return kFALSE;
\r
1967 if(!track) return kFALSE;
\r
1968 if(!stack) return kFALSE;
\r
1971 const Double_t kStep=3;
\r
1974 TParticle *particle=NULL, *particleTPC=NULL, *particleITS=NULL;
\r
1975 TParticle *particleMother=NULL, *particleMotherTPC=NULL, *particleMotherITS=NULL;
\r
1976 static Int_t mech=-1, mechTPC=-1, mechITS=-1;
\r
1977 static Bool_t isPrim=kFALSE, isPrimTPC=kFALSE, isPrimITS=kFALSE;
\r
1978 static Bool_t isFromStrangess=kFALSE, isFromStrangessTPC=kFALSE, isFromStrangessITS=kFALSE;
\r
1979 static Bool_t isFromConversion=kFALSE, isFromConversionTPC=kFALSE, isFromConversionITS=kFALSE;
\r
1980 static Bool_t isFromMaterial=kFALSE, isFromMaterialTPC=kFALSE, isFromMaterialITS=kFALSE;
\r
1982 AliTrackReference *refTPCIn = NULL;
\r
1983 AliTrackReference *refITS = NULL;
\r
1985 AliExternalTrackParam *trackInnerC3 = new AliExternalTrackParam(*(track->GetInnerParam()));
\r
1986 if (!trackInnerC3) return kFALSE;
\r
1991 Int_t label = TMath::Abs(track->GetLabel());
\r
1992 particle = stack->Particle(label);
\r
1993 if(particle && particle->GetPDG() && particle->GetPDG()->Charge()!=0.)
\r
1995 particleMother = GetMother(particle,stack);
\r
1996 mech = particle->GetUniqueID();
\r
1997 isPrim = stack->IsPhysicalPrimary(label);
\r
1998 isFromStrangess = IsFromStrangeness(label,stack);
\r
1999 isFromConversion = IsFromConversion(label,stack);
\r
2000 isFromMaterial = IsFromMaterial(label,stack);
\r
2006 Int_t labelTPC = TMath::Abs(track->GetTPCLabel());
\r
2007 particleTPC = stack->Particle(labelTPC);
\r
2008 if(particleTPC && particleTPC->GetPDG() && particleTPC->GetPDG()->Charge()!=0.)
\r
2010 particleMotherTPC = GetMother(particleTPC,stack);
\r
2011 mechTPC = particleTPC->GetUniqueID();
\r
2012 isPrimTPC = stack->IsPhysicalPrimary(labelTPC);
\r
2013 isFromStrangessTPC = IsFromStrangeness(labelTPC,stack);
\r
2014 isFromConversionTPC = IsFromConversion(labelTPC,stack);
\r
2015 isFromMaterialTPC = IsFromMaterial(labelTPC,stack);
\r
2019 // store first track reference
\r
2022 TParticle *part=0;
\r
2023 TClonesArray *trefs=0;
\r
2024 Int_t status = mcEvent->GetParticleAndTR(track->GetTPCLabel(), part, trefs);
\r
2026 if(status>0 && part && trefs && part->GetPDG() && part->GetPDG()->Charge()!=0.)
\r
2028 Int_t nTrackRef = trefs->GetEntries();
\r
2029 //printf("nTrackRef %d \n",nTrackRef);
\r
2031 Int_t countITS = 0;
\r
2032 for (Int_t iref = 0; iref < nTrackRef; iref++)
\r
2034 AliTrackReference *ref = (AliTrackReference *)trefs->At(iref);
\r
2035 //printf("ref %p \n",ref);
\r
2036 //if(ref) printf("ref->DetectorId() %d \n",ref->DetectorId());
\r
2037 //printf("AliTrackReference::kTPC %d \n",AliTrackReference::kTPC);
\r
2039 // Ref. in the middle ITS
\r
2040 if(ref && ref->DetectorId()==AliTrackReference::kITS)
\r
2042 if(!refITS && countITS==2) {
\r
2044 //printf("refITS %p \n",refITS);
\r
2050 if(ref && ref->DetectorId()==AliTrackReference::kTPC)
\r
2054 //printf("refTPCIn %p \n",refTPCIn);
\r
2060 // transform inner params to TrackRef
\r
2061 // reference frame
\r
2062 if(refTPCIn && trackInnerC3) {
\r
2063 Double_t fRefPhi = TMath::ATan2(refTPCIn->Y(),refTPCIn->X());
\r
2064 Bool_t isOK = kFALSE;
\r
2065 isOK = trackInnerC3->Rotate(fRefPhi);
\r
2066 isOK = AliTracker::PropagateTrackToBxByBz(trackInnerC3,refTPCIn->R(),track->GetMass(),kStep,kFALSE);
\r
2068 delete trackInnerC3;
\r
2077 Int_t labelITS = TMath::Abs(track->GetITSLabel());
\r
2078 particleITS = stack->Particle(labelITS);
\r
2079 if(particleITS && particleITS->GetPDG() && particleITS->GetPDG()->Charge()!=0.)
\r
2081 particleMotherITS = GetMother(particleITS,stack);
\r
2082 mechITS = particleITS->GetUniqueID();
\r
2083 isPrimITS = stack->IsPhysicalPrimary(labelITS);
\r
2084 isFromStrangessITS = IsFromStrangeness(labelITS,stack);
\r
2085 isFromConversionITS = IsFromConversion(labelITS,stack);
\r
2086 isFromMaterialITS = IsFromMaterial(labelITS,stack);
\r
2090 if(fTreeSRedirector)
\r
2092 (*fTreeSRedirector)<<"dNdPtTree"<<
\r
2093 "extInnerParamRef.="<<trackInnerC3<<
\r
2094 "refTPCIn.="<<refTPCIn<<
\r
2095 "refITS.="<<refITS<<
\r
2096 "particle.="<<particle<<
\r
2097 "particleMother.="<<particleMother<<
\r
2099 "isPrim="<<isPrim<<
\r
2100 "isFromStrangess="<<isFromStrangess<<
\r
2101 "isFromConversion="<<isFromConversion<<
\r
2102 "isFromMaterial="<<isFromMaterial<<
\r
2103 "particleTPC.="<<particleTPC<<
\r
2104 "particleMotherTPC.="<<particleMotherTPC<<
\r
2105 "mechTPC="<<mechTPC<<
\r
2106 "isPrimTPC="<<isPrimTPC<<
\r
2107 "isFromStrangessTPC="<<isFromStrangessTPC<<
\r
2108 "isFromConversionTPC="<<isFromConversionTPC<<
\r
2109 "isFromMaterialTPC="<<isFromMaterialTPC<<
\r
2110 "particleITS.="<<particleITS<<
\r
2111 "particleMotherITS.="<<particleMotherITS<<
\r
2112 "mechITS="<<mechITS<<
\r
2113 "isPrimITS="<<isPrimITS<<
\r
2114 "isFromStrangessITS="<<isFromStrangessITS<<
\r
2115 "isFromConversionITS="<<isFromConversionITS<<
\r
2116 "isFromMaterialITS="<<isFromMaterialITS<<
\r
2120 if(trackInnerC3) delete trackInnerC3;
\r
2126 //_____________________________________________________________________________
\r
2128 Bool_t AlidNdPtTrackDumpTask::DumpEventInfo()
\r
2131 // Dump run and event information to tree
\r
2133 if(fTreeSRedirector)
\r
2135 (*fTreeSRedirector)<<"dNdPtTree"<<
\r
2143 //_____________________________________________________________________________
\r
2144 TParticle *AlidNdPtTrackDumpTask::GetMother(TParticle *const particle, AliStack *const stack)
\r
2146 if(!particle) return NULL;
\r
2147 if(!stack) return NULL;
\r
2149 Int_t motherLabel = TMath::Abs(particle->GetMother(0));
\r
2150 TParticle* mother = NULL;
\r
2151 mother = stack->Particle(motherLabel);
\r
2156 //_____________________________________________________________________________
\r
2157 Bool_t AlidNdPtTrackDumpTask::IsFromConversion(const Int_t label, AliStack *const stack)
\r
2159 Bool_t isFromConversion = kFALSE;
\r
2162 TParticle* particle = stack->Particle(label);
\r
2164 if(particle && particle->GetPDG() && particle->GetPDG()->Charge()!=0)
\r
2166 Int_t mech = particle->GetUniqueID(); // production mechanism
\r
2167 Bool_t isPrim = stack->IsPhysicalPrimary(label);
\r
2169 Int_t motherLabel = TMath::Abs(particle->GetMother(0));
\r
2170 TParticle* mother = stack->Particle(motherLabel);
\r
2172 Int_t motherPdg = mother->GetPdgCode();
\r
2174 if(!isPrim && mech==5 && motherPdg==kGamma) {
\r
2175 isFromConversion=kTRUE;
\r
2181 return isFromConversion;
\r
2184 //_____________________________________________________________________________
\r
2185 Bool_t AlidNdPtTrackDumpTask::IsFromMaterial(const Int_t label, AliStack *const stack)
\r
2187 Bool_t isFromMaterial = kFALSE;
\r
2190 TParticle* particle = stack->Particle(label);
\r
2192 if(particle && particle->GetPDG() && particle->GetPDG()->Charge()!=0)
\r
2194 Int_t mech = particle->GetUniqueID(); // production mechanism
\r
2195 Bool_t isPrim = stack->IsPhysicalPrimary(label);
\r
2197 Int_t motherLabel = TMath::Abs(particle->GetMother(0));
\r
2198 TParticle* mother = stack->Particle(motherLabel);
\r
2200 if(!isPrim && mech==13) {
\r
2201 isFromMaterial=kTRUE;
\r
2207 return isFromMaterial;
\r
2210 //_____________________________________________________________________________
\r
2211 Bool_t AlidNdPtTrackDumpTask::IsFromStrangeness(const Int_t label, AliStack *const stack)
\r
2213 Bool_t isFromStrangeness = kFALSE;
\r
2216 TParticle* particle = stack->Particle(label);
\r
2218 if(particle && particle->GetPDG() && particle->GetPDG()->Charge()!=0)
\r
2220 Int_t mech = particle->GetUniqueID(); // production mechanism
\r
2221 Bool_t isPrim = stack->IsPhysicalPrimary(label);
\r
2223 Int_t motherLabel = TMath::Abs(particle->GetMother(0));
\r
2224 TParticle* mother = stack->Particle(motherLabel);
\r
2226 Int_t motherPdg = mother->GetPdgCode();
\r
2228 // K+-, lambda, antilambda, K0s decays
\r
2229 if(!isPrim && mech==4 &&
\r
2230 (TMath::Abs(motherPdg)==kKPlus || TMath::Abs(motherPdg)==kLambda0 || motherPdg==kK0Short))
\r
2232 isFromStrangeness = kTRUE;
\r
2238 return isFromStrangeness;
\r
2242 //_____________________________________________________________________________
\r
2243 void AlidNdPtTrackDumpTask::FinishTaskOutput()
\r
2246 // Called one at the end
\r
2247 // locally on working node
\r
2250 // must be deleted to store trees
\r
2251 if(fTreeSRedirector) delete fTreeSRedirector; fTreeSRedirector=0;
\r
2253 // open temporary file and copy trees to the ouptut container
\r
2255 TChain* chain = 0;
\r
2262 chain = new TChain("dNdPtTree");
\r
2264 chain->Add("jotwinow_Temp_Trees.root");
\r
2265 tree1 = chain->CopyTree("1");
\r
2266 delete chain; chain=0;
\r
2268 if(tree1) tree1->Print();
\r
2271 chain = new TChain("V0s");
\r
2273 chain->Add("jotwinow_Temp_Trees.root");
\r
2274 tree2 = chain->CopyTree("1");
\r
2275 delete chain; chain=0;
\r
2277 if(tree2) tree2->Print();
\r
2280 chain = new TChain("dEdx");
\r
2282 chain->Add("jotwinow_Temp_Trees.root");
\r
2283 tree3 = chain->CopyTree("1");
\r
2284 delete chain; chain=0;
\r
2286 if(tree3) tree3->Print();
\r
2289 chain = new TChain("Laser");
\r
2291 chain->Add("jotwinow_Temp_Trees.root");
\r
2292 tree4 = chain->CopyTree("1");
\r
2293 delete chain; chain=0;
\r
2295 if(tree4) tree4->Print();
\r
2298 chain = new TChain("MCEffTree");
\r
2300 chain->Add("jotwinow_Temp_Trees.root");
\r
2301 tree5 = chain->CopyTree("1");
\r
2302 delete chain; chain=0;
\r
2304 if(tree5) tree5->Print();
\r
2309 if(tree1) fOutput->Add(tree1);
\r
2310 if(tree2) fOutput->Add(tree2);
\r
2311 if(tree3) fOutput->Add(tree3);
\r
2312 if(tree4) fOutput->Add(tree4);
\r
2313 if(tree5) fOutput->Add(tree5);
\r
2315 // Post output data.
\r
2316 PostData(1, fOutput);
\r
2319 //_____________________________________________________________________________
\r
2320 void AlidNdPtTrackDumpTask::Terminate(Option_t *)
\r
2322 // Called one at the end
\r
2324 fOutputSummary = dynamic_cast<TTree*> (GetOutputData(1));
\r
2325 if(fOutputSummary) delete fOutputSummary; fOutputSummary=0;
\r
2326 TChain* chain = new TChain("dNdPtTree");
\r
2327 if(!chain) return;
\r
2328 chain->Add("jotwinow_HighPt_TrackAndV0_Trees.root");
\r
2329 TTree *tree = chain->CopyTree("1");
\r
2330 if (chain) { delete chain; chain=0; }
\r
2333 fOutputSummary = tree;
\r
2335 if (!fOutputSummary) {
\r
2336 Printf("ERROR: AlidNdPtTrackDumpTask::Terminate(): Output data not avaiable %p \n", GetOutputData(1));
\r
2341 PostData(1, fOutput);
\r