]> git.uio.no Git - u/mrichter/AliRoot.git/blob - TPC/AliTPCAnalysisTaskcalib.cxx
removes OCDB access during merging by splitting out the functionality
[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   Int_t n=fESD->GetNumberOfTracks();
88   Process(fESD);
89   if (!fESDfriend) {
90     //Printf("ERROR: fESDfriend not available");
91     return;
92   }
93   if (fESDfriend->TestSkipBit()) return;
94   //
95   Int_t run = fESD->GetRunNumber();
96   for (Int_t i=0;i<n;++i) {
97     AliESDfriendTrack *friendTrack=fESDfriend->GetTrack(i);
98     AliESDtrack *track=fESD->GetTrack(i);
99     TObject *calibObject=0;
100     AliTPCseed *seed=0;
101     if (!friendTrack) continue;
102     for (Int_t j=0;(calibObject=friendTrack->GetCalibObject(j));++j)
103       if ((seed=dynamic_cast<AliTPCseed*>(calibObject)))
104         break;
105     if (track) Process(track, run);
106     if (seed)
107       Process(seed);
108   }
109   PostData(0,fCalibJobs);
110 }
111
112 void AliTPCAnalysisTaskcalib::ConnectInputData(Option_t *) {
113   //
114   //
115   //
116   TTree* tree=dynamic_cast<TTree*>(GetInputData(0));
117   if (!tree) {
118     //Printf("ERROR: Could not read chain from input slot 0");
119   } 
120   else {
121     AliESDInputHandler *esdH = dynamic_cast<AliESDInputHandler*> (AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler());
122     if (!esdH) {
123       //Printf("ERROR: Could not get ESDInputHandler");
124     } 
125     else {
126       fESD = esdH->GetEvent();
127       //Printf("*** CONNECTED NEW EVENT ****");
128     }
129   }
130 }
131
132 void AliTPCAnalysisTaskcalib::CreateOutputObjects() {
133   //
134   //
135   //
136   //OpenFile(0, "RECREATE");
137
138   PostData(0,fCalibJobs);
139 }
140
141 void AliTPCAnalysisTaskcalib::Terminate(Option_t */*option*/) {
142   //
143   // Terminate
144   //
145   AliTPCcalibBase *job=0;
146   Int_t njobs = fCalibJobs->GetEntriesFast();
147   for (Int_t i=0;i<njobs;i++){
148     job = (AliTPCcalibBase*)fCalibJobs->UncheckedAt(i);
149     if (job) job->Terminate();
150   }
151   
152 }
153
154 void AliTPCAnalysisTaskcalib::FinishTaskOutput()
155 {
156   //
157   // According description in AliAnalisysTask this method is call 
158   // on the slaves before sending data
159   //
160   Terminate("slave");
161   if(!fDebugOutputPath.IsNull()) { 
162     RegisterDebugOutput();
163   }
164   
165 }
166
167
168 void AliTPCAnalysisTaskcalib::Process(AliESDEvent *event) {
169   //
170   // Process ESD event
171   //
172   AliTPCcalibBase *job=0;
173   Int_t njobs = fCalibJobs->GetEntriesFast();
174   for (Int_t i=0;i<njobs;i++){
175     job = (AliTPCcalibBase*)fCalibJobs->UncheckedAt(i);
176     if (job) {
177       job->UpdateEventInfo(event);
178       if (job->AcceptTrigger())
179         job->Process(event);
180     }
181   }
182 }
183
184 void AliTPCAnalysisTaskcalib::Process(AliTPCseed *track) {
185   //
186   // Process TPC track
187   //
188   AliTPCcalibBase *job=0;
189   Int_t njobs = fCalibJobs->GetEntriesFast();
190   for (Int_t i=0;i<njobs;i++){
191     job = (AliTPCcalibBase*)fCalibJobs->UncheckedAt(i);
192     if (job)  
193       if (job->AcceptTrigger())
194         job->Process(track);
195   }
196 }
197
198 void AliTPCAnalysisTaskcalib::Process(AliESDtrack *track, Int_t run) {
199   //
200   // Process ESD track
201   //
202   AliTPCcalibBase *job=0;
203   Int_t njobs = fCalibJobs->GetEntriesFast();
204   for (Int_t i=0;i<njobs;i++){
205     job = (AliTPCcalibBase*)fCalibJobs->UncheckedAt(i);
206     if (job) 
207       if (job->AcceptTrigger())
208         job->Process(track,run);
209   }
210 }
211
212 Long64_t AliTPCAnalysisTaskcalib::Merge(TCollection *li) {
213   TIterator *i=fCalibJobs->MakeIterator();
214   AliTPCcalibBase *job;
215   Long64_t n=0;
216   while ((job=dynamic_cast<AliTPCcalibBase*>(i->Next())))
217     n+=job->Merge(li);
218   return n;
219 }
220
221 void AliTPCAnalysisTaskcalib::Analyze() {
222   //
223   // Analyze the content of the task
224   //
225   AliTPCcalibBase *job=0;
226   Int_t njobs = fCalibJobs->GetEntriesFast();
227   for (Int_t i=0;i<njobs;i++){
228     job = (AliTPCcalibBase*)fCalibJobs->UncheckedAt(i);
229     if (job) job->Analyze();
230   }
231 }
232
233
234 void AliTPCAnalysisTaskcalib::RegisterDebugOutput(){
235   //
236   //
237   //
238   AliTPCcalibBase *job=0;
239   Int_t njobs = fCalibJobs->GetEntriesFast();
240   for (Int_t i=0;i<njobs;i++){
241     job = (AliTPCcalibBase*)fCalibJobs->UncheckedAt(i);
242     if (job) job->RegisterDebugOutput(fDebugOutputPath.Data());
243   }
244   TString dsName=GetName();
245   dsName+=".root";
246   TFile fff(dsName.Data(),"recreate");
247   fCalibJobs->Write("TPCCalib",TObject::kSingleKey);
248   fff.Close();
249   //
250   // store  - copy debug output to the destination position
251   // currently ONLY for local copy
252   TString dsName2=fDebugOutputPath.Data();
253   gSystem->MakeDirectory(dsName2.Data());
254   dsName2+=gSystem->HostName();
255   gSystem->MakeDirectory(dsName2.Data());
256   dsName2+="/";
257   TTimeStamp s;
258   dsName2+=Int_t(s.GetNanoSec());
259   dsName2+="/";
260   gSystem->MakeDirectory(dsName2.Data());
261   dsName2+=dsName;
262   AliInfo(Form("copy %s\t%s\n",dsName.Data(),dsName2.Data()));
263   printf("copy %s\t%s\n",dsName.Data(),dsName2.Data());
264   TFile::Cp(dsName.Data(),dsName2.Data());
265
266 }