///////////////////////////////////////////////////////////////////////////////
// //
-// blaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa //
+// ANALYSIS task to perrorm TPC calibration //
+
// //
///////////////////////////////////////////////////////////////////////////////
#include "AliTPCAnalysisTaskcalib.h"
#include "AliTPCcalibBase.h"
#include "AliESDEvent.h"
#include "AliESDfriend.h"
+#include "AliESDtrack.h"
#include "AliESDfriendTrack.h"
#include "AliTPCseed.h"
#include "AliESDInputHandler.h"
#include "AliAnalysisManager.h"
+#include "TFile.h"
+#include "TSystem.h"
+#include "TTimeStamp.h"
ClassImp(AliTPCAnalysisTaskcalib)
+
+AliTPCAnalysisTaskcalib::AliTPCAnalysisTaskcalib()
+ :AliAnalysisTask(),
+ fCalibJobs(0),
+ fESD(0),
+ fESDfriend(0),
+ fDebugOutputPath("")
+{
+ //
+ // default constructor
+ //
+
+}
+
+
AliTPCAnalysisTaskcalib::AliTPCAnalysisTaskcalib(const char *name)
:AliAnalysisTask(name,""),
fCalibJobs(0),
fESD(0),
- fESDfriend(0)
+ fESDfriend(0),
+ fDebugOutputPath("")
{
//
// Constructor
//
DefineInput(0, TChain::Class());
DefineOutput(0, TObjArray::Class());
+ fCalibJobs = new TObjArray(0);
+ fCalibJobs->SetOwner(kTRUE);
}
AliTPCAnalysisTaskcalib::~AliTPCAnalysisTaskcalib() {
//
// destructor
//
+ printf("AliTPCAnalysisTaskcalib::~AliTPCAnalysisTaskcalib");
+ fCalibJobs->Delete();
}
void AliTPCAnalysisTaskcalib::Exec(Option_t *) {
// Exec function
// Loop over tracks and call Process function
if (!fESD) {
- Printf("ERROR: fESD not available");
+ //Printf("ERROR: fESD not available");
return;
}
fESDfriend=static_cast<AliESDfriend*>(fESD->FindListObject("AliESDfriend"));
if (!fESDfriend) {
- Printf("ERROR: fESDfriend not available");
+ //Printf("ERROR: fESDfriend not available");
return;
}
+ if (fESDfriend->TestSkipBit()) return;
Int_t n=fESD->GetNumberOfTracks();
+ Process(fESD);
+ Int_t run = fESD->GetRunNumber();
for (Int_t i=0;i<n;++i) {
AliESDfriendTrack *friendTrack=fESDfriend->GetTrack(i);
+ AliESDtrack *track=fESD->GetTrack(i);
TObject *calibObject=0;
AliTPCseed *seed=0;
+ if (!friendTrack) continue;
for (Int_t j=0;(calibObject=friendTrack->GetCalibObject(j));++j)
if ((seed=dynamic_cast<AliTPCseed*>(calibObject)))
break;
+ if (track) Process(track, run);
if (seed)
Process(seed);
}
- PostData(0,&fCalibJobs);
+ PostData(0,fCalibJobs);
}
void AliTPCAnalysisTaskcalib::ConnectInputData(Option_t *) {
//
TTree* tree=dynamic_cast<TTree*>(GetInputData(0));
if (!tree) {
- Printf("ERROR: Could not read chain from input slot 0");
+ //Printf("ERROR: Could not read chain from input slot 0");
}
else {
AliESDInputHandler *esdH = dynamic_cast<AliESDInputHandler*> (AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler());
if (!esdH) {
- Printf("ERROR: Could not get ESDInputHandler");
+ //Printf("ERROR: Could not get ESDInputHandler");
}
else {
fESD = esdH->GetEvent();
- Printf("*** CONNECTED NEW EVENT ****");
+ //Printf("*** CONNECTED NEW EVENT ****");
}
}
}
//
//
//
+ //OpenFile(0, "RECREATE");
+
+ PostData(0,fCalibJobs);
}
+
void AliTPCAnalysisTaskcalib::Terminate(Option_t */*option*/) {
+ //
+ // Terminate
+ //
+ AliTPCcalibBase *job=0;
+ Int_t njobs = fCalibJobs->GetEntriesFast();
+ for (Int_t i=0;i<njobs;i++){
+ job = (AliTPCcalibBase*)fCalibJobs->UncheckedAt(i);
+ if (job) job->Terminate();
+ }
+
+}
+
+void AliTPCAnalysisTaskcalib::FinishTaskOutput()
+{
+ //
+ // According description in AliAnalisysTask this method is call
+ // on the slaves before sending data
+ //
+ Terminate("slave");
+ if(!fDebugOutputPath.IsNull()) {
+ RegisterDebugOutput();
+ }
+
}
-// we could have been living inside a master class...
+
void AliTPCAnalysisTaskcalib::Process(AliESDEvent *event) {
- TIterator *i=fCalibJobs.MakeIterator();
- AliTPCcalibBase *job;
- while ((job=dynamic_cast<AliTPCcalibBase*>(i->Next())))
- job->Process(event);
+ //
+ // Process ESD event
+ //
+ AliTPCcalibBase *job=0;
+ Int_t njobs = fCalibJobs->GetEntriesFast();
+ for (Int_t i=0;i<njobs;i++){
+ job = (AliTPCcalibBase*)fCalibJobs->UncheckedAt(i);
+ if (job) {
+ job->UpdateEventInfo(event);
+ if (job->AcceptTrigger())
+ job->Process(event);
+ }
+ }
}
void AliTPCAnalysisTaskcalib::Process(AliTPCseed *track) {
- TIterator *i=fCalibJobs.MakeIterator();
- AliTPCcalibBase *job;
- while ((job=dynamic_cast<AliTPCcalibBase*>(i->Next())))
- job->Process(track);
+ //
+ // Process TPC track
+ //
+ AliTPCcalibBase *job=0;
+ Int_t njobs = fCalibJobs->GetEntriesFast();
+ for (Int_t i=0;i<njobs;i++){
+ job = (AliTPCcalibBase*)fCalibJobs->UncheckedAt(i);
+ if (job)
+ if (job->AcceptTrigger())
+ job->Process(track);
+ }
+}
+
+void AliTPCAnalysisTaskcalib::Process(AliESDtrack *track, Int_t run) {
+ //
+ // Process ESD track
+ //
+ AliTPCcalibBase *job=0;
+ Int_t njobs = fCalibJobs->GetEntriesFast();
+ for (Int_t i=0;i<njobs;i++){
+ job = (AliTPCcalibBase*)fCalibJobs->UncheckedAt(i);
+ if (job)
+ if (job->AcceptTrigger())
+ job->Process(track,run);
+ }
}
Long64_t AliTPCAnalysisTaskcalib::Merge(TCollection *li) {
- TIterator *i=fCalibJobs.MakeIterator();
+ TIterator *i=fCalibJobs->MakeIterator();
AliTPCcalibBase *job;
Long64_t n=0;
while ((job=dynamic_cast<AliTPCcalibBase*>(i->Next())))
}
void AliTPCAnalysisTaskcalib::Analyze() {
- TIterator *i=fCalibJobs.MakeIterator();
- AliTPCcalibBase *job;
- while ((job=dynamic_cast<AliTPCcalibBase*>(i->Next())))
- job->Analyze();
+ //
+ // Analyze the content of the task
+ //
+ AliTPCcalibBase *job=0;
+ Int_t njobs = fCalibJobs->GetEntriesFast();
+ for (Int_t i=0;i<njobs;i++){
+ job = (AliTPCcalibBase*)fCalibJobs->UncheckedAt(i);
+ if (job) job->Analyze();
+ }
+}
+
+
+void AliTPCAnalysisTaskcalib::RegisterDebugOutput(){
+ //
+ //
+ //
+ AliTPCcalibBase *job=0;
+ Int_t njobs = fCalibJobs->GetEntriesFast();
+ for (Int_t i=0;i<njobs;i++){
+ job = (AliTPCcalibBase*)fCalibJobs->UncheckedAt(i);
+ if (job) job->RegisterDebugOutput(fDebugOutputPath.Data());
+ }
+ TString dsName=GetName();
+ dsName+=".root";
+ TFile fff(dsName.Data(),"recreate");
+ fCalibJobs->Write("TPCCalib",TObject::kSingleKey);
+ fff.Close();
+ //
+ // store - copy debug output to the destination position
+ // currently ONLY for local copy
+ TString dsName2=fDebugOutputPath.Data();
+ gSystem->MakeDirectory(dsName2.Data());
+ dsName2+=gSystem->HostName();
+ gSystem->MakeDirectory(dsName2.Data());
+ dsName2+="/";
+ TTimeStamp s;
+ dsName2+=Int_t(s.GetNanoSec());
+ dsName2+="/";
+ gSystem->MakeDirectory(dsName2.Data());
+ dsName2+=dsName;
+ AliInfo(Form("copy %s\t%s\n",dsName.Data(),dsName2.Data()));
+ printf("copy %s\t%s\n",dsName.Data(),dsName2.Data());
+ TFile::Cp(dsName.Data(),dsName2.Data());
+
}