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 //Class to calculate the intrinsic efficiency of the detection elements of the
17 //MUON tracking chambers in function of the position in the detection element.
18 //Author: Nicolas LE BRIS - SUBATECH Nantes
27 #include <TClonesArray.h>
31 #include <Riostream.h>
34 #include "AliAnalysisManager.h"
35 #include "AliAnalysisTask.h"
38 #include "AliESDEvent.h"
39 #include "AliESDMuonTrack.h"
40 #include "AliESDInputHandler.h"
42 #include "AliTracker.h"
43 #include "AliAnalysisManager.h"
44 #include "AliGeomManager.h"
48 #include "AliAnalysisTaskMuonTrackingEff.h"
49 #include "AliCheckMuonDetEltResponse.h"
52 #include "AliMUONTrackExtrap.h"
54 ClassImp(AliAnalysisTaskMuonTrackingEff)
56 const Int_t AliAnalysisTaskMuonTrackingEff::fTotNbrOfDetectionElt = 156;
57 const Int_t AliAnalysisTaskMuonTrackingEff::fTotNbrOfChamber = 10;
59 //________________________________________________________________________
60 AliAnalysisTaskMuonTrackingEff::AliAnalysisTaskMuonTrackingEff()
65 fDetEltEffHistList(0x0),
66 fDetEltTDHistList(0x0),
67 fDetEltTTHistList(0x0),
68 fChamberEffHistList(0x0),
69 fChamberTDHistList(0x0),
70 fChamberTTHistList(0x0),
74 /// Default constructor
76 //________________________________________________________________________
77 AliAnalysisTaskMuonTrackingEff::AliAnalysisTaskMuonTrackingEff(const AliAnalysisTaskMuonTrackingEff& src)
82 fDetEltEffHistList(0x0),
83 fDetEltTDHistList(0x0),
84 fDetEltTTHistList(0x0),
85 fChamberEffHistList(0x0),
86 fChamberTDHistList(0x0),
87 fChamberTTHistList(0x0),
94 //________________________________________________________________________
95 AliAnalysisTaskMuonTrackingEff& AliAnalysisTaskMuonTrackingEff::operator=(const AliAnalysisTaskMuonTrackingEff& src)
97 /// assignement operator
105 //________________________________________________________________________
106 AliAnalysisTaskMuonTrackingEff::AliAnalysisTaskMuonTrackingEff(const char* name,
109 AliAnalysisTask(name, "AnalysisTaskESD"),
112 fDetEltEffHistList(0x0),
113 fDetEltTDHistList(0x0),
114 fDetEltTTHistList(0x0),
115 fChamberEffHistList(0x0),
116 fChamberTDHistList(0x0),
117 fChamberTTHistList(0x0),
119 fIsCosmicData(kFALSE)
124 fIsCosmicData = isCosmic;
127 if (!AliGeomManager::GetGeometry())
128 AliGeomManager::LoadGeometry();
129 fTransformer = new AliMUONGeometryTransformer();
130 fTransformer->LoadGeometryData();
133 //Define detection element efficiency histograms
134 //----------------------------------------------
136 fDetEltEffHistList = new TClonesArray("TH2F",fTotNbrOfDetectionElt + 3); //!<+3 for: 1.the total efficiency chamber by chamber histogram.
137 //!< 2.the total number of tracks detected by the tracking system.
138 //!< 3.the number of track used for the efficiency calculation chamber by chamber
139 fDetEltTDHistList = new TClonesArray("TH2F",fTotNbrOfDetectionElt + 1);
140 fDetEltTTHistList = new TClonesArray("TH2F",fTotNbrOfDetectionElt + 1);
143 fChamberEffHistList = new TClonesArray("TH1F", fTotNbrOfChamber + 3);
144 fChamberTDHistList = new TClonesArray("TH1F", fTotNbrOfChamber + 1);
145 fChamberTTHistList = new TClonesArray("TH1F", fTotNbrOfChamber + 1);
149 for (Int_t i = 0; i<fTotNbrOfDetectionElt; ++i)
152 if (i<16) iDetElt = 100*(i/4+1) + i - int(i/4)*4;
153 else if (i<52) iDetElt = 100*((i-16)/18+5) + i - (int((i-16)/18)*18 + 16);
154 if (i>51) iDetElt = 100*((i-52)/26+7) + i - (int((i-52)/26)*26 + 52);
156 Char_t histName[255];
157 Char_t histTitle[255];
159 sprintf(histName,"Eff_detEltNbr%d",iDetElt);
160 sprintf(histTitle,"detEltNbr %d",iDetElt);
161 if(i<16) new((*fDetEltEffHistList)[i]) TH2F(histName,histTitle,12,-10,110,12,-10,110);//!<Stations 1 & 2.
162 else new((*fDetEltEffHistList)[i]) TH2F(histName,histTitle,28,-140,140,8,-40,40); //!<Stations 3 -> 5.
164 sprintf(histName,"TD_detEltNbr%d",iDetElt);
165 if(i<16) new((*fDetEltTDHistList)[i]) TH2F(histName,histTitle,12,-10,110,12,-10,110);//!<Stations 1 & 2.
166 else new((*fDetEltTDHistList)[i]) TH2F(histName,histTitle,28,-140,140,8,-40,40); //!<Stations 3 -> 5.
168 sprintf(histName,"TT_detEltNbr%d",iDetElt);
169 if(i<16) new((*fDetEltTTHistList)[i]) TH2F(histName,histTitle,12,-10,110,12,-10,110); //!<Stations 1 & 2.
170 else new((*fDetEltTTHistList)[i]) TH2F(histName,histTitle,28,-140,140,8,-40,40); //!<Stations 3 -> 5.
172 ((TH2F*) fDetEltEffHistList->UncheckedAt(i)) -> GetXaxis() -> SetTitle("X (cm)");
173 ((TH2F*) fDetEltEffHistList->UncheckedAt(i)) -> GetYaxis() -> SetTitle("Y (cm)");
174 ((TH2F*) fDetEltEffHistList->UncheckedAt(i)) -> GetZaxis() -> SetTitle("Efficiency (%)");
175 ((TH2F*) fDetEltEffHistList->UncheckedAt(i)) -> GetXaxis() -> SetTitleOffset(1.8);
176 ((TH2F*) fDetEltEffHistList->UncheckedAt(i)) -> GetYaxis() -> SetTitleOffset(1.8);
177 ((TH2F*) fDetEltEffHistList->UncheckedAt(i)) -> GetZaxis() -> SetTitleOffset(1.2);
178 ((TH2F*) fDetEltEffHistList->UncheckedAt(i)) -> SetOption("LEGO");
181 for (Int_t j = 0; j < fTotNbrOfChamber; j++)
183 Char_t histName[255];
184 Char_t histTitle[255];
187 sprintf(histName,"Eff_ChamberNbr%d",j+1);
188 sprintf(histTitle,"ChamberNbr %d",j+1);
189 if (j<4) new ((*fChamberEffHistList)[j]) TH1F(histName, histTitle, 4, 0.0, 4.0);
190 else if (j<6) new ((*fChamberEffHistList)[j]) TH1F(histName, histTitle, 18, 0.0, 18.0);
191 if (j>=6) new ((*fChamberEffHistList)[j]) TH1F(histName, histTitle, 26, 0.0, 26.0);
193 sprintf(histName,"TD_ChamberNbr%d",j+1);
194 if (j<4) new ((*fChamberTDHistList)[j]) TH1F(histName, histTitle, 4, 0.0, 4.0);
195 else if (j<6) new ((*fChamberTDHistList)[j]) TH1F(histName, histTitle, 18, 0.0, 18.0);
196 if (j>=6) new ((*fChamberTDHistList)[j]) TH1F(histName, histTitle, 26, 0.0, 26.0);
198 sprintf(histName,"TT_ChamberNbr%d",j+1);
199 if (j<4) new ((*fChamberTTHistList)[j]) TH1F(histName, histTitle, 4, 0.0, 4.0);
200 else if (j<6) new ((*fChamberTTHistList)[j]) TH1F(histName, histTitle, 18, 0.0, 18.0);
201 if (j>=6) new ((*fChamberTTHistList)[j]) TH1F(histName, histTitle, 26, 0.0, 26.0);
203 ((TH1F*) fChamberEffHistList->UncheckedAt(j)) -> GetXaxis() -> SetTitle("DetElement");
204 ((TH1F*) fChamberEffHistList->UncheckedAt(j)) -> GetYaxis() -> SetTitle("Efficiency (%)");
205 ((TH1F*) fChamberEffHistList->UncheckedAt(j)) -> GetXaxis() -> SetTitleOffset(1.8);
206 ((TH1F*) fChamberEffHistList->UncheckedAt(j)) -> GetYaxis() -> SetTitleOffset(1.8);
207 ((TH1F*) fChamberEffHistList->UncheckedAt(j)) -> Sumw2();
210 new((*fDetEltTDHistList )[fTotNbrOfDetectionElt]) TH2F("TD_Chamber" ,"TD_Chamber" ,10,0,10,1,0,1); //!<Detected tracks.
211 new((*fDetEltTTHistList )[fTotNbrOfDetectionElt]) TH2F("TT_Chamber" ,"TT_Chamber" ,10,0,10,1,0,1); //!<Tracks total number.
212 new((*fDetEltEffHistList)[fTotNbrOfDetectionElt]) TH2F("fChamberEff","fChamberEff",10,0,10,1,0,1); //!<Chamber efficiency.
214 ((TH2F*) fDetEltEffHistList->UncheckedAt(fTotNbrOfDetectionElt)) -> GetXaxis() -> SetTitle("Chamber number");
215 ((TH2F*) fDetEltEffHistList->UncheckedAt(fTotNbrOfDetectionElt)) -> GetYaxis() -> SetTitle("");
216 ((TH2F*) fDetEltEffHistList->UncheckedAt(fTotNbrOfDetectionElt)) -> GetZaxis() -> SetTitle("Efficiency (%)");
217 ((TH2F*) fDetEltEffHistList->UncheckedAt(fTotNbrOfDetectionElt)) -> GetXaxis() -> SetTitleOffset(1.8);
218 ((TH2F*) fDetEltEffHistList->UncheckedAt(fTotNbrOfDetectionElt)) -> GetYaxis() -> SetTitleOffset(1.8);
219 ((TH2F*) fDetEltEffHistList->UncheckedAt(fTotNbrOfDetectionElt)) -> GetZaxis() -> SetTitleOffset(1.2);
220 ((TH2F*) fDetEltEffHistList->UncheckedAt(fTotNbrOfDetectionElt)) -> SetOption("LEGO");
222 new((*fDetEltEffHistList)[157]) TH2F("TT_Chamber" ,"TT_Chamber" ,10,0,10,1,0,1); //!<Tracks total number by chamber.
224 ((TH2F*) fDetEltEffHistList->UncheckedAt(fTotNbrOfDetectionElt + 1)) -> GetXaxis() -> SetTitle("Chamber number");
225 ((TH2F*) fDetEltEffHistList->UncheckedAt(fTotNbrOfDetectionElt + 1)) -> GetYaxis() -> SetTitle("");
226 ((TH2F*) fDetEltEffHistList->UncheckedAt(fTotNbrOfDetectionElt + 1)) -> GetZaxis() -> SetTitle("Number of tracks");
227 ((TH2F*) fDetEltEffHistList->UncheckedAt(fTotNbrOfDetectionElt + 1)) -> GetXaxis() -> SetTitleOffset(1.8);
228 ((TH2F*) fDetEltEffHistList->UncheckedAt(fTotNbrOfDetectionElt + 1)) -> GetYaxis() -> SetTitleOffset(1.8);
229 ((TH2F*) fDetEltEffHistList->UncheckedAt(fTotNbrOfDetectionElt + 1)) -> GetZaxis() -> SetTitleOffset(1.2);
230 ((TH2F*) fDetEltEffHistList->UncheckedAt(fTotNbrOfDetectionElt + 1)) -> SetOption("LEGO");
232 new((*fDetEltEffHistList)[158]) TH2F("Total_Number_of_Tracks" ,"Total_Number_of_Tracks" ,1,0,1,1,0,1); //!<Tracks total number.
234 ((TH2F*) fDetEltEffHistList->UncheckedAt(fTotNbrOfDetectionElt + 2)) -> GetXaxis() -> SetTitle("");
235 ((TH2F*) fDetEltEffHistList->UncheckedAt(fTotNbrOfDetectionElt + 2)) -> GetYaxis() -> SetTitle("");
236 ((TH2F*) fDetEltEffHistList->UncheckedAt(fTotNbrOfDetectionElt + 2)) -> GetZaxis() -> SetTitle("Number of tracks");
237 ((TH2F*) fDetEltEffHistList->UncheckedAt(fTotNbrOfDetectionElt + 2)) -> GetXaxis() -> SetTitleOffset(1.8);
238 ((TH2F*) fDetEltEffHistList->UncheckedAt(fTotNbrOfDetectionElt + 2)) -> GetYaxis() -> SetTitleOffset(1.8);
239 ((TH2F*) fDetEltEffHistList->UncheckedAt(fTotNbrOfDetectionElt + 2)) -> GetZaxis() -> SetTitleOffset(1.2);
240 ((TH2F*) fDetEltEffHistList->UncheckedAt(fTotNbrOfDetectionElt + 2)) -> SetOption("LEGO");
243 new((*fChamberTDHistList )[fTotNbrOfChamber]) TH1F("TD_Chamber_2" ,"TD_Chamber_2" ,10,0,10); //!<Detected tracks.
244 new((*fChamberTTHistList )[fTotNbrOfChamber]) TH1F("TT_Chamber_2" ,"TT_Chamber_2" ,10,0,10); //!<Tracks total number.
245 new((*fChamberEffHistList)[fTotNbrOfChamber]) TH1F("fChamberEff_2","fChamberEff_2",10,0,10); //!<Chamber efficiency.
247 ((TH1F*) fChamberTDHistList->UncheckedAt(fTotNbrOfChamber)) -> Sumw2();
248 ((TH1F*) fChamberTTHistList->UncheckedAt(fTotNbrOfChamber)) -> Sumw2();
250 ((TH1F*) fChamberEffHistList->UncheckedAt(fTotNbrOfChamber)) -> GetXaxis() -> SetTitle("Chamber number");
251 ((TH1F*) fChamberEffHistList->UncheckedAt(fTotNbrOfChamber)) -> GetYaxis() -> SetTitle("");
252 ((TH1F*) fChamberEffHistList->UncheckedAt(fTotNbrOfChamber)) -> GetXaxis() -> SetTitleOffset(1.8);
253 ((TH1F*) fChamberEffHistList->UncheckedAt(fTotNbrOfChamber)) -> GetYaxis() -> SetTitleOffset(1.8);
254 ((TH1F*) fChamberEffHistList->UncheckedAt(fTotNbrOfChamber)) -> Sumw2();
255 ((TH1F*) fChamberEffHistList->UncheckedAt(fTotNbrOfChamber)) -> SetOption("");
257 new((*fChamberEffHistList)[11]) TH1F("TT_Chamber_2" ,"TT_Chamber_2" ,10,0,10); //!<Tracks total number by chamber.
259 ((TH1F*) fChamberEffHistList->UncheckedAt(fTotNbrOfChamber + 1)) -> GetXaxis() -> SetTitle("Chamber number");
260 ((TH1F*) fChamberEffHistList->UncheckedAt(fTotNbrOfChamber + 1)) -> GetYaxis() -> SetTitle("");
261 ((TH1F*) fChamberEffHistList->UncheckedAt(fTotNbrOfChamber + 1)) -> GetXaxis() -> SetTitleOffset(1.8);
262 ((TH1F*) fChamberEffHistList->UncheckedAt(fTotNbrOfChamber + 1)) -> GetYaxis() -> SetTitleOffset(1.8);
263 ((TH1F*) fChamberEffHistList->UncheckedAt(fTotNbrOfChamber + 1)) -> Sumw2();
264 ((TH1F*) fChamberEffHistList->UncheckedAt(fTotNbrOfChamber + 1)) -> SetOption("");
266 new((*fChamberEffHistList)[12]) TH1F("Total_Number_of_Tracks_2" ,"Total_Number_of_Tracks_2" ,1,0,1); //!<Tracks total number.
268 ((TH1F*) fChamberEffHistList->UncheckedAt(fTotNbrOfChamber + 2)) -> GetXaxis() -> SetTitle("");
269 ((TH1F*) fChamberEffHistList->UncheckedAt(fTotNbrOfChamber + 2)) -> GetYaxis() -> SetTitle("");
270 ((TH1F*) fChamberEffHistList->UncheckedAt(fTotNbrOfChamber + 2)) -> GetXaxis() -> SetTitleOffset(1.8);
271 ((TH1F*) fChamberEffHistList->UncheckedAt(fTotNbrOfChamber + 2)) -> GetYaxis() -> SetTitleOffset(1.8);
272 ((TH1F*) fChamberEffHistList->UncheckedAt(fTotNbrOfChamber + 2)) -> Sumw2();
273 ((TH1F*) fChamberEffHistList->UncheckedAt(fTotNbrOfChamber + 2)) -> SetOption("");
279 //Define input & output
280 //---------------------
282 // -Input slot 0 works with a TChain:
283 DefineInput(0, TChain::Class());
285 // -Output slots 0 to 5 writes into a TClonesArray:
286 DefineOutput(0, TClonesArray::Class());
287 DefineOutput(1, TClonesArray::Class());
288 DefineOutput(2, TClonesArray::Class());
289 DefineOutput(3, TClonesArray::Class());
290 DefineOutput(4, TClonesArray::Class());
291 DefineOutput(5, TClonesArray::Class());
296 //______________________________________________________________________________
297 AliAnalysisTaskMuonTrackingEff::~AliAnalysisTaskMuonTrackingEff()
301 delete fDetEltEffHistList;
302 delete fDetEltTDHistList;
303 delete fDetEltTTHistList;
304 delete fChamberEffHistList;
305 delete fChamberTDHistList;
306 delete fChamberTTHistList;
312 //________________________________________________________________________
313 void AliAnalysisTaskMuonTrackingEff::CreateOutputObjects()
320 //________________________________________________________________________
321 void AliAnalysisTaskMuonTrackingEff::ConnectInputData(Option_t */*option*/)
324 //Set Field Map for track extrapolation
325 AliMUONTrackExtrap::SetField();
328 AliESDInputHandler* esdHandler = (AliESDInputHandler*) ((AliAnalysisManager::GetAnalysisManager())->GetInputEventHandler());
331 Printf("ERROR: Could not get ESDInputHandler");
333 else fESD = esdHandler->GetEvent();
337 //________________________________________________________________________
338 void AliAnalysisTaskMuonTrackingEff::Exec(Option_t */*option*/)
340 //Execute analysis for current event
341 if (fChamberEff == 0x0)
342 fChamberEff = new AliCheckMuonDetEltResponse(fTransformer, fESD, fDetEltTDHistList, fDetEltTTHistList, fChamberTDHistList, fChamberTTHistList);
343 fChamberEff->CheckDetEltResponse();
345 for( Int_t i = 0; i<156; ++i)
347 ((TH2F*) fDetEltEffHistList->UncheckedAt(i))-> Divide( (TH2F*) fDetEltTDHistList->UncheckedAt(i),
348 (TH2F*) fDetEltTTHistList->UncheckedAt(i), 100., 1.);
351 for (Int_t j = 0; j < 10; j++)
353 ((TH1F*) fChamberEffHistList->UncheckedAt(j))-> Divide( (TH1F*) fChamberTDHistList->UncheckedAt(j),
354 (TH1F*) fChamberTTHistList->UncheckedAt(j), 100., 1.);
358 ((TH2F*) fDetEltEffHistList->UncheckedAt(156))-> Divide( (TH2F*) fDetEltTDHistList->UncheckedAt(156),
359 (TH2F*) fDetEltTTHistList->UncheckedAt(156), 100., 1.);
362 ((TH2F*) fDetEltEffHistList->UncheckedAt(157))-> Add ( (TH2F*) fDetEltTTHistList ->UncheckedAt(156),
363 (TH2F*) fDetEltEffHistList->UncheckedAt(157), 1., 0.);
366 ((TH2F*) fDetEltEffHistList->UncheckedAt(158))-> Fill(0., 0., ((Double_t)fESD -> GetNumberOfMuonTracks()));
369 ((TH1F*) fChamberEffHistList->UncheckedAt(10))-> Divide( (TH1F*) fChamberTDHistList->UncheckedAt(10),
370 (TH1F*) fChamberTTHistList->UncheckedAt(10), 100., 1.);
373 ((TH1F*) fChamberEffHistList->UncheckedAt(11))-> Add ( (TH1F*) fChamberTTHistList ->UncheckedAt(10),
374 (TH1F*) fChamberEffHistList->UncheckedAt(11), 1., 0.);
377 ((TH1F*) fChamberEffHistList->UncheckedAt(12))-> Fill(0., ((Double_t)fChamberEff -> GetNbrUsableTracks()));
378 fChamberEff->SetNbrUsableTracks(0);
379 //((TH1F*) fChamberEffHistList->UncheckedAt(12))-> Fill(0., ((Double_t)fESD -> GetNumberOfMuonTracks()));
383 //Post the output data:
384 PostData(0, fDetEltTDHistList);
385 PostData(1, fDetEltTTHistList);
386 PostData(2, fDetEltEffHistList);
387 PostData(3, fChamberTDHistList);
388 PostData(4, fChamberTTHistList);
389 PostData(5, fChamberEffHistList);
394 //________________________________________________________________________
395 void AliAnalysisTaskMuonTrackingEff::Terminate(Option_t */*option*/)
402 //________________________________________________________________________
403 void AliAnalysisTaskMuonTrackingEff::ComputeErrors()
405 // Compute error on the efficiency
407 // error = max {1/Ntt, sqrt(eff*(1-eff)/Ntt)}
409 for (Int_t ii = 0; ii <= 10; ii++)
411 Int_t NumberOfBins = ((TH1F*) fChamberEffHistList->UncheckedAt(ii))->GetNbinsX();
412 for (Int_t jj = 1; jj <= NumberOfBins; jj++)
414 Double_t Ntd = ((TH1F*) fChamberTDHistList->UncheckedAt(ii))->GetBinContent(jj);
415 Double_t Ntt = ((TH1F*) fChamberTTHistList->UncheckedAt(ii))->GetBinContent(jj);
417 if (Ntt > 0.0 && Ntd > 0.0)
419 Double_t eff = ((TH1F*) fChamberEffHistList->UncheckedAt(ii))->GetBinContent(jj)/100.0;
420 Double_t err1 = 1.0/Ntt;
421 Double_t err2 = TMath::Sqrt(eff*(1.0 - eff)/Ntt);
422 Double_t error = TMath::Max(err1, err2);
424 ((TH1F*) fChamberEffHistList->UncheckedAt(ii))->SetBinError(jj, error*100.0);