// @(#) $Id$ // Author: Uli Frankenfeld , Anders Vestbo , C. Loizides //*-- Copyright © ALICE HLT Group #include "AliL3StandardIncludes.h" #include #include #ifdef use_newio #include #include #endif #include #include #include #include #include #include #include "AliL3Logging.h" #include "AliL3Transform.h" #include "AliL3MemHandler.h" #include "AliL3DigitData.h" #include "AliL3TrackSegmentData.h" #include "AliL3SpacePointData.h" #include "AliL3TrackArray.h" #include "AliL3FileHandler.h" #if __GNUC__ == 3 using namespace std; #endif /** \class AliL3FileHandler
//_____________________________________________________________
// AliL3FileHandler
//
// The HLT ROOT <-> binary files handling class
//
// This class provides the interface between AliROOT files,
// and HLT binary files. It should be used for converting 
// TPC data stored in AliROOT format (outputfile from a simulation),
// into the data format currently used by in the HLT framework. 
// This enables the possibility to always use the same data format, 
// whether you are using a binary file as an input, or a AliROOT file.
//
// For example on how to create binary files from a AliROOT simulation,
// see example macro exa/Binary.C.
//
// For reading a AliROOT file into HLT format in memory, do the following:
//
// AliL3FileHandler file;
// file.Init(slice,patch);
// file.SetAliInput("galice.root");
// AliL3DigitRowData *dataPt = (AliL3DigitRowData*)file.AliDigits2Memory(nrows,eventnr);
// 
// All the data are then stored in memory and accessible via the pointer dataPt.
// Accesing the data is then identical to the example 1) showed in AliL3MemHandler class.
//
// For converting the data back, and writing it to a new AliROOT file do:
//
// AliL3FileHandler file;
// file.Init(slice,patch);
// file.SetAliInput("galice.root");
// file.Init(slice,patch,NumberOfRowsInPatch);
// file.AliDigits2RootFile(dataPt,"new_galice.root");
// file.CloseAliInput();
*/ ClassImp(AliL3FileHandler) // of course on start up the index is not created Bool_t AliL3FileHandler::fgStaticIndexCreated=kFALSE; Int_t AliL3FileHandler::fgStaticIndex[36][159]; void AliL3FileHandler::CleanStaticIndex() { // use this static call to clean static index after // running over one event for(Int_t i=0;i> fgStaticIndex[i][j]; } file.close(); fgStaticIndexCreated=kTRUE; return 0; } AliL3FileHandler::AliL3FileHandler(Bool_t b) { //Default constructor fInAli = 0; #ifdef use_newio fUseRunLoader = kFALSE; #endif fParam = 0; fMC =0; fDigits=0; fDigitsTree=0; fIndexCreated=kFALSE; fUseStaticIndex=b; for(Int_t i=0;iDelete(); #endif fDigitsTree=0; for(Int_t i=0;iCdGAFile(); fParam = AliTPC::LoadTPCParam(gFile); if(!fParam){ LOG(AliL3Log::kWarning,"AliL3FileHandler::SetAliInput","File") <<"No TPC parameters found in \""<GetName() <<"\", creating standard parameters " <<"which might not be what you want!"<GetName()<IsOpen()){ LOG(AliL3Log::kError,"AliL3FileHandler::SetAliInput","File Open") <<"Ali File "<GetName()<<" does not exist"<Get(AliL3Transform::GetParamName()); if(!fParam){ LOG(AliL3Log::kWarning,"AliL3FileHandler::SetAliInput","File") <<"No TPC parameters found in \""<GetName() <<"\", creating standard parameters " <<"which might not be what you want!"<GetName()<IsOpen()) fInAli->Close(); #endif delete fInAli; fInAli = 0; } Bool_t AliL3FileHandler::IsDigit(Int_t event) { //Check if there is a TPC digit tree in the current file. //Return kTRUE if tree was found, and kFALSE if not found. if(!fInAli){ LOG(AliL3Log::kWarning,"AliL3FileHandler::IsDigit","File") <<"Pointer to fInAli = 0x0 "<GetLoader("TPCLoader"); if(!tpcLoader){ LOG(AliL3Log::kWarning,"AliL3FileHandlerNewIO::IsDigit","File") <<"Pointer to AliLoader for TPC = 0x0 "<GetEvent(event); tpcLoader->LoadDigits(); TTree *t=tpcLoader->TreeD(); #else Char_t name[1024]; sprintf(name,"TreeD_%s_%d",AliL3Transform::GetParamName(),event); TTree *t=(TTree*)fInAli->Get(name); #endif if(t){ LOG(AliL3Log::kInformational,"AliL3FileHandlerNewIO::IsDigit","File Type") <<"Found Digit Tree -> Use Fast Cluster Finder"< Use Cluster Tree"<GetEntries(); n++) { Int_t sector, row; Int_t lslice,lrow; fDigitsTree->GetEvent(n); fParam->AdjustSectorRow(fDigits->GetID(),sector,row); if(!AliL3Transform::Sector2Slice(lslice,lrow,sector,row)){ LOG(AliL3Log::kError,"AliL3FileHandler::CreateIndex","Slice/Row") <IsOpen()){ LOG(AliL3Log::kWarning,"AliL3FileHandler::AliDigits2Memory","File") <<"No Input avalible: TFile not opened"<GetEntries(); if(entries==0) { LOG(AliL3Log::kWarning,"AliL3FileHandler::AliDigits2Memory","ndigits") <<"No TPC digits (entries==0)!"<fRow = r; tempPt->fNDigit = 0; tempPt++; } return data; } Int_t * ndigits = new Int_t[entries]; Float_t xyz[3]; for(Int_t r=fRowMin;r<=fRowMax;r++){ Int_t n=fIndex[fSlice][r]; if(n!=-1){ //data on that row fDigitsTree->GetEvent(n); fParam->AdjustSectorRow(fDigits->GetID(),sector,row); AliL3Transform::Sector2Slice(lslice,lrow,sector,row); if(lrow!=r){ LOG(AliL3Log::kError,"AliL3FileHandler::AliDigits2Memory","Row") <First(); do { time=fDigits->CurrentRow(); pad=fDigits->CurrentColumn(); dig = fDigits->GetDigit(time,pad); if(dig <= fParam->GetZeroSup()) continue; if(dig >= AliL3Transform::GetADCSat()) dig = AliL3Transform::GetADCSat(); AliL3Transform::Raw2Local(xyz,sector,row,pad,time); // if(fParam->GetPadRowRadii(sector,row)<230./250.*fabs(xyz[2])) // continue; // why 230??? ndigits[lrow]++; //for this row only ndigitcount++; //total number of digits to be published } while (fDigits->Next()); //cout << lrow << " " << ndigits[lrow] << " - " << ndigitcount << endl; } nrows++; } Int_t size = sizeof(AliL3DigitData)*ndigitcount + nrows*sizeof(AliL3DigitRowData); LOG(AliL3Log::kDebug,"AliL3FileHandler::AliDigits2Memory","Digits") <fRow = r; tempPt->fNDigit = 0; if(n!=-1){//data on that row fDigitsTree->GetEvent(n); fParam->AdjustSectorRow(fDigits->GetID(),sector,row); AliL3Transform::Sector2Slice(lslice,lrow,sector,row); if(lrow!=r){ LOG(AliL3Log::kError,"AliL3FileHandler::AliDigits2Memory","Row") <fNDigit = ndigits[lrow]; Int_t localcount=0; fDigits->First(); do { time=fDigits->CurrentRow(); pad=fDigits->CurrentColumn(); dig = fDigits->GetDigit(time,pad); if (dig <= fParam->GetZeroSup()) continue; if(dig >= AliL3Transform::GetADCSat()) dig = AliL3Transform::GetADCSat(); //Exclude data outside cone: AliL3Transform::Raw2Local(xyz,sector,row,pad,time); // if(fParam->GetPadRowRadii(sector,row)<230./250.*fabs(xyz[2])) // continue; // why 230??? if(localcount >= ndigits[lrow]) LOG(AliL3Log::kFatal,"AliL3FileHandler::AliDigits2Binary","Memory") <fDigitData[localcount].fCharge=dig; tempPt->fDigitData[localcount].fPad=pad; tempPt->fDigitData[localcount].fTime=time; #ifdef do_mc tempPt->fDigitData[localcount].fTrackID[0] = fDigits->GetTrackID(time,pad,0); tempPt->fDigitData[localcount].fTrackID[1] = fDigits->GetTrackID(time,pad,1); tempPt->fDigitData[localcount].fTrackID[2] = fDigits->GetTrackID(time,pad,2); #endif localcount++; } while (fDigits->Next()); } Byte_t *tmp = (Byte_t*)tempPt; Int_t size = sizeof(AliL3DigitRowData) + ndigits[lrow]*sizeof(AliL3DigitData); tmp += size; tempPt = (AliL3DigitRowData*)tmp; } delete [] ndigits; return data; } AliL3DigitRowData * AliL3FileHandler::AliAltroDigits2Memory(UInt_t & nrow,Int_t event,Bool_t eventmerge) { //Read data from AliROOT file into memory, and store it in the HLT data format. //Returns a pointer to the data. //This functions filter out single timebins, which is noise. The timebins which //are removed are timebins which have the 4 zero neighbours; //(pad-1,time),(pad+1,time),(pad,time-1),(pad,time+1). AliL3DigitRowData *data = 0; nrow=0; if(!fInAli){ LOG(AliL3Log::kWarning,"AliL3FileHandler::AliAltroDigits2Memory","File") <<"No Input avalible: Pointer to TFile == NULL"<IsOpen()){ LOG(AliL3Log::kWarning,"AliL3FileHandler::AliAltroDigits2Memory","File") <<"No Input avalible: TFile not opened"<= 1024) { LOG(AliL3Log::kError,"AliL3FileHandler::AliAltroDigits2Memory","TrackIDs") <<"Too many events if you want to merge!"<GetEntries(); if(entries==0) { LOG(AliL3Log::kWarning,"AliL3FileHandler::AliAltroDigits2Memory","ndigits") <<"No TPC digits (entries==0)!"<fRow = r; tempPt->fNDigit = 0; tempPt++; } return data; } Int_t * ndigits = new Int_t[entries]; Int_t lslice,lrow; Int_t zerosupval=AliL3Transform::GetZeroSup(); Float_t xyz[3]; for(Int_t r=fRowMin;r<=fRowMax;r++){ Int_t n=fIndex[fSlice][r]; ndigits[r] = 0; if(n!=-1){//data on that row fDigitsTree->GetEvent(n); fParam->AdjustSectorRow(fDigits->GetID(),sector,row); AliL3Transform::Sector2Slice(lslice,lrow,sector,row); //cout << lslice << " " << fSlice << " " << lrow << " " << r << " " << sector << " " << row << endl; if((lslice!=fSlice)||(lrow!=r)){ LOG(AliL3Log::kError,"AliL3FileHandler::AliAltroDigits2Memory","Row") <ExpandBuffer(); fDigits->ExpandTrackBuffer(); for(Int_t i=0; iGetNCols(); i++){ for(Int_t j=0; jGetNRows(); j++){ pad=i; time=j; dig = fDigits->GetDigitFast(time,pad); if(dig <= zerosupval) continue; if(dig >= AliL3Transform::GetADCSat()) dig = AliL3Transform::GetADCSat(); //Check for single timebins, and remove them because they are noise for sure. if(i>0 && iGetNCols()-1 && j>0 && jGetNRows()-1) if(fDigits->GetDigitFast(time,pad-1)<=zerosupval && fDigits->GetDigitFast(time-1,pad)<=zerosupval && fDigits->GetDigitFast(time+1,pad)<=zerosupval && fDigits->GetDigitFast(time,pad+1)<=zerosupval) continue; //Boundaries: if(i==0) //pad==0 { if(j < fDigits->GetNRows()-1 && j > 0) { if(fDigits->GetDigitFast(time-1,pad)<=zerosupval && fDigits->GetDigitFast(time+1,pad)<=zerosupval && fDigits->GetDigitFast(time,pad+1)<=zerosupval) continue; } else if(j > 0) { if(fDigits->GetDigitFast(time-1,pad)<=zerosupval && fDigits->GetDigitFast(time,pad+1)<=zerosupval) continue; } } if(j==0) { if(i < fDigits->GetNCols()-1 && i > 0) { if(fDigits->GetDigitFast(time,pad-1)<=zerosupval && fDigits->GetDigitFast(time,pad+1)<=zerosupval && fDigits->GetDigitFast(time+1,pad)<=zerosupval) continue; } else if(i > 0) { if(fDigits->GetDigitFast(time,pad-1)<=zerosupval && fDigits->GetDigitFast(time+1,pad)<=zerosupval) continue; } } if(i==fDigits->GetNCols()-1) { if(j>0 && jGetNRows()-1) { if(fDigits->GetDigitFast(time-1,pad)<=zerosupval && fDigits->GetDigitFast(time+1,pad)<=zerosupval && fDigits->GetDigitFast(time,pad-1)<=zerosupval) continue; } else if(j==0 && jGetNRows()-1) { if(fDigits->GetDigitFast(time+1,pad)<=zerosupval && fDigits->GetDigitFast(time,pad-1)<=zerosupval) continue; } else { if(fDigits->GetDigitFast(time-1,pad)<=zerosupval && fDigits->GetDigitFast(time,pad-1)<=zerosupval) continue; } } if(j==fDigits->GetNRows()-1) { if(i>0 && iGetNCols()-1) { if(fDigits->GetDigitFast(time,pad-1)<=zerosupval && fDigits->GetDigitFast(time,pad+1)<=zerosupval && fDigits->GetDigitFast(time-1,pad)<=zerosupval) continue; } else if(i==0 && fDigits->GetNCols()-1) { if(fDigits->GetDigitFast(time,pad+1)<=zerosupval && fDigits->GetDigitFast(time-1,pad)<=zerosupval) continue; } else { if(fDigits->GetDigitFast(time,pad-1)<=zerosupval && fDigits->GetDigitFast(time-1,pad)<=zerosupval) continue; } } AliL3Transform::Raw2Local(xyz,sector,row,pad,time); // if(fParam->GetPadRowRadii(sector,row)<230./250.*fabs(xyz[2])) // continue; ndigits[lrow]++; //for this row only ndigitcount++; //total number of digits to be published } } } nrows++; } Int_t size = sizeof(AliL3DigitData)*ndigitcount + nrows*sizeof(AliL3DigitRowData); LOG(AliL3Log::kDebug,"AliL3FileHandler::AliAltroDigits2Memory","Digits") <fRow = r; tempPt->fNDigit = 0; if(n!=-1){ //no data on that row fDigitsTree->GetEvent(n); fParam->AdjustSectorRow(fDigits->GetID(),sector,row); AliL3Transform::Sector2Slice(lslice,lrow,sector,row); if(lrow!=r){ LOG(AliL3Log::kError,"AliL3FileHandler::AliAltroDigits2Memory","Row") <fNDigit = ndigits[lrow]; Int_t localcount=0; fDigits->ExpandBuffer(); fDigits->ExpandTrackBuffer(); for(Int_t i=0; iGetNCols(); i++){ for(Int_t j=0; jGetNRows(); j++){ pad=i; time=j; dig = fDigits->GetDigitFast(time,pad); if(dig <= zerosupval) continue; if(dig >= AliL3Transform::GetADCSat()) dig = AliL3Transform::GetADCSat(); //Check for single timebins, and remove them because they are noise for sure. if(i>0 && iGetNCols()-1 && j>0 && jGetNRows()-1) if(fDigits->GetDigitFast(time,pad-1)<=zerosupval && fDigits->GetDigitFast(time-1,pad)<=zerosupval && fDigits->GetDigitFast(time+1,pad)<=zerosupval && fDigits->GetDigitFast(time,pad+1)<=zerosupval) continue; //Boundaries: if(i==0) //pad ==0 { if(j < fDigits->GetNRows()-1 && j > 0) { if(fDigits->GetDigitFast(time-1,pad)<=zerosupval && fDigits->GetDigitFast(time+1,pad)<=zerosupval && fDigits->GetDigitFast(time,pad+1)<=zerosupval) continue; } else if(j > 0) { if(fDigits->GetDigitFast(time-1,pad)<=zerosupval && fDigits->GetDigitFast(time,pad+1)<=zerosupval) continue; } } if(j==0) { if(i < fDigits->GetNCols()-1 && i > 0) { if(fDigits->GetDigitFast(time,pad-1)<=zerosupval && fDigits->GetDigitFast(time,pad+1)<=zerosupval && fDigits->GetDigitFast(time+1,pad)<=zerosupval) continue; } else if(i > 0) { if(fDigits->GetDigitFast(time,pad-1)<=zerosupval && fDigits->GetDigitFast(time+1,pad)<=zerosupval) continue; } } if(i == fDigits->GetNCols()-1) { if(j>0 && jGetNRows()-1) { if(fDigits->GetDigitFast(time-1,pad)<=zerosupval && fDigits->GetDigitFast(time+1,pad)<=zerosupval && fDigits->GetDigitFast(time,pad-1)<=zerosupval) continue; } else if(j==0 && jGetNRows()-1) { if(fDigits->GetDigitFast(time+1,pad)<=zerosupval && fDigits->GetDigitFast(time,pad-1)<=zerosupval) continue; } else { if(fDigits->GetDigitFast(time-1,pad)<=zerosupval && fDigits->GetDigitFast(time,pad-1)<=zerosupval) continue; } } if(j==fDigits->GetNRows()-1) { if(i>0 && iGetNCols()-1) { if(fDigits->GetDigitFast(time,pad-1)<=zerosupval && fDigits->GetDigitFast(time,pad+1)<=zerosupval && fDigits->GetDigitFast(time-1,pad)<=zerosupval) continue; } else if(i==0 && fDigits->GetNCols()-1) { if(fDigits->GetDigitFast(time,pad+1)<=zerosupval && fDigits->GetDigitFast(time-1,pad)<=zerosupval) continue; } else { if(fDigits->GetDigitFast(time,pad-1)<=zerosupval && fDigits->GetDigitFast(time-1,pad)<=zerosupval) continue; } } AliL3Transform::Raw2Local(xyz,sector,row,pad,time); // if(fParam->GetPadRowRadii(sector,row)<230./250.*fabs(xyz[2])) // continue; if(localcount >= ndigits[lrow]) LOG(AliL3Log::kFatal,"AliL3FileHandler::AliAltroDigits2Binary","Memory") <fDigitData[localcount].fCharge=dig; tempPt->fDigitData[localcount].fPad=pad; tempPt->fDigitData[localcount].fTime=time; #ifdef do_mc tempPt->fDigitData[localcount].fTrackID[0] = (fDigits->GetTrackIDFast(time,pad,0)-2); tempPt->fDigitData[localcount].fTrackID[1] = (fDigits->GetTrackIDFast(time,pad,1)-2); tempPt->fDigitData[localcount].fTrackID[2] = (fDigits->GetTrackIDFast(time,pad,2)-2); if(eventmerge == kTRUE) //careful track mc info will be touched {//Event are going to be merged, so event number is stored in the upper 10 bits. tempPt->fDigitData[localcount].fTrackID[0] += 128; //leave some room tempPt->fDigitData[localcount].fTrackID[1] += 128; //for neg. numbers tempPt->fDigitData[localcount].fTrackID[2] += 128; tempPt->fDigitData[localcount].fTrackID[0] += ((event&0x3ff)<<22); tempPt->fDigitData[localcount].fTrackID[1] += ((event&0x3ff)<<22); tempPt->fDigitData[localcount].fTrackID[2] += ((event&0x3ff)<<22); } #endif localcount++; } } } Byte_t *tmp = (Byte_t*)tempPt; Int_t size = sizeof(AliL3DigitRowData) + ndigits[r]*sizeof(AliL3DigitData); tmp += size; tempPt = (AliL3DigitRowData*)tmp; } delete [] ndigits; return data; } Bool_t AliL3FileHandler::GetDigitsTree(Int_t event) { //Connects to the TPC digit tree in the AliROOT file. #ifdef use_newio AliLoader* tpcLoader = fInAli->GetLoader("TPCLoader"); if(!tpcLoader){ LOG(AliL3Log::kWarning,"AliL3FileHandler::GetDigitsTree","File") <<"Pointer to AliLoader for TPC = 0x0 "<GetEvent(event); tpcLoader->LoadDigits(); fDigitsTree = tpcLoader->TreeD(); #else fInAli->cd(); Char_t dname[100]; sprintf(dname,"TreeD_%s_%d",AliL3Transform::GetParamName(),event); fDigitsTree = (TTree*)fInAli->Get(dname); #endif if(!fDigitsTree) { LOG(AliL3Log::kError,"AliL3FileHandler::GetDigitsTree","Digits Tree") <GetBranch("Segment")->SetAddress(&fDigits); if(!fIndexCreated) return CreateIndex(); else return kTRUE; } void AliL3FileHandler::AliDigits2RootFile(AliL3DigitRowData *rowPt,Char_t *new_digitsfile) { //Write the data stored in rowPt, into a new AliROOT file. //The data is stored in the AliROOT format //This is specially a nice thing if you have modified data, and wants to run it //through the offline reconstruction chain. //The arguments is a pointer to the data, and the name of the new AliROOT file. //Remember to pass the original AliROOT file (the one that contains the original //simulated data) to this object, in order to retrieve the MC id's of the digits. if(!fInAli) { LOG(AliL3Log::kError,"AliL3FileHandler::AliDigits2RootFile","File") <<"No rootfile "<GetLoader("TPCLoader"); if(!tpcLoader){ LOG(AliL3Log::kWarning,"AliL3FileHandler::AliDigits2RootFile","File") <<"Pointer to AliLoader for TPC = 0x0 "<LoadDigits(); TTree *t=tpcLoader->TreeD(); AliTPCDigitsArray *old_array = new AliTPCDigitsArray(); old_array->Setup(fParam); old_array->SetClass("AliSimDigits"); Bool_t ok = old_array->ConnectTree(t); if(!ok) { LOG(AliL3Log::kError,"AliL3FileHandler::AliDigits2RootFile","File") << "No digits tree object" << ENDLOG; return; } tpcLoader->SetDigitsFileName(new_digitsfile); tpcLoader->MakeDigitsContainer(); //setup a new one, or connect it to the existing one: AliTPCDigitsArray *arr = new AliTPCDigitsArray(); arr->SetClass("AliSimDigits"); arr->Setup(fParam); arr->MakeTree(tpcLoader->TreeD()); #else //Get the original digitstree: Char_t dname[100]; sprintf(dname,"TreeD_%s_0",AliL3Transform::GetParamName()); fInAli->cd(); AliTPCDigitsArray *old_array = new AliTPCDigitsArray(); old_array->Setup(fParam); old_array->SetClass("AliSimDigits"); Bool_t ok = old_array->ConnectTree(dname); if(!ok) { LOG(AliL3Log::kError,"AliL3FileHandler::AliDigits2RootFile","File") <<"No digits tree object." <AccessPathName(new_digitsfile)) { LOG(AliL3Log::kInformational,"AliL3FileHandler::AliDigits2RootFile","File") <<"Creating new file "<Write(fParam->GetTitle()); } else { create = kFALSE; digFile = TFile::Open(new_digitsfile,"UPDATE"); } if(!digFile->IsOpen()) { LOG(AliL3Log::kError,"AliL3FileHandler::AliDigits2RootFile","Rootfile") <<"Error opening rootfile "<cd(); //setup a new one, or connect it to the existing one: AliTPCDigitsArray *arr = new AliTPCDigitsArray(); arr->SetClass("AliSimDigits"); arr->Setup(fParam); if(create) arr->MakeTree(); else { Bool_t ok = arr->ConnectTree(dname); if(!ok) { LOG(AliL3Log::kError,"AliL3FileHandler::AliDigits2RootFile","Rootfile") <<"No digits tree object in existing file"<fRow != i) LOG(AliL3Log::kWarning,"AliL3FileHandler::AliDigits2RootFile","Data") <<"Mismatching row numbering "<<(Int_t)rowPt->fRow<<" "<LoadRow(sector,row); AliSimDigits * dig = (AliSimDigits*)arr->CreateRow(sector,row); old_dig->ExpandBuffer(); old_dig->ExpandTrackBuffer(); dig->ExpandBuffer(); dig->ExpandTrackBuffer(); if(!old_dig) LOG(AliL3Log::kWarning,"AliL3FileHandler::AliDigits2RootFile","Data") <<"No padrow " << sector << " " << row <fDigitData; digcounter=0; for(UInt_t j=0; jfNDigit; j++) { Short_t charge = (Short_t)digPt[j].fCharge; Int_t pad = (Int_t)digPt[j].fPad; Int_t time = (Int_t)digPt[j].fTime; if(charge == 0) //Only write the digits that has not been removed { LOG(AliL3Log::kWarning,"AliL3FileHandler::AliDigits2RootFile","Data") <<"Zero charge" <GetTrackIDFast(time,pad,t); if(label > 1) trackID[t] = label - 2; else if(label==0) trackID[t] = -2; else trackID[t] = -1; } dig->SetDigitFast(charge,time,pad); for(Int_t t=0; t<3; t++) ((AliSimDigits*)dig)->SetTrackIDFast(trackID[t],time,pad,t); } //cout<<"Wrote "<StoreRow(sector,row); arr->ClearRow(sector,row); old_array->ClearRow(sector,row); } char treeName[100]; sprintf(treeName,"TreeD_%s_0",fParam->GetTitle()); #ifdef use_newio arr->GetTree()->SetName(treeName); arr->GetTree()->AutoSave(); tpcLoader->WriteDigits("OVERWRITE"); #else digFile->cd(); arr->GetTree()->SetName(treeName); arr->GetTree()->AutoSave(); digFile->Close(); #endif delete arr; delete old_array; } ///////////////////////////////////////// Point IO Bool_t AliL3FileHandler::AliPoints2Binary(Int_t eventn) { //points to binary Bool_t out = kTRUE; UInt_t npoint; AliL3SpacePointData *data = AliPoints2Memory(npoint,eventn); out = Memory2Binary(npoint,data); Free(); return out; } AliL3SpacePointData * AliL3FileHandler::AliPoints2Memory(UInt_t & npoint,Int_t eventn) { //points to memory AliL3SpacePointData *data = 0; npoint=0; if(!fInAli){ LOG(AliL3Log::kWarning,"AliL3FileHandler::AliPoints2Memory","File") <<"No Input avalible: no object fInAli"<IsOpen()){ LOG(AliL3Log::kWarning,"AliL3FileHandler::AliPoints2Memory","File") <<"No Input avalible: TFile not opend"<GetLoader("TPCLoader"); if(!tpcLoader){ LOG(AliL3Log::kWarning,"AliL3FileHandler::AliPoints2Memory","File") <<"Pointer to AliLoader for TPC = 0x0 "<GetEvent(eventn); tpcLoader->LoadRecPoints(); AliTPCClustersArray carray; carray.Setup(fParam); carray.SetClusterType("AliTPCcluster"); Bool_t clusterok = carray.ConnectTree(tpcLoader->TreeR()); #else fInAli->cd(); Char_t cname[100]; sprintf(cname,"TreeC_TPC_%d",eventn); AliTPCClustersArray carray; carray.Setup(fParam); carray.SetClusterType("AliTPCcluster"); Bool_t clusterok = carray.ConnectTree(cname); #endif if(!clusterok) return 0; AliTPCClustersRow ** clusterrow = new AliTPCClustersRow*[ (int)carray.GetTree()->GetEntries()]; Int_t *rows = new int[ (int)carray.GetTree()->GetEntries()]; Int_t *sects = new int[ (int)carray.GetTree()->GetEntries()]; Int_t sum=0; Int_t lslice,lrow; for(Int_t i=0; iGetEntries(); i++){ AliSegmentID *s = carray.LoadEntry(i); Int_t sector,row; fParam->AdjustSectorRow(s->GetID(),sector,row); rows[i] = row; sects[i] = sector; clusterrow[i] = 0; AliL3Transform::Sector2Slice(lslice,lrow,sector,row); if(fSlice != lslice || lrowfRowMax) continue; clusterrow[i] = carray.GetRow(sector,row); if(clusterrow[i]) sum+=clusterrow[i]->GetArray()->GetEntriesFast(); } UInt_t size = sum*sizeof(AliL3SpacePointData); LOG(AliL3Log::kDebug,"AliL3FileHandler::AliPoints2Memory","File") <GetEntries(); i++){ if(!clusterrow[i]) continue; Int_t row = rows[i]; Int_t sector = sects[i]; AliL3Transform::Sector2Slice(lslice,lrow,sector,row); Int_t entries_in_row = clusterrow[i]->GetArray()->GetEntriesFast(); for(Int_t j = 0;jGetZ(); data[n].fY = c->GetY(); data[n].fX = fParam->GetPadRowRadii(sector,row); data[n].fCharge = (UInt_t)c->GetQ(); data[n].fID = n+((fSlice&0x7f)<<25)+((pat&0x7)<<22);//uli data[n].fPadRow = lrow; data[n].fSigmaY2 = c->GetSigmaY2(); data[n].fSigmaZ2 = c->GetSigmaZ2(); #ifdef do_mc data[n].fTrackID[0] = c->GetLabel(0); data[n].fTrackID[1] = c->GetLabel(1); data[n].fTrackID[2] = c->GetLabel(2); #endif if(fMC) fprintf(fMC,"%d %d\n",data[n].fID,c->GetLabel(0)); n++; } } for(Int_t i=0;iGetEntries();i++){ Int_t row = rows[i]; Int_t sector = sects[i]; if(carray.GetRow(sector,row)) carray.ClearRow(sector,row); } delete [] clusterrow; delete [] rows; delete [] sects; savedir->cd(); return data; }