1 /**************************************************************************
2 * Copyright(c) 1998-2009, ALICE Experiment at CERN, All rights reserved. *
4 * Author: The ALICE Off-line Project. *
5 * Contributors are mentioned in the code where appropriate. *
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 **************************************************************************/
16 /////////////////////////////////////////////////////////////
18 // AliAnalysisTask to study the TPC-ITS track matching
20 // Author: A.Dainese, andrea.dainese@pd.infn.it
21 /////////////////////////////////////////////////////////////
30 #include <TGeoManager.h>
33 #include "AliGeomManager.h"
34 #include "AliTrackPointArray.h"
35 #include "AliESDInputHandler.h"
36 #include "AliESDVertex.h"
37 #include "AliESDtrack.h"
38 #include "AliESDEvent.h"
39 #include "AliESDfriend.h"
40 #include "AliAnalysisTask.h"
41 #include "AliAnalysisManager.h"
42 #include "AliExternalTrackParam.h"
43 #include "AliTrackMatchingTPCITSCosmics.h"
46 ClassImp(AliTrackMatchingTPCITSCosmics)
49 //________________________________________________________________________
50 AliTrackMatchingTPCITSCosmics::AliTrackMatchingTPCITSCosmics(const char *name):
51 AliAnalysisTask(name,"task"),
54 fGeometryFileName("geometry.root"),
64 // Define input and output slots here
65 // Input slot #0 works with a TChain
66 DefineInput(0, TChain::Class());
67 // Output slot #0 writes into a TList
68 DefineOutput(0,TList::Class()); //My private output
71 //________________________________________________________________________
72 AliTrackMatchingTPCITSCosmics::~AliTrackMatchingTPCITSCosmics()
97 //________________________________________________________________________
98 void AliTrackMatchingTPCITSCosmics::ConnectInputData(Option_t *)
103 TTree* tree = dynamic_cast<TTree*> (GetInputData(0));
105 printf("ERROR: Could not read chain from input slot 0\n");
107 AliESDInputHandler *esdH = dynamic_cast<AliESDInputHandler*> (AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler());
110 printf("ERROR: Could not get ESDInputHandler\n");
112 fESD = esdH->GetEvent();
119 //________________________________________________________________________
120 void AliTrackMatchingTPCITSCosmics::Init()
127 //________________________________________________________________________
128 void AliTrackMatchingTPCITSCosmics::CreateOutputObjects()
130 // Create the output container
135 AliGeomManager::LoadGeometry(fGeometryFileName.Data());
137 printf("AliTrackMatchingTPCITSCosmics::CreateOutputObjects(): no geometry loaded \n");
142 // Several histograms are more conveniently managed in a TList
146 fHistEvCount = new TH1F("fHistEvCount","0: all, 1: SPDFO, 2: vtx, 3: TPCtrks, 4: ITStrks, 5: HLT, 6: HLT&TPCtrks, 7: HLT&ITStrks",11,-0.5,10.5);
147 fList->Add(fHistEvCount);
149 fntTrks = new TNtuple("fntTrks","TPC-ITS matching","ptTPC:nClsTPC:nClsITSSA:nClsITSMI:SSD1:SSD2:phi:z:dx:dy:dz:drphi:dphi:dtgl");
151 fntPairs = new TNtuple("fntPairs","pairs at vertex","nClsITSSAin:nClsITSSAout:nClsITSMIin:nClsITSMIout:dxyITSSA:dzITSSA:dxyITSMI:dzITSMI:ptITSSAin:ptITSSAout:ptITSMIin:ptITSMIout:sigmad0MIin:sigmad0MIout");
152 fList->Add(fntPairs);
153 fntITSPairs = new TNtuple("fntITSPairs","pairs at vertex","nClsITSSAin:nClsITSSAout:dxyITSSA:dzITSSA:ptITSSAin:ptITSSAout:d0mu");
154 fList->Add(fntITSPairs);
159 //________________________________________________________________________
160 void AliTrackMatchingTPCITSCosmics::Exec(Option_t */*option*/)
162 // Execute analysis for current event:
163 // write ITS AliTrackPoints for selected tracks to fspTree
165 // check the geometry
167 printf("AliTrackMatchingTPCITSCosmics::Exec(): no geometry loaded \n");
172 printf("AliTrackMatchingTPCITSCosmics::Exec(): no ESD \n");
177 fHistEvCount->Fill(0);
180 // check if event is triggered by HLT
181 Bool_t hltTrigg=kFALSE;
183 AliESDInputHandler *esdH = dynamic_cast<AliESDInputHandler*> (AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler());
185 printf("AliTrackMatchingTPCITSCosmics::Exec(): no ESD \n");
188 AliESDEvent *hltESD = esdH->GetHLTEvent();
190 printf("AliTrackMatchingTPCITSCosmics::Exec(): no HLT ESD \n");
193 if(hltESD->IsHLTTriggerFired()) {fHistEvCount->Fill(5);hltTrigg=kTRUE;}
197 TString triggeredClass = fESD->GetFiredTriggerClasses();
198 if(triggeredClass.Contains("C0SCO-ABCE-NOPF-CENT")) {
199 fHistEvCount->Fill(1);
201 if(fOnlySPDFO) { PostData(0,fList); return; }
204 Int_t ntracks = fESD->GetNumberOfTracks();
205 printf("CONTR: %d\n",fESD->GetVertex()->GetNContributors());
206 if(fESD->GetVertex()->GetNContributors()>=0) {
207 fHistEvCount->Fill(2);
210 Int_t nTrksITSSA=0,nTrksTPC=0,nTrksTPCITS=0;
211 Int_t idxITSSA[10000],idxTPC[10000];
212 Int_t idxITSSAin=-1,idxITSSAout=-1;
213 Int_t idxTPCin=-1,idxTPCout=-1;
214 for(Int_t itr=0; itr<ntracks; itr++) {
215 AliESDtrack *t = fESD->GetTrack(itr);
216 Int_t nClsTPC = t->GetNcls(1);
217 Int_t nClsITS = t->GetNcls(0);
218 if(nClsITS>=2 && nClsTPC==0) { // ITS SA
219 idxITSSA[nTrksITSSA]=itr;
221 //printf("%d\n",itr);
223 if(nClsTPC>=50) { // TPC
224 idxTPC[nTrksTPC]=itr;
227 if(nClsTPC>=50 && nClsITS>=2) {// TPC+ITS
229 /*printf(" --> TPC+ITS: %d + %d (%d,%d,%d,%d,%d,%d) pt = %f\n",nClsTPC,nClsITS,
230 (Int_t)(t->HasPointOnITSLayer(0)),
231 (Int_t)(t->HasPointOnITSLayer(1)),
232 (Int_t)(t->HasPointOnITSLayer(2)),
233 (Int_t)(t->HasPointOnITSLayer(3)),
234 (Int_t)(t->HasPointOnITSLayer(4)),
235 (Int_t)(t->HasPointOnITSLayer(5)),
240 //printf("nTrksTPC %d nTrksITSSA %d\n",nTrksTPC,nTrksITSSA);
241 if(nTrksITSSA>0) fHistEvCount->Fill(4);
242 if(hltTrigg && nTrksITSSA>0) fHistEvCount->Fill(7);
243 if(nTrksTPC>0) fHistEvCount->Fill(3);
244 if(hltTrigg && nTrksTPC>0) fHistEvCount->Fill(6);
245 if(nTrksTPCITS>0) fHistEvCount->Fill(8);
246 if(hltTrigg && nTrksTPCITS>0) fHistEvCount->Fill(9);
248 if(nTrksTPC>2 || nTrksTPC==0 || nTrksITSSA>2 || nTrksITSSA==0) { PostData(0,fList); return; }
250 for(Int_t itr=0; itr<nTrksTPC; itr++) {
251 AliESDtrack *t = fESD->GetTrack(idxTPC[itr]);
252 if(t->Py()>0) idxTPCin=idxTPC[itr];
253 if(t->Py()<0) idxTPCout=idxTPC[itr];
257 for(Int_t itr=0; itr<nTrksITSSA; itr++) {
258 AliESDtrack *t = fESD->GetTrack(idxITSSA[itr]);
259 if(t->Py()>0) idxITSSAin=idxITSSA[itr];
260 if(t->Py()<0) idxITSSAout=idxITSSA[itr];
263 Double_t xyzITS[3],xyzTPC[3];
265 // analysis for inward track
266 if(idxITSSAin>-1 && idxTPCin>-1) {
267 //printf(" %d\n",idxITSSAin);
268 AliESDtrack *tITS = fESD->GetTrack(idxITSSAin);
269 const AliExternalTrackParam *outerITS = tITS->GetOuterParam();
270 xyzITS[0]=-1000.;xyzITS[1]=-1000.;xyzITS[2]=-1000.;
271 if(outerITS) outerITS->GetXYZAt(50.,fESD->GetMagneticField(),xyzITS);
272 AliESDtrack *tTPC = fESD->GetTrack(idxTPCin);
273 AliExternalTrackParam *innerTPC = new AliExternalTrackParam(*(tTPC->GetInnerParam()));
274 innerTPC->Rotate(tITS->GetAlpha());
275 innerTPC->GetXYZAt(50.,fESD->GetMagneticField(),xyzTPC);
276 fntTrks->Fill(innerTPC->Pt(),
280 tITS->HasPointOnITSLayer(4),
281 tITS->HasPointOnITSLayer(5),
282 TMath::ATan2(xyzITS[1],xyzITS[0]),
287 0.5*(TMath::Sqrt(xyzITS[0]*xyzITS[0]+xyzITS[1]*xyzITS[1])+TMath::Sqrt(xyzTPC[0]*xyzTPC[0]+xyzTPC[1]*xyzTPC[1]))*(TMath::ATan2(xyzITS[1],xyzITS[0])-TMath::ATan2(xyzTPC[1],xyzTPC[0])),
288 TMath::ATan2(tITS->Py(),tITS->Px())-TMath::ATan2(innerTPC->Py(),innerTPC->Px()),
289 tITS->Pz()/tITS->Pt()-innerTPC->Pz()/innerTPC->Pt());
290 delete innerTPC; innerTPC=NULL;
293 // analysis for outward track
294 if(idxITSSAout>-1 && idxTPCout>-1) {
295 //printf(" %d\n",idxITSSAout);
296 AliESDtrack *tITS = fESD->GetTrack(idxITSSAout);
297 const AliExternalTrackParam *outerITS = tITS->GetOuterParam();
298 xyzITS[0]=-1000.;xyzITS[1]=-1000.;xyzITS[2]=-1000.;
299 if(outerITS) outerITS->GetXYZAt(50.,fESD->GetMagneticField(),xyzITS);
300 AliESDtrack *tTPC = fESD->GetTrack(idxTPCout);
301 AliExternalTrackParam *innerTPC = new AliExternalTrackParam(*(tTPC->GetInnerParam()));
302 innerTPC->Rotate(tITS->GetAlpha());
303 innerTPC->GetXYZAt(50.,fESD->GetMagneticField(),xyzTPC);
304 fntTrks->Fill(innerTPC->Pt(),
308 tITS->HasPointOnITSLayer(4),
309 tITS->HasPointOnITSLayer(5),
310 TMath::ATan2(xyzITS[1],xyzITS[0]),
315 0.5*(TMath::Sqrt(xyzITS[0]*xyzITS[0]+xyzITS[1]*xyzITS[1])+TMath::Sqrt(xyzTPC[0]*xyzTPC[0]+xyzTPC[1]*xyzTPC[1]))*(TMath::ATan2(xyzITS[1],xyzITS[0])-TMath::ATan2(xyzTPC[1],xyzTPC[0])),
316 TMath::ATan2(tITS->Py(),tITS->Px())-TMath::ATan2(innerTPC->Py(),innerTPC->Px()),
317 tITS->Pz()/tITS->Pt()-innerTPC->Pz()/innerTPC->Pt()
319 delete innerTPC; innerTPC=NULL;
322 // inward-outward track ITS only
323 if(idxITSSAin>-1 && idxITSSAout>-1) {
324 AliESDtrack *tITSin = fESD->GetTrack(idxITSSAin);
325 AliESDtrack *tITSout = fESD->GetTrack(idxITSSAout);
326 if(tITSin->HasPointOnITSLayer(0) &&
327 tITSin->HasPointOnITSLayer(1) &&
328 tITSout->HasPointOnITSLayer(0) &&
329 tITSout->HasPointOnITSLayer(1)) {
330 Double_t alpha = TMath::ATan2(tITSin->Py(),tITSin->Px());
331 tITSin->Propagate(alpha,0.,fESD->GetMagneticField());
332 tITSout->Propagate(alpha,0.,fESD->GetMagneticField());
334 d0[0] = tITSin->GetY();
335 z0[0] = tITSin->GetZ();
336 d0[1] = tITSout->GetY();
337 z0[1] = tITSout->GetZ();
338 Float_t dxyITS = -(d0[0]-d0[1]);
339 Float_t dzITS = z0[0]-z0[1];
340 fntITSPairs->Fill(tITSin->GetNcls(0),tITSout->GetNcls(0),dxyITS,dzITS,tITSin->Pt(),tITSout->Pt(),TMath::Abs(d0[0]));
344 // inward-outward track TPC+ITS
345 if(idxITSSAin>-1 && idxTPCin>-1 && idxITSSAout>-1 && idxTPCout>-1) {
346 AliESDtrack *tTPCin = fESD->GetTrack(idxTPCin);
347 AliESDtrack *tITSin = fESD->GetTrack(idxITSSAin);
348 AliESDtrack *tTPCout = fESD->GetTrack(idxTPCout);
349 AliESDtrack *tITSout = fESD->GetTrack(idxITSSAout);
350 if(tTPCin->HasPointOnITSLayer(0) &&
351 tTPCin->HasPointOnITSLayer(1) &&
352 tITSin->HasPointOnITSLayer(0) &&
353 tITSin->HasPointOnITSLayer(1) &&
354 tTPCout->HasPointOnITSLayer(0) &&
355 tTPCout->HasPointOnITSLayer(1) &&
356 tITSout->HasPointOnITSLayer(0) &&
357 tITSout->HasPointOnITSLayer(1)) {
358 Double_t alpha = TMath::ATan2(tTPCin->Py(),tTPCin->Px());
359 tTPCin->Propagate(alpha,0.,fESD->GetMagneticField());
360 tTPCout->Propagate(alpha,0.,fESD->GetMagneticField());
362 d0[0] = tTPCin->GetY();
363 z0[0] = tTPCin->GetZ();
364 d0[1] = tTPCout->GetY();
365 z0[1] = tTPCout->GetZ();
366 Float_t dxyTPC = -(d0[0]-d0[1]);
367 Float_t dzTPC = z0[0]-z0[1];
368 alpha = TMath::ATan2(tITSin->Py(),tITSin->Px());
369 tITSin->Propagate(alpha,0.,fESD->GetMagneticField());
370 tITSout->Propagate(alpha,0.,fESD->GetMagneticField());
371 d0[0] = tITSin->GetY();
372 z0[0] = tITSin->GetZ();
373 d0[1] = tITSout->GetY();
374 z0[1] = tITSout->GetZ();
375 Float_t dxyITS = -(d0[0]-d0[1]);
376 Float_t dzITS = z0[0]-z0[1];
377 fntPairs->Fill(tITSin->GetNcls(0),tITSout->GetNcls(0),tTPCin->GetNcls(0),tTPCout->GetNcls(0),dxyITS,dzITS,dxyTPC,dzTPC,tITSin->Pt(),tITSout->Pt(),tTPCin->Pt(),tTPCout->Pt(),tTPCin->GetSigmaY2(),tTPCout->GetSigmaY2());
386 //________________________________________________________________________
387 void AliTrackMatchingTPCITSCosmics::Terminate(Option_t */*option*/)
389 // Terminate analysis
391 AliDebug(2,"AliTrackMatchingTPCITSCosmics: Terminate() \n");
393 fList = dynamic_cast<TList*> (GetOutputData(0));
395 printf("ERROR: fList not available\n");