]> git.uio.no Git - u/mrichter/AliRoot.git/blob - TPC/AliTPCAnalysisTaskcalib.cxx
code defects fix
[u/mrichter/AliRoot.git] / TPC / AliTPCAnalysisTaskcalib.cxx
1 /**************************************************************************
2  * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
3  *                                                                        *
4  * Author: The ALICE Off-line Project.                                    *
5  * Contributors are mentioned in the code where appropriate.              *
6  *                                                                        *
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  **************************************************************************/
15
16
17 ///////////////////////////////////////////////////////////////////////////////
18 //                                                                           //
19 // ANALYSIS task to perrorm TPC calibration                                  //
20
21 //                                                                           //
22 ///////////////////////////////////////////////////////////////////////////////
23 #include "AliTPCAnalysisTaskcalib.h"
24 #include "TChain.h"
25 #include "AliTPCcalibBase.h"
26 #include "AliESDEvent.h"
27 #include "AliESDfriend.h"
28 #include "AliESDtrack.h"
29 #include "AliESDfriendTrack.h"
30 #include "AliTPCseed.h"
31 #include "AliESDInputHandler.h"
32 #include "AliAnalysisManager.h"
33 #include "TFile.h"
34 #include "TSystem.h"
35 #include "TTimeStamp.h"
36
37 ClassImp(AliTPCAnalysisTaskcalib)
38
39
40 AliTPCAnalysisTaskcalib::AliTPCAnalysisTaskcalib()
41   :AliAnalysisTask(),
42    fCalibJobs(0),
43    fESD(0),
44    fESDfriend(0),
45    fDebugOutputPath("")
46 {
47   //
48   // default constructor
49   // 
50   
51 }
52
53
54 AliTPCAnalysisTaskcalib::AliTPCAnalysisTaskcalib(const char *name) 
55   :AliAnalysisTask(name,""),
56    fCalibJobs(0),
57    fESD(0),
58    fESDfriend(0),
59    fDebugOutputPath("")
60 {
61   //
62   // Constructor
63   //
64   DefineInput(0, TChain::Class());
65   DefineOutput(0, TObjArray::Class());
66   fCalibJobs = new TObjArray(0);
67   fCalibJobs->SetOwner(kTRUE);
68 }
69
70 AliTPCAnalysisTaskcalib::~AliTPCAnalysisTaskcalib() {
71   //
72   // destructor
73   //
74   printf("AliTPCAnalysisTaskcalib::~AliTPCAnalysisTaskcalib");
75   fCalibJobs->Delete();
76 }
77
78 void AliTPCAnalysisTaskcalib::Exec(Option_t *) {
79   //
80   // Exec function
81   // Loop over tracks and call  Process function
82   if (!fESD) {
83     //Printf("ERROR: fESD not available");
84     return;
85   }
86   fESDfriend=static_cast<AliESDfriend*>(fESD->FindListObject("AliESDfriend"));
87   if (!fESDfriend) {
88     //Printf("ERROR: fESDfriend not available");
89     return;
90   }
91   Int_t n=fESD->GetNumberOfTracks();
92   Process(fESD);
93   Int_t run = fESD->GetRunNumber();
94   for (Int_t i=0;i<n;++i) {
95     AliESDfriendTrack *friendTrack=fESDfriend->GetTrack(i);
96     AliESDtrack *track=fESD->GetTrack(i);
97     TObject *calibObject=0;
98     AliTPCseed *seed=0;
99     if (!friendTrack) continue;
100     for (Int_t j=0;(calibObject=friendTrack->GetCalibObject(j));++j)
101       if ((seed=dynamic_cast<AliTPCseed*>(calibObject)))
102         break;
103     if (track) Process(track, run);
104     if (seed)
105       Process(seed);
106   }
107   PostData(0,fCalibJobs);
108 }
109
110 void AliTPCAnalysisTaskcalib::ConnectInputData(Option_t *) {
111   //
112   //
113   //
114   TTree* tree=dynamic_cast<TTree*>(GetInputData(0));
115   if (!tree) {
116     //Printf("ERROR: Could not read chain from input slot 0");
117   } 
118   else {
119     AliESDInputHandler *esdH = dynamic_cast<AliESDInputHandler*> (AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler());
120     if (!esdH) {
121       //Printf("ERROR: Could not get ESDInputHandler");
122     } 
123     else {
124       fESD = esdH->GetEvent();
125       //Printf("*** CONNECTED NEW EVENT ****");
126     }
127   }
128 }
129
130 void AliTPCAnalysisTaskcalib::CreateOutputObjects() {
131   //
132   //
133   //
134   //OpenFile(0, "RECREATE");
135
136   PostData(0,fCalibJobs);
137 }
138
139 void AliTPCAnalysisTaskcalib::Terminate(Option_t */*option*/) {
140   //
141   // Terminate
142   //
143   AliTPCcalibBase *job=0;
144   Int_t njobs = fCalibJobs->GetEntriesFast();
145   for (Int_t i=0;i<njobs;i++){
146     job = (AliTPCcalibBase*)fCalibJobs->UncheckedAt(i);
147     if (job) job->Terminate();
148   }
149   
150 }
151
152 void AliTPCAnalysisTaskcalib::FinishTaskOutput()
153 {
154   //
155   // According description in AliAnalisysTask this method is call 
156   // on the slaves before sending data
157   //
158   Terminate("slave");
159   if(!fDebugOutputPath.IsNull()) { 
160     RegisterDebugOutput();
161   }
162   
163 }
164
165
166 void AliTPCAnalysisTaskcalib::Process(AliESDEvent *event) {
167   //
168   // Process ESD event
169   //
170   AliTPCcalibBase *job=0;
171   Int_t njobs = fCalibJobs->GetEntriesFast();
172   for (Int_t i=0;i<njobs;i++){
173     job = (AliTPCcalibBase*)fCalibJobs->UncheckedAt(i);
174     if (job) {
175       job->UpdateEventInfo(event);
176       if (job->AcceptTrigger())
177         job->Process(event);
178     }
179   }
180 }
181
182 void AliTPCAnalysisTaskcalib::Process(AliTPCseed *track) {
183   //
184   // Process TPC track
185   //
186   AliTPCcalibBase *job=0;
187   Int_t njobs = fCalibJobs->GetEntriesFast();
188   for (Int_t i=0;i<njobs;i++){
189     job = (AliTPCcalibBase*)fCalibJobs->UncheckedAt(i);
190     if (job)  
191       if (job->AcceptTrigger())
192         job->Process(track);
193   }
194 }
195
196 void AliTPCAnalysisTaskcalib::Process(AliESDtrack *track, Int_t run) {
197   //
198   // Process ESD track
199   //
200   AliTPCcalibBase *job=0;
201   Int_t njobs = fCalibJobs->GetEntriesFast();
202   for (Int_t i=0;i<njobs;i++){
203     job = (AliTPCcalibBase*)fCalibJobs->UncheckedAt(i);
204     if (job) 
205       if (job->AcceptTrigger())
206         job->Process(track,run);
207   }
208 }
209
210 Long64_t AliTPCAnalysisTaskcalib::Merge(TCollection *li) {
211   TIterator *i=fCalibJobs->MakeIterator();
212   AliTPCcalibBase *job;
213   Long64_t n=0;
214   while ((job=dynamic_cast<AliTPCcalibBase*>(i->Next())))
215     n+=job->Merge(li);
216   return n;
217 }
218
219 void AliTPCAnalysisTaskcalib::Analyze() {
220   //
221   // Analyze the content of the task
222   //
223   AliTPCcalibBase *job=0;
224   Int_t njobs = fCalibJobs->GetEntriesFast();
225   for (Int_t i=0;i<njobs;i++){
226     job = (AliTPCcalibBase*)fCalibJobs->UncheckedAt(i);
227     if (job) job->Analyze();
228   }
229 }
230
231
232 void AliTPCAnalysisTaskcalib::RegisterDebugOutput(){
233   //
234   //
235   //
236   AliTPCcalibBase *job=0;
237   Int_t njobs = fCalibJobs->GetEntriesFast();
238   for (Int_t i=0;i<njobs;i++){
239     job = (AliTPCcalibBase*)fCalibJobs->UncheckedAt(i);
240     if (job) job->RegisterDebugOutput(fDebugOutputPath.Data());
241   }
242   TString dsName=GetName();
243   dsName+=".root";
244   TFile fff(dsName.Data(),"recreate");
245   fCalibJobs->Write("TPCCalib",TObject::kSingleKey);
246   fff.Close();
247   //
248   // store  - copy debug output to the destination position
249   // currently ONLY for local copy
250   TString dsName2=fDebugOutputPath.Data();
251   gSystem->MakeDirectory(dsName2.Data());
252   dsName2+=gSystem->HostName();
253   gSystem->MakeDirectory(dsName2.Data());
254   dsName2+="/";
255   TTimeStamp s;
256   dsName2+=Int_t(s.GetNanoSec());
257   dsName2+="/";
258   gSystem->MakeDirectory(dsName2.Data());
259   dsName2+=dsName;
260   AliInfo(Form("copy %s\t%s\n",dsName.Data(),dsName2.Data()));
261   printf("copy %s\t%s\n",dsName.Data(),dsName2.Data());
262   TFile::Cp(dsName.Data(),dsName2.Data());
263
264 }