X-Git-Url: http://git.uio.no/git/?a=blobdiff_plain;f=TRD%2FAliTRDReconstructor.cxx;h=146debd82b8722e9cd40c27aca209f3ed3b29a8a;hb=215f7116726a8b1b11646c3d0a1be6b7b4710ec5;hp=d48f229f9b1e7f20db09fb73eebcf2ff59e224bf;hpb=b0f03c34677e72bdb6179760151b12ff32ae3a2d;p=u%2Fmrichter%2FAliRoot.git diff --git a/TRD/AliTRDReconstructor.cxx b/TRD/AliTRDReconstructor.cxx index d48f229f9b1..146debd82b8 100644 --- a/TRD/AliTRDReconstructor.cxx +++ b/TRD/AliTRDReconstructor.cxx @@ -1,105 +1,307 @@ /************************************************************************** - * 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$ */ /////////////////////////////////////////////////////////////////////////////// // // -// class for TRD reconstruction // +// Class for TRD reconstruction // // // /////////////////////////////////////////////////////////////////////////////// +#include +#include +#include +#include -#include "AliTRDReconstructor.h" #include "AliRunLoader.h" -#include "AliTRDparameter.h" -#include "AliTRDclusterizerV1.h" +#include "AliRawReader.h" +#include "AliLog.h" +#include "AliESDTrdTrack.h" +#include "AliESDEvent.h" + +#include "AliTRDReconstructor.h" +#include "AliTRDclusterizer.h" #include "AliTRDtracker.h" #include "AliTRDpidESD.h" -#include +#include "AliTRDgtuTrack.h" +#include "AliTRDrawData.h" +#include "AliTRDdigitsManager.h" +#include "AliTRDtrackerV1.h" +#include "AliTRDrecoParam.h" +#define SETFLG(n,f) ((n) |= f) +#define CLRFLG(n,f) ((n) &= ~f) ClassImp(AliTRDReconstructor) - +TClonesArray *AliTRDReconstructor::fgClusters = 0x0; //_____________________________________________________________________________ -void AliTRDReconstructor::Reconstruct(AliRunLoader* runLoader) const +AliTRDReconstructor::AliTRDReconstructor() + :AliReconstructor() + ,fSteerParam(0) { -// reconstruct clusters + // setting default "ON" steering parameters + // write clusters [cw] + SETFLG(fSteerParam, kWriteClusters); + // track seeding (stand alone tracking) [sa] + SETFLG(fSteerParam, kSeeding); + // PID method in reconstruction (NN) [nn] + SETFLG(fSteerParam, kSteerPID); - AliLoader *loader=runLoader->GetLoader("TRDLoader"); - loader->LoadRecPoints("recreate"); + 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 +} - AliTRDclusterizerV1 clusterer("clusterer", "TRD clusterizer"); - runLoader->CdGAFile(); - AliTRDparameter* trdParam = GetTRDparameter(runLoader); - if (!trdParam) { - Error("Reconstruct", "no TRD parameters found"); - return; - } - trdParam->ReInit(); - clusterer.SetParameter(trdParam); - Int_t nEvents = runLoader->GetNumberOfEvents(); - - for (Int_t iEvent = 0; iEvent < nEvents; iEvent++) { - clusterer.Open(runLoader->GetFileName(), iEvent); - clusterer.ReadDigits(); - clusterer.MakeClusters(); - clusterer.WriteClusters(-1); +//_____________________________________________________________________________ +AliTRDReconstructor::AliTRDReconstructor(const AliTRDReconstructor &r) + :AliReconstructor(r) + ,fSteerParam(r.fSteerParam) +{ + memcpy(fStreamLevel, r.fStreamLevel, 5*sizeof(UChar_t)); + memcpy(fTCParams, r.fTCParams, 8*sizeof(Double_t)); +} + +//_____________________________________________________________________________ +AliTRDReconstructor::~AliTRDReconstructor() +{ + if(fgClusters) { + fgClusters->Delete(); delete fgClusters; } +} + - loader->UnloadRecPoints(); +//_____________________________________________________________________________ +void AliTRDReconstructor::Init(){ + // + // Init Options + // + SetOption(GetOption()); + + AliInfo("TRD reconstruction will use the following settings:"); + printf("\tDigitsConversion [dc] : %s\n", fSteerParam&kDigitsConversion?"yes":"no"); + 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("\tCosmic Reconstruction [cos] : %s\n", fSteerParam&kCosmic?"yes":"no"); + printf("\tNN PID [nn] : %s\n", fSteerParam&kSteerPID?"yes":"no"); + printf("\t8 dEdx slices in ESD [8s] : %s\n", fSteerParam&kEightSlices?"yes":"no"); + printf("\tStreaming Levels : Clusterizer[%d] Tracker[%d] PID[%d]\n", fStreamLevel[kClusterizer], fStreamLevel[kTracker], fStreamLevel[kPID]); } //_____________________________________________________________________________ -AliTracker* AliTRDReconstructor::CreateTracker(AliRunLoader* runLoader) const +void AliTRDReconstructor::ConvertDigits(AliRawReader *rawReader + , TTree *digitsTree) const { -// create a TRD tracker + // + // Convert raw data digits into digit objects in a root tree + // + + AliInfo("Convert raw data digits into digit objects [RawReader -> Digit TTree]"); + + AliTRDrawData rawData; + rawReader->Reset(); + rawReader->Select("TRD"); + AliTRDdigitsManager *manager = rawData.Raw2Digits(rawReader); + manager->MakeBranch(digitsTree); + manager->WriteDigits(); + delete manager; - runLoader->CdGAFile(); - return new AliTRDtracker(gFile); } //_____________________________________________________________________________ -void AliTRDReconstructor::FillESD(AliRunLoader* /*runLoader*/, - AliESD* esd) const +void AliTRDReconstructor::Reconstruct(AliRawReader *rawReader + , TTree *clusterTree) const { -// make PID - - Double_t parTRD[] = { - 187., // Min. Ionizing Particle signal. Check it !!! - 0.23, // relative resolution Check it !!! - 10. // PID range (in sigmas) - }; - AliTRDpidESD trdPID(parTRD); - trdPID.MakePID(esd); + // + // Reconstruct clusters + // + + //AliInfo("Reconstruct TRD clusters from RAW data [RawReader -> Cluster TTree]"); + + + 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); } +//_____________________________________________________________________________ +void AliTRDReconstructor::Reconstruct(TTree *digitsTree + , TTree *clusterTree) const +{ + // + // Reconstruct clusters + // + + //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(); + + if(IsWritingClusters()) return; + + // take over ownership of clusters + fgClusters = clusterer.RecPoints(); + clusterer.SetClustersOwner(kFALSE); +} //_____________________________________________________________________________ -AliTRDparameter* AliTRDReconstructor::GetTRDparameter(AliRunLoader* runLoader) const +AliTracker *AliTRDReconstructor::CreateTracker() const { -// get the TRD parameters + // + // Create a TRD tracker + // + + //return new AliTRDtracker(NULL); + AliTRDtrackerV1 *tracker = new AliTRDtrackerV1(); + tracker->SetReconstructor(this); + return tracker; + +} + +//_____________________________________________________________________________ +void AliTRDReconstructor::FillESD(TTree* /*digitsTree*/ + , TTree* /*clusterTree*/ + , AliESDEvent* /*esd*/) const +{ + // + // Fill ESD + // - runLoader->CdGAFile(); - AliTRDparameter* trdParam = (AliTRDparameter*) gFile->Get("TRDparameter"); - if (!trdParam) { - Error("GetTRDparameter", "no TRD parameters available"); - return NULL; - } - return trdParam; } +//_____________________________________________________________________________ +void AliTRDReconstructor::SetOption(Option_t *opt) +{ +// 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(); + 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; +}