#include "AliRawReader.h"
#include "AliLog.h"
#include "AliFstream.h"
+#include "AliLoader.h"
#include "AliTreeLoader.h"
#include "AliTRDrawData.h"
#include "AliTRDgeometry.h"
#include "AliTRDarrayDictionary.h"
#include "AliTRDarrayADC.h"
-#include "AliTRDrawStreamBase.h"
+#include "AliTRDrawStream.h"
#include "AliTRDcalibDB.h"
#include "AliTRDSignalIndex.h"
#include "AliTRDfeeParam.h"
#include "AliTRDmcmSim.h"
#include "AliTRDtrackletWord.h"
+#include "AliTRDtrackGTU.h"
+#include "AliESDTrdTrack.h"
#include "AliTRDdigitsParam.h"
ClassImp(AliTRDrawData)
,fFee(NULL)
,fNumberOfDDLs(0)
,fTrackletTree(NULL)
- ,fTrackletContainer(NULL)
+ ,fTracklets(new TClonesArray("AliTRDtrackletWord", 1000))
+ ,fTracks(new TClonesArray("AliESDTrdTrack", 500))
,fSMindexPos(0)
,fStackindexPos(0)
,fEventCounter(0)
+ ,fTrgFlags()
+ ,fMcmSim(new AliTRDmcmSim)
,fDigitsParam(NULL)
{
//
,fFee(NULL)
,fNumberOfDDLs(0)
,fTrackletTree(NULL)
- ,fTrackletContainer(NULL)
+ ,fTracklets(new TClonesArray("AliTRDtrackletWord", 1000))
+ ,fTracks(new TClonesArray("AliESDTrdTrack", 500))
,fSMindexPos(0)
,fStackindexPos(0)
,fEventCounter(0)
+ ,fTrgFlags()
+ ,fMcmSim(new AliTRDmcmSim)
,fDigitsParam(NULL)
{
//
// Destructor
//
- if (fTrackletContainer){
- delete fTrackletContainer;
- fTrackletContainer = NULL;
- }
+ delete fTracklets;
+ delete fTracks;
+ delete fMcmSim;
}
Bool_t newEvent = kFALSE; // only for correct readout tree
Bool_t newSM = kFALSE; // new SM flag, for writing SM index words
- Bool_t newStack = kFALSE; // new stack flag, for writing stack index words
+ // Coverity
+ //Bool_t newStack = kFALSE; // new stack flag, for writing stack index words
// Get digits parameter
fDigitsParam = digitsManager->GetDigitsParam();
for (Int_t sect = 0; sect < fGeo->Nsector(); sect++) {
char name[1024];
- sprintf(name,"TRD_%d.ddl",sect + AliTRDrawStreamBase::kDDLOffset);
+ snprintf(name,1024,"TRD_%d.ddl",sect + AliTRDrawStream::kDDLOffset);
AliFstream* of = new AliFstream(name);
Bool_t bSMHasData = kFALSE;
//iwbuffer[nheader++] = 0x0001a020; // SM index words
- iwbuffer[nheader++] = 0x0044a020; // SM index words | additional SM header:48 = 1 SM header + 47 dummy words(for future use)
+ iwbuffer[nheader++] = 0x0044b020; // SM index words | additional SM header:48 = 1 SM header + 47 dummy words(for future use)
iwbuffer[nheader++] = 0x10404071; // SM header
for ( Int_t i=0; i<66; i++ ) iwbuffer[nheader++] = 0x00000000; // dummy words
iwbuffer[nheader++] = 0x10000000; // end of dummy words
if ( fgDataSuppressionLevel==0 || bSMHasData ){
iwbuffer[0] = iwbuffer[0] | bStackMask; // add stack masks to SM index word
- if (fgDataSuppressionLevel==0) iwbuffer[0] = 0x0044a03f; // no suppression : all stacks are active
+ if (fgDataSuppressionLevel==0) iwbuffer[0] = 0x0044b03f; // no suppression : all stacks are active
of->WriteBuffer((char *) iwbuffer, nheader*4);
AliDebug(11, Form("SM %d index word: %08x", sect, iwbuffer[0]));
AliDebug(11, Form("SM %d header: %08x", sect, iwbuffer[1]));
}
if ( stack==0 && layer==0 ) newSM = kTRUE; // new SM flag
- if ( layer==0 ) newStack = kTRUE; // new stack flag
+ // Coverity
+ //if ( layer==0 ) newStack = kTRUE; // new stack flag
AliDebug(15, Form("stack : %d, layer : %d, iDec : %d\n",stack,layer,iDet));
// Get the digits array
AliTRDarrayADC *digits = (AliTRDarrayADC *) digitsManager->GetDigits(iDet);
of->Seekp(hpos); // Rewind to header position
of->WriteBuffer((char *) (& header), sizeof(header));
delete of;
+
+ delete [] iwbuffer;
+
} // loop over sector(SM)
delete [] hcBuffer;
//buf[nw++] = 0x0001a03f; // SM index words
fSMindexPos = nw; // memorize position of the SM index word for re-allocating stack mask
- buf[nw++] = 0x0001a020; // SM index words
+ buf[nw++] = 0x0001b020; // SM index words
buf[nw++] = 0x10404071; // SM header
fStackindexPos = nw; // memorize position of the stack index word for future adding
AliDebug(1,Form("Producing raw data for sect=%d layer=%d stack=%d side=%d",sect,layer,stack,side));
- AliTRDmcmSim* mcm = new AliTRDmcmSim();
-
UInt_t *tempBuffer = buf; // tempBuffer used to write ADC data
// different in case of tracklet writing
if (trackletOn) {
tempBuffer = new UInt_t[maxSize];
- tempnw = new Int_t(0);
- tempof = new Int_t(0);
+ tempnw = new Int_t(0);
+ tempof = new Int_t(0);
}
WriteIntermediateWords(tempBuffer,*tempnw,*tempof,maxSize,det,side);
for (Int_t iMcmRB = 0; iMcmRB < fGeo->MCMmax(); iMcmRB++ ) {
Int_t iMcm = 16 - 4*(iMcmRB/4 + 1) + (iMcmRB%4);
- mcm->Init(det, iRob, iMcm);
- mcm->SetData(digits); // no filtering done here (already done in digitizer)
+ fMcmSim->Init(det, iRob, iMcm);
+ fMcmSim->SetData(digits); // no filtering done here (already done in digitizer)
if (trackletOn) {
- mcm->Tracklet();
- Int_t tempNw = mcm->ProduceTrackletStream(&buf[nw], maxSize - nw);
+ fMcmSim->Tracklet();
+ Int_t tempNw = fMcmSim->ProduceTrackletStream(&buf[nw], maxSize - nw);
if( tempNw < 0 ) {
of += tempNw;
nw += maxSize - nw;
nw += tempNw;
}
}
- mcm->ZSMapping(); // Calculate zero suppression mapping
+ fMcmSim->ZSMapping(); // Calculate zero suppression mapping
// at the moment it has to be rerun here
// Write MCM data to temp. buffer
- Int_t tempNw = mcm->ProduceRawStream( &tempBuffer[*tempnw], maxSize - *tempnw, fEventCounter );
+ Int_t tempNw = fMcmSim->ProduceRawStream( &tempBuffer[*tempnw], maxSize - *tempnw, fEventCounter );
if ( tempNw < 0 ) {
*tempof += tempNw;
*tempnw += maxSize - nw;
}
}
}
+ }
- delete mcm;
-
- // in case of tracklet writing copy temp data to final buffer
- if (trackletOn) {
- if (nw + *tempnw < maxSize) {
- memcpy(&buf[nw], tempBuffer, *tempnw * sizeof(UInt_t));
- nw += *tempnw;
- }
- else {
- AliError("Buffer overflow detected");
- }
- delete [] tempBuffer;
- delete tempof;
- delete tempnw;
+ // in case of tracklet writing copy temp data to final buffer
+ if (trackletOn) {
+ if (nw + *tempnw < maxSize) {
+ memcpy(&buf[nw], tempBuffer, *tempnw * sizeof(UInt_t));
+ nw += *tempnw;
+ }
+ else {
+ AliError("Buffer overflow detected");
}
- }
+ delete [] tempBuffer;
+ delete tempof;
+ delete tempnw;
+ }
+
// Write end of raw data marker
if (nw+3 < maxSize) {
buf[nw++] = fgkEndOfDataMarker;
AliTRDdigitsManager* digitsManager = new AliTRDdigitsManager();
digitsManager->CreateArrays();
- if (!fTrackletContainer) {
- const Int_t kTrackletChmb=256;
- fTrackletContainer = new UInt_t *[2];
- fTrackletContainer[0] = new UInt_t[kTrackletChmb];
- fTrackletContainer[1] = new UInt_t[kTrackletChmb];
- memset(fTrackletContainer[0], 0, kTrackletChmb*sizeof(UInt_t)); //jkl
- memset(fTrackletContainer[1], 0, kTrackletChmb*sizeof(UInt_t)); //jkl
- }
-
- AliTRDrawStreamBase *pinput = AliTRDrawStreamBase::GetRawStream(rawReader);
- AliTRDrawStreamBase &input = *pinput;
- input.SetRawVersion( fFee->GetRAWversion() ); //<= ADDED by MinJung
+ AliTRDrawStream input(rawReader);
- AliInfo(Form("Stream version: %s", input.IsA()->GetName()));
+ AliRunLoader *runLoader = AliRunLoader::Instance();
// ----- preparing tracklet output -----
- AliDataLoader *trklLoader = AliRunLoader::Instance()->GetLoader("TRDLoader")->GetDataLoader("tracklets");
+ AliDataLoader *trklLoader = runLoader->GetLoader("TRDLoader")->GetDataLoader("tracklets");
if (!trklLoader) {
- //AliInfo("Could not get the tracklets data loader, adding it now!");
trklLoader = new AliDataLoader("TRD.Tracklets.root","tracklets", "tracklets");
- AliRunLoader::Instance()->GetLoader("TRDLoader")->AddDataLoader(trklLoader);
+ runLoader->GetLoader("TRDLoader")->AddDataLoader(trklLoader);
+ }
+ if (!trklLoader) {
+ AliError("Could not get the tracklet data loader!");
+ return 0x0;
}
+ // trklLoader->SetEvent();
+ trklLoader->Load("update");
AliTreeLoader *trklTreeLoader = dynamic_cast<AliTreeLoader*> (trklLoader->GetBaseLoader("tracklets-raw"));
if (!trklTreeLoader) {
trklTreeLoader = new AliTreeLoader("tracklets-raw", trklLoader);
trklLoader->AddBaseLoader(trklTreeLoader);
}
- if (!trklTreeLoader->Tree())
+ TClonesArray *fTrackletArray = new TClonesArray("AliTRDtrackletWord", 256);
+ Int_t lastHC = -1;
+ if (trklLoader->Tree())
+ trklLoader->MakeTree();
+ TTree *trackletTree = trklTreeLoader->Tree();
+ if (!trackletTree) {
trklTreeLoader->MakeTree();
+ trackletTree = trklTreeLoader->Tree();
+ }
+ if (!trackletTree->GetBranch("hc"))
+ trackletTree->Branch("hc", &lastHC, "hc/I");
+ else
+ trackletTree->SetBranchAddress("hc", &lastHC);
+
+ if (!trackletTree->GetBranch("trkl"))
+ trackletTree->Branch("trkl", &fTrackletArray);
+ else
+ trackletTree->SetBranchAddress("trkl", &fTrackletArray);
+
+ // ----- preparing track output -----
+ AliDataLoader *trkLoader = 0x0;
+ trkLoader = runLoader->GetLoader("TRDLoader")->GetDataLoader("gtutracks");
+ if (!trkLoader) {
+ trkLoader = new AliDataLoader("TRD.GtuTracks.root","gtutracks", "gtutracks");
+ runLoader->GetLoader("TRDLoader")->AddDataLoader(trkLoader);
+ }
+ if (!trkLoader) {
+ AliError("Could not get the GTU-track data loader!");
+ return 0x0;
+ }
+ trkLoader->Load("UPDATE");
+
+ TTree *trackTree = trkLoader->Tree();
+ if (!trackTree) {
+ trkLoader->MakeTree();
+ trackTree = trkLoader->Tree();
+ }
+
+ AliTRDtrackGTU trk;
+ if (!trackTree->GetBranch("TRDtrackGTU"))
+ trackTree->Branch("TRDtrackGTU", "AliTRDtrackGTU", &trk, 32000);
+
+ // ----- read the raw data -----
+ // write the tracklets to arrays while reading raw data
+ input.SetTrackletArray(fTracklets);
+ input.SetTrackArray(fTracks);
// Loop through the digits
Int_t det = 0;
while (det >= 0)
{
- det = input.NextChamber(digitsManager,fTrackletContainer);
-
- if (*(fTrackletContainer[0]) > 0 || *(fTrackletContainer[1]) > 0) WriteTracklets(det);
+ det = input.NextChamber(digitsManager);
if (det >= 0)
{
}
}
- if (trklTreeLoader)
- trklTreeLoader->WriteData("OVERWRITE");
- if (trklLoader)
- trklLoader->UnloadAll();
-
- if (fTrackletContainer){
- delete [] fTrackletContainer[0];
- delete [] fTrackletContainer[1];
- delete [] fTrackletContainer;
- fTrackletContainer = NULL;
+ for (Int_t iSector = 0; iSector < fGeo->Nsector(); iSector++) {
+ fTrgFlags[iSector] = input.GetTriggerFlags(iSector);
}
- delete pinput;
- pinput = NULL;
+ // ----- tracklet output -----
+ fTrackletArray->Clear();
+ Int_t nTracklets = fTracklets ? fTracklets->GetEntries() : 0;
+ AliDebug(1, Form("Writing %i tracklets to loader", nTracklets));
+ for (Int_t iTracklet = 0; iTracklet < nTracklets; ++iTracklet) {
+ AliTRDtrackletWord *trkl = (AliTRDtrackletWord*) fTracklets->At(iTracklet);
+ if (trkl->GetHCId() != lastHC) {
+ if (fTrackletArray->GetEntriesFast() > 0) {
+ trackletTree->Fill();
+ fTrackletArray->Clear();
+ }
+ lastHC = trkl->GetHCId();
+ }
+ new ((*fTrackletArray)[fTrackletArray->GetEntriesFast()]) AliTRDtrackletWord(*trkl);
+ }
+ if (fTrackletArray->GetEntriesFast() > 0) {
+ trackletTree->Fill();
+ fTrackletArray->Clear();
+ }
+ trklTreeLoader->WriteData("OVERWRITE");
+ trklLoader->WriteData("OVERWRITE");
+ trklLoader->UnloadAll();
+ trklLoader->CloseFile();
+
+ // ----- track output -----
+ Int_t nTracks = fTracks ? fTracks->GetEntriesFast() : 0;
+ AliDebug(1, Form("Writing %i tracks to loader", nTracks));
+ for (Int_t iTrack = 0; iTrack < nTracks; ++iTrack) {
+ AliESDTrdTrack *trkEsd = (AliESDTrdTrack*) fTracks->At(iTrack);
+ trk = *trkEsd;
+ trackTree->Fill();
+ }
+ trkLoader->WriteData("OVERWRITE");
+ trkLoader->UnloadAll();
+ trkLoader->CloseFile();
return digitsManager;
}
x = ((kNTBin)<<26) | (bcCtr<<10) | (ptCtr<<6) | (ptPhase<<2) | 1;
if (nw < maxSize) buf[nw++] = x; else of++;
}
-
-//_____________________________________________________________________________
-Bool_t AliTRDrawData::WriteTracklets(Int_t det)
-{
- //
- // Write the raw data tracklets into seperate file
- //
-
- UInt_t **leaves = new UInt_t *[2];
- for (Int_t i=0; i<2 ;i++){
- leaves[i] = new UInt_t[258];
- leaves[i][0] = det; // det
- leaves[i][1] = i; // side
- memcpy(leaves[i]+2, fTrackletContainer[i], sizeof(UInt_t) * 256);
- }
-
- if (!fTrackletTree){
- AliDataLoader *dl = fRunLoader->GetLoader("TRDLoader")->GetDataLoader("tracklets");
- dl->MakeTree();
- fTrackletTree = dl->Tree();
- }
-
- TBranch *trkbranch = fTrackletTree->GetBranch("trkbranch");
- if (!trkbranch) {
- trkbranch = fTrackletTree->Branch("trkbranch",leaves[0],"det/i:side/i:tracklets[256]/i");
- }
-
- for (Int_t i=0; i<2; i++){
- if (leaves[i][2]>0) {
- trkbranch->SetAddress(leaves[i]);
- fTrackletTree->Fill();
- }
- }
-
- // AliDataLoader *dl = fRunLoader->GetLoader("TRDLoader")->GetDataLoader("tracklets"); //jkl: wrong
- // dl->WriteData("OVERWRITE"); //jkl: wrong
- //dl->Unload();
- delete [] leaves;
-
- return kTRUE;
-}