1 /**************************************************************************
2 * Copyright(c) 1998-1999, 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 ///////////////////////////////////////////////////////////////////////////
19 // Class to test TPC warm-up LASER EVENTS rejection. //
21 // Author: Alexander Kalweit (GSI) //
22 // Modified: Jacek Otwinowski (GSI) //
23 ///////////////////////////////////////////////////////////////////////////
25 #include "Riostream.h"
34 #include "TObjArray.h"
38 #include "AliAnalysisTaskSE.h"
39 #include "AliAnalysisManager.h"
41 #include "AliHeader.h"
42 #include "AliGenPythiaEventHeader.h"
43 #include "AliGenCocktailEventHeader.h"
44 #include "AliPhysicsSelection.h"
45 #include "AliTriggerAnalysis.h"
48 #include "AliESDtrackCuts.h"
49 #include "AliESDVertex.h"
50 #include "AliESDEvent.h"
51 #include "AliESDInputHandler.h"
52 #include "AliESDtrack.h"
53 #include "AliESDpid.h"
55 #include "AliMCEventHandler.h"
56 #include "AliMCEvent.h"
58 #include "AliRecoParam.h"
62 #include "AliAnalysisNoiseTPC.h"
65 ClassImp(AliAnalysisNoiseTPC)
67 //________________________________________________________________________
68 AliAnalysisNoiseTPC::AliAnalysisNoiseTPC()
69 : AliAnalysisTaskSE("TaskChargedHadron"), fESD(0), fListHist(0), fESDtrackCuts(0),
70 fHistNoiseTracks(0),fTimeBins(0),fTimeStart(0),fTimeEnd(0)
72 // default Constructor
76 //________________________________________________________________________
77 AliAnalysisNoiseTPC::AliAnalysisNoiseTPC(const char *name,UInt_t StartTime, UInt_t EndTime, Int_t deltaTime)
78 : AliAnalysisTaskSE(name), fESD(0), fListHist(0), fESDtrackCuts(0),
79 fHistNoiseTracks(0), fTimeBins(0), fTimeStart(StartTime), fTimeEnd(EndTime)
82 // standard constructur which should be used
84 Printf("*** CONSTRUCTOR CALLED ****");
87 fTimeBins = TMath::Nint((fTimeEnd-fTimeStart)/deltaTime);
88 printf("fTimeBins %d \n",fTimeBins);
90 printf("deltaTime is 0 \n");
93 // Output slot #0 writes into a TList container
94 DefineOutput(1, TList::Class());
101 //________________________________________________________________________
102 void AliAnalysisNoiseTPC::UserCreateOutputObjects()
107 fESDtrackCuts = new AliESDtrackCuts("AliESDtrackCuts","AliESDtrackCuts");
108 fESDtrackCuts->SetAcceptKinkDaughters(kFALSE);
109 fESDtrackCuts->SetMinNClustersTPC(80);
110 fESDtrackCuts->SetMaxChi2PerClusterTPC(2);
112 fESDtrackCuts->SetRequireTPCRefit(kTRUE);
113 fESDtrackCuts->SetRequireITSRefit(kFALSE);
114 fESDtrackCuts->SetEtaRange(-0.005,+0.005);
115 fESDtrackCuts->SetPtRange(10., 1e10);
118 fListHist = new TList();
119 fListHist->SetOwner(kTRUE);
122 UInt_t StartTime = 1272672000; // 1st of May
123 UInt_t EndTime = 1288569600; // 1st of Nov
124 Double_t deltaTime = EndTime - StartTime;
125 Int_t timeBins = TMath::Nint(deltaTime/(15.*60)); // every 15min
128 // event number in file, # noise tracks, isSelectMB, isSelectWarm, has vtx., time
129 Int_t binsHistNoise[6] = { 20000, 100, 2, 2, 2, fTimeBins};
130 Double_t xminHistNoise[6] = { -0.5, -0.5, -0.5, -0.5,-0.5, fTimeStart};
131 Double_t xmaxHistNoise[6] = {19999.5, 99.5, 1.5, 1.5, 1.5, fTimeEnd};
132 fHistNoiseTracks = new THnSparseS("fHistNoiseTracks","noise tracks: ev in file, # noise tracks, isSelectMB, isSelectWarm, has vtx,time",6,binsHistNoise,xminHistNoise,xmaxHistNoise);
134 fListHist->Add(fHistNoiseTracks);
137 PostData(1, fListHist);
140 //________________________________________________________________________
141 void AliAnalysisNoiseTPC::UserExec(Option_t *)
146 AliLog::SetGlobalLogLevel(AliLog::kError);
148 // Check Monte Carlo information and other access first:
150 fESD = dynamic_cast<AliESDEvent*>( InputEvent() );
152 //Printf("ERROR: fESD not available");
156 if (!fESDtrackCuts) {
157 Printf("ERROR: fESDtrackCuts not available");
162 // check if event is selected by physics selection class
164 AliPhysicsSelection *physicsSelection = NULL;
165 AliTriggerAnalysis* triggerAnalysis = NULL;
167 AliInputEventHandler* inputHandler = (AliInputEventHandler*) AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler();
170 Printf("ERROR: Could not receive input handler");
174 Bool_t isSelectedMB = kFALSE;
176 isSelectedMB = inputHandler->IsEventSelected() & AliVEvent::kMB;
178 // get physics selection
179 physicsSelection = static_cast<AliPhysicsSelection*> (inputHandler->GetEventSelection());
180 if(!physicsSelection) return;
182 // check Warm Up events
183 Bool_t isSelectedWarm = kFALSE;
184 triggerAnalysis = physicsSelection->GetTriggerAnalysis();
185 if(!triggerAnalysis) return;
186 isSelectedWarm = triggerAnalysis->IsOfflineTriggerFired(fESD, AliTriggerAnalysis::kTPCLaserWarmUp);
189 // monitor vertex position
191 const AliESDVertex *vertex = fESD->GetPrimaryVertexTracks();
192 if(vertex->GetNContributors()<1) {
194 vertex = fESD->GetPrimaryVertexSPD();
195 if(vertex->GetNContributors()<1) vertex = 0x0;
198 Int_t trackCounter = 0;
199 for (Int_t i=0; i<fESD->GetNumberOfTracks(); ++i)
201 AliESDtrack *track = fESD->GetTrack(i);
205 if (track->GetTPCNcls() < 30) continue;
206 //if (track->GetTPCchi2()/track->GetTPCNcls() > 0.3) continue;
207 if (TMath::Abs(track->Eta()) > 0.005) continue;
208 if (track->Pt() < 4) continue;
209 if (track->GetKinkIndex(0) > 0) continue;
211 UInt_t status = track->GetStatus();
212 if ((status&AliESDtrack::kITSrefit)==AliESDtrack::kITSrefit) continue; // explicitly ask for tracks without ITS refit
213 if ((status&AliESDtrack::kTPCrefit)!=AliESDtrack::kTPCrefit) continue;
215 if (track->GetTPCsignal() > 10) continue; // explicitly ask for tracks without dE/dx
217 //if (TMath::Abs(track->GetZ()) < 50) continue;
223 Float_t dca[2], cov[3];
224 // 1st track loop to determine multiplicities
225 for (Int_t i=0;i<fESD->GetNumberOfTracks();++i) {
226 AliESDtrack *track = fESD->GetTrack(i);
227 if (!track) continue;
228 if (fESDtrackCuts->AcceptTrack(track)) {
229 UInt_t status = track->GetStatus();
230 if ((status&AliESDtrack::kITSrefit)==1) continue; // explicitly ask for tracks without ITS refit
231 if (track->GetTPCsignal() > 30) continue; // explicitly ask for tracks without dE/dx
232 //if (track->GetTPCNcls() > 80) continue;
233 track->GetImpactParameters(dca, cov);
234 if (TMath::Abs(dca[0]) > 10) continue;
241 // run number, # noise tracks, isSelectedMB, isSelectedWarm, has vtx.
242 Bool_t hasVtx = vertex;
243 if (trackCounter > 98) trackCounter = 98;
244 //Double_t vecNoise[7] = {fESD->GetRunNumber(),fESD->GetEventNumberInFile(), trackCounter, isSelectedMB, isSelectedWarm, hasVtx, fESD->GetTimeStamp()};
245 Double_t vecNoise[6] = {fESD->GetEventNumberInFile(), trackCounter, isSelectedMB, isSelectedWarm, hasVtx, fESD->GetTimeStamp()};
246 fHistNoiseTracks->Fill(vecNoise);
249 if (trackCounter > 0) {
250 cout << "NOISE_EVENT_CATEGORY:"<<"\t"<<
251 AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler()->GetTree()->GetCurrentFile()->GetName()<<"\t"<<
252 fESD->GetEventNumberInFile() << "\t" <<
253 fESD->GetTimeStamp() <<endl;
257 if (trackCounter > -1) {
258 fHistNoiseTracks->Fill(vecNoise);
259 if (trackCounter > 25 && trackCounter < 90 && fESD->GetEventSpecie() != AliRecoParam::kCalib) { // dump all availbale info for these events
260 cout << "NOISE_EVENT_CATEGORY:"<<"\t"<<
261 AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler()->GetTree()->GetCurrentFile()->GetName()<<"\t"<<
262 fESD->GetEventNumberInFile() << "\t" <<
263 fESD->GetTimeStamp() <<endl;
264 for (Int_t i=0;i<fESD->GetNumberOfTracks();++i) {
265 AliESDtrack *track = fESD->GetTrack(i);
266 if (fESDtrackCuts->AcceptTrack(track)) cout << "NOISE_TRACK:"<<"\t"<<
267 track->GetTPCNcls() <<"\t"<<
268 track->GetTPCsignal() <<"\t"<<
269 track->GetAlpha() <<"\t"<<
271 track->GetZ() <<"\t"<<
272 track->Eta() << endl;
275 if (fESD->GetEventSpecie() == AliRecoParam::kCalib) {
276 cout << "LASER_EVENT_CATEGORY:"<<"\t"<<
277 AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler()->GetTree()->GetCurrentFile()->GetName()<<"\t"<<
278 fESD->GetEventNumberInFile() << "\t" <<
279 fESD->GetTimeStamp() <<endl;
286 PostData(1, fListHist);
290 //________________________________________________________________________
291 void AliAnalysisNoiseTPC::Terminate(Option_t *)
293 // Draw result to the screen
294 // Called once at the end of the query
295 Printf("*** CONSTRUCTOR CALLED ****");