X-Git-Url: http://git.uio.no/git/?a=blobdiff_plain;f=TRD%2FAliTRDgtuSim.cxx;h=94058d4e62a66062f00c27138dce964440a3e1d2;hb=e546b023ff9f98d42ec24154cbe51f77a5b0feca;hp=91d0c619c43d9ac09d38ae0347fecb97fc2776a6;hpb=2cf674351347286483ab084df9cf55270af938e8;p=u%2Fmrichter%2FAliRoot.git diff --git a/TRD/AliTRDgtuSim.cxx b/TRD/AliTRDgtuSim.cxx index 91d0c619c43..94058d4e62a 100644 --- a/TRD/AliTRDgtuSim.cxx +++ b/TRD/AliTRDgtuSim.cxx @@ -29,6 +29,7 @@ #include "TFile.h" #include "TROOT.h" +#include "TObject.h" #include "TClonesArray.h" #include "AliRun.h" @@ -37,6 +38,7 @@ #include "AliTreeLoader.h" #include "AliLog.h" #include "AliESDTrdTrack.h" +#include "AliESDTrdTracklet.h" #include "AliTRDgtuSim.h" #include "AliTRDfeeParam.h" @@ -48,141 +50,144 @@ ClassImp(AliTRDgtuSim) -AliTRDgtuSim::AliTRDgtuSim(AliRunLoader *rl) +AliTRDgtuSim::AliTRDgtuSim(AliRunLoader *rl) : TObject(), fRunLoader(rl), fFeeParam(AliTRDfeeParam::Instance()), fTMU(0x0), - fTrackletArray(0x0), - fTrackTree(0x0), - fTrackletTree(0x0) + fTrackletArray(0x0) { - fTrackletTree = new TTree("gtutracklets", "Tree with GTU tracklets"); - fTrackletTree->SetDirectory(0); + } -AliTRDgtuSim::~AliTRDgtuSim() +AliTRDgtuSim::~AliTRDgtuSim() { // destructor if (fTrackletArray) - fTrackletArray->Delete(); + fTrackletArray->Clear(); delete fTrackletArray; - delete fTrackletTree; } -Bool_t AliTRDgtuSim::RunGTUFromTrackletFile(TString filename, Int_t event, Int_t noev) +Bool_t AliTRDgtuSim::RunGTUFromTrackletFile(TString filename, Int_t event, Int_t noev) { - // run the GTU from a file of tracklets + // run the GTU from a file of tracklets // used for comparison to VHDL simulation - AliInfo(Form("Running the GTU simulation on file: %s", filename.Data())); - ifstream input(filename.Data()); - - std::string str; - TString string; - int lineno = 0; - - Int_t iEventPrev = -1; - Int_t iStackPrev = -1; - Int_t iSecPrev = -1; - Int_t iSec = -1; - Int_t iStack = -1; - Int_t iLink = -1; - Int_t iEvent = -1; - Int_t evcnt = -1; - - fTMU = 0x0; - - AliDebug(5,"--------- Reading from file ----------"); - while (getline(input, str)) { - lineno++; - string = str; - AliDebug(5,Form("Line %i : %s", lineno, string.Data())); - - TObjArray *tokens = string.Tokenize(" "); - if (tokens->GetEntriesFast() < 7) { - AliWarning(Form("Invalid input in line %i, too few parameters", lineno)); - continue; - } + ifstream input(filename.Data()); - if ( ((TObjString*) tokens->At(0))->GetString().Atoi() < event) - continue; + std::string str; + TString string; + int lineno = 0; - iEvent = ((TObjString*) tokens->At(0))->GetString().Atoi(); - iSec = ((TObjString*) tokens->At(1))->GetString().Atoi(); - iStack = ((TObjString*) tokens->At(2))->GetString().Atoi(); - iLink = 2 * ((TObjString*) tokens->At(3))->GetString().Atoi() + ((TObjString*) tokens->At(4))->GetString().Atoi(); + Int_t iEventPrev = -1; + Int_t iStackPrev = -1; + Int_t iSecPrev = -1; + Int_t iSec = -1; + Int_t iStack = -1; + Int_t iLink = -1; + Int_t iEvent = -1; + Int_t evcnt = -1; - if (iEvent != iEventPrev || iStack != iStackPrev || iSec != iSecPrev) { - if(fTMU) { - TList *listOfTracks = new TList(); - fTMU->SetStack(iStackPrev); - fTMU->SetSector(iSecPrev); - fTMU->RunTMU(listOfTracks); - AliDebug(1,Form("--- There are %i tracks. Writing ...", listOfTracks->GetEntries())); - WriteTracksToTree(listOfTracks); - fTMU->WriteTrackletsToTree(fTrackletTree); - WriteTracksToLoader(listOfTracks); - WriteTracksToDataFile(listOfTracks, iEventPrev); - if (listOfTracks->GetEntries() > 0) - AliDebug(2,Form(" %4.1f GeV/c", ((AliTRDtrackGTU*) listOfTracks->At(0))->GetPt() )); - delete fTMU; - fTMU = new AliTRDgtuTMU(); - delete listOfTracks; - listOfTracks = 0x0; - } else { - fTMU = new AliTRDgtuTMU(); - } - iStackPrev = iStack; - iSecPrev = iSec; - iEventPrev = iEvent; - evcnt++; - if (evcnt == noev) - break; - } - for (Int_t i = 5; i < tokens->GetEntriesFast(); i++) { - UInt_t trackletWord = 0; - sscanf(((TObjString*) tokens->At(i))->GetString().Data(), "%i", &trackletWord); - if (trackletWord == 0x10001000) - break; - AliDebug(2,Form("%i. tracklet: %s -> 0x%08x", i-4, ((TObjString*) tokens->At(i))->GetString().Data(), trackletWord)); - AliTRDtrackletWord *trkl = new AliTRDtrackletWord(trackletWord); - if (fTMU) - fTMU->AddTracklet(trkl, iLink); - } + fTMU = 0x0; + + TClonesArray trklArray("AliTRDtrackletWord", 100); + TClonesArray trklArrayGTU("AliTRDtrackletGTU", 100); + + AliDebug(1, Form("--------- Reading from %s ----------", filename.Data())); + while (getline(input, str)) { + lineno++; + string = str; + + TObjArray *tokens = string.Tokenize(" "); + if (tokens->GetEntriesFast() < 7) { + AliWarning(Form("Invalid input in line %i, too few parameters", lineno)); + continue; } - - if (fTMU && evcnt < noev) { + + if ( ((TObjString*) tokens->At(0))->GetString().Atoi() < event) + continue; + + iEvent = ((TObjString*) tokens->At(0))->GetString().Atoi(); + iSec = ((TObjString*) tokens->At(1))->GetString().Atoi(); + iStack = ((TObjString*) tokens->At(2))->GetString().Atoi(); + iLink = 2 * ((TObjString*) tokens->At(3))->GetString().Atoi() + ((TObjString*) tokens->At(4))->GetString().Atoi(); + + if ((iEvent != iEventPrev) || + (iStack != iStackPrev) || + (iSec != iSecPrev)) { + if(fTMU) { TList *listOfTracks = new TList(); fTMU->SetStack(iStackPrev); fTMU->SetSector(iSecPrev); fTMU->RunTMU(listOfTracks); - WriteTracksToTree(listOfTracks); - fTMU->WriteTrackletsToTree(fTrackletTree); - WriteTracksToLoader(listOfTracks); + AliDebug(1,Form("--- There are %i tracks. Writing ...", listOfTracks->GetEntries())); WriteTracksToDataFile(listOfTracks, iEventPrev); + if (listOfTracks->GetEntries() > 0) + AliDebug(2,Form(" %4.1f GeV/c", ((AliTRDtrackGTU*) listOfTracks->At(0))->GetPt() )); delete fTMU; + fTMU = new AliTRDgtuTMU(); delete listOfTracks; - fTMU = 0x0; + listOfTracks = 0x0; + } else { + fTMU = new AliTRDgtuTMU(); + } + iStackPrev = iStack; + iSecPrev = iSec; + iEventPrev = iEvent; + evcnt++; + if (evcnt == noev) + break; + } + for (Int_t i = 5; i < tokens->GetEntriesFast(); i++) { + UInt_t trackletWord = 0; + sscanf(((TObjString*) tokens->At(i))->GetString().Data(), "%i", &trackletWord); + if (trackletWord == 0x10001000) + break; + AliDebug(2, Form("link: %2i trkl: %2i - %s -> 0x%08x", + iLink, i-4, ((TObjString*) tokens->At(i))->GetString().Data(), trackletWord)); + AliTRDtrackletWord *tracklet = new (trklArray[trklArray.GetEntriesFast()]) AliTRDtrackletWord(trackletWord); + AliTRDtrackletGTU *trkl = new (trklArrayGTU[trklArrayGTU.GetEntriesFast()]) AliTRDtrackletGTU(tracklet); + if (fTMU) + fTMU->AddTracklet(trkl, iLink); } + } - AliInfo(Form("Analyzed %i events", evcnt)); - return kTRUE; + if (fTMU && evcnt < noev) { + TList *listOfTracks = new TList(); + fTMU->SetStack(iStackPrev); + fTMU->SetSector(iSecPrev); + fTMU->RunTMU(listOfTracks); + WriteTracksToDataFile(listOfTracks, iEventPrev); + delete fTMU; + delete listOfTracks; + fTMU = 0x0; + } + + AliInfo(Form("Analyzed %i events", evcnt)); + return kTRUE; } -Bool_t AliTRDgtuSim::RunGTU(AliLoader *loader, AliESDEvent *esd) +Bool_t AliTRDgtuSim::RunGTU(AliLoader *loader, AliESDEvent *esd) { // run the GTU on tracklets taken from the loader - // if specified the GTU tracks are written to the ESD event + // if specified the GTU tracks are written to the ESD event if (!fFeeParam->GetTracklet()) return kFALSE; + if (fTrackletArray) + fTrackletArray->Clear(); + + if (loader) { if (!LoadTracklets(loader)) { AliError("Could not load the tracklets. Nothing done ..."); return kFALSE; } + } + else { + LoadTracklets(esd); + } AliDebug(1, Form("running on %i tracklets", fTrackletArray->GetEntriesFast())); @@ -196,24 +201,21 @@ Bool_t AliTRDgtuSim::RunGTU(AliLoader *loader, AliESDEvent *esd) delete fTMU; fTMU = 0x0; } - + TList *listOfTracks = new TList(); - + TIter next(fTrackletArray); - AliTRDtrackletBase *trkl; - while ((trkl = (AliTRDtrackletBase*) next())) { + while (AliTRDtrackletGTU *trkl = (AliTRDtrackletGTU*) next()) { iSec = trkl->GetDetector() / 30; iStack = (trkl->GetDetector() % 30) / 6; - iLink = 2 * (trkl->GetDetector() % 6) + (trkl->GetYbin() < 0 ? 0 : 1); + iLink = trkl->GetHCId() % 12; if (iStack != iStackPrev || iSec != iSecPrev) { if(fTMU) { fTMU->SetStack(iStackPrev); fTMU->SetSector(iSecPrev); fTMU->RunTMU(listOfTracks); - WriteTracksToTree(listOfTracks); - fTMU->WriteTrackletsToTree(fTrackletTree); WriteTracksToLoader(listOfTracks); WriteTracksToESD(listOfTracks, esd); fTMU->Reset(); @@ -223,18 +225,19 @@ Bool_t AliTRDgtuSim::RunGTU(AliLoader *loader, AliESDEvent *esd) } iStackPrev = iStack; iSecPrev = iSec; + AliDebug(1, Form("now in sec %i, stack %i", iSec, iStack)); } - AliDebug(1, Form("adding tracklet: 0x%08x", trkl->GetTrackletWord())); - if (fTMU) + AliDebug(1, Form("adding tracklet: 0x%08x in sec %i stack %i link %i", + trkl->GetTrackletWord(), trkl->GetDetector() / 30, (trkl->GetDetector() % 30) / 6, trkl->GetHCId() % 12)); + if (fTMU) { fTMU->AddTracklet(trkl, iLink); + } } - + if (fTMU) { fTMU->SetStack(iStackPrev); fTMU->SetSector(iSecPrev); fTMU->RunTMU(listOfTracks); - WriteTracksToTree(listOfTracks); - fTMU->WriteTrackletsToTree(fTrackletTree); WriteTracksToLoader(listOfTracks); WriteTracksToESD(listOfTracks, esd); delete fTMU; @@ -247,7 +250,22 @@ Bool_t AliTRDgtuSim::RunGTU(AliLoader *loader, AliESDEvent *esd) return kTRUE; } -Bool_t AliTRDgtuSim::LoadTracklets(AliLoader *const loader) +Bool_t AliTRDgtuSim::LoadTracklets(const AliESDEvent *const esd) +{ + AliDebug(1,"Loading tracklets from ESD event ..."); + + if (!fTrackletArray) + fTrackletArray = new TClonesArray("AliTRDtrackletGTU", 1000); + + for (Int_t iTracklet = 0; iTracklet < esd->GetNumberOfTrdTracklets(); iTracklet++) { + AliESDTrdTracklet *trkl = esd->GetTrdTracklet(iTracklet); + new ((*fTrackletArray)[fTrackletArray->GetEntries()]) AliTRDtrackletGTU(trkl); + } + + return kTRUE; +} + +Bool_t AliTRDgtuSim::LoadTracklets(AliLoader *const loader) { // load the tracklets using the given loader @@ -276,20 +294,14 @@ Bool_t AliTRDgtuSim::LoadTracklets(AliLoader *const loader) TBranch *trklbranch = trackletTree->GetBranch("mcmtrklbranch"); if (trklbranch) { if (!fTrackletArray) - fTrackletArray = new TClonesArray("AliTRDtrackletMCM", 1000); - else if ((TClass::GetClass("AliTRDtrackletMCM"))->InheritsFrom(fTrackletArray->Class())) - fTrackletArray->Delete(); - else { - fTrackletArray->Delete(); - delete fTrackletArray; - fTrackletArray = new TClonesArray("AliTRDtrackletMCM", 1000); - } + fTrackletArray = new TClonesArray("AliTRDtrackletGTU", 1000); - AliTRDtrackletMCM *trkl = new AliTRDtrackletMCM; + AliTRDtrackletMCM *trkl = 0x0; trklbranch->SetAddress(&trkl); for (Int_t iTracklet = 0; iTracklet < trklbranch->GetEntries(); iTracklet++) { trklbranch->GetEntry(iTracklet); - new ((*fTrackletArray)[fTrackletArray->GetEntries()]) AliTRDtrackletMCM(*trkl); + new ((*fTrackletArray)[fTrackletArray->GetEntries()]) AliTRDtrackletGTU(new AliTRDtrackletMCM(*trkl)); + ((AliTRDtrackletGTU *)((*fTrackletArray)[fTrackletArray->GetEntries()-1]))->SetMCMtrackletIndex(iTracklet); } return kTRUE; } @@ -301,16 +313,9 @@ Bool_t AliTRDgtuSim::LoadTracklets(AliLoader *const loader) if (trackletTree) { if (!fTrackletArray) - fTrackletArray = new TClonesArray("AliTRDtrackletWord", 1000); - else if ((TClass::GetClass("AliTRDtrackletWord"))->InheritsFrom(fTrackletArray->Class())) - fTrackletArray->Delete(); - else { - fTrackletArray->Delete(); - delete fTrackletArray; - fTrackletArray = new TClonesArray("AliTRDtrackletWord", 1000); - } - - Int_t hc; + fTrackletArray = new TClonesArray("AliTRDtrackletGTU", 1000); + + Int_t hc; TClonesArray *ar = 0x0; trackletTree->SetBranchAddress("hc", &hc); trackletTree->SetBranchAddress("trkl", &ar); @@ -320,18 +325,18 @@ Bool_t AliTRDgtuSim::LoadTracklets(AliLoader *const loader) AliDebug(2, Form("%i tracklets in HC %i", ar->GetEntriesFast(), hc)); for (Int_t iTracklet = 0; iTracklet < ar->GetEntriesFast(); iTracklet++) { AliTRDtrackletWord *trklWord = (AliTRDtrackletWord*) (*ar)[iTracklet]; - new((*fTrackletArray)[fTrackletArray->GetEntriesFast()]) AliTRDtrackletWord(trklWord->GetTrackletWord(), hc); + new((*fTrackletArray)[fTrackletArray->GetEntriesFast()]) AliTRDtrackletGTU(new AliTRDtrackletWord(trklWord->GetTrackletWord(), hc)); } } return kTRUE; } - + AliError("No raw tracklet tree found\n"); return kFALSE; } -Bool_t AliTRDgtuSim::WriteTracksToDataFile(TList *listOfTracks, Int_t event) +Bool_t AliTRDgtuSim::WriteTracksToDataFile(TList *listOfTracks, Int_t event) { // write the found tracks to a data file // used for comparison to VHDL simulation @@ -343,73 +348,49 @@ Bool_t AliTRDgtuSim::WriteTracksToDataFile(TList *listOfTracks, Int_t event) out = fopen("test.data", "a"); AliDebug(1,Form("%i tracks found in event %i", listOfTracks->GetSize(), event)); - fprintf(out, "0 %5i %2i %i 00000000\n", event, sm, stack); + // fprintf(out, "0 %5i %2i %i 00000000\n", event, sm, stack); for (Int_t i = 0; i < listOfTracks->GetSize(); i++) { AliTRDtrackGTU *trk = (AliTRDtrackGTU*) listOfTracks->At(i); sm = trk->GetSector(); stack = trk->GetStack(); - fprintf(out, "1 %5i %2i %2i %3i %3i %3i %3i %3i %3i %3i %4i %f\n", event, sm, stack, trk->GetTrackletMask(), - trk->GetTrackletIndex(5), - trk->GetTrackletIndex(4), - trk->GetTrackletIndex(3), - trk->GetTrackletIndex(2), - trk->GetTrackletIndex(1), + + ULong64_t trackWord = 1; + AppendBits(trackWord, 1, 0); + AppendBits(trackWord, 6, trk->GetTrackletMask()); + AppendBits(trackWord, 18, (Int_t) trk->GetA()); + AppendBits(trackWord, 18, (Int_t) trk->GetB()); + AppendBits(trackWord, 12, (Int_t) trk->GetC()); + AppendBits(trackWord, 8, trk->GetPID()); + fprintf(out, "ev. %i sec. %i stack %i - track word: 0x%016llx, ", + event, sm, stack, trackWord); + + trackWord = 0; + AppendBits(trackWord, 11, 0); // flags + AppendBits(trackWord, 3, 0); + AppendBits(trackWord, 13, trk->GetYapprox()); + AppendBits(trackWord, 6, trk->GetTrackletIndex(5)); + AppendBits(trackWord, 6, trk->GetTrackletIndex(4)); + AppendBits(trackWord, 6, trk->GetTrackletIndex(3)); + AppendBits(trackWord, 6, trk->GetTrackletIndex(2)); + AppendBits(trackWord, 6, trk->GetTrackletIndex(1)); + AppendBits(trackWord, 6, trk->GetTrackletIndex(0)); + fprintf(out, "extended track word: 0x%016llx\n", trackWord); + + fprintf(out, "1 %5i %2i %2i %3i %3i %3i %3i %3i %3i %3i %4i %f\n", event, sm, stack, trk->GetTrackletMask(), + trk->GetTrackletIndex(5), + trk->GetTrackletIndex(4), + trk->GetTrackletIndex(3), + trk->GetTrackletIndex(2), + trk->GetTrackletIndex(1), trk->GetTrackletIndex(0), - trk->GetPtInt(), + trk->GetPtInt(), trk->GetPt()); } fclose(out); return kTRUE; } -Bool_t AliTRDgtuSim::WriteTracksToTree(TList *listOfTracks, Int_t /*event*/) -{ - // write the tracks to the tree for intermediate storage - - AliDebug(1,Form("Writing %i tracks to the tree...", listOfTracks->GetEntries())); - - if (!listOfTracks) - return kFALSE; - - if (listOfTracks->GetEntries() <= 0) - return kTRUE; - - if (!fTrackTree) { - fTrackTree = new TTree("gtutracks", "GTU tracks"); - fTrackTree->SetDirectory(0); - } - - AliTRDtrackGTU *trk = 0x0; - TBranch *branch = fTrackTree->GetBranch("TRDgtuTrack"); - if (!branch) { - branch = fTrackTree->Branch("TRDgtuTrack", "AliTRDtrackGTU", &trk, 32000, 99); - } - - TIter next(listOfTracks); - while ((trk = (AliTRDtrackGTU*) next())) { - trk->CookLabel(); - branch->SetAddress(&trk); - fTrackTree->Fill(); - } - fTrackTree->ResetBranchAddress(branch); - - return kTRUE; -} - -Bool_t AliTRDgtuSim::WriteTreesToFile() const { - // write the trees holding tracklets and tracks to file - - TFile *f = TFile::Open("TRD.GtuTracking.root", "RECREATE"); - f->cd(); - if (fTrackTree) - f->WriteTObject(fTrackTree); - if (fTrackletTree) - f->WriteTObject(fTrackletTree); - f->Close(); - return kTRUE; -} - -Bool_t AliTRDgtuSim::WriteTracksToESD(const TList * const listOfTracks, AliESDEvent *esd) +Bool_t AliTRDgtuSim::WriteTracksToESD(const TList * const listOfTracks, AliESDEvent *esd) { // fill the found tracks to the given ESD event @@ -431,11 +412,6 @@ Bool_t AliTRDgtuSim::WriteTracksToLoader(const TList * const listOfTracks) // write the GTU tracks to the dedicated loader // these tracks contain more information than the ones in the ESD - if (!fTrackTree) { - AliDebug(1, "No track tree found!"); - return kFALSE; - } - AliRunLoader *rl = AliRunLoader::Instance(); AliDataLoader *dl = 0x0; if (rl) @@ -450,14 +426,15 @@ Bool_t AliTRDgtuSim::WriteTracksToLoader(const TList * const listOfTracks) dl->MakeTree(); trackTree = dl->Tree(); } - + AliTRDtrackGTU *trk = 0x0; if (!trackTree->GetBranch("TRDtrackGTU")) trackTree->Branch("TRDtrackGTU", "AliTRDtrackGTU", &trk, 32000); - + + AliDebug(1, Form("Writing %i tracks to loader", listOfTracks->GetEntries())); TIter next(listOfTracks); - while (trk = (AliTRDtrackGTU*) next()) { + while ((trk = (AliTRDtrackGTU*) next())) { trackTree->SetBranchAddress("TRDtrackGTU", &trk); trackTree->Fill(); }