X-Git-Url: http://git.uio.no/git/?a=blobdiff_plain;f=TRD%2FAliTRDReconstructor.cxx;h=738916c52cdf5ef967b791c7fc254092b93c130e;hb=d643e2629193af8e0b2cd155063d5be731f642d4;hp=daaf7a06d923416a7f3a553771c3997165ec21c0;hpb=eee6e8682d543af7841de7dcd2c16152d6b2c7cb;p=u%2Fmrichter%2FAliRoot.git diff --git a/TRD/AliTRDReconstructor.cxx b/TRD/AliTRDReconstructor.cxx index daaf7a06d92..738916c52cd 100644 --- a/TRD/AliTRDReconstructor.cxx +++ b/TRD/AliTRDReconstructor.cxx @@ -1,17 +1,17 @@ /************************************************************************** - * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. * - * * - * Author: The ALICE Off-line Project. * - * Contributors are mentioned in the code where appropriate. * - * * - * Permission to use, copy, modify and distribute this software and its * - * documentation strictly for non-commercial purposes is hereby granted * - * without fee, provided that the above copyright notice appears in all * - * copies and that both the copyright notice and this permission notice * - * appear in the supporting documentation. The authors make no claims * - * about the suitability of this software for any purpose. It is * - * provided "as is" without express or implied warranty. * - **************************************************************************/ +* Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. * +* * +* Author: The ALICE Off-line Project. * +* Contributors are mentioned in the code where appropriate. * +* * +* Permission to use, copy, modify and distribute this software and its * +* documentation strictly for non-commercial purposes is hereby granted * +* without fee, provided that the above copyright notice appears in all * +* copies and that both the copyright notice and this permission notice * +* appear in the supporting documentation. The authors make no claims * +* about the suitability of this software for any purpose. It is * +* provided "as is" without express or implied warranty. * +**************************************************************************/ /* $Id$ */ @@ -22,6 +22,9 @@ /////////////////////////////////////////////////////////////////////////////// #include +#include +#include +#include #include "AliRunLoader.h" #include "AliRawReader.h" @@ -30,64 +33,116 @@ #include "AliESDEvent.h" #include "AliTRDReconstructor.h" -#include "AliTRDclusterizerV1.h" +#include "AliTRDclusterizer.h" #include "AliTRDtracker.h" #include "AliTRDpidESD.h" #include "AliTRDgtuTrack.h" #include "AliTRDrawData.h" #include "AliTRDdigitsManager.h" +#include "AliTRDtrackerV1.h" +#include "AliTRDrecoParam.h" + +#include "TTreeStream.h" + +#define SETFLG(n,f) ((n) |= f) +#define CLRFLG(n,f) ((n) &= ~f) ClassImp(AliTRDReconstructor) -Bool_t AliTRDReconstructor::fgkSeedingOn = kFALSE; -Int_t AliTRDReconstructor::fgStreamLevel = 0; // Stream (debug) level +TClonesArray *AliTRDReconstructor::fgClusters = 0x0; +//_____________________________________________________________________________ +AliTRDReconstructor::AliTRDReconstructor() + :AliReconstructor() + ,fSteerParam(0) +{ + // setting default "ON" steering parameters + // owner of debug streamers + SETFLG(fSteerParam, kOwner); + // write clusters [cw] + SETFLG(fSteerParam, kWriteClusters); + // track seeding (stand alone tracking) [sa] + SETFLG(fSteerParam, kSeeding); + // PID method in reconstruction (NN) [nn] + SETFLG(fSteerParam, kSteerPID); + // number of dEdx slices in the ESD track [8s] + //SETFLG(fSteerParam, kEightSlices); + + memset(fStreamLevel, 0, kNtasks*sizeof(UChar_t)); + memset(fDebugStream, 0, sizeof(TTreeSRedirector *) * kNtasks); + // Xe tail cancellation parameters + fTCParams[0] = 1.156; // r1 + fTCParams[1] = 0.130; // r2 + fTCParams[2] = 0.114; // c1 + fTCParams[3] = 0.624; // c2 + // Ar tail cancellation parameters + fTCParams[4] = 6.; // r1 + fTCParams[5] = 0.62; // r2 + fTCParams[6] = 0.0087;// c1 + fTCParams[7] = 0.07; // c2 +} //_____________________________________________________________________________ -void AliTRDReconstructor::ConvertDigits(AliRawReader *rawReader - , TTree *digitsTree) const +AliTRDReconstructor::AliTRDReconstructor(const AliTRDReconstructor &r) + :AliReconstructor(r) + ,fSteerParam(r.fSteerParam) { - // - // Convert raw data digits into digit objects in a root tree - // + memcpy(fStreamLevel, r.fStreamLevel, kNtasks*sizeof(UChar_t)); + memcpy(fTCParams, r.fTCParams, 8*sizeof(Double_t)); + memcpy(fDebugStream, r.fDebugStream, sizeof(TTreeSRedirector *) *kNtasks); + // ownership of debug streamers is not taken + CLRFLG(fSteerParam, kOwner); +} + +//_____________________________________________________________________________ +AliTRDReconstructor::~AliTRDReconstructor() +{ + if(fgClusters) { + fgClusters->Delete(); delete fgClusters; + } + if(fSteerParam&kOwner){ + for(Int_t itask = 0; itask < kNtasks; itask++) + if(fDebugStream[itask]) delete fDebugStream[itask]; + } +} - AliTRDrawData rawData; - rawReader->Reset(); - rawReader->Select("TRD"); - AliTRDdigitsManager *manager = rawData.Raw2Digits(rawReader); - manager->MakeBranch(digitsTree); - manager->WriteDigits(); +//_____________________________________________________________________________ +void AliTRDReconstructor::Init(){ + // + // Init Options + // + SetOption(GetOption()); + + AliInfo(Form("\tDigitsConversion [dc] : %s", fSteerParam&kDigitsConversion?"yes":"no")); + AliInfo(Form("\tWrite Clusters [cw] : %s", fSteerParam&kWriteClusters?"yes":"no")); + AliInfo(Form("\tWrite Online Tracklets [tw] : %s", fSteerParam&kWriteTracklets?"yes":"no")); + AliInfo(Form("\tDrift Gas Argon [ar] : %s", fSteerParam&kDriftGas?"yes":"no")); + AliInfo(Form("\tStand Alone Tracking [sa] : %s", fSteerParam&kSeeding?"yes":"no")); + AliInfo(Form("\tHLT Tracking [hlt] : %s", fSteerParam&kHLT?"yes":"no")); + AliInfo(Form("\tCosmic Reconstruction [cos] : %s", fSteerParam&kCosmic?"yes":"no")); + AliInfo(Form("\tNN PID [nn] : %s", fSteerParam&kSteerPID?"yes":"no")); + AliInfo(Form("\t8 dEdx slices in ESD [8s] : %s", fSteerParam&kEightSlices?"yes":"no")); + AliInfo(Form("\tStreaming Levels : Clusterizer[%d] Tracker[%d] PID[%d]", fStreamLevel[kClusterizer], fStreamLevel[kTracker], fStreamLevel[kPID])); } //_____________________________________________________________________________ -void AliTRDReconstructor::Reconstruct(AliRunLoader *runLoader - , AliRawReader *rawReader) const +void AliTRDReconstructor::ConvertDigits(AliRawReader *rawReader + , TTree *digitsTree) const { // - // Reconstruct clusters + // Convert raw data digits into digit objects in a root tree // + AliInfo("Feature not available for the moment."); return; - AliInfo("Reconstruct TRD clusters from RAW data"); - - AliLoader *loader = runLoader->GetLoader("TRDLoader"); - loader->LoadRecPoints("recreate"); - - runLoader->CdGAFile(); - Int_t nEvents = runLoader->GetNumberOfEvents(); + AliInfo("Convert raw data digits into digit objects [RawReader -> Digit TTree]"); + AliTRDrawData rawData; rawReader->Reset(); rawReader->Select("TRD"); - - for (Int_t iEvent = 0; iEvent < nEvents; iEvent++) { - if (!rawReader->NextEvent()) break; - AliTRDclusterizerV1 clusterer("clusterer","TRD clusterizer"); - clusterer.Open(runLoader->GetFileName(),iEvent); - clusterer.ReadDigits(rawReader); - clusterer.MakeClusters(); - clusterer.WriteClusters(-1); - } - - loader->UnloadRecPoints(); + AliTRDdigitsManager *manager = rawData.Raw2Digits(rawReader); + manager->MakeBranch(digitsTree); + manager->WriteDigits(); + delete manager; } @@ -99,16 +154,24 @@ void AliTRDReconstructor::Reconstruct(AliRawReader *rawReader // Reconstruct clusters // - AliInfo("Reconstruct TRD clusters from RAW data"); + //AliInfo("Reconstruct TRD clusters from RAW data [RawReader -> Cluster TTree]"); + rawReader->Reset(); rawReader->Select("TRD"); - AliTRDclusterizerV1 clusterer("clusterer","TRD clusterizer"); + // New (fast) cluster finder + AliTRDclusterizer clusterer("clusterer","TRD clusterizer"); + clusterer.SetReconstructor(this); clusterer.OpenOutput(clusterTree); - clusterer.ReadDigits(rawReader); - clusterer.MakeClusters(); - + clusterer.SetAddLabels(kFALSE); + clusterer.Raw2ClustersChamber(rawReader); + + if(IsWritingClusters()) return; + + // take over ownership of clusters + fgClusters = clusterer.RecPoints(); + clusterer.SetClustersOwner(kFALSE); } //_____________________________________________________________________________ @@ -119,102 +182,138 @@ void AliTRDReconstructor::Reconstruct(TTree *digitsTree // Reconstruct clusters // - AliTRDclusterizerV1 clusterer("clusterer","TRD clusterizer"); + //AliInfo("Reconstruct TRD clusters from Digits [Digit TTree -> Cluster TTree]"); + + AliTRDclusterizer clusterer("clusterer","TRD clusterizer"); + clusterer.SetReconstructor(this); clusterer.OpenOutput(clusterTree); clusterer.ReadDigits(digitsTree); clusterer.MakeClusters(); -} - -//_____________________________________________________________________________ -void AliTRDReconstructor::Reconstruct(AliRunLoader *runLoader) const -{ - // - // Reconstruct clusters - // - - AliLoader *loader = runLoader->GetLoader("TRDLoader"); - loader->LoadRecPoints("recreate"); - - runLoader->CdGAFile(); - Int_t nEvents = runLoader->GetNumberOfEvents(); - - for (Int_t iEvent = 0; iEvent < nEvents; iEvent++) { - AliTRDclusterizerV1 clusterer("clusterer","TRD clusterizer"); - clusterer.Open(runLoader->GetFileName(),iEvent); - clusterer.ReadDigits(); - clusterer.MakeClusters(); - clusterer.WriteClusters(-1); - } - - loader->UnloadRecPoints(); + if(IsWritingClusters()) return; + // take over ownership of clusters + fgClusters = clusterer.RecPoints(); + clusterer.SetClustersOwner(kFALSE); } //_____________________________________________________________________________ -AliTracker *AliTRDReconstructor::CreateTracker(AliRunLoader *runLoader) const +AliTracker *AliTRDReconstructor::CreateTracker() const { // // Create a TRD tracker // - runLoader->CdGAFile(); - - return new AliTRDtracker(gFile); + //return new AliTRDtracker(NULL); + AliTRDtrackerV1 *tracker = new AliTRDtrackerV1(); + tracker->SetReconstructor(this); + return tracker; } //_____________________________________________________________________________ -void AliTRDReconstructor::FillESD(AliRunLoader* /*runLoader*/ - , AliRawReader* /*rawReader*/ - , AliESDEvent* /*esd*/) const +void AliTRDReconstructor::FillESD(TTree* /*digitsTree*/ + , TTree* /*clusterTree*/ + , AliESDEvent* /*esd*/) const { // - // Make PID + // Fill ESD // - //AliTRDpidESD trdPID; - //trdPID.MakePID(esd); - } -//_____________________________________________________________________________ -void AliTRDReconstructor::FillESD(AliRawReader* /*rawReader*/ - , TTree* /*clusterTree*/ - , AliESDEvent* /*esd*/) const -{ - // - // Make PID - // - - //AliTRDpidESD trdPID; - //trdPID.MakePID(esd); - -} //_____________________________________________________________________________ -void AliTRDReconstructor::FillESD(TTree* /*digitsTree*/ - , TTree* /*clusterTree*/ - , AliESDEvent* /*esd*/) const +void AliTRDReconstructor::SetOption(Option_t *opt) { - // - // Make PID - // - - //AliTRDpidESD trdPID; - //trdPID.MakePID(esd); - +// Read option string into the steer param. +// +// Default steer param values +// +// digits conversion [dc] = false +// drift gas [ar] = false - do not update the number of exponentials in the TC ! +// write clusters [cw] = true +// write online tracklets [tw] = false +// track seeding (stand alone tracking) [sa] = true +// PID method in reconstruction (NN) [nn] = true +// 8 dEdx slices in ESD [8s] = false +// HLT tracking [hlt] = false +// Cosmic Reconstruction [cos] = false +// + + AliReconstructor::SetOption(opt); + + TString s(opt); + TObjArray *opar = s.Tokenize(","); + for(Int_t ipar=0; iparGetEntriesFast(); ipar++){ + TString sopt(((TObjString*)(*opar)[ipar])->String()); + if(sopt.Contains("dc")){ + SETFLG(fSteerParam, kDigitsConversion); + if(sopt.Contains("!")) CLRFLG(fSteerParam, kDigitsConversion); + continue; + } else if(sopt.Contains("cw")){ + SETFLG(fSteerParam, kWriteClusters); + if(sopt.Contains("!")) CLRFLG(fSteerParam, kWriteClusters); + continue; + } else if(sopt.Contains("sa")){ + SETFLG(fSteerParam, kSeeding); + if(sopt.Contains("!")) CLRFLG(fSteerParam, kSeeding); + continue; + } else if(sopt.Contains("nn")){ + SETFLG(fSteerParam, kSteerPID); + if(sopt.Contains("!")) CLRFLG(fSteerParam, kSteerPID); + continue; + } else if(sopt.Contains("8s")){ + SETFLG(fSteerParam, kEightSlices); + if(sopt.Contains("!")) CLRFLG(fSteerParam, kEightSlices); + continue; + } else if(sopt.Contains("tw")){ + SETFLG(fSteerParam, kWriteTracklets); + if(sopt.Contains("!")) CLRFLG(fSteerParam, kWriteTracklets); + continue; + } else if(sopt.Contains("ar")){ + SETFLG(fSteerParam, kDriftGas); + if(sopt.Contains("!")) CLRFLG(fSteerParam, kDriftGas); + continue; + } else if(sopt.Contains("hlt")){ + SETFLG(fSteerParam, kHLT); + if(sopt.Contains("!")) CLRFLG(fSteerParam, kHLT); + continue; + } else if(sopt.Contains("cos")){ + SETFLG(fSteerParam, kCosmic); + if(sopt.Contains("!")) CLRFLG(fSteerParam, kCosmic); + } else if(sopt.Contains("sl")){ + TObjArray *stl = sopt.Tokenize("_"); + if(stl->GetEntriesFast() < 3) continue; + TString taskstr(((TObjString*)(*stl)[1])->String()); + TString levelstring(((TObjString*)(*stl)[2])->String()); + // Set the stream Level + Int_t level = levelstring.Atoi(); + ETRDReconstructorTask task = kTracker; + if(taskstr.CompareTo("raw") == 0) task = kRawReader; + else if(taskstr.CompareTo("cl") == 0) task = kClusterizer; + else if(taskstr.CompareTo("tr") == 0) task = kTracker; + else if(taskstr.CompareTo("pi") == 0) task = kPID; + SetStreamLevel(level, task); + continue; + } + } } //_____________________________________________________________________________ -void AliTRDReconstructor::FillESD(AliRunLoader* /*runLoader*/ - , AliESDEvent* /*esd*/) const -{ +void AliTRDReconstructor::SetStreamLevel(Int_t level, ETRDReconstructorTask task){ // - // Make PID + // Set the Stream Level for one of the tasks Clusterizer, Tracker or PID // - - //AliTRDpidESD trdPID; - //trdPID.MakePID(esd); - + TString taskname[4] = {"RawReader", "Clusterizer", "Tracker", "PID"}; + const Int_t minLevel[4] = {1, 1, 2, 1}; // the minimum debug level upon which a debug stream is created for different tasks + //AliInfo(Form("Setting Stream Level for Task %s to %d", taskname.Data(),level)); + fStreamLevel[(Int_t)task] = level; + // Initialize DebugStreamer if not yet done + if(level >= minLevel[task] && !fDebugStream[task]){ + TDirectory *savedir = gDirectory; + fDebugStream[task] = new TTreeSRedirector(Form("TRD.%sDebug.root", taskname[task].Data())); + savedir->cd(); + SETFLG(fSteerParam, kOwner); + } }