X-Git-Url: http://git.uio.no/git/?a=blobdiff_plain;f=TRD%2FAliTRDReconstructor.cxx;h=577b1583e04d043ea232388b5b048e00c62a6f0f;hb=7708b003f554347667a7e3e553e5cdad993867b9;hp=74afd72ec9982c5f60e65d765002804a6c65a6ca;hpb=25ca55ce1319759ab4aef50a95d664a47f1cd597;p=u%2Fmrichter%2FAliRoot.git diff --git a/TRD/AliTRDReconstructor.cxx b/TRD/AliTRDReconstructor.cxx index 74afd72ec99..577b1583e04 100644 --- a/TRD/AliTRDReconstructor.cxx +++ b/TRD/AliTRDReconstructor.cxx @@ -22,314 +22,248 @@ /////////////////////////////////////////////////////////////////////////////// #include +#include +#include +#include #include "AliRunLoader.h" #include "AliRawReader.h" #include "AliLog.h" #include "AliESDTrdTrack.h" -#include "AliESD.h" +#include "AliESDEvent.h" #include "AliTRDReconstructor.h" -#include "AliTRDclusterizerV1.h" +#include "AliTRDclusterizer.h" #include "AliTRDtracker.h" #include "AliTRDpidESD.h" -#include "AliTRDtrigger.h" -#include "AliTRDtrigParam.h" #include "AliTRDgtuTrack.h" +#include "AliTRDrawData.h" +#include "AliTRDdigitsManager.h" +#include "AliTRDtrackerV1.h" +#include "AliTRDrecoParam.h" ClassImp(AliTRDReconstructor) -Bool_t AliTRDReconstructor::fgkSeedingOn = kFALSE; -Int_t AliTRDReconstructor::fgStreamLevel = 0; // Stream (debug) level - +TClonesArray *AliTRDReconstructor::fgClusters = 0x0; //_____________________________________________________________________________ -void AliTRDReconstructor::ConvertDigits(AliRawReader* /*rawReader*/ - , TTree* /*digitsTree*/) const +AliTRDReconstructor::AliTRDReconstructor() + :AliReconstructor() + ,fSteerParam(0x00000007) { - // - // Convert raw data digits into digit objects in a root tree - // - - AliError("conversion of raw data digits into digit objects not implemented"); - + memset(fStreamLevel, 0, 5*sizeof(UChar_t)); + // 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::Reconstruct(AliRunLoader *runLoader - , AliRawReader *rawReader) const +AliTRDReconstructor::AliTRDReconstructor(const AliTRDReconstructor &r) + :AliReconstructor(r) + ,fSteerParam(r.fSteerParam) { - // - // Reconstruct clusters - // - - AliInfo("Reconstruct TRD clusters from RAW data"); - - AliLoader *loader = runLoader->GetLoader("TRDLoader"); - loader->LoadRecPoints("recreate"); - - runLoader->CdGAFile(); - Int_t nEvents = runLoader->GetNumberOfEvents(); - - 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(); - - // - // Trigger (tracklets, LTU) - // -// loader->LoadTracks(); -// if (loader->TreeT()) { -// AliError("Tracklets already exist"); -// return; -// } -// AliInfo("Trigger tracklets will be produced"); - -// AliTRDtrigger trdTrigger("Trigger","Trigger class"); - -// AliTRDtrigParam *trigp = new AliTRDtrigParam("TRDtrigParam" -// ,"TRD Trigger parameters"); - -// Float_t field = AliTracker::GetBz() * 0.1; // Tesla -// AliInfo(Form("Trigger set for magnetic field = %f Tesla \n",field)); -// trigp->SetField(field); -// trigp->Init(); -// trdTrigger.SetParameter(trigp); - -// rawReader->RewindEvents(); - -// for (Int_t iEvent = 0; iEvent < nEvents; iEvent++) { -// if (!rawReader->NextEvent()) break; -// trdTrigger.Open(runLoader->GetFileName(),iEvent); -// trdTrigger.ReadDigits(rawReader); -// trdTrigger.MakeTracklets(); -// trdTrigger.WriteTracklets(-1); -// } - -// loader->UnloadTracks(); - + memcpy(fStreamLevel, r.fStreamLevel, 5*sizeof(UChar_t)); + memcpy(fTCParams, r.fTCParams, 8*sizeof(Double_t)); } + //_____________________________________________________________________________ -void AliTRDReconstructor::Reconstruct(AliRawReader *rawReader - , TTree *clusterTree) const +AliTRDReconstructor::~AliTRDReconstructor() { - // - // Reconstruct clusters - // - - AliInfo("Reconstruct TRD clusters from RAW data"); - - AliTRDclusterizerV1 clusterer("clusterer","TRD clusterizer"); - clusterer.OpenOutput(clusterTree); - clusterer.ReadDigits(rawReader); - clusterer.MakeClusters(); - clusterer.WriteClusters(-1); + if(fgClusters) { + fgClusters->Delete(); delete fgClusters; + } +} - // - // No trigger, since we don't have the output tree for tracklets - // +//_____________________________________________________________________________ +void AliTRDReconstructor::Init(){ + // + // Init Options + // + SetOption(GetOption()); + + AliInfo("TRD reconstruction will use the following settings:"); + printf("\tWrite Clusters [cw] : %s\n", fSteerParam&kWriteClusters?"yes":"no"); + printf("\tWrite Online Tracklets [tw] : %s\n", fSteerParam&kWriteTracklets?"yes":"no"); + printf("\tDrift Gas Argon [ar] : %s\n", fSteerParam&kDriftGas?"yes":"no"); + printf("\tStand Alone Tracking [sa] : %s\n", fSteerParam&kSeeding?"yes":"no"); + printf("\tHLT Tracking [hlt] : %s\n", fSteerParam&kHLT?"yes":"no"); + printf("\tNN PID [nn] : %s\n", fSteerParam&kSteerPID?"yes":"no"); + printf("\tStreaming Levels : Clusterizer[%d] Tracker[%d] PID[%d]\n", fStreamLevel[kClusterizer], fStreamLevel[kTracker], fStreamLevel[kPID]); } //_____________________________________________________________________________ -void AliTRDReconstructor::Reconstruct(TTree *digitsTree, TTree *clusterTree) const +void AliTRDReconstructor::ConvertDigits(AliRawReader *rawReader + , TTree *digitsTree) const { // - // Reconstruct clusters + // Convert raw data digits into digit objects in a root tree // - AliTRDclusterizerV1 clusterer("clusterer","TRD clusterizer"); - clusterer.OpenOutput(clusterTree); - clusterer.ReadDigits(digitsTree); - clusterer.MakeClusters(); - clusterer.WriteClusters(-1); + AliInfo("Convert raw data digits into digit objects [RawReader -> Digit TTree]"); - // - // No trigger, since we don't have the output tree for tracklets - // + AliTRDrawData rawData; + rawReader->Reset(); + rawReader->Select("TRD"); + AliTRDdigitsManager *manager = rawData.Raw2Digits(rawReader); + manager->MakeBranch(digitsTree); + manager->WriteDigits(); + delete manager; } //_____________________________________________________________________________ -void AliTRDReconstructor::Reconstruct(AliRunLoader *runLoader) const +void AliTRDReconstructor::Reconstruct(AliRawReader *rawReader + , TTree *clusterTree) const { // // Reconstruct clusters // - AliLoader *loader = runLoader->GetLoader("TRDLoader"); - loader->LoadRecPoints("recreate"); - - runLoader->CdGAFile(); - Int_t nEvents = runLoader->GetNumberOfEvents(); + //AliInfo("Reconstruct TRD clusters from RAW data [RawReader -> Cluster TTree]"); - 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(); - - // - // Trigger (tracklets, LTU) - // - loader->LoadTracks("RECREATE"); - AliInfo("Trigger tracklets will be produced"); - - AliTRDtrigger trdTrigger("Trigger","Trigger class"); - - AliTRDtrigParam *trigp = new AliTRDtrigParam("TRDtrigParam" - ,"TRD Trigger parameters"); - - Float_t field = AliTracker::GetBz() * 0.1; // Tesla - AliInfo(Form("Trigger set for magnetic field = %f Tesla \n",field)); - trigp->SetField(field); - trigp->Init(); - trdTrigger.SetParameter(trigp); - - for (Int_t iEvent = 0; iEvent < nEvents; iEvent++) { - trdTrigger.Open(runLoader->GetFileName(),iEvent); - trdTrigger.ReadDigits(); - trdTrigger.MakeTracklets(); - trdTrigger.WriteTracklets(-1); - } - - loader->UnloadTracks(); + rawReader->Reset(); + rawReader->Select("TRD"); + // New (fast) cluster finder + AliTRDclusterizer clusterer("clusterer","TRD clusterizer"); + clusterer.SetReconstructor(this); + clusterer.OpenOutput(clusterTree); + clusterer.SetAddLabels(kFALSE); + clusterer.Raw2ClustersChamber(rawReader); + + if(IsWritingClusters()) return; + + // take over ownership of clusters + fgClusters = clusterer.RecPoints(); + clusterer.SetClustersOwner(kFALSE); } //_____________________________________________________________________________ -AliTracker *AliTRDReconstructor::CreateTracker(AliRunLoader *runLoader) const +void AliTRDReconstructor::Reconstruct(TTree *digitsTree + , TTree *clusterTree) const { // - // Create a TRD tracker + // Reconstruct clusters // - runLoader->CdGAFile(); - - return new AliTRDtracker(gFile); - -} + //AliInfo("Reconstruct TRD clusters from Digits [Digit TTree -> Cluster TTree]"); -//_____________________________________________________________________________ -void AliTRDReconstructor::FillESD(AliRunLoader* /*runLoader*/ - , AliRawReader* /*rawReader*/ - , AliESD *esd) const -{ - // - // Make PID - // - - AliTRDpidESD trdPID; - trdPID.MakePID(esd); + AliTRDclusterizer clusterer("clusterer","TRD clusterizer"); + clusterer.SetReconstructor(this); + clusterer.OpenOutput(clusterTree); + clusterer.ReadDigits(digitsTree); + clusterer.MakeClusters(); - // - // No trigger, since we don't have the output tree for tracklets - // + if(IsWritingClusters()) return; + // take over ownership of clusters + fgClusters = clusterer.RecPoints(); + clusterer.SetClustersOwner(kFALSE); } //_____________________________________________________________________________ -void AliTRDReconstructor::FillESD(AliRawReader* /*rawReader*/ - , TTree* /*clusterTree*/ - , AliESD *esd) const +AliTracker *AliTRDReconstructor::CreateTracker() const { // - // Make PID + // Create a TRD tracker // - AliTRDpidESD trdPID; - trdPID.MakePID(esd); - - // - // No trigger, since we don't have the output tree for tracklets - // + //return new AliTRDtracker(NULL); + AliTRDtrackerV1 *tracker = new AliTRDtrackerV1(); + tracker->SetReconstructor(this); + return tracker; } //_____________________________________________________________________________ void AliTRDReconstructor::FillESD(TTree* /*digitsTree*/ , TTree* /*clusterTree*/ - , AliESD *esd) const + , AliESDEvent* /*esd*/) const { // - // Make PID - // - - AliTRDpidESD trdPID; - trdPID.MakePID(esd); - - // - // No trigger, since we don't have the output tree for tracklets + // Fill ESD // } + //_____________________________________________________________________________ -void AliTRDReconstructor::FillESD(AliRunLoader *runLoader - , AliESD *esd) const +void AliTRDReconstructor::SetOption(Option_t *opt) { - // - // Make PID - // - - AliTRDpidESD trdPID; - trdPID.MakePID(esd); - - // - // Trigger (tracks, GTU) - // - AliTRDtrigger trdTrigger("Trigger","Trigger class"); - - AliTRDtrigParam *trigp = new AliTRDtrigParam("TRDtrigParam" - ,"TRD Trigger parameters"); - - Float_t field = AliTracker::GetBz() * 0.1; // Tesla - AliInfo(Form("Trigger set for magnetic field = %f Tesla \n",field)); - trigp->SetField(field); - trigp->Init(); - - trdTrigger.SetParameter(trigp); - trdTrigger.SetRunLoader(runLoader); - trdTrigger.Init(); - - Int_t iEvent = runLoader->GetEventNumber(); - runLoader->GetEvent(iEvent); - trdTrigger.ReadTracklets(runLoader); - - AliESDTrdTrack *TrdTrack = new AliESDTrdTrack(); - AliTRDgtuTrack *GtuTrack; - - Int_t nTracks = trdTrigger.GetNumberOfTracks(); - for (Int_t iTrack = 0; iTrack < nTracks; iTrack++) { - - GtuTrack = trdTrigger.GetTrack(iTrack); - - TrdTrack->SetYproj(GtuTrack->GetYproj()); - TrdTrack->SetZproj(GtuTrack->GetZproj()); - TrdTrack->SetSlope(GtuTrack->GetSlope()); - TrdTrack->SetDetector(GtuTrack->GetDetector()); - TrdTrack->SetTracklets(GtuTrack->GetTracklets()); - TrdTrack->SetPlanes(GtuTrack->GetPlanes()); - TrdTrack->SetClusters(GtuTrack->GetClusters()); - TrdTrack->SetPt(GtuTrack->GetPt()); - TrdTrack->SetPhi(GtuTrack->GetPhi()); - TrdTrack->SetEta(GtuTrack->GetEta()); - TrdTrack->SetLabel(GtuTrack->GetLabel()); - TrdTrack->SetPID(GtuTrack->GetPID()); - TrdTrack->SetIsElectron(GtuTrack->IsElectron()); - - esd->AddTrdTrack(TrdTrack); - +// Read option string into the steer param. +// +// Default steer param values +// +// write clusters [cw] = true +// track seeding (stand alone tracking) [sa] = true +// PID method in reconstruction (NN) [nn] = true +// write online tracklets [tw] = false +// drift gas [ar] = false +// HLT tracking [hlt] = false +// + fSteerParam = 0x00000007; + + TString s(opt); + TObjArray *opar = s.Tokenize(","); + for(Int_t ipar=0; iparGetEntriesFast(); ipar++){ + TString sopt(((TObjString*)(*opar)[ipar])->String()); + if(sopt.Contains("!cw")){ + fSteerParam &= ~kWriteClusters; + continue; + } else if(sopt.Contains("!sa")){ + fSteerParam &= ~kSeeding; + continue; + } else if(sopt.Contains("!nn")){ + fSteerParam &= ~kSteerPID; + continue; + } else if(sopt.Contains("tw")){ + if(!sopt.Contains("!")) fSteerParam |= kWriteTracklets; + continue; + } else if(sopt.Contains("ar")){ + if(!sopt.Contains("!")) fSteerParam |= kDriftGas; + continue; + } else if(sopt.Contains("hlt")){ + if(!sopt.Contains("!")) fSteerParam |= kHLT; + continue; + } 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(); + AliTRDReconstructorTask task = kTracker; + 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::SetStreamLevel(Int_t level, AliTRDReconstructorTask task){ + // + // Set the Stream Level for one of the tasks Clusterizer, Tracker or PID + // + TString taskname; + switch(task){ + case kClusterizer: taskname = "Clusterizer"; + break; + case kTracker: taskname = "Tracker"; + break; + case kPID: taskname = "PID"; + break; + } + //AliInfo(Form("Setting Stream Level for Task %s to %d", taskname.Data(),level)); + fStreamLevel[(Int_t)task] = level; }