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"
68 ClassImp(AliAnalysisNoiseTPC)
70 //________________________________________________________________________
71 AliAnalysisNoiseTPC::AliAnalysisNoiseTPC()
72 : AliAnalysisTaskSE("TaskChargedHadron"), fESD(0), fListHist(0), fESDtrackCuts(0),
73 fHistNoiseTracks(0),fTimeBins(0),fTimeStart(0),fTimeEnd(0)
75 // default Constructor
79 //________________________________________________________________________
80 AliAnalysisNoiseTPC::AliAnalysisNoiseTPC(const char *name,UInt_t StartTime, UInt_t EndTime, Int_t deltaTime)
81 : AliAnalysisTaskSE(name), fESD(0), fListHist(0), fESDtrackCuts(0),
82 fHistNoiseTracks(0), fTimeBins(0), fTimeStart(StartTime), fTimeEnd(EndTime)
85 // standard constructur which should be used
87 Printf("*** CONSTRUCTOR CALLED ****");
90 fTimeBins = TMath::Nint((fTimeEnd-fTimeStart)/deltaTime);
91 printf("fTimeBins %d \n",fTimeBins);
93 printf("deltaTime is 0 \n");
96 // Output slot #0 writes into a TList container
97 DefineOutput(1, TList::Class());
104 //________________________________________________________________________
105 void AliAnalysisNoiseTPC::UserCreateOutputObjects()
110 fESDtrackCuts = new AliESDtrackCuts("AliESDtrackCuts","AliESDtrackCuts");
111 fESDtrackCuts->SetAcceptKinkDaughters(kFALSE);
112 fESDtrackCuts->SetMinNClustersTPC(80);
113 fESDtrackCuts->SetMaxChi2PerClusterTPC(2);
115 fESDtrackCuts->SetRequireTPCRefit(kTRUE);
116 fESDtrackCuts->SetRequireITSRefit(kFALSE);
117 fESDtrackCuts->SetEtaRange(-0.005,+0.005);
118 fESDtrackCuts->SetPtRange(10., 1e10);
121 fListHist = new TList();
122 fListHist->SetOwner(kTRUE);
125 UInt_t StartTime = 1272672000; // 1st of May
126 UInt_t EndTime = 1288569600; // 1st of Nov
127 Double_t deltaTime = EndTime - StartTime;
128 Int_t timeBins = TMath::Nint(deltaTime/(15.*60)); // every 15min
131 // event number in file, # noise tracks, isSelectMB, isSelectWarm, has vtx., time
132 Int_t binsHistNoise[6] = { 20000, 100, 2, 2, 2, fTimeBins};
133 Double_t xminHistNoise[6] = { -0.5, -0.5, -0.5, -0.5,-0.5, fTimeStart};
134 Double_t xmaxHistNoise[6] = {19999.5, 99.5, 1.5, 1.5, 1.5, fTimeEnd};
135 fHistNoiseTracks = new THnSparseS("fHistNoiseTracks","noise tracks: ev in file, # noise tracks, isSelectMB, isSelectWarm, has vtx,time",6,binsHistNoise,xminHistNoise,xmaxHistNoise);
137 fListHist->Add(fHistNoiseTracks);
140 PostData(1, fListHist);
143 //________________________________________________________________________
144 void AliAnalysisNoiseTPC::UserExec(Option_t *)
149 AliLog::SetGlobalLogLevel(AliLog::kError);
151 // Check Monte Carlo information and other access first:
153 fESD = dynamic_cast<AliESDEvent*>( InputEvent() );
155 //Printf("ERROR: fESD not available");
159 if (!fESDtrackCuts) {
160 Printf("ERROR: fESDtrackCuts not available");
165 // check if event is selected by physics selection class
167 AliPhysicsSelection *physicsSelection = NULL;
168 AliTriggerAnalysis* triggerAnalysis = NULL;
170 AliInputEventHandler* inputHandler = (AliInputEventHandler*) AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler();
173 Printf("ERROR: Could not receive input handler");
177 Bool_t isSelectedMB = kFALSE;
179 isSelectedMB = inputHandler->IsEventSelected() & AliVEvent::kMB;
181 // get physics selection
182 physicsSelection = static_cast<AliPhysicsSelection*> (inputHandler->GetEventSelection());
183 if(!physicsSelection) return;
185 // check Warm Up events
186 Bool_t isSelectedWarm = kFALSE;
187 triggerAnalysis = physicsSelection->GetTriggerAnalysis();
188 if(!triggerAnalysis) return;
189 isSelectedWarm = triggerAnalysis->IsOfflineTriggerFired(fESD, AliTriggerAnalysis::kTPCLaserWarmUp);
192 // monitor vertex position
194 const AliESDVertex *vertex = fESD->GetPrimaryVertexTracks();
195 if(vertex->GetNContributors()<1) {
197 vertex = fESD->GetPrimaryVertexSPD();
198 if(vertex->GetNContributors()<1) vertex = 0x0;
201 Int_t trackCounter = 0;
202 for (Int_t i=0; i<fESD->GetNumberOfTracks(); ++i)
204 AliESDtrack *track = fESD->GetTrack(i);
208 if (track->GetTPCNcls() < 30) continue;
209 //if (track->GetTPCchi2()/track->GetTPCNcls() > 0.3) continue;
210 if (TMath::Abs(track->Eta()) > 0.005) continue;
211 if (track->Pt() < 4) continue;
212 if (track->GetKinkIndex(0) > 0) continue;
214 UInt_t status = track->GetStatus();
215 if ((status&AliESDtrack::kITSrefit)==AliESDtrack::kITSrefit) continue; // explicitly ask for tracks without ITS refit
216 if ((status&AliESDtrack::kTPCrefit)!=AliESDtrack::kTPCrefit) continue;
218 if (track->GetTPCsignal() > 10) continue; // explicitly ask for tracks without dE/dx
220 //if (TMath::Abs(track->GetZ()) < 50) continue;
226 Float_t dca[2], cov[3];
227 // 1st track loop to determine multiplicities
228 for (Int_t i=0;i<fESD->GetNumberOfTracks();++i) {
229 AliESDtrack *track = fESD->GetTrack(i);
230 if (!track) continue;
231 if (fESDtrackCuts->AcceptTrack(track)) {
232 UInt_t status = track->GetStatus();
233 if ((status&AliESDtrack::kITSrefit)==1) continue; // explicitly ask for tracks without ITS refit
234 if (track->GetTPCsignal() > 30) continue; // explicitly ask for tracks without dE/dx
235 //if (track->GetTPCNcls() > 80) continue;
236 track->GetImpactParameters(dca, cov);
237 if (TMath::Abs(dca[0]) > 10) continue;
244 // run number, # noise tracks, isSelectedMB, isSelectedWarm, has vtx.
245 Bool_t hasVtx = vertex;
246 if (trackCounter > 98) trackCounter = 98;
247 //Double_t vecNoise[7] = {fESD->GetRunNumber(),fESD->GetEventNumberInFile(), trackCounter, isSelectedMB, isSelectedWarm, hasVtx, fESD->GetTimeStamp()};
248 Double_t vecNoise[6] = {fESD->GetEventNumberInFile(), trackCounter, isSelectedMB, isSelectedWarm, hasVtx, fESD->GetTimeStamp()};
249 fHistNoiseTracks->Fill(vecNoise);
252 if (trackCounter > 0) {
253 cout << "NOISE_EVENT_CATEGORY:"<<"\t"<<
254 AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler()->GetTree()->GetCurrentFile()->GetName()<<"\t"<<
255 fESD->GetEventNumberInFile() << "\t" <<
256 fESD->GetTimeStamp() <<endl;
260 if (trackCounter > -1) {
261 fHistNoiseTracks->Fill(vecNoise);
262 if (trackCounter > 25 && trackCounter < 90 && fESD->GetEventSpecie() != AliRecoParam::kCalib) { // dump all availbale info for these events
263 cout << "NOISE_EVENT_CATEGORY:"<<"\t"<<
264 AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler()->GetTree()->GetCurrentFile()->GetName()<<"\t"<<
265 fESD->GetEventNumberInFile() << "\t" <<
266 fESD->GetTimeStamp() <<endl;
267 for (Int_t i=0;i<fESD->GetNumberOfTracks();++i) {
268 AliESDtrack *track = fESD->GetTrack(i);
269 if (fESDtrackCuts->AcceptTrack(track)) cout << "NOISE_TRACK:"<<"\t"<<
270 track->GetTPCNcls() <<"\t"<<
271 track->GetTPCsignal() <<"\t"<<
272 track->GetAlpha() <<"\t"<<
274 track->GetZ() <<"\t"<<
275 track->Eta() << endl;
278 if (fESD->GetEventSpecie() == AliRecoParam::kCalib) {
279 cout << "LASER_EVENT_CATEGORY:"<<"\t"<<
280 AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler()->GetTree()->GetCurrentFile()->GetName()<<"\t"<<
281 fESD->GetEventNumberInFile() << "\t" <<
282 fESD->GetTimeStamp() <<endl;
289 PostData(1, fListHist);
293 //________________________________________________________________________
294 void AliAnalysisNoiseTPC::Terminate(Option_t *)
296 // Draw result to the screen
297 // Called once at the end of the query
298 Printf("*** CONSTRUCTOR CALLED ****");